public async Task Connect()
        {
            await _physicalConnection.Connect(_clientOptions).ConfigureAwait(false);

            var greetingsResponseBytes = new byte[128];
            var readCount = await _physicalConnection.ReadAsync(greetingsResponseBytes, 0, greetingsResponseBytes.Length).ConfigureAwait(false);

            if (readCount != greetingsResponseBytes.Length)
            {
                throw ExceptionHelper.UnexpectedGreetingBytesCount(readCount);
            }

            var greetings = new GreetingsResponse(greetingsResponseBytes);

            _clientOptions.LogWriter?.WriteLine($"Greetings received, salt is {Convert.ToBase64String(greetings.Salt)} .");

            PingsFailedByTimeoutCount = 0;

            _responseReader.BeginReading();
            _requestWriter.BeginWriting();

            _clientOptions.LogWriter?.WriteLine("Server responses reading started.");

            await LoginIfNotGuest(greetings).ConfigureAwait(false);
        }
        public static AuthenticationRequest Create(GreetingsResponse greetings, UriBuilder uri)
        {
            var scrable = GetScrable(greetings, uri.Password);
            var authenticationPacket = new AuthenticationRequest(uri.UserName, scrable);

            return(authenticationPacket);
        }
        private static byte[] GetScrable(GreetingsResponse greetings, string password)
        {
            var decodedSalt      = greetings.Salt;
            var first20SaltBytes = new byte[20];

            Array.Copy(decodedSalt, first20SaltBytes, 20);

            var step1         = Sha1Utils.Hash(password);
            var step2         = Sha1Utils.Hash(step1);
            var step3         = Sha1Utils.Hash(first20SaltBytes, step2);
            var scrambleBytes = Sha1Utils.Xor(step1, step3);

            return(scrambleBytes);
        }
        private async Task LoginIfNotGuest(GreetingsResponse greetings)
        {
            var singleNode = _clientOptions.ConnectionOptions.Nodes.Single();

            if (string.IsNullOrEmpty(singleNode.Uri.UserName))
            {
                _clientOptions.LogWriter?.WriteLine("Guest mode, no authentication attempt.");
                return;
            }

            var authenticateRequest = AuthenticationRequest.Create(greetings, singleNode.Uri);

            await SendRequestWithEmptyResponse(authenticateRequest).ConfigureAwait(false);

            _clientOptions.LogWriter?.WriteLine($"Authentication request send: {authenticateRequest}");
        }
Exemple #5
0
        private async Task LoginIfNotGuest(GreetingsResponse greetings)
        {
            if (!_clientOptions.ConnectionOptions.Nodes.Any())
            {
                throw new ClientSetupException("There are zero configured nodes, you should provide one");
            }

            var singleNode = _clientOptions.ConnectionOptions.Nodes.Single();

            if (string.IsNullOrEmpty(singleNode.Uri.UserName))
            {
                _clientOptions.LogWriter?.WriteLine("Guest mode, no authentication attempt.");
                return;
            }

            var authenticateRequest = AuthenticationRequest.Create(greetings, singleNode.Uri);

            await SendRequestWithEmptyResponse(authenticateRequest).ConfigureAwait(false);

            _clientOptions.LogWriter?.WriteLine($"Authentication request send: {authenticateRequest}");
        }