icydns/src/guards/management.guard.ts

27 lines
930 B
TypeScript
Raw Normal View History

2022-11-06 14:19:19 +00:00
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { Request } from 'express';
import { timingSafeEqual } from 'crypto';
@Injectable()
2022-11-12 10:14:46 +00:00
export class ManagementGuard implements CanActivate {
2022-11-06 14:19:19 +00:00
constructor(private config: ConfigService) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const request = context.switchToHttp().getRequest<Request>();
2022-11-12 10:14:46 +00:00
const ips = this.config.get<string[]>('managementIPs');
if (ips.length && !ips.includes(request.ip)) return;
const authHeader = request.headers.authorization;
2022-11-06 14:19:19 +00:00
if (!authHeader) return false;
const [base, token] = authHeader.split(' ');
if (!base || base.toLowerCase() !== 'bearer' || !token) return false;
2022-11-12 10:14:46 +00:00
const configured = this.config.get<string>('managementKey');
2022-11-06 14:19:19 +00:00
return timingSafeEqual(Buffer.from(token), Buffer.from(configured));
}
}