Ctrl K
ComunidadGuías…

server/controllers/logs.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import fs from 'node:fs';
import { promisify } from 'node:util';
import type express from 'express';
import { asyncErr, KError } from '../helpers';
import { Access, Account, User } from '../models';

import { obfuscateEmails, obfuscateKeywords, obfuscatePasswords } from './helpers';
import type { IdentifiedRequest } from './routes';

const readFile = promisify(fs.readFile);
const writeFile = promisify(fs.writeFile);

export async function getLogs(req: IdentifiedRequest<any>, res: express.Response) {
    try {
        const { id: userId } = req.user;
        const user = await User.find(userId);

        if (!user?.isAdmin) {
            throw new KError('Administration rights are required', 403);
        }

        let logs = await readFile(process.kresus.logFilePath, 'utf-8');
        const sensitiveKeywords: Set<string> = new Set();
        const passwords: Set<string> = new Set();

        const accounts = await Account.all(userId);
        accounts.forEach(acc => {
            if (acc.accessId) {
                sensitiveKeywords.add(String(acc.accessId));
            }

            if (acc.vendorAccountId) {
                sensitiveKeywords.add(acc.vendorAccountId);
            }

            if (acc.iban) {
                sensitiveKeywords.add(acc.iban);
            }
        });

        const accesses = await Access.all(userId);
        accesses.forEach(acc => {
            acc.fields.forEach(field => {
                if (field.name === 'password') {
                    passwords.add(field.value);
                } else if (field.name === 'login') {
                    sensitiveKeywords.add(field.value);
                }
            });
        });

        if (process.kresus.smtpUser) {
            sensitiveKeywords.add(process.kresus.smtpUser);
        }

        if (process.kresus.smtpPassword) {
            passwords.add(process.kresus.smtpPassword);
        }

        logs = obfuscateKeywords(logs, sensitiveKeywords);
        logs = obfuscatePasswords(logs, passwords);
        logs = obfuscateEmails(logs);

        res.status(200).type('text/plain').send(logs);
    } catch (err) {
        asyncErr(res, err, `when reading logs from ${process.kresus.logFilePath}`);
    }
}

export async function clearLogs(req: IdentifiedRequest<any>, res: express.Response) {
    try {
        const { id: userId } = req.user;
        const user = await User.find(userId);

        if (!user?.isAdmin) {
            throw new KError('Administration rights are required', 403);
        }

        await writeFile(process.kresus.logFilePath, '');
        res.status(200).end();
    } catch (err) {
        asyncErr(res, err, 'when clearing logs');
    }
}