Browse Source

fix: allow special characters in email (#5327)

Co-authored-by: crazywoola <427733928@qq.com>
Mitsuki Ogasahara 10 months ago
parent
commit
7305713b97

+ 1 - 1
api/libs/helper.py

@@ -25,7 +25,7 @@ class TimestampField(fields.Raw):
 
 def email(email):
     # Define a regex pattern for email addresses
-    pattern = r"^[\w\.-]+@([\w-]+\.)+[\w-]{2,}$"
+    pattern = r"^[\w\.!#$%&'*+\-/=?^_`{|}~]+@([\w-]+\.)+[\w-]{2,}$"
     # Check if the email matches the pattern
     if re.match(pattern, email) is not None:
         return email

+ 25 - 0
api/tests/unit_tests/libs/test_email.py

@@ -0,0 +1,25 @@
+from libs.helper import email
+
+
+def test_email_with_valid_email():
+    assert email("test@example.com") == "test@example.com"
+    assert email("TEST12345@example.com") == "TEST12345@example.com"
+    assert email("test+test@example.com") == "test+test@example.com"
+    assert email("!#$%&'*+-/=?^_{|}~`@example.com") == "!#$%&'*+-/=?^_{|}~`@example.com"
+
+
+def test_email_with_invalid_email():
+    try:
+        email("invalid_email")
+    except ValueError as e:
+        assert str(e) == "invalid_email is not a valid email."
+
+    try:
+        email("@example.com")
+    except ValueError as e:
+        assert str(e) == "@example.com is not a valid email."
+
+    try:
+        email("()@example.com")
+    except ValueError as e:
+        assert str(e) == "()@example.com is not a valid email."

+ 2 - 3
web/app/signin/normalForm.tsx

@@ -7,11 +7,10 @@ import useSWR from 'swr'
 import Link from 'next/link'
 import Toast from '../components/base/toast'
 import style from './page.module.css'
-import { IS_CE_EDITION, SUPPORT_MAIL_LOGIN, apiPrefix } from '@/config'
+import { IS_CE_EDITION, SUPPORT_MAIL_LOGIN, apiPrefix, emailRegex } from '@/config'
 import Button from '@/app/components/base/button'
 import { login, oauth } from '@/service/common'
 import { getPurifyHref } from '@/utils'
-const validEmailReg = /^[\w\.-]+@([\w-]+\.)+[\w-]{2,}$/
 
 type IState = {
   formValid: boolean
@@ -78,7 +77,7 @@ const NormalForm = () => {
 
   const [isLoading, setIsLoading] = useState(false)
   const handleEmailPasswordLogin = async () => {
-    if (!validEmailReg.test(email)) {
+    if (!emailRegex.test(email)) {
       Toast.notify({
         type: 'error',
         message: t('login.error.emailInValid'),

+ 1 - 1
web/config/index.ts

@@ -102,7 +102,7 @@ export const DEFAULT_PARAGRAPH_VALUE_MAX_LEN = 1000
 
 export const zhRegex = /^[\u4E00-\u9FA5]$/m
 export const emojiRegex = /^[\uD800-\uDBFF][\uDC00-\uDFFF]$/m
-export const emailRegex = /^[\w\.-]+@([\w-]+\.)+[\w-]{2,}$/m
+export const emailRegex = /^[\w.!#$%&'*+\-/=?^{|}~]+@([\w-]+\.)+[\w-]{2,}$/m
 const MAX_ZN_VAR_NAME_LENGHT = 8
 const MAX_EN_VAR_VALUE_LENGHT = 30
 export const getMaxVarNameLength = (value: string) => {