Exemplo n.º 1
0
        public override async Task Process(IXFireClient context)
        {
            var loginChallenge = new LoginChallenge();
            await loginChallenge.Process(context);

            await context.SendMessage(loginChallenge);
        }
Exemplo n.º 2
0
        public void Process(Context context)
        {
            var loginChallenge = new LoginChallenge();

            loginChallenge.Process(context);
            context.SendMessage(loginChallenge);
        }
Exemplo n.º 3
0
        public override void Process(XFireClient context)
        {
            var loginChallenge = new LoginChallenge();

            loginChallenge.Process(context);
            context.SendMessage(loginChallenge);
        }
Exemplo n.º 4
0
        static void BeginReceiveWorldNameCallback(IAsyncResult ar)
        {
            try
            {
                if (_clientSocket == null)
                {
                    return;
                }

                var count = _clientSocket.EndReceive(ar);
                if (count <= 0)
                {
                    return;
                }

                // The first message the client sends to the game server is the world name without a length.
                // Read from the socket one byte at a time until the end of the string (\n) is read.
                while (_clientBuffer[count - 1] != Convert.ToByte('\n'))
                {
                    var read = _clientSocket.Receive(_clientBuffer, count, 1, SocketFlags.None);
                    if (read <= 0)
                    {
                        throw new Exception("Client connection broken.");
                    }

                    count += read;
                }

                // Confirm that the client is trying to connect to us by checking the world name.
                var worldName = Encoding.UTF8.GetString(_clientBuffer, 0, count - 1);
                if (!worldName.Equals(OxWorldName, StringComparison.CurrentCultureIgnoreCase))
                {
                    throw new Exception($"World name does not match `{OxWorldName}`: {worldName}");
                }

                var loginChallengeMessage = new NetworkMessage(_client)
                {
                    SequenceNumber = 0
                };

                var loginChallengePacket = new LoginChallenge(_client)
                {
                    Timestamp = (uint)DateTime.Now.Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds,
                    Random    = 0xFF
                };
                loginChallengePacket.AppendToNetworkMessage(loginChallengeMessage);

                SendToClient(loginChallengeMessage);

                _clientSocket.BeginReceive(_clientBuffer, 0, 2, SocketFlags.None, new AsyncCallback(BeginReceiveClientCallback), null);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
Exemplo n.º 5
0
        public HttpResponseMessage Post([FromBody] LoginChallenge challenge)
        {
            // return error if password is not correct
            if (!this.IsPasswordValid(challenge.Username, challenge.Password))
            {
                return(this.Request.CreateUnauthorizedResponse());
            }

            JwtSecurityToken token = this.GetAuthenticationTokenForUser(challenge.Username);

            return(this.Request.CreateResponse(HttpStatusCode.OK, new
            {
                Token = token.RawData,
                Username = challenge.Username
            }));
        }
Exemplo n.º 6
0
        private void protocol(SslStream sslStream)
        {
            //sslStream.ReadTimeout = 5000;
            //sslStream.WriteTimeout = 5000;

            /*
                User authentication
            */
            UserData userData = null;
            object req = null;
            req = Util.readObject(sslStream);
            if (req is LoginRequest)
            {
                var lr = (LoginRequest)req;
                log(Util.XmlSerializeToString(lr));
                userData = serverData.users.Find(x => x.username == lr.username);
                if (userData==null)
                {
                    log("Login failed: unknown user");
                    return;
                }
                LoginChallenge lc = new LoginChallenge()
                {
                    passwordSalt = userData.passwordSalt
                };
                Util.writeObject(sslStream, lc);
                log(Util.XmlSerializeToString(lc));
            }
            else
            {
                log("Login failed: did not receive loginRequest");
                return;
            }

            req = Util.readObject(sslStream);
            if (req is LoginResponse)
            {
                var lr = (LoginResponse)req;
                log(Util.XmlSerializeToString(lr));
                if (lr.passwordHash != userData.passwordHash)
                {
                    log("Login failed: different password hash");
                }
                var lc = new LoginConfirmation()
                {
                    encryptedPrivateKey = userData.encryptedPrivateKey,
                    privateIV = userData.privateIV,
                    KEKSalt = userData.KEKSalt
                };
                foreach(var x in serverData.users)
                {
                    lc.permission.Add(new UserPublicKey()
                    { username = x.username, publicKey = x.publicKey});
                }
                Util.writeObject(sslStream, lc);
                log(Util.XmlSerializeToString(lc));
            }
            else
            {
                log("Login failed: did not receive loginRequest");
                return;
            }
            log("Login successfull");
            /*
                User is now authenticated.
            */
            while (true)
            {
                req = Util.readObject(sslStream);
                if(req is ReadCalendarRequest)
                {
                    ReadCalendarRequest read = (ReadCalendarRequest)req;
                    var calendarName = read.calendarName;
                    SecureCalendar sc = serverData.calendars.Find(c => c.name == calendarName);
                    if(sc == null)
                    {
                        log("Read calendar invalid");
                        return;
                    }
                    var efek = sc.keys.Find(x => x.username == userData.username);
                    if(efek == null)
                    {
                        log("Read calendar invlalid");
                        return;
                    }
                    Util.writeObject(sslStream, sc);
                    log("Read successfull");

                }else if(req is SecureCalendar)
                {
                    SecureCalendar newCalendar = (SecureCalendar)req;
                    SecureCalendar oldCalendar = serverData.calendars.Find(c => c.name == newCalendar.name);
                    if (oldCalendar == null)
                    {
                        log("Write calendar invalid");
                        return;
                    }
                    var efek = oldCalendar.keys.Find(x => x.username == userData.username);
                    if (efek == null)
                    {
                        log("Read calendar invlalid");
                        return;
                    }
                    serverData.calendars.Add(newCalendar);
                    serverData.calendars.Remove(oldCalendar);
                    log("Write successfull");
                    // TODO check if permitions where changed
                }
                else
                {
                    var m = "null";
                    if (req != null)
                        m = req.GetType().ToString();
                    logF("Protocol failed: received unexpected message type:{0}", m);
                }
            }
        }