Ich arbeite mit GPGME ... Ich brauche ein Beispiel für die Verwendung von gpgme_passphrase_cb_t
und gpgme_set_passphrase_cb
Funktion, weil ich nicht verstehe, wie man eine gpgme_passphrase_cb_t
erstellen. Hilfe mit gpgme_passphrase_cb_t
0
A
Antwort
1
Dies ist der Code von GPGME ++, die die Callback-basierte hüllt Schnittstelle in ein C++ Schnittstelle:
Die Schnittstelle:
class PassphraseProvider {
public:
virtual ~PassphraseProvider() {}
virtual char * getPassphrase(const char * useridHint,
const char * description,
bool previousWasBad,
bool & canceled) = 0;
};
Die Funktion soll description
als Eingabeaufforderung angezeigt wird, und kehrt die Passphrase eingegeben (der Puffer muss malloc()
ed sein). Es kann auch canceled
auf true
setzen, um anzuzeigen, dass der Benutzer abgebrochen wurde. Die Parameter useridHint
und previousWasBad
sind nur zusätzliche Informationen.
Und das dies die allgemeine Rückruf:
gpgme_set_passphrase_cb(ctx, &passphrase_callback, pp);
:
// 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;
}
eine Implementierung pp
der PassphraseProvider
Schnittstelle gegeben, würden Sie alles zusammen wie diese binden