Ejemplo n.º 1
0
        public VerificationRequest ValidateCode(VerificationCode code)
        {
            var validatedRequest = new VerificationRequest(this.UserId, this.VerificationType, this.Status, this.ExpiryDate, this.Code, this.Attempts);

            validatedRequest.Attempts++;

            if (this.Status != VerificationRequestStatus.Pending)
            {
                return(validatedRequest);
            }

            if (this.ExpiryDate < DateTime.UtcNow)
            {
                validatedRequest.Status = VerificationRequestStatus.Expired;
                return(validatedRequest);
            }

            if (this.Code.Equals(code))
            {
                validatedRequest.Status = VerificationRequestStatus.Confirmed;
            }
            else if (validatedRequest.Attempts == 3)
            {
                validatedRequest.Status = VerificationRequestStatus.Failed;
            }

            return(validatedRequest);
        }
Ejemplo n.º 2
0
 public VerificationRequest(
     string userId,
     VerificationType verificationType,
     VerificationRequestStatus status,
     DateTime expiryDate,
     VerificationCode code,
     int attempts)
 {
     this.UserId           = userId;
     this.ExpiryDate       = expiryDate;
     this.VerificationType = verificationType;
     this.Code             = code;
     this.Status           = status;
     this.Attempts         = attempts;
 }
Ejemplo n.º 3
0
        public async Task <bool> VerifyCode(VerificationType type, string userId, VerificationCode code)
        {
            var storedCodeRequest = await this.verificationRequestRepository.GetVerificationRequest(type, userId);

            if (storedCodeRequest == null)
            {
                this.logger.LogWarning("User ({userId}) tried to verify a code that hasn't been requested", userId);
                return(false);
            }

            var validatedRequest = storedCodeRequest.ValidateCode(code);

            await this.verificationRequestRepository.UpdateAttemptedRequest(validatedRequest);

            // todo problem+json stuff KYC-36
            return(validatedRequest.Status == VerificationRequestStatus.Confirmed);
        }
Ejemplo n.º 4
0
        public async Task <bool> GenerateCode(VerificationType type, string userId, Func <VerificationCode, Task> onSuccessfulGeneration)
        {
            var outstandingRequest = await this.verificationRequestRepository.GetVerificationRequest(type, userId);

            if (outstandingRequest != null && outstandingRequest.IsActive())
            {
                this.logger.LogInformation("User {userId} tried to request an active code when one was already available", userId);
                return(false);
            }

            var verificationRequest = VerificationRequest.GenerateNewVerificationRequest(userId, type, VerificationCode.Generate());

            await this.verificationRequestRepository.StoreNewVerificationRequest(verificationRequest); // todo config the time KYC-43

            try
            {
                await onSuccessfulGeneration(verificationRequest.Code);
            }
            catch (SenderException)
            {
                this.logger.LogWarning("Failed to dispatch verification code to user");
                return(false);
            }

            return(true);
        }
Ejemplo n.º 5
0
        public static VerificationRequest GenerateNewVerificationRequest(string userId, VerificationType vericationType, VerificationCode code)
        {
            if (string.IsNullOrWhiteSpace(userId))
            {
                throw new ArgumentNullException(nameof(userId));
            }

            if (code == null)
            {
                throw new ArgumentNullException(nameof(code));
            }

            // todo configure expiry time KYC-43
            return(new VerificationRequest(userId, vericationType, VerificationRequestStatus.Pending, DateTime.UtcNow.Add(TimeSpan.FromMinutes(15)), code, 0));
        }