From b30f8944c4d53252f87480da613a5fffe498917b Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 21 Jun 2025 23:53:09 +0000 Subject: [PATCH] [autofix.ci] apply automated fixes --- .../dashboard/settings/certificates/utils.ts | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/certificates/utils.ts b/apps/dokploy/components/dashboard/settings/certificates/utils.ts index 5e4cce6d..716087db 100644 --- a/apps/dokploy/components/dashboard/settings/certificates/utils.ts +++ b/apps/dokploy/components/dashboard/settings/certificates/utils.ts @@ -1,15 +1,15 @@ export const extractExpirationDate = (certData: string): Date | null => { try { // Decode PEM base64 to DER binary - const b64 = certData.replace(/-----[^-]+-----/g, '').replace(/\s+/g, ''); + const b64 = certData.replace(/-----[^-]+-----/g, "").replace(/\s+/g, ""); const binStr = atob(b64); const der = new Uint8Array(binStr.length); for (let i = 0; i < binStr.length; i++) { der[i] = binStr.charCodeAt(i); } - + let offset = 0; - + // Helper: read ASN.1 length field function readLength(pos: number): { length: number; offset: number } { let len = der[pos++]; @@ -22,60 +22,67 @@ export const extractExpirationDate = (certData: string): Date | null => { } return { length: len, offset: pos }; } - + // Skip the outer certificate sequence if (der[offset++] !== 0x30) throw new Error("Expected sequence"); ({ offset } = readLength(offset)); - + // Skip tbsCertificate sequence if (der[offset++] !== 0x30) throw new Error("Expected tbsCertificate"); ({ offset } = readLength(offset)); - + // Check for optional version field (context-specific tag [0]) - if (der[offset] === 0xA0) { + if (der[offset] === 0xa0) { offset++; const versionLen = readLength(offset); offset = versionLen.offset + versionLen.length; } - + // Skip serialNumber, signature, issuer for (let i = 0; i < 3; i++) { - if (der[offset] !== 0x30 && der[offset] !== 0x02) throw new Error("Unexpected structure"); + if (der[offset] !== 0x30 && der[offset] !== 0x02) + throw new Error("Unexpected structure"); offset++; const fieldLen = readLength(offset); offset = fieldLen.offset + fieldLen.length; } - + // Validity sequence (notBefore and notAfter) if (der[offset++] !== 0x30) throw new Error("Expected validity sequence"); const validityLen = readLength(offset); offset = validityLen.offset; - + // notBefore offset++; const notBeforeLen = readLength(offset); offset = notBeforeLen.offset + notBeforeLen.length; - + // notAfter offset++; const notAfterLen = readLength(offset); - const notAfterStr = new TextDecoder().decode(der.slice(notAfterLen.offset, notAfterLen.offset + notAfterLen.length)); - + const notAfterStr = new TextDecoder().decode( + der.slice(notAfterLen.offset, notAfterLen.offset + notAfterLen.length), + ); + // Parse GeneralizedTime (15 chars) or UTCTime (13 chars) function parseTime(str: string): Date { if (str.length === 13) { // UTCTime YYMMDDhhmmssZ const year = parseInt(str.slice(0, 2), 10); const fullYear = year < 50 ? 2000 + year : 1900 + year; - return new Date(`${fullYear}-${str.slice(2, 4)}-${str.slice(4, 6)}T${str.slice(6, 8)}:${str.slice(8, 10)}:${str.slice(10, 12)}Z`); + return new Date( + `${fullYear}-${str.slice(2, 4)}-${str.slice(4, 6)}T${str.slice(6, 8)}:${str.slice(8, 10)}:${str.slice(10, 12)}Z`, + ); } else if (str.length === 15) { // GeneralizedTime YYYYMMDDhhmmssZ - return new Date(`${str.slice(0, 4)}-${str.slice(4, 6)}-${str.slice(6, 8)}T${str.slice(8, 10)}:${str.slice(10, 12)}:${str.slice(12, 14)}Z`); + return new Date( + `${str.slice(0, 4)}-${str.slice(4, 6)}-${str.slice(6, 8)}T${str.slice(8, 10)}:${str.slice(10, 12)}:${str.slice(12, 14)}Z`, + ); } else { throw new Error("Invalid ASN.1 time format"); } } - + return parseTime(notAfterStr); } catch (error) { console.error("Error parsing certificate:", error);