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