Exemplo n.º 1
0
        public async Task HandleAsync(ChannelReader <byte> reader, ChannelWriter <byte> writer, Client clientModel)
        {
            Requests.RS_LOGON_PROOF request = await RS_LOGON_PROOF_Reader.ReadAsync(reader);

            // Calculate U and M1
            clientModel.AuthEngine.CalculateU(request.A);
            clientModel.AuthEngine.CalculateM1();
            // AuthEngine.CalculateCRCHash()

            if (!clientModel.AuthEngine.M1.SequenceEqual(request.M1))
            {
                // Wrong pass
                logger.Debug("Wrong password for user {0}.", clientModel.AccountName);

                await AUTH_LOGON_PROOF_Writer.WriteAsync(writer, new AUTH_LOGON_PROOF(AccountState.LOGIN_BAD_PASS));
            }
            else
            {
                clientModel.AuthEngine.CalculateM2(request.M1);

                await AUTH_LOGON_PROOF_Writer.WriteAsync(writer, new AUTH_LOGON_PROOF(
                                                             AccountState.LOGIN_OK,
                                                             clientModel.AuthEngine.M2));

                // Set SSHash in DB
                string sshash = string.Concat(clientModel.AuthEngine.SsHash.Select(x => x.ToString("X2")));

                await accountStorage.UpdateAccountAsync(sshash,
                                                        clientModel.RemoteEnpoint.Address.ToString(),
                                                        Strings.Format(DateAndTime.Now, "yyyy-MM-dd"),
                                                        clientModel.AccountName);

                logger.Debug("Auth success for user {0} [{1}]", clientModel.AccountName, sshash);
            }
        }