@push.rocks/smartproxy 12.0.0 → 13.1.2
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_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/certificate/acme/acme-factory.d.ts +17 -0
- package/dist_ts/certificate/acme/acme-factory.js +40 -0
- package/dist_ts/certificate/acme/challenge-handler.d.ts +44 -0
- package/dist_ts/certificate/acme/challenge-handler.js +92 -0
- package/dist_ts/certificate/acme/index.d.ts +4 -0
- package/dist_ts/certificate/acme/index.js +5 -0
- package/dist_ts/certificate/events/certificate-events.d.ts +33 -0
- package/dist_ts/certificate/events/certificate-events.js +38 -0
- package/dist_ts/certificate/index.d.ts +24 -0
- package/dist_ts/certificate/index.js +39 -0
- package/dist_ts/certificate/models/certificate-types.d.ts +77 -0
- package/dist_ts/certificate/models/certificate-types.js +2 -0
- package/dist_ts/certificate/providers/cert-provisioner.d.ts +93 -0
- package/dist_ts/certificate/providers/cert-provisioner.js +262 -0
- package/dist_ts/certificate/providers/index.d.ts +4 -0
- package/dist_ts/certificate/providers/index.js +5 -0
- package/dist_ts/certificate/storage/file-storage.d.ts +66 -0
- package/dist_ts/certificate/storage/file-storage.js +194 -0
- package/dist_ts/certificate/storage/index.d.ts +4 -0
- package/dist_ts/certificate/storage/index.js +5 -0
- package/dist_ts/certificate/utils/certificate-helpers.d.ts +17 -0
- package/dist_ts/certificate/utils/certificate-helpers.js +45 -0
- package/dist_ts/common/eventUtils.d.ts +1 -1
- package/dist_ts/common/port80-adapter.d.ts +1 -1
- package/dist_ts/core/events/index.d.ts +4 -0
- package/dist_ts/core/events/index.js +5 -0
- package/dist_ts/core/index.d.ts +6 -0
- package/dist_ts/core/index.js +8 -0
- package/dist_ts/core/models/common-types.d.ts +82 -0
- package/dist_ts/core/models/common-types.js +15 -0
- package/dist_ts/core/models/index.d.ts +4 -0
- package/dist_ts/core/models/index.js +5 -0
- package/dist_ts/core/utils/event-utils.d.ts +15 -0
- package/dist_ts/core/utils/event-utils.js +19 -0
- package/dist_ts/core/utils/index.d.ts +6 -0
- package/dist_ts/core/utils/index.js +7 -0
- package/dist_ts/core/utils/ip-utils.d.ts +53 -0
- package/dist_ts/core/utils/ip-utils.js +153 -0
- package/dist_ts/core/utils/validation-utils.d.ts +61 -0
- package/dist_ts/core/utils/validation-utils.js +149 -0
- package/dist_ts/forwarding/config/domain-config.d.ts +12 -0
- package/dist_ts/forwarding/config/domain-config.js +12 -0
- package/dist_ts/forwarding/config/domain-manager.d.ts +86 -0
- package/dist_ts/forwarding/config/domain-manager.js +242 -0
- package/dist_ts/forwarding/config/forwarding-types.d.ts +104 -0
- package/dist_ts/forwarding/config/forwarding-types.js +50 -0
- package/dist_ts/forwarding/config/index.d.ts +6 -0
- package/dist_ts/forwarding/config/index.js +7 -0
- package/dist_ts/forwarding/factory/forwarding-factory.d.ts +25 -0
- package/dist_ts/forwarding/factory/forwarding-factory.js +138 -0
- package/dist_ts/forwarding/factory/index.d.ts +4 -0
- package/dist_ts/forwarding/factory/index.js +5 -0
- package/dist_ts/forwarding/handlers/base-handler.d.ts +55 -0
- package/dist_ts/forwarding/handlers/base-handler.js +94 -0
- package/dist_ts/forwarding/handlers/http-handler.d.ts +30 -0
- package/dist_ts/forwarding/handlers/http-handler.js +131 -0
- package/dist_ts/forwarding/handlers/https-passthrough-handler.d.ts +29 -0
- package/dist_ts/forwarding/handlers/https-passthrough-handler.js +162 -0
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.d.ts +36 -0
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.js +229 -0
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.d.ts +35 -0
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.js +254 -0
- package/dist_ts/forwarding/handlers/index.d.ts +8 -0
- package/dist_ts/forwarding/handlers/index.js +9 -0
- package/dist_ts/forwarding/index.d.ts +19 -0
- package/dist_ts/forwarding/index.js +25 -0
- package/dist_ts/http/index.d.ts +15 -0
- package/dist_ts/http/index.js +20 -0
- package/dist_ts/http/models/http-types.d.ts +81 -0
- package/dist_ts/http/models/http-types.js +62 -0
- package/dist_ts/http/port80/acme-interfaces.d.ts +78 -0
- package/dist_ts/http/port80/acme-interfaces.js +6 -0
- package/dist_ts/http/port80/challenge-responder.d.ts +53 -0
- package/dist_ts/http/port80/challenge-responder.js +203 -0
- package/dist_ts/http/port80/index.d.ts +6 -0
- package/dist_ts/http/port80/index.js +9 -0
- package/dist_ts/http/port80/port80-handler.d.ts +121 -0
- package/dist_ts/http/port80/port80-handler.js +554 -0
- package/dist_ts/http/redirects/index.d.ts +4 -0
- package/dist_ts/http/redirects/index.js +5 -0
- package/dist_ts/http/router/index.d.ts +4 -0
- package/dist_ts/http/router/index.js +5 -0
- package/dist_ts/http/router/proxy-router.d.ts +115 -0
- package/dist_ts/http/router/proxy-router.js +325 -0
- package/dist_ts/index.d.ts +15 -8
- package/dist_ts/index.js +26 -10
- package/dist_ts/networkproxy/classes.np.certificatemanager.js +2 -2
- package/dist_ts/networkproxy/index.d.ts +1 -6
- package/dist_ts/networkproxy/index.js +4 -8
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/port80handler/classes.port80handler.d.ts +8 -136
- package/dist_ts/port80handler/classes.port80handler.js +14 -567
- package/dist_ts/proxies/index.d.ts +6 -0
- package/dist_ts/proxies/index.js +8 -0
- package/dist_ts/proxies/network-proxy/certificate-manager.d.ts +77 -0
- package/dist_ts/proxies/network-proxy/certificate-manager.js +373 -0
- package/dist_ts/proxies/network-proxy/connection-pool.d.ts +47 -0
- package/dist_ts/proxies/network-proxy/connection-pool.js +210 -0
- package/dist_ts/proxies/network-proxy/index.d.ts +10 -0
- package/dist_ts/proxies/network-proxy/index.js +12 -0
- package/dist_ts/proxies/network-proxy/models/index.d.ts +4 -0
- package/dist_ts/proxies/network-proxy/models/index.js +5 -0
- package/dist_ts/proxies/network-proxy/models/types.d.ts +80 -0
- package/dist_ts/proxies/network-proxy/models/types.js +35 -0
- package/dist_ts/proxies/network-proxy/network-proxy.d.ts +118 -0
- package/dist_ts/proxies/network-proxy/network-proxy.js +387 -0
- package/dist_ts/proxies/network-proxy/request-handler.d.ts +57 -0
- package/dist_ts/proxies/network-proxy/request-handler.js +394 -0
- package/dist_ts/proxies/network-proxy/websocket-handler.d.ts +38 -0
- package/dist_ts/proxies/network-proxy/websocket-handler.js +188 -0
- package/dist_ts/proxies/nftables-proxy/index.d.ts +5 -0
- package/dist_ts/proxies/nftables-proxy/index.js +6 -0
- package/dist_ts/proxies/nftables-proxy/models/errors.d.ts +15 -0
- package/dist_ts/proxies/nftables-proxy/models/errors.js +28 -0
- package/dist_ts/proxies/nftables-proxy/models/index.d.ts +5 -0
- package/dist_ts/proxies/nftables-proxy/models/index.js +6 -0
- package/dist_ts/proxies/nftables-proxy/models/interfaces.d.ts +75 -0
- package/dist_ts/proxies/nftables-proxy/models/interfaces.js +5 -0
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.d.ts +136 -0
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.js +1516 -0
- package/dist_ts/proxies/smart-proxy/connection-handler.d.ts +39 -0
- package/dist_ts/proxies/smart-proxy/connection-handler.js +894 -0
- package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +78 -0
- package/dist_ts/proxies/smart-proxy/connection-manager.js +378 -0
- package/dist_ts/proxies/smart-proxy/domain-config-manager.d.ts +95 -0
- package/dist_ts/proxies/smart-proxy/domain-config-manager.js +255 -0
- package/dist_ts/proxies/smart-proxy/index.d.ts +13 -0
- package/dist_ts/proxies/smart-proxy/index.js +17 -0
- package/dist_ts/proxies/smart-proxy/models/index.d.ts +4 -0
- package/dist_ts/proxies/smart-proxy/models/index.js +5 -0
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +107 -0
- package/dist_ts/proxies/smart-proxy/models/interfaces.js +2 -0
- package/dist_ts/proxies/smart-proxy/network-proxy-bridge.d.ts +62 -0
- package/dist_ts/proxies/smart-proxy/network-proxy-bridge.js +316 -0
- package/dist_ts/proxies/smart-proxy/port-range-manager.d.ts +56 -0
- package/dist_ts/proxies/smart-proxy/port-range-manager.js +176 -0
- package/dist_ts/proxies/smart-proxy/security-manager.d.ts +64 -0
- package/dist_ts/proxies/smart-proxy/security-manager.js +149 -0
- package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +63 -0
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +523 -0
- package/dist_ts/proxies/smart-proxy/timeout-manager.d.ts +47 -0
- package/dist_ts/proxies/smart-proxy/timeout-manager.js +154 -0
- package/dist_ts/proxies/smart-proxy/tls-manager.d.ts +57 -0
- package/dist_ts/proxies/smart-proxy/tls-manager.js +132 -0
- package/dist_ts/smartproxy/classes.pp.networkproxybridge.d.ts +2 -2
- package/dist_ts/smartproxy/classes.pp.networkproxybridge.js +1 -1
- package/dist_ts/smartproxy/classes.pp.tlsmanager.js +2 -2
- package/dist_ts/smartproxy/classes.smartproxy.js +3 -3
- package/dist_ts/tls/alerts/index.d.ts +4 -0
- package/dist_ts/tls/alerts/index.js +5 -0
- package/dist_ts/tls/alerts/tls-alert.d.ts +150 -0
- package/dist_ts/tls/alerts/tls-alert.js +226 -0
- package/dist_ts/tls/index.d.ts +18 -0
- package/dist_ts/tls/index.js +27 -0
- package/dist_ts/tls/sni/client-hello-parser.d.ts +100 -0
- package/dist_ts/tls/sni/client-hello-parser.js +463 -0
- package/dist_ts/tls/sni/index.d.ts +4 -0
- package/dist_ts/tls/sni/index.js +5 -0
- package/dist_ts/tls/sni/sni-extraction.d.ts +58 -0
- package/dist_ts/tls/sni/sni-extraction.js +275 -0
- package/dist_ts/tls/sni/sni-handler.d.ts +154 -0
- package/dist_ts/tls/sni/sni-handler.js +191 -0
- package/dist_ts/tls/utils/index.d.ts +4 -0
- package/dist_ts/tls/utils/index.js +5 -0
- package/dist_ts/tls/utils/tls-utils.d.ts +158 -0
- package/dist_ts/tls/utils/tls-utils.js +187 -0
- package/package.json +1 -1
- package/readme.md +89 -21
- package/readme.plan.md +253 -469
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/certificate/acme/acme-factory.ts +48 -0
- package/ts/certificate/acme/challenge-handler.ts +110 -0
- package/ts/certificate/acme/index.ts +3 -0
- package/ts/certificate/events/certificate-events.ts +36 -0
- package/ts/certificate/index.ts +67 -0
- package/ts/certificate/models/certificate-types.ts +88 -0
- package/ts/certificate/providers/cert-provisioner.ts +326 -0
- package/ts/certificate/providers/index.ts +3 -0
- package/ts/certificate/storage/file-storage.ts +234 -0
- package/ts/certificate/storage/index.ts +3 -0
- package/ts/certificate/utils/certificate-helpers.ts +50 -0
- package/ts/common/eventUtils.ts +1 -1
- package/ts/common/port80-adapter.ts +1 -1
- package/ts/core/events/index.ts +3 -0
- package/ts/core/index.ts +8 -0
- package/ts/core/models/common-types.ts +91 -0
- package/ts/core/models/index.ts +5 -0
- package/ts/core/utils/event-utils.ts +34 -0
- package/ts/core/utils/index.ts +7 -0
- package/ts/core/utils/ip-utils.ts +175 -0
- package/ts/core/utils/validation-utils.ts +177 -0
- package/ts/{smartproxy/forwarding → forwarding/config}/domain-config.ts +1 -1
- package/ts/{smartproxy/forwarding → forwarding/config}/domain-manager.ts +8 -8
- package/ts/{smartproxy/types/forwarding.types.ts → forwarding/config/forwarding-types.ts} +6 -6
- package/ts/forwarding/config/index.ts +7 -0
- package/ts/{smartproxy/forwarding/forwarding.factory.ts → forwarding/factory/forwarding-factory.ts} +12 -11
- package/ts/forwarding/factory/index.ts +5 -0
- package/ts/{smartproxy/forwarding/forwarding.handler.ts → forwarding/handlers/base-handler.ts} +2 -2
- package/ts/{smartproxy/forwarding/http.handler.ts → forwarding/handlers/http-handler.ts} +13 -4
- package/ts/{smartproxy/forwarding/https-passthrough.handler.ts → forwarding/handlers/https-passthrough-handler.ts} +13 -4
- package/ts/{smartproxy/forwarding/https-terminate-to-http.handler.ts → forwarding/handlers/https-terminate-to-http-handler.ts} +3 -3
- package/ts/{smartproxy/forwarding/https-terminate-to-https.handler.ts → forwarding/handlers/https-terminate-to-https-handler.ts} +3 -3
- package/ts/forwarding/handlers/index.ts +9 -0
- package/ts/forwarding/index.ts +34 -0
- package/ts/http/index.ts +23 -0
- package/ts/http/models/http-types.ts +105 -0
- package/ts/http/port80/acme-interfaces.ts +85 -0
- package/ts/http/port80/challenge-responder.ts +246 -0
- package/ts/http/port80/index.ts +13 -0
- package/ts/{port80handler/classes.port80handler.ts → http/port80/port80-handler.ts} +164 -161
- package/ts/http/redirects/index.ts +3 -0
- package/ts/http/router/index.ts +5 -0
- package/ts/{classes.router.ts → http/router/proxy-router.ts} +27 -20
- package/ts/index.ts +32 -9
- package/ts/plugins.ts +2 -1
- package/ts/proxies/index.ts +8 -0
- package/ts/{networkproxy/classes.np.certificatemanager.ts → proxies/network-proxy/certificate-manager.ts} +17 -16
- package/ts/{networkproxy/classes.np.connectionpool.ts → proxies/network-proxy/connection-pool.ts} +3 -3
- package/ts/proxies/network-proxy/index.ts +13 -0
- package/ts/proxies/network-proxy/models/index.ts +4 -0
- package/ts/{networkproxy/classes.np.types.ts → proxies/network-proxy/models/types.ts} +7 -11
- package/ts/{networkproxy/classes.np.networkproxy.ts → proxies/network-proxy/network-proxy.ts} +31 -24
- package/ts/{networkproxy/classes.np.requesthandler.ts → proxies/network-proxy/request-handler.ts} +12 -7
- package/ts/{networkproxy/classes.np.websockethandler.ts → proxies/network-proxy/websocket-handler.ts} +6 -6
- package/ts/proxies/nftables-proxy/index.ts +5 -0
- package/ts/proxies/nftables-proxy/models/errors.ts +30 -0
- package/ts/proxies/nftables-proxy/models/index.ts +5 -0
- package/ts/proxies/nftables-proxy/models/interfaces.ts +94 -0
- package/ts/{nfttablesproxy/classes.nftablesproxy.ts → proxies/nftables-proxy/nftables-proxy.ts} +24 -126
- package/ts/{smartproxy/classes.pp.connectionhandler.ts → proxies/smart-proxy/connection-handler.ts} +12 -12
- package/ts/{smartproxy/classes.pp.connectionmanager.ts → proxies/smart-proxy/connection-manager.ts} +8 -8
- package/ts/{smartproxy/classes.pp.domainconfigmanager.ts → proxies/smart-proxy/domain-config-manager.ts} +15 -14
- package/ts/proxies/smart-proxy/index.ts +18 -0
- package/ts/proxies/smart-proxy/models/index.ts +4 -0
- package/ts/{smartproxy/classes.pp.interfaces.ts → proxies/smart-proxy/models/interfaces.ts} +12 -8
- package/ts/{smartproxy/classes.pp.networkproxybridge.ts → proxies/smart-proxy/network-proxy-bridge.ts} +14 -14
- package/ts/{smartproxy/classes.pp.portrangemanager.ts → proxies/smart-proxy/port-range-manager.ts} +1 -1
- package/ts/{smartproxy/classes.pp.securitymanager.ts → proxies/smart-proxy/security-manager.ts} +3 -3
- package/ts/{smartproxy/classes.smartproxy.ts → proxies/smart-proxy/smart-proxy.ts} +29 -24
- package/ts/{smartproxy/classes.pp.timeoutmanager.ts → proxies/smart-proxy/timeout-manager.ts} +3 -3
- package/ts/{smartproxy/classes.pp.tlsmanager.ts → proxies/smart-proxy/tls-manager.ts} +3 -3
- package/ts/tls/alerts/index.ts +3 -0
- package/ts/{smartproxy/classes.pp.tlsalert.ts → tls/alerts/tls-alert.ts} +44 -43
- package/ts/tls/index.ts +33 -0
- package/ts/tls/sni/client-hello-parser.ts +629 -0
- package/ts/tls/sni/index.ts +3 -0
- package/ts/tls/sni/sni-extraction.ts +353 -0
- package/ts/tls/sni/sni-handler.ts +264 -0
- package/ts/tls/utils/index.ts +3 -0
- package/ts/tls/utils/tls-utils.ts +201 -0
- package/ts/common/acmeFactory.ts +0 -23
- package/ts/helpers.certificates.ts +0 -30
- package/ts/networkproxy/index.ts +0 -7
- package/ts/smartproxy/classes.pp.certprovisioner.ts +0 -200
- package/ts/smartproxy/classes.pp.snihandler.ts +0 -1281
- package/ts/smartproxy/forwarding/index.ts +0 -52
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import { Port80HandlerEvents, CertProvisionerEvents } from '../events/certificate-events.js';
|
|
3
|
+
import { Port80Handler } from '../../http/port80/port80-handler.js';
|
|
4
|
+
/**
|
|
5
|
+
* CertProvisioner manages certificate provisioning and renewal workflows,
|
|
6
|
+
* unifying static certificates and HTTP-01 challenges via Port80Handler.
|
|
7
|
+
*/
|
|
8
|
+
export class CertProvisioner extends plugins.EventEmitter {
|
|
9
|
+
/**
|
|
10
|
+
* @param domainConfigs Array of domain configuration objects
|
|
11
|
+
* @param port80Handler HTTP-01 challenge handler instance
|
|
12
|
+
* @param networkProxyBridge Bridge for applying external certificates
|
|
13
|
+
* @param certProvider Optional callback returning a static cert or 'http01'
|
|
14
|
+
* @param renewThresholdDays Days before expiry to trigger renewals
|
|
15
|
+
* @param renewCheckIntervalHours Interval in hours to check for renewals
|
|
16
|
+
* @param autoRenew Whether to automatically schedule renewals
|
|
17
|
+
* @param forwardConfigs Domain forwarding configurations for ACME challenges
|
|
18
|
+
*/
|
|
19
|
+
constructor(domainConfigs, port80Handler, networkProxyBridge, certProvider, renewThresholdDays = 30, renewCheckIntervalHours = 24, autoRenew = true, forwardConfigs = []) {
|
|
20
|
+
super();
|
|
21
|
+
this.domainConfigs = domainConfigs;
|
|
22
|
+
this.port80Handler = port80Handler;
|
|
23
|
+
this.networkProxyBridge = networkProxyBridge;
|
|
24
|
+
this.certProvisionFunction = certProvider;
|
|
25
|
+
this.renewThresholdDays = renewThresholdDays;
|
|
26
|
+
this.renewCheckIntervalHours = renewCheckIntervalHours;
|
|
27
|
+
this.autoRenew = autoRenew;
|
|
28
|
+
this.provisionMap = new Map();
|
|
29
|
+
this.forwardConfigs = forwardConfigs;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Start initial provisioning and schedule renewals.
|
|
33
|
+
*/
|
|
34
|
+
async start() {
|
|
35
|
+
// Subscribe to Port80Handler certificate events
|
|
36
|
+
this.setupEventSubscriptions();
|
|
37
|
+
// Apply external forwarding for ACME challenges
|
|
38
|
+
this.setupForwardingConfigs();
|
|
39
|
+
// Initial provisioning for all domains
|
|
40
|
+
await this.provisionAllDomains();
|
|
41
|
+
// Schedule renewals if enabled
|
|
42
|
+
if (this.autoRenew) {
|
|
43
|
+
this.scheduleRenewals();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Set up event subscriptions for certificate events
|
|
48
|
+
*/
|
|
49
|
+
setupEventSubscriptions() {
|
|
50
|
+
// We need to reimplement subscribeToPort80Handler here
|
|
51
|
+
this.port80Handler.on(Port80HandlerEvents.CERTIFICATE_ISSUED, (data) => {
|
|
52
|
+
this.emit(CertProvisionerEvents.CERTIFICATE_ISSUED, { ...data, source: 'http01', isRenewal: false });
|
|
53
|
+
});
|
|
54
|
+
this.port80Handler.on(Port80HandlerEvents.CERTIFICATE_RENEWED, (data) => {
|
|
55
|
+
this.emit(CertProvisionerEvents.CERTIFICATE_RENEWED, { ...data, source: 'http01', isRenewal: true });
|
|
56
|
+
});
|
|
57
|
+
this.port80Handler.on(Port80HandlerEvents.CERTIFICATE_FAILED, (error) => {
|
|
58
|
+
this.emit(CertProvisionerEvents.CERTIFICATE_FAILED, error);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Set up forwarding configurations for the Port80Handler
|
|
63
|
+
*/
|
|
64
|
+
setupForwardingConfigs() {
|
|
65
|
+
for (const config of this.forwardConfigs) {
|
|
66
|
+
const domainOptions = {
|
|
67
|
+
domainName: config.domain,
|
|
68
|
+
sslRedirect: config.sslRedirect || false,
|
|
69
|
+
acmeMaintenance: false,
|
|
70
|
+
forward: config.forwardConfig,
|
|
71
|
+
acmeForward: config.acmeForwardConfig
|
|
72
|
+
};
|
|
73
|
+
this.port80Handler.addDomain(domainOptions);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Provision certificates for all configured domains
|
|
78
|
+
*/
|
|
79
|
+
async provisionAllDomains() {
|
|
80
|
+
const domains = this.domainConfigs.flatMap(cfg => cfg.domains);
|
|
81
|
+
for (const domain of domains) {
|
|
82
|
+
await this.provisionDomain(domain);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Provision a certificate for a single domain
|
|
87
|
+
* @param domain Domain to provision
|
|
88
|
+
*/
|
|
89
|
+
async provisionDomain(domain) {
|
|
90
|
+
const isWildcard = domain.includes('*');
|
|
91
|
+
let provision = 'http01';
|
|
92
|
+
// Try to get a certificate from the provision function
|
|
93
|
+
if (this.certProvisionFunction) {
|
|
94
|
+
try {
|
|
95
|
+
provision = await this.certProvisionFunction(domain);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
console.error(`certProvider error for ${domain}:`, err);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else if (isWildcard) {
|
|
102
|
+
// No certProvider: cannot handle wildcard without DNS-01 support
|
|
103
|
+
console.warn(`Skipping wildcard domain without certProvisionFunction: ${domain}`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Handle different provisioning methods
|
|
107
|
+
if (provision === 'http01') {
|
|
108
|
+
if (isWildcard) {
|
|
109
|
+
console.warn(`Skipping HTTP-01 for wildcard domain: ${domain}`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this.provisionMap.set(domain, 'http01');
|
|
113
|
+
this.port80Handler.addDomain({
|
|
114
|
+
domainName: domain,
|
|
115
|
+
sslRedirect: true,
|
|
116
|
+
acmeMaintenance: true
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
else if (provision === 'dns01') {
|
|
120
|
+
// DNS-01 challenges would be handled by the certProvisionFunction
|
|
121
|
+
this.provisionMap.set(domain, 'dns01');
|
|
122
|
+
// DNS-01 handling would go here if implemented
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Static certificate (e.g., DNS-01 provisioned or user-provided)
|
|
126
|
+
this.provisionMap.set(domain, 'static');
|
|
127
|
+
const certObj = provision;
|
|
128
|
+
const certData = {
|
|
129
|
+
domain: certObj.domainName,
|
|
130
|
+
certificate: certObj.publicKey,
|
|
131
|
+
privateKey: certObj.privateKey,
|
|
132
|
+
expiryDate: new Date(certObj.validUntil),
|
|
133
|
+
source: 'static',
|
|
134
|
+
isRenewal: false
|
|
135
|
+
};
|
|
136
|
+
this.networkProxyBridge.applyExternalCertificate(certData);
|
|
137
|
+
this.emit(CertProvisionerEvents.CERTIFICATE_ISSUED, certData);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Schedule certificate renewals using a task manager
|
|
142
|
+
*/
|
|
143
|
+
scheduleRenewals() {
|
|
144
|
+
this.renewManager = new plugins.taskbuffer.TaskManager();
|
|
145
|
+
const renewTask = new plugins.taskbuffer.Task({
|
|
146
|
+
name: 'CertificateRenewals',
|
|
147
|
+
taskFunction: async () => await this.performRenewals()
|
|
148
|
+
});
|
|
149
|
+
const hours = this.renewCheckIntervalHours;
|
|
150
|
+
const cronExpr = `0 0 */${hours} * * *`;
|
|
151
|
+
this.renewManager.addAndScheduleTask(renewTask, cronExpr);
|
|
152
|
+
this.renewManager.start();
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Perform renewals for all domains that need it
|
|
156
|
+
*/
|
|
157
|
+
async performRenewals() {
|
|
158
|
+
for (const [domain, type] of this.provisionMap.entries()) {
|
|
159
|
+
// Skip wildcard domains for HTTP-01 challenges
|
|
160
|
+
if (domain.includes('*') && type === 'http01')
|
|
161
|
+
continue;
|
|
162
|
+
try {
|
|
163
|
+
await this.renewDomain(domain, type);
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
console.error(`Renewal error for ${domain}:`, err);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Renew a certificate for a specific domain
|
|
172
|
+
* @param domain Domain to renew
|
|
173
|
+
* @param provisionType Type of provisioning for this domain
|
|
174
|
+
*/
|
|
175
|
+
async renewDomain(domain, provisionType) {
|
|
176
|
+
if (provisionType === 'http01') {
|
|
177
|
+
await this.port80Handler.renewCertificate(domain);
|
|
178
|
+
}
|
|
179
|
+
else if ((provisionType === 'static' || provisionType === 'dns01') && this.certProvisionFunction) {
|
|
180
|
+
const provision = await this.certProvisionFunction(domain);
|
|
181
|
+
if (provision !== 'http01' && provision !== 'dns01') {
|
|
182
|
+
const certObj = provision;
|
|
183
|
+
const certData = {
|
|
184
|
+
domain: certObj.domainName,
|
|
185
|
+
certificate: certObj.publicKey,
|
|
186
|
+
privateKey: certObj.privateKey,
|
|
187
|
+
expiryDate: new Date(certObj.validUntil),
|
|
188
|
+
source: 'static',
|
|
189
|
+
isRenewal: true
|
|
190
|
+
};
|
|
191
|
+
this.networkProxyBridge.applyExternalCertificate(certData);
|
|
192
|
+
this.emit(CertProvisionerEvents.CERTIFICATE_RENEWED, certData);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Stop all scheduled renewal tasks.
|
|
198
|
+
*/
|
|
199
|
+
async stop() {
|
|
200
|
+
if (this.renewManager) {
|
|
201
|
+
this.renewManager.stop();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Request a certificate on-demand for the given domain.
|
|
206
|
+
* @param domain Domain name to provision
|
|
207
|
+
*/
|
|
208
|
+
async requestCertificate(domain) {
|
|
209
|
+
const isWildcard = domain.includes('*');
|
|
210
|
+
// Determine provisioning method
|
|
211
|
+
let provision = 'http01';
|
|
212
|
+
if (this.certProvisionFunction) {
|
|
213
|
+
provision = await this.certProvisionFunction(domain);
|
|
214
|
+
}
|
|
215
|
+
else if (isWildcard) {
|
|
216
|
+
// Cannot perform HTTP-01 on wildcard without certProvider
|
|
217
|
+
throw new Error(`Cannot request certificate for wildcard domain without certProvisionFunction: ${domain}`);
|
|
218
|
+
}
|
|
219
|
+
if (provision === 'http01') {
|
|
220
|
+
if (isWildcard) {
|
|
221
|
+
throw new Error(`Cannot request HTTP-01 certificate for wildcard domain: ${domain}`);
|
|
222
|
+
}
|
|
223
|
+
await this.port80Handler.renewCertificate(domain);
|
|
224
|
+
}
|
|
225
|
+
else if (provision === 'dns01') {
|
|
226
|
+
// DNS-01 challenges would be handled by external mechanisms
|
|
227
|
+
// This is a placeholder for future implementation
|
|
228
|
+
console.log(`DNS-01 challenge requested for ${domain}`);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
// Static certificate (e.g., DNS-01 provisioned) supports wildcards
|
|
232
|
+
const certObj = provision;
|
|
233
|
+
const certData = {
|
|
234
|
+
domain: certObj.domainName,
|
|
235
|
+
certificate: certObj.publicKey,
|
|
236
|
+
privateKey: certObj.privateKey,
|
|
237
|
+
expiryDate: new Date(certObj.validUntil),
|
|
238
|
+
source: 'static',
|
|
239
|
+
isRenewal: false
|
|
240
|
+
};
|
|
241
|
+
this.networkProxyBridge.applyExternalCertificate(certData);
|
|
242
|
+
this.emit(CertProvisionerEvents.CERTIFICATE_ISSUED, certData);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Add a new domain for certificate provisioning
|
|
247
|
+
* @param domain Domain to add
|
|
248
|
+
* @param options Domain configuration options
|
|
249
|
+
*/
|
|
250
|
+
async addDomain(domain, options) {
|
|
251
|
+
const domainOptions = {
|
|
252
|
+
domainName: domain,
|
|
253
|
+
sslRedirect: options?.sslRedirect || true,
|
|
254
|
+
acmeMaintenance: options?.acmeMaintenance || true
|
|
255
|
+
};
|
|
256
|
+
this.port80Handler.addDomain(domainOptions);
|
|
257
|
+
await this.provisionDomain(domain);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// For backward compatibility
|
|
261
|
+
export { CertProvisioner as CertificateProvisioner };
|
|
262
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC1wcm92aXNpb25lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NlcnRpZmljYXRlL3Byb3ZpZGVycy9jZXJ0LXByb3Zpc2lvbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFHNUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBaUJwRTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxPQUFPLENBQUMsWUFBWTtJQWF2RDs7Ozs7Ozs7O09BU0c7SUFDSCxZQUNFLGFBQThCLEVBQzlCLGFBQTRCLEVBQzVCLGtCQUF1QyxFQUN2QyxZQUFnRSxFQUNoRSxxQkFBNkIsRUFBRSxFQUMvQiwwQkFBa0MsRUFBRSxFQUNwQyxZQUFxQixJQUFJLEVBQ3pCLGlCQUF5QyxFQUFFO1FBRTNDLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxZQUFZLENBQUM7UUFDMUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyx1QkFBdUIsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLEtBQUs7UUFDaEIs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
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
/**
|
|
3
|
+
* Certificate providers
|
|
4
|
+
*/
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jZXJ0aWZpY2F0ZS9wcm92aWRlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHIn0=
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { ICertificateData } from '../models/certificate-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* FileStorage provides file system storage for certificates
|
|
4
|
+
*/
|
|
5
|
+
export declare class FileStorage {
|
|
6
|
+
private storageDir;
|
|
7
|
+
/**
|
|
8
|
+
* Creates a new file storage provider
|
|
9
|
+
* @param storageDir Directory to store certificates
|
|
10
|
+
*/
|
|
11
|
+
constructor(storageDir: string);
|
|
12
|
+
/**
|
|
13
|
+
* Save a certificate to the file system
|
|
14
|
+
* @param domain Domain name
|
|
15
|
+
* @param certData Certificate data to save
|
|
16
|
+
*/
|
|
17
|
+
saveCertificate(domain: string, certData: ICertificateData): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Load a certificate from the file system
|
|
20
|
+
* @param domain Domain name
|
|
21
|
+
* @returns Certificate data if found, null otherwise
|
|
22
|
+
*/
|
|
23
|
+
loadCertificate(domain: string): Promise<ICertificateData | null>;
|
|
24
|
+
/**
|
|
25
|
+
* Delete a certificate from the file system
|
|
26
|
+
* @param domain Domain name
|
|
27
|
+
*/
|
|
28
|
+
deleteCertificate(domain: string): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* List all domains with stored certificates
|
|
31
|
+
* @returns Array of domain names
|
|
32
|
+
*/
|
|
33
|
+
listCertificates(): Promise<string[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a certificate is expiring soon
|
|
36
|
+
* @param domain Domain name
|
|
37
|
+
* @param thresholdDays Days threshold to consider expiring
|
|
38
|
+
* @returns Information about expiring certificate or null
|
|
39
|
+
*/
|
|
40
|
+
isExpiringSoon(domain: string, thresholdDays?: number): Promise<{
|
|
41
|
+
domain: string;
|
|
42
|
+
expiryDate: Date;
|
|
43
|
+
daysRemaining: number;
|
|
44
|
+
} | null>;
|
|
45
|
+
/**
|
|
46
|
+
* Check all certificates for expiration
|
|
47
|
+
* @param thresholdDays Days threshold to consider expiring
|
|
48
|
+
* @returns List of expiring certificates
|
|
49
|
+
*/
|
|
50
|
+
getExpiringCertificates(thresholdDays?: number): Promise<Array<{
|
|
51
|
+
domain: string;
|
|
52
|
+
expiryDate: Date;
|
|
53
|
+
daysRemaining: number;
|
|
54
|
+
}>>;
|
|
55
|
+
/**
|
|
56
|
+
* Delete a directory recursively
|
|
57
|
+
* @param directoryPath Directory to delete
|
|
58
|
+
*/
|
|
59
|
+
private deleteDirectory;
|
|
60
|
+
/**
|
|
61
|
+
* Sanitize a domain name for use as a directory name
|
|
62
|
+
* @param domain Domain name
|
|
63
|
+
* @returns Sanitized domain name
|
|
64
|
+
*/
|
|
65
|
+
private sanitizeDomain;
|
|
66
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as plugins from '../../plugins.js';
|
|
4
|
+
import { ensureCertificateDirectory } from '../utils/certificate-helpers.js';
|
|
5
|
+
/**
|
|
6
|
+
* FileStorage provides file system storage for certificates
|
|
7
|
+
*/
|
|
8
|
+
export class FileStorage {
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new file storage provider
|
|
11
|
+
* @param storageDir Directory to store certificates
|
|
12
|
+
*/
|
|
13
|
+
constructor(storageDir) {
|
|
14
|
+
this.storageDir = path.resolve(storageDir);
|
|
15
|
+
ensureCertificateDirectory(this.storageDir);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Save a certificate to the file system
|
|
19
|
+
* @param domain Domain name
|
|
20
|
+
* @param certData Certificate data to save
|
|
21
|
+
*/
|
|
22
|
+
async saveCertificate(domain, certData) {
|
|
23
|
+
const sanitizedDomain = this.sanitizeDomain(domain);
|
|
24
|
+
const certDir = path.join(this.storageDir, sanitizedDomain);
|
|
25
|
+
ensureCertificateDirectory(certDir);
|
|
26
|
+
const certPath = path.join(certDir, 'fullchain.pem');
|
|
27
|
+
const keyPath = path.join(certDir, 'privkey.pem');
|
|
28
|
+
const metaPath = path.join(certDir, 'metadata.json');
|
|
29
|
+
// Write certificate and private key
|
|
30
|
+
await fs.promises.writeFile(certPath, certData.certificate, 'utf8');
|
|
31
|
+
await fs.promises.writeFile(keyPath, certData.privateKey, 'utf8');
|
|
32
|
+
// Write metadata
|
|
33
|
+
const metadata = {
|
|
34
|
+
domain: certData.domain,
|
|
35
|
+
expiryDate: certData.expiryDate.toISOString(),
|
|
36
|
+
source: certData.source || 'unknown',
|
|
37
|
+
issuedAt: new Date().toISOString()
|
|
38
|
+
};
|
|
39
|
+
await fs.promises.writeFile(metaPath, JSON.stringify(metadata, null, 2), 'utf8');
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Load a certificate from the file system
|
|
43
|
+
* @param domain Domain name
|
|
44
|
+
* @returns Certificate data if found, null otherwise
|
|
45
|
+
*/
|
|
46
|
+
async loadCertificate(domain) {
|
|
47
|
+
const sanitizedDomain = this.sanitizeDomain(domain);
|
|
48
|
+
const certDir = path.join(this.storageDir, sanitizedDomain);
|
|
49
|
+
if (!fs.existsSync(certDir)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const certPath = path.join(certDir, 'fullchain.pem');
|
|
53
|
+
const keyPath = path.join(certDir, 'privkey.pem');
|
|
54
|
+
const metaPath = path.join(certDir, 'metadata.json');
|
|
55
|
+
try {
|
|
56
|
+
// Check if all required files exist
|
|
57
|
+
if (!fs.existsSync(certPath) || !fs.existsSync(keyPath)) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
// Read certificate and private key
|
|
61
|
+
const certificate = await fs.promises.readFile(certPath, 'utf8');
|
|
62
|
+
const privateKey = await fs.promises.readFile(keyPath, 'utf8');
|
|
63
|
+
// Try to read metadata if available
|
|
64
|
+
let expiryDate = new Date();
|
|
65
|
+
let source;
|
|
66
|
+
if (fs.existsSync(metaPath)) {
|
|
67
|
+
const metaContent = await fs.promises.readFile(metaPath, 'utf8');
|
|
68
|
+
const metadata = JSON.parse(metaContent);
|
|
69
|
+
if (metadata.expiryDate) {
|
|
70
|
+
expiryDate = new Date(metadata.expiryDate);
|
|
71
|
+
}
|
|
72
|
+
if (metadata.source) {
|
|
73
|
+
source = metadata.source;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
domain,
|
|
78
|
+
certificate,
|
|
79
|
+
privateKey,
|
|
80
|
+
expiryDate,
|
|
81
|
+
source
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error(`Error loading certificate for ${domain}:`, error);
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Delete a certificate from the file system
|
|
91
|
+
* @param domain Domain name
|
|
92
|
+
*/
|
|
93
|
+
async deleteCertificate(domain) {
|
|
94
|
+
const sanitizedDomain = this.sanitizeDomain(domain);
|
|
95
|
+
const certDir = path.join(this.storageDir, sanitizedDomain);
|
|
96
|
+
if (!fs.existsSync(certDir)) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
// Recursively delete the certificate directory
|
|
101
|
+
await this.deleteDirectory(certDir);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.error(`Error deleting certificate for ${domain}:`, error);
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* List all domains with stored certificates
|
|
111
|
+
* @returns Array of domain names
|
|
112
|
+
*/
|
|
113
|
+
async listCertificates() {
|
|
114
|
+
try {
|
|
115
|
+
const entries = await fs.promises.readdir(this.storageDir, { withFileTypes: true });
|
|
116
|
+
return entries
|
|
117
|
+
.filter(entry => entry.isDirectory())
|
|
118
|
+
.map(entry => entry.name);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error('Error listing certificates:', error);
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Check if a certificate is expiring soon
|
|
127
|
+
* @param domain Domain name
|
|
128
|
+
* @param thresholdDays Days threshold to consider expiring
|
|
129
|
+
* @returns Information about expiring certificate or null
|
|
130
|
+
*/
|
|
131
|
+
async isExpiringSoon(domain, thresholdDays = 30) {
|
|
132
|
+
const certData = await this.loadCertificate(domain);
|
|
133
|
+
if (!certData) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
const now = new Date();
|
|
137
|
+
const expiryDate = certData.expiryDate;
|
|
138
|
+
const timeRemaining = expiryDate.getTime() - now.getTime();
|
|
139
|
+
const daysRemaining = Math.floor(timeRemaining / (1000 * 60 * 60 * 24));
|
|
140
|
+
if (daysRemaining <= thresholdDays) {
|
|
141
|
+
return {
|
|
142
|
+
domain,
|
|
143
|
+
expiryDate,
|
|
144
|
+
daysRemaining
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check all certificates for expiration
|
|
151
|
+
* @param thresholdDays Days threshold to consider expiring
|
|
152
|
+
* @returns List of expiring certificates
|
|
153
|
+
*/
|
|
154
|
+
async getExpiringCertificates(thresholdDays = 30) {
|
|
155
|
+
const domains = await this.listCertificates();
|
|
156
|
+
const expiringCerts = [];
|
|
157
|
+
for (const domain of domains) {
|
|
158
|
+
const expiring = await this.isExpiringSoon(domain, thresholdDays);
|
|
159
|
+
if (expiring) {
|
|
160
|
+
expiringCerts.push(expiring);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return expiringCerts;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Delete a directory recursively
|
|
167
|
+
* @param directoryPath Directory to delete
|
|
168
|
+
*/
|
|
169
|
+
async deleteDirectory(directoryPath) {
|
|
170
|
+
if (fs.existsSync(directoryPath)) {
|
|
171
|
+
const entries = await fs.promises.readdir(directoryPath, { withFileTypes: true });
|
|
172
|
+
for (const entry of entries) {
|
|
173
|
+
const fullPath = path.join(directoryPath, entry.name);
|
|
174
|
+
if (entry.isDirectory()) {
|
|
175
|
+
await this.deleteDirectory(fullPath);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
await fs.promises.unlink(fullPath);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
await fs.promises.rmdir(directoryPath);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Sanitize a domain name for use as a directory name
|
|
186
|
+
* @param domain Domain name
|
|
187
|
+
* @returns Sanitized domain name
|
|
188
|
+
*/
|
|
189
|
+
sanitizeDomain(domain) {
|
|
190
|
+
// Replace wildcard and any invalid filesystem characters
|
|
191
|
+
return domain.replace(/\*/g, '_wildcard_').replace(/[/\\:*?"<>|]/g, '_');
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvY2VydGlmaWNhdGUvc3RvcmFnZS9maWxlLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU3RTs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBR3RCOzs7T0FHRztJQUNILFlBQVksVUFBa0I7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBYyxFQUFFLFFBQTBCO1FBQ3JFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzVELDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXBDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRXJELG9DQUFvQztR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
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
/**
|
|
3
|
+
* Certificate storage mechanisms
|
|
4
|
+
*/
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jZXJ0aWZpY2F0ZS9zdG9yYWdlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRyJ9
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ICertificates } from '../models/certificate-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Loads the default SSL certificates from the assets directory
|
|
4
|
+
* @returns The certificate key pair
|
|
5
|
+
*/
|
|
6
|
+
export declare function loadDefaultCertificates(): ICertificates;
|
|
7
|
+
/**
|
|
8
|
+
* Checks if a certificate file exists at the specified path
|
|
9
|
+
* @param certPath Path to check for certificate
|
|
10
|
+
* @returns True if the certificate exists, false otherwise
|
|
11
|
+
*/
|
|
12
|
+
export declare function certificateExists(certPath: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Ensures the certificate directory exists
|
|
15
|
+
* @param dirPath Path to the certificate directory
|
|
16
|
+
*/
|
|
17
|
+
export declare function ensureCertificateDirectory(dirPath: string): void;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
/**
|
|
6
|
+
* Loads the default SSL certificates from the assets directory
|
|
7
|
+
* @returns The certificate key pair
|
|
8
|
+
*/
|
|
9
|
+
export function loadDefaultCertificates() {
|
|
10
|
+
try {
|
|
11
|
+
// Need to adjust path from /ts/certificate/utils to /assets/certs
|
|
12
|
+
const certPath = path.join(__dirname, '..', '..', '..', 'assets', 'certs');
|
|
13
|
+
const privateKey = fs.readFileSync(path.join(certPath, 'key.pem'), 'utf8');
|
|
14
|
+
const publicKey = fs.readFileSync(path.join(certPath, 'cert.pem'), 'utf8');
|
|
15
|
+
if (!privateKey || !publicKey) {
|
|
16
|
+
throw new Error('Failed to load default certificates');
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
privateKey,
|
|
20
|
+
publicKey
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.error('Error loading default certificates:', error);
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Checks if a certificate file exists at the specified path
|
|
30
|
+
* @param certPath Path to check for certificate
|
|
31
|
+
* @returns True if the certificate exists, false otherwise
|
|
32
|
+
*/
|
|
33
|
+
export function certificateExists(certPath) {
|
|
34
|
+
return fs.existsSync(certPath);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Ensures the certificate directory exists
|
|
38
|
+
* @param dirPath Path to the certificate directory
|
|
39
|
+
*/
|
|
40
|
+
export function ensureCertificateDirectory(dirPath) {
|
|
41
|
+
if (!fs.existsSync(dirPath)) {
|
|
42
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGUtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NlcnRpZmljYXRlL3V0aWxzL2NlcnRpZmljYXRlLWhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUdwQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFL0Q7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QjtJQUNyQyxJQUFJLENBQUM7UUFDSCxrRUFBa0U7UUFDbEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNFLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0UsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzRSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxPQUFPO1lBQ0wsVUFBVTtZQUNWLFNBQVM7U0FDVixDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFFBQWdCO0lBQ2hELE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLE9BQWU7SUFDeEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM1QixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7QUFDSCxDQUFDIn0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Port80Handler } from '../
|
|
1
|
+
import type { Port80Handler } from '../http/port80/port80-handler.js';
|
|
2
2
|
import type { ICertificateData, ICertificateFailure, ICertificateExpiring } from './types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Subscribers callback definitions for Port80Handler events
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IForwardConfig as ILegacyForwardConfig, IDomainOptions } from './types.js';
|
|
2
|
-
import type { IForwardConfig } from '../
|
|
2
|
+
import type { IForwardConfig } from '../forwarding/config/forwarding-types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Converts a forwarding configuration target to the legacy format
|
|
5
5
|
* for Port80Handler
|