diff --git a/application/src/main/java/run/halo/app/core/user/service/SignUpData.java b/application/src/main/java/run/halo/app/core/user/service/SignUpData.java index d609fa0cc..0b5c3cba8 100644 --- a/application/src/main/java/run/halo/app/core/user/service/SignUpData.java +++ b/application/src/main/java/run/halo/app/core/user/service/SignUpData.java @@ -1,7 +1,16 @@ package run.halo.app.core.user.service; +import jakarta.validation.Constraint; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import jakarta.validation.Payload; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.Objects; import java.util.Optional; import lombok.Data; import org.springframework.util.MultiValueMap; @@ -14,6 +23,7 @@ import org.springframework.util.StringUtils; * @since 2.20.0 */ @Data +@SignUpData.SignUpDataConstraint public class SignUpData { @NotBlank @@ -30,6 +40,9 @@ public class SignUpData { @NotBlank private String password; + @NotBlank + private String confirmPassword; + public static SignUpData of(MultiValueMap formData) { var form = new SignUpData(); Optional.ofNullable(formData.getFirst("username")) @@ -52,6 +65,41 @@ public class SignUpData { .filter(StringUtils::hasText) .ifPresent(form::setEmailCode); + Optional.ofNullable(formData.getFirst("confirmPassword")) + .filter(StringUtils::hasText) + .ifPresent(form::setConfirmPassword); + return form; } + + @Target({ElementType.TYPE}) + @Retention(RetentionPolicy.RUNTIME) + @Constraint(validatedBy = {SignUpDataConstraintValidator.class}) + public @interface SignUpDataConstraint { + + String message() default ""; + + Class[] groups() default { }; + + Class[] payload() default { }; + + } + + private static class SignUpDataConstraintValidator + implements ConstraintValidator { + + @Override + public boolean isValid(SignUpData signUpData, ConstraintValidatorContext context) { + var isValid = Objects.equals(signUpData.getPassword(), signUpData.getConfirmPassword()); + if (!isValid) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate( + "{signup.error.confirm-password-not-match}" + ) + .addPropertyNode("confirmPassword") + .addConstraintViolation(); + } + return isValid; + } + } } diff --git a/application/src/main/java/run/halo/app/security/preauth/PreAuthSignUpEndpoint.java b/application/src/main/java/run/halo/app/security/preauth/PreAuthSignUpEndpoint.java index 39c0bfc43..4566b03a8 100644 --- a/application/src/main/java/run/halo/app/security/preauth/PreAuthSignUpEndpoint.java +++ b/application/src/main/java/run/halo/app/security/preauth/PreAuthSignUpEndpoint.java @@ -103,8 +103,7 @@ class PreAuthSignUpEndpoint { "emailCode", signUpData.getEmailCode(), true, - // TODO Refine i18n - new String[] {"signup.error.email-captcha.invalid"}, + new String[] {"signup.error.email-code.invalid"}, null, "Invalid Email Code")); } diff --git a/application/src/main/resources/config/i18n/messages.properties b/application/src/main/resources/config/i18n/messages.properties index 8a2e0dca0..d90b894f4 100644 --- a/application/src/main/resources/config/i18n/messages.properties +++ b/application/src/main/resources/config/i18n/messages.properties @@ -82,4 +82,6 @@ problemDetail.attachment.upload.fileSizeExceeded=Make sure the file size is less problemDetail.attachment.upload.fileTypeNotSupported=Unsupported upload of {0} type files. problemDetail.comment.waitingForApproval=Comment is awaiting approval. -title.visibility.identification.private=(Private) \ No newline at end of file +title.visibility.identification.private=(Private) +signup.error.confirm-password-not-match=The confirmation password does not match the password. +signup.error.email-code.invalid=Invalid email code. \ No newline at end of file diff --git a/application/src/main/resources/config/i18n/messages_zh.properties b/application/src/main/resources/config/i18n/messages_zh.properties index fa5699ea0..613e9f7c3 100644 --- a/application/src/main/resources/config/i18n/messages_zh.properties +++ b/application/src/main/resources/config/i18n/messages_zh.properties @@ -54,4 +54,6 @@ problemDetail.attachment.upload.fileSizeExceeded=最大支持上传 {0} 大小 problemDetail.attachment.upload.fileTypeNotSupported=不支持上传 {0} 类型的文件。 problemDetail.comment.waitingForApproval=评论审核中。 -title.visibility.identification.private=(私有) \ No newline at end of file +title.visibility.identification.private=(私有) +signup.error.confirm-password-not-match=确认密码与密码不匹配。 +signup.error.email-code.invalid=邮箱验证码无效。 diff --git a/application/src/main/resources/templates/signup.html b/application/src/main/resources/templates/signup.html index c1937a2d8..2276f5b70 100644 --- a/application/src/main/resources/templates/signup.html +++ b/application/src/main/resources/templates/signup.html @@ -141,13 +141,13 @@
- - - - - +