diff options
author | saturneric <[email protected]> | 2024-11-18 16:53:29 +0000 |
---|---|---|
committer | saturneric <[email protected]> | 2024-11-18 16:53:55 +0000 |
commit | a5d7cc6aa2951b20064108fadd39eaae3b8472b2 (patch) | |
tree | cc93a20b8be1e1c8571bb8d9ea3c8eba379ed6a6 /src/core | |
parent | feat: make primary key and subkey clearly (diff) | |
download | GpgFrontend-a5d7cc6aa2951b20064108fadd39eaae3b8472b2.tar.gz GpgFrontend-a5d7cc6aa2951b20064108fadd39eaae3b8472b2.zip |
feat: add delete subkey function
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/function/gpg/GpgKeyManager.cpp | 186 | ||||
-rw-r--r-- | src/core/function/gpg/GpgKeyManager.h | 13 |
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); |