From c02382b6e5475890822a6f62d8bb5770b0cb842d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 29 Jan 2021 19:16:53 +0100 Subject: [PATCH] config: initial password setup prompt wip --- src/Config.cpp | 166 ++++++++++++++++++++++++++++++++----------------- src/Config.h | 1 + 2 files changed, 109 insertions(+), 58 deletions(-) diff --git a/src/Config.cpp b/src/Config.cpp index 3c955d8c..1148b892 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -18,9 +18,13 @@ with this program. If not, see #include +#include #include #include #include +#include +#include +#include #define SECTION_NAME "WebsocketAPI" #define PARAM_ENABLE "ServerEnabled" @@ -32,6 +36,8 @@ with this program. If not, see #define PARAM_SECRET "AuthSecret" #define PARAM_SALT "AuthSalt" +#define GLOBAL_AUTH_SETUP_PROMPTED "AuthSetupPrompted" + #include "Utils.h" #include "WSServer.h" @@ -130,6 +136,70 @@ config_t* Config::GetConfigStore() return obs_frontend_get_profile_config(); } +void Config::MigrateFromGlobalSettings() +{ + config_t* source = obs_frontend_get_global_config(); + config_t* destination = obs_frontend_get_profile_config(); + + if(config_has_user_value(source, SECTION_NAME, PARAM_ENABLE)) { + bool value = config_get_bool(source, SECTION_NAME, PARAM_ENABLE); + config_set_bool(destination, SECTION_NAME, PARAM_ENABLE, value); + + config_remove_value(source, SECTION_NAME, PARAM_ENABLE); + } + + if(config_has_user_value(source, SECTION_NAME, PARAM_PORT)) { + uint64_t value = config_get_uint(source, SECTION_NAME, PARAM_PORT); + config_set_uint(destination, SECTION_NAME, PARAM_PORT, value); + + config_remove_value(source, SECTION_NAME, PARAM_PORT); + } + + if(config_has_user_value(source, SECTION_NAME, PARAM_LOCKTOIPV4)) { + bool value = config_get_bool(source, SECTION_NAME, PARAM_LOCKTOIPV4); + config_set_bool(destination, SECTION_NAME, PARAM_LOCKTOIPV4, value); + + config_remove_value(source, SECTION_NAME, PARAM_LOCKTOIPV4); + } + + if(config_has_user_value(source, SECTION_NAME, PARAM_DEBUG)) { + bool value = config_get_bool(source, SECTION_NAME, PARAM_DEBUG); + config_set_bool(destination, SECTION_NAME, PARAM_DEBUG, value); + + config_remove_value(source, SECTION_NAME, PARAM_DEBUG); + } + + if(config_has_user_value(source, SECTION_NAME, PARAM_ALERT)) { + bool value = config_get_bool(source, SECTION_NAME, PARAM_ALERT); + config_set_bool(destination, SECTION_NAME, PARAM_ALERT, value); + + config_remove_value(source, SECTION_NAME, PARAM_ALERT); + } + + if(config_has_user_value(source, SECTION_NAME, PARAM_AUTHREQUIRED)) { + bool value = config_get_bool(source, SECTION_NAME, PARAM_AUTHREQUIRED); + config_set_bool(destination, SECTION_NAME, PARAM_AUTHREQUIRED, value); + + config_remove_value(source, SECTION_NAME, PARAM_AUTHREQUIRED); + } + + if(config_has_user_value(source, SECTION_NAME, PARAM_SECRET)) { + const char* value = config_get_string(source, SECTION_NAME, PARAM_SECRET); + config_set_string(destination, SECTION_NAME, PARAM_SECRET, value); + + config_remove_value(source, SECTION_NAME, PARAM_SECRET); + } + + if(config_has_user_value(source, SECTION_NAME, PARAM_SALT)) { + const char* value = config_get_string(source, SECTION_NAME, PARAM_SALT); + config_set_string(destination, SECTION_NAME, PARAM_SALT, value); + + config_remove_value(source, SECTION_NAME, PARAM_SALT); + } + + config_save(destination); +} + QString Config::GenerateSalt() { // Generate 32 random chars @@ -233,68 +303,48 @@ void Config::OnFrontendEvent(enum obs_frontend_event event, void* param) } } } + else if (event == OBS_FRONTEND_EVENT_FINISHED_LOADING) { + FirstRunPasswordSetup(); + } } -void Config::MigrateFromGlobalSettings() +void Config::FirstRunPasswordSetup() { - config_t* source = obs_frontend_get_global_config(); - config_t* destination = obs_frontend_get_profile_config(); - - if(config_has_user_value(source, SECTION_NAME, PARAM_ENABLE)) { - bool value = config_get_bool(source, SECTION_NAME, PARAM_ENABLE); - config_set_bool(destination, SECTION_NAME, PARAM_ENABLE, value); - - config_remove_value(source, SECTION_NAME, PARAM_ENABLE); + // check if we already showed the auth setup prompt to the user, independently of the current settings (tied to the current profile) + config_t* globalConfig = obs_frontend_get_global_config(); + bool alreadyPrompted = config_get_bool(globalConfig, SECTION_NAME, GLOBAL_AUTH_SETUP_PROMPTED); + if (alreadyPrompted) { + return; } - if(config_has_user_value(source, SECTION_NAME, PARAM_PORT)) { - uint64_t value = config_get_uint(source, SECTION_NAME, PARAM_PORT); - config_set_uint(destination, SECTION_NAME, PARAM_PORT, value); + // lift the flag up and save it + config_set_bool(globalConfig, SECTION_NAME, GLOBAL_AUTH_SETUP_PROMPTED, true); + config_save(globalConfig); + + obs_frontend_push_ui_translation(obs_module_get_string); + QString initialPasswordSetupTitle = QObject::tr("OBSWebsocket.InitialPasswordSetup.Title"); + QString initialPasswordSetupText = QObject::tr("OBSWebsocket.InitialPasswordSetup.Text"); + QString setupDismissedTitle = QObject::tr("OBSWebsocket.InitialPasswordSetupDismissed.Title"); + QString setupDismissedText = QObject::tr("OBSWebsocket.InitialPasswordSetupDismissed.Text"); + obs_frontend_pop_ui_translation(); + + // prompt for a password + auto mainWindow = reinterpret_cast( + obs_frontend_get_main_window() + ); + bool promptAccepted = false; + QString newPassword = QInputDialog::getText( + mainWindow, + initialPasswordSetupTitle, initialPasswordSetupText, + QLineEdit::PasswordEchoOnEdit, QString::Null(), &promptAccepted + ); + + if (promptAccepted) { + // set new password + GetConfig()->SetPassword(newPassword); + } else { + // tell the user they still can set the password later in our settings dialog + QMessageBox::information(mainWindow, setupDismissedTitle, setupDismissedText, QMessageBox::Ok); - config_remove_value(source, SECTION_NAME, PARAM_PORT); } - - if(config_has_user_value(source, SECTION_NAME, PARAM_LOCKTOIPV4)) { - bool value = config_get_bool(source, SECTION_NAME, PARAM_LOCKTOIPV4); - config_set_bool(destination, SECTION_NAME, PARAM_LOCKTOIPV4, value); - - config_remove_value(source, SECTION_NAME, PARAM_LOCKTOIPV4); - } - - if(config_has_user_value(source, SECTION_NAME, PARAM_DEBUG)) { - bool value = config_get_bool(source, SECTION_NAME, PARAM_DEBUG); - config_set_bool(destination, SECTION_NAME, PARAM_DEBUG, value); - - config_remove_value(source, SECTION_NAME, PARAM_DEBUG); - } - - if(config_has_user_value(source, SECTION_NAME, PARAM_ALERT)) { - bool value = config_get_bool(source, SECTION_NAME, PARAM_ALERT); - config_set_bool(destination, SECTION_NAME, PARAM_ALERT, value); - - config_remove_value(source, SECTION_NAME, PARAM_ALERT); - } - - if(config_has_user_value(source, SECTION_NAME, PARAM_AUTHREQUIRED)) { - bool value = config_get_bool(source, SECTION_NAME, PARAM_AUTHREQUIRED); - config_set_bool(destination, SECTION_NAME, PARAM_AUTHREQUIRED, value); - - config_remove_value(source, SECTION_NAME, PARAM_AUTHREQUIRED); - } - - if(config_has_user_value(source, SECTION_NAME, PARAM_SECRET)) { - const char* value = config_get_string(source, SECTION_NAME, PARAM_SECRET); - config_set_string(destination, SECTION_NAME, PARAM_SECRET, value); - - config_remove_value(source, SECTION_NAME, PARAM_SECRET); - } - - if(config_has_user_value(source, SECTION_NAME, PARAM_SALT)) { - const char* value = config_get_string(source, SECTION_NAME, PARAM_SALT); - config_set_string(destination, SECTION_NAME, PARAM_SALT, value); - - config_remove_value(source, SECTION_NAME, PARAM_SALT); - } - - config_save(destination); -} +} \ No newline at end of file diff --git a/src/Config.h b/src/Config.h index f21e396a..1aa29ebf 100644 --- a/src/Config.h +++ b/src/Config.h @@ -55,4 +55,5 @@ class Config { private: static void OnFrontendEvent(enum obs_frontend_event event, void* param); + static void FirstRunPasswordSetup(); };