diff --git a/assets/voxygen/i18n/PL/_manifest.ron b/assets/voxygen/i18n/PL/_manifest.ron index 415e236d91..49895355b0 100644 --- a/assets/voxygen/i18n/PL/_manifest.ron +++ b/assets/voxygen/i18n/PL/_manifest.ron @@ -125,7 +125,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "ServerWentMad: Prawdopodobnie wersje są niekompatybilne, sprawdź aktualizacje!", "main.login.timeout": "Timeout: Serwer nie odpowiedział na czas. (Przeciążenie, bądź błędy sieci).", "main.login.server_shut_down": "Serwer zamknięty", - "main.login.already_logged_in": "Jesteś już zalogowany na serwerze.", "main.login.network_error": "Błąd sieci.", "main.login.failed_sending_request": "Zapytanie do serwera weryfikacji nie powiodło się", "main.login.client_crashed": "Crash clienta", diff --git a/assets/voxygen/i18n/de_DE/_manifest.ron b/assets/voxygen/i18n/de_DE/_manifest.ron index 4326243bf3..60917901b9 100644 --- a/assets/voxygen/i18n/de_DE/_manifest.ron +++ b/assets/voxygen/i18n/de_DE/_manifest.ron @@ -149,7 +149,6 @@ https://veloren.net/account/. "main.login.outdated_client_or_server": "Inkompatible Version", "main.login.timeout": "Zeitüberschreitung", "main.login.server_shut_down": "Server heruntergefahren", - "main.login.already_logged_in": "Ihr seid bereits eingeloggt", "main.login.network_error": "Netzwerkfehler", "main.login.failed_sending_request": "Authentifizierung fehlgeschlagen", "main.login.invalid_character": "Ungültiger Charakter", diff --git a/assets/voxygen/i18n/en/main.ron b/assets/voxygen/i18n/en/main.ron index ac9adf55ab..9b3069856f 100644 --- a/assets/voxygen/i18n/en/main.ron +++ b/assets/voxygen/i18n/en/main.ron @@ -48,7 +48,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "ServerWentMad: Probably versions are incompatible, check for updates.", "main.login.timeout": "Timeout: Server did not respond in time. (Overloaded or network issues).", "main.login.server_shut_down": "Server shut down", - "main.login.already_logged_in": "You are already logged into the server.", "main.login.network_error": "Network error", "main.login.network_wrong_version": "The server is running a different version than you are. Check your version and update your game.", "main.login.failed_sending_request": "Request to Auth server failed", diff --git a/assets/voxygen/i18n/es_ES/main.ron b/assets/voxygen/i18n/es_ES/main.ron index d949f497bc..9c00d1cc85 100644 --- a/assets/voxygen/i18n/es_ES/main.ron +++ b/assets/voxygen/i18n/es_ES/main.ron @@ -49,7 +49,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "ServerEnloquecido: Probablemente las versiones son incompatibles, revisa si hay actualizaciones.", "main.login.timeout": "Timeout: El servidor no respondió a tiempo. (Sobrecargado o con problemas de red).", "main.login.server_shut_down": "Servidor apagado", - "main.login.already_logged_in": "Ya estás conectado al servidor.", "main.login.network_error": "Error de red", "main.login.network_wrong_version": "El servidor está ejecutando una versión diferente a la tuya. Comprueba tu versión y actualiza tu juego.", "main.login.failed_sending_request": "Petición al servidor de autenticación fallida", diff --git a/assets/voxygen/i18n/es_la/_manifest.ron b/assets/voxygen/i18n/es_la/_manifest.ron index e54485fc71..6df5839ae8 100644 --- a/assets/voxygen/i18n/es_la/_manifest.ron +++ b/assets/voxygen/i18n/es_la/_manifest.ron @@ -150,7 +150,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "ServidorEnloquecido: Probablemente las versiones son incompatibles, intenta actualizar tu cliente.", "main.login.timeout": "Tiempo de espera agotado: El servidor no respondio a tiempo. (Puede estar sobrecargado o tener problemas de red).", "main.login.server_shut_down": "El servidor se apagó", - "main.login.already_logged_in": "Ya estás conectado al servidor.", "main.login.network_error": "Error de red", "main.login.failed_sending_request": "El pedido al servidor de autenticacion fallo", "main.login.invalid_character": "El personaje seleccionado no es válido", diff --git a/assets/voxygen/i18n/fr_FR/main.ron b/assets/voxygen/i18n/fr_FR/main.ron index 3dd4bd130b..690870a7e3 100644 --- a/assets/voxygen/i18n/fr_FR/main.ron +++ b/assets/voxygen/i18n/fr_FR/main.ron @@ -46,7 +46,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "ServeurPasContent: Les versions sont probablement incompatibles, verifiez les mises à jour.", "main.login.timeout": "DélaiEcoulé: Le serveur n'a pas répondu à temps. (Surchage ou problèmes réseau).", "main.login.server_shut_down": "Extinction du Serveur", - "main.login.already_logged_in": "Vous êtes déjà connecté sur ce serveur.", "main.login.network_error": "Problème Réseau", "main.login.network_wrong_version": "Le serveur fonctionne avec une version différente de la vôtre. Vérifiez votre version et mettez votre jeu à jour.", "main.login.failed_sending_request": "Demande d'authentification serveur échouée", diff --git a/assets/voxygen/i18n/it_IT/_manifest.ron b/assets/voxygen/i18n/it_IT/_manifest.ron index 1d06e11ded..3022b32cf8 100644 --- a/assets/voxygen/i18n/it_IT/_manifest.ron +++ b/assets/voxygen/i18n/it_IT/_manifest.ron @@ -171,7 +171,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "Il server è impazzito: Probabilmente le versioni sono incompatibili, controlla per degli aggiornamenti", "main.login.timeout": "Tempo scaduto: Il server non ha risposto in tempo. (In sovraccarico o problemi di rete)", "main.login.server_shut_down": "Il server è stato chiuso", - "main.login.already_logged_in": "Hai già effettuato l'accesso al server", "main.login.network_error": "Errore di rete", "main.login.failed_sending_request": "Richiesta ai server di autenticazione fallita", "main.login.invalid_character": "Il personaggio selezionato è invalido", diff --git a/assets/voxygen/i18n/nl/_manifest.ron b/assets/voxygen/i18n/nl/_manifest.ron index 7997dc1fdb..385f42fa12 100644 --- a/assets/voxygen/i18n/nl/_manifest.ron +++ b/assets/voxygen/i18n/nl/_manifest.ron @@ -148,7 +148,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "Versieprobleem: De versie tussen de client en de server komen niet overeen. Check of er updates zijn/", "main.login.timeout": "Timeout: De server deed er te lang over om te antwoorden. (Overblast of netwerk problemen).", "main.login.server_shut_down": "Server is afgesloten", - "main.login.already_logged_in": "Je account is al reeds ingelogd op de server.", "main.login.network_error": "Network problemen", "main.login.failed_sending_request": "Kon verzoek niet naar authenticatie server sturen", "main.login.invalid_character": "Het geselecteerde karakter is ongeldig", diff --git a/assets/voxygen/i18n/no/_manifest.ron b/assets/voxygen/i18n/no/_manifest.ron index 9e6a7677c3..ed7673cc49 100644 --- a/assets/voxygen/i18n/no/_manifest.ron +++ b/assets/voxygen/i18n/no/_manifest.ron @@ -150,7 +150,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "Sannsynligvis er versjoner inkompatible, se etter oppdateringer.", "main.login.timeout": "Serveren svarte ikke i tide. (Overbelastet eller nettverksproblemer).", "main.login.server_shut_down": "Serveren stoppet", - "main.login.already_logged_in": "Du er allerede logget på serveren.", "main.login.network_error": "Nettverksfeil", "main.login.failed_sending_request": "Forespørsel til godkjenningsserver mislyktes", "main.login.invalid_character": "Den valgte karakteren er ugyldig", diff --git a/assets/voxygen/i18n/pt_BR/main.ron b/assets/voxygen/i18n/pt_BR/main.ron index 25d13831e0..e5d2d7f47f 100644 --- a/assets/voxygen/i18n/pt_BR/main.ron +++ b/assets/voxygen/i18n/pt_BR/main.ron @@ -45,7 +45,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "Servidor enlouqueceu: Provavelmente as versões são incompatíveis. Verifique se há atualizações.", "main.login.timeout": "Tempo esgotado: Servidor não respondeu a tempo. (Sobrecarregado ou com problemas de rede).", "main.login.server_shut_down": "Servidor encerrou ou desligou", - "main.login.already_logged_in": "Você já está logado neste servidor.", "main.login.network_error": "Erro de Rede", "main.login.failed_sending_request": "Requisição ao servidor de autenticação falhou", "main.login.invalid_character": "O personagem selecionado é inválido", diff --git a/assets/voxygen/i18n/pt_PT/_manifest.ron b/assets/voxygen/i18n/pt_PT/_manifest.ron index 7aa830fd9b..9a87cf22c9 100644 --- a/assets/voxygen/i18n/pt_PT/_manifest.ron +++ b/assets/voxygen/i18n/pt_PT/_manifest.ron @@ -123,7 +123,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "Servidor endoideceu: Provavelmente as versões são incompativéis, verifique se há versões mais recentes.", "main.login.timeout": "Tempo esgotado: O servidor não respondeu a tempo. (Sobrecarregado ou problemas de rede).", "main.login.server_shut_down": "O servidor encerrou", - "main.login.already_logged_in": "Vocé ja está logado neste servidor.", "main.login.network_error": "Error de rede", "main.login.failed_sending_request": "Pedido ao servidor de autenticação falhou", "main.login.client_crashed": "O cliente crashou", diff --git a/assets/voxygen/i18n/ru_RU/_manifest.ron b/assets/voxygen/i18n/ru_RU/_manifest.ron index 59cccf95fe..b3844898b4 100644 --- a/assets/voxygen/i18n/ru_RU/_manifest.ron +++ b/assets/voxygen/i18n/ru_RU/_manifest.ron @@ -149,7 +149,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "ServerWentMad: Возможно, версии несовместимы. Проверьте наличие обновлений.", "main.login.timeout": "Timeout: Сервер не ответил вовремя. (Перегрузка или проблемы с сетью).", "main.login.server_shut_down": "Сервер выключен", - "main.login.already_logged_in": "Вы уже вошли на сервер.", "main.login.network_error": "Ошибка сети", "main.login.failed_sending_request": "Запрос аутентификации провален", "main.login.invalid_character": "Выбранный персонаж недоступен", diff --git a/assets/voxygen/i18n/tr_TR/main.ron b/assets/voxygen/i18n/tr_TR/main.ron index 9daedffbc4..5df46b198d 100644 --- a/assets/voxygen/i18n/tr_TR/main.ron +++ b/assets/voxygen/i18n/tr_TR/main.ron @@ -48,7 +48,6 @@ bir hesap oluşturabilirsin."#, "main.login.outdated_client_or_server": "SunucuÇılgınaDöndü: Muhtemelen versiyonlar uyuşmuyor, güncellemeleri kontrol et.", "main.login.timeout": "Zamanaşımı: Sunucu zamanında cevap vermedi. (Aşırı yüklenme veya ağ sorunları).", "main.login.server_shut_down": "Sunucu kapandı", - "main.login.already_logged_in": "Zaten sunucuya giriş yapmışsın.", "main.login.network_error": "Ağ hatası", "main.login.failed_sending_request": "Kimlik doğrulama sunucusuna istek gönderilemedi", "main.login.invalid_character": "Seçilen karakter geçersiz", diff --git a/assets/voxygen/i18n/uk_UA/main.ron b/assets/voxygen/i18n/uk_UA/main.ron index 7fe4fc011c..e720f9b8b7 100644 --- a/assets/voxygen/i18n/uk_UA/main.ron +++ b/assets/voxygen/i18n/uk_UA/main.ron @@ -45,7 +45,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "Помилка: ймовірно версії не сумісні, перевірте оновлення.", "main.login.timeout": "Тайм-аут: сервер не відповів вчасно (перенавантажений, або проблеми з Вашою мережею).", "main.login.server_shut_down": "Сервер вимкнено", - "main.login.already_logged_in": "Ви вже підключені до сервера.", "main.login.network_error": "Помилка мережі", "main.login.failed_sending_request": "Запит до сервера авторизації невдалий", "main.login.invalid_character": "Обраний персонаж недоступний", diff --git a/assets/voxygen/i18n/zh_CN/_manifest.ron b/assets/voxygen/i18n/zh_CN/_manifest.ron index 417dd56411..9c7f4f3827 100644 --- a/assets/voxygen/i18n/zh_CN/_manifest.ron +++ b/assets/voxygen/i18n/zh_CN/_manifest.ron @@ -136,7 +136,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "服务器与客户端可能版本不兼容,请检查更新.", "main.login.timeout": "超时: 服务器无法及时响应.", "main.login.server_shut_down": "服务器已关闭", - "main.login.already_logged_in": "您已登入服务器.", "main.login.network_error": "网络错误", "main.login.failed_sending_request": "认证服务器请求失败", "main.login.invalid_character": "选择的角色无效", diff --git a/assets/voxygen/i18n/zh_TW/_manifest.ron b/assets/voxygen/i18n/zh_TW/_manifest.ron index 45b8d3d95a..679a4ad467 100644 --- a/assets/voxygen/i18n/zh_TW/_manifest.ron +++ b/assets/voxygen/i18n/zh_TW/_manifest.ron @@ -118,7 +118,6 @@ https://veloren.net/account/."#, "main.login.outdated_client_or_server": "伺服器錯誤:版本可能不相容,請檢查更新。", "main.login.timeout": "逾時:伺服器無法即時回應(也許試過載或者網路問題)。", "main.login.server_shut_down": "伺服器已關閉", - "main.login.already_logged_in": "您已登入伺服器。", "main.login.network_error": "網路錯誤", "main.login.failed_sending_request": "認證伺服器請求失敗", "main.login.client_crashed": "客戶端崩潰", diff --git a/client/src/error.rs b/client/src/error.rs index 02905f585d..57de911e94 100644 --- a/client/src/error.rs +++ b/client/src/error.rs @@ -13,7 +13,6 @@ pub enum Error { ServerShutdown, TooManyPlayers, NotOnWhitelist, - AlreadyLoggedIn, AuthErr(String), AuthClientError(AuthClientError), AuthServerUrlInvalid(String), diff --git a/client/src/lib.rs b/client/src/lib.rs index 2ce9b5f54d..13e20f5ccf 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -538,7 +538,6 @@ impl Client { self.send_msg_err(ClientRegister { token_or_username })?; match self.register_stream.recv::().await? { - Err(RegisterError::AlreadyLoggedIn(_, _)) => Err(Error::AlreadyLoggedIn), Err(RegisterError::AuthError(err)) => Err(Error::AuthErr(err)), Err(RegisterError::InvalidCharacter) => Err(Error::InvalidCharacter), Err(RegisterError::NotOnWhitelist) => Err(Error::NotOnWhitelist), diff --git a/common/net/src/msg/server.rs b/common/net/src/msg/server.rs index 176869cf94..b16a10dbfa 100644 --- a/common/net/src/msg/server.rs +++ b/common/net/src/msg/server.rs @@ -10,7 +10,6 @@ use common::{ terrain::{Block, TerrainChunk}, trade::{PendingTrade, SitePrices, TradeId, TradeResult}, uid::Uid, - uuid::Uuid, }; use hashbrown::HashMap; use serde::{Deserialize, Serialize}; @@ -192,7 +191,6 @@ pub enum DisconnectReason { #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub enum RegisterError { - AlreadyLoggedIn(Uuid, String), AuthError(String), Banned(String), Kicked(String), diff --git a/server/src/events/player.rs b/server/src/events/player.rs index f167fdb547..5ff85b3d91 100644 --- a/server/src/events/player.rs +++ b/server/src/events/player.rs @@ -1,11 +1,8 @@ use super::Event; -use crate::{ - client::Client, login_provider::LoginProvider, persistence, presence::Presence, - state_ext::StateExt, Server, -}; +use crate::{client::Client, persistence, presence::Presence, state_ext::StateExt, Server}; use common::{ comp, - comp::{group, Player}, + comp::group, uid::{Uid, UidAllocator}, }; use common_base::span; @@ -143,12 +140,6 @@ pub fn handle_client_disconnect(server: &mut Server, entity: EcsEntity) -> Event ))); } - // Make sure to remove the player from the logged in list. (See LoginProvider) - if let Some(player) = state.ecs().read_storage::().get(entity) { - let mut login_provider = state.ecs().write_resource::(); - login_provider.logout(player.uuid()); - } - // Sync the player's character data to the database let entity = persist_entity(state, entity); diff --git a/server/src/login_provider.rs b/server/src/login_provider.rs index 34e8c3e863..3cc37b0229 100644 --- a/server/src/login_provider.rs +++ b/server/src/login_provider.rs @@ -46,7 +46,6 @@ impl Component for PendingLogin { pub struct LoginProvider { runtime: Arc, - accounts: HashMap, auth_server: Option>, } @@ -69,27 +68,10 @@ impl LoginProvider { Self { runtime, - accounts: HashMap::new(), auth_server, } } - fn login(&mut self, uuid: Uuid, username: String) -> Result<(), RegisterError> { - // make sure that the user is not logged in already - if self.accounts.contains_key(&uuid) { - return Err(RegisterError::AlreadyLoggedIn(uuid, username)); - } - info!(?username, "New User"); - self.accounts.insert(uuid, username); - Ok(()) - } - - pub fn logout(&mut self, uuid: Uuid) { - if self.accounts.remove(&uuid).is_none() { - error!(?uuid, "Attempted to logout user that is not logged in."); - }; - } - pub fn verify(&self, username_or_token: &str) -> PendingLogin { let (pending_s, pending_r) = oneshot::channel(); @@ -113,7 +95,7 @@ impl LoginProvider { PendingLogin { pending_r } } - pub fn try_login( + pub fn login( &mut self, pending: &mut PendingLogin, #[cfg(feature = "plugins")] world: &EcsWorld, @@ -154,11 +136,8 @@ impl LoginProvider { }; } - // add the user to self.accounts - match self.login(uuid, username.clone()) { - Ok(()) => Some(Ok((username, uuid))), - Err(e) => Some(Err(e)), - } + info!(?username, "New User"); + Some(Ok((username, uuid))) }, Err(tokio::sync::oneshot::error::TryRecvError::Closed) => { error!("channel got closed to early, this shouldn't happen"); diff --git a/server/src/sys/msg/register.rs b/server/src/sys/msg/register.rs index cbbbc990b7..a6e5a084f3 100644 --- a/server/src/sys/msg/register.rs +++ b/server/src/sys/msg/register.rs @@ -115,7 +115,7 @@ impl<'a> System<'a> for Sys { uid_allocator: &uid_allocator, }; - let (username, uuid) = match login_provider.try_login( + let (username, uuid) = match login_provider.login( &mut pending, #[cfg(feature = "plugins")] &ecs_world, @@ -131,38 +131,7 @@ impl<'a> System<'a> for Sys { trace!(?r, "pending login returned"); match r { Err(e) => { - let mut retry = false; - if let RegisterError::AlreadyLoggedIn(uuid, ref username) = e { - if let Some((old_entity, old_client, _)) = - (&entities, &clients, &players) - .join() - .find(|(_, _, old_player)| old_player.uuid() == uuid) - { - // Remove old client - server_event_bus - .emit_now(ServerEvent::ClientDisconnect(old_entity)); - let _ = old_client.send(ServerGeneral::Disconnect( - DisconnectReason::Kicked(String::from( - "You have logged in from another location.", - )), - )); - // We can't login the new client right now as the - // removal of the old client and player occurs later in - // the tick, so we instead setup the new login to be - // processed in the next tick - // Create "fake" successful pending auth and mark it to - // be inserted into pending_logins at the end of this - // run - retries.push(( - entity, - PendingLogin::new_success(username.to_string(), uuid), - )); - retry = true; - } - } - if !retry { - client.send(ServerRegisterAnswer::Err(e))?; - } + client.send(ServerRegisterAnswer::Err(e))?; return Ok(()); }, Ok((username, uuid)) => (username, uuid), @@ -170,6 +139,27 @@ impl<'a> System<'a> for Sys { }, }; + // Check if user is already logged-in + if let Some((old_entity, old_client, _)) = (&entities, &clients, &players) + .join() + .find(|(_, _, old_player)| old_player.uuid() == uuid) + { + // Remove old client + server_event_bus.emit_now(ServerEvent::ClientDisconnect(old_entity)); + let _ = old_client.send(ServerGeneral::Disconnect(DisconnectReason::Kicked( + String::from("You have logged in from another location."), + ))); + // We can't login the new client right now as the + // removal of the old client and player occurs later in + // the tick, so we instead setup the new login to be + // processed in the next tick + // Create "fake" successful pending auth and mark it to + // be inserted into pending_logins at the end of this + // run + retries.push((entity, PendingLogin::new_success(username, uuid))); + return Ok(()); + } + let player = Player::new(username, uuid); let is_admin = editable_settings.admins.contains(&uuid); diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index af82105301..f6d147177d 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -148,9 +148,6 @@ impl PlayState for MainMenuState { client::Error::ServerShutdown => { localized_strings.get("main.login.server_shut_down").into() }, - client::Error::AlreadyLoggedIn => { - localized_strings.get("main.login.already_logged_in").into() - }, client::Error::NotOnWhitelist => { localized_strings.get("main.login.not_on_whitelist").into() },