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; }
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); }
static void Remove(HqApiPreClient client, bool fail) { lock (_timeoutQueue) { if (_timeoutQueue.Contains(client)) { _timeoutQueue.Remove(client); } if (fail) { client.Connection.Close(); } } }
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); } }