Exemplo n.º 1
0
        private void distortImage(IImageProcessingContext pc, string foreColor)
        {
            var degrees = _randomNumberProvider.NextNumber(1, 6);

            pc.Skew(degrees, degrees);
            pc.Vignette(Color.ParseHex(foreColor));
        }
        /// <summary>
        /// Creates DNTCaptcha
        /// </summary>
        /// <param name="captchaAttributes">captcha attributes</param>
        public DNTCaptchaApiResponse CreateDNTCaptcha(DNTCaptchaTagHelperHtmlAttributes captchaAttributes)
        {
            if (captchaAttributes == null)
            {
                throw new ArgumentNullException(nameof(captchaAttributes));
            }

            if (_httpContextAccessor.HttpContext == null)
            {
                throw new InvalidOperationException("`_httpContextAccessor.HttpContext` is null.");
            }

            var number           = _randomNumberProvider.NextNumber(captchaAttributes.Min, captchaAttributes.Max);
            var randomText       = _captchaTextProvider(captchaAttributes.DisplayMode).GetText(number, captchaAttributes.Language);
            var encryptedText    = _captchaProtectionProvider.Encrypt(randomText);
            var captchaImageUrl  = getCaptchaImageUrl(captchaAttributes, encryptedText);
            var captchaDivId     = Invariant($"{_captchaOptions.CaptchaClass}{Guid.NewGuid():N}{_randomNumberProvider.NextNumber(captchaAttributes.Min, captchaAttributes.Max)}");
            var cookieToken      = $".{captchaDivId}";
            var hiddenInputToken = _captchaProtectionProvider.Encrypt(cookieToken);

            _captchaStorageProvider.Add(_httpContextAccessor.HttpContext, cookieToken, randomText);

            return(new DNTCaptchaApiResponse
            {
                DntCaptchaImgUrl = captchaImageUrl,
                DntCaptchaId = captchaDivId,
                DntCaptchaTextValue = encryptedText,
                DntCaptchaTokenValue = hiddenInputToken
            });
        }
        /// <summary>
        /// SumOfTwoNumbers Provider
        /// </summary>
        public SumOfTwoNumbersProvider(IRandomNumberProvider randomNumberProvider)
        {
            if (randomNumberProvider == null)
            {
                throw new ArgumentNullException(nameof(randomNumberProvider));
            }

            _randomNumber = randomNumberProvider.NextNumber(1, 7);
        }
        /// <summary>
        /// SumOfTwoNumbersToWords Provider
        /// </summary>
        public SumOfTwoNumbersToWordsProvider(
            IRandomNumberProvider randomNumberProvider,
            HumanReadableIntegerProvider humanReadableIntegerProvider)
        {
            if (randomNumberProvider == null)
            {
                throw new ArgumentNullException(nameof(randomNumberProvider));
            }

            _randomNumber = randomNumberProvider.NextNumber(1, 7);
            _humanReadableIntegerProvider = humanReadableIntegerProvider;
        }
Exemplo n.º 5
0
        /// <summary>
        /// The default captcha protection provider
        /// </summary>
        public CaptchaCryptoProvider(
            IOptions <DNTCaptchaOptions> options,
            IRandomNumberProvider randomNumberProvider,
            ILogger <CaptchaCryptoProvider> logger)
        {
            _logger = logger;
            if (randomNumberProvider == null)
            {
                throw new ArgumentNullException(nameof(randomNumberProvider));
            }

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

            _keyBytes = getDesKey(options.Value.EncryptionKey, randomNumberProvider.NextNumber().ToString(CultureInfo.InvariantCulture));
        }
        /// <summary>
        /// Creates the captcha image.
        /// </summary>
        public byte[] DrawCaptcha(string message, string foreColor, float fontSize, string fontName)
        {
            return(useFont(fontName, fontSize, captchaFont =>
            {
                var fColor = ColorTranslator.FromHtml(foreColor);
                message = message.Replace(",", string.Empty, StringComparison.Ordinal);
                const int margin = 8;
                var captchaSize = measureString(message, captchaFont);
                var height = (int)captchaSize.Height + margin;
                var width = (int)captchaSize.Width + margin;

                using var pic = new Bitmap(width, height, PixelFormat.Format24bppRgb);
                var data = pic.LockBits(new Rectangle(0, 0, pic.Width, pic.Height), ImageLockMode.WriteOnly, pic.PixelFormat);
                var noise = new byte[data.Width * data.Height * 3];
                _randomNumberProvider.NextBytes(noise);
                Marshal.Copy(noise, 0, data.Scan0, noise.Length);
                pic.UnlockBits(data);
                using (var graphics = Graphics.FromImage(pic))
                {
                    var stringFormat = new StringFormat
                    {
                        Alignment = StringAlignment.Center,
                        LineAlignment = StringAlignment.Center
                    };
                    graphics.DrawString(message, captchaFont, new SolidBrush(fColor), new RectangleF(0, 0, pic.Width, pic.Height), stringFormat);

                    for (var i = 0; i < 30; i++)
                    {
                        var x0 = _randomNumberProvider.NextNumber(0, width);
                        var y0 = _randomNumberProvider.NextNumber(0, height);
                        var x1 = _randomNumberProvider.NextNumber(0, width);
                        var y1 = _randomNumberProvider.NextNumber(0, height);
                        graphics.DrawLine(Pens.White, x0, y0, x1, y1);
                    }
                }

                using var stream = new MemoryStream();
                distortImage(height, width, pic);
                pic.Save(stream, ImageFormat.Png);
                return stream.ToArray();
            }));
        }
        /// <summary>
        /// Process the taghelper and generate the output.
        /// </summary>
        public void Process(TagHelperContext context, TagHelperOutput output)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

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

            if (ViewContext == null)
            {
                throw new InvalidOperationException("`ViewContext` is null.");
            }

            setUrlHelper(ViewContext);

            output.TagName = "div";
            output.Attributes.Add("class", _captchaOptions.CaptchaClass);
            var captchaDivId = Invariant($"{_captchaOptions.CaptchaClass}{context.UniqueId}{_randomNumberProvider.NextNumber(Min, Max)}");

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

            var number        = _randomNumberProvider.NextNumber(Min, Max);
            var randomText    = _captchaTextProvider(DisplayMode).GetText(number, Language);
            var encryptedText = _captchaProtectionProvider.Encrypt(randomText);

            var captchaImage = getCaptchaImageTagBuilder(ViewContext, encryptedText);

            output.Content.AppendHtml(captchaImage);

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

            output.Content.AppendHtml(refreshButton);

            var hiddenInput = getHiddenInputTagBuilder(encryptedText);

            output.Content.AppendHtml(hiddenInput);

            var textInput = getTextInputTagBuilder();

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

            var validationMessage = getValidationMessageTagBuilder(ViewContext);

            output.Content.AppendHtml(validationMessage);

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

            output.Content.AppendHtml(hiddenInputToken);

            var dataAjaxBeginScript = getOnRefreshButtonDataAjaxBegin(ViewContext);

            output.Content.AppendHtml(dataAjaxBeginScript);

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