private async Task <VerifyPinResponse> CheckOtpCommon(Action <VerifyPinInput> transformAction) { // todo: implement settings and register using normal way var settings = new Mock <IOtpSettings>(); settings.SetupGet(s => s.PasswordLength).Returns(6); settings.SetupGet(s => s.Alphabet).Returns("0123456789"); var currentPin = string.Empty; var storage = new Dictionary <Guid, string>(); var otpStorage = new Mock <IOtpStorage>(); otpStorage.Setup(s => s.SaveAsync(It.IsAny <OtpDto>())).Returns <OtpDto>(dto => { currentPin = dto.Pin; storage.Add(dto.OperationId, dto.Pin); return(Task.CompletedTask); }); otpStorage.Setup(s => s.GetAsync(It.IsAny <Guid>())).Returns <Guid>(id => Task.FromResult(new OtpDto { Pin = storage[id], OperationId = id, ExpiresOn = DateTime.MaxValue })); var otp = new OtpAppService( new NullSmsGateway(), LocalIocManager.Resolve <IEmailSender>(), otpStorage.Object, new OtpGenerator(settings.Object), LocalIocManager.Resolve <ISettingManager>(), settings.Object ); var sendResponse = await otp.SendPinAsync(new SendPinInput() { Lifetime = 60, SendTo = "1234567890", SendType = OtpSendType.Sms }); var verificationInput = new VerifyPinInput() { OperationId = sendResponse.OperationId, Pin = currentPin }; transformAction?.Invoke(verificationInput); return(await otp.VerifyPinAsync(verificationInput)); }
/// <summary> /// Verify one-time-pin /// </summary> public async Task <VerifyPinResponse> VerifyPinAsync(VerifyPinInput input) { if (!_otpSettings.IgnoreOtpValidation) { var pinDto = await _otpStorage.GetAsync(input.OperationId); if (pinDto == null || pinDto.Pin != input.Pin) { return(VerifyPinResponse.Failed("Wrong one time pin")); } if (pinDto.ExpiresOn < DateTime.Now) { return(VerifyPinResponse.Failed("One-time pin has expired, try to send a new one")); } } return(VerifyPinResponse.Success()); }