pdf-signature-reader-sl
Version:
Verify digital signatures in PDF documents with content validation and enhanced support for Spanish certificates (FNMT, DNIe, corporate)
186 lines (164 loc) • 5.21 kB
JavaScript
/**
* Utilidades y tipos para pdf-signature-reader
* Proporciona funciones de utilidad y definiciones de tipos
*/
/**
* Verifica si el resultado de verifyPDF es exitoso
* @param {Object} result - Resultado de verifyPDF
* @returns {boolean} true si es exitoso, false si es error
*/
function isVerifyPDFSuccess(result) {
return result && typeof result === 'object' &&
typeof result.verified === 'boolean' &&
!result.error;
}
/**
* Verifica si el resultado de verifyPDF es un error
* @param {Object} result - Resultado de verifyPDF
* @returns {boolean} true si es error, false si es exitoso
*/
function isVerifyPDFError(result) {
return result && typeof result === 'object' &&
result.verified === false &&
result.error instanceof Error;
}
/**
* Obtiene información resumida de una respuesta de verifyPDF
* @param {Object} result - Resultado de verifyPDF
* @returns {Object} Información resumida
*/
function getVerificationSummary(result) {
if (isVerifyPDFError(result)) {
return {
status: 'error',
message: result.message,
verified: false,
signaturesCount: 0
};
}
if (isVerifyPDFSuccess(result)) {
return {
status: 'success',
verified: result.verified,
authenticity: result.authenticity,
integrity: result.integrity,
expired: result.expired,
signaturesCount: result.signatures ? result.signatures.length : 0,
signatures: result.signatures ? result.signatures.map((sig, index) => ({
index,
verified: sig.verified,
authenticity: sig.authenticity,
integrity: sig.integrity,
expired: sig.expired,
signer: sig.meta?.signatureMeta?.name || 'Unknown',
certificatesCount: sig.meta?.certs?.length || 0
})) : []
};
}
return {
status: 'unknown',
verified: false,
signaturesCount: 0
};
}
/**
* Extrae información de certificados de una respuesta
* @param {Object} result - Resultado de verifyPDF
* @returns {Array} Array de información de certificados
*/
function extractCertificatesInfo(result) {
if (!isVerifyPDFSuccess(result) || !result.signatures) {
return [];
}
const certificates = [];
result.signatures.forEach((signature, sigIndex) => {
if (signature.meta && signature.meta.certs) {
signature.meta.certs.forEach((cert, certIndex) => {
certificates.push({
signatureIndex: sigIndex,
certificateIndex: certIndex,
isClientCertificate: cert.clientCertificate || false,
issuer: cert.issuedBy,
subject: cert.issuedTo,
validity: cert.validityPeriod,
commonName: cert.issuedTo?.commonName,
organization: cert.issuedTo?.organizationName,
country: cert.issuedTo?.countryName,
serialNumber: cert.issuedTo?.serialNumber,
issuerOrganization: cert.issuedBy?.organizationName,
issuerCommonName: cert.issuedBy?.commonName
});
});
}
});
return certificates;
}
/**
* Valida si un objeto tiene la estructura de VerifyPDFResponse
* @param {Object} obj - Objeto a validar
* @returns {boolean} true si tiene la estructura correcta
*/
function isValidVerifyPDFResponse(obj) {
if (!obj || typeof obj !== 'object') return false;
const requiredFields = ['verified', 'authenticity', 'integrity', 'expired'];
const hasRequiredFields = requiredFields.every(field =>
typeof obj[field] === 'boolean'
);
if (!hasRequiredFields) return false;
if (obj.signatures && !Array.isArray(obj.signatures)) return false;
if (obj.signatures) {
return obj.signatures.every(sig =>
sig && typeof sig === 'object' &&
typeof sig.verified === 'boolean' &&
typeof sig.authenticity === 'boolean' &&
typeof sig.integrity === 'boolean' &&
typeof sig.expired === 'boolean' &&
sig.meta && typeof sig.meta === 'object'
);
}
return true;
}
/**
* Constantes útiles para trabajar con la librería
*/
const Constants = {
// Estados de verificación
VERIFICATION_STATUS: {
SUCCESS: 'success',
ERROR: 'error',
UNKNOWN: 'unknown'
},
// Tipos de certificados comunes
CERTIFICATE_TYPES: {
FNMT: 'FNMT-RCM',
DNIE: 'DNIE',
EMPRESA: 'empresa'
},
// Campos comunes en certificados
CERTIFICATE_FIELDS: {
COMMON_NAME: 'commonName',
ORGANIZATION: 'organizationName',
COUNTRY: 'countryName',
SERIAL_NUMBER: 'serialNumber',
GIVEN_NAME: 'givenName',
SURNAME: 'surname'
}
};
module.exports = {
// Funciones de utilidad
isVerifyPDFSuccess,
isVerifyPDFError,
getVerificationSummary,
extractCertificatesInfo,
isValidVerifyPDFResponse,
// Constantes
Constants,
// Alias para compatibilidad
utils: {
isSuccess: isVerifyPDFSuccess,
isError: isVerifyPDFError,
getSummary: getVerificationSummary,
getCertificates: extractCertificatesInfo,
validate: isValidVerifyPDFResponse
}
};