@bman654/clodex 2.18.8 → 2.18.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -346,7 +346,7 @@ import { join } from "path";
346
346
  // package.json
347
347
  var package_default = {
348
348
  name: "@bman654/clodex",
349
- version: "2.18.8",
349
+ version: "2.18.9",
350
350
  publishConfig: {
351
351
  access: "public"
352
352
  },
@@ -19906,7 +19906,7 @@ var CA_KEY_FILE = "clodex-ca-key.pem";
19906
19906
  var SERVER_CERT_FILE = "api.anthropic.com.pem";
19907
19907
  var SERVER_KEY_FILE = "api.anthropic.com-key.pem";
19908
19908
  var CERT_VERSION_FILE = "version";
19909
- var CERT_VERSION = "1\n";
19909
+ var CERT_VERSION = "2\n";
19910
19910
  function serialNumber() {
19911
19911
  const bytes = randomBytes2(16);
19912
19912
  bytes[0] &= 127;
@@ -19931,6 +19931,31 @@ function writePublic(path, value) {
19931
19931
  writeFileSync7(path, value, { encoding: "utf8", mode: 420 });
19932
19932
  chmodSync5(path, 420);
19933
19933
  }
19934
+ function generateServerCertificate(paths, caCert, caKey) {
19935
+ const caKeyId = caCert.getExtension("subjectKeyIdentifier")?.subjectKeyIdentifier;
19936
+ const serverKeys = forge.pki.rsa.generateKeyPair(2048);
19937
+ const serverCert = forge.pki.createCertificate();
19938
+ serverCert.publicKey = serverKeys.publicKey;
19939
+ serverCert.serialNumber = serialNumber();
19940
+ serverCert.validity.notBefore = new Date(Date.now() - 24 * 60 * 60 * 1e3);
19941
+ serverCert.validity.notAfter = new Date(Date.now() + 825 * 24 * 60 * 60 * 1e3);
19942
+ serverCert.setSubject([{ name: "commonName", value: "api.anthropic.com" }]);
19943
+ serverCert.setIssuer(caCert.subject.attributes);
19944
+ serverCert.setExtensions([
19945
+ { name: "basicConstraints", cA: false, critical: true },
19946
+ { name: "keyUsage", digitalSignature: true, keyEncipherment: true, critical: true },
19947
+ { name: "extKeyUsage", serverAuth: true },
19948
+ { name: "subjectAltName", altNames: [{ type: 2, value: "api.anthropic.com" }] },
19949
+ { name: "subjectKeyIdentifier" },
19950
+ {
19951
+ name: "authorityKeyIdentifier",
19952
+ keyIdentifier: caKeyId ? forge.util.hexToBytes(caKeyId) : caCert.generateSubjectKeyIdentifier().getBytes()
19953
+ }
19954
+ ]);
19955
+ serverCert.sign(caKey, forge.md.sha256.create());
19956
+ writePrivate(paths.serverKey, forge.pki.privateKeyToPem(serverKeys.privateKey));
19957
+ writePublic(paths.serverCert, forge.pki.certificateToPem(serverCert));
19958
+ }
19934
19959
  function generateCertificates(paths) {
19935
19960
  mkdirSync7(paths.dir, { recursive: true, mode: 448 });
19936
19961
  chmodSync5(paths.dir, 448);
@@ -19949,35 +19974,37 @@ function generateCertificates(paths) {
19949
19974
  { name: "subjectKeyIdentifier" }
19950
19975
  ]);
19951
19976
  caCert.sign(caKeys.privateKey, forge.md.sha256.create());
19952
- const serverKeys = forge.pki.rsa.generateKeyPair(2048);
19953
- const serverCert = forge.pki.createCertificate();
19954
- serverCert.publicKey = serverKeys.publicKey;
19955
- serverCert.serialNumber = serialNumber();
19956
- serverCert.validity.notBefore = new Date(Date.now() - 24 * 60 * 60 * 1e3);
19957
- serverCert.validity.notAfter = new Date(Date.now() + 825 * 24 * 60 * 60 * 1e3);
19958
- serverCert.setSubject([{ name: "commonName", value: "api.anthropic.com" }]);
19959
- serverCert.setIssuer(caCert.subject.attributes);
19960
- serverCert.setExtensions([
19961
- { name: "basicConstraints", cA: false, critical: true },
19962
- { name: "keyUsage", digitalSignature: true, keyEncipherment: true, critical: true },
19963
- { name: "extKeyUsage", serverAuth: true },
19964
- { name: "subjectAltName", altNames: [{ type: 2, value: "api.anthropic.com" }] },
19965
- { name: "subjectKeyIdentifier" }
19966
- ]);
19967
- serverCert.sign(caKeys.privateKey, forge.md.sha256.create());
19968
19977
  writePrivate(paths.caKey, forge.pki.privateKeyToPem(caKeys.privateKey));
19969
19978
  writePublic(paths.caCert, forge.pki.certificateToPem(caCert));
19970
- writePrivate(paths.serverKey, forge.pki.privateKeyToPem(serverKeys.privateKey));
19971
- writePublic(paths.serverCert, forge.pki.certificateToPem(serverCert));
19979
+ generateServerCertificate(paths, caCert, caKeys.privateKey);
19972
19980
  writePublic(paths.version, CERT_VERSION);
19973
19981
  }
19982
+ var RENEWAL_BUFFER_MS = 7 * 24 * 60 * 60 * 1e3;
19983
+ function staysValid(cert, now) {
19984
+ return cert.validity.notBefore.getTime() <= now && cert.validity.notAfter.getTime() > now + RENEWAL_BUFFER_MS;
19985
+ }
19986
+ function keyMatchesCertificate(cert, key) {
19987
+ return cert.publicKey.n.compareTo(key.n) === 0;
19988
+ }
19989
+ function loadCurrentCa(paths) {
19990
+ try {
19991
+ const caCert = forge.pki.certificateFromPem(readFileSync12(paths.caCert, "utf8"));
19992
+ const caKey = forge.pki.privateKeyFromPem(readFileSync12(paths.caKey, "utf8"));
19993
+ if (!staysValid(caCert, Date.now())) return null;
19994
+ if (!caCert.verify(caCert)) return null;
19995
+ if (!keyMatchesCertificate(caCert, caKey)) return null;
19996
+ return { caCert, caKey };
19997
+ } catch {
19998
+ return null;
19999
+ }
20000
+ }
19974
20001
  function storedCertificatesAreCurrent(paths) {
19975
20002
  try {
19976
20003
  const ca = forge.pki.certificateFromPem(readFileSync12(paths.caCert, "utf8"));
19977
20004
  const server = forge.pki.certificateFromPem(readFileSync12(paths.serverCert, "utf8"));
20005
+ const serverKey = forge.pki.privateKeyFromPem(readFileSync12(paths.serverKey, "utf8"));
19978
20006
  const now = Date.now();
19979
- const renewalBuffer = 7 * 24 * 60 * 60 * 1e3;
19980
- return ca.validity.notBefore.getTime() <= now && ca.validity.notAfter.getTime() > now + renewalBuffer && server.validity.notBefore.getTime() <= now && server.validity.notAfter.getTime() > now + renewalBuffer && ca.verify(ca) && ca.verify(server);
20007
+ return staysValid(ca, now) && staysValid(server, now) && ca.verify(ca) && ca.verify(server) && keyMatchesCertificate(server, serverKey);
19981
20008
  } catch {
19982
20009
  return false;
19983
20010
  }
@@ -19986,7 +20013,15 @@ function ensureHttpProxyCertificates() {
19986
20013
  const paths = certPaths();
19987
20014
  const required = [paths.caCert, paths.caKey, paths.serverCert, paths.serverKey, paths.version];
19988
20015
  const current = required.every(existsSync6) && readFileSync12(paths.version, "utf8") === CERT_VERSION && storedCertificatesAreCurrent(paths);
19989
- if (!current) generateCertificates(paths);
20016
+ if (!current) {
20017
+ const ca = loadCurrentCa(paths);
20018
+ if (ca) {
20019
+ generateServerCertificate(paths, ca.caCert, ca.caKey);
20020
+ writePublic(paths.version, CERT_VERSION);
20021
+ } else {
20022
+ generateCertificates(paths);
20023
+ }
20024
+ }
19990
20025
  return {
19991
20026
  caCertPath: paths.caCert,
19992
20027
  caCert: readFileSync12(paths.caCert, "utf8"),