Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.1
kdepimlibs4
r883857.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File r883857.diff of Package kdepimlibs4
Subject: return better errors for gpgme write failures and missing passphrases From: wstephenson@suse.de Bug: Patch-upstream: 883857 --- gpgme++/CMakeLists.txt (revision 883856) +++ gpgme++/CMakeLists.txt (revision 883857) @@ -32,7 +32,7 @@ set(gpgme_LIB_SRCS gpgadduserideditinteractor.cpp ) -set( _gpgmepp_version 2.0.1 ) +set( _gpgmepp_version 2.0.2 ) set( _gpgmepp_soversion 2 ) set( GPGMEPP_INCLUDE ${INCLUDE_INSTALL_DIR} ${GPGME_INCLUDES} ${Boost_INCLUDE_DIR} ) --- gpgme++/editinteractor.cpp (revision 883856) +++ gpgme++/editinteractor.cpp (revision 883857) @@ -38,6 +38,9 @@ using namespace GpgME; +static const char * status_to_string( unsigned int status ); +static Error status_to_error( unsigned int status ); + class EditInteractor::Private { friend class ::GpgME::EditInteractor; friend class ::GpgME::CallbackHelper; @@ -75,7 +78,9 @@ public: static int edit_interactor_callback_impl( void * opaque, gpgme_status_code_t status, const char * args, int fd ) { EditInteractor::Private * ei = (EditInteractor::Private*)opaque; - Error err; + Error err = status_to_error( status ); + + if ( !err ) { // advance to next state based on input: const unsigned int oldState = ei->state; @@ -85,8 +90,8 @@ public: goto error; } if ( ei->debug ) - std::fprintf( ei->debug, "EditInteractor: %u -> nextState( %u, %s ) -> %u\n", - oldState, (unsigned int)status, args ? args : "<null>", ei->state ); + std::fprintf( ei->debug, "EditInteractor: %u -> nextState( %s, %s ) -> %u\n", + oldState, status_to_string(status), args ? args : "<null>", ei->state ); if ( ei->state != oldState && // if there was an error from before, we stop here (### this looks weird, can this happen at all?) @@ -102,17 +107,17 @@ public: if ( *result ) { errno = 0; if ( writeAll( fd, result, std::strlen( result ) ) != std::strlen( result ) ) { + err = Error( gpg_error_from_syserror() ); if ( ei->debug ) std::fprintf( ei->debug, "EditInteractor: Could not write to fd %d (%s)\n", fd, strerror( errno ) ); - err = Error( GPG_ERR_GENERAL ); goto error; } } errno = 0; if ( writeAll( fd, "\n", 1 ) != 1 ) { + err = Error( gpg_error_from_syserror() ); if ( ei->debug ) std::fprintf( ei->debug, "EditInteractor: Could not write to fd %d (%s)\n", fd, strerror( errno ) ); - err = Error( GPG_ERR_GENERAL ); goto error; } } else { @@ -125,6 +130,7 @@ public: if ( ei->debug ) std::fprintf( ei->debug, "EditInteractor: no action executed\n" ); } + } error: @@ -194,6 +200,118 @@ bool EditInteractor::needsNoResponse( un } } +// static +Error status_to_error( unsigned int status ) { + switch ( status ) { + case GPGME_STATUS_MISSING_PASSPHRASE: + return Error( gpg_error( GPG_ERR_INV_PASSPHRASE ) ); // should be GPG_ERR_MISSING_PASSPHRASE + } + return Error(); +} + void EditInteractor::setDebugChannel( std::FILE * debug ) { d->debug = debug; } + +static const char * status_strings[] = { + "EOF", + /* mkstatus processing starts here */ + "ENTER", + "LEAVE", + "ABORT", + + "GOODSIG", + "BADSIG", + "ERRSIG", + + "BADARMOR", + + "RSA_OR_IDEA", + "KEYEXPIRED", + "KEYREVOKED", + + "TRUST_UNDEFINED", + "TRUST_NEVER", + "TRUST_MARGINAL", + "TRUST_FULLY", + "TRUST_ULTIMATE", + + "SHM_INFO", + "SHM_GET", + "SHM_GET_BOOL", + "SHM_GET_HIDDEN", + + "NEED_PASSPHRASE", + "VALIDSIG", + "SIG_ID", + "ENC_TO", + "NODATA", + "BAD_PASSPHRASE", + "NO_PUBKEY", + "NO_SECKEY", + "NEED_PASSPHRASE_SYM", + "DECRYPTION_FAILED", + "DECRYPTION_OKAY", + "MISSING_PASSPHRASE", + "GOOD_PASSPHRASE", + "GOODMDC", + "BADMDC", + "ERRMDC", + "IMPORTED", + "IMPORT_OK", + "IMPORT_PROBLEM", + "IMPORT_RES", + "FILE_START", + "FILE_DONE", + "FILE_ERROR", + + "BEGIN_DECRYPTION", + "END_DECRYPTION", + "BEGIN_ENCRYPTION", + "END_ENCRYPTION", + + "DELETE_PROBLEM", + "GET_BOOL", + "GET_LINE", + "GET_HIDDEN", + "GOT_IT", + "PROGRESS", + "SIG_CREATED", + "SESSION_KEY", + "NOTATION_NAME", + "NOTATION_DATA", + "POLICY_URL", + "BEGIN_STREAM", + "END_STREAM", + "KEY_CREATED", + "USERID_HINT", + "UNEXPECTED", + "INV_RECP", + "NO_RECP", + "ALREADY_SIGNED", + "SIGEXPIRED", + "EXPSIG", + "EXPKEYSIG", + "TRUNCATED", + "ERROR", + "NEWSIG", + "REVKEYSIG", + "SIG_SUBPACKET", + "NEED_PASSPHRASE_PIN", + "SC_OP_FAILURE", + "SC_OP_SUCCESS", + "CARDCTRL", + "BACKUP_KEY_CREATED", + "PKA_TRUST_BAD", + "PKA_TRUST_GOOD", + + "PLAINTEXT", +}; +static const unsigned int num_status_strings = sizeof status_strings / sizeof *status_strings ; + +const char * status_to_string( unsigned int idx ) { + if ( idx < num_status_strings ) + return status_strings[idx]; + else + return "(unknown)"; +} Index: gpgme++/CMakeLists.txt =================================================================== Index: gpgme++/editinteractor.cpp ===================================================================
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor