diff --git a/src/config/configuration.interface.ts b/src/config/configuration.interface.ts index bcfa6a1bc..752547a2b 100644 --- a/src/config/configuration.interface.ts +++ b/src/config/configuration.interface.ts @@ -5,6 +5,7 @@ export interface Configuration { meta: { totpServiceName: string; + domainVerificationFile: string; }; caching: { diff --git a/src/config/configuration.ts b/src/config/configuration.ts index a88dd9b89..4cbf2e2bb 100644 --- a/src/config/configuration.ts +++ b/src/config/configuration.ts @@ -11,6 +11,8 @@ const configuration: Configuration = { frontendUrl: process.env.FRONTEND_URL ?? 'http://localhost:3000', meta: { totpServiceName: process.env.TOPT_SERVICE_NAME ?? 'Staart', + domainVerificationFile: + process.env.DOMAIN_VERIFICATION_FILE ?? 'staart-verify.txt', }, caching: { geolocationLruSize: int(process.env.GEOLOCATION_LRU_SIZE, 100), diff --git a/src/modules/domains/domains.module.ts b/src/modules/domains/domains.module.ts index ddbc323f8..f6cf5bf44 100644 --- a/src/modules/domains/domains.module.ts +++ b/src/modules/domains/domains.module.ts @@ -1,4 +1,5 @@ import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; import { DnsModule } from '../dns/dns.module'; import { PrismaModule } from '../prisma/prisma.module'; import { TokensService } from '../tokens/tokens.service'; @@ -6,7 +7,7 @@ import { DomainController } from './domains.controller'; import { DomainsService } from './domains.service'; @Module({ - imports: [PrismaModule, TokensService, DnsModule], + imports: [PrismaModule, TokensService, DnsModule, ConfigModule], controllers: [DomainController], providers: [DomainsService], }) diff --git a/src/modules/domains/domains.service.ts b/src/modules/domains/domains.service.ts index a3b178a2b..c04e193d6 100644 --- a/src/modules/domains/domains.service.ts +++ b/src/modules/domains/domains.service.ts @@ -4,6 +4,7 @@ import { Injectable, UnauthorizedException, } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; import { domains, domainsCreateInput, @@ -11,6 +12,7 @@ import { domainsWhereInput, domainsWhereUniqueInput, } from '@prisma/client'; +import got from 'got'; import { BadRequestError } from 'passport-headerapikey'; import { DnsService } from '../dns/dns.service'; import { Expose } from '../prisma/prisma.interface'; @@ -20,7 +22,6 @@ import { DOMAIN_VERIFICATION_HTML, DOMAIN_VERIFICATION_TXT, } from './domains.constants'; -import got from 'got'; import { DomainVerificationMethods } from './domains.interface'; @Injectable() @@ -29,6 +30,7 @@ export class DomainsService { private prisma: PrismaService, private tokensService: TokensService, private dnsService: DnsService, + private configService: ConfigService, ) {} async createDomain( @@ -96,7 +98,16 @@ export class DomainsService { }); } else throw new BadRequestError('TXT record not found'); } else if (method === DOMAIN_VERIFICATION_HTML) { - if ('ok') { + let verified = false; + try { + const { body } = await got( + `http://${domain.domain}/.well-known/${this.configService.get( + 'meta.domainVerificationFile' ?? 'staart-verify.txt', + )}`, + ); + verified = body.includes(domain.verificationCode); + } catch (error) {} + if (verified) { await this.prisma.domains.update({ where: { id }, data: { isVerified: true },