chore: parseDomain优化

pull/409/head
xiaojunnuo 2025-05-06 00:14:17 +08:00
parent 11801d8e2e
commit 32be489136
5 changed files with 30 additions and 23 deletions

View File

@ -1,12 +1,15 @@
import { IDomainParser, ISubDomainsGetter } from "./api"; import { IDomainParser, ISubDomainsGetter } from "./api";
//@ts-ignore //@ts-ignore
import psl from "psl"; import psl from "psl";
import { logger, utils } from "@certd/basic"; import { ILogger, utils, logger as globalLogger } from "@certd/basic";
import { resolveDomainBySoaRecord } from "@certd/acme-client";
export class DomainParser implements IDomainParser { export class DomainParser implements IDomainParser {
subDomainsGetter: ISubDomainsGetter; subDomainsGetter: ISubDomainsGetter;
constructor(subDomainsGetter: ISubDomainsGetter) { logger: ILogger;
constructor(subDomainsGetter: ISubDomainsGetter, logger?: ILogger) {
this.subDomainsGetter = subDomainsGetter; this.subDomainsGetter = subDomainsGetter;
this.logger = logger || globalLogger;
} }
parseDomainByPsl(fullDomain: string) { parseDomainByPsl(fullDomain: string) {
@ -18,42 +21,46 @@ export class DomainParser implements IDomainParser {
} }
async parse(fullDomain: string) { async parse(fullDomain: string) {
logger.info(`查找主域名:${fullDomain}`); this.logger.info(`查找主域名:${fullDomain}`);
const cacheKey = `domain_parse:${fullDomain}`; const cacheKey = `domain_parse:${fullDomain}`;
const value = utils.cache.get(cacheKey); const value = utils.cache.get(cacheKey);
if (value) { if (value) {
logger.info(`从缓存获取到主域名:${fullDomain}->${value}`); this.logger.info(`从缓存获取到主域名:${fullDomain}->${value}`);
return value; return value;
} }
// try {
// const mainDomain = await resolveDomainBySoaRecord(fullDomain);
// if (mainDomain) {
// utils.cache.set(cacheKey, mainDomain, {
// ttl: 2 * 60 * 1000,
// });
// logger.info(`获取到主域名:${fullDomain}->${mainDomain}`);
// return mainDomain;
// }
// } catch (e) {
// logger.error("从SOA获取主域名失败", e.message);
// }
const subDomains = await this.subDomainsGetter.getSubDomains(); const subDomains = await this.subDomainsGetter.getSubDomains();
if (subDomains && subDomains.length > 0) { if (subDomains && subDomains.length > 0) {
const fullDomainDot = "." + fullDomain;
for (const subDomain of subDomains) { for (const subDomain of subDomains) {
if (fullDomain.endsWith(subDomain)) { if (fullDomainDot.endsWith("." + subDomain)) {
//找到子域名托管 //找到子域名托管
utils.cache.set(cacheKey, subDomain, { utils.cache.set(cacheKey, subDomain, {
ttl: 2 * 60 * 1000, ttl: 60 * 1000,
}); });
logger.info(`获取到子域名托管域名:${fullDomain}->${subDomain}`); this.logger.info(`获取到子域名托管域名:${fullDomain}->${subDomain}`);
return subDomain; return subDomain;
} }
} }
} }
const res = this.parseDomainByPsl(fullDomain); const res = this.parseDomainByPsl(fullDomain);
logger.info(`从psl获取主域名:${fullDomain}->${res}`); this.logger.info(`从psl获取主域名:${fullDomain}->${res}`);
let soaManDomain = null;
try {
const mainDomain = await resolveDomainBySoaRecord(fullDomain);
if (mainDomain) {
this.logger.info(`从SOA获取到主域名:${fullDomain}->${mainDomain}`);
soaManDomain = mainDomain;
}
} catch (e) {
this.logger.error("从SOA获取主域名失败", e.message);
}
if (soaManDomain && soaManDomain !== res) {
this.logger.warn(`SOA获取的主域名${soaManDomain}和psl获取的主域名(${res})不一致,请确认是否有设置子域名托管`);
}
return res; return res;
} }
} }

View File

@ -28,7 +28,7 @@ export abstract class CertApplyBaseConvertPlugin extends AbstractTaskPlugin {
"2、子域名被通配符包含的不要填写例如www.foo.com已经被*.foo.com包含不要填写www.foo.com\n" + "2、子域名被通配符包含的不要填写例如www.foo.com已经被*.foo.com包含不要填写www.foo.com\n" +
"3、泛域名只能通配*号那一级(*.foo.com的证书不能用于xxx.yyy.foo.com、不能用于foo.com\n" + "3、泛域名只能通配*号那一级(*.foo.com的证书不能用于xxx.yyy.foo.com、不能用于foo.com\n" +
"4、输入一个空格之后再输入下一个 \n" + "4、输入一个空格之后再输入下一个 \n" +
"5、如果配置了子域托管解析,请先[设置托管子域名](#/certd/pipeline/subDomain)", "5、如果配置了子域托管解析,请先[设置托管子域名](#/certd/pipeline/subDomain)",
}) })
domains!: string[]; domains!: string[];

View File

@ -327,7 +327,7 @@ HTTP文件验证不支持泛域名需要配置网站文件上传`,
} }
this.eab = eab; this.eab = eab;
const subDomainsGetter = await this.ctx.serviceGetter.get<ISubDomainsGetter>("subDomainsGetter"); const subDomainsGetter = await this.ctx.serviceGetter.get<ISubDomainsGetter>("subDomainsGetter");
const domainParser = new DomainParser(subDomainsGetter); const domainParser = new DomainParser(subDomainsGetter, this.logger);
this.acme = new AcmeService({ this.acme = new AcmeService({
userId: this.ctx.user.id, userId: this.ctx.user.id,
userContext: this.userContext, userContext: this.userContext,

View File

@ -61,7 +61,7 @@ export class CommonDnsProvider implements IDnsProvider {
domain: options.recordReq.domain, domain: options.recordReq.domain,
hostRecord: options.recordReq.hostRecord, hostRecord: options.recordReq.hostRecord,
recordValue: options.recordReq.value, recordValue: options.recordReq.value,
recordId: options.recordRes.recordId, recordId: options.recordRes?.recordId,
providerId: this.config.id, providerId: this.config.id,
}, },
}); });