aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Klöcker <[email protected]>2022-04-04 11:15:37 +0000
committerIngo Klöcker <[email protected]>2022-04-05 08:15:07 +0000
commitdb532eca8ebd64536985e7a40af22e803e3b3df9 (patch)
tree5354bbae8780d6f831c3b54f3a5760e8f2e832b6
parentcpp: Add internal utility function for splitting strings (diff)
downloadgpgme-db532eca8ebd64536985e7a40af22e803e3b3df9.tar.gz
gpgme-db532eca8ebd64536985e7a40af22e803e3b3df9.zip
cpp: Return actual error if revocation fails
* lang/cpp/src/editinteractor.cpp, lang/cpp/src/editinteractor.h (EditInteractor::parseStatusError): New. * lang/cpp/src/gpgrevokekeyeditinteractor.cpp (GpgRevokeKeyEditInteractor::Private::nextState): Handle status error. -- With this change the interactor returns a proper error like "Bad Passphrase" or "Empty Passphrase" instead of an unspecific "General Error" if a status error occurred. GnuPG-bug-id: 5904
-rw-r--r--lang/cpp/src/editinteractor.cpp15
-rw-r--r--lang/cpp/src/editinteractor.h3
-rw-r--r--lang/cpp/src/gpgrevokekeyeditinteractor.cpp4
3 files changed, 22 insertions, 0 deletions
diff --git a/lang/cpp/src/editinteractor.cpp b/lang/cpp/src/editinteractor.cpp
index e411adac..753c2b09 100644
--- a/lang/cpp/src/editinteractor.cpp
+++ b/lang/cpp/src/editinteractor.cpp
@@ -29,6 +29,7 @@
#include "editinteractor.h"
#include "callbacks.h"
#include "error.h"
+#include "util.h"
#include <gpgme.h>
@@ -256,6 +257,20 @@ void EditInteractor::setDebugChannel(std::FILE *debug)
d->debug = debug;
}
+GpgME::Error EditInteractor::parseStatusError(const char *args)
+{
+ Error err;
+
+ const auto fields = split(args, ' ');
+ if (fields.size() >= 2) {
+ err = Error{static_cast<unsigned int>(std::stoul(fields[1]))};
+ } else {
+ err = Error::fromCode(GPG_ERR_GENERAL);
+ }
+
+ return err;
+}
+
static const char *const status_strings[] = {
"EOF",
/* mkstatus processing starts here */
diff --git a/lang/cpp/src/editinteractor.h b/lang/cpp/src/editinteractor.h
index 247bf8c0..2505b028 100644
--- a/lang/cpp/src/editinteractor.h
+++ b/lang/cpp/src/editinteractor.h
@@ -60,6 +60,9 @@ public:
void setDebugChannel(std::FILE *file);
+protected:
+ Error parseStatusError(const char *args);
+
private:
class Private;
Private *const d;
diff --git a/lang/cpp/src/gpgrevokekeyeditinteractor.cpp b/lang/cpp/src/gpgrevokekeyeditinteractor.cpp
index a90b5934..86b3c3c4 100644
--- a/lang/cpp/src/gpgrevokekeyeditinteractor.cpp
+++ b/lang/cpp/src/gpgrevokekeyeditinteractor.cpp
@@ -116,6 +116,10 @@ unsigned int GpgRevokeKeyEditInteractor::Private::nextState(unsigned int status,
return q->state();
}
+ if (status == GPGME_STATUS_ERROR) {
+ err = q->parseStatusError(args);
+ return ERROR;
+ }
switch (const auto state = q->state()) {
case START:
if (status == GPGME_STATUS_GET_LINE &&