powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Callback функция для установки crypt key вызывается два раза в Delphi
25 сообщений из 28, страница 1 из 2
Callback функция для установки crypt key вызывается два раза в Delphi
    #39726946
rasslabone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот тестовый пример. Непосредственно вызова, при 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
Callback функция для установки crypt key вызывается два раза в Delphi
    #39726948
rasslabone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нюанс в том, что используется собственный плагин для шифрования и данный пример с той же структурой отлично выполняется в c++. Но в delphi вызывается callback-функция 2 раза и в итоге вылетает fbexception: Callback return 0
Тестировал пример и на delphi 2006 и на rad studio xe8. Использовал файл firebird.pas от разработчиков.
...
Рейтинг: 0 / 0
Callback функция для установки crypt key вызывается два раза в Delphi
    #39727202
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Клиентский колбэк выполняется столько раз сколько об этом попросит Key Holder. С
некоторыми исключениями.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Callback функция для установки crypt key вызывается два раза в Delphi
    #39727529
rasslabone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovКлиентский колбэк выполняется столько раз сколько об этом попросит Key Holder. С
некоторыми исключениями.

Да, спасибо, именно в KeyHolder и была причина. Тему можно закрыть.
...
Рейтинг: 0 / 0
Callback функция для установки crypt key вызывается два раза в Delphi
    #39727742
rasslabone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, Теперь этот пример работает нормально. Вы можете подсказать, получится ли у меня установить callback-функцию, если для подключения я использую TIBDatabase в своей программе? здесь у меня используется iprovider, iattachment..передавать handle соединения в tibdatabase?
...
Рейтинг: 0 / 0
Callback функция для установки crypt key вызывается два раза в Delphi
    #39727751
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Callback функция для установки crypt key вызывается два раза в Delphi
    #39730288
rasslabone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Callback функция для установки crypt key вызывается два раза в Delphi
    #39730336
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rasslabonehvlad, пробую вот так - не получается. Я не совсем Вас понял, если честно.
Код: pascal
1.
2.
fb_database_crypt_callback(status_vector, crypt_callback);
gRadugaDatabase.Open;
...
Рейтинг: 0 / 0
Callback функция для установки crypt key вызывается два раза в Delphi
    #39730396
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rasslabone,

я не пойму, а чем не устраивает наш пример на Дельфи???
...
Рейтинг: 0 / 0
Callback функция для установки crypt key вызывается два раза в Delphi
    #39730420
rasslabone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Callback функция для установки crypt key вызывается два раза в Delphi
    #39730426
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rasslaboneИли Вы имели ввиду, что надо напрямую использовать
Код: pascal
1.
fb_database_crypt_callback(status_vector, crypt_callback);


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

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

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

В исзодниках клиента используется fbcrypt.dll
Мы её не используем - т. к. её н5ет в стандартной поставке сервера.
...
Рейтинг: 0 / 0
Callback функция для установки crypt key вызывается два раза в Delphi
    #39730531
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Callback функция для установки crypt key вызывается два раза в Delphi
    #39731016
Фотография Tonal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvrasslabone, Tonal
я так понимаю, вам до лампочки
http://www.ibase.ru/download-demo-firebird-encryption-plugin
Кстати рассмотрел подробнее ваши версии клиента.
У вас в BeforeConnect вызывается установка пароля через вашу dll и подключение через интерфейсы.
Т. е. это никак не является примером использования штатного апи вместе с компонентами.
...
Рейтинг: 0 / 0
Callback функция для установки crypt key вызывается два раза в Delphi
    #39731061
rasslabone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Callback функция для установки crypt key вызывается два раза в Delphi
    #39731062
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Callback функция для установки crypt key вызывается два раза в Delphi
    #39731076
rasslabone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Callback функция для установки crypt key вызывается два раза в Delphi
    #39731077
rasslabone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тэг потерял, в цитату все попало. Сорри
...
Рейтинг: 0 / 0
Callback функция для установки crypt key вызывается два раза в Delphi
    #39731079
rasslabone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Callback функция для установки crypt key вызывается два раза в Delphi
    #39731082
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rasslaboneВ обеих случаях у status заполняется только первый элемент единицей, остальные - по нулям.

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

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

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


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