public void OnCertify(ILoginClient client, CertifyPacket certifyPacket) { if (certifyPacket.BuildVersion != _loginConfiguration.BuildVersion) { AuthenticationFailed(client, ErrorType.ILLEGAL_VER, "bad client build version"); return; } DbUser user = _database.Users.FirstOrDefault(x => x.Username.Equals(certifyPacket.Username)); AuthenticationResult authenticationResult = Authenticate(user, certifyPacket.Password); switch (authenticationResult) { case AuthenticationResult.BadUsername: AuthenticationFailed(client, ErrorType.FLYFF_ACCOUNT, "bad username"); break; case AuthenticationResult.BadPassword: AuthenticationFailed(client, ErrorType.FLYFF_PASSWORD, "bad password"); break; case AuthenticationResult.AccountSuspended: // TODO break; case AuthenticationResult.AccountTemporarySuspended: // TODO break; case AuthenticationResult.AccountDeleted: AuthenticationFailed(client, ErrorType.ILLEGAL_ACCESS, "logged in with deleted account"); break; case AuthenticationResult.Success: if (_loginServer.IsClientConnected(certifyPacket.Username)) { AuthenticationFailed(client, ErrorType.DUPLICATE_ACCOUNT, "client already connected", disconnectClient: false); return; } user.LastConnectionTime = DateTime.UtcNow; _database.Users.Update(user); _database.SaveChanges(); _loginPacketFactory.SendServerList(client, certifyPacket.Username, _coreServer.GetConnectedClusters()); client.SetClientUsername(certifyPacket.Username); _logger.LogInformation($"User '{client.Username}' logged succesfully from {client.Socket.RemoteEndPoint}."); break; default: break; } }
public static void OnLogin(LoginClient client, INetPacketStream packet) { var loginServer = DependencyContainer.Instance.Resolve <ILoginServer>(); var configuration = DependencyContainer.Instance.Resolve <LoginConfiguration>(); var certifyPacket = new CertifyPacket(packet, configuration.PasswordEncryption); string password = null; if (certifyPacket.BuildVersion != configuration.BuildVersion) { AuthenticationFailed(client, ErrorType.CERT_GENERAL, "bad client build version"); return; } if (configuration.PasswordEncryption) { byte[] encryptionKey = Aes.BuildEncryptionKeyFromString(configuration.EncryptionKey, 16); password = Aes.DecryptByteArray(certifyPacket.EncryptedPassword, encryptionKey); } else { password = packet.Read <string>(); } var authenticationService = DependencyContainer.Instance.Resolve <IAuthenticationService>(); var authenticationResult = authenticationService.Authenticate(certifyPacket.Username, password); switch (authenticationResult) { case AuthenticationResult.BadUsername: AuthenticationFailed(client, ErrorType.FLYFF_ACCOUNT, "bad username"); break; case AuthenticationResult.BadPassword: AuthenticationFailed(client, ErrorType.FLYFF_PASSWORD, "bad password"); break; case AuthenticationResult.AccountSuspended: // TODO break; case AuthenticationResult.AccountTemporarySuspended: // TODO break; case AuthenticationResult.AccountDeleted: AuthenticationFailed(client, ErrorType.ILLEGAL_ACCESS, "logged in with deleted account"); break; case AuthenticationResult.Success: if (loginServer.IsClientConnected(certifyPacket.Username)) { AuthenticationFailed(client, ErrorType.DUPLICATE_ACCOUNT, "client already connected", disconnectClient: false); return; } using (var database = DependencyContainer.Instance.Resolve <IDatabase>()) { var user = database.Users.Get(x => x.Username.Equals(certifyPacket.Username, StringComparison.OrdinalIgnoreCase)); if (user == null) { AuthenticationFailed(client, ErrorType.ILLEGAL_ACCESS, "Cannot find user in database"); Logger.LogCritical($"Cannot find user '{certifyPacket.Username}' in database to update last connection time."); return; } user.LastConnectionTime = DateTime.UtcNow; database.Users.Update(user); database.Complete(); } LoginPacketFactory.SendServerList(client, certifyPacket.Username, loginServer.GetConnectedClusters()); client.SetClientUsername(certifyPacket.Username); Logger.LogInformation($"User '{client.Username}' logged succesfully from {client.RemoteEndPoint}."); break; default: break; } }