private bool IsCaptchaValidate(string captchaText, string captchaToken)
        {
            string token = captchaProtectionProvider.Decrypt(captchaToken);
            int    number;

            if (!int.TryParse(captchaText, out number))
            {
                return(false);
            }
            string text = humanReadableIntegerProvider.NumberToText(number, DNTCaptcha.Core.Providers.Language.English);

            return(text == token);
        }
        /// <summary>
        /// Process the taghelper and generate the output.
        /// </summary>
        public void Process(TagHelperContext context, TagHelperOutput output)
        {
            context.CheckArgumentNull(nameof(context));
            output.CheckArgumentNull(nameof(output));

            setUrlHelper();

            output.TagName = "div";
            output.Attributes.Add("class", "dntCaptcha");
            var captchaDivId = $"dntCaptcha{context.UniqueId}{_randomNumberProvider.Next(Min, Max)}";

            output.Attributes.Add("id", captchaDivId);
            output.TagMode = TagMode.StartTagAndEndTag;

            var number        = _randomNumberProvider.Next(Min, Max);
            var randomText    = _humanReadableIntegerProvider.NumberToText(number, Language);
            var encryptedText = _captchaProtectionProvider.Encrypt(randomText);

            var captchaImage = getCaptchaImageTagBuilder(encryptedText);

            output.Content.AppendHtml(captchaImage);

            var cookieToken   = $".{captchaDivId}";
            var refreshButton = getRefreshButtonTagBuilder(captchaDivId, cookieToken);

            output.Content.AppendHtml(refreshButton);

            var hiddenInput = getHiddenInputTagBuilder(encryptedText);

            output.Content.AppendHtml(hiddenInput);

            var textInput = getTextInputTagBuilder();

            output.Content.AppendHtml($"{string.Format(TextBoxTemplate, textInput.GetString())}");

            var validationMessage = getValidationMessageTagBuilder();

            output.Content.AppendHtml(validationMessage);

            var hiddenInputToken = getHiddenInputTokenTagBuilder(_captchaProtectionProvider.Encrypt(cookieToken));

            output.Content.AppendHtml(hiddenInputToken);

            var dataAjaxBeginScript = getOnRefreshButtonDataAjaxBegin();

            output.Content.AppendHtml(dataAjaxBeginScript);

            _captchaStorageProvider.Add(ViewContext.HttpContext, cookieToken, randomText);
        }
        public IActionResult CreateDNTCaptcha([FromBody] DNTCaptchaTagHelperHtmlAttributes captchaAttributes)
        {
            var number           = _randomNumberProvider.Next(captchaAttributes.Min, captchaAttributes.Max);
            var randomText       = _humanReadableIntegerProvider.NumberToText(number, captchaAttributes.Language);
            var encryptedText    = _captchaProtectionProvider.Encrypt(randomText);
            var captchaImageUrl  = getCaptchaImageUrl(captchaAttributes, encryptedText);
            var captchaDivId     = $"dntCaptcha{Guid.NewGuid().ToString("N")}{_randomNumberProvider.Next(captchaAttributes.Min, captchaAttributes.Max)}";
            var cookieToken      = $".{captchaDivId}";
            var hiddenInputToken = _captchaProtectionProvider.Encrypt(cookieToken);

            _captchaStorageProvider.Add(HttpContext, cookieToken, randomText);

            return(Json(new
            {
                dntCaptchaImgUrl = captchaImageUrl,
                dntCaptchaId = captchaDivId,
                dntCaptchaTextValue = encryptedText,
                dntCaptchaTokenValue = hiddenInputToken
            }));
        }
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public DNTCaptchaValidatorResult Validate(
            HttpContext httpContext,
            string captchaText,
            string inputText,
            string cookieToken,
            Language captchaGeneratorLanguage,
            string errorMessage,
            string isNumericErrorMessage)
        {
            if (!shouldValidate(httpContext))
            {
                _logger.LogInformation($"Ignoring ValidateDNTCaptcha during `{httpContext.Request.Method}`.");
                return(new DNTCaptchaValidatorResult {
                    IsValid = true
                });
            }

            if (string.IsNullOrEmpty(captchaText))
            {
                _logger.LogInformation("CaptchaHiddenInput is empty.");
                return(new DNTCaptchaValidatorResult {
                    IsValid = false, ErrorMessage = errorMessage
                });
            }

            if (string.IsNullOrEmpty(inputText))
            {
                _logger.LogInformation("CaptchaInput is empty.");
                return(new DNTCaptchaValidatorResult {
                    IsValid = false, ErrorMessage = errorMessage
                });
            }

            inputText = inputText.ToEnglishNumbers();

            long inputNumber;

            if (!long.TryParse(inputText, out inputNumber))
            {
                _logger.LogInformation("inputText is not a number.");
                return(new DNTCaptchaValidatorResult {
                    IsValid = false, ErrorMessage = isNumericErrorMessage
                });
            }

            var decryptedText = _captchaProtectionProvider.Decrypt(captchaText);

            var numberToText = _humanReadableIntegerProvider.NumberToText(inputNumber, captchaGeneratorLanguage);

            if (decryptedText == null || !decryptedText.Equals(numberToText))
            {
                _logger.LogInformation($"{decryptedText} != {numberToText}");
                return(new DNTCaptchaValidatorResult {
                    IsValid = false, ErrorMessage = errorMessage
                });
            }

            if (!isValidCookie(httpContext, decryptedText, cookieToken))
            {
                return(new DNTCaptchaValidatorResult {
                    IsValid = false, ErrorMessage = errorMessage
                });
            }

            return(new DNTCaptchaValidatorResult {
                IsValid = true
            });
        }
예제 #5
0
        /// <summary>
        /// Process the taghelper and generate the output.
        /// </summary>
        public void Process(TagHelperContext context, TagHelperOutput output)
        {
            context.CheckArgumentNull(nameof(context));
            output.CheckArgumentNull(nameof(output));

            output.TagName = "div";
            output.Attributes.Add("class", "captcha");
            var captchaDivId = $"captcha{context.UniqueId}{_randomNumberProvider.Next(Min, Max)}";

            output.Attributes.Add("id", captchaDivId);
            output.TagMode = TagMode.StartTagAndEndTag;

            var number     = _randomNumberProvider.Next(Min, Max);
            var randomText = "";

            randomText = OutputType == OutputType.InDigits ? DNTPersianUtils.Core.PersianNumbersUtils.ToPersianNumbers(number) : _humanReadableIntegerProvider.NumberToText(number, Language);

            var encryptedText = _captchaProtectionProvider.Encrypt(randomText);

            var captchaImage = GetCaptchaImageTagBuilder(encryptedText);

            output.Content.AppendHtml(captchaImage);

            var cookieToken   = $".{captchaDivId}";
            var refreshButton = GetRefreshButtonTagBuilder(captchaDivId, cookieToken);

            output.Content.AppendHtml(refreshButton);

            var hiddenInput = GetHiddenInputTagBuilder(encryptedText);

            output.Content.AppendHtml(hiddenInput);
            if (!ImageOnly)
            {
                var textInput = GetTextInputTagBuilder();
                output.Content.AppendHtml($"{string.Format(TextBoxTemplate, textInput.GetString())}");
            }

            var validationMessage = GetValidationMessageTagBuilder();

            output.Content.AppendHtml(validationMessage);

            var hiddenInputToken = GetHiddenInputTokenTagBuilder(_captchaProtectionProvider.Encrypt(cookieToken));

            output.Content.AppendHtml(hiddenInputToken);

            _captchaStorageProvider.Add(ViewContext.HttpContext, cookieToken, randomText);
        }