Пример #1
0
        private static void HandleAuthentication(string message, HqApiPreClient client)
        {
            if (client.Stage != AuthStage.NegotiateHandle)
            {
                return;
            }
            var request = HqAuthBaseMessage.Deserialize(message);

            if (request == null)
            {
                Remove(client, true);
                return;
            }

            if (request.Stage != AuthStage.NegotiateHandle)
            {
                // intruder.
                Remove(client, true);
                return;
            }
            var data = HqApiAuthRequest.Deserialize(request.Data);

            if (data == null)
            {
                Remove(client, true);
                return;
            }
            var handle = WebApiHandleStore.Handles.FirstOrDefault(item =>
                                                                  item.HandleId.Equals(data.Handle) && item.Secure == data.Secure);

            if (handle == null)
            {
                client.Push(new HandleNotFoundResponse());
                Remove(client, true);
                return;
            }

            if (handle.Secure)
            {
                client.Push(new RequestForPasswordResponse());
                client.Stage = AuthStage.RequestPassword;
            }
            else
            {
                Remove(client, false);
                client.Push(new WelcomeResponse());
                client.Handle = handle;
                var user = new HqApiUser(client.Connection);
                handle.Add(user);
                client.User  = user;
                client.Stage = AuthStage.Authenticated;
            }
Пример #2
0
        public static void Process(IWebSocketConnection client)
        {
            var record = new HqApiPreClient()
            {
                Connection = client,
                Cycles     = 0,
                TimedOut   = false,
                Stage      = AuthStage.NegotiateHandle
            };

            lock (_timeoutQueue) _timeoutQueue.Add(record);
            client.OnMessage += (message) => OnMessage(message, record);
        }
Пример #3
0
 static void Remove(HqApiPreClient client, bool fail)
 {
     lock (_timeoutQueue)
     {
         if (_timeoutQueue.Contains(client))
         {
             _timeoutQueue.Remove(client);
         }
         if (fail)
         {
             client.Connection.Close();
         }
     }
 }
Пример #4
0
 private static void OnMessage(string message, HqApiPreClient client)
 {
     if (client.Stage != AuthStage.Authenticated)
     {
         lock (_timeoutQueue)
         {
             if (!client.TimedOut)
             {
                 HandleAuthentication(message, client);
             }
         }
     }
     else
     {
         client.User.Received(message);
     }
 }