83 lines
3.5 KiB
JavaScript
83 lines
3.5 KiB
JavaScript
/**
|
||
* Exemplo 04: Tratamento Estruturado e Acionável de Erros
|
||
*
|
||
* Demonstra como capturar cada erro específico do CCSP/1 e orientar
|
||
* o usuário final com mensagens claras e passos práticos de resolução.
|
||
*/
|
||
|
||
import {
|
||
CyberCoreSigner,
|
||
AgentNotRunningError,
|
||
ApplicationNotAuthorizedError,
|
||
UserCancelledError,
|
||
CertificateNotFoundError,
|
||
CertificateExpiredError,
|
||
CertificateInvalidError,
|
||
PrivateKeyNotAvailableError,
|
||
PinRequiredError,
|
||
PinIncorrectError,
|
||
TokenNotFoundError,
|
||
RequestExpiredError,
|
||
TimeoutError,
|
||
CyberCoreError
|
||
} from '@cybercore/signer-sdk';
|
||
|
||
async function performSigningOperation(signer, certId, fileDigest) {
|
||
try {
|
||
return await signer.sign({
|
||
certificateId: certId,
|
||
digest: fileDigest,
|
||
documentName: 'termo_responsabilidade.pdf'
|
||
});
|
||
} catch (err) {
|
||
if (err instanceof AgentNotRunningError) {
|
||
// O agente local está fechado ou bloqueado
|
||
console.warn('⚠️ AGENTE NÃO DETECTADO:');
|
||
console.warn(err.actionableGuidance);
|
||
// Sugestão de UI: exibir banner com botão "Baixar CyberCore Signer"
|
||
} else if (err instanceof ApplicationNotAuthorizedError) {
|
||
// O usuário clicou em "Rejeitar" no prompt de autorização da aplicação
|
||
console.warn('⚠️ APLICAÇÃO NÃO AUTORIZADA:');
|
||
console.warn('O usuário não autorizou este portal no diálogo de segurança do CyberCore Signer.');
|
||
} else if (err instanceof UserCancelledError) {
|
||
// O usuário cancelou a assinatura explicitamente na janela nativa
|
||
console.info('ℹ️ Assinatura cancelada pelo usuário.');
|
||
} else if (err instanceof CertificateExpiredError) {
|
||
console.error('❌ CERTIFICADO EXPIRADO: O certificado digital selecionado expirou.');
|
||
} else if (err instanceof CertificateInvalidError) {
|
||
console.error('❌ CERTIFICADO INVÁLIDO: O certificado possui estrutura corrompida ou foi revogado.');
|
||
} else if (err instanceof PrivateKeyNotAvailableError) {
|
||
console.error('❌ CHAVE PRIVADA INDISPONÍVEL: A chave privada deste certificado não está acessível no computador.');
|
||
} else if (err instanceof PinIncorrectError) {
|
||
console.error('❌ PIN INCORRETO: O PIN digitado para o token A3 está errado. Cuidado com o bloqueio do dispositivo.');
|
||
} else if (err instanceof PinRequiredError) {
|
||
console.error('❌ PIN OBRIGATÓRIO: É necessário fornecer o PIN do dispositivo criptográfico.');
|
||
} else if (err instanceof TokenNotFoundError) {
|
||
console.error('❌ TOKEN NÃO ENCONTRADO: O token USB ou smart card foi removido da porta USB.');
|
||
} else if (err instanceof RequestExpiredError) {
|
||
console.warn('⚠️ REQUISIÇÃO EXPIRADA: O tempo limite para confirmação do usuário esgotou.');
|
||
} else if (err instanceof TimeoutError) {
|
||
console.error('⏱️ TIMEOUT: O agente demorou mais tempo que o esperado para responder.');
|
||
} else if (err instanceof CyberCoreError) {
|
||
console.error(`⚠️ ERRO DO PROTOCOLO CCSP (${err.code}):`, err.message);
|
||
} else {
|
||
console.error('Erro desconhecido:', err);
|
||
}
|
||
throw err;
|
||
}
|
||
}
|
||
|
||
async function main() {
|
||
const signer = new CyberCoreSigner({ timeoutMs: 15000 });
|
||
const fakeDigest = Buffer.alloc(32, 9).toString('base64');
|
||
|
||
console.log('Testando tratamento de erros com certificado simulado expirado...');
|
||
try {
|
||
await performSigningOperation(signer, 'cert-expirado', fakeDigest);
|
||
} catch {
|
||
console.log('Tratamento de exceções concluído com sucesso.');
|
||
}
|
||
}
|
||
|
||
main().catch(() => {});
|