From be2dea9fbce1c419bbf77a5b843960da3ea8f666 Mon Sep 17 00:00:00 2001 From: guqing Date: Mon, 17 Jun 2024 18:25:40 +0800 Subject: [PATCH 1/6] feat: Add CAPTCHA verification for new anonymous comments to enhance security --- build.gradle | 3 +- packages/comment-widget/src/base-form.ts | 22 +++ packages/comment-widget/src/comment-form.ts | 25 +++ packages/comment-widget/src/utils/captcha.ts | 13 ++ .../comment/widget/SettingConfigGetter.java | 17 ++ .../widget/SettingConfigGetterImpl.java | 76 +++++++++ .../widget/captcha/CaptchaCookieResolver.java | 19 +++ .../captcha/CaptchaCookieResolverImpl.java | 49 ++++++ .../widget/captcha/CaptchaGenerator.java | 92 +++++++++++ .../widget/captcha/CaptchaManager.java | 14 ++ .../widget/captcha/CaptchaManagerImpl.java | 52 ++++++ .../widget/captcha/CommentCaptchaFilter.java | 152 ++++++++++++++++++ src/main/resources/extensions/settings.yaml | 13 ++ src/main/resources/fonts/Arial_Bold.ttf | Bin 0 -> 286620 bytes 14 files changed, 546 insertions(+), 1 deletion(-) create mode 100644 packages/comment-widget/src/utils/captcha.ts create mode 100644 src/main/java/run/halo/comment/widget/SettingConfigGetter.java create mode 100644 src/main/java/run/halo/comment/widget/SettingConfigGetterImpl.java create mode 100644 src/main/java/run/halo/comment/widget/captcha/CaptchaCookieResolver.java create mode 100644 src/main/java/run/halo/comment/widget/captcha/CaptchaCookieResolverImpl.java create mode 100644 src/main/java/run/halo/comment/widget/captcha/CaptchaGenerator.java create mode 100644 src/main/java/run/halo/comment/widget/captcha/CaptchaManager.java create mode 100644 src/main/java/run/halo/comment/widget/captcha/CaptchaManagerImpl.java create mode 100644 src/main/java/run/halo/comment/widget/captcha/CommentCaptchaFilter.java create mode 100644 src/main/resources/fonts/Arial_Bold.ttf diff --git a/build.gradle b/build.gradle index 16f124f..d6c7d09 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation platform('run.halo.tools.platform:plugin:2.9.0-SNAPSHOT') + implementation platform('run.halo.tools.platform:plugin:2.13.0-SNAPSHOT') compileOnly 'run.halo.app:api' testImplementation 'run.halo.app:api' @@ -42,4 +42,5 @@ build { halo { version = "2.15.0-rc.1" + debug = true } diff --git a/packages/comment-widget/src/base-form.ts b/packages/comment-widget/src/base-form.ts index 216ff34..62de873 100644 --- a/packages/comment-widget/src/base-form.ts +++ b/packages/comment-widget/src/base-form.ts @@ -41,9 +41,21 @@ export class BaseForm extends LitElement { @state() name = ''; + @property({ type: Boolean }) + captchaRequired = false; + + @property({ type: String }) + captchaImage = ''; + @property({ type: Boolean }) submitting = false; + @property({ type: String }) + captchaCode = ''; + + @property({ type: String }) + captchaCodeMsg = ''; + textareaRef: Ref = createRef(); get customAccount() { @@ -167,6 +179,16 @@ export class BaseForm extends LitElement { placeholder="网站" /> (已有该站点的账号) +
+ + ${this.captchaCodeMsg} + captcha +
` : ''} diff --git a/packages/comment-widget/src/comment-form.ts b/packages/comment-widget/src/comment-form.ts index ebabd7c..f31b8ce 100644 --- a/packages/comment-widget/src/comment-form.ts +++ b/packages/comment-widget/src/comment-form.ts @@ -13,6 +13,7 @@ import { } from './context'; import { Comment, CommentRequest, User } from '@halo-dev/api-client'; import { createRef, Ref, ref } from 'lit/directives/ref.js'; +import { isRequireCaptcha, getCaptchaCodeHeader } from './utils/captcha'; import { BaseForm } from './base-form'; import './base-form'; import { ToastManager } from './lit-toast'; @@ -53,11 +54,23 @@ export class CommentForm extends LitElement { @state() submitting = false; + @state() + captchaRequired = false; + + @state() + captchaImageBase64 = ''; + + @state() + captchaCodeMsg = ''; + baseFormRef: Ref = createRef(); override render() { return html` `; @@ -110,10 +123,22 @@ export class CommentForm extends LitElement { method: 'POST', headers: { 'Content-Type': 'application/json', + ...getCaptchaCodeHeader(data.captchaCode), }, body: JSON.stringify(commentRequest), }); + console.log(response); + if (isRequireCaptcha(response)) { + this.captchaRequired = true; + const { captcha, detail } = await response.json(); + this.captchaImageBase64 = captcha; + this.captchaCodeMsg = detail; + return; + } + this.captchaCodeMsg = '' + this.captchaRequired = false; + if (!response.ok) { throw new Error('评论失败,请稍后重试'); } diff --git a/packages/comment-widget/src/utils/captcha.ts b/packages/comment-widget/src/utils/captcha.ts new file mode 100644 index 0000000..e0eca3d --- /dev/null +++ b/packages/comment-widget/src/utils/captcha.ts @@ -0,0 +1,13 @@ +export const getCaptchaCodeHeader = (code: string): Record => { + console.log('code input:', code) + if (!code || code.trim().length === 0) { + return {}; + } + return { + 'X-Captcha-Code': code, + }; +}; + +export const isRequireCaptcha = (response: Response) => { + return response.status === 403 && response.headers.get('X-Require-Captcha'); +}; diff --git a/src/main/java/run/halo/comment/widget/SettingConfigGetter.java b/src/main/java/run/halo/comment/widget/SettingConfigGetter.java new file mode 100644 index 0000000..f9c013c --- /dev/null +++ b/src/main/java/run/halo/comment/widget/SettingConfigGetter.java @@ -0,0 +1,17 @@ +package run.halo.comment.widget; + +import reactor.core.publisher.Mono; + +public interface SettingConfigGetter { + + Mono getSecurityConfig(); + + record SecurityConfig(CaptchaConfig captcha) { + public static SecurityConfig empty() { + return new SecurityConfig(new CaptchaConfig(false)); + } + } + + record CaptchaConfig(boolean anonymousCommentCaptcha) { + } +} diff --git a/src/main/java/run/halo/comment/widget/SettingConfigGetterImpl.java b/src/main/java/run/halo/comment/widget/SettingConfigGetterImpl.java new file mode 100644 index 0000000..07e8113 --- /dev/null +++ b/src/main/java/run/halo/comment/widget/SettingConfigGetterImpl.java @@ -0,0 +1,76 @@ +package run.halo.comment.widget; + +import static run.halo.app.extension.index.query.QueryFactory.equal; + +import java.util.function.Function; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; +import run.halo.app.extension.ConfigMap; +import run.halo.app.extension.DefaultExtensionMatcher; +import run.halo.app.extension.ExtensionClient; +import run.halo.app.extension.controller.Controller; +import run.halo.app.extension.controller.ControllerBuilder; +import run.halo.app.extension.controller.Reconciler; +import run.halo.app.extension.router.selector.FieldSelector; +import run.halo.app.plugin.ReactiveSettingFetcher; + +@Component +@RequiredArgsConstructor +public class SettingConfigGetterImpl implements SettingConfigGetter { + private final ReactiveSettingFetcher settingFetcher; + private final SettingConfigCache settingConfigCache; + + @Override + public Mono getSecurityConfig() { + return settingConfigCache.get("security", + key -> settingFetcher.fetch("security", SecurityConfig.class) + .defaultIfEmpty(SecurityConfig.empty()) + ); + } + + interface SettingConfigCache { + Mono get(String key, Function> loader); + } + + @Component + @RequiredArgsConstructor + static class SettingConfigCacheImpl implements Reconciler, SettingConfigCache { + private static final String CONFIG_NAME = "plugin-comment-widget-configmap"; + + private final Cache cache = CacheBuilder.newBuilder() + .maximumSize(10) + .build(); + + private final ExtensionClient client; + + @SuppressWarnings("unchecked") + public Mono get(String key, Function> loader) { + return Mono.justOrEmpty(cache.getIfPresent(key)) + .switchIfEmpty(loader.apply(key).doOnNext(value -> cache.put(key, value))) + .map(object -> (T) object); + } + + @Override + public Result reconcile(Request request) { + cache.invalidateAll(); + return Result.doNotRetry(); + } + + @Override + public Controller setupWith(ControllerBuilder builder) { + var extension = new ConfigMap(); + var extensionMatcher = DefaultExtensionMatcher.builder(client, extension.groupVersionKind()) + .fieldSelector(FieldSelector.of(equal("metadata.name", CONFIG_NAME))) + .build(); + return builder + .extension(extension) + .syncAllOnStart(false) + .onAddMatcher(extensionMatcher) + .onUpdateMatcher(extensionMatcher) + .build(); + } + } +} diff --git a/src/main/java/run/halo/comment/widget/captcha/CaptchaCookieResolver.java b/src/main/java/run/halo/comment/widget/captcha/CaptchaCookieResolver.java new file mode 100644 index 0000000..87c739f --- /dev/null +++ b/src/main/java/run/halo/comment/widget/captcha/CaptchaCookieResolver.java @@ -0,0 +1,19 @@ +package run.halo.comment.widget.captcha; + +import java.time.Duration; +import org.springframework.http.HttpCookie; +import org.springframework.lang.Nullable; +import org.springframework.web.server.ServerWebExchange; + +public interface CaptchaCookieResolver { + @Nullable + HttpCookie resolveCookie(ServerWebExchange exchange); + + void setCookie(ServerWebExchange exchange, String value); + + void expireCookie(ServerWebExchange exchange); + + String getCookieName(); + + Duration getCookieMaxAge(); +} diff --git a/src/main/java/run/halo/comment/widget/captcha/CaptchaCookieResolverImpl.java b/src/main/java/run/halo/comment/widget/captcha/CaptchaCookieResolverImpl.java new file mode 100644 index 0000000..f62cc35 --- /dev/null +++ b/src/main/java/run/halo/comment/widget/captcha/CaptchaCookieResolverImpl.java @@ -0,0 +1,49 @@ +package run.halo.comment.widget.captcha; + +import java.time.Duration; +import lombok.Getter; +import org.springframework.http.HttpCookie; +import org.springframework.http.ResponseCookie; +import org.springframework.lang.Nullable; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; +import org.springframework.web.server.ServerWebExchange; + +@Getter +@Component +public class CaptchaCookieResolverImpl implements CaptchaCookieResolver { + public static final String CAPTCHA_COOKIE_KEY = "comment-widget-captcha"; + + private final String cookieName = CAPTCHA_COOKIE_KEY; + + private final Duration cookieMaxAge = Duration.ofHours(1); + + @Override + @Nullable + public HttpCookie resolveCookie(ServerWebExchange exchange) { + return exchange.getRequest().getCookies().getFirst(getCookieName()); + } + + @Override + public void setCookie(ServerWebExchange exchange, String value) { + Assert.notNull(value, "'value' is required"); + exchange.getResponse().getCookies() + .set(getCookieName(), initCookie(exchange, value).build()); + } + + @Override + public void expireCookie(ServerWebExchange exchange) { + ResponseCookie cookie = initCookie(exchange, "").maxAge(0).build(); + exchange.getResponse().getCookies().set(this.cookieName, cookie); + } + + private ResponseCookie.ResponseCookieBuilder initCookie(ServerWebExchange exchange, + String value) { + return ResponseCookie.from(this.cookieName, value) + .path(exchange.getRequest().getPath().contextPath().value() + "/") + .maxAge(getCookieMaxAge()) + .httpOnly(true) + .secure("https".equalsIgnoreCase(exchange.getRequest().getURI().getScheme())) + .sameSite("Lax"); + } +} diff --git a/src/main/java/run/halo/comment/widget/captcha/CaptchaGenerator.java b/src/main/java/run/halo/comment/widget/captcha/CaptchaGenerator.java new file mode 100644 index 0000000..97d6b95 --- /dev/null +++ b/src/main/java/run/halo/comment/widget/captcha/CaptchaGenerator.java @@ -0,0 +1,92 @@ +package run.halo.comment.widget.captcha; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Base64; +import java.util.Random; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.Assert; + +@Slf4j +@UtilityClass +public class CaptchaGenerator { + private static final String CHAR_STRING = "ABCDEFGHJKMNPRSTUVWXYZabcdefghjkmnpqrstuvwxyz0123456789"; + private static final int WIDTH = 160; + private static final int HEIGHT = 40; + private static final int CHAR_LENGTH = 6; + + private static final Font customFont; + + static { + customFont = loadArialFont(); + } + + public static BufferedImage generateCaptchaImage(String captchaText) { + Assert.hasText(captchaText, "Captcha text must not be blank"); + BufferedImage bufferedImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = bufferedImage.createGraphics(); + + // paint white background + g2d.setColor(Color.WHITE); + g2d.fillRect(0, 0, WIDTH, HEIGHT); + + g2d.setFont(customFont); + + // draw captcha text + Random random = new Random(); + for (int i = 0; i < captchaText.length(); i++) { + g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); + g2d.drawString(String.valueOf(captchaText.charAt(i)), 20 + i * 24, 30); + } + + // add some noise + for (int i = 0; i < 10; i++) { + g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); + int x1 = random.nextInt(WIDTH); + int y1 = random.nextInt(HEIGHT); + int x2 = random.nextInt(WIDTH); + int y2 = random.nextInt(HEIGHT); + g2d.drawLine(x1, y1, x2, y2); + } + + g2d.dispose(); + return bufferedImage; + } + + private static Font loadArialFont() { + var fontPath = "/fonts/Arial_Bold.ttf"; + try (InputStream is = CaptchaGenerator.class.getResourceAsStream(fontPath)) { + if (is == null) { + throw new RuntimeException("Cannot load font file for " + fontPath + ", please check if it exists."); + } + return Font.createFont(Font.TRUETYPE_FONT, is).deriveFont(Font.BOLD, 24); + } catch (FontFormatException | IOException e) { + log.warn("Failed to load font file for {}, fallback to default font.", fontPath); + return new Font("Serif", Font.BOLD, 24); + } + } + + public static String generateRandomText() { + StringBuilder sb = new StringBuilder(CHAR_LENGTH); + Random random = new Random(); + for (int i = 0; i < CHAR_LENGTH; i++) { + sb.append(CHAR_STRING.charAt(random.nextInt(CHAR_STRING.length()))); + } + return sb.toString(); + } + + public static String encodeToBase64(BufferedImage image) { + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + ImageIO.write(image, "png", outputStream); + byte[] imageBytes = outputStream.toByteArray(); + return Base64.getEncoder().encodeToString(imageBytes); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/run/halo/comment/widget/captcha/CaptchaManager.java b/src/main/java/run/halo/comment/widget/captcha/CaptchaManager.java new file mode 100644 index 0000000..9e92172 --- /dev/null +++ b/src/main/java/run/halo/comment/widget/captcha/CaptchaManager.java @@ -0,0 +1,14 @@ +package run.halo.comment.widget.captcha; + +import reactor.core.publisher.Mono; + +public interface CaptchaManager { + Mono verify(String id, String captchaCode); + + Mono invalidate(String id); + + Mono generate(); + + record Captcha(String id, String code, String imageBase64) { + } +} diff --git a/src/main/java/run/halo/comment/widget/captcha/CaptchaManagerImpl.java b/src/main/java/run/halo/comment/widget/captcha/CaptchaManagerImpl.java new file mode 100644 index 0000000..7714774 --- /dev/null +++ b/src/main/java/run/halo/comment/widget/captcha/CaptchaManagerImpl.java @@ -0,0 +1,52 @@ +package run.halo.comment.widget.captcha; + +import java.awt.image.BufferedImage; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; +import reactor.core.scheduler.Schedulers; + +@Component +public class CaptchaManagerImpl implements CaptchaManager { + public static final long CODE_EXPIRATION_MINUTES = 1; + + private final Cache captchaCache = + CacheBuilder.newBuilder() + .expireAfterWrite(CODE_EXPIRATION_MINUTES, TimeUnit.MINUTES) + .maximumSize(100) + .build(); + + @Override + public Mono verify(String key, String captchaCode) { + return Mono.justOrEmpty(captchaCache.getIfPresent(key)) + .filter(captcha -> captcha.code().equalsIgnoreCase(captchaCode)) + .hasElement(); + } + + @Override + public Mono invalidate(String id) { + captchaCache.invalidate(id); + return Mono.empty(); + } + + @Override + public Mono generate() { + var captchaCode = CaptchaGenerator.generateRandomText(); + return Mono.fromSupplier(() -> { + var image = CaptchaGenerator.generateCaptchaImage(captchaCode); + var imageBase64 = encodeBufferedImageToDataUri(image); + var id = UUID.randomUUID().toString(); + return new Captcha(id, captchaCode, imageBase64); + }) + .subscribeOn(Schedulers.boundedElastic()) + .doOnNext(captcha -> captchaCache.put(captcha.id(), captcha)); + } + + private static String encodeBufferedImageToDataUri(BufferedImage image) { + var imageBase64 = CaptchaGenerator.encodeToBase64(image); + return "data:image/png;base64," + imageBase64; + } +} diff --git a/src/main/java/run/halo/comment/widget/captcha/CommentCaptchaFilter.java b/src/main/java/run/halo/comment/widget/captcha/CommentCaptchaFilter.java new file mode 100644 index 0000000..871ffef --- /dev/null +++ b/src/main/java/run/halo/comment/widget/captcha/CommentCaptchaFilter.java @@ -0,0 +1,152 @@ +package run.halo.comment.widget.captcha; + +import static org.springframework.security.web.server.util.matcher.ServerWebExchangeMatchers.pathMatchers; + +import java.net.URI; +import java.util.Locale; +import java.util.Optional; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ProblemDetail; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.http.converter.json.ProblemDetailJacksonMixin; +import org.springframework.lang.NonNull; +import org.springframework.security.config.web.server.SecurityWebFiltersOrder; +import org.springframework.security.web.server.context.ServerSecurityContextRepository; +import org.springframework.security.web.server.util.matcher.OrServerWebExchangeMatcher; +import org.springframework.security.web.server.util.matcher.ServerWebExchangeMatcher; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; +import run.halo.app.infra.AnonymousUserConst; +import run.halo.app.security.AdditionalWebFilter; +import run.halo.comment.widget.SettingConfigGetter; + +@Component +@RequiredArgsConstructor +public class CommentCaptchaFilter implements AdditionalWebFilter { + static final String CAPTCHA_INVALID_TYPE = "https://www.halo.run/probs/captcha-invalid"; + static final String CAPTCHA_REQUIRED_TYPE = "https://www.halo.run/probs/captcha-required"; + private final static String CAPTCHA_CODE_HEADER = "X-Captcha-Code"; + private final static String CAPTCHA_REQUIRED_HEADER = "X-Require-Captcha"; + private static final String CONTENT_TYPE = "application/problem+json"; + + private final ServerWebExchangeMatcher pathMatcher = createPathMatcher(); + private final ObjectMapper objectMapper = createObjectMapper(); + + private final SettingConfigGetter settingConfigGetter; + private final CaptchaManager captchaManager; + private final CaptchaCookieResolverImpl captchaCookieResolver; + private final ServerSecurityContextRepository contextRepository; + + @Override + @NonNull + public Mono filter(@NonNull ServerWebExchange exchange, @NonNull WebFilterChain chain) { + return pathMatcher.matches(exchange) + .filter(ServerWebExchangeMatcher.MatchResult::isMatch) + .flatMap(result -> settingConfigGetter.getSecurityConfig()) + .map(SettingConfigGetter.SecurityConfig::captcha) + .filterWhen(captchaConfig -> isAnonymousCommenter(exchange)) + .switchIfEmpty(chain.filter(exchange).then(Mono.empty())) + .flatMap(captchaConfig -> { + if (!captchaConfig.anonymousCommentCaptcha()) { + return chain.filter(exchange); + } + return validateCaptcha(exchange, chain); + }); + } + + private Mono sendCaptchaRequiredResponse(ServerWebExchange exchange, ResponseStatusException e) { + exchange.getResponse().getHeaders().addIfAbsent(CAPTCHA_REQUIRED_HEADER, "true"); + exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN); + return captchaManager.generate() + .flatMap(captcha -> { + captchaCookieResolver.setCookie(exchange, captcha.id()); + var problemDetail = toProblemDetail(e); + problemDetail.setProperty("captcha", captcha.imageBase64()); + var responseData = getResponseData(problemDetail); + exchange.getResponse().getHeaders().addIfAbsent("Content-Type", CONTENT_TYPE); + return exchange.getResponse() + .writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap(responseData))); + }); + } + + private byte[] getResponseData(ProblemDetail problemDetail) { + try { + return objectMapper.writeValueAsBytes(problemDetail); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + private Mono validateCaptcha(ServerWebExchange exchange, WebFilterChain chain) { + var captchaCodeOpt = getCaptchaCode(exchange); + var cookie = captchaCookieResolver.resolveCookie(exchange); + if (captchaCodeOpt.isEmpty() || cookie == null) { + return sendCaptchaRequiredResponse(exchange, new CaptchaCodeMissingException()); + } + return captchaManager.verify(cookie.getValue(), captchaCodeOpt.get()) + .flatMap(valid -> { + if (valid) { + captchaCookieResolver.expireCookie(exchange); + return chain.filter(exchange); + } + return sendCaptchaRequiredResponse(exchange, new InvalidCaptchaCodeException()); + }); + } + + private static Optional getCaptchaCode(ServerWebExchange exchange) { + var captchaCode = exchange.getRequest().getHeaders().getFirst(CAPTCHA_CODE_HEADER); + return Optional.ofNullable(captchaCode) + .filter(StringUtils::isNotBlank); + } + + private OrServerWebExchangeMatcher createPathMatcher() { + var commentMatcher = pathMatchers(HttpMethod.POST, "/apis/api.halo.run/v1alpha1/comments"); + var replyMatcher = pathMatchers(HttpMethod.POST, "/apis/api.halo.run/v1alpha1/comments/{name}/reply"); + return new OrServerWebExchangeMatcher(commentMatcher, replyMatcher); + } + + static class InvalidCaptchaCodeException extends ResponseStatusException { + public InvalidCaptchaCodeException() { + super(HttpStatus.FORBIDDEN, "验证码错误,请重新输入"); + setType(URI.create(CAPTCHA_INVALID_TYPE)); + } + } + + static class CaptchaCodeMissingException extends ResponseStatusException { + public CaptchaCodeMissingException() { + super(HttpStatus.FORBIDDEN, "请先输入验证码"); + setType(URI.create(CAPTCHA_REQUIRED_TYPE)); + } + } + + ProblemDetail toProblemDetail(ResponseStatusException e) { + var problemDetail = e.updateAndGetBody(null, Locale.getDefault()); + problemDetail.setTitle("Captcha Verification"); + return problemDetail; + } + + static ObjectMapper createObjectMapper() { + return Jackson2ObjectMapperBuilder.json() + .mixIn(ProblemDetail.class, ProblemDetailJacksonMixin.class) + .build(); + } + + Mono isAnonymousCommenter(ServerWebExchange exchange) { + return contextRepository.load(exchange) + .map(context -> AnonymousUserConst.isAnonymousUser(context.getAuthentication().getName())) + .defaultIfEmpty(true); + } + + @Override + public int getOrder() { + return SecurityWebFiltersOrder.AUTHORIZATION.getOrder(); + } +} diff --git a/src/main/resources/extensions/settings.yaml b/src/main/resources/extensions/settings.yaml index 3939d92..1b86364 100644 --- a/src/main/resources/extensions/settings.yaml +++ b/src/main/resources/extensions/settings.yaml @@ -31,6 +31,19 @@ spec: key: withReplySize validation: required value: 5 + - group: security + label: 安全设置 + formSchema: + - $formkit: group + name: captcha + label: 验证码 + children: + - $formkit: checkbox + label: 匿名评论需要验证码 + name: anonymousCommentCaptcha + id: anonymousCommentCaptcha + key: anonymousCommentCaptcha + value: false - group: avatar label: 头像设置 formSchema: diff --git a/src/main/resources/fonts/Arial_Bold.ttf b/src/main/resources/fonts/Arial_Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c2eb3ddd58da212eb33855c09d3e5a38416bb3f7 GIT binary patch literal 286620 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�txgf(&{A;%U5$7 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 literal 0 HcmV?d00001 From d490806398377be0a310e81381237f2588db5b40 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Tue, 18 Jun 2024 14:55:08 +0800 Subject: [PATCH 2/6] Refine UI Signed-off-by: Ryan Wang --- packages/comment-widget/src/base-form.ts | 58 +- packages/comment-widget/src/comment-form.ts | 37 +- packages/comment-widget/src/utils/captcha.ts | 1 - pnpm-lock.yaml | 2191 +++++++++-------- .../widget/captcha/CaptchaGenerator.java | 6 +- 5 files changed, 1245 insertions(+), 1048 deletions(-) diff --git a/packages/comment-widget/src/base-form.ts b/packages/comment-widget/src/base-form.ts index 62de873..1a7ac12 100644 --- a/packages/comment-widget/src/base-form.ts +++ b/packages/comment-widget/src/base-form.ts @@ -1,5 +1,7 @@ -import './emoji-button'; +import type { User } from '@halo-dev/api-client'; +import { consume } from '@lit/context'; import { css, html, LitElement } from 'lit'; +import { property, state } from 'lit/decorators.js'; import { createRef, Ref, ref } from 'lit/directives/ref.js'; import { allowAnonymousCommentsContext, @@ -9,12 +11,10 @@ import { kindContext, nameContext, } from './context'; -import { property, state } from 'lit/decorators.js'; -import type { User } from '@halo-dev/api-client'; +import './emoji-button'; +import './icons/icon-loading'; import baseStyles from './styles/base'; -import { consume } from '@lit/context'; import varStyles from './styles/var'; -import './icons/icon-loading'; export class BaseForm extends LitElement { @consume({ context: baseUrlContext }) @@ -41,21 +41,12 @@ export class BaseForm extends LitElement { @state() name = ''; - @property({ type: Boolean }) - captchaRequired = false; - @property({ type: String }) - captchaImage = ''; + captcha = ''; @property({ type: Boolean }) submitting = false; - @property({ type: String }) - captchaCode = ''; - - @property({ type: String }) - captchaCodeMsg = ''; - textareaRef: Ref = createRef(); get customAccount() { @@ -179,16 +170,6 @@ export class BaseForm extends LitElement { placeholder="网站" /> (已有该站点的账号) -
- - ${this.captchaCodeMsg} - captcha -
` : ''} @@ -204,6 +185,15 @@ export class BaseForm extends LitElement { ` : ''}
+ ${this.captcha + ? html` +
+ + captcha +
+ ` + : ''} + ` : ''}
- ${this.captcha + ${this.showCaptcha ? html`
- captcha + captcha
` : ''} diff --git a/packages/comment-widget/src/comment-form.ts b/packages/comment-widget/src/comment-form.ts index 19c79dc..197b1fd 100644 --- a/packages/comment-widget/src/comment-form.ts +++ b/packages/comment-widget/src/comment-form.ts @@ -127,7 +127,7 @@ export class CommentForm extends LitElement { return; } - this.captcha = ''; + this.baseFormRef.value?.handleFetchCaptcha(); if (!response.ok) { throw new Error('评论失败,请稍后重试'); diff --git a/packages/comment-widget/src/comment-widget.ts b/packages/comment-widget/src/comment-widget.ts index f349d94..2f92f13 100644 --- a/packages/comment-widget/src/comment-widget.ts +++ b/packages/comment-widget/src/comment-widget.ts @@ -1,11 +1,26 @@ -import { css, html, LitElement } from 'lit'; -import { property, state } from 'lit/decorators.js'; import { CommentVoList, User } from '@halo-dev/api-client'; -import { repeat } from 'lit/directives/repeat.js'; -import baseStyles from './styles/base'; import { provide } from '@lit/context'; +import { LitElement, css, html } from 'lit'; +import { property, state } from 'lit/decorators.js'; +import { repeat } from 'lit/directives/repeat.js'; import { + AllUserPolicy, + AnonymousUserPolicy, + AvatarPolicyEnum, + NoAvatarUserPolicy, + setPolicyInstance, +} from './avatar/avatar-policy'; +import { setAvatarProvider } from './avatar/providers'; +import './comment-form'; +import './comment-item'; +import './comment-pagination'; +import { + allowAnonymousCommentsContext, + avatarPolicyContext, + avatarProviderContext, + avatarProviderMirrorContext, baseUrlContext, + captchaEnabledContext, currentUserContext, emojiDataUrlContext, groupContext, @@ -13,27 +28,13 @@ import { nameContext, replySizeContext, toastContext, + useAvatarProviderContext, versionContext, withRepliesContext, - allowAnonymousCommentsContext, - useAvatarProviderContext, - avatarPolicyContext, - avatarProviderContext, - avatarProviderMirrorContext, } from './context'; -import './comment-form'; -import './comment-item'; -import './comment-pagination'; -import varStyles from './styles/var'; import { ToastManager } from './lit-toast'; -import { - AnonymousUserPolicy, - AllUserPolicy, - NoAvatarUserPolicy, - AvatarPolicyEnum, - setPolicyInstance, -} from './avatar/avatar-policy'; -import { setAvatarProvider } from './avatar/providers'; +import baseStyles from './styles/base'; +import varStyles from './styles/var'; export class CommentWidget extends LitElement { @provide({ context: baseUrlContext }) @@ -98,6 +99,10 @@ export class CommentWidget extends LitElement { @state() allowAnonymousComments = false; + @provide({ context: captchaEnabledContext }) + @property({ type: Boolean, attribute: 'enable-captcha' }) + captchaEnabled = false; + @provide({ context: toastContext }) @state() toastManager: ToastManager | undefined; diff --git a/packages/comment-widget/src/context/index.ts b/packages/comment-widget/src/context/index.ts index 5d7d01b..d35c564 100644 --- a/packages/comment-widget/src/context/index.ts +++ b/packages/comment-widget/src/context/index.ts @@ -18,6 +18,8 @@ export const allowAnonymousCommentsContext = createContext( Symbol('allowAnonymousComments') ); +export const captchaEnabledContext = createContext(Symbol('captchaEnabledContext')); + export const currentUserContext = createContext(Symbol('currentUser')); export const emojiDataUrlContext = createContext(Symbol('emojiDataUrl')); diff --git a/packages/comment-widget/src/reply-form.ts b/packages/comment-widget/src/reply-form.ts index 0ffc5c8..5c5f79a 100644 --- a/packages/comment-widget/src/reply-form.ts +++ b/packages/comment-widget/src/reply-form.ts @@ -123,7 +123,7 @@ export class ReplyForm extends LitElement { return; } - this.captcha = ''; + this.baseFormRef.value?.handleFetchCaptcha(); if (!response.ok) { throw new Error('评论失败,请稍后重试'); diff --git a/packages/widget/src/index.ts b/packages/widget/src/index.ts index 1e32d95..4aa74f8 100644 --- a/packages/widget/src/index.ts +++ b/packages/widget/src/index.ts @@ -15,6 +15,7 @@ interface Props { avatarProvider?: string; avatarProviderMirror?: string; avatarPolicy?: string; + captchaEnabled: boolean; } export function init(el: string, props: Props) { @@ -42,6 +43,7 @@ export function init(el: string, props: Props) { commentWidget.avatarProvider = props.avatarProvider || ''; commentWidget.avatarProviderMirror = props.avatarProviderMirror || ''; commentWidget.avatarPolicy = props.avatarPolicy || ''; + commentWidget.captchaEnabled = props.captchaEnabled || false; const observer = new IntersectionObserver((entries) => { entries.forEach((entry) => { diff --git a/src/main/java/run/halo/comment/widget/DefaultCommentWidget.java b/src/main/java/run/halo/comment/widget/DefaultCommentWidget.java index 13a5bc2..c30aa8d 100644 --- a/src/main/java/run/halo/comment/widget/DefaultCommentWidget.java +++ b/src/main/java/run/halo/comment/widget/DefaultCommentWidget.java @@ -84,7 +84,7 @@ private String commentHtml(IAttribute groupAttribute, IAttribute kindAttribute, .map(SettingConfigGetter.CaptchaConfig::anonymousCommentCaptcha) .blockOptional() .orElse(false); - properties.setProperty("enableCaptcha", String.valueOf(captcha)); + properties.setProperty("captchaEnabled", String.valueOf(captcha)); // placeholderHelper only support string, so we need to convert boolean to string return PROPERTY_PLACEHOLDER_HELPER.replacePlaceholders(""" @@ -104,7 +104,7 @@ private String commentHtml(IAttribute groupAttribute, IAttribute kindAttribute, avatarProvider: "${avatarProvider}", avatarProviderMirror: "${avatarProviderMirror}", avatarPolicy: "${avatarPolicy}", - enableCaptcha: ${enableCaptcha}, + captchaEnabled: ${captchaEnabled}, } ); diff --git a/src/main/resources/extensions/role-templates.yaml b/src/main/resources/extensions/role-templates.yaml index 859403a..9524cc7 100644 --- a/src/main/resources/extensions/role-templates.yaml +++ b/src/main/resources/extensions/role-templates.yaml @@ -9,6 +9,6 @@ metadata: rbac.authorization.halo.run/module: "Comment Widget" rbac.authorization.halo.run/display-name: "Comment Widget Public APIs" rules: - - apiGroups: [ "api.commentwidget.halo.run/v1alpha1" ] + - apiGroups: [ "api.commentwidget.halo.run" ] resources: [ "captcha/generate" ] verbs: [ "get" ] From 474d5d5964602858c497bb3651c41362a01fa750 Mon Sep 17 00:00:00 2001 From: guqing Date: Tue, 18 Jun 2024 17:21:54 +0800 Subject: [PATCH 6/6] feat: support arithmetic captcha generation with random operators --- .../comment/widget/DefaultCommentWidget.java | 4 +- .../comment/widget/SettingConfigGetter.java | 38 +++++++++- .../widget/captcha/CaptchaEndpoint.java | 6 +- .../widget/captcha/CaptchaGenerator.java | 72 ++++++++++++++++--- .../widget/captcha/CaptchaManager.java | 2 +- .../widget/captcha/CaptchaManagerImpl.java | 16 +++-- .../comment/widget/captcha/CaptchaType.java | 6 ++ .../widget/captcha/CommentCaptchaFilter.java | 20 +++--- src/main/resources/extensions/settings.yaml | 10 +++ 9 files changed, 141 insertions(+), 33 deletions(-) create mode 100644 src/main/java/run/halo/comment/widget/captcha/CaptchaType.java diff --git a/src/main/java/run/halo/comment/widget/DefaultCommentWidget.java b/src/main/java/run/halo/comment/widget/DefaultCommentWidget.java index c30aa8d..baeb9f5 100644 --- a/src/main/java/run/halo/comment/widget/DefaultCommentWidget.java +++ b/src/main/java/run/halo/comment/widget/DefaultCommentWidget.java @@ -80,8 +80,8 @@ private String commentHtml(IAttribute groupAttribute, IAttribute kindAttribute, properties.setProperty("avatarPolicy", String.valueOf(avatarConfig.getPolicy())); var captcha = settingConfigGetter.getSecurityConfig() - .map(SettingConfigGetter.SecurityConfig::captcha) - .map(SettingConfigGetter.CaptchaConfig::anonymousCommentCaptcha) + .map(SettingConfigGetter.SecurityConfig::getCaptcha) + .map(SettingConfigGetter.CaptchaConfig::isAnonymousCommentCaptcha) .blockOptional() .orElse(false); properties.setProperty("captchaEnabled", String.valueOf(captcha)); diff --git a/src/main/java/run/halo/comment/widget/SettingConfigGetter.java b/src/main/java/run/halo/comment/widget/SettingConfigGetter.java index f9c013c..1b20d3f 100644 --- a/src/main/java/run/halo/comment/widget/SettingConfigGetter.java +++ b/src/main/java/run/halo/comment/widget/SettingConfigGetter.java @@ -1,17 +1,49 @@ package run.halo.comment.widget; +import lombok.Data; +import lombok.Getter; +import lombok.experimental.Accessors; +import org.springframework.lang.NonNull; import reactor.core.publisher.Mono; +import run.halo.comment.widget.captcha.CaptchaType; public interface SettingConfigGetter { Mono getSecurityConfig(); - record SecurityConfig(CaptchaConfig captcha) { + @Data + @Accessors(chain = true) + class SecurityConfig { + @Getter(onMethod_ = @NonNull) + private CaptchaConfig captcha; + + public SecurityConfig setCaptcha(CaptchaConfig captcha) { + this.captcha = (captcha == null ? CaptchaConfig.empty() : captcha); + return this; + } + public static SecurityConfig empty() { - return new SecurityConfig(new CaptchaConfig(false)); + return new SecurityConfig() + .setCaptcha(CaptchaConfig.empty()); } } - record CaptchaConfig(boolean anonymousCommentCaptcha) { + @Data + @Accessors(chain = true) + class CaptchaConfig { + + private boolean anonymousCommentCaptcha; + + @Getter(onMethod_ = @NonNull) + private CaptchaType type = CaptchaType.ALPHANUMERIC; + + public CaptchaConfig setType(CaptchaType type) { + this.type = (type == null ? CaptchaType.ALPHANUMERIC : type); + return this; + } + + public static CaptchaConfig empty() { + return new CaptchaConfig(); + } } } diff --git a/src/main/java/run/halo/comment/widget/captcha/CaptchaEndpoint.java b/src/main/java/run/halo/comment/widget/captcha/CaptchaEndpoint.java index 78cd3e6..18edb95 100644 --- a/src/main/java/run/halo/comment/widget/captcha/CaptchaEndpoint.java +++ b/src/main/java/run/halo/comment/widget/captcha/CaptchaEndpoint.java @@ -9,12 +9,14 @@ import reactor.core.publisher.Mono; import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.extension.GroupVersion; +import run.halo.comment.widget.SettingConfigGetter; @Component @RequiredArgsConstructor public class CaptchaEndpoint implements CustomEndpoint { private final CaptchaManager captchaManager; + private final SettingConfigGetter settingConfigGetter; @Override public RouterFunction endpoint() { @@ -24,7 +26,9 @@ public RouterFunction endpoint() { } private Mono generateCaptcha(ServerRequest request) { - return captchaManager.generate(request.exchange()) + return settingConfigGetter.getSecurityConfig() + .map(SettingConfigGetter.SecurityConfig::getCaptcha) + .flatMap(captchaConfig -> captchaManager.generate(request.exchange(), captchaConfig.getType())) .flatMap(captcha -> ServerResponse.ok().bodyValue(captcha.imageBase64())); } diff --git a/src/main/java/run/halo/comment/widget/captcha/CaptchaGenerator.java b/src/main/java/run/halo/comment/widget/captcha/CaptchaGenerator.java index 340bee9..ea5d651 100644 --- a/src/main/java/run/halo/comment/widget/captcha/CaptchaGenerator.java +++ b/src/main/java/run/halo/comment/widget/captcha/CaptchaGenerator.java @@ -8,9 +8,9 @@ import java.io.InputStream; import java.util.Base64; import java.util.Random; +import java.util.function.Function; import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; -import org.springframework.util.Assert; @Slf4j @UtilityClass @@ -26,8 +26,15 @@ public class CaptchaGenerator { customFont = loadArialFont(); } - public static BufferedImage generateCaptchaImage(String captchaText) { - Assert.hasText(captchaText, "Captcha text must not be blank"); + public static Captcha generateMathCaptcha() { + return generateCaptchaImage(CaptchaGenerator::drawMathCaptchaText); + } + + public static Captcha generateSimpleCaptcha() { + return generateCaptchaImage(CaptchaGenerator::drawSimpleText); + } + + private static Captcha generateCaptchaImage(Function drawCaptchaTextFunc) { BufferedImage bufferedImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = bufferedImage.createGraphics(); @@ -37,14 +44,10 @@ public static BufferedImage generateCaptchaImage(String captchaText) { g2d.setFont(customFont); - // draw captcha text - Random random = new Random(); - for (int i = 0; i < captchaText.length(); i++) { - g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); - g2d.drawString(String.valueOf(captchaText.charAt(i)), 20 + i * 24, 30); - } + var captchaText = drawCaptchaTextFunc.apply(g2d); // add some noise + Random random = new Random(); for (int i = 0; i < 10; i++) { g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); int x1 = random.nextInt(WIDTH); @@ -55,7 +58,48 @@ public static BufferedImage generateCaptchaImage(String captchaText) { } g2d.dispose(); - return bufferedImage; + return new Captcha(captchaText, bufferedImage); + } + + private static String drawMathCaptchaText(Graphics2D g2d) { + Random random = new Random(); + int num1 = random.nextInt(90) + 1; + int num2 = random.nextInt(90) + 1; + char operator = getRandomOperator(); + + int result; + String mathText = switch (operator) { + case '+' -> { + result = num1 + num2; + yield num1 + " + " + num2 + " = ?"; + } + case '-' -> { + result = num1 - num2; + yield num1 + " - " + num2 + " = ?"; + } + case '*' -> { + result = num1 * num2; + yield num1 + " * " + num2 + " = ?"; + } + default -> throw new IllegalStateException("Unexpected value: " + operator); + }; + + g2d.setColor(Color.BLACK); + g2d.drawString(mathText, 20, 30); + return String.valueOf(result); + } + + public record Captcha(String code, BufferedImage image) { + } + + private static String drawSimpleText(Graphics2D g2d) { + var captchaText = generateRandomText(); + Random random = new Random(); + for (int i = 0; i < captchaText.length(); i++) { + g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); + g2d.drawString(String.valueOf(captchaText.charAt(i)), 20 + i * 24, 30); + } + return captchaText; } private static Font loadArialFont() { @@ -71,7 +115,13 @@ private static Font loadArialFont() { } } - public static String generateRandomText() { + private static char getRandomOperator() { + char[] operators = {'+', '-', '*'}; + Random random = new Random(); + return operators[random.nextInt(operators.length)]; + } + + private static String generateRandomText() { StringBuilder sb = new StringBuilder(CHAR_LENGTH); Random random = new Random(); for (int i = 0; i < CHAR_LENGTH; i++) { diff --git a/src/main/java/run/halo/comment/widget/captcha/CaptchaManager.java b/src/main/java/run/halo/comment/widget/captcha/CaptchaManager.java index 3926bd0..6a6ab10 100644 --- a/src/main/java/run/halo/comment/widget/captcha/CaptchaManager.java +++ b/src/main/java/run/halo/comment/widget/captcha/CaptchaManager.java @@ -8,7 +8,7 @@ public interface CaptchaManager { Mono invalidate(String id); - Mono generate(ServerWebExchange exchange); + Mono generate(ServerWebExchange exchange, CaptchaType type); record Captcha(String id, String code, String imageBase64) { } diff --git a/src/main/java/run/halo/comment/widget/captcha/CaptchaManagerImpl.java b/src/main/java/run/halo/comment/widget/captcha/CaptchaManagerImpl.java index 4c65787..7c20373 100644 --- a/src/main/java/run/halo/comment/widget/captcha/CaptchaManagerImpl.java +++ b/src/main/java/run/halo/comment/widget/captcha/CaptchaManagerImpl.java @@ -38,18 +38,20 @@ public Mono invalidate(String id) { } @Override - public Mono generate(ServerWebExchange exchange) { - return doGenerate() + public Mono generate(ServerWebExchange exchange, CaptchaType type) { + return doGenerate(type) .doOnNext(captcha -> captchaCookieResolver.setCookie(exchange, captcha.id())); } - private Mono doGenerate() { - var captchaCode = CaptchaGenerator.generateRandomText(); + private Mono doGenerate(CaptchaType type) { return Mono.fromSupplier(() -> { - var image = CaptchaGenerator.generateCaptchaImage(captchaCode); - var imageBase64 = encodeBufferedImageToDataUri(image); + var captcha = switch (type) { + case ALPHANUMERIC -> CaptchaGenerator.generateSimpleCaptcha(); + case ARITHMETIC -> CaptchaGenerator.generateMathCaptcha(); + }; + var imageBase64 = encodeBufferedImageToDataUri(captcha.image()); var id = UUID.randomUUID().toString(); - return new Captcha(id, captchaCode, imageBase64); + return new Captcha(id, captcha.code(), imageBase64); }) .subscribeOn(Schedulers.boundedElastic()) .doOnNext(captcha -> captchaCache.put(captcha.id(), captcha)); diff --git a/src/main/java/run/halo/comment/widget/captcha/CaptchaType.java b/src/main/java/run/halo/comment/widget/captcha/CaptchaType.java new file mode 100644 index 0000000..5202383 --- /dev/null +++ b/src/main/java/run/halo/comment/widget/captcha/CaptchaType.java @@ -0,0 +1,6 @@ +package run.halo.comment.widget.captcha; + +public enum CaptchaType { + ALPHANUMERIC, + ARITHMETIC +} diff --git a/src/main/java/run/halo/comment/widget/captcha/CommentCaptchaFilter.java b/src/main/java/run/halo/comment/widget/captcha/CommentCaptchaFilter.java index e4b3098..84e5217 100644 --- a/src/main/java/run/halo/comment/widget/captcha/CommentCaptchaFilter.java +++ b/src/main/java/run/halo/comment/widget/captcha/CommentCaptchaFilter.java @@ -51,21 +51,24 @@ public Mono filter(@NonNull ServerWebExchange exchange, @NonNull WebFilter return pathMatcher.matches(exchange) .filter(ServerWebExchangeMatcher.MatchResult::isMatch) .flatMap(result -> settingConfigGetter.getSecurityConfig()) - .map(SettingConfigGetter.SecurityConfig::captcha) + .map(SettingConfigGetter.SecurityConfig::getCaptcha) .filterWhen(captchaConfig -> isAnonymousCommenter(exchange)) .switchIfEmpty(chain.filter(exchange).then(Mono.empty())) .flatMap(captchaConfig -> { - if (!captchaConfig.anonymousCommentCaptcha()) { + if (!captchaConfig.isAnonymousCommentCaptcha()) { return chain.filter(exchange); } - return validateCaptcha(exchange, chain); + return validateCaptcha(exchange, chain, captchaConfig); }); } - private Mono sendCaptchaRequiredResponse(ServerWebExchange exchange, ResponseStatusException e) { + private Mono sendCaptchaRequiredResponse(ServerWebExchange exchange, + SettingConfigGetter.CaptchaConfig captchaConfig, + ResponseStatusException e) { + var type = captchaConfig.getType(); exchange.getResponse().getHeaders().addIfAbsent(CAPTCHA_REQUIRED_HEADER, "true"); exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN); - return captchaManager.generate(exchange) + return captchaManager.generate(exchange, type) .flatMap(captcha -> { var problemDetail = toProblemDetail(e); problemDetail.setProperty("captcha", captcha.imageBase64()); @@ -84,11 +87,12 @@ private byte[] getResponseData(ProblemDetail problemDetail) { } } - private Mono validateCaptcha(ServerWebExchange exchange, WebFilterChain chain) { + private Mono validateCaptcha(ServerWebExchange exchange, WebFilterChain chain, + SettingConfigGetter.CaptchaConfig captchaConfig) { var captchaCodeOpt = getCaptchaCode(exchange); var cookie = captchaCookieResolver.resolveCookie(exchange); if (captchaCodeOpt.isEmpty() || cookie == null) { - return sendCaptchaRequiredResponse(exchange, new CaptchaCodeMissingException()); + return sendCaptchaRequiredResponse(exchange, captchaConfig, new CaptchaCodeMissingException()); } return captchaManager.verify(cookie.getValue(), captchaCodeOpt.get()) .flatMap(valid -> { @@ -96,7 +100,7 @@ private Mono validateCaptcha(ServerWebExchange exchange, WebFilterChain ch captchaCookieResolver.expireCookie(exchange); return chain.filter(exchange); } - return sendCaptchaRequiredResponse(exchange, new InvalidCaptchaCodeException()); + return sendCaptchaRequiredResponse(exchange, captchaConfig, new InvalidCaptchaCodeException()); }); } diff --git a/src/main/resources/extensions/settings.yaml b/src/main/resources/extensions/settings.yaml index 1b86364..badf54c 100644 --- a/src/main/resources/extensions/settings.yaml +++ b/src/main/resources/extensions/settings.yaml @@ -44,6 +44,16 @@ spec: id: anonymousCommentCaptcha key: anonymousCommentCaptcha value: false + - $formkit: select + label: 验证码类型 + if: "$get(anonymousCommentCaptcha).value === true" + name: type + value: "ALPHANUMERIC" + options: + - label: 字母数字组合 + value: "ALPHANUMERIC" + - label: 算术验证码 + value: "ARITHMETIC" - group: avatar label: 头像设置 formSchema: