diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e82e208..484c015b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ## main(v0.7.2) - fix: worker 增加 `NO_LIMIT_SEND_ROLE` 配置, 加载失败的问题 +- feat: worker 增加 `# ADDRESS_REGEX = "[^a-z.0-9]"` 配置, 用于配置地址的正则表达式 ## v0.7.1 diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index a323b532..3c6de329 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -11,6 +11,7 @@ export const useGlobalState = createGlobalState( title: '', announcement: '', prefix: '', + addressRegex: '', needAuth: false, adminContact: '', enableUserCreateEmail: false, diff --git a/frontend/src/views/common/Login.vue b/frontend/src/views/common/Login.vue index 3a013711..c7ff2ff0 100644 --- a/frontend/src/views/common/Login.vue +++ b/frontend/src/views/common/Login.vue @@ -72,7 +72,7 @@ const { locale, t } = useI18n({ login: 'Login', pleaseGetNewEmail: 'Please login or click "Get New Email" button to get a new email address', getNewEmail: 'Create New Email', - getNewEmailTip1: 'Please input the email you want to use. only allow a-z and 0-9', + getNewEmailTip1: 'Please input the email you want to use. only allow: ', getNewEmailTip2: 'Levaing it blank will generate a random email address.', getNewEmailTip3: 'You can choose a domain from the dropdown list.', credential: 'Email Address Credential', @@ -87,7 +87,7 @@ const { locale, t } = useI18n({ login: '登录', pleaseGetNewEmail: '请"登录"或点击 "注册新邮箱" 按钮来获取一个新的邮箱地址', getNewEmail: '创建新邮箱', - getNewEmailTip1: '请输入你想要使用的邮箱地址, 只允许 a-z, 0-9', + getNewEmailTip1: '请输入你想要使用的邮箱地址, 只允许: ', getNewEmailTip2: '留空将会生成一个随机的邮箱地址。', getNewEmailTip3: '你可以从下拉列表中选择一个域名。', credential: '邮箱地址凭据', @@ -101,6 +101,18 @@ const { locale, t } = useI18n({ } }); +const addressRegex = computed(() => { + try { + if (openSettings.value.addressRegex) { + return new RegExp(openSettings.value.addressRegex, 'g'); + } + } catch (error) { + console.error(error); + message.error(`Invalid addressRegex: ${openSettings.value.addressRegex}`); + } + return /[^a-z0-9]/g; +}); + const generateNameLoading = ref(false); const generateName = async () => { try { @@ -110,7 +122,7 @@ const generateName = async () => { .split('@')[0] .replace(/\s+/g, '.') .replace(/\.{2,}/g, '.') - .replace(/[^a-z0-9]/g, '') + .replace(addressRegex.value, '') .toLowerCase(); } catch (error) { message.error(error.message || "error"); @@ -206,7 +218,7 @@ onMounted(async () => { -

{{ t("getNewEmailTip1") }}

+

{{ t("getNewEmailTip1") + addressRegex.source }}

{{ t("getNewEmailTip2") }}

{{ t("getNewEmailTip3") }}

diff --git a/vitepress-docs/docs/en/cli.md b/vitepress-docs/docs/en/cli.md index 93680bfc..d4ced0c1 100644 --- a/vitepress-docs/docs/en/cli.md +++ b/vitepress-docs/docs/en/cli.md @@ -78,6 +78,8 @@ node_compat = true PREFIX = "tmp" # The mailbox name prefix to be processed # (min, max) length of the adderss, if not set, the default is (1, 30) # ANNOUNCEMENT = "Custom Announcement" +# address name REGEX, if not set, the default is [^a-z0-9] +# ADDRESS_REGEX = "[^a-z0-9]" # MIN_ADDRESS_LEN = 1 # MAX_ADDRESS_LEN = 30 # If you want your site to be private, uncomment below and change your password diff --git a/vitepress-docs/docs/zh/guide/cli/worker.md b/vitepress-docs/docs/zh/guide/cli/worker.md index 6f4df49e..2903b3d9 100644 --- a/vitepress-docs/docs/zh/guide/cli/worker.md +++ b/vitepress-docs/docs/zh/guide/cli/worker.md @@ -46,6 +46,8 @@ node_compat = true PREFIX = "tmp" # 要处理的邮箱名称前缀,不需要后缀可配置为空字符串 # (min, max) adderss的长度,如果不设置,默认为(1, 30) # ANNOUNCEMENT = "Custom Announcement" # 自定义公告 +# address name 的正则表达式,如果不设置,默认为 [^a-z0-9] +# ADDRESS_REGEX = "[^a-z0-9]" # MIN_ADDRESS_LEN = 1 # MAX_ADDRESS_LEN = 30 # 如果你想要你的网站私有,取消下面的注释,并修改密码 diff --git a/worker/src/commom_api.ts b/worker/src/commom_api.ts index 67b709ef..41e03520 100644 --- a/worker/src/commom_api.ts +++ b/worker/src/commom_api.ts @@ -19,6 +19,7 @@ api.get('/open_api/settings', async (c) => { "title": c.env.TITLE, "announcement": getStringValue(c.env.ANNOUNCEMENT), "prefix": c.env.PREFIX, + "addressRegex": getStringValue(c.env.ADDRESS_REGEX), "minAddressLen": getIntValue(c.env.MIN_ADDRESS_LEN, 1), "maxAddressLen": getIntValue(c.env.MAX_ADDRESS_LEN, 30), "defaultDomains": getDefaultDomains(c), diff --git a/worker/src/common.ts b/worker/src/common.ts index c2890ea2..cdc26e41 100644 --- a/worker/src/common.ts +++ b/worker/src/common.ts @@ -5,6 +5,22 @@ import { getBooleanValue, getDomains, getStringValue, getIntValue, getUserRoles, import { HonoCustomType, UserRole } from './types'; import { unbindTelegramByAddress } from './telegram_api/common'; +const DEFAULT_NAME_REGEX = /[^a-z0-9]/g; + +const getNameRegex = (c: Context): RegExp => { + try { + const regex = getStringValue(c.env.ADDRESS_REGEX); + if (!regex) { + return DEFAULT_NAME_REGEX; + } + return new RegExp(regex, 'g'); + } + catch (e) { + console.error("Failed to get address regex", e); + } + return DEFAULT_NAME_REGEX; +} + export const newAddress = async ( c: Context, name: string, domain: string | undefined | null, @@ -14,7 +30,7 @@ export const newAddress = async ( checkAllowDomains: boolean = true ): Promise<{ address: string, jwt: string }> => { // remove special characters - name = name.replace(/[^a-z0-9]/g, '') + name = name.replace(getNameRegex(c), '') // name min length min 1 const minAddressLength = Math.max( checkLengthByConfig ? getIntValue(c.env.MIN_ADDRESS_LEN, 1) : 1, diff --git a/worker/src/types.d.ts b/worker/src/types.d.ts index 9e3fcdc7..e129264e 100644 --- a/worker/src/types.d.ts +++ b/worker/src/types.d.ts @@ -15,6 +15,7 @@ export type Bindings = { TITLE: string | undefined ANNOUNCEMENT: string | undefined | null PREFIX: string | undefined + ADDRESS_REGEX: string | undefined MIN_ADDRESS_LEN: string | number | undefined MAX_ADDRESS_LEN: string | number | undefined DEFAULT_DOMAINS: string | string[] | undefined diff --git a/worker/wrangler.toml.template b/worker/wrangler.toml.template index c57716fe..4185053c 100644 --- a/worker/wrangler.toml.template +++ b/worker/wrangler.toml.template @@ -19,6 +19,8 @@ node_compat = true # TITLE = "Custom Title" # custom title # ANNOUNCEMENT = "Custom Announcement" PREFIX = "tmp" +# address name REGEX, if not set, the default is [^a-z0-9] +# ADDRESS_REGEX = "[^a-z0-9]" # (min, max) length of the adderss, if not set, the default is (1, 30) # MIN_ADDRESS_LEN = 1 # MAX_ADDRESS_LEN = 30