From 9365538b3b7aa7b48ac64990f3996d60ce11297c Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 19 Apr 2017 17:28:51 -0400 Subject: [PATCH] Don't store the user's password in plaintext in the prefs file The game now supports @ or = in usernames for the purpose of saving them to a file. Though I don't think these are allowed currently, it's probably better to support it from the start rather than having things break if they later become allowed. --- projectfiles/VC12/wesnoth.vcxproj | 2 + projectfiles/VC12/wesnoth.vcxproj.filters | 6 + source_lists/libwesnoth | 1 + src/chat_events.cpp | 1 + src/display_chat_manager.cpp | 1 + src/filesystem.hpp | 1 + src/filesystem_common.cpp | 5 + src/game_initialization/configure_engine.cpp | 1 + src/game_initialization/connect_engine.cpp | 1 + src/game_initialization/create_engine.cpp | 1 + src/game_initialization/lobby_data.cpp | 1 + src/game_initialization/multiplayer.cpp | 5 +- src/game_launcher.cpp | 17 +- .../dialogs/multiplayer/mp_change_control.cpp | 2 +- src/gui/dialogs/multiplayer/mp_join_game.cpp | 2 +- src/gui/dialogs/multiplayer/mp_login.cpp | 39 ++- src/gui/dialogs/multiplayer/mp_login.hpp | 11 +- .../multiplayer/mp_method_selection.cpp | 2 +- src/gui/dialogs/preferences_dialog.cpp | 1 + src/gui/widgets/chatbox.cpp | 1 + src/menu_events.cpp | 1 + src/play_controller.cpp | 1 + src/preferences/credentials.cpp | 287 ++++++++++++++++++ src/preferences/credentials.hpp | 30 ++ src/preferences/game.cpp | 147 --------- src/preferences/game.hpp | 39 --- src/preferences/general.cpp | 4 + src/server/game.cpp | 1 + src/tests/gui/test_gui2.cpp | 2 +- 29 files changed, 401 insertions(+), 212 deletions(-) create mode 100644 src/preferences/credentials.cpp create mode 100644 src/preferences/credentials.hpp diff --git a/projectfiles/VC12/wesnoth.vcxproj b/projectfiles/VC12/wesnoth.vcxproj index 96e562a0e1e1..9c44d46dc599 100644 --- a/projectfiles/VC12/wesnoth.vcxproj +++ b/projectfiles/VC12/wesnoth.vcxproj @@ -738,6 +738,7 @@ + $(IntDir)Desktop\ @@ -3439,6 +3440,7 @@ + diff --git a/projectfiles/VC12/wesnoth.vcxproj.filters b/projectfiles/VC12/wesnoth.vcxproj.filters index 5439fefdb2ac..f565044405a7 100644 --- a/projectfiles/VC12/wesnoth.vcxproj.filters +++ b/projectfiles/VC12/wesnoth.vcxproj.filters @@ -1536,6 +1536,9 @@ Preferences + + Preferences + @@ -2983,6 +2986,9 @@ Preferences + + Preferences + diff --git a/source_lists/libwesnoth b/source_lists/libwesnoth index 0fd4d08e8a31..66eba01f134a 100644 --- a/source_lists/libwesnoth +++ b/source_lists/libwesnoth @@ -28,6 +28,7 @@ hotkey/hotkey_item.cpp hotkey/hotkey_manager.cpp image.cpp image_modifications.cpp +preferences/credentials.cpp preferences/general.cpp joystick.cpp key.cpp diff --git a/src/chat_events.cpp b/src/chat_events.cpp index 122c9fd95f12..83f7aae6cf0d 100644 --- a/src/chat_events.cpp +++ b/src/chat_events.cpp @@ -20,6 +20,7 @@ #include "log.hpp" #include "map_command_handler.hpp" #include "chat_command_handler.hpp" +#include "preferences/credentials.hpp" #include "preferences/general.hpp" #include "preferences/game.hpp" diff --git a/src/display_chat_manager.cpp b/src/display_chat_manager.cpp index 120f12ee33cf..4206aa073711 100644 --- a/src/display_chat_manager.cpp +++ b/src/display_chat_manager.cpp @@ -24,6 +24,7 @@ #include "mp_ui_alerts.hpp" #include "serialization/string_utils.hpp" #include "color.hpp" +#include "preferences/credentials.hpp" #include diff --git a/src/filesystem.hpp b/src/filesystem.hpp index 2893173e7ae6..bdf53e35ee8c 100644 --- a/src/filesystem.hpp +++ b/src/filesystem.hpp @@ -73,6 +73,7 @@ std::string get_dir(const std::string &dir); // The location of various important files: std::string get_prefs_file(); +std::string get_credentials_file(); std::string get_default_prefs_file(); std::string get_save_index_file(); std::string get_saves_dir(); diff --git a/src/filesystem_common.cpp b/src/filesystem_common.cpp index b0ff7beb1725..6c2bd90ebd77 100644 --- a/src/filesystem_common.cpp +++ b/src/filesystem_common.cpp @@ -34,6 +34,11 @@ std::string get_prefs_file() return get_user_config_dir() + "/preferences"; } +std::string get_credentials_file() +{ + return get_user_config_dir() + "/credentials"; +} + std::string get_default_prefs_file() { #ifdef HAS_RELATIVE_DEFPREF diff --git a/src/game_initialization/configure_engine.cpp b/src/game_initialization/configure_engine.cpp index 9f8735db65d1..abd4f034b552 100644 --- a/src/game_initialization/configure_engine.cpp +++ b/src/game_initialization/configure_engine.cpp @@ -17,6 +17,7 @@ #include "mp_game_settings.hpp" #include "settings.hpp" #include "tod_manager.hpp" +#include "preferences/credentials.hpp" #include #include diff --git a/src/game_initialization/connect_engine.cpp b/src/game_initialization/connect_engine.cpp index 1a43cf8caf6a..c4a26d49dc9f 100644 --- a/src/game_initialization/connect_engine.cpp +++ b/src/game_initialization/connect_engine.cpp @@ -15,6 +15,7 @@ #include "ai/configuration.hpp" #include "config_assign.hpp" +#include "preferences/credentials.hpp" #include "formula/string_utils.hpp" #include "game_initialization/mp_game_utils.hpp" #include "game_initialization/playcampaign.hpp" diff --git a/src/game_initialization/create_engine.cpp b/src/game_initialization/create_engine.cpp index 860bc7fb7dcc..5fd6f0d9406f 100644 --- a/src/game_initialization/create_engine.cpp +++ b/src/game_initialization/create_engine.cpp @@ -15,6 +15,7 @@ #include "game_initialization/create_engine.hpp" #include "config_assign.hpp" +#include "preferences/credentials.hpp" #include "filesystem.hpp" #include "formula/string_utils.hpp" #include "game_config_manager.hpp" diff --git a/src/game_initialization/lobby_data.cpp b/src/game_initialization/lobby_data.cpp index d60cea251569..34b56249edf5 100644 --- a/src/game_initialization/lobby_data.cpp +++ b/src/game_initialization/lobby_data.cpp @@ -15,6 +15,7 @@ #include "game_initialization/lobby_data.hpp" #include "config.hpp" +#include "preferences/credentials.hpp" #include "preferences/game.hpp" #include "gui/dialogs/campaign_difficulty.hpp" #include "filesystem.hpp" diff --git a/src/game_initialization/multiplayer.cpp b/src/game_initialization/multiplayer.cpp index ee20a473b408..b77a813a566c 100644 --- a/src/game_initialization/multiplayer.cpp +++ b/src/game_initialization/multiplayer.cpp @@ -16,6 +16,7 @@ #include "addon/manager.hpp" // for installed_addons #include "config_assign.hpp" +#include "preferences/credentials.hpp" #include "formula/string_utils.hpp" #include "game_config_manager.hpp" #include "game_initialization/mp_game_utils.hpp" @@ -191,7 +192,7 @@ static std::unique_ptr open_connection(CVideo& video, const if(!*error) break; do { - std::string password = preferences::password(); + std::string password = preferences::password(host, login); bool fall_through = (*error)["force_confirmation"].to_bool() ? (gui2::show_message(video, _("Confirm"), (*error)["message"], gui2::dialogs::message::ok_cancel_buttons) == gui2::window::CANCEL) : @@ -289,7 +290,7 @@ static std::unique_ptr open_connection(CVideo& video, const error_message = (*error)["message"].str(); } - gui2::dialogs::mp_login dlg(error_message, !((*error)["password_request"].empty())); + gui2::dialogs::mp_login dlg(host, error_message, !((*error)["password_request"].empty())); dlg.show(video); switch(dlg.get_retval()) { diff --git a/src/game_launcher.cpp b/src/game_launcher.cpp index 2f4e4b9c9203..4e3cd9a65da9 100644 --- a/src/game_launcher.cpp +++ b/src/game_launcher.cpp @@ -15,6 +15,7 @@ #include "game_launcher.hpp" #include "game_errors.hpp" +#include "preferences/credentials.hpp" #include "commandline_options.hpp" // for commandline_options #include "config.hpp" // for config, etc #include "config_assign.hpp" @@ -239,14 +240,14 @@ game_launcher::game_launcher(const commandline_options& cmdline_opts, const char else multiplayer_server_ = ""; } - } - if (cmdline_opts_.username) { - preferences::disable_preferences_save(); - preferences::set_login(*cmdline_opts_.username); - } - if (cmdline_opts_.password) { - preferences::disable_preferences_save(); - preferences::set_password(*cmdline_opts_.password); + if (cmdline_opts_.username) { + preferences::disable_preferences_save(); + preferences::set_login(*cmdline_opts_.username); + if (cmdline_opts_.password) { + preferences::disable_preferences_save(); + preferences::set_password(*cmdline_opts.server, *cmdline_opts.username, *cmdline_opts_.password); + } + } } if (cmdline_opts_.test) { diff --git a/src/gui/dialogs/multiplayer/mp_change_control.cpp b/src/gui/dialogs/multiplayer/mp_change_control.cpp index 2eea1ebf36f3..100da0318c03 100644 --- a/src/gui/dialogs/multiplayer/mp_change_control.cpp +++ b/src/gui/dialogs/multiplayer/mp_change_control.cpp @@ -22,7 +22,7 @@ #include "formula/string_utils.hpp" #include "game_board.hpp" #include "game_display.hpp" -#include "preferences/game.hpp" +#include "preferences/credentials.hpp" #include "gui/auxiliary/find_widget.hpp" #include "gui/dialogs/helper.hpp" #include "gui/widgets/label.hpp" diff --git a/src/gui/dialogs/multiplayer/mp_join_game.cpp b/src/gui/dialogs/multiplayer/mp_join_game.cpp index e6609b7ff0dc..bb1773e85276 100644 --- a/src/gui/dialogs/multiplayer/mp_join_game.cpp +++ b/src/gui/dialogs/multiplayer/mp_join_game.cpp @@ -21,7 +21,7 @@ #include "game_config.hpp" #include "game_config_manager.hpp" #include "game_initialization/mp_game_utils.hpp" -#include "preferences/game.hpp" +#include "preferences/credentials.hpp" #include "gettext.hpp" #include "gui/auxiliary/find_widget.hpp" #include "gui/dialogs/helper.hpp" diff --git a/src/gui/dialogs/multiplayer/mp_login.cpp b/src/gui/dialogs/multiplayer/mp_login.cpp index cf6616d20caf..7524e6364c48 100644 --- a/src/gui/dialogs/multiplayer/mp_login.cpp +++ b/src/gui/dialogs/multiplayer/mp_login.cpp @@ -16,8 +16,9 @@ #include "gui/dialogs/multiplayer/mp_login.hpp" -#include "preferences/game.hpp" +#include "preferences/credentials.hpp" #include "gui/auxiliary/find_widget.hpp" +#include "gui/auxiliary/field.hpp" #include "gui/widgets/button.hpp" #include "gui/widgets/password_box.hpp" #include "gui/widgets/settings.hpp" @@ -64,24 +65,32 @@ namespace dialogs REGISTER_DIALOG(mp_login) -mp_login::mp_login(const std::string& label, const bool focus_password) +mp_login::mp_login(const std::string& host, const std::string& label, const bool focus_password) + : host_(host), focus_password_(focus_password) { register_label("login_label", false, label); - register_text("user_name", true, + username_ = register_text("user_name", true, &preferences::login, &preferences::set_login, !focus_password); - register_text("password", true, - &preferences::password, - nullptr /* The password box returns '*' as value. */, - focus_password); - register_bool("remember_password", false, &preferences::remember_password, &preferences::set_remember_password); } +void mp_login::load_password(window& win) const +{ + text_box& pwd = find_widget(&win, "password", false); + pwd.set_value(preferences::password(host_, username_->get_widget_value(win))); +} + +void mp_login::save_password(window& win) const +{ + password_box& pwd = find_widget(&win, "password", false); + preferences::set_password(host_, username_->get_widget_value(win), pwd.get_real_value()); +} + void mp_login::pre_show(window& win) { if(button* btn = find_widget