首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于gpgme_passphrase_cb_t的帮助

关于gpgme_passphrase_cb_t的帮助
EN

Stack Overflow用户
提问于 2011-01-04 06:21:48
回答 1查看 641关注 0票数 0

我正在使用GPGME...我需要一个使用gpgme_passphrase_cb_tgpgme_set_passphrase_cb函数的例子,因为我不知道如何创建gpgme_passphrase_cb_t

EN

回答 1

Stack Overflow用户

发布于 2011-04-26 21:29:45

这是来自gpgme++的代码,它将基于回调的接口包装到一个C++接口中:

接口:

代码语言:javascript
复制
class PassphraseProvider {
public:
  virtual ~PassphraseProvider() {}

  virtual char * getPassphrase( const char * useridHint,
                                const char * description,
                                bool previousWasBad,
                                bool & canceled ) = 0;
};

该函数应该将description显示为一个提示符,并返回输入的密码(缓冲区必须是malloc()ed的)。它还可以将canceled设置为true,以指示用户已中止。参数useridHintpreviousWasBad只是附加信息。

这是通用回调:

代码语言:javascript
复制
// 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;
}

给定PassphraseProvider接口的实现pp,您将像这样将所有东西联系在一起:

代码语言:javascript
复制
gpgme_set_passphrase_cb( ctx, &passphrase_callback, pp );
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4588926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档