diff --git a/packages/app-console/src/views/storage/websites.vue b/packages/app-console/src/views/storage/websites.vue index dac0c2c20d..9f0bfe5e4b 100644 --- a/packages/app-console/src/views/storage/websites.vue +++ b/packages/app-console/src/views/storage/websites.vue @@ -95,7 +95,7 @@ 取消 - + 确定 @@ -228,15 +228,26 @@ export default { this.$refs.editForm.validate(async valid => { if (!valid) return + const REGEX_DOMAIN = /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/ + if(REGEX_DOMAIN.test(this.editForm.domain) === false) { + showError('域名格式不正确') + return + } + const params = { website_id: this.editForm._id, domain: this.editForm.domain } + this.loading = true const ret = await websiteAPI.bindDomain(params) + .finally(() => this.loading = false) - if (ret.code) { - showError(ret.error) - return + if (ret.code === 'DOMAIN_NOT_RESOLVEABLE') { + return showError('解析失败,请先对该域名做 CNAME 解析') + } + + if(ret.code === 'DOMAIN_RESOLVED_ERROR') { + return showError('解析错误,请使用正确的 CNAME 解析值') } this.$notify({ diff --git a/packages/system-server/src/constants.ts b/packages/system-server/src/constants.ts index 85cd485486..539b89a527 100644 --- a/packages/system-server/src/constants.ts +++ b/packages/system-server/src/constants.ts @@ -22,6 +22,7 @@ export const BUCKET_QUOTA_MIN = 1 * GB /** regex const */ export const REGEX_BUCKET_NAME = /^[a-z0-9]{1,16}$/ +export const REGEX_DOMAIN = /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/ /** collection name of cloud functions published to app db */ export const CN_PUBLISHED_FUNCTIONS = '__published__functions' diff --git a/packages/system-server/src/handler/website/domain-bind.ts b/packages/system-server/src/handler/website/domain-bind.ts index 7e981617b2..fa4f5720b0 100644 --- a/packages/system-server/src/handler/website/domain-bind.ts +++ b/packages/system-server/src/handler/website/domain-bind.ts @@ -1,11 +1,12 @@ import { ObjectId } from "mongodb" import * as dns from "node:dns" -import { CN_WEBSITE_HOSTING } from "../../constants" +import { CN_WEBSITE_HOSTING, REGEX_DOMAIN } from "../../constants" import { Request, Response } from "express" import { CONST_DICTS } from "../../constants" import { checkPermission } from "../../support/permission" import { IApplicationData } from "../../support/application" import { DatabaseAgent } from "../../db" +import { logger } from "../../support/logger" // import { handleCheckDomain } from "./domain-check" /** @@ -15,8 +16,9 @@ export async function handleBindDomain(req: Request, res: Response) { const db = DatabaseAgent.db const app: IApplicationData = req["parsed-app"] const uid = req["auth"]?.uid - const { domain, website_id } = req.body - + const website_id = req.body?.website_id + const domain = req.body?.domain || '' + // check login if (!uid) { res.status(401).send() @@ -38,18 +40,19 @@ export async function handleBindDomain(req: Request, res: Response) { } // check domain - if (!domain) { + if (REGEX_DOMAIN.test(domain) === false) { return res.status(422).send("invalid domain") } // check domain is available - const dnsPromise = dns.promises - const result = await dnsPromise.resolveCname(domain as string).catch(() => {}) + const resolver = new dns.promises.Resolver({ timeout: 3000, tries: 2 }) + const result = await resolver.resolveCname(domain as string).catch(() => { }) if (!result) { - return res.send({code: 'DOMAIN_NOT_RESOLVEABLE', error: 'domain is not resolveable'}) + return res.send({ code: 'DOMAIN_NOT_RESOLVEABLE', error: 'domain is not resolveable' }) } - if ((result || []).includes(website.cname)) { - return res.send({code: 'DOMAIN_RESOLVED_ERROR', error: 'error resolved result got'}) + + if (false === (result || []).includes(website.cname)) { + return res.send({ code: 'DOMAIN_RESOLVED_ERROR', error: 'error resolved result got' }) } // check if domain is already binded diff --git a/packages/system-server/src/handler/website/website-create.ts b/packages/system-server/src/handler/website/website-create.ts index 5bb3893b99..6b67970039 100644 --- a/packages/system-server/src/handler/website/website-create.ts +++ b/packages/system-server/src/handler/website/website-create.ts @@ -47,8 +47,8 @@ export async function handleCreateWebsite(req: Request, res: Response) { // generate cname url for bucket and appid const endpoint = new URL(Config.MINIO_CONFIG.endpoint.external) - const { host } = endpoint - const cname = `${app.appid}-${bucket}.${host}` + const { hostname } = endpoint + const cname = `${app.appid}-${bucket}.${hostname}` // build website hosting data const doc = {