aboutsummaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2024-11-18 16:53:29 +0000
committersaturneric <[email protected]>2024-11-18 16:53:55 +0000
commita5d7cc6aa2951b20064108fadd39eaae3b8472b2 (patch)
treecc93a20b8be1e1c8571bb8d9ea3c8eba379ed6a6 /src/core
parentfeat: make primary key and subkey clearly (diff)
downloadGpgFrontend-a5d7cc6aa2951b20064108fadd39eaae3b8472b2.tar.gz
GpgFrontend-a5d7cc6aa2951b20064108fadd39eaae3b8472b2.zip
feat: add delete subkey function
Diffstat (limited to 'src/core')
-rw-r--r--src/core/function/gpg/GpgKeyManager.cpp186
-rw-r--r--src/core/function/gpg/GpgKeyManager.h13
2 files changed, 148 insertions, 51 deletions
diff --git a/src/core/function/gpg/GpgKeyManager.cpp b/src/core/function/gpg/GpgKeyManager.cpp
index 18a8751e..bd52c341 100644
--- a/src/core/function/gpg/GpgKeyManager.cpp
+++ b/src/core/function/gpg/GpgKeyManager.cpp
@@ -94,60 +94,55 @@ auto GpgFrontend::GpgKeyManager::SetExpire(
auto GpgFrontend::GpgKeyManager::SetOwnerTrustLevel(const GpgKey& key,
int trust_level) -> bool {
- if (trust_level < 0 || trust_level > 5) {
+ if (trust_level < 1 || trust_level > 5) {
FLOG_W("illegal owner trust level: %d", trust_level);
}
- AutomatonNextStateHandler next_state_handler = [](AutomatonState state,
- QString status,
- QString args) {
- LOG_D() << "next_state_handler state: " << static_cast<unsigned int>(state)
- << ", gpg_status: " << status << ", args: " << args;
+ AutomatonNextStateHandler next_state_handler =
+ [](AutomatonState state, QString status, QString args) {
+ auto tokens = args.split(' ');
- auto tokens = args.split(' ');
-
- switch (state) {
- case AS_START:
- if (status == "GET_LINE" && args == "keyedit.prompt") {
- return AS_COMMAND;
- }
- return AS_ERROR;
- case AS_COMMAND:
- if (status == "GET_LINE" && args == "edit_ownertrust.value") {
- return AS_VALUE;
- }
- return AS_ERROR;
- case AS_VALUE:
- if (status == "GET_LINE" && args == "keyedit.prompt") {
- return AS_QUIT;
- } else if (status == "GET_BOOL" &&
- args == "edit_ownertrust.set_ultimate.okay") {
- return AS_REALLY_ULTIMATE;
- }
- return AS_ERROR;
- case AS_REALLY_ULTIMATE:
- if (status == "GET_LINE" && args == "keyedit.prompt") {
- return AS_QUIT;
- }
- return AS_ERROR;
- case AS_QUIT:
- if (status == "GET_LINE" && args == "keyedit.save.okay") {
- return AS_SAVE;
- }
- return AS_ERROR;
- case AS_ERROR:
- if (status == "GET_LINE" && args == "keyedit.prompt") {
- return AS_QUIT;
- }
- return AS_ERROR;
- default:
- return AS_ERROR;
- };
- };
+ switch (state) {
+ case AS_START:
+ if (status == "GET_LINE" && args == "keyedit.prompt") {
+ return AS_COMMAND;
+ }
+ return AS_ERROR;
+ case AS_COMMAND:
+ if (status == "GET_LINE" && args == "edit_ownertrust.value") {
+ return AS_VALUE;
+ }
+ return AS_ERROR;
+ case AS_VALUE:
+ if (status == "GET_LINE" && args == "keyedit.prompt") {
+ return AS_QUIT;
+ } else if (status == "GET_BOOL" &&
+ args == "edit_ownertrust.set_ultimate.okay") {
+ return AS_REALLY_ULTIMATE;
+ }
+ return AS_ERROR;
+ case AS_REALLY_ULTIMATE:
+ if (status == "GET_LINE" && args == "keyedit.prompt") {
+ return AS_QUIT;
+ }
+ return AS_ERROR;
+ case AS_QUIT:
+ if (status == "GET_BOOL" && args == "keyedit.save.okay") {
+ return AS_SAVE;
+ }
+ return AS_ERROR;
+ case AS_ERROR:
+ if (status == "GET_LINE" && args == "keyedit.prompt") {
+ return AS_QUIT;
+ }
+ return AS_ERROR;
+ default:
+ return AS_ERROR;
+ };
+ };
AutomatonActionHandler action_handler =
[trust_level](AutomatonHandelStruct& handler, AutomatonState state) {
- FLOG_D("action_handler state: %d", static_cast<unsigned int>(state));
switch (state) {
case AS_COMMAND:
return QString("trust");
@@ -210,11 +205,15 @@ auto GpgFrontend::GpgKeyManager::interactor_cb_fnc(void* handle,
return 0;
}
+ LOG_D() << "current state" << handle_struct->CurrentStatus()
+ << "gpg status: " << status_s << ", args: " << args_s;
+
AutomatonState next_state = handle_struct->NextState(status_s, args_s);
if (next_state == AS_ERROR) {
- FLOG_D("handle struct next state caught error, skipping...");
- return GPG_ERR_FALSE;
+ FLOG_D("handle struct next state caught error, abort...");
+ return -1;
}
+ LOG_D() << "next state" << next_state;
if (next_state == AS_SAVE) {
handle_struct->SetSuccess(true);
@@ -224,6 +223,8 @@ auto GpgFrontend::GpgKeyManager::interactor_cb_fnc(void* handle,
handle_struct->SetStatus(next_state);
Command cmd = handle_struct->Action();
+ LOG_D() << "next action, cmd:" << cmd;
+
if (!cmd.isEmpty()) {
auto btye_array = cmd.toUtf8();
gpgme_io_write(fd, btye_array, btye_array.size());
@@ -234,4 +235,89 @@ auto GpgFrontend::GpgKeyManager::interactor_cb_fnc(void* handle,
}
return 0;
-} \ No newline at end of file
+}
+auto GpgFrontend::GpgKeyManager::DeleteSubkey(const GpgKey& key,
+ int subkey_index) -> bool {
+ if (subkey_index < 0 || subkey_index >= key.GetSubKeys()->size()) {
+ LOG_W() << "illegal subkey index: " << subkey_index;
+ }
+
+ AutomatonNextStateHandler next_state_handler =
+ [](AutomatonState state, QString status, QString args) {
+ auto tokens = args.split(' ');
+
+ switch (state) {
+ case AS_START:
+ if (status == "GET_LINE" && args == "keyedit.prompt") {
+ return AS_SELECT;
+ }
+ return AS_ERROR;
+ case AS_SELECT:
+ if (status == "GET_LINE" && args == "keyedit.prompt") {
+ return AS_COMMAND;
+ }
+ return AS_ERROR;
+ case AS_COMMAND:
+ if (status == "GET_LINE" && args == "keyedit.prompt") {
+ return AS_QUIT;
+ } else if (status == "GET_BOOL" &&
+ args == "keyedit.remove.subkey.okay") {
+ return AS_REALLY_ULTIMATE;
+ }
+ return AS_ERROR;
+ case AS_REALLY_ULTIMATE:
+ if (status == "GET_LINE" && args == "keyedit.prompt") {
+ return AS_QUIT;
+ }
+ return AS_ERROR;
+ case AS_QUIT:
+ if (status == "GET_BOOL" && args == "keyedit.save.okay") {
+ return AS_SAVE;
+ }
+ return AS_ERROR;
+ case AS_ERROR:
+ if (status == "GET_LINE" && args == "keyedit.prompt") {
+ return AS_QUIT;
+ }
+ return AS_ERROR;
+ default:
+ return AS_ERROR;
+ };
+ };
+
+ AutomatonActionHandler action_handler =
+ [subkey_index](AutomatonHandelStruct& handler, AutomatonState state) {
+ switch (state) {
+ case AS_SELECT:
+ return QString("key %1").arg(subkey_index);
+ case AS_COMMAND:
+ return QString("delkey");
+ case AS_REALLY_ULTIMATE:
+ handler.SetSuccess(true);
+ return QString("Y");
+ case AS_QUIT:
+ return QString("quit");
+ case AS_SAVE:
+ handler.SetSuccess(true);
+ return QString("Y");
+ case AS_START:
+ case AS_ERROR:
+ return QString("");
+ default:
+ return QString("");
+ }
+ return QString("");
+ };
+
+ auto key_fpr = key.GetFingerprint();
+ AutomatonHandelStruct handel_struct(key_fpr);
+ handel_struct.SetHandler(next_state_handler, action_handler);
+
+ GpgData data_out;
+
+ auto err =
+ gpgme_op_interact(ctx_.DefaultContext(), static_cast<gpgme_key_t>(key), 0,
+ GpgKeyManager::interactor_cb_fnc,
+ static_cast<void*>(&handel_struct), data_out);
+ return CheckGpgError(err) == GPG_ERR_NO_ERROR && handel_struct.Success();
+}
diff --git a/src/core/function/gpg/GpgKeyManager.h b/src/core/function/gpg/GpgKeyManager.h
index a34b34c1..83a38d05 100644
--- a/src/core/function/gpg/GpgKeyManager.h
+++ b/src/core/function/gpg/GpgKeyManager.h
@@ -91,6 +91,16 @@ class GPGFRONTEND_CORE_EXPORT GpgKeyManager
*/
auto SetOwnerTrustLevel(const GpgKey& key, int trust_level) -> bool;
+ /**
+ * @brief
+ *
+ * @param key
+ * @param subkey_index
+ * @return true
+ * @return false
+ */
+ auto DeleteSubkey(const GpgKey& key, int subkey_index) -> bool;
+
private:
static auto interactor_cb_fnc(void* handle, const char* status,
const char* args, int fd) -> gpgme_error_t;
@@ -98,6 +108,7 @@ class GPGFRONTEND_CORE_EXPORT GpgKeyManager
using Command = QString;
using AutomatonState = enum {
AS_START,
+ AS_SELECT,
AS_COMMAND,
AS_VALUE,
AS_REALLY_ULTIMATE,
@@ -115,7 +126,7 @@ class GPGFRONTEND_CORE_EXPORT GpgKeyManager
struct AutomatonHandelStruct {
void SetStatus(AutomatonState next_state) { current_state_ = next_state; }
- auto CuurentStatus() -> AutomatonState { return current_state_; }
+ auto CurrentStatus() -> AutomatonState { return current_state_; }
void SetHandler(AutomatonNextStateHandler next_state_handler,
AutomatonActionHandler action_handler) {
next_state_handler_ = std::move(next_state_handler);