私は GPGME を使用しています...gpgme_passphrase_cb_t
とgpgme_set_passphrase_cb
関数の使用例が必要gpgme_passphrase_cb_t
です。.
1 に答える
2
これは、コールバック ベースのインターフェイスを C++ インターフェイスにラップする gpgme++ のコードです。
インターフェース:
class PassphraseProvider {
public:
virtual ~PassphraseProvider() {}
virtual char * getPassphrase( const char * useridHint,
const char * description,
bool previousWasBad,
bool & canceled ) = 0;
};
この関数はdescription
プロンプトとして表示され、入力されたパスフレーズを返すことになっています (バッファをmalloc()
編集する必要があります)。また、ユーザーが中止したことを示すために に設定canceled
することもできます。true
パラメータuseridHint
とpreviousWasBad
は単なる追加情報です。
そして、これは一般的なコールバックです:
// Code taken from gpgme++, license: LGPLv2+
static
gpgme_error_t passphrase_callback( void * opaque, const char * uid_hint, const char * desc,
int prev_was_bad, int fd ) {
PassphraseProvider * provider = static_cast<PassphraseProvider*>( opaque );
bool canceled = false;
gpgme_error_t err = GPG_ERR_NO_ERROR;
char * passphrase = provider ? provider->getPassphrase( uid_hint, desc, prev_was_bad, canceled ) : 0 ;
if ( canceled )
err = make_error( GPG_ERR_CANCELED );
else
if ( passphrase && *passphrase ) {
size_t passphrase_length = std::strlen( passphrase );
size_t written = 0;
do {
#ifdef HAVE_GPGME_IO_READWRITE
ssize_t now_written = gpgme_io_write( fd, passphrase + written, passphrase_length - written );
#else
ssize_t now_written = write( fd, passphrase + written, passphrase_length - written );
#endif
if ( now_written < 0 ) {
err = make_err_from_syserror();
break;
}
written += now_written;
} while ( written < passphrase_length );
}
free( passphrase );
#ifdef HAVE_GPGME_IO_READWRITE
gpgme_io_write( fd, "\n", 1 );
#else
write( fd, "\n", 1 );
#endif
return err;
}
pp
インターフェイスの実装が与えられた場合、次のPassphraseProvider
ようにすべてを結び付けます。
gpgme_set_passphrase_cb( ctx, &passphrase_callback, pp );
于 2011-04-26T13:29:44.713 に答える