/// <summary> /// Gets called before the login request packet is sent. Use this opportunity to modify the packet or add additional parameters to the packet. /// </summary> /// <param name="req"></param> protected virtual void OnBeforeLoginRequest(PacketLoginRequest req) { if (BeforeLoginRequest != null) { BeforeLoginRequest(req); } }
/// <summary> /// Gets called when the login attempt from the cluster server has resolved. Return false from this method to prevent login. /// Be sure to call base.OnClusterServerLoginResolved to register necessary packet handler /// </summary> protected override bool OnClusterServerLoginResolved(PacketLoginRequest login, bool result) { if (base.OnClusterServerLoginResolved(login, result)) { } return(result); }
/// <summary> /// Gets called when the player login/transfer request has been resolved - i.e. the player connected and gave us login credentials. Return false to prevent login. Don't forget to call base.OnPlayerLoginResolved /// if you override this method so that all necessary packet handlers can be registered. /// </summary> protected virtual bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg) { if (result) { } return(result); }
private void OnLineSecured(INetworkConnection con, Packet p) { PacketLineSecured msg = p as PacketLineSecured; Log.LogMsg("Got Rijndael reply. Verifying key..."); // Server got our encrypted Rijndael key. Make sure it's all good still. if (m_ConnectionKey.Equals(CryptoManager.RijDecrypt(msg.Key, m_ConnectionKey)) && msg.ReplyCode == ReplyType.OK) { KillConnection("Failed to secure the connection. Closing socket. " + msg.ReplyMessage); return; } Log.LogMsg("Line secured. Sending login request."); // FireLineSecuredEvent FireSocketSecured(this, EventArgs.Empty); // Send the login request, encrypting our user name and password PacketLoginRequest plr = (PacketLoginRequest)CreatePacket((int)PacketType.LoginRequest, 0, true, true); plr.AccountName = m_AccountName; plr.Password = m_Password; plr.IsNewAccount = IsNewAccount; plr.LoginConnectionType = m_ConnectionType; OnBeforeLoginRequest(plr); Send(plr); }
private void FireOnBeforeLoginRequest(INetworkConnection con, PacketLoginRequest login) { if (BeforeLoginRequestInvoker != null) { BeforeLoginRequestInvoker(con, login); } }
/// <summary> /// Gets called when the player login/transfer request has been resolved - i.e. the player connected and gave us login credentials. Return false to prevent login. Don't forget to call base.OnPlayerLoginResolved /// if you override this method so that all necessary packet handlers can be registered. /// </summary> protected virtual bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg) { if (result) { } return result; }
/// <summary> /// Gets called when a player sends a login request ticket. /// </summary> private void OnPlayerLoginRequest(INetworkConnection con, Packet msg) { try { string loginMsg = ""; PacketLoginRequest packetLoginRequest = msg as PacketLoginRequest; msg.NeedsReply = false; // handle sending ourselves because we dont want OnConnectionReady to fire before the player gets the login result. ServerUser su = null; su = ConnectionManager.GetAuthorizedUser(packetLoginRequest.AccountName, MyServer, packetLoginRequest.LoginConnectionType);; PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true); if (su == null || su.AuthTicket.ToString() != packetLoginRequest.Password) { OnPlayerLoginResolved(packetLoginRequest, false, ref loginMsg); lrf.IsCritical = true; lrf.ReplyCode = ReplyType.Failure; lrf.ReplyMessage = "Account credentials refused by server! " + loginMsg; msg.ReplyPacket = lrf; return; } lrf.ReplyCode = ReplyType.OK; lrf.ReplyMessage = su.AccountName + ", ready to play!"; lrf.Parms.SetProperty("ServerName", 1, MyServer.ServerName); msg.ReplyPacket = lrf; ServerUser.CurrentCharacter = su.CurrentCharacter; su.MyConnection = this; ServerUser.MyConnection = null; this.ServerUser = su; if (!OnPlayerLoginResolved(packetLoginRequest, true, ref loginMsg)) { lrf.ReplyCode = ReplyType.Failure; lrf.IsCritical = true; lrf.ReplyMessage = "Login Failed! " + loginMsg; return; } Log1.Logger("Server.Inbound.Login").Info(packetLoginRequest.AccountName + ": " + lrf.ReplyMessage); lrf.Parms.SetProperty(-1, ServerUser.Profile.UserRoles); lrf.Parms.SetProperty(-2, ServerUser.Profile.MaxCharacters); msg.NeedsReply = false; // don't want to fire OnConnectionReady before the client gets the login reply Send(lrf); // " " OnConnectionReady(); } catch (Exception e) { Log1.Logger("Server.Inbound.Login").Error("InboundPlayerConnection::OnPlayerLoginRequest failed. ", e); PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true); lrf.ReplyCode = ReplyType.Failure; lrf.IsCritical = true; lrf.ReplyMessage = "Login Failed! " + e.Message; msg.ReplyPacket = lrf; } }
/// <summary> /// Gets called when the central server login request gets resolved. Return false from this method to prevent the login. /// Be sure to call base.OnCentralServerLoginResolved to ensure that all necessary packet handlers get registered. /// </summary> protected override bool OnClusterServerLoginResolved(PacketLoginRequest login, bool result) { if (base.OnClusterServerLoginResolved(login, result)) { } return result; }
/// <summary> /// Gets called when the login attempt from the cluster server has resolved. Return false from this method to prevent login. /// Be sure to call base.OnClusterServerLoginResolved to register necessary packet handler /// </summary> protected virtual bool OnClusterServerLoginResolved(PacketLoginRequest login, bool authenticationResult) { if (authenticationResult) { RegisterPacketHandler((int)ServerPacketType.RequestPlayerHandoff, OnPlayerHandoffRequest); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.CharacterTransferComplete, OnCharacterHandoffComplete); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.CharacterDisconnected, OnRemoteCharacterDisconnected); } return(authenticationResult); }
private void DoLocalLogin(INetworkConnection con, Packet pMsg) { bool authd = IsLocalConnection(); try { PacketLoginRequest p = pMsg as PacketLoginRequest; ServerUser.AccountName = p.AccountName; Log1.Logger("Zeus").Info("Local user " + Environment.UserName + " is attempting login..."); bool hasAccountAccess = authd; if (!hasAccountAccess) { PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true); lrf.IsCritical = true; // this along with reply code failure forces D/C lrf.ReplyCode = ReplyType.Failure; lrf.ReplyMessage = string.Format(p.AccountName + " failed to authenticate local IP address."); pMsg.ReplyPacket = lrf; Log1.Logger("Zeus").Info(lrf.ReplyMessage); return; } PacketLoginResult result = CreateLoginResultPacket(); if (result.ReplyCode == ReplyType.OK) { ServerUser.AuthTicket = Guid.NewGuid(); ServerUser.IsAuthenticated = true; MembershipUser mu = Membership.GetUser(p.AccountName, true); if (mu != null) { ServerUser.ID = (Guid)mu.ProviderUserKey; } else if (authd) { ServerUser.ID = Guid.NewGuid(); } ConnectionManager.AuthorizeUser(ServerUser, false); ServerUser.Profile.UserRoles = new string[] { "Administrator" }; result.Parms.SetProperty(-1, ServerUser.Profile.UserRoles); result.Parms.SetProperty(-2, ServerUser.Profile.MaxCharacters); LoggedInAndReady(); } pMsg.ReplyPacket = result; Log1.Logger("Zeus").Info("Zeus client *" + Environment.UserName + "* authentication: " + result.ReplyCode.ToString() + ". " + result.ReplyMessage); } catch (Exception e) { Log1.Logger("Zeus").Error("Exception thrown whilst player attempted login. " + e.Message, e); KillConnection("Error logging in."); } }
/// <summary> /// Gets called when the login request has been resolved. Return false to prevent login. Don't forget to call base.OnPlayerLoginResolved /// if you override this method. /// </summary> /// <param name="login"></param> /// <param name="result"></param> protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg) { if (base.OnPlayerLoginResolved(login, result, ref msg)) { RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestSelectCharacter, OnCharacterSelectRequest); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestDeleteCharacter, OnCharacterDeleteRequest); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestCreateCharacter, OnCharacterCreateRequest); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestCharacterListing, OnCharacterListingRequest); } return(result); }
/// <summary> /// Gets called when the player login/transfer request has been resolved - i.e. the player connected and gave us login credentials. Return false to prevent login. Don't forget to call base.OnPlayerLoginResolved /// if you override this method so that all necessary packet handlers can be registered. /// </summary> protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg) { if (base.OnPlayerLoginResolved(login, result, ref msg)) { if (ServerUser.CurrentCharacter != null) { CharacterCache.CacheCharacter(ServerUser.CurrentCharacter, MyServer.ServerUserID, TimeSpan.FromMinutes(60)); } } return result; }
/// <summary> /// Gets called when the player login/transfer request has been resolved - i.e. the player connected and gave us login credentials. Return false to prevent login. Don't forget to call base.OnPlayerLoginResolved /// if you override this method so that all necessary packet handlers can be registered. /// </summary> protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg) { if (base.OnPlayerLoginResolved(login, result, ref msg)) { if (ServerUser.CurrentCharacter != null) { CharacterCache.CacheCharacter(ServerUser.CurrentCharacter, MyServer.ServerUserID, TimeSpan.FromMinutes(60)); } } return(result); }
protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg) { // register packet handlers if we're logged in, i.e. authenticated - so that we will start listening for those packets. if (result && base.OnPlayerLoginResolved(login, result, ref msg)) { RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.CreateGame, OnCreateNewGame); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.JoinGame, OnPlayerJoinGame); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.RequestGameListing, OnGameListingRequest); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.RequestQuickMatch, OnQuickMatchRequest); } return(result); }
/// <summary> /// Gets called when a parent server is requesting to be connected with this server. /// There is no account in the accounts DB for the parent servers... there is only a shared secret which is shared among all servers in the clusters. /// The shared secret is defined in the App.Config. /// </summary> private void OnClusterServerLoginRequest(INetworkConnection con, Packet msg) { PacketLoginRequest p = msg as PacketLoginRequest; m_ServerUser.AccountName = p.AccountName; // send login result PacketLoginResult lr = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true); //lr.ReplyMessage = ServerBase.ServerName; lr.Parms.SetProperty(1, MyServer.ServerName); lr.ReplyCode = (p.Password.ToUpper() == SharedSecretWithClusterServers.ToString().ToUpper()) ? ReplyType.OK : ReplyType.Failure; if (lr.ReplyCode == ReplyType.Failure) { lr.ReplyMessage = "Bad credentials."; } if (!OnClusterServerLoginResolved(p, lr.ReplyCode == ReplyType.OK)) { lr.ReplyCode = ReplyType.Failure; } if (lr.ReplyCode == ReplyType.OK) { lr.Parms.SetProperty((int)PropertyID.Name, MyServer.ServerUserID); m_ServerUser.AccountName = p.AccountName; m_ServerUser.IsAuthorizedClusterServer = true; m_ServerUser.RenewAuthorizationTicket(); // make sure we dont time out } msg.ReplyPacket = lr; if (lr.ReplyCode != ReplyType.OK) { lr.IsCritical = true; Log1.Logger("Server.Inbound.Login").Info("Failed authentication for " + p.AccountName + ", using password *" + p.Password + "* . Killing connection."); return; } RegisterPacketHandler((int)PacketType.Null, OnPing); ConnectionManager.AddParentConnection(this, m_ServerUser); OnParentConnectionSet(); OnConnectionReady(); }
private void DoNoAuthLogin(INetworkConnection con, Packet pMsg) { try { PacketLoginRequest p = pMsg as PacketLoginRequest; ServerUser.AccountName = Guid.NewGuid().ToString(); // assign random session name ServerUser.OwningServer = MyServer.ServerUserID; Log1.Logger("LoginServer.Inbound.Login").Info("No-auth assigned user name " + ServerUser.AccountName + " from " + RemoteIP + " is attempting login..."); Log1.Logger("LoginServer.UserIPMap").Info("User [" + p.AccountName + "] from [" + RemoteIP + "] is attempting login."); string msg = ""; if (!HaveServersForService()) { PacketLoginResult ns = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true); ns.ReplyMessage = "No servers available for service.\r\n\r\nTry again later."; ns.IsCritical = true; ns.ReplyCode = ReplyType.Failure; pMsg.ReplyPacket = ns; return; } PacketLoginResult result = CreateLoginResultPacket(); if (result.ReplyCode == ReplyType.OK) { ServerUser.AuthTicket = Guid.NewGuid(); ServerUser.IsAuthenticated = true; ServerUser.ID = Guid.NewGuid(); // generate random ID for this session RegisterPacketHandler((int)PacketType.RequestHandoffToServer, OnClusterHandoffRequest); ServerUser.Profile.UserRoles = new string[0]; result.Parms.SetProperty("AccountName", ServerUser.AccountName); result.Parms.SetProperty(-1, ServerUser.Profile.UserRoles); result.Parms.SetProperty(-2, ServerUser.Profile.MaxCharacters); ConnectionManager.AuthorizeUser(ServerUser); } pMsg.ReplyPacket = result; Log1.Logger("LoginServer.Inbound.Login").Info("Game client *" + ServerUser.AccountName + "* authentication: " + result.ReplyCode.ToString() + ". " + result.ReplyMessage); } catch (Exception e) { Log1.Logger("LoginServer.Inbound.Login").Error("Exception thrown whilst player attempted login. " + e.Message, e); KillConnection("Error logging in."); } }
protected virtual void OnBeforeLoginServerLoginRequest(PacketLoginRequest req) { }
protected override void OnBeforeLoginRequest(PacketLoginRequest req) { // Add our game creation/join parms to the login packet. base.OnBeforeLoginRequest(req); FireOnBeforeLoginRequest(this, req); }
void OnGameServer_OnBeforeLoginRequest(INetworkConnection con, PacketLoginRequest login) { Log.LogMsg("Appending target game options [" + TargetGameOptions.PropertyCount.ToString() + " properties] to login request. Login parms count before append is [" + login.Parms.PropertyCount.ToString() + "]."); login.Parms.UpdateWithValues(TargetGameOptions); Log.LogMsg("Login parms count after append is [" + login.Parms.PropertyCount.ToString() + "]."); }
/// <summary> /// Begin an asynchronous connection attempt /// </summary> /// <param name="serverAddress">the address of the target server.</param> /// <param name="port">the port of the target server</param> /// <param name="username">the username with which to authenticate, if any</param> /// <param name="password">the password with which to authenticate, if any</param> /// <param name="listenForUDP">If this connection object should listen for UDP traffic (all connections can already send UDP data). On a server, this property should be false as servers make use of a global UDP listener. On a client, this property should be true. This parameter is ignored on Silverlight.</param> public void BeginConnect(string serverAddress, int port, string username, string password, PacketLoginRequest.ConnectionType connectionType) { if (IsAlive || ConnectionInProgress || ConnectionWasInitiated) { return; } if (username == null) { username = ""; } if (password == null) { password = ""; } m_ConnectionType = connectionType; Log.LogMsg("Connecting to " + serverAddress + ":" + port.ToString() + " as " + username); m_ConnectionWasInitiated = true; m_ConnectionInProgress = true; AccountName = username; Password = password; m_ServerAddress = serverAddress; m_Port = port; try { MyTCPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); SocketAsyncEventArgs arg = CreateNewSaeaForConnect(); DnsEndPoint dne = new DnsEndPoint(serverAddress, m_Port); arg.RemoteEndPoint = dne; arg.UserToken = MyTCPSocket; bool willRaiseEvent = MyTCPSocket.ConnectAsync(arg); if (!willRaiseEvent) { OnConnectEvent_Completed(this, arg); } } catch (Exception e) { FireConnectedEvent(false, "Unable to resolve server IPAddress. " + e.Message); return; } }
/// <summary> /// Begin an asynchronous connection attempt /// </summary> /// <param name="serverAddress">the address of the target server.</param> /// <param name="port">the port of the target server</param> /// <param name="username">the username with which to authenticate, if any</param> /// <param name="password">the password with which to authenticate, if any</param> public void BeginConnect(string serverAddress, int port, string username, string password, PacketLoginRequest.ConnectionType connectionType) { if (IsAlive || ConnectionInProgress || ConnectionWasInitiated) { return; } if (username == null) { username = ""; } if (password == null) { password = ""; } m_ConnectionType = connectionType; Log.LogMsg("Connecting to " + serverAddress + ":" + port.ToString() + " as " + username); m_ConnectionWasInitiated = true; m_ConnectionInProgress = true; AccountName = username; Password = password; m_ServerAddress = serverAddress; m_Port = port; Log.LogMsg("Resolving host [" + serverAddress + "]"); Dns.BeginGetHostAddresses(serverAddress, new AsyncCallback(OnHostResolve), null); }
private void DoDatabaseLogin(INetworkConnection con, Packet pMsg) { try { PacketLoginRequest p = pMsg as PacketLoginRequest; ServerUser.AccountName = p.AccountName; ServerUser.OwningServer = MyServer.ServerUserID; Log1.Logger("LoginServer.Inbound.Login").Info("User " + p.AccountName + " from " + RemoteIP + " is attempting login..."); Log1.Logger("LoginServer.UserIPMap").Info("User [" + p.AccountName + "] from [" + RemoteIP + "] is attempting login."); if (!HaveServersForService()) { PacketLoginResult ns = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true); ns.ReplyMessage = "No servers available for service.\r\n\r\nTry again later."; ns.IsCritical = true; ns.ReplyCode = ReplyType.Failure; pMsg.ReplyPacket = ns; return; } string msg = ""; if (p.IsNewAccount && (!LoginServer.AllowNewAccountsOnTheFly || !CanCreateNewAccount(pMsg, ref msg) || !CreateNewAccount(p.AccountName, p.Password, p.AccountName, ref msg))) { if (!LoginServer.AllowNewAccountsOnTheFly) { Log1.Logger("LoginServer.Inboud.Login").Warn("Login packet specified new account request flag but server config disallows this. Check 'AllowNewAccountsOnTheFly' in the config file. Default setting is FALSE."); } PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true); lrf.IsCritical = true; // this along with reply code failure forces D/C lrf.ReplyCode = ReplyType.Failure; lrf.ReplyMessage = msg; pMsg.ReplyPacket = lrf; Log1.Logger("LoginServer.Inbound.Login").Info(p.AccountName + " failed to create new account. " + lrf.ReplyMessage); return; } bool hasAccountAccess = Membership.ValidateUser(p.AccountName, p.Password); if (!hasAccountAccess) { PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true); lrf.IsCritical = true; // this along with reply code failure forces D/C lrf.ReplyCode = ReplyType.Failure; lrf.ReplyMessage = string.Format(p.AccountName + " authentication Failed. No account matching these credentials was found. Goodbye."); pMsg.ReplyPacket = lrf; Log1.Logger("LoginServer.Inbound.Login").Info(lrf.ReplyMessage); return; } ServerUser.Profile.Load(MyServer.RequireAuthentication); foreach (AccountProfile.Session s in ServerUser.Profile.AllSessions) { System.Diagnostics.Debug.WriteLine(ServerUser.AccountName + ": " + s.LoginUTC.ToLongTimeString() + " to " + s.LogoutUTC.ToLongTimeString() + " (duration " + s.Duration.TotalMinutes + " mins). From " + s.IP); } ServerUser.Profile.Save(MyServer.RequireAuthentication); // check if suspension needs to be lifted DateTime suspensionRelease = ServerUser.Profile.AddedProperties.GetDateTimeProperty("SuspensionRelease").GetValueOrDefault(DateTime.MinValue); bool isSuspended = false; if (suspensionRelease != DateTime.MinValue) { isSuspended = true; // currently suspended. need to lift suspension? if (suspensionRelease >= DateTime.UtcNow) { DB.Instance.User_Unsuspend(ServerUser.ID, "System", suspensionRelease, "Suspension expired. Time served.", -1); isSuspended = false; } } if (isSuspended) { PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true); lrf.IsCritical = true; // this along with reply code failure forces D/C lrf.ReplyCode = ReplyType.Failure; lrf.ReplyMessage = "[" + p.AccountName + "] is currently suspended until " + suspensionRelease.ToString("g") + " UTC. Please log in to this account through our website for details. Goodbye."; pMsg.ReplyPacket = lrf; Log1.Logger("LoginServer.Inbound.Login").Info(lrf.ReplyMessage); return; } bool accountIsActive = ServerUser.Profile.IsUserInRole("ActiveUser"); if (!accountIsActive) { PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true); lrf.IsCritical = true; // this along with reply code failure forces D/C lrf.ReplyCode = ReplyType.Failure; lrf.ReplyMessage = p.AccountName + " this account is currently not active. Please log in to this account through our website for details. Goodbye."; pMsg.ReplyPacket = lrf; Log1.Logger("LoginServer.Inbound.Login").Info(lrf.ReplyMessage); return; } PacketLoginResult result = CreateLoginResultPacket(); if (result.ReplyCode == ReplyType.OK) { ServerUser.AuthTicket = Guid.NewGuid(); ServerUser.IsAuthenticated = true; ServerUser.ID = (Guid)Membership.GetUser(p.AccountName).ProviderUserKey; RegisterPacketHandler((int)PacketType.RequestHandoffToServer, OnClusterHandoffRequest); // load the user profile and add it to the packet. result.Parms.SetProperty(-1, ServerUser.Profile.UserRoles); result.Parms.SetProperty(-2, ServerUser.Profile.MaxCharacters); ConnectionManager.AuthorizeUser(ServerUser); } pMsg.ReplyPacket = result; Log1.Logger("LoginServer.Inbound.Login").Info("Game client *" + ServerUser.AccountName + "* authentication: " + result.ReplyCode.ToString() + ". " + result.ReplyMessage); } catch (Exception e) { Log1.Logger("LoginServer.Inbound.Login").Error("Exception thrown whilst player attempted login. " + e.Message, e); KillConnection("Error logging in."); } }
protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg) { ///............. if (!base.OnPlayerLoginResolved(login, result, ref msg)) { return result; } if(ServerUser.CurrentCharacter == null) { msg = "Can't join or create games without an active character."; return false; } Guid gameId = Guid.Empty; GameServerGame sg = null; PacketMatchNotification note = (PacketMatchNotification)CreatePacket((int)LobbyPacketType.MatchNotification, 0, false, false); // Requesting to join as observer? bool observeOnly = login.Parms.GetBoolProperty("Observe").GetValueOrDefault(false); if (login.Parms.GetBoolProperty("IsNewGame").GetValueOrDefault(false)) { Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] logging in with NEW GAME request."); note.Kind = MatchNotificationType.MatchCreated; note.NeedsReply = false; note.ReplyCode = ReplyType.Failure; // new game. create it. Game g = new Game(); g.Name = login.Parms.GetStringProperty((int)PropertyID.Name); g.MaxPlayers = login.Parms.GetIntProperty((int)PropertyID.MaxPlayers).GetValueOrDefault(1); g.MaxObservers = login.Parms.GetIntProperty((int)PropertyID.MaxObservers).GetValueOrDefault(0); g.Owner = ServerUser.CurrentCharacter.ID; // Create the actual game object, specific to the game type we are serving. sg = OnCreateNewGameServerGame(g); //sg = null; if (sg != null) { // Track the new game object on this server if (!GameManager.Instance.CreateNewGame(sg, true)) { msg = "Failed to create game on server. Internal server error."; note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return true; } // Report the new game in the database if (!DB.Instance.Lobby_TrackGameForServer(MyServer.ServerUserID, sg, DateTime.UtcNow, ServerUser)) { msg = "Failed to register the game in the database. Internal server error."; note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return true; } // Update player counts for this server, based on the expected player count for the new game. if (DB.Instance.Server_Register(MyServer.ServerUserID, MyServer.ServerAddress, MyServer.ListenOnPort, DateTime.UtcNow, "content", ConnectionManager.PaddedConnectionCount, MyServer.MaxConnections)) { note.ReplyCode = ReplyType.OK; } else { DB.Instance.Lobby_UntrackGameForServer(sg.GameID); note.ReplyMessage = "Failed to register game with master game listing. Internal server error."; Send(note); TransferToLobbyOrDisconnect(); return true; } } else { msg = "Unable to create game at this time."; Log1.Logger("Server").Debug("Failed to create NEW GAME for player [" + ServerUser.AccountName + "]."); login.ReplyPacket.Parms.SetProperty("CreateReply", msg); note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return true; } } else // it's a join - get game reference from existing games table { Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] logging in with request to JOIN EXISTING game. [Observe = " + observeOnly.ToString() + "]"); note = (PacketMatchNotification)CreatePacket((int)LobbyPacketType.MatchNotification, 0, false, false); if (observeOnly) { note.Kind = MatchNotificationType.ObserverAdded; } else { note.Kind = MatchNotificationType.PlayerAdded; } note.TargetPlayer = ServerUser.CurrentCharacter.CharacterInfo; note.ReplyCode = ReplyType.Failure; Guid targetGame = login.Parms.GetGuidProperty((int)PropertyID.GameId); if (targetGame == Guid.Empty) { msg = "Failed to join game. No target game specified."; Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] failed to JOIN EXISTING game. No target game specified in join request."); note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return true; } if (!GameManager.Instance.GetGame(targetGame, out sg)) { Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] failed to JOIN EXISTING game. Target game specified does not currently exist."); msg = "Failed to join game. Target game [" + targetGame.ToString() + "] does not currently exist on [" + MyServer.ServerUserID + "]."; note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return true; } } if (sg == null) { Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] failed to locate game. Internal Server Error."); msg = "Unable to locate game. Internal Server Error."; // should never happen note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return true; } // join game as player or observer if (!observeOnly && sg.AddPlayer(ServerUser.CurrentCharacter, ref msg)) { login.ReplyPacket.Parms.SetProperty("TargetGame", (ISerializableWispObject)sg.Game); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.RequestStartGame, OnRequestStartGame); } else if (observeOnly && sg.AddObserver(ServerUser.CurrentCharacter, ref msg)) { login.ReplyPacket.Parms.SetProperty("TargetGame", (ISerializableWispObject)sg.Game); } else { msg = "Unable to join game."; note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return true; } RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.LeaveGame, OnPlayerLeaveGame); return result; }
void OnLoginServer_BeforeLoginRequest(PacketLoginRequest req) { OnBeforeLoginServerLoginRequest(req); }
/// <summary> /// Gets called when the login request has been resolved. Return false to prevent login. Don't forget to call base.OnPlayerLoginResolved /// if you override this method. /// </summary> /// <param name="login"></param> /// <param name="result"></param> protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg) { if (base.OnPlayerLoginResolved(login, result, ref msg)) { RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestSelectCharacter, OnCharacterSelectRequest); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestDeleteCharacter, OnCharacterDeleteRequest); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestCreateCharacter, OnCharacterCreateRequest); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestCharacterListing, OnCharacterListingRequest); } return result; }
/// <summary> /// Connect to a sub-server in the target cluster. Connection info (address, port, auth ticket) comes from the central server. /// </summary> /// <returns>true, if the attempt kicked off successfully</returns> protected bool ConnectToGameServer(string serverName, string serverIP, int serverPort, Guid targetResource, Guid authTicket, PropertyBag parms, bool isBlocking, PacketLoginRequest.ConnectionType connectionType) { SetupGameServerConnection(isBlocking); m_GameServer.AuthTicket = User.AuthTicket = authTicket; #if SILVERLIGHT m_GameServer.BeginConnect(serverIP, serverPort, User.AccountName, authTicket.ToString(), connectionType); #else m_GameServer.BeginConnect(serverIP, serverPort, User.AccountName, authTicket.ToString(), connectionType); #endif Client.ConnectionPhase = ClientConnectionPhase.WorldServerInitiatedConnection; return true; }
/// <summary> /// User requests login to the system. This method attempts to authenticate the player (or create a new account, depending on method parms) /// </summary> public void DoDatabaseLogin(INetworkConnection con, Packet pMsg) { PacketLoginRequest p = pMsg as PacketLoginRequest; ServerUser.AccountName = p.AccountName; Log1.Logger("Zeus").Info("User " + p.AccountName + " from " + RemoteIP + " is attempting login..."); string msg = ""; #if DEBUG DateTime start = DateTime.Now; #endif bool isLocal = IsLocalConnection(); bool hasAccountAccess = isLocal || Membership.ValidateUser(p.AccountName, p.Password); #if DEBUG DateTime end = DateTime.Now; TimeSpan len = end - start; Log1.Logger("Zeus").Debug("DB call to validate user took " + len.TotalSeconds.ToString() + " seconds."); #endif if (!hasAccountAccess) { PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true); lrf.IsCritical = true; // this along with reply code failure forces D/C lrf.ReplyCode = ReplyType.Failure; lrf.ReplyMessage = string.Format("Authentication Failed. No account matching these credentials was found. Goodbye."); pMsg.ReplyPacket = lrf; Log1.Logger("Zeus").Info(p.AccountName + ": " + lrf.ReplyMessage); return; } MembershipUser usr = Membership.GetUser(p.AccountName, true); if (usr == null && isLocal) { usr = new MembershipUser("CustomizedMembershipProvider", Environment.MachineName + "\\" + Environment.UserName, Guid.NewGuid(), "", "", "", true, false, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.MinValue); } ServerUser.ID = (Guid)usr.ProviderUserKey; // Cache this user's profile data ServerUser.Profile.Load(MyServer.RequireAuthentication); if (isLocal) { ServerUser.Profile.UserRoles = new string[] { "Administrator" }; } // check if suspension needs to be lifted DateTime suspensionRelease = ServerUser.Profile.AddedProperties.GetDateTimeProperty("SuspensionRelease").GetValueOrDefault(DateTime.MinValue); bool isSuspended = false; if (suspensionRelease != DateTime.MinValue) { isSuspended = true; // currently suspended. need to lift suspension? if (suspensionRelease < DateTime.UtcNow) { DB.Instance.User_Unsuspend(ServerUser.ID, "System", suspensionRelease, "Suspension expired. Time served.", -1); isSuspended = false; } } if (isSuspended && !ServerUser.Profile.IsUserInRole("Administrator")) { PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true); lrf.IsCritical = true; // this along with reply code failure forces D/C lrf.ReplyCode = ReplyType.Failure; lrf.ReplyMessage = "[" + p.AccountName + "] is currently suspended until " + suspensionRelease.ToString("g") + " UTC. Access to Zeus is denied."; pMsg.ReplyPacket = lrf; Log1.Logger("LoginServer.Inbound.Login").Info(lrf.ReplyMessage); return; } bool accountIsActive = isLocal || ServerUser.Profile.IsUserInRole("ActiveCustomerService"); if (!accountIsActive) { PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true); lrf.IsCritical = true; // this along with reply code failure forces D/C lrf.ReplyCode = ReplyType.Failure; lrf.ReplyMessage = "Authentication Failed. This account does not have the proper credential to connect. Goodbye."; pMsg.ReplyPacket = lrf; Log1.Logger("Zeus.Inbound.Client.Login").Info(p.AccountName + ": " + lrf.ReplyMessage); return; } PacketLoginResult result = CreateLoginResultPacket(); if (result.ReplyCode == ReplyType.OK) { ServerUser.AuthTicket = Guid.NewGuid(); ServerUser.IsAuthenticated = true; ServerUser.ID = (Guid)usr.ProviderUserKey; ConnectionManager.AuthorizeUser(ServerUser, false); result.Parms.SetProperty(-1, ServerUser.Profile.UserRoles); result.Parms.SetProperty(-2, ServerUser.Profile.MaxCharacters); result.Parms.SetProperty((int)PropertyID.Name, MyServer.ServerUserID); LoggedInAndReady(); } pMsg.ReplyPacket = result; Log1.Logger("Zeus").Info("Zeus client *" + ServerUser.AccountName + "* authentication: " + result.ReplyCode.ToString() + ". " + result.ReplyMessage); }
protected void FireBeforeLoginRequest(PacketLoginRequest req) { if (BeforeLoginRequestInvoker != null) { BeforeLoginRequestInvoker(req); } }
/// <summary> /// Returns the authorized user object, or null if the user isn't currently authorized /// </summary> /// <param name="account"></param> /// <returns></returns> public static ServerUser GetAuthorizedUser(string account, ServerBase server, PacketLoginRequest.ConnectionType conType) { ServerUser u = null; if (conType == PacketLoginRequest.ConnectionType.AssistedTransfer) { lock (m_AuthorizedAccountsSyncRoot) { AuthorizedAccounts.TryGetValue(account.ToLower(), out u); } } else if (conType == PacketLoginRequest.ConnectionType.UnassistedTransfer) { Guid ticket = Guid.Empty; string authServer = ""; DateTime whenAuthd = DateTime.MinValue; int character = -1; string targetServerID = ""; Guid accountID = Guid.Empty; if (!DB.Instance.User_GetAuthorizationTicket(account, out authServer, out ticket, out whenAuthd, out character, out targetServerID, out accountID) || ticket == Guid.Empty) { return null; } if (targetServerID != server.ServerUserID) { // we weren't authorized to be on this server. Log1.Logger(server.ServerUserID).Error("[" + account + "] attempted unassisted transfer to [" + server.ServerUserID + "], but that user was only authorized to transfer to target server ID [" + targetServerID+ "]. Connection denied."); return null; } if (whenAuthd + AuthTicketLifetime < DateTime.UtcNow) { // ticket expired. Log1.Logger(server.ServerUserID).Error("[" + account + "] attempted unassisted transfer to [" + server.ServerUserID + "], but that user's auth ticket is expired. Connection denied."); return null; } // Got a ticket. Load up the user from the DB. u = new ServerUser(); u.OwningServer = server.ServerUserID; u.AuthTicket = ticket; u.ID = accountID; u.AccountName = account; // load the profile AccountProfile ap = new AccountProfile(account); u.Profile = ap; ap.Load(server.RequireAuthentication); // load the character if (character > -1) { string msg = ""; u.CurrentCharacter = CharacterUtil.Instance.LoadCharacter(u, character, ref msg); if (u.CurrentCharacter == null) { // Couldn't load character. Log1.Logger(server.ServerUserID).Error("[" + account + "] attempted unassisted transfer with characer [" + character + "], but that character could not be loaded from the DB: [" + msg + "]. Connection denied."); return null; } u.CurrentCharacter.OwningAccount = u; CharacterCache.CacheCharacter(u.CurrentCharacter, server.ServerUserID); } } AuthorizeUser(u); // gotta call this to activate/renew the auth ticket on this server. return u; }
/// <summary> /// Gets called before the login request packet is sent. Use this opportunity to modify the packet or add additional parameters to the packet. /// </summary> /// <param name="req"></param> protected virtual void OnBeforeLoginRequest(PacketLoginRequest req) { FireBeforeLoginRequest(req); }
protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg) { // register packet handlers if we're logged in, i.e. authenticated - so that we will start listening for those packets. if (result && base.OnPlayerLoginResolved(login, result, ref msg)) { RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.CreateGame, OnCreateNewGame); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.JoinGame, OnPlayerJoinGame); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.RequestGameListing, OnGameListingRequest); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.RequestQuickMatch, OnQuickMatchRequest); } return result; }
protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg) { ///............. if (!base.OnPlayerLoginResolved(login, result, ref msg)) { return(result); } if (ServerUser.CurrentCharacter == null) { msg = "Can't join or create games without an active character."; return(false); } Guid gameId = Guid.Empty; GameServerGame sg = null; PacketMatchNotification note = (PacketMatchNotification)CreatePacket((int)LobbyPacketType.MatchNotification, 0, false, false); // Requesting to join as observer? bool observeOnly = login.Parms.GetBoolProperty("Observe").GetValueOrDefault(false); if (login.Parms.GetBoolProperty("IsNewGame").GetValueOrDefault(false)) { Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] logging in with NEW GAME request."); note.Kind = MatchNotificationType.MatchCreated; note.NeedsReply = false; note.ReplyCode = ReplyType.Failure; // new game. create it. Game g = new Game(); g.Name = login.Parms.GetStringProperty((int)PropertyID.Name); g.MaxPlayers = login.Parms.GetIntProperty((int)PropertyID.MaxPlayers).GetValueOrDefault(1); g.MaxObservers = login.Parms.GetIntProperty((int)PropertyID.MaxObservers).GetValueOrDefault(0); g.Owner = ServerUser.CurrentCharacter.ID; // Create the actual game object, specific to the game type we are serving. sg = OnCreateNewGameServerGame(g); //sg = null; if (sg != null) { // Track the new game object on this server if (!GameManager.Instance.CreateNewGame(sg, true)) { msg = "Failed to create game on server. Internal server error."; note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return(true); } // Report the new game in the database if (!DB.Instance.Lobby_TrackGameForServer(MyServer.ServerUserID, sg, DateTime.UtcNow, ServerUser)) { msg = "Failed to register the game in the database. Internal server error."; note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return(true); } // Update player counts for this server, based on the expected player count for the new game. if (DB.Instance.Server_Register(MyServer.ServerUserID, MyServer.ServerAddress, MyServer.ListenOnPort, DateTime.UtcNow, "content", ConnectionManager.PaddedConnectionCount, MyServer.MaxConnections)) { note.ReplyCode = ReplyType.OK; } else { DB.Instance.Lobby_UntrackGameForServer(sg.GameID); note.ReplyMessage = "Failed to register game with master game listing. Internal server error."; Send(note); TransferToLobbyOrDisconnect(); return(true); } } else { msg = "Unable to create game at this time."; Log1.Logger("Server").Debug("Failed to create NEW GAME for player [" + ServerUser.AccountName + "]."); login.ReplyPacket.Parms.SetProperty("CreateReply", msg); note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return(true); } } else // it's a join - get game reference from existing games table { Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] logging in with request to JOIN EXISTING game. [Observe = " + observeOnly.ToString() + "]"); note = (PacketMatchNotification)CreatePacket((int)LobbyPacketType.MatchNotification, 0, false, false); if (observeOnly) { note.Kind = MatchNotificationType.ObserverAdded; } else { note.Kind = MatchNotificationType.PlayerAdded; } note.TargetPlayer = ServerUser.CurrentCharacter.CharacterInfo; note.ReplyCode = ReplyType.Failure; Guid targetGame = login.Parms.GetGuidProperty((int)PropertyID.GameId); if (targetGame == Guid.Empty) { msg = "Failed to join game. No target game specified."; Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] failed to JOIN EXISTING game. No target game specified in join request."); note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return(true); } if (!GameManager.Instance.GetGame(targetGame, out sg)) { Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] failed to JOIN EXISTING game. Target game specified does not currently exist."); msg = "Failed to join game. Target game [" + targetGame.ToString() + "] does not currently exist on [" + MyServer.ServerUserID + "]."; note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return(true); } } if (sg == null) { Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] failed to locate game. Internal Server Error."); msg = "Unable to locate game. Internal Server Error."; // should never happen note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return(true); } // join game as player or observer if (!observeOnly && sg.AddPlayer(ServerUser.CurrentCharacter, ref msg)) { login.ReplyPacket.Parms.SetProperty("TargetGame", (ISerializableWispObject)sg.Game); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.RequestStartGame, OnRequestStartGame); } else if (observeOnly && sg.AddObserver(ServerUser.CurrentCharacter, ref msg)) { login.ReplyPacket.Parms.SetProperty("TargetGame", (ISerializableWispObject)sg.Game); } else { msg = "Unable to join game."; note.ReplyMessage = msg; Send(note); TransferToLobbyOrDisconnect(); return(true); } RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.LeaveGame, OnPlayerLeaveGame); return(result); }
/// <summary> /// Gets called when the login attempt from the cluster server has resolved. Return false from this method to prevent login. /// Be sure to call base.OnClusterServerLoginResolved to register necessary packet handler /// </summary> protected virtual bool OnClusterServerLoginResolved(PacketLoginRequest login, bool authenticationResult) { if (authenticationResult) { RegisterPacketHandler((int)ServerPacketType.RequestPlayerHandoff, OnPlayerHandoffRequest); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.CharacterTransferComplete, OnCharacterHandoffComplete); RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.CharacterDisconnected, OnRemoteCharacterDisconnected); } return authenticationResult; }