From b46cf53be5e0eaf37cf81192fa4e475ed3502601 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Mon, 8 Aug 2022 22:50:27 -0400 Subject: add hrantzsch/keychain and link --- .gitmodules | 3 +++ CMakeLists.txt | 11 +++++++++++ subprojects/keychain | 1 + 3 files changed, 15 insertions(+) create mode 160000 subprojects/keychain diff --git a/.gitmodules b/.gitmodules index 17c4c23..d091843 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "subprojects/ixwebsocket"] path = subprojects/ixwebsocket url = https://github.com/machinezone/ixwebsocket +[submodule "subprojects/keychain"] + path = subprojects/keychain + url = https://github.com/hrantzsch/keychain diff --git a/CMakeLists.txt b/CMakeLists.txt index 44ca621..901b370 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") option(USE_LIBHANDY "Enable features that require libhandy (default)" ON) +option(USE_KEYCHAIN "Store the token in the keychain (default)" ON) find_package(nlohmann_json REQUIRED) find_package(CURL) @@ -100,3 +101,13 @@ if (USE_LIBHANDY) target_compile_definitions(abaddon PRIVATE WITH_LIBHANDY) endif () endif () + +if (USE_KEYCHAIN) + find_package(keychain QUIET) + if (NOT keychain_FOUND) + message("keychain was not found and will be included as a submodule") + add_subdirectory(subprojects/keychain) + target_link_libraries(abaddon keychain) + target_compile_definitions(abaddon PRIVATE WITH_KEYCHAIN) + endif () +endif () diff --git a/subprojects/keychain b/subprojects/keychain new file mode 160000 index 0000000..44b517d --- /dev/null +++ b/subprojects/keychain @@ -0,0 +1 @@ +Subproject commit 44b517d0962c83cce31c190a6be44c3ddbf52d50 -- cgit v1.2.3 From ee67037a3fce6413ec6b6a78a8588d775020f1c8 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Mon, 8 Aug 2022 23:25:34 -0400 Subject: store token in keychain --- src/settings.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/settings.cpp b/src/settings.cpp index 242bd7c..7564d4d 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1,6 +1,15 @@ #include "settings.hpp" #include #include +#include + +#ifdef WITH_KEYCHAIN + #include +#endif + +const std::string KeychainPackage = "com.github.uowuo.abaddon"; +const std::string KeychainService = "client-token"; +const std::string KeychainUser = "discord"; SettingsManager::SettingsManager(const std::string &filename) : m_filename(filename) { @@ -36,7 +45,6 @@ void SettingsManager::ReadSettings() { SMSTR("discord", "api_base", APIBaseURL); SMSTR("discord", "gateway", GatewayURL); - SMSTR("discord", "token", DiscordToken); SMBOOL("discord", "memory_db", UseMemoryDB); SMBOOL("discord", "prefetch", Prefetch); SMSTR("gui", "css", MainCSS); @@ -58,6 +66,32 @@ void SettingsManager::ReadSettings() { SMSTR("style", "mentionbadgetextcolor", MentionBadgeTextColor); SMSTR("style", "unreadcolor", UnreadIndicatorColor); +#ifdef WITH_KEYCHAIN + keychain::Error error {}; + + // convert to keychain if present in normal settings + SMSTR("discord", "token", DiscordToken); + + if (!m_settings.DiscordToken.empty()) { + keychain::Error set_error {}; + + keychain::setPassword(KeychainPackage, KeychainService, KeychainUser, m_settings.DiscordToken, set_error); + if (set_error) { + printf("keychain error setting token: %s\n", set_error.message.c_str()); + } else { + m_file.remove_key("discord", "token"); + } + } + + m_settings.DiscordToken = keychain::getPassword(KeychainPackage, KeychainService, KeychainUser, error); + if (error && error.type != keychain::ErrorType::NotFound) { + printf("keychain error reading token: %s (%d)\n", error.message.c_str(), error.code); + } + +#else + SMSTR("discord", "token", DiscordToken); +#endif + #undef SMBOOL #undef SMSTR #undef SMINT @@ -89,7 +123,6 @@ void SettingsManager::Close() { SMSTR("discord", "api_base", APIBaseURL); SMSTR("discord", "gateway", GatewayURL); - SMSTR("discord", "token", DiscordToken); SMBOOL("discord", "memory_db", UseMemoryDB); SMBOOL("discord", "prefetch", Prefetch); SMSTR("gui", "css", MainCSS); @@ -111,6 +144,17 @@ void SettingsManager::Close() { SMSTR("style", "mentionbadgetextcolor", MentionBadgeTextColor); SMSTR("style", "unreadcolor", UnreadIndicatorColor); +#ifdef WITH_KEYCHAIN + keychain::Error error {}; + + keychain::setPassword(KeychainPackage, KeychainService, KeychainUser, m_settings.DiscordToken, error); + if (error) { + printf("keychain error setting token: %s\n", error.message.c_str()); + } +#else + SMSTR("discord", "token", DiscordToken); +#endif + #undef SMSTR #undef SMBOOL #undef SMINT -- cgit v1.2.3 From 77dd9fabfa054bd8fa24f869b976da7ee69c8a87 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Tue, 9 Aug 2022 02:06:24 -0400 Subject: change service clear user --- src/settings.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/settings.cpp b/src/settings.cpp index 7564d4d..6afc351 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -8,8 +8,8 @@ #endif const std::string KeychainPackage = "com.github.uowuo.abaddon"; -const std::string KeychainService = "client-token"; -const std::string KeychainUser = "discord"; +const std::string KeychainService = "abaddon-client-token"; +const std::string KeychainUser = ""; SettingsManager::SettingsManager(const std::string &filename) : m_filename(filename) { -- cgit v1.2.3