Exemple #1
0
        ///<summary>
        /// Gets the current valid OTP for the specified marker or generates one, if none exists
        ///</summary>
        public async Task <string> GetOtpForMarker(int markerId, IDbTransaction transaction = null)
        {
            var connection = transaction.Connection;
            var otp        = await connection.QueryFirstOrDefaultAsync <string>(@"
            SELECT otp.[Value]
                FROM [LaHistoricalMarkers].[dbo].[OneTimePassword] otp
                RIGHT JOIN [LaHistoricalMarkers].[dbo].[MarkerAccess] access
                ON otp.Id = access.Id
                WHERE access.MarkerId = @markerId",
                                                                                new { markerId = markerId }, transaction);

            if (string.IsNullOrEmpty(otp))
            {
                otp = OneTimePasswordGenerator.Generate();
                var otpId = await connection.QuerySingleAsync <int>(@"
                INSERT INTO [LaHistoricalMarkers].[dbo].[OneTimePassword](
                    [Value]
                )
                OUTPUT INSERTED.Id
                VALUES (@otp)",
                                                                    new { otp }, transaction);

                connection.Execute(@"
                INSERT INTO [LaHistoricalMarkers].[dbo].[MarkerAccess](
                    [MarkerId],
                    [OtpId]
                )
                VALUES (
                    @markerId,
                    @otpId
                )", new { markerId = markerId, otpId }, transaction);
            }

            return(otp);
        }
        public void GeneratedPasswordIsNotValidForAnIncorrectUserId()
        {
            var passwordGenerator = new OneTimePasswordGenerator(new RealDateTime());

            var password = passwordGenerator.GenerateFor("User01");

            Assert.That(passwordGenerator.Validate("IncorrectUser01", password), Is.False);
        }
        public void GeneratedPasswordIsValidForTheCorrectUserId()
        {
            var          passwordGenerator = new OneTimePasswordGenerator(new RealDateTime());
            const string userId            = "User01";

            var password = passwordGenerator.GenerateFor(userId);

            Assert.That(passwordGenerator.Validate(userId, password), Is.True);
        }
Exemple #4
0
        protected async Task ShowGitHubOneTimePassword(string secret)
        {
            var passwordGenerator = new OneTimePasswordGenerator(secret);
            var generateTotp      = true;

            while (generateTotp)
            {
                var oneTimePassword = passwordGenerator.Generate(Clock.UtcNow);
                generateTotp = await Console.ConfirmAsync($"Your one time password: {oneTimePassword}. Enter yes to generate another one: ");
            }
        }
Exemple #5
0
        public void Generate_With30sDelay_PasswordsAreDifferent()
        {
            var passwordGenerator = new OneTimePasswordGenerator("MFRGGZDFMZTWQ2LK");

            var initialTimestamp = new DateTime(2021, 3, 1, 13, 15, 0, DateTimeKind.Utc);
            var intialPassword   = passwordGenerator.Generate(initialTimestamp);
            var passwordAfter30s = passwordGenerator.Generate(initialTimestamp.AddSeconds(30));

            Assert.AreEqual("650100", intialPassword);
            Assert.AreEqual("019584", passwordAfter30s);
        }
Exemple #6
0
        public void Generate_With29sDelay_PasswordsAreTheSame()
        {
            var passwordGenerator = new OneTimePasswordGenerator("MFRGGZDFMZTWQ2LK");

            var initialTimestamp = new DateTime(2021, 3, 1, 13, 15, 0, DateTimeKind.Utc);
            var intialPassword   = passwordGenerator.Generate(initialTimestamp);
            var passwordAfter29s = passwordGenerator.Generate(initialTimestamp.AddSeconds(29));

            Assert.AreEqual("650100", intialPassword);
            Assert.AreEqual("650100", passwordAfter29s);
        }
        public void PasswordIsInvalidAfterOneMinuteAndOneSecond()
        {
            var dateTime          = new StubDateTime();
            var passwordGenerator = new OneTimePasswordGenerator(dateTime);

            const string userId = "User01";

            dateTime.SetNextDateTime(new DateTime(2016, 1, 1, 12, 00, 00));
            var password = passwordGenerator.GenerateFor(userId);

            dateTime.SetNextDateTime(new DateTime(2016, 1, 1, 12, 01, 01));
            Assert.That(passwordGenerator.Validate(userId, password), Is.False);
        }
        public void PasswordStillValidAfterTwentyNineSeconds()
        {
            var dateTime          = new StubDateTime();
            var passwordGenerator = new OneTimePasswordGenerator(dateTime);

            const string userId = "User01";

            dateTime.SetNextDateTime(new DateTime(2016, 1, 1, 12, 00, 00));
            var password = passwordGenerator.GenerateFor(userId);

            dateTime.SetNextDateTime(new DateTime(2016, 1, 1, 12, 00, 29));
            Assert.That(passwordGenerator.Validate(userId, password), Is.True);
        }