From 2a50704a7f3be7b304e0e3a221244602bffa814b Mon Sep 17 00:00:00 2001 From: Claudecio Martins Date: Sun, 11 Oct 2026 20:11:45 -0300 Subject: [PATCH] refactor: update PDF seal text, improve CCSP logging, and add signed PDF response aliases --- .../core/pdf/seal/PdfSealThemeRegistry.java | 2 +- .../signer/core/protocol/CcspServer.java | 25 +++++++++++++++++++ .../ui/CyberCoreDesktopApplication.java | 3 +++ sdk/demo/index.html | 7 +++--- sdk/src/pdf-seal-designer.js | 4 +-- sdk/src/signer-sdk.js | 1 + 6 files changed, 36 insertions(+), 6 deletions(-) diff --git a/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/pdf/seal/PdfSealThemeRegistry.java b/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/pdf/seal/PdfSealThemeRegistry.java index 1e67b81..2394154 100644 --- a/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/pdf/seal/PdfSealThemeRegistry.java +++ b/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/pdf/seal/PdfSealThemeRegistry.java @@ -162,7 +162,7 @@ public final class PdfSealThemeRegistry { ${SIGNER_NAME} Doc: ${SIGNER_DOC} • AC: ${CERT_ISSUER} Data/Hora: ${SIGNING_DATE} - Validade jurídica assegurada pela MP nº 2.200-2/2001 + Verifique a autenticidade da assinatura eletrônica em https://validar.iti.gov.br """ )); diff --git a/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/protocol/CcspServer.java b/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/protocol/CcspServer.java index 5e8fd12..91d9939 100644 --- a/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/protocol/CcspServer.java +++ b/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/protocol/CcspServer.java @@ -328,10 +328,14 @@ public class CcspServer { try (InputStream is = exchange.getRequestBody()) { request = objectMapper.readValue(is, CcspRequest.class); } catch (Exception e) { + logger.warn("[CCSP REQ INVÁLIDO] POST /ccsp/v1/sign de Origin: {} | Erro parsing: {}", origin, e.getMessage()); sendCcspError(exchange, 400, null, CcspErrorCode.SIGNATURE_FAILED, "Payload de requisição inválido."); return; } + logger.info("[CCSP REQ] POST /ccsp/v1/sign | Origin: {} | ReqId: {} | App: {} | Op: {} | Algoritmo: {} | CertHint: {}", + origin, request.requestId(), request.applicationId(), request.operation(), request.algorithm(), request.certificateHint()); + // 1. Validação de versão if (!request.isVersionSupported()) { sendCcspError(exchange, 400, request.requestId(), CcspErrorCode.COMMUNICATION_ERROR, @@ -495,10 +499,15 @@ public class CcspServer { try (InputStream is = exchange.getRequestBody()) { request = objectMapper.readValue(is, CcspRequest.class); } catch (Exception e) { + logger.warn("[CCSP REQ INVÁLIDO] POST /ccsp/v1/sign-pdf de Origin: {} | Erro parsing: {}", origin, e.getMessage()); sendCcspError(exchange, 400, null, CcspErrorCode.SIGNATURE_FAILED, "Payload de requisição inválido."); return; } + int pdfLength = request.pdf() != null ? request.pdf().length() : 0; + logger.info("[CCSP REQ] POST /ccsp/v1/sign-pdf | Origin: {} | ReqId: {} | App: {} | Doc: '{}' | Base64: {} chars | CertHint: {}", + origin, request.requestId(), request.applicationId(), request.documentName(), pdfLength, request.certificateHint()); + if (!request.isVersionSupported()) { sendCcspError(exchange, 400, request.requestId(), CcspErrorCode.COMMUNICATION_ERROR, "Versão do protocolo não suportada: " + request.version()); @@ -1028,6 +1037,22 @@ public class CcspServer { try (OutputStream os = exchange.getResponseBody()) { os.write(bytes); } + + String path = exchange.getRequestURI().getPath(); + if (data instanceof CcspResponse resp) { + if ("signed".equalsIgnoreCase(resp.status())) { + logger.info("[CCSP RESP] {} -> HTTP {} | ReqId: {} | Status: signed | Resposta: {} bytes | SHA-256: {}", + path, statusCode, resp.requestId(), bytes.length, resp.sha256() != null ? resp.sha256() : "n/a"); + } else if ("error".equalsIgnoreCase(resp.status())) { + logger.warn("[CCSP RESP ERROR] {} -> HTTP {} | ReqId: {} | Code: {} | Msg: {}", + path, statusCode, resp.requestId(), resp.errorCode(), resp.message()); + } else { + logger.info("[CCSP RESP] {} -> HTTP {} | ReqId: {} | Status: {} | Resposta: {} bytes", + path, statusCode, resp.requestId(), resp.status(), bytes.length); + } + } else { + logger.info("[CCSP RESP] {} -> HTTP {} | Resposta: {} bytes", path, statusCode, bytes.length); + } } private void sendErrorResponse(HttpExchange exchange, int httpStatus, String code, String message) throws IOException { diff --git a/modules/cybercore-ui/src/main/java/br/com/cybercore/signer/ui/CyberCoreDesktopApplication.java b/modules/cybercore-ui/src/main/java/br/com/cybercore/signer/ui/CyberCoreDesktopApplication.java index b8b9f0a..aeaf492 100644 --- a/modules/cybercore-ui/src/main/java/br/com/cybercore/signer/ui/CyberCoreDesktopApplication.java +++ b/modules/cybercore-ui/src/main/java/br/com/cybercore/signer/ui/CyberCoreDesktopApplication.java @@ -425,6 +425,9 @@ public class CyberCoreDesktopApplication extends Application { byte[] digestBytes; if (request.digest() != null && !request.digest().isBlank()) { digestBytes = Base64.getDecoder().decode(request.digest()); + } else if (request.pdf() != null && !request.pdf().isBlank()) { + byte[] rawPdf = Base64.getDecoder().decode(request.pdf()); + digestBytes = MessageDigest.getInstance("SHA-256").digest(rawPdf); } else if (request.challenge() != null && !request.challenge().isBlank()) { digestBytes = MessageDigest.getInstance("SHA-256") .digest(request.challenge().getBytes(StandardCharsets.UTF_8)); diff --git a/sdk/demo/index.html b/sdk/demo/index.html index 0422538..6663392 100644 --- a/sdk/demo/index.html +++ b/sdk/demo/index.html @@ -1250,11 +1250,12 @@ pdfAlert.className = 'alert alert-success'; pdfAlert.textContent = '✓ Documento PDF assinado com sucesso via PAdES (ISO 32000)!'; - currentSignedPdfBase64 = result.signed_pdf; + const signedPdfBase64 = result.signedPdf || result.signed_pdf || ''; + currentSignedPdfBase64 = signedPdfBase64; pdfResultCard.style.display = 'block'; - pdfResultSize.textContent = (result.signed_pdf.length * 0.75 / 1024).toFixed(1) + ' KB'; + pdfResultSize.textContent = (signedPdfBase64.length * 0.75 / 1024).toFixed(1) + ' KB'; pdfResultSha256.textContent = result.sha256 || 'Calculado com sucesso'; - pdfResultBase64.textContent = result.signed_pdf; + pdfResultBase64.textContent = signedPdfBase64; pdfResultCard.scrollIntoView({ behavior: 'smooth' }); } catch (err) { pdfAlert.className = 'alert alert-error'; diff --git a/sdk/src/pdf-seal-designer.js b/sdk/src/pdf-seal-designer.js index 8eeb646..269776a 100644 --- a/sdk/src/pdf-seal-designer.js +++ b/sdk/src/pdf-seal-designer.js @@ -35,8 +35,8 @@ export class PdfSealDesigner { textColor: '#0f172a', iconStyle: 'shield', customLogoBase64: null, - customHeader: 'CYBERCORE • ICP-BRASIL', - customFooter: 'Validade jurídica assegurada pela MP nº 2.200-2/2001', + customHeader: 'DOCUMENTO ASSINADO DIGITALMENTE', + customFooter: 'Verifique a autenticidade da assinatura eletrônica em https://validar.iti.gov.br', customFieldLabel: 'Cargo', customFieldValue: 'Diretor Responsável', defaultCpfMode: 'MASKED', diff --git a/sdk/src/signer-sdk.js b/sdk/src/signer-sdk.js index 9d9eeac..53cf507 100644 --- a/sdk/src/signer-sdk.js +++ b/sdk/src/signer-sdk.js @@ -392,6 +392,7 @@ export class CyberCoreSigner { requestId: resp.request_id, status: resp.status, signedPdf: signedPdfBase64, + signed_pdf: signedPdfBase64, sha256: resp.sha256, signature: resp.signature, certificate: resp.certificate,