add runtime option for keychain token storage

This commit is contained in:
ouwou 2024-01-07 01:35:54 -05:00
parent 634f516195
commit 7886f5371a
2 changed files with 19 additions and 15 deletions

View File

@ -22,7 +22,7 @@ SettingsManager::SettingsManager(const std::string &filename)
try {
m_ok = m_file.load_from_file(m_filename, Glib::KEY_FILE_KEEP_COMMENTS);
} catch (const Glib::Error &e) {
fprintf(stderr, "error opening settings KeyFile: %s\n", e.what().c_str());
spdlog::get("ui")->error("Error opening settings KeyFile: {}", e.what().c_str());
m_ok = false;
}
@ -30,14 +30,16 @@ SettingsManager::SettingsManager(const std::string &filename)
if (m_ok) ReadSettings();
}
// semi-misleading name... only handles keychain (token is a normal setting)
// DONT call AddSetting here
void SettingsManager::HandleReadToken() {
#ifdef WITH_KEYCHAIN
// Move to keychain if present
using namespace std::string_literals;
std::string token;
try {
token = m_file.get_string("discord", "token");
} catch (...) {}
if (!m_settings.UseKeychain) return;
// Move to keychain if present in .ini
std::string token = m_settings.DiscordToken;
if (!token.empty()) {
keychain::Error error {};
@ -54,19 +56,18 @@ void SettingsManager::HandleReadToken() {
if (error && error.type != keychain::ErrorType::NotFound) {
spdlog::get("ui")->error("Keychain error reading token: {} ({})", error.message, error.code);
}
#else
AddSetting("discord", "token", "", &Settings::DiscordToken);
#endif
}
void SettingsManager::HandleWriteToken() {
#ifdef WITH_KEYCHAIN
keychain::Error error {};
if (m_settings.UseKeychain) {
keychain::Error error {};
keychain::setPassword(KeychainPackage, KeychainService, KeychainUser, m_settings.DiscordToken, error);
if (error) {
spdlog::get("ui")->error("Keychain error setting token: {}", error.message);
keychain::setPassword(KeychainPackage, KeychainService, KeychainUser, m_settings.DiscordToken, error);
if (error) {
spdlog::get("ui")->error("Keychain error setting token: {}", error.message);
}
}
#endif
// else it will get enumerated over as part of definitions
@ -77,9 +78,11 @@ void SettingsManager::DefineSettings() {
AddSetting("discord", "api_base", "https://discord.com/api/v9"s, &Settings::APIBaseURL);
AddSetting("discord", "gateway", "wss://gateway.discord.gg/?v=9&encoding=json&compress=zlib-stream"s, &Settings::GatewayURL);
AddSetting("discord", "token", ""s, &Settings::DiscordToken);
AddSetting("discord", "memory_db", false, &Settings::UseMemoryDB);
AddSetting("discord", "prefetch", false, &Settings::Prefetch);
AddSetting("discord", "autoconnect", false, &Settings::Autoconnect);
AddSetting("discord", "keychain", true, &Settings::UseKeychain);
AddSetting("gui", "css", "main.css"s, &Settings::MainCSS);
AddSetting("gui", "animated_guild_hover_only", true, &Settings::AnimatedGuildHoverOnly);
@ -118,8 +121,6 @@ void SettingsManager::DefineSettings() {
#else
AddSetting("voice", "vad", "gate"s, &Settings::VAD);
#endif
HandleReadToken();
}
void SettingsManager::ReadSettings() {
@ -148,6 +149,8 @@ void SettingsManager::ReadSettings() {
}
}
HandleReadToken();
m_read_settings = m_settings;
}

View File

@ -13,6 +13,7 @@ public:
bool UseMemoryDB;
bool Prefetch;
bool Autoconnect;
bool UseKeychain;
// [gui]
std::string MainCSS;