///<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); }
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: "); } }
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); }
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); }