Pomoc s gpgme_passphrase_cb_t

hlasů
0

Pracuji s GPGME ... Musím příklad na použití gpgme_passphrase_cb_ta gpgme_set_passphrase_cbfunkce, protože nechápu, jak vytvořit gpgme_passphrase_cb_t.

Položena 03/01/2011 v 23:21
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Tento kód je z gpgme ++, které obtéká rozhraní zpětné volání na bázi do rozhraní C ++:

Rozhraní:

class PassphraseProvider {
public:
  virtual ~PassphraseProvider() {}

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

Funkce má zobrazit descriptionjako výzva, a vrátí heslo vstoupil (vyrovnávací paměť musí být malloc()ed). Může také nastavit canceled, aby truese na tom, že uživatel přeruší. Parametry useridHinta previousWasBadjsou jen doplňující informace.

A to tento obecný zpětného volání:

// 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;
}

Vzhledem k tomu, implementace pptohoto PassphraseProviderrozhraní, měli byste svázat všechno dohromady takto:

gpgme_set_passphrase_cb( ctx, &passphrase_callback, pp );
Odpovězeno 26/04/2011 v 14:29
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more