diff --git a/src/server/server.cpp b/src/server/server.cpp index 2c6f343b98aa..5ba4e2417e7c 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -1097,6 +1097,9 @@ void server::handle_read_from_player(socket_ptr socket, boost::shared_ptrchild("query")) { handle_query(socket, *query); } + if(simple_wml::node* nickserv = doc->child("nickserv")) { + handle_nickserv(socket, *nickserv); + } if(!player_is_in_game(socket)) handle_player_in_lobby(socket, doc); @@ -1219,6 +1222,119 @@ void server::handle_query(socket_ptr socket, simple_wml::node& query) send_server_message(socket, response.str()); } +void server::handle_nickserv(socket_ptr socket, simple_wml::node& nickserv) +{ + // Check if this server allows nick registration at all + if(!user_handler_) { + send_server_message(socket, "This server does not allow username registration."); + return; + } + + if(nickserv.child("register")) { + try { + (user_handler_->add_user(player_connections_.find(socket)->name(), (*nickserv.child("register"))["mail"].to_string(), + (*nickserv.child("register"))["password"].to_string())); + + std::stringstream msg; + msg << "Your username has been registered." << + // Warn that providing an email address might be a good idea + ((*nickserv.child("register"))["mail"].empty() ? + " It is recommended that you provide an email address for password recovery." : ""); + send_server_message(socket, msg.str()); + + // Mark the player as registered and send the other clients + // an update to dislpay this change + player_connections_.find(socket)->info().mark_registered(); + + simple_wml::document diff; + make_change_diff(games_and_users_list_.root(), NULL, + "user", player_connections_.find(socket)->info().config_address(), diff); + send_to_lobby(diff); + + } catch (user_handler::error& e) { + send_server_message(socket, "There was an error registering your username. The error message was: " + + e.message); + } + return; + } + + // A user requested to update his password or mail + if(nickserv.child("set")) { + if(!(user_handler_->user_exists(player_connections_.find(socket)->name()))) { + send_server_message(socket, "You are not registered. Please register first."); + return; + } + + const simple_wml::node& set = *(nickserv.child("set")); + + try { + user_handler_->set_user_detail(player_connections_.find(socket)->name(), set["detail"].to_string(), set["value"].to_string()); + + send_server_message(socket, "Your details have been updated."); + + } catch (user_handler::error& e) { + send_server_message(socket, "There was an error updating your details. The error message was: " + + e.message); + } + + return; + } + + // A user requested information about another user + if(nickserv.child("details")) { + send_server_message(socket, "Valid details for this server are: " + + user_handler_->get_valid_details()); + return; + } + + // A user requested a list of which details can be set + if(nickserv.child("info")) { + try { + std::string res = user_handler_->user_info((*nickserv.child("info"))["name"].to_string()); + send_server_message(socket, res); + } catch (user_handler::error& e) { + send_server_message(socket, "There was an error looking up the details of the user '" + + (*nickserv.child("info"))["name"].to_string() + "'. " +" The error message was: " + + e.message); + } + return; + } + + // A user requested to delete his nick + if(nickserv.child("drop")) { + if(!(user_handler_->user_exists(player_connections_.find(socket)->name()))) { + send_server_message(socket, "You are not registered."); + return; + } + + // With the current policy of dissallowing to log in with a + // registerd username without the password we should never get + // to call this + if(!(player_connections_.find(socket)->info().registered())) { + send_server_message(socket, "You are not logged in."); + return; + } + + try { + user_handler_->remove_user(player_connections_.find(socket)->name()); + send_server_message(socket, "Your username has been dropped."); + + // Mark the player as not registered and send the other clients + // an update to dislpay this change + player_connections_.find(socket)->info().mark_registered(false); + + simple_wml::document diff; + make_change_diff(games_and_users_list_.root(), NULL, + "user", player_connections_.find(socket)->info().config_address(), diff); + send_to_lobby(diff); + } catch (user_handler::error& e) { + send_server_message(socket, "There was an error dropping your username. The error message was: " + + e.message); + } + return; + } +} + void server::handle_message(socket_ptr socket, simple_wml::node& message) { simple_wml::document relay_message; @@ -2792,125 +2908,6 @@ void server::dul_handler(const std::string& /*issuer_name*/, const std::string& } } -/*void server::process_nickserv(const network::connection sock, simple_wml::node& data) { - const wesnothd::player_map::iterator pl = players_.find(sock); - if (pl == players_.end()) { - DBG_SERVER << "ERROR: Could not find player with socket: " << sock << std::endl; - return; - } - - // Check if this server allows nick registration at all - if(!user_handler_) { - rooms_.lobby().send_server_message("This server does not allow username registration.", sock); - return; - } - - if(data.child("register")) { - try { - (user_handler_->add_user(pl->second.name(), (*data.child("register"))["mail"].to_string(), - (*data.child("register"))["password"].to_string())); - - std::stringstream msg; - msg << "Your username has been registered." << - // Warn that providing an email address might be a good idea - ((*data.child("register"))["mail"].empty() ? - " It is recommended that you provide an email address for password recovery." : ""); - rooms_.lobby().send_server_message(msg.str(), sock); - - // Mark the player as registered and send the other clients - // an update to dislpay this change - pl->second.mark_registered(); - - simple_wml::document diff; - make_change_diff(games_and_users_list_.root(), NULL, - "user", pl->second.config_address(), diff); - rooms_.lobby().send_data(diff); - - } catch (user_handler::error& e) { - rooms_.lobby().send_server_message("There was an error registering your username. The error message was: " - + e.message, sock); - } - return; - } - - // A user requested to update his password or mail - if(data.child("set")) { - if(!(user_handler_->user_exists(pl->second.name()))) { - rooms_.lobby().send_server_message("You are not registered. Please register first.", sock); - return; - } - - const simple_wml::node& set = *(data.child("set")); - - try { - user_handler_->set_user_detail(pl->second.name(), set["detail"].to_string(), set["value"].to_string()); - - rooms_.lobby().send_server_message("Your details have been updated.", sock); - - } catch (user_handler::error& e) { - rooms_.lobby().send_server_message("There was an error updating your details. The error message was: " - + e.message, sock); - } - - return; - } - - // A user requested information about another user - if(data.child("details")) { - rooms_.lobby().send_server_message("Valid details for this server are: " + - user_handler_->get_valid_details(), sock); - return; - } - - // A user requested a list of which details can be set - if(data.child("info")) { - try { - std::string res = user_handler_->user_info((*data.child("info"))["name"].to_string()); - rooms_.lobby().send_server_message(res, sock); - } catch (user_handler::error& e) { - rooms_.lobby().send_server_message("There was an error looking up the details of the user '" + - (*data.child("info"))["name"].to_string() + "'. " +" The error message was: " - + e.message, sock); - } - return; - } - - // A user requested to delete his nick - if(data.child("drop")) { - if(!(user_handler_->user_exists(pl->second.name()))) { - rooms_.lobby().send_server_message("You are not registered.", sock); - return; - } - - // With the current policy of dissallowing to log in with a - // registerd username without the password we should never get - // to call this - if(!(pl->second.registered())) { - rooms_.lobby().send_server_message("You are not logged in.", sock); - return; - } - - try { - user_handler_->remove_user(pl->second.name()); - rooms_.lobby().send_server_message("Your username has been dropped.", sock); - - // Mark the player as not registered and send the other clients - // an update to dislpay this change - pl->second.mark_registered(false); - - simple_wml::document diff; - make_change_diff(games_and_users_list_.root(), NULL, - "user", pl->second.config_address(), diff); - rooms_.lobby().send_data(diff); - } catch (user_handler::error& e) { - rooms_.lobby().send_server_message("There was an error dropping your username. The error message was: " - + e.message, sock); - } - return; - } -} -*/ - void server::delete_game(int gameid) { const boost::shared_ptr& game_ptr = player_connections_.get().find(gameid)->get_game(); diff --git a/src/server/server.hpp b/src/server/server.hpp index 37b328ebe4a2..5f241abed7ab 100644 --- a/src/server/server.hpp +++ b/src/server/server.hpp @@ -66,6 +66,7 @@ class server void handle_player_in_game(socket_ptr socket, boost::shared_ptr doc); void handle_whisper(socket_ptr socket, simple_wml::node& whisper); void handle_query(socket_ptr socket, simple_wml::node& query); + void handle_nickserv(socket_ptr socket, simple_wml::node& nickserv); void handle_message(socket_ptr socket, simple_wml::node& message); void handle_create_game(socket_ptr socket, simple_wml::node& create_game); void create_game(PlayerRecord& host, simple_wml::node& create_game);