public void OnAuthKeyData(byte[] exchangeKey, string checkHash, int serial) { Network.Crypt.KeyExchange.MakeKey(Mode.Server, exchangeKey); string hash = ((BNSKeyExchange)Network.Crypt.KeyExchange).Authentication; if (checkHash == hash.Split(',')[0]) { this.checkHash = hash.Split(',')[1]; loginSerial = serial; AccountSession.Instance.AccountLogin(account.AccountID, this); } else { BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 400 ErrBadPasswd", Serial = serial, Content = "<Error code=\"11\" server=\"1012\" module=\"1\" line=\"1683\"/>\n", Encrypt = false }; p.WritePacket(); Network.SendPacket(p); Logger.Log.Info("Login result for " + account.UserName + ": BadPassword"); } }
public void SendCharList() { BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 200 OK", Serial = characterSerial }; string content = "<Reply>\n"; for (byte i = 0; i < 5; i++) { if (chars.ContainsKey(i)) { ActorPC pc = chars[i]; System.IO.MemoryStream ms = new System.IO.MemoryStream(); pc.AppearenceToSteam(ms); content += string.Format("<CharSlot>\n<SlotId>{0}</SlotId>\n<CharId>{1}</CharId>\n<WorldCode>{4}</WorldCode>\n<CharName>{2}</CharName>\n<CharData><bns><pcdbid>{1}</pcdbid><showcase>{3}</showcase></bns></CharData>\n</CharSlot>\n", ((uint)pc.SlotID).ToGUID(), pc.CharID, pc.Name, Convert.ToBase64String(ms.ToArray()), pc.WorldID); ms.Close(); ms = null; } else { content += string.Format("<CharSlot><SlotId>{0}</SlotId>\n</CharSlot>\n", ((uint)i).ToGUID()); } } p.Content = content + "</Reply>\n"; p.WritePacket(); Network.SendPacket(p); }
public void OnCharDeleteResult(SM_CHAR_DELETE_RESULT.Results Result) { if (Result == SM_CHAR_DELETE_RESULT.Results.OK && removePC != null) { BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 200 OK", Serial = removeSerial, Content = string.Format("<bns>\n<protocol>Game.bns.{1}</protocol>\n<command>DeletePc</command>\n<result>OK</result>\n<slotid>{0}</slotid>\n</bns>\n", ((uint)removePC.SlotID).ToGUID(), removePC.WorldID) }; p.WritePacket(); Network.SendPacket(p); if (chars.ContainsKey(removePC.SlotID)) { chars.Remove(removePC.SlotID); } } else { removePC = null; BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 200 OK", Serial = removeSerial, Content = string.Format("<bns>\n<protocol>Game.bns.{1}</protocol>\n<command>DeletePc</command>\n<result>Fail</result>\n<slotid>{0}</slotid>\n<reason>202</reason></bns>\n", ((uint)removePC.SlotID).ToGUID(), removePC.WorldID) }; p.WritePacket(); Network.SendPacket(p); } }
public void OnAccountList(int serial) { BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 200 OK", Serial = serial, Content = string.Format("<Reply type=\"array\">\n<GameAccount>\n<Alias>{0}</Alias>\n<Created>2012-04-20T10:04:46Z</Created>\n</GameAccount>\n</Reply>\n", account.AccountID.ToGUID().ToString().ToUpper()) }; p.WritePacket(); Network.SendPacket(p); }
public void OnAccountInfo(AccountLoginResult res, Account account) { if (res == AccountLoginResult.NO_SUCH_ACCOUNT) { Logger.Log.Info("Login Result:" + res.ToString()); } switch (res) { case AccountLoginResult.OK: { this.account = account; Network.Crypt.KeyExchange.MakePrivateKey(); ((BNSKeyExchange)Network.Crypt.KeyExchange).Username = account.UserName; ((BNSKeyExchange)Network.Crypt.KeyExchange).Password = account.Password; byte[] exchange = Network.Crypt.KeyExchange.GetKeyExchangeBytes(Mode.Server); byte[] session = ((BNSKeyExchange)Network.Crypt.KeyExchange).Session.getBytes(); System.IO.MemoryStream ms = new System.IO.MemoryStream(); System.IO.BinaryWriter bw = new System.IO.BinaryWriter(ms); bw.Write(session.Length); bw.Write(session); bw.Write(exchange.Length); bw.Write(exchange); string key = string.Format("<Reply>\n<KeyData>{0}</KeyData>\n</Reply>\n", Convert.ToBase64String(ms.ToArray())); BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 200 OK", Serial = loginSerial, Content = key }; p.WritePacket(); Network.SendPacket(p); } break; case AccountLoginResult.NO_SUCH_ACCOUNT: case AccountLoginResult.DB_ERROR: { BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 400 ErrAccountNotFound", Serial = loginSerial, Content = "<Error code=\"3002\" server=\"1008\" module=\"1\" line=\"458\"/>\n" }; p.WritePacket(); Network.SendPacket(p); } break; } }
public void OnAuthToken(int serial) { BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 200 OK", Serial = serial }; string token = account.AccountID.ToGUID().ToString().ToUpper() + ":" + ((uint)Global.Random.Next()).ToGUID().ToString().ToUpper(); Logger.Log.Info("Auth Token: " + token); p.Content = string.Format("<Reply>\n<AuthnToken>{0}</AuthnToken>\n</Reply>\n", Convert.ToBase64String(Encoding.Default.GetBytes(token))); p.WritePacket(); Network.SendPacket(p); }
public void OnAuthGameToken(int serial) { account.LoginToken = ((uint)Global.Random.Next()).ToGUID(); Logger.Log.Info("gametoken:" + account.LoginToken.ToString().ToUpper()); account.TokenExpireTime = DateTime.Now.AddMinutes(10); AccountSession.Instance.AccountSave(account, this); BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 200 OK", Serial = serial, Content = string.Format("<Reply>\n<Token>{0}</Token>\n</Reply>\n", account.LoginToken.ToString().ToUpper()) }; p.WritePacket(); Network.SendPacket(p); }
public void OnWorldList(int serial) { BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 200 OK", Serial = serial }; string worlds = string.Empty; int idx = 1; foreach (WorldInfo i in Configuration.Instance.Worlds) { worlds += string.Format("<World>\n<WorldCode>{0}</WorldCode>\n<WorldName>{1}</WorldName>\n<PublicNetAddress>{2}</PublicNetAddress>\n<Property>\n<EnableCharacterCreate>true</EnableCharacterCreate>\n<WorldScore>0</WorldScore>\n</Property>\n<UserCounts>\n<PlayingUsers>426</PlayingUsers>\n<WaitingUsers>0</WaitingUsers>\n<MaxUsers>4000</MaxUsers>\n</UserCounts>\n</World>\n", idx++, i.Name, i.Address); } p.Content = string.Format("<Reply type=\"array\">\n{0}\n</Reply>\n", worlds); p.WritePacket(); Network.SendPacket(p); }
public void SendSlotList(int serial) { BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 200 OK", Serial = serial }; string content = "<Reply type=\"array\">\n"; for (byte i = 0; i < (3 + account.ExtraSlots); i++) { content += string.Format("<Slot>\n<SlotId>{0}</SlotId>\n<AppGroupId>2</AppGroupId>\n<SlotType>char</SlotType>\n<SystemSlot>1</SystemSlot>\n<SlotData/>\n<Changed>2012-04-25T05:52:22Z</Changed>\n<Registered>2012-04-25T05:52:22Z</Registered>\n</Slot>\n", ((uint)i).ToGUID().ToString().ToUpper()); } p.Content = content + "</Reply>\n"; p.WritePacket(); Network.SendPacket(p); }
public void OnCharCreateResult(uint charID, SM_CHAR_CREATE_RESULT.Results Result) { if (Result == SM_CHAR_CREATE_RESULT.Results.OK) { createdPC.CharID = charID; Common.Quests.Quest q = new Common.Quests.Quest() { QuestID = 250, Step = 1, NextStep = 1 }; createdPC.Quests[q.QuestID] = q; CharacterSession.Instance.CharacterSave(createdPC); BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 200 OK", Serial = characterSerial, Content = string.Format("<bns>\n<protocol>Game.bns.{1}</protocol>\n<command>CreatePc</command>\n<result>OK</result>\n<slotid>{0}</slotid>\n</bns>\n", ((uint)createdPC.SlotID).ToGUID(), createdPC.WorldID) }; p.WritePacket(); Network.SendPacket(p); if (!chars.ContainsKey(createdPC.SlotID)) { chars[createdPC.SlotID] = createdPC; } } else { BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 200 OK", Serial = characterSerial, Content = string.Format("<bns>\n<protocol>Game.bns.{1}</protocol>\n<command>CreatePc</command>\n<result>Fail</result>\n<slotid>{0}</slotid>\n<reason>202</reason>\n</bns>\n", ((uint)createdPC.SlotID).ToGUID(), createdPC.WorldID) }; p.WritePacket(); Network.SendPacket(p); } }
public void OnAccountLoginResult(AccountLoginResult result) { lastLoginRes = result; if (result == AccountLoginResult.OK) { account.LastLoginTime = DateTime.Now; account.LastLoginIP = Network.Socket.RemoteEndPoint.ToString().Split(':')[0]; System.IO.MemoryStream ms = new System.IO.MemoryStream(); System.IO.BinaryWriter bw = new System.IO.BinaryWriter(ms); bw.Write(32); bw.Write(Convert.FromBase64String(checkHash)); string res = Convert.ToBase64String(ms.ToArray()); string key = string.Format("<Reply>\n<KeyData>{0}</KeyData>\n</Reply>\n", res); BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 200 OK", Serial = loginSerial, Content = key, Encrypt = false }; p.WritePacket(); Network.SendPacket(p); Logger.Log.Info(account.UserName + " login successful!"); } else { BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 400 ErrBadPasswd",//should be already log in Serial = loginSerial, Content = "<Error code=\"11\" server=\"1012\" module=\"1\" line=\"1683\"/>\n", Encrypt = false }; p.WritePacket(); Network.SendPacket(p); Logger.Log.Info("Login result for " + account.UserName + ": ALREADY_LOG_IN"); AccountSession.Instance.AccountLogout(account.AccountID, this); } }
public void OnAuthLoginFinish(int serial) { Guid accountGuid = account.AccountID.ToGUID(); BNSLoginPacket p = new BNSLoginPacket() { Command = "STS/1.0 200 OK", Serial = serial, Content = string.Format("<Reply>\n<UserId>{0}</UserId>\n<UserCenter>1</UserCenter>\n<Roles type=\"array\">\n<RoleId>6</RoleId>\n</Roles>\n</Reply>\n", accountGuid.ToString().ToUpper()) }; Logger.Log.Info("account:" + accountGuid.ToString()); p.WritePacket(); Network.SendPacket(p); p = new BNSLoginPacket() { Command = "POST /Presence/UserInfo STS/1.0", Serial = 0, Content = string.Format("<Message>\n<UserId>{0}</UserId>\n<UserCenter>1</UserCenter>\n<UserName>:{1}</UserName>\n<Status>online</Status>\n<Alias>{1}</Alias>\n<Alias>bns:{1}</Alias>\n</Message>\n", accountGuid.ToString().ToUpper(), account.UserName) }; p.WritePacket(); Network.SendPacket(p); }