Phase 1: Add ESLint/Prettier config + baseline auto-fixes
This commit is contained in:
@@ -25,22 +25,22 @@ module.exports = function(ctx) {
|
||||
}
|
||||
|
||||
const certInfo = JSON.parse(await fsp.readFile(certInfoFile, 'utf8'));
|
||||
const expirationDate = new Date(certInfo.validUntil);
|
||||
const daysUntilExpiration = Math.floor((expirationDate - new Date()) / (1000 * 60 * 60 * 24));
|
||||
const expirationDate = new Date(certInfo.validUntil);
|
||||
const daysUntilExpiration = Math.floor((expirationDate - new Date()) / (1000 * 60 * 60 * 24));
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
certificate: {
|
||||
name: certInfo.name,
|
||||
fingerprint: certInfo.fingerprint,
|
||||
validFrom: certInfo.validFrom,
|
||||
validUntil: certInfo.validUntil,
|
||||
daysUntilExpiration,
|
||||
algorithm: certInfo.algorithm || 'ECDSA P-256 with SHA-256',
|
||||
serialNumber: certInfo.serialNumber,
|
||||
downloadUrl: `https://ca${ctx.siteConfig.tld}/root.crt`
|
||||
}
|
||||
});
|
||||
res.json({
|
||||
success: true,
|
||||
certificate: {
|
||||
name: certInfo.name,
|
||||
fingerprint: certInfo.fingerprint,
|
||||
validFrom: certInfo.validFrom,
|
||||
validUntil: certInfo.validUntil,
|
||||
daysUntilExpiration,
|
||||
algorithm: certInfo.algorithm || 'ECDSA P-256 with SHA-256',
|
||||
serialNumber: certInfo.serialNumber,
|
||||
downloadUrl: `https://ca${ctx.siteConfig.tld}/root.crt`,
|
||||
},
|
||||
});
|
||||
}, 'ca-info'));
|
||||
|
||||
// Serve root CA certificate directly (works even without DashCA deployed)
|
||||
@@ -99,7 +99,7 @@ module.exports = function(ctx) {
|
||||
// Look for template in multiple locations (packaged app vs dev)
|
||||
const templatePaths = [
|
||||
path.join(__dirname, '..', 'scripts', templateName),
|
||||
path.join('/app', 'scripts', templateName)
|
||||
path.join('/app', 'scripts', templateName),
|
||||
];
|
||||
|
||||
let templateContent;
|
||||
@@ -208,12 +208,12 @@ ${domain.includes('.') ? `DNS.2 = *.${domain}` : ''}`;
|
||||
const serverCertContent = await fsp.readFile(certFile, 'utf8');
|
||||
const intermediateCertContent = await fsp.readFile(intermediateCert, 'utf8');
|
||||
const rootCertContent = await fsp.readFile(rootCert, 'utf8');
|
||||
await fsp.writeFile(fullChainFile, serverCertContent + '\n' + intermediateCertContent + '\n' + rootCertContent);
|
||||
await fsp.writeFile(fullChainFile, `${serverCertContent }\n${ intermediateCertContent }\n${ rootCertContent}`);
|
||||
|
||||
execSync(`openssl pkcs12 -export -out "${pfxFile}" -inkey "${keyFile}" -in "${certFile}" -certfile "${intermediateCert}" -password "pass:${password}"`, { stdio: 'pipe' });
|
||||
|
||||
const keyContent = await fsp.readFile(keyFile, 'utf8');
|
||||
await fsp.writeFile(pemFile, keyContent + '\n' + serverCertContent + '\n' + intermediateCertContent);
|
||||
await fsp.writeFile(pemFile, `${keyContent }\n${ serverCertContent }\n${ intermediateCertContent}`);
|
||||
}
|
||||
|
||||
if (format === 'pfx') {
|
||||
@@ -260,26 +260,26 @@ ${domain.includes('.') ? `DNS.2 = *.${domain}` : ''}`;
|
||||
const certFile = path.join(certsDir, domain, 'server.crt');
|
||||
if (!await exists(certFile)) return null;
|
||||
|
||||
try {
|
||||
const certInfo = execSync(`openssl x509 -in "${certFile}" -noout -subject -dates -fingerprint -sha256`).toString();
|
||||
const subject = certInfo.match(/subject=(.*)/) ? certInfo.match(/subject=(.*)/)[1].trim() : domain;
|
||||
const notBefore = certInfo.match(/notBefore=(.*)/) ? certInfo.match(/notBefore=(.*)/)[1].trim() : '';
|
||||
const notAfter = certInfo.match(/notAfter=(.*)/) ? certInfo.match(/notAfter=(.*)/)[1].trim() : '';
|
||||
const fingerprint = certInfo.match(/Fingerprint=(.*)/) ? certInfo.match(/Fingerprint=(.*)/)[1].trim() : '';
|
||||
try {
|
||||
const certInfo = execSync(`openssl x509 -in "${certFile}" -noout -subject -dates -fingerprint -sha256`).toString();
|
||||
const subject = certInfo.match(/subject=(.*)/) ? certInfo.match(/subject=(.*)/)[1].trim() : domain;
|
||||
const notBefore = certInfo.match(/notBefore=(.*)/) ? certInfo.match(/notBefore=(.*)/)[1].trim() : '';
|
||||
const notAfter = certInfo.match(/notAfter=(.*)/) ? certInfo.match(/notAfter=(.*)/)[1].trim() : '';
|
||||
const fingerprint = certInfo.match(/Fingerprint=(.*)/) ? certInfo.match(/Fingerprint=(.*)/)[1].trim() : '';
|
||||
|
||||
const expirationDate = new Date(notAfter);
|
||||
const daysUntilExpiration = Math.floor((expirationDate - new Date()) / (1000 * 60 * 60 * 24));
|
||||
const expirationDate = new Date(notAfter);
|
||||
const daysUntilExpiration = Math.floor((expirationDate - new Date()) / (1000 * 60 * 60 * 24));
|
||||
|
||||
return {
|
||||
domain, subject,
|
||||
validFrom: notBefore, validUntil: notAfter,
|
||||
daysUntilExpiration, fingerprint,
|
||||
status: daysUntilExpiration < 0 ? 'expired' : daysUntilExpiration < 30 ? 'expiring-soon' : 'valid'
|
||||
};
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}))).filter(Boolean);
|
||||
return {
|
||||
domain, subject,
|
||||
validFrom: notBefore, validUntil: notAfter,
|
||||
daysUntilExpiration, fingerprint,
|
||||
status: daysUntilExpiration < 0 ? 'expired' : daysUntilExpiration < 30 ? 'expiring-soon' : 'valid',
|
||||
};
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}))).filter(Boolean);
|
||||
|
||||
res.json({ success: true, certificates });
|
||||
}, 'ca-certs'));
|
||||
|
||||
Reference in New Issue
Block a user