Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Callback функция для установки crypt key вызывается два раза в Delphi / 25 сообщений из 28, страница 1 из 2
02.11.2018, 08:59
    #39726946
rasslabone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
Вот тестовый пример. Непосредственно вызова, при attach'е к базе, происходит два раза вызов callback-функции
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
 master := fb_get_master_interface;
      if master = nil then
     begin
       Writeln('master is nil');
      Exit;
     end;

      util := master.getUtilInterface;
        if util = nil then
     begin
          Writeln('util is nil');
          Exit;
     end;
      status := master.getStatus;
      status.init;
         if status = nil then
     begin
              Writeln('status is nil');
               Exit;
     end;

      provider := master.getDispatcher;
      if provider = nil then
     begin
        Writeln('provider is nil');
      Exit;
     end;
      xpbBuilder := util.getXpbBuilder(status, IXpbBuilder.DPB, nil, 0);
      xpbBuilder.insertString(status, isc_dpb_user_name, PAnsiChar('SYSDBA'));
      xpbBuilder.insertString(status, isc_dpb_password, PAnsiChar('masterkey'));
      try
      provider.setDbCryptCallback(status, CryptKey.create);

      except
      on e: Exception do
      begin
         Writeln('Ошибка при установке ключа  - : '+E.Message );
        Exit;
      end;
      end;


      try
      attachment:= provider.attachDatabase(status,PAnsiChar('localhost:TestBase'),
      xpbBuilder.getBufferLength(status), xpbBuilder.getBuffer(status));
      attachment.detach(status);
      except
        on e: FbException do
        begin
          Writeln('Ошибка при установке cryptkey  - :  - : ' + PrintFbError(e.getStatus) );
        Exit;
        end;
      end;
...
Рейтинг: 0 / 0
02.11.2018, 09:03
    #39726948
rasslabone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
Нюанс в том, что используется собственный плагин для шифрования и данный пример с той же структурой отлично выполняется в c++. Но в delphi вызывается callback-функция 2 раза и в итоге вылетает fbexception: Callback return 0
Тестировал пример и на delphi 2006 и на rad studio xe8. Использовал файл firebird.pas от разработчиков.
...
Рейтинг: 0 / 0
02.11.2018, 13:22
    #39727202
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
Клиентский колбэк выполняется столько раз сколько об этом попросит Key Holder. С
некоторыми исключениями.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.11.2018, 12:55
    #39727529
rasslabone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
Dimitry SibiryakovКлиентский колбэк выполняется столько раз сколько об этом попросит Key Holder. С
некоторыми исключениями.

Да, спасибо, именно в KeyHolder и была причина. Тему можно закрыть.
...
Рейтинг: 0 / 0
04.11.2018, 09:40
    #39727742
rasslabone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
Dimitry Sibiryakov, Теперь этот пример работает нормально. Вы можете подсказать, получится ли у меня установить callback-функцию, если для подключения я использую TIBDatabase в своей программе? здесь у меня используется iprovider, iattachment..передавать handle соединения в tibdatabase?
...
Рейтинг: 0 / 0
04.11.2018, 10:54
    #39727751
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
rasslaboneВы можете подсказать, получится ли у меня установить callback-функцию, если для подключения я использую TIBDatabase в своей программе?

Код: plaintext
1.
ISC_STATUS API_ROUTINE fb_database_crypt_callback(ISC_STATUS* userStatus, void* cb)



Колбек должен использоваться тем же потоком, в котором вызвана fb_database_crypt_callback.
Т.е. TDatabase.Open нужно вызывать в том же потоке.
...
Рейтинг: 0 / 0
09.11.2018, 08:37
    #39730288
rasslabone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
hvlad, пробую вот так - не получается. Я не совсем Вас понял, если честно.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 master := fb_get_master_interface;
      status:=master.getStatus;
      status.init;
      provider := master.getDispatcher;
      util:=master.getUtilInterface;
      xpbBuilder := util.getXpbBuilder(status, IXpbBuilder.DPB, nil, 0);
      xpbBuilder.insertString(status, isc_dpb_user_name, PAnsiChar(Login));
      xpbBuilder.insertString(status, isc_dpb_password, PAnsiChar(Password));
      provider.setDbCryptCallback(status, CryptKey.create);
      attachment:= provider.attachDatabase(status,PAnsiChar(Base),
      xpbBuilder.getBufferLength(status), xpbBuilder.getBuffer(status));
      gRadugaDatabase.Open;
...
Рейтинг: 0 / 0
09.11.2018, 10:30
    #39730336
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
rasslabonehvlad, пробую вот так - не получается. Я не совсем Вас понял, если честно.
Код: pascal
1.
2.
fb_database_crypt_callback(status_vector, crypt_callback);
gRadugaDatabase.Open;
...
Рейтинг: 0 / 0
09.11.2018, 11:21
    #39730396
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
rasslabone,

я не пойму, а чем не устраивает наш пример на Дельфи???
...
Рейтинг: 0 / 0
09.11.2018, 11:40
    #39730420
rasslabone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
hvlad, Вот это рабочий код - callback вызывается, соединение устанавливается:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 master := fb_get_master_interface;
      status:=master.getStatus;
      status.init;
      provider := master.getDispatcher;
      util:=master.getUtilInterface;
      xpbBuilder := util.getXpbBuilder(status, IXpbBuilder.DPB, nil, 0);
      xpbBuilder.insertString(status, isc_dpb_user_name, PAnsiChar(Login));
      xpbBuilder.insertString(status, isc_dpb_password, PAnsiChar(Password));
      provider.setDbCryptCallback(status, CryptKey.create);
      attachment:= provider.attachDatabase(status,PAnsiChar('Base'),
      xpbBuilder.getBufferLength(status), xpbBuilder.getBuffer(status));


Вы указали сделать так:
Код: pascal
1.
2.
fb_database_crypt_callback(status_vector, crypt_callback);
gRadugaDatabase.Open;


Я так понимаю, Вы имели ввиду сделать так мне:
Код: pascal
1.
2.
3.
4.
5.
6.
master := fb_get_master_interface;
      status:=master.getStatus;
      status.init;
      provider := master.getDispatcher;     
      provider.setDbCryptCallback(status, CryptKey.create);
      gRadugaDatabase.Open;


Так тоже не работает - callback не вызывается.
Или Вы имели ввиду, что надо напрямую использовать
Код: pascal
1.
fb_database_crypt_callback(status_vector, crypt_callback);

, минуя IProvider? (Использую TIBDatabase из пакета ibx, среда delphi 2006)
...
Рейтинг: 0 / 0
09.11.2018, 11:52
    #39730426
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
rasslaboneИли Вы имели ввиду, что надо напрямую использовать
Код: pascal
1.
fb_database_crypt_callback(status_vector, crypt_callback);


, минуя IProvider? (Использую TIBDatabase из пакета ibx, среда delphi 2006)Именно. Вопрос же был про TIBDatabase и, соответственно, ISC API
...
Рейтинг: 0 / 0
09.11.2018, 12:30
    #39730482
Tonal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
hvlad,

А есть ли возможность получить хендел коннекта из IAttachment ?
Тогда можно было бы подключится через attachDatabase а после использовать TIBDatabase и подобные.
...
Рейтинг: 0 / 0
09.11.2018, 12:39
    #39730497
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
rasslabone, Tonal
я так понимаю, вам до лампочки
http://www.ibase.ru/download-demo-firebird-encryption-plugin
...
Рейтинг: 0 / 0
09.11.2018, 12:51
    #39730508
Tonal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
kdv,

авторВ этом кратком руководстве находится описание тестирования демонстрационной версии IBSurgeon Firebird Encryption Plugin для шифрования ваших баз данных
Мы не используем "Firebird Encryption Plugin Framework от IBSurgeon".
Плагин шифрования свой.

В исзодниках клиента используется fbcrypt.dll
Мы её не используем - т. к. её н5ет в стандартной поставке сервера.
...
Рейтинг: 0 / 0
09.11.2018, 13:16
    #39730531
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
TonalА есть ли возможность получить хендел коннекта из IAttachment ?Есть:
Код: plaintext
1.
2.
ISC_STATUS ISC_EXPORT fb_get_database_handle(ISC_STATUS*, isc_db_handle*, void*);
ISC_STATUS ISC_EXPORT fb_get_transaction_handle(ISC_STATUS*, isc_tr_handle*, void*);

Последний пар-р, который void* - это IAttachment или ITransaction

TonalТогда можно было бы подключится через attachDatabase а после использовать TIBDatabase и подобные.Зачем ???
Чтобы избежать вызова fb_database_crypt_callback делаем вызов десятка других ф-ций?
...
Рейтинг: 0 / 0
10.11.2018, 12:45
    #39731016
Tonal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
kdvrasslabone, Tonal
я так понимаю, вам до лампочки
http://www.ibase.ru/download-demo-firebird-encryption-plugin
Кстати рассмотрел подробнее ваши версии клиента.
У вас в BeforeConnect вызывается установка пароля через вашу dll и подключение через интерфейсы.
Т. е. это никак не является примером использования штатного апи вместе с компонентами.
...
Рейтинг: 0 / 0
10.11.2018, 15:00
    #39731061
rasslabone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
hvladTonalА есть ли возможность получить хендел коннекта из IAttachment ?Есть:
Код: plaintext
1.
2.
ISC_STATUS ISC_EXPORT fb_get_database_handle(ISC_STATUS*, isc_db_handle*, void*);
ISC_STATUS ISC_EXPORT fb_get_transaction_handle(ISC_STATUS*, isc_tr_handle*, void*);

Последний пар-р, который void* - это IAttachment или ITransaction

TonalТогда можно было бы подключится через attachDatabase а после использовать TIBDatabase и подобные.Зачем ???
Чтобы избежать вызова fb_database_crypt_callback делаем вызов десятка других ф-ций?
В общем, попробовал сначала сделать вызов через установку
Код: plaintext
1.
ISC_STATUS API_ROUTINE fb_database_crypt_callback(ISC_STATUS* userStatus, void* cb)

, как Вы и сказали.
Используемые типы:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
//из ibexternal.pas
 TISC_DB_HANDLE                = PVoid;
 PISC_DB_HANDLE                = ^TISC_DB_HANDLE;
 ISC_STATUS           = Long;    { 32 bit signed }
 PISC_STATUS          = ^ISC_STATUS;
 PVoid                = ^Pointer;
//объявленный мною
 PCryptKeyCallback=^ICryptKeyCallback;



Объявление функции:
Код: pascal
1.
function fb_database_crypt_callback(status_vector: PISC_STATUS; cryptKeyCallback:  PVoid ):ISC_STATUS; stdcall; external 'fbclient.dll' name 'fb_database_crypt_callback';



Переменные:
Код: pascal
1.
2.
3.
4.
var
crypt:ICryptKeyCallback;
PCrypt:PCryptKeyCallback;
sstatus: ISC_STATUS;



Вызываю:
Код: pascal
1.
2.
3.
4.
  crypt:=CryptKey.create;
      PCrypt:=@crypt;
      fb_database_crypt_callback(@sstatus,@PCrypt);
      gRadugaDatabase.Open;


Результат: после вызова fb_database_crypt_callback переменная sstatus=1 . При вызове процедуры gRadugaDatabase.Open; вызова callback-функции не происходит .

2-й способ через передачу handle от IAttachment.

Объявление функции:
Код: pascal
1.
function fb_get_database_handle(status_vector: PISC_STATUS; dbHandle: PISC_DB_HANDLE;attachment: PVoid):ISC_STATUS; stdcall; external 'fbclient.dll' name 'fb_get_database_handle';



Переменные:
Код: pascal
1.
2.
3.
var
  sstatus: ISC_STATUS;
  dbhandle: TISC_DB_HANDLE;



Вызываю:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
master := fb_get_master_interface;
      status:=master.getStatus;
      status.init;
      provider := master.getDispatcher;
      util:=master.getUtilInterface;
      xpbBuilder := util.getXpbBuilder(status, IXpbBuilder.DPB, nil, 0);
      xpbBuilder.insertString(status, isc_dpb_user_name, PAnsiChar(Login));
      xpbBuilder.insertString(status, isc_dpb_password, PAnsiChar(Password));
      provider.setDbCryptCallback(status, CryptKey.create);
      attachment:= provider.attachDatabase(status,PAnsiChar(BasePath),
      xpbBuilder.getBufferLength(status), xpbBuilder.getBuffer(status));

	//получение и передача handle в TIBDatabase
	fb_get_database_handle(@sstatus,@dbhandle,@attachment);
	gRadugaDatabase.SetHandle(dbhandle);



Результат: после вызова fb_get_database_handle переменная sstatus=1 , а dbhandle=nil . Аналогичный вызов в c++:
Код: plaintext
1.
2.
3.
4.
5.
p->setDbCryptCallback(status, &key);
att = p->attachDatabase(status, s, 0, nullptr);
ISC_STATUS sstatus;
isc_db_handle handle;
fb_get_database_handle(&sstatus, &handle, &att);


возвращает хэндл. Что-то не так с типами данных, которые я использую?
Может быть у Вас удастся увидеть, что здесь не так сделано?
...
Рейтинг: 0 / 0
10.11.2018, 15:10
    #39731062
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
rasslabone
Код: pascal
1.
sstatus: ISC_STATUS;

Тут нужен массив из 20 элементов.
Обычно его называют ISC_STATUS_ARRAY, но название не так важно.
rasslaboneпеременная sstatus=1 И исследовать вест статус-вектор, а не только его первый элемент.

rasslaboneОбъявление функции:
Код: pascal
1.
function fb_database_crypt_callback(status_vector: PISC_STATUS; cryptKeyCallback:  PVoid ):ISC_STATUS; stdcall; external 'fbclient.dll' name 'fb_database_crypt_callback';

Насколько я помню, IBX динамически загружает библиотеку клиента, так что это объявление может связать не с тем экземпляром dll
...
Рейтинг: 0 / 0
10.11.2018, 16:16
    #39731076
rasslabone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
hvladrasslabone
Код: pascal
1.
sstatus: ISC_STATUS;

Тут нужен массив из 20 элементов.
Обычно его называют ISC_STATUS_ARRAY, но название не так важно.
rasslaboneпеременная sstatus=1 И исследовать вест статус-вектор, а не только его первый элемент.


Использовал isc_status_array, как Вы и указали, в случае вызова callback'а ничего не поменялось , а в случае передачи handle после вызова fb_get_database_handle чем-то заполнилась переменная dbhandle, но после установки через gRadugaDatabase.SetHandle соединение не установилось. В обеих случаях у status заполняется только первый элемент единицей , остальные - по нулям.
Объявил статус так:
Код: pascal
1.
2.
ISC_STATUS_ARRAY=Array [0..19] of ISC_STATUS;
sstatus:ISC_STATUS_ARRAY;


По поводу
rasslaboneОбъявление функции:
Код: pascal
1.
function fb_database_crypt_callback(status_vector: PISC_STATUS; cryptKeyCallback:  PVoid ):ISC_STATUS; stdcall; external 'fbclient.dll' name 'fb_database_crypt_callback';

Насколько я помню, IBX динамически загружает библиотеку клиента, так что это объявление может связать не с тем экземпляром dll
Для нас это пока не актуально.
...
Рейтинг: 0 / 0
10.11.2018, 16:17
    #39731077
rasslabone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
Тэг потерял, в цитату все попало. Сорри
...
Рейтинг: 0 / 0
10.11.2018, 16:24
    #39731079
rasslabone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
hvladrasslabone
Код: pascal
1.
sstatus: ISC_STATUS;

Тут нужен массив из 20 элементов.
Обычно его называют ISC_STATUS_ARRAY, но название не так важно.
rasslaboneпеременная sstatus=1 И исследовать вест статус-вектор, а не только его первый элемент.

rasslaboneОбъявление функции:
Код: pascal
1.
function fb_database_crypt_callback(status_vector: PISC_STATUS; cryptKeyCallback:  PVoid ):ISC_STATUS; stdcall; external 'fbclient.dll' name 'fb_database_crypt_callback';

Насколько я помню, IBX динамически загружает библиотеку клиента, так что это объявление может связать не с тем экземпляром dll
Использовал isc_status_array, как Вы и указали, в случае вызова callback'а ничего не поменялось, а в случае передачи handle после вызова fb_get_database_handle чем-то заполнилась переменная dbhandle, но после установки через gRadugaDatabase.SetHandle соединение не установилось. В обеих случаях у status заполняется только первый элемент единицей, остальные - по нулям.
Объявил статус так:
Код: pascal
1.
2.
ISC_STATUS_ARRAY=Array [0..19] of ISC_STATUS;
sstatus:ISC_STATUS_ARRAY;
...
Рейтинг: 0 / 0
10.11.2018, 16:45
    #39731082
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
rasslaboneВ обеих случаях у status заполняется только первый элемент единицей, остальные - по нулям.

Это означает успешное выполнение функции. Читай API Guide.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.11.2018, 17:11
    #39731088
Tonal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
Dimitry SibiryakovrasslaboneВ обеих случаях у status заполняется только первый элемент единицей, остальные - по нулям.

Это означает успешное выполнение функции. Читай API Guide.
Замечательно.
Функции возвращают успех, но калбек не вызывается, а хендел не является хенделом соединения.
Куда копать?
...
Рейтинг: 0 / 0
10.11.2018, 18:25
    #39731111
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
rasslaboneДля нас это пока не актуально.Что именно неактуально ?
TLS в каждой DLL - свой собственный, и это - актуально.
...
Рейтинг: 0 / 0
10.11.2018, 18:28
    #39731112
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Callback функция для установки crypt key вызывается два раза в Delphi
rasslaboneв случае передачи handle после вызова fb_get_database_handle чем-то заполнилась переменная dbhandleЧем ?

rasslaboneпосле установки через gRadugaDatabase.SetHandle соединение не установилосьЧто значит - не установилось ? Оно уже установлено.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Callback функция для установки crypt key вызывается два раза в Delphi / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]