mirror of https://github.com/certd/certd
				
				
				
			Merge remote-tracking branch 'origin/v2-dev-cname-common' into v2-dev-cname-common
						commit
						0c645b6e66
					
				| 
						 | 
				
			
			@ -34,9 +34,10 @@
 | 
			
		|||
  "license": "AGPL-3.0",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "axios": "^1.7.7",
 | 
			
		||||
    "lodash-es": "^4.17.21"
 | 
			
		||||
    "lodash-es": "^4.17.21",
 | 
			
		||||
    "typescript": "^5.4.2"
 | 
			
		||||
  },
 | 
			
		||||
  "workspaces": [
 | 
			
		||||
    "packages/**"
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,22 +1,35 @@
 | 
			
		|||
import { Config, Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';
 | 
			
		||||
import { AppKey, PlusRequestService, verify } from '@certd/plus-core';
 | 
			
		||||
import { logger } from '@certd/basic';
 | 
			
		||||
import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';
 | 
			
		||||
import { AppKey, PlusRequestService } from '@certd/plus-core';
 | 
			
		||||
import { http, HttpRequestConfig, logger } from '@certd/basic';
 | 
			
		||||
import { SysInstallInfo, SysLicenseInfo, SysSettingsService } from '../../settings/index.js';
 | 
			
		||||
import { merge } from 'lodash-es';
 | 
			
		||||
 | 
			
		||||
@Provide()
 | 
			
		||||
@Scope(ScopeEnum.Singleton)
 | 
			
		||||
export class PlusService {
 | 
			
		||||
  @Inject()
 | 
			
		||||
  sysSettingsService: SysSettingsService;
 | 
			
		||||
  @Config('plus.server.baseUrls')
 | 
			
		||||
  plusServerBaseUrls: string[];
 | 
			
		||||
 | 
			
		||||
  plusRequestService: PlusRequestService;
 | 
			
		||||
 | 
			
		||||
  async getPlusRequestService() {
 | 
			
		||||
    const subjectId = await this.getSubjectId();
 | 
			
		||||
    return new PlusRequestService({
 | 
			
		||||
      plusServerBaseUrls: this.plusServerBaseUrls,
 | 
			
		||||
      subjectId,
 | 
			
		||||
    });
 | 
			
		||||
    if (this.plusRequestService) {
 | 
			
		||||
      return this.plusRequestService;
 | 
			
		||||
    }
 | 
			
		||||
    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
 | 
			
		||||
 | 
			
		||||
    const subjectId = installInfo.siteId;
 | 
			
		||||
    const bindUrl = installInfo.bindUrl;
 | 
			
		||||
    const installTime = installInfo.installTime;
 | 
			
		||||
    const saveLicense = async (license: string) => {
 | 
			
		||||
      let licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo);
 | 
			
		||||
      if (!licenseInfo) {
 | 
			
		||||
        licenseInfo = new SysLicenseInfo();
 | 
			
		||||
      }
 | 
			
		||||
      licenseInfo.license = license;
 | 
			
		||||
      await this.sysSettingsService.saveSetting(licenseInfo);
 | 
			
		||||
    };
 | 
			
		||||
    return new PlusRequestService({ subjectId, bindUrl, installTime, saveLicense });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async getSubjectId() {
 | 
			
		||||
| 
						 | 
				
			
			@ -24,82 +37,75 @@ export class PlusService {
 | 
			
		|||
    return installInfo.siteId;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async requestWithoutSign(config: any) {
 | 
			
		||||
  async active(code: string) {
 | 
			
		||||
    const plusRequestService = await this.getPlusRequestService();
 | 
			
		||||
    return await plusRequestService.requestWithoutSign(config);
 | 
			
		||||
  }
 | 
			
		||||
  async request(config: any) {
 | 
			
		||||
    const plusRequestService = await this.getPlusRequestService();
 | 
			
		||||
    return await plusRequestService.request(config);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async active(formData: { code: any; appKey: string; subjectId: string }) {
 | 
			
		||||
    const plusRequestService = await this.getPlusRequestService();
 | 
			
		||||
    return await plusRequestService.requestWithoutSign({
 | 
			
		||||
      url: '/activation/active',
 | 
			
		||||
      method: 'post',
 | 
			
		||||
      data: formData,
 | 
			
		||||
    });
 | 
			
		||||
    return await plusRequestService.active(code);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async updateLicense(license: string) {
 | 
			
		||||
    let licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo);
 | 
			
		||||
    if (!licenseInfo) {
 | 
			
		||||
      licenseInfo = new SysLicenseInfo();
 | 
			
		||||
    }
 | 
			
		||||
    licenseInfo.license = license;
 | 
			
		||||
    await this.sysSettingsService.saveSetting(licenseInfo);
 | 
			
		||||
    const verifyRes = await this.verify();
 | 
			
		||||
    if (!verifyRes.isPlus) {
 | 
			
		||||
      const message = verifyRes.message || '授权码校验失败';
 | 
			
		||||
      logger.error(message);
 | 
			
		||||
      throw new Error(message);
 | 
			
		||||
    }
 | 
			
		||||
    const plusRequestService = await this.getPlusRequestService();
 | 
			
		||||
    await plusRequestService.updateLicense({ license });
 | 
			
		||||
  }
 | 
			
		||||
  async verify() {
 | 
			
		||||
    const licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo);
 | 
			
		||||
    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
 | 
			
		||||
 | 
			
		||||
    const plusRequestService = await this.getPlusRequestService();
 | 
			
		||||
 | 
			
		||||
    return await verify({
 | 
			
		||||
      subjectId: plusRequestService.subjectId,
 | 
			
		||||
      license: licenseInfo.license,
 | 
			
		||||
      plusRequestService: plusRequestService,
 | 
			
		||||
      bindUrl: installInfo?.bindUrl,
 | 
			
		||||
    });
 | 
			
		||||
    const licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo);
 | 
			
		||||
    await plusRequestService.verify({ license: licenseInfo.license });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async bindUrl(subjectId: string, url: string) {
 | 
			
		||||
  async bindUrl(url: string) {
 | 
			
		||||
    const plusRequestService = await this.getPlusRequestService();
 | 
			
		||||
    return await plusRequestService.request({
 | 
			
		||||
      url: '/activation/subject/urlBind',
 | 
			
		||||
      data: {
 | 
			
		||||
        subjectId,
 | 
			
		||||
        appKey: AppKey,
 | 
			
		||||
        url,
 | 
			
		||||
      },
 | 
			
		||||
    });
 | 
			
		||||
    return await plusRequestService.bindUrl(url);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async register() {
 | 
			
		||||
    const plusRequestService = await this.getPlusRequestService();
 | 
			
		||||
    const licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo);
 | 
			
		||||
    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
 | 
			
		||||
    if (!licenseInfo?.license) {
 | 
			
		||||
      //还没有license,注册一个
 | 
			
		||||
      const res = await plusRequestService.requestWithoutSign({
 | 
			
		||||
        url: '/activation/subject/register',
 | 
			
		||||
        data: {
 | 
			
		||||
          appKey: AppKey,
 | 
			
		||||
          subjectId: installInfo.siteId,
 | 
			
		||||
          installTime: installInfo.installTime,
 | 
			
		||||
        },
 | 
			
		||||
      });
 | 
			
		||||
      if (res.license) {
 | 
			
		||||
        await this.updateLicense(res.license);
 | 
			
		||||
        logger.info('站点注册成功');
 | 
			
		||||
      }
 | 
			
		||||
    if (!licenseInfo.license) {
 | 
			
		||||
      await plusRequestService.register();
 | 
			
		||||
      logger.info('站点注册成功');
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async userPreBind(userId: number) {
 | 
			
		||||
    const plusRequestService = await this.getPlusRequestService();
 | 
			
		||||
    await plusRequestService.requestWithoutSign({
 | 
			
		||||
      url: '/activation/subject/preBind',
 | 
			
		||||
      method: 'POST',
 | 
			
		||||
      data: {
 | 
			
		||||
        userId,
 | 
			
		||||
        appKey: AppKey,
 | 
			
		||||
        subjectId: this.getSubjectId(),
 | 
			
		||||
      },
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async sendEmail(email: any) {
 | 
			
		||||
    const plusRequestService = await this.getPlusRequestService();
 | 
			
		||||
    await plusRequestService.request({
 | 
			
		||||
      url: '/activation/emailSend',
 | 
			
		||||
      data: {
 | 
			
		||||
        subject: email.subject,
 | 
			
		||||
        text: email.content,
 | 
			
		||||
        to: email.receivers,
 | 
			
		||||
      },
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async getAccessToken() {
 | 
			
		||||
    const plusRequestService = await this.getPlusRequestService();
 | 
			
		||||
    await this.register();
 | 
			
		||||
    return await plusRequestService.getAccessToken();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async requestWithToken(config: HttpRequestConfig) {
 | 
			
		||||
    const plusRequestService = await this.getPlusRequestService();
 | 
			
		||||
    const token = await this.getAccessToken();
 | 
			
		||||
    merge(config, {
 | 
			
		||||
      baseURL: plusRequestService.getBaseURL(),
 | 
			
		||||
      headers: {
 | 
			
		||||
        Authorization: token,
 | 
			
		||||
      },
 | 
			
		||||
    });
 | 
			
		||||
    return await http.request(config);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,29 @@
 | 
			
		|||
#  key: ./data/ssl/cert.key
 | 
			
		||||
#  cert: ./data/ssl/cert.crt
 | 
			
		||||
#plus:
 | 
			
		||||
#  server:
 | 
			
		||||
#    baseUrl: 'http://127.0.0.1:11007'
 | 
			
		||||
 | 
			
		||||
#flyway:
 | 
			
		||||
#  scriptDir: './db/migration-pg'
 | 
			
		||||
 | 
			
		||||
#typeorm:
 | 
			
		||||
#  dataSource:
 | 
			
		||||
#    default:
 | 
			
		||||
#      type: postgres
 | 
			
		||||
#      host: localhost
 | 
			
		||||
#      port: 5433
 | 
			
		||||
#      username: postgres
 | 
			
		||||
#      password: root
 | 
			
		||||
#      database: postgres
 | 
			
		||||
 | 
			
		||||
typeorm:
 | 
			
		||||
  dataSource:
 | 
			
		||||
    default:
 | 
			
		||||
      database: './data/db-plus-dev.sqlite'
 | 
			
		||||
 | 
			
		||||
# plus server: 'http://127.0.0.1:11007'
 | 
			
		||||
 | 
			
		||||
account:
 | 
			
		||||
  server:
 | 
			
		||||
    baseUrl: 'http://127.0.0.1:1017/subject'
 | 
			
		||||
| 
						 | 
				
			
			@ -10,6 +10,7 @@
 | 
			
		|||
    "commdev": "cross-env NODE_ENV=commdev mwtsc --watch --run @midwayjs/mock/app",
 | 
			
		||||
    "commpro": "cross-env NODE_ENV=commpro mwtsc --watch --run @midwayjs/mock/app",
 | 
			
		||||
    "pgdev": "cross-env NODE_ENV=pgdev mwtsc --watch --run @midwayjs/mock/app",
 | 
			
		||||
    "local-plus": "cross-env NODE_ENV=localplus mwtsc --watch --run @midwayjs/mock/app",
 | 
			
		||||
    "pgpl": "cross-env NODE_ENV=pgpl mwtsc --watch --run @midwayjs/mock/app",
 | 
			
		||||
    "dev-new": "cross-env NODE_ENV=devnew mwtsc --watch --run @midwayjs/mock/app",
 | 
			
		||||
    "rm-db-new": "rimraf ./data/db-new.sqlite",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,5 @@
 | 
			
		|||
import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core';
 | 
			
		||||
import { BaseController, PlusService } from '@certd/lib-server';
 | 
			
		||||
import { AppKey } from '@certd/plus-core';
 | 
			
		||||
import { SysSettingsService } from '@certd/lib-server';
 | 
			
		||||
import { SysInstallInfo } from '@certd/lib-server';
 | 
			
		||||
import { BaseController, PlusService, SysInstallInfo, SysSettingsService } from '@certd/lib-server';
 | 
			
		||||
 | 
			
		||||
export type PreBindUserReq = {
 | 
			
		||||
  userId: number;
 | 
			
		||||
| 
						 | 
				
			
			@ -23,18 +20,8 @@ export class BasicController extends BaseController {
 | 
			
		|||
 | 
			
		||||
  @Post('/preBindUser', { summary: 'sys:settings:edit' })
 | 
			
		||||
  public async preBindUser(@Body(ALL) body: PreBindUserReq) {
 | 
			
		||||
    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
 | 
			
		||||
    // 设置缓存内容
 | 
			
		||||
    await this.plusService.requestWithoutSign({
 | 
			
		||||
      url: '/activation/subject/preBind',
 | 
			
		||||
      method: 'POST',
 | 
			
		||||
      data: {
 | 
			
		||||
        userId: body.userId,
 | 
			
		||||
        appKey: AppKey,
 | 
			
		||||
        subjectId: installInfo.siteId,
 | 
			
		||||
      },
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    await this.plusService.userPreBind(body.userId);
 | 
			
		||||
    return this.ok({});
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,5 @@
 | 
			
		|||
import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core';
 | 
			
		||||
import { BaseController, PlusService, SysInstallInfo, SysSettingsService } from '@certd/lib-server';
 | 
			
		||||
import { AppKey } from '@certd/plus-core';
 | 
			
		||||
import { logger } from '@certd/basic';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -17,23 +15,8 @@ export class SysPlusController extends BaseController {
 | 
			
		|||
  @Post('/active', { summary: 'sys:settings:edit' })
 | 
			
		||||
  async active(@Body(ALL) body) {
 | 
			
		||||
    const { code } = body;
 | 
			
		||||
    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
 | 
			
		||||
    const siteId = installInfo.siteId;
 | 
			
		||||
    const formData = {
 | 
			
		||||
      appKey: AppKey,
 | 
			
		||||
      code,
 | 
			
		||||
      subjectId: siteId,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const res: any = await this.plusService.active(formData);
 | 
			
		||||
 | 
			
		||||
    if (res.code > 0) {
 | 
			
		||||
      logger.error('激活失败', res.message);
 | 
			
		||||
      return this.fail(res.message, 1);
 | 
			
		||||
    }
 | 
			
		||||
    const license = res.data.license;
 | 
			
		||||
 | 
			
		||||
    await this.plusService.updateLicense(license);
 | 
			
		||||
    await this.plusService.active(code);
 | 
			
		||||
 | 
			
		||||
    return this.ok(true);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +25,7 @@ export class SysPlusController extends BaseController {
 | 
			
		|||
    const { url } = body;
 | 
			
		||||
 | 
			
		||||
    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
 | 
			
		||||
    await this.plusService.bindUrl(installInfo.siteId, url);
 | 
			
		||||
    await this.plusService.bindUrl(url);
 | 
			
		||||
 | 
			
		||||
    installInfo.bindUrl = url;
 | 
			
		||||
    await this.sysSettingsService.saveSetting(installInfo);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,14 +49,7 @@ export class EmailService implements IEmailService {
 | 
			
		|||
     *   receivers: string[];
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    await this.plusService.request({
 | 
			
		||||
      url: '/activation/emailSend',
 | 
			
		||||
      data: {
 | 
			
		||||
        subject: email.subject,
 | 
			
		||||
        text: email.content,
 | 
			
		||||
        to: email.receivers,
 | 
			
		||||
      },
 | 
			
		||||
    });
 | 
			
		||||
    await this.plusService.sendEmail(email);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,7 +32,7 @@ export class CommonDnsProvider implements IDnsProvider {
 | 
			
		|||
 | 
			
		||||
    await this.plusService.register();
 | 
			
		||||
 | 
			
		||||
    const res = await this.plusService.requestWithoutSign({
 | 
			
		||||
    const res = await this.plusService.requestWithToken({
 | 
			
		||||
      url: '/activation/certd/cname/recordCreate',
 | 
			
		||||
      data: {
 | 
			
		||||
        subjectId: this.plusService.getSubjectId(),
 | 
			
		||||
| 
						 | 
				
			
			@ -45,7 +45,7 @@ export class CommonDnsProvider implements IDnsProvider {
 | 
			
		|||
    return res;
 | 
			
		||||
  }
 | 
			
		||||
  async removeRecord(options: RemoveRecordOptions<any>) {
 | 
			
		||||
    const res = await this.plusService.requestWithoutSign({
 | 
			
		||||
    const res = await this.plusService.requestWithToken({
 | 
			
		||||
      url: '/activation/certd/cname/recordRemove',
 | 
			
		||||
      data: {
 | 
			
		||||
        subjectId: this.plusService.getSubjectId(),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue