Exemple #1
0
        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");
            }
        }
Exemple #2
0
        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>&lt;bns>&lt;pcdbid>{1}&lt;/pcdbid>&lt;showcase>{3}&lt;/showcase>&lt;/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);
        }
Exemple #3
0
 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);
     }
 }
Exemple #4
0
        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);
        }
Exemple #5
0
        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;
            }
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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);
        }
Exemple #9
0
        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);
        }
Exemple #10
0
        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);
            }
        }
Exemple #11
0
 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);
     }
 }
Exemple #12
0
        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);
        }