Example #1
0
        protected override void Execute(Stream stream)
        {
            this.Log("Sending StoreObject request to {0} for object ID {1}", TargetNode.EndPoint, objectId);

            var clientHandshake = new ClientHandshake();
            clientHandshake.NodeId = App.Node.Id;
            clientHandshake.Port = App.Node.Port;
            clientHandshake.StoreObjectRequest = new StoreObjectRequest();
            clientHandshake.StoreObjectRequest.Hash = Crypto.Hash(bytes);
            clientHandshake.StoreObjectRequest.Length = (uint) bytes.Length;
            clientHandshake.StoreObjectRequest.ObjectId = objectId;
            Serializer.SerializeWithLengthPrefix(stream, clientHandshake, PrefixStyle.Base128);

            var storeObjectResponse = Serializer.DeserializeWithLengthPrefix<StoreObjectResponse>(stream, PrefixStyle.Base128);
            if (storeObjectResponse.Error != Error.Success)
            {
                this.Log("Got StoreObject response {0} from {1} for object ID {2}", storeObjectResponse.Error, TargetNode.EndPoint, objectId);
                done(storeObjectResponse.Error);
                return;
            }

            // TODO: update local metadata

            stream.Write(bytes, 0, bytes.Length);
            done(Error.Success);
        }
Example #2
0
        protected override void Execute(Stream stream)
        {
            this.Log("Sending GetObject request to {0} for object ID {1}", TargetNode.EndPoint, objectId);

            var clientHandshake = new ClientHandshake();
            clientHandshake.NodeId = App.Node.Id;
            clientHandshake.Port = App.Node.Port;
            clientHandshake.GetObjectRequest = new GetObjectRequest();
            clientHandshake.GetObjectRequest.ObjectId = objectId;
            Serializer.SerializeWithLengthPrefix(stream, clientHandshake, PrefixStyle.Base128);

            var getObjectResponse = Serializer.DeserializeWithLengthPrefix<GetObjectResponse>(stream, PrefixStyle.Base128);
            if (getObjectResponse.Error != Error.Success)
            {
                this.Log("Got GetObject response {0} from {1} for object ID {2}", getObjectResponse.Error, TargetNode.EndPoint, objectId);
                done(getObjectResponse.Error, null);
                return;
            }

            var buffer = new byte[getObjectResponse.Length];
            var offset = 0;
            var remaining = (int) getObjectResponse.Length;
            while (remaining != 0)
            {
                int read = stream.Read(buffer, offset, remaining);
                offset += read;
                remaining -= read;
            }

            this.Log("Got object {0} from {1}.", objectId, TargetNode.EndPoint);

            done(Error.Success, buffer);
        }
 public static void HandleHandshake(Session session, ClientHandshake handshake)
 {
     Log.Print(LogType.Debug, $"Protocol Version: {handshake.ProtocolVersion}");
     Log.Print(LogType.Debug, $"Server Address: {handshake.ServerAddress}");
     Log.Print(LogType.Debug, $"Server Port: {handshake.ServerPort}");
     Log.Print(LogType.Debug, $"Next State: {handshake.NextState}");
 }
Example #4
0
        public static ServerHandshake Handshake(ClientHandshake clientData, NetworkStream stream)
        {
            var output = GetServerData(stream);

            SendClientData(clientData, stream);
            return(output);
        }
        private async Task ConnectToAgent(CancellationToken token)
        {
            var agentAddress = $"{Agent.TcpHost}:{Agent.TcpPort}";

            Log.Debug($"Connecting to TCP Agent '{agentAddress}'...");

            try {
                await MessageClient.ConnectAsync(Agent.TcpHost, Agent.TcpPort, Token);

                Log.Info($"Connected to TCP Agent '{agentAddress}'.");

                Log.Debug($"Performing TCP handshake... [{agentAddress}]");

                await ClientHandshake.Verify(MessageClient, token);

                Log.Info($"Handshake successful. [{agentAddress}].");
            }
            catch (Exception error) {
                Log.Error($"Failed to connect to TCP Agent '{agentAddress}'!", error);
                MessageClient.Dispose();
                throw;
            }

            await OnBeginSession(token);

            Tasks.Start();
        }
Example #6
0
 // This method is called when the socket connects
 public override void Connected(ClientHandshake handshake)
 {
     Console.WriteLine("");
     Console.WriteLine(" * Client Connected");
     Console.WriteLine("");
     Console.WriteLine("What would you like to say to the client?");
     Console.WriteLine("");
 }
Example #7
0
        private void Authenticate()
        {
            _handshake = new ClientHandshake {
                Version = "8", Origin = Origin, Host = _host, Key = GenerateKey(), ResourcePath = _path, SubProtocols = SubProtocols
            };

            _client.Client.Send(Encoding.UTF8.GetBytes(_handshake.ToString()));
        }
Example #8
0
        public void CorruptHostShouldNotValidate()
        {
            var clientHandshake = new ClientHandshake();
            clientHandshake.Key1 = "aaa";
            clientHandshake.Key2 = "bbb";
            clientHandshake.Origin = "AAA";
            clientHandshake.ResourcePath = "BBB";

            clientHandshake.Host = "$%%$%NoT^^^A)()(()VALID--==!!URI&&&@@#$#~~~";
            Assert.IsFalse(clientHandshake.Validate(null, "ws://localhost:8181/"));
        }
Example #9
0
        public void HostnameShouldMatchOnUri()
        {
            var clientHandshake = new ClientHandshake();
            clientHandshake.Key1 = "aaa";
            clientHandshake.Key2 = "bbb";
            clientHandshake.Origin = "AAA";
            clientHandshake.ResourcePath = "BBB";

            clientHandshake.Host = "localhost:8181";
            Assert.IsTrue(clientHandshake.Validate(null, "ws://localhost:8181/"));
        }
Example #10
0
        public void NullHostShouldNotValidate()
        {
            var clientHandshake = new ClientHandshake();
            clientHandshake.Key1 = "aaa";
            clientHandshake.Key2 = "bbb";
            clientHandshake.Origin = "AAA";
            clientHandshake.ResourcePath = "BBB";

            clientHandshake.Host = null;
            Assert.IsFalse(clientHandshake.Validate(null, "ws://localhost:8181/"));
        }
Example #11
0
        //public List<IWebSocket> this[string metadata]
        //{
        //    get
        //    {
        //        if (clientsByMetadata.ContainsKey(metadata))
        //        {
        //            return clientsByMetadata[metadata];
        //        }

        //        return new List<IWebSocket>();
        //    }
        //}

        private void OnHandShaken(IWebSocket webSocket, ClientHandshake clientHandshake)
        {
            var handler = handlerFactory.Create(clientHandshake.ResourceName);

            if (handler != null)
            {
                webSocket.Received     = handler.Received;
                webSocket.Disconnected = sender =>
                {
                    var found = clientsByMetadata.FirstOrDefault(kv => kv.Value.Exists(ws => ws == sender));
                    if (found.Value != null)
                    {
                        found.Value.Remove((WebSocket)sender);
                        if (!found.Value.Any())
                        {
                            clientsByMetadata.Remove(found.Key);
                        }
                        // A web socket with the metaData has been disconnected from the server
                        handler.Disconnected(found.Key);
                    }
                };
                webSocket.Error = handler.Error;

                var metadata = GetMetadata(clientHandshake, webSocket);

                // A web socket with the metaData has been connected to the server
                handler.Connected(metadata);

                if (!clientsByMetadata.ContainsKey(metadata))
                {
                    clientsByMetadata.Add(metadata, new List <IWebSocket> {
                        webSocket
                    });
                }
                else
                {
                    //clientsByMetaData[metaData].Dispose();
                    clientsByMetadata[metadata].Add(webSocket);
                }

                // Begin receiving data from the client
                webSocket.ReceiveAsync();
            }
            else
            {
                if (Log.IsDebugEnabled)
                {
                    Log.Debug("There was no handler found for the resource name");
                }
                // If nothing is handling client connections
                // the client connection should be closed
                webSocket.Dispose();
            }
        }
Example #12
0
        private async Task AgentAction(ServerAgent agent)
        {
            using (var messageClient = new MessageClient(PhotonServer.Instance.MessageRegistry)) {
                Output.WriteBlock(block => block
                                  .Write("Connecting to agent ", ConsoleColor.DarkCyan)
                                  .Write(agent.Name, ConsoleColor.Cyan)
                                  .WriteLine("...", ConsoleColor.DarkCyan));

                try {
                    await messageClient.ConnectAsync(agent.TcpHost, agent.TcpPort, TokenSource.Token);

                    await ClientHandshake.Verify(messageClient, TokenSource.Token);
                }
                catch (Exception error) {
                    Output.WriteBlock(block => block
                                      .Write("Failed to connect to agent ", ConsoleColor.DarkRed)
                                      .Write(agent.Name, ConsoleColor.Red)
                                      .WriteLine("!", ConsoleColor.DarkRed)
                                      .WriteLine(error.UnfoldMessages(), ConsoleColor.DarkYellow));

                    return;
                }

                Output.WriteLine("Agent connected.", ConsoleColor.DarkGreen);

                Output.WriteBlock(block => block
                                  .Write("Updating Agent ", ConsoleColor.DarkCyan)
                                  .Write(agent.Name, ConsoleColor.Cyan)
                                  .WriteLine("...", ConsoleColor.DarkCyan));

                try {
                    await UpdateAgent(agent, messageClient, TokenSource.Token);

                    Output.WriteBlock(block => block
                                      .Write("Agent ", ConsoleColor.DarkGreen)
                                      .Write(agent.Name, ConsoleColor.Green)
                                      .WriteLine(" updated successfully.", ConsoleColor.DarkGreen));
                }
                catch (Exception error) {
                    Output.WriteBlock(block => block
                                      .Write("Failed to update agent ", ConsoleColor.DarkRed)
                                      .Write(agent.Name, ConsoleColor.Red)
                                      .WriteLine("!", ConsoleColor.DarkRed)
                                      .WriteLine(error.UnfoldMessages(), ConsoleColor.DarkYellow));
                }
            }
        }
Example #13
0
        private async Task <MessageClient> Reconnect(ServerAgent agent, TimeSpan timeout, CancellationToken token)
        {
            using (var timeoutTokenSource = new CancellationTokenSource(timeout))
                using (var mergedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(timeoutTokenSource.Token, token)) {
                    while (true)
                    {
                        mergedTokenSource.Token.ThrowIfCancellationRequested();

                        var client = new MessageClient(PhotonServer.Instance.MessageRegistry);

                        try {
                            using (var connectionTimeoutTokenSource = new CancellationTokenSource(20_000))
                                using (var connectTokenSource = CancellationTokenSource.CreateLinkedTokenSource(mergedTokenSource.Token, connectionTimeoutTokenSource.Token)) {
                                    await client.ConnectAsync(agent.TcpHost, agent.TcpPort, connectTokenSource.Token);

                                    await ClientHandshake.Verify(client, connectTokenSource.Token);

                                    var versionRequest = new AgentGetVersionRequest();

                                    var versionResponse = await client.Send(versionRequest)
                                                          .GetResponseAsync <AgentGetVersionResponse>(connectTokenSource.Token);

                                    if (string.IsNullOrEmpty(versionResponse.Version))
                                    {
                                        Log.Warn("An empty version response was received!");
                                        continue;
                                    }

                                    if (!VersionTools.HasUpdates(versionResponse.Version, UpdateVersion))
                                    {
                                        return(client);
                                    }
                                }
                        }
                        catch (SocketException) {}
                        catch (OperationCanceledException) {}
                        catch (Exception error) {
                            Log.Warn("An unhandled exception occurred while attempting to reconnect to an updating agent.", error);
                        }

                        client.Dispose();

                        await Task.Delay(3_000, mergedTokenSource.Token);
                    }
                }
        }
Example #14
0
        private async Task AgentAction(ServerAgent agent)
        {
            using (var messageClient = new MessageClient(PhotonServer.Instance.MessageRegistry)) {
                try {
                    Output.WriteLine($"[{agent.Name}] Connecting...'", ConsoleColor.White);

                    await messageClient.ConnectAsync(agent.TcpHost, agent.TcpPort, TokenSource.Token);

                    await ClientHandshake.Verify(messageClient, TokenSource.Token);

                    Output.WriteLine($"[{agent.Name}] Connected.", ConsoleColor.DarkCyan);
                }
                catch (Exception error) {
                    using (var block = Output.WriteBlock()) {
                        block.WriteLine($"[{agent.Name}] Connection Failed!", ConsoleColor.DarkRed);
                        block.WriteLine(error.UnfoldMessages(), ConsoleColor.DarkYellow);
                    }

                    return;
                }

                var userMgr        = PhotonServer.Instance.UserMgr;
                var securityConfig = PhotonServer.Instance.ServerConfiguration.Value.Security;

                var message = new SecurityPublishRequest {
                    Users                 = userMgr.AllUsers.ToArray(),
                    UserGroups            = userMgr.AllGroups.ToArray(),
                    SecurityEnabled       = securityConfig.Enabled,
                    SecurityDomainEnabled = securityConfig.DomainEnabled,
                };

                Output.WriteLine($"[{agent.Name}] Publishing security configuration...", ConsoleColor.White);

                await messageClient.Send(message)
                .GetResponseAsync();

                Output.WriteLine($"[{agent.Name}] security configuration published.", ConsoleColor.DarkGreen);

                try {
                    Output.WriteLine($"[{agent.Name}] Disconnecting...", ConsoleColor.White);

                    messageClient.Disconnect();
                }
                catch {}
            }
        }
Example #15
0
 private string GetMetadata(ClientHandshake clientHandshake, IWebSocket webSocket)
 {
     if (!string.IsNullOrEmpty(fromFieldName) &&
         clientHandshake.ExtraFields != null &&
         clientHandshake.ExtraFields.ContainsKey(fromFieldName))
     {
         return(clientHandshake.ExtraFields[fromFieldName]);
     }
     else if (!string.IsNullOrEmpty(clientHandshake.Origin) &&
              !clientHandshake.Origin.Equals("null"))
     {
         return(clientHandshake.Origin);
     }
     else
     {
         return(webSocket.LocalEndPoint.ToString());
     }
 }
Example #16
0
        public static HandshakeReturnCapsula Login(Logger logger, Stream stream, X509Certificate2 cert, string password, string userName = null, int?clientId = null)
        {
            ClientHandshake clientHandshake = new ClientHandshake()
            {
                PemCertificate = X509Certificate2Utils.ExportToPem(cert),
                UserName       = userName,
                ClientId       = clientId,
                ServerPassword = password
            };

            if (userName != null && userName.Length > DataConstants.USER_NAME_MAX_LENGHT)
            {
                throw new Exception("Username is too long.");
            }

            TextEncoder.SendJson(stream, clientHandshake);

            byte[] encrypted = BinaryEncoder.ReceiveBytes(stream);
            byte[] decrypted = RSAEncoder.Decrypt(encrypted, cert);
            BinaryEncoder.SendBytes(stream, decrypted);

            ServerHandshake serverHandshake = TextEncoder.ReadJson <ServerHandshake>(stream);

            logger.Log("Handshake", "Handshake", serverHandshake.Errors, false);

            if (!serverHandshake.Succeeded)
            {
                throw new Exception($"Handshake failed\n{serverHandshake.Errors}");
            }

            return(new HandshakeReturnCapsula()
            {
                UserId = serverHandshake.UserId,
                UserName = serverHandshake.UserName,
                ClientId = serverHandshake.ClientId,
                SelfAesPassword = serverHandshake.SelfAesKey == null ? null : new AESPassword(RSAEncoder.DecryptAndVerify(serverHandshake.SelfAesKey, cert, cert))
            });
        }
Example #17
0
    private void Start()
    {
        DontDestroyOnLoad(gameObject);

        info = FindObjectOfType <PlayerInformation>();

        ws = new WebSocket("ws://" + serverIp);
        Debug.Log("Connecting to server - " + serverIp);
        ws.Connect();

        ws.OnMessage += (sender, e) => Receive(sender, e);
        ws.OnClose   += (sender, e) => OnDisconnect(sender, e);

        ClientHandshake handshake = new ClientHandshake();

        handshake.packetType = (int)GameClientPackets.Handshake;
        handshake.username   = info.username;
        string json = JsonUtility.ToJson(handshake);

        ws.Send(json);

        StartCoroutine(StayAlive());
    }
Example #18
0
        private static async Task <string> GetAgentVersion(ServerAgent agent, CancellationToken token)
        {
            MessageClient messageClient = null;

            try {
                messageClient = new MessageClient(PhotonServer.Instance.MessageRegistry);
                await messageClient.ConnectAsync(agent.TcpHost, agent.TcpPort, token);

                await ClientHandshake.Verify(messageClient, token);

                var agentVersionRequest = new AgentGetVersionRequest();

                var agentVersionResponse = await messageClient.Send(agentVersionRequest)
                                           .GetResponseAsync <AgentGetVersionResponse>(token);

                return(agentVersionResponse.Version);
            }
            catch (Exception error) {
                throw new ApplicationException($"Failed to retrieve version of agent '{agent.Name}'!", error);
            }
            finally {
                messageClient?.Dispose();
            }
        }
Example #19
0
        public static ConnectionInfo Run(Stream stream, Action <string> log, ServerConfig config)
        {
            ClientHandshake  clientHandshake   = TextEncoder.ReadJson <ClientHandshake>(stream);
            X509Certificate2 clientCertificate = X509Certificate2Utils.ImportFromPem(clientHandshake.PemCertificate);

            log($"Logging user sent username {clientHandshake.UserName}\n Certificate:\n {clientHandshake.PemCertificate}");

            ServerHandshake errorHandshake = new ServerHandshake()
            {
                Errors    = "",
                NewUser   = false,
                Succeeded = false,
                UserId    = -1,
                UserName  = ""
            };

            if (config.Password != null && !config.Password.Equals(clientHandshake.ServerPassword))
            {
                errorHandshake.Errors = "Server password is wrong.";
                TextEncoder.SendJson(stream, errorHandshake);
                throw new Exception(errorHandshake.Errors);
            }

            log("Generating random bytes");
            byte[] randomBytes = LUtils.GenerateRandomBytes(TcpConstants.HANDSHAKE_LENGHT);

            log("Sending encrypted bytes");
            BinaryEncoder.SendBytes(stream, RSAEncoder.Encrypt(randomBytes, clientCertificate));

            byte[] received = BinaryEncoder.ReceiveBytes(stream);
            if (!randomBytes.SequenceEqual(received))
            {
                log("Client's certificate verification failed.");
                errorHandshake.Errors = "Client's certificate verification failed.";
                TextEncoder.SendJson(stream, errorHandshake);
                throw new Exception(errorHandshake.Errors);
            }

            log("Certificate verification succeeded.");

            Users   user;
            String  message;
            Clients client;

            byte[] aesKey  = null;
            bool   newUser = false;

            using (Context context = new Context(config))
            {
                byte[] hash = SHA256Utils.ComputeByteSha256Hash(clientCertificate);
                user = context.Users.SingleOrDefault(u => u.PublicCertificateSha256.SequenceEqual(hash));

                if (user == null)
                {
                    log("User doesn't exist yet. I'll try to create him.");
                    newUser = true;

                    log("Checking the uniquity of username.");
                    String userName = clientHandshake.UserName;
                    if (context.Users.SingleOrDefault(u => u.UserName.Equals(userName)) != null)
                    {
                        errorHandshake.Errors = "Username isn't unique.";
                        TextEncoder.SendJson(stream, errorHandshake);
                        throw new Exception(errorHandshake.Errors);
                    }
                    else if (userName.Length > 45)
                    {
                        errorHandshake.Errors = "Username is too long (max. 45 chars)";
                        TextEncoder.SendJson(stream, errorHandshake);
                        throw new Exception(errorHandshake.Errors);
                    }
                    else if (userName.Length < 4)
                    {
                        errorHandshake.Errors = "Username is too short (min. 4 chars)";
                        TextEncoder.SendJson(stream, errorHandshake);
                        throw new Exception(errorHandshake.Errors);
                    }
                    else if (!Validators.ValidateRegexUserName(userName))
                    {
                        errorHandshake.Errors = "Username must match this regex ^[a-zA-Z][-a-zA-Z0-9_]+$ (Vaguely can't contain special chars and spaces)";
                        TextEncoder.SendJson(stream, errorHandshake);
                        throw new Exception(errorHandshake.Errors);
                    }

                    log("Creating user.");
                    user = new Users()
                    {
                        PublicCertificate       = clientHandshake.PemCertificate,
                        PublicCertificateSha256 = hash,
                        UserName = clientHandshake.UserName
                    };

                    context.Users.Add(user);
                    context.SaveChanges();

                    message = "User successfully created.";
                    log("User successfully created.");
                }
                else
                {
                    message = "User exists.";
                    log("User exists.");
                }

                client = new Clients()
                {
                    UserId = user.Id
                };

                if (clientHandshake.ClientId == null)
                {
                    log($"Loading self-aes key.");
                    aesKey = context.UsersKeys
                             .Where(u => u.RecepientId == user.Id)
                             .Where(u => u.SenderId == user.Id)
                             .Select(u => u.AesKey)
                             .SingleOrDefault();

                    context.Add(client);
                    context.SaveChanges();

                    log($"Added client with Id {client.Id}.");
                }
                else
                {
                    client.Id = (int)clientHandshake.ClientId;
                    if (context.Clients.Where(u => u.Id == client.Id).Single().UserId != user.Id)
                    {
                        errorHandshake.Errors = "This client id isn't owned by this user.";
                        TextEncoder.SendJson(stream, errorHandshake);
                        throw new Exception(errorHandshake.Errors);
                    }

                    log($"Client with Id {client.Id} has logged in.");
                }
            }

            ServerHandshake toSend = new ServerHandshake()
            {
                Errors     = message,
                NewUser    = newUser,
                Succeeded  = true,
                UserId     = user.Id,
                UserName   = user.UserName,
                ClientId   = client.Id,
                SelfAesKey = aesKey
            };

            TextEncoder.SendJson(stream, toSend);

            ConnectionInfo ret = new ConnectionInfo(user, clientCertificate, client.Id);

            log($"Handshake successeded. User {ret.UserName} with id {ret.UserId} has logged in. Client has id {client.Id}.");
            return(ret);
        }
Example #20
0
 public static void SendClientData(ClientHandshake data, NetworkStream stream)
 {
     NetworkInterop.WriteInt(stream, data.receivingPortNumber);
 }
Example #21
0
 public void Connected(ClientHandshake handshake)
 {
     ((IWebSocket)webSocket).Connected(handshake);
 }
Example #22
0
 public abstract void Connected(ClientHandshake handshake);
Example #23
0
 public override void Connected(ClientHandshake handshake)
 {
 }
Example #24
0
 public override void Connected(ClientHandshake handshake)
 {
     var ys = new String('y', Count);
     Send(ys);
 }
Example #25
0
 public override void Connected(ClientHandshake handshake)
 {
     ConnectedCalled = true;
 }
Example #26
0
 public void Connected(ClientHandshake handshake)
 {
     Console.WriteLine("--- connected ---");
 }
Example #27
0
        public static UserCapsula Run(Stream stream, Action <string> log, ServerConfig config)
        {
            ClientHandshake  clientHandshake   = TextEncoder.ReadClientHandshake(stream);
            X509Certificate2 clientCertificate = X509Certificate2Utils.ImportFromPem(clientHandshake.PemCertificate);

            log($"Logging user sent username {clientHandshake.UserName}\n Certificate:\n {clientHandshake.PemCertificate}");

            log("Generating random bytes");
            byte[] randomBytes = LUtils.GenerateRandomBytes(TcpConstants.HANDSHAKE_LENGHT);

            log("Sending encrypted bytes");
            BinaryEncoder.SendBytes(stream, RSAEncoder.Encrypt(randomBytes, clientCertificate));

            ServerHandshake errorHandshake = new ServerHandshake()
            {
                Errors    = "",
                NewUser   = false,
                Succeeded = false,
                UserId    = -1,
                UserName  = ""
            };

            byte[] received = BinaryEncoder.ReceiveBytes(stream);
            if (!randomBytes.SequenceEqual(received))
            {
                log("Sending error to client.");
                errorHandshake.Errors = "Client's certificate verification failed.";
                TextEncoder.SendJson(stream, errorHandshake);
                throw new Exception(errorHandshake.Errors);
            }

            log("Certificate verification succeeded.");

            Users   user;
            String  message;
            Clients client;
            bool    newUser = false;

            using (Context context = new Context(config))
            {
                SHA1   sha  = new SHA1CryptoServiceProvider();
                byte[] hash = sha.ComputeHash(clientCertificate.RawData);
                user = context.Users.SingleOrDefault(u => u.PublicCertificateSha1.SequenceEqual(hash));

                if (user == null)
                {
                    log("User doesn't exist yet. I'll try to create him.");
                    newUser = true;

                    log("Checking the uniquity of username.");
                    String userName = clientHandshake.UserName;
                    if (context.Users.SingleOrDefault(u => u.UserName.Equals(userName)) != null)
                    {
                        log("Username isn't unique.");
                        errorHandshake.Errors = "Username isn't unique.";
                        TextEncoder.SendJson(stream, errorHandshake);
                        throw new Exception(errorHandshake.Errors);
                    }

                    log("Creating user.");
                    user = new Users()
                    {
                        PublicCertificate     = clientHandshake.PemCertificate,
                        PublicCertificateSha1 = hash,
                        UserName = clientHandshake.UserName
                    };

                    context.Users.Add(user);
                    context.SaveChanges();

                    message = "User successfully created.";
                    log("User successfully created.");
                }
                else
                {
                    message = "User exists.";
                    log("User exists.");
                }

                client = new Clients()
                {
                    UserId = user.Id
                };

                if (clientHandshake.ClientId == null)
                {
                    context.Add(client);
                    context.SaveChanges();

                    log($"Added client with Id {client.Id}.");
                }
                else
                {
                    log($"Client with Id {client.Id} has logged in.");
                }
            }

            ServerHandshake toSend = new ServerHandshake()
            {
                Errors    = message,
                NewUser   = newUser,
                Succeeded = true,
                UserId    = user.Id,
                UserName  = user.UserName,
                ClientId  = client.Id
            };

            TextEncoder.SendJson(stream, toSend);

            UserCapsula ret = new UserCapsula(user, clientCertificate);

            log($"Handshake successeded. User {ret.UserName} with id {ret.UserId} has logged in");
            return(ret);
        }
Example #28
0
 // This method is called when the socket connects
 public override void Connected(ClientHandshake handshake)
 {
     //this.Send("You are now connected");
 }
Example #29
0
 public override void Connected(ClientHandshake handshake)
 {
     ConnectedCalled = true;
 }
Example #30
0
 public override void Connected(ClientHandshake handshake)
 {
     Console.WriteLine("new double echo connection");
 }
Example #31
0
 // This method is called when the socket connects
 public override void Connected(ClientHandshake handshake)
 {
     Console.WriteLine(" - Client Connected");
 }
Example #32
0
 public override void Connected(ClientHandshake handshake)
 {
 }
Example #33
0
            public override void Connected(ClientHandshake handshake)
            {
                var ys = new String('y', Count);

                Send(ys);
            }