@serve.zone/dcrouter 13.7.1 → 13.8.0
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_serve/bundle.js +707 -563
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/acme/index.d.ts +1 -0
- package/dist_ts/acme/index.js +2 -0
- package/dist_ts/acme/manager.acme-config.d.ts +48 -0
- package/dist_ts/acme/manager.acme-config.js +156 -0
- package/dist_ts/classes.dcrouter.d.ts +2 -0
- package/dist_ts/classes.dcrouter.js +58 -20
- package/dist_ts/db/documents/classes.acme-config.doc.d.ts +22 -0
- package/dist_ts/db/documents/classes.acme-config.doc.js +121 -0
- package/dist_ts/db/documents/index.d.ts +1 -0
- package/dist_ts/db/documents/index.js +3 -1
- package/dist_ts/opsserver/classes.opsserver.d.ts +1 -0
- package/dist_ts/opsserver/classes.opsserver.js +3 -1
- package/dist_ts/opsserver/handlers/acme-config.handler.d.ts +16 -0
- package/dist_ts/opsserver/handlers/acme-config.handler.js +77 -0
- package/dist_ts/opsserver/handlers/index.d.ts +1 -0
- package/dist_ts/opsserver/handlers/index.js +2 -1
- package/dist_ts_interfaces/data/acme-config.d.ts +25 -0
- package/dist_ts_interfaces/data/acme-config.js +2 -0
- package/dist_ts_interfaces/data/index.d.ts +1 -0
- package/dist_ts_interfaces/data/index.js +2 -1
- package/dist_ts_interfaces/data/route-management.d.ts +1 -1
- package/dist_ts_interfaces/requests/acme-config.d.ts +42 -0
- package/dist_ts_interfaces/requests/acme-config.js +2 -0
- package/dist_ts_interfaces/requests/index.d.ts +1 -0
- package/dist_ts_interfaces/requests/index.js +2 -1
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/appstate.d.ts +15 -0
- package/dist_ts_web/appstate.js +60 -1
- package/dist_ts_web/elements/domains/ops-view-certificates.d.ts +3 -0
- package/dist_ts_web/elements/domains/ops-view-certificates.js +208 -4
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/acme/index.ts +1 -0
- package/ts/acme/manager.acme-config.ts +182 -0
- package/ts/classes.dcrouter.ts +72 -25
- package/ts/db/documents/classes.acme-config.doc.ts +49 -0
- package/ts/db/documents/index.ts +3 -0
- package/ts/opsserver/classes.opsserver.ts +2 -0
- package/ts/opsserver/handlers/acme-config.handler.ts +94 -0
- package/ts/opsserver/handlers/index.ts +2 -1
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate.ts +88 -0
- package/ts_web/elements/domains/ops-view-certificates.ts +205 -2
|
@@ -46,12 +46,17 @@ let OpsViewCertificates = (() => {
|
|
|
46
46
|
let _certState_decorators;
|
|
47
47
|
let _certState_initializers = [];
|
|
48
48
|
let _certState_extraInitializers = [];
|
|
49
|
+
let _acmeState_decorators;
|
|
50
|
+
let _acmeState_initializers = [];
|
|
51
|
+
let _acmeState_extraInitializers = [];
|
|
49
52
|
var OpsViewCertificates = class extends _classSuper {
|
|
50
53
|
static { _classThis = this; }
|
|
51
54
|
static {
|
|
52
55
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
53
56
|
_certState_decorators = [state()];
|
|
57
|
+
_acmeState_decorators = [state()];
|
|
54
58
|
__esDecorate(this, null, _certState_decorators, { kind: "accessor", name: "certState", static: false, private: false, access: { has: obj => "certState" in obj, get: obj => obj.certState, set: (obj, value) => { obj.certState = value; } }, metadata: _metadata }, _certState_initializers, _certState_extraInitializers);
|
|
59
|
+
__esDecorate(this, null, _acmeState_decorators, { kind: "accessor", name: "acmeState", static: false, private: false, access: { has: obj => "acmeState" in obj, get: obj => obj.acmeState, set: (obj, value) => { obj.acmeState = value; } }, metadata: _metadata }, _acmeState_initializers, _acmeState_extraInitializers);
|
|
55
60
|
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
56
61
|
OpsViewCertificates = _classThis = _classDescriptor.value;
|
|
57
62
|
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
@@ -59,17 +64,25 @@ let OpsViewCertificates = (() => {
|
|
|
59
64
|
#certState_accessor_storage = __runInitializers(this, _certState_initializers, appstate.certificateStatePart.getState());
|
|
60
65
|
get certState() { return this.#certState_accessor_storage; }
|
|
61
66
|
set certState(value) { this.#certState_accessor_storage = value; }
|
|
67
|
+
#acmeState_accessor_storage = (__runInitializers(this, _certState_extraInitializers), __runInitializers(this, _acmeState_initializers, appstate.acmeConfigStatePart.getState()));
|
|
68
|
+
get acmeState() { return this.#acmeState_accessor_storage; }
|
|
69
|
+
set acmeState(value) { this.#acmeState_accessor_storage = value; }
|
|
62
70
|
constructor() {
|
|
63
71
|
super();
|
|
64
|
-
__runInitializers(this,
|
|
65
|
-
const
|
|
72
|
+
__runInitializers(this, _acmeState_extraInitializers);
|
|
73
|
+
const certSub = appstate.certificateStatePart.select().subscribe((newState) => {
|
|
66
74
|
this.certState = newState;
|
|
67
75
|
});
|
|
68
|
-
this.rxSubscriptions.push(
|
|
76
|
+
this.rxSubscriptions.push(certSub);
|
|
77
|
+
const acmeSub = appstate.acmeConfigStatePart.select().subscribe((newState) => {
|
|
78
|
+
this.acmeState = newState;
|
|
79
|
+
});
|
|
80
|
+
this.rxSubscriptions.push(acmeSub);
|
|
69
81
|
}
|
|
70
82
|
async connectedCallback() {
|
|
71
83
|
await super.connectedCallback();
|
|
72
84
|
await appstate.certificateStatePart.dispatchAction(appstate.fetchCertificateOverviewAction, null);
|
|
85
|
+
await appstate.acmeConfigStatePart.dispatchAction(appstate.fetchAcmeConfigAction, null);
|
|
73
86
|
}
|
|
74
87
|
static styles = [
|
|
75
88
|
cssManager.defaultStyles,
|
|
@@ -81,6 +94,62 @@ let OpsViewCertificates = (() => {
|
|
|
81
94
|
gap: 24px;
|
|
82
95
|
}
|
|
83
96
|
|
|
97
|
+
.acmeCard {
|
|
98
|
+
padding: 16px 20px;
|
|
99
|
+
background: ${cssManager.bdTheme('#f9fafb', '#111827')};
|
|
100
|
+
border: 1px solid ${cssManager.bdTheme('#e5e7eb', '#374151')};
|
|
101
|
+
border-radius: 8px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.acmeCard.acmeCardEmpty {
|
|
105
|
+
background: ${cssManager.bdTheme('#fffbeb', '#1c1917')};
|
|
106
|
+
border-color: ${cssManager.bdTheme('#fde68a', '#78350f')};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.acmeCardHeader {
|
|
110
|
+
display: flex;
|
|
111
|
+
justify-content: space-between;
|
|
112
|
+
align-items: center;
|
|
113
|
+
margin-bottom: 12px;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.acmeCardTitle {
|
|
117
|
+
font-size: 14px;
|
|
118
|
+
font-weight: 600;
|
|
119
|
+
color: ${cssManager.bdTheme('#111827', '#f3f4f6')};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.acmeGrid {
|
|
123
|
+
display: grid;
|
|
124
|
+
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
|
125
|
+
gap: 12px 24px;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.acmeField {
|
|
129
|
+
display: flex;
|
|
130
|
+
flex-direction: column;
|
|
131
|
+
gap: 2px;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.acmeLabel {
|
|
135
|
+
font-size: 11px;
|
|
136
|
+
text-transform: uppercase;
|
|
137
|
+
letter-spacing: 0.03em;
|
|
138
|
+
color: ${cssManager.bdTheme('#6b7280', '#9ca3af')};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.acmeValue {
|
|
142
|
+
font-size: 13px;
|
|
143
|
+
color: ${cssManager.bdTheme('#111827', '#f3f4f6')};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.acmeEmptyHint {
|
|
147
|
+
margin: 0;
|
|
148
|
+
font-size: 13px;
|
|
149
|
+
line-height: 1.5;
|
|
150
|
+
color: ${cssManager.bdTheme('#78350f', '#fde68a')};
|
|
151
|
+
}
|
|
152
|
+
|
|
84
153
|
.statusBadge {
|
|
85
154
|
display: inline-flex;
|
|
86
155
|
align-items: center;
|
|
@@ -195,11 +264,146 @@ let OpsViewCertificates = (() => {
|
|
|
195
264
|
<dees-heading level="3">Certificates</dees-heading>
|
|
196
265
|
|
|
197
266
|
<div class="certificatesContainer">
|
|
267
|
+
${this.renderAcmeSettingsCard()}
|
|
198
268
|
${this.renderStatsTiles(summary)}
|
|
199
269
|
${this.renderCertificateTable()}
|
|
200
270
|
</div>
|
|
201
271
|
`;
|
|
202
272
|
}
|
|
273
|
+
renderAcmeSettingsCard() {
|
|
274
|
+
const config = this.acmeState.config;
|
|
275
|
+
if (!config) {
|
|
276
|
+
return html `
|
|
277
|
+
<div class="acmeCard acmeCardEmpty">
|
|
278
|
+
<div class="acmeCardHeader">
|
|
279
|
+
<span class="acmeCardTitle">ACME Settings</span>
|
|
280
|
+
<dees-button
|
|
281
|
+
eventName="edit-acme"
|
|
282
|
+
@click=${() => this.showEditAcmeDialog()}
|
|
283
|
+
.type=${'highlighted'}
|
|
284
|
+
>Configure</dees-button>
|
|
285
|
+
</div>
|
|
286
|
+
<p class="acmeEmptyHint">
|
|
287
|
+
No ACME configuration yet. Click <strong>Configure</strong> to set up automated TLS
|
|
288
|
+
certificate issuance via Let's Encrypt. You'll also need at least one DNS provider
|
|
289
|
+
under <strong>Domains > Providers</strong>.
|
|
290
|
+
</p>
|
|
291
|
+
</div>
|
|
292
|
+
`;
|
|
293
|
+
}
|
|
294
|
+
return html `
|
|
295
|
+
<div class="acmeCard">
|
|
296
|
+
<div class="acmeCardHeader">
|
|
297
|
+
<span class="acmeCardTitle">ACME Settings</span>
|
|
298
|
+
<dees-button eventName="edit-acme" @click=${() => this.showEditAcmeDialog()}>Edit</dees-button>
|
|
299
|
+
</div>
|
|
300
|
+
<div class="acmeGrid">
|
|
301
|
+
<div class="acmeField">
|
|
302
|
+
<span class="acmeLabel">Account email</span>
|
|
303
|
+
<span class="acmeValue">${config.accountEmail || '(not set)'}</span>
|
|
304
|
+
</div>
|
|
305
|
+
<div class="acmeField">
|
|
306
|
+
<span class="acmeLabel">Status</span>
|
|
307
|
+
<span class="acmeValue">
|
|
308
|
+
<span class="statusBadge ${config.enabled ? 'valid' : 'unknown'}">
|
|
309
|
+
${config.enabled ? 'enabled' : 'disabled'}
|
|
310
|
+
</span>
|
|
311
|
+
</span>
|
|
312
|
+
</div>
|
|
313
|
+
<div class="acmeField">
|
|
314
|
+
<span class="acmeLabel">Mode</span>
|
|
315
|
+
<span class="acmeValue">
|
|
316
|
+
<span class="statusBadge ${config.useProduction ? 'valid' : 'provisioning'}">
|
|
317
|
+
${config.useProduction ? 'production' : 'staging'}
|
|
318
|
+
</span>
|
|
319
|
+
</span>
|
|
320
|
+
</div>
|
|
321
|
+
<div class="acmeField">
|
|
322
|
+
<span class="acmeLabel">Auto-renew</span>
|
|
323
|
+
<span class="acmeValue">${config.autoRenew ? 'on' : 'off'}</span>
|
|
324
|
+
</div>
|
|
325
|
+
<div class="acmeField">
|
|
326
|
+
<span class="acmeLabel">Renewal threshold</span>
|
|
327
|
+
<span class="acmeValue">${config.renewThresholdDays} days</span>
|
|
328
|
+
</div>
|
|
329
|
+
</div>
|
|
330
|
+
</div>
|
|
331
|
+
`;
|
|
332
|
+
}
|
|
333
|
+
async showEditAcmeDialog() {
|
|
334
|
+
const { DeesModal, DeesToast } = await import('@design.estate/dees-catalog');
|
|
335
|
+
const current = this.acmeState.config;
|
|
336
|
+
DeesModal.createAndShow({
|
|
337
|
+
heading: current ? 'Edit ACME Settings' : 'Configure ACME',
|
|
338
|
+
content: html `
|
|
339
|
+
<dees-form>
|
|
340
|
+
<dees-input-text
|
|
341
|
+
.key=${'accountEmail'}
|
|
342
|
+
.label=${'Account email'}
|
|
343
|
+
.value=${current?.accountEmail ?? ''}
|
|
344
|
+
.required=${true}
|
|
345
|
+
></dees-input-text>
|
|
346
|
+
<dees-input-checkbox
|
|
347
|
+
.key=${'enabled'}
|
|
348
|
+
.label=${'Enabled'}
|
|
349
|
+
.value=${current?.enabled ?? true}
|
|
350
|
+
></dees-input-checkbox>
|
|
351
|
+
<dees-input-checkbox
|
|
352
|
+
.key=${'useProduction'}
|
|
353
|
+
.label=${"Use Let's Encrypt production (uncheck for staging)"}
|
|
354
|
+
.value=${current?.useProduction ?? true}
|
|
355
|
+
></dees-input-checkbox>
|
|
356
|
+
<dees-input-checkbox
|
|
357
|
+
.key=${'autoRenew'}
|
|
358
|
+
.label=${'Auto-renew certificates'}
|
|
359
|
+
.value=${current?.autoRenew ?? true}
|
|
360
|
+
></dees-input-checkbox>
|
|
361
|
+
<dees-input-text
|
|
362
|
+
.key=${'renewThresholdDays'}
|
|
363
|
+
.label=${'Renewal threshold (days)'}
|
|
364
|
+
.value=${String(current?.renewThresholdDays ?? 30)}
|
|
365
|
+
></dees-input-text>
|
|
366
|
+
</dees-form>
|
|
367
|
+
<p style="margin-top: 12px; font-size: 12px; opacity: 0.7;">
|
|
368
|
+
Most fields take effect on the next dcrouter restart (SmartAcme is instantiated once at
|
|
369
|
+
startup). Changing the account email creates a new Let's Encrypt account — only do this
|
|
370
|
+
if you know what you're doing.
|
|
371
|
+
</p>
|
|
372
|
+
`,
|
|
373
|
+
menuOptions: [
|
|
374
|
+
{ name: 'Cancel', action: async (modalArg) => modalArg.destroy() },
|
|
375
|
+
{
|
|
376
|
+
name: 'Save',
|
|
377
|
+
action: async (modalArg) => {
|
|
378
|
+
const form = modalArg.shadowRoot
|
|
379
|
+
?.querySelector('.content')
|
|
380
|
+
?.querySelector('dees-form');
|
|
381
|
+
if (!form)
|
|
382
|
+
return;
|
|
383
|
+
const data = await form.collectFormData();
|
|
384
|
+
const email = String(data.accountEmail ?? '').trim();
|
|
385
|
+
if (!email) {
|
|
386
|
+
DeesToast.show({
|
|
387
|
+
message: 'Account email is required',
|
|
388
|
+
type: 'warning',
|
|
389
|
+
duration: 2500,
|
|
390
|
+
});
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
const threshold = parseInt(String(data.renewThresholdDays ?? '30'), 10);
|
|
394
|
+
await appstate.acmeConfigStatePart.dispatchAction(appstate.updateAcmeConfigAction, {
|
|
395
|
+
accountEmail: email,
|
|
396
|
+
enabled: Boolean(data.enabled),
|
|
397
|
+
useProduction: Boolean(data.useProduction),
|
|
398
|
+
autoRenew: Boolean(data.autoRenew),
|
|
399
|
+
renewThresholdDays: Number.isFinite(threshold) ? threshold : 30,
|
|
400
|
+
});
|
|
401
|
+
modalArg.destroy();
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
],
|
|
405
|
+
});
|
|
406
|
+
}
|
|
203
407
|
renderStatsTiles(summary) {
|
|
204
408
|
const tiles = [
|
|
205
409
|
{
|
|
@@ -550,4 +754,4 @@ let OpsViewCertificates = (() => {
|
|
|
550
754
|
return OpsViewCertificates = _classThis;
|
|
551
755
|
})();
|
|
552
756
|
export { OpsViewCertificates };
|
|
553
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctY2VydGlmaWNhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzL2RvbWFpbnMvb3BzLXZpZXctY2VydGlmaWNhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLElBQUksRUFDSixhQUFhLEVBRWIsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEdBQ1gsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztJQVNqRCxtQkFBbUI7NEJBRC9CLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQzs7OztzQkFDRSxXQUFXOzs7O21DQUFuQixTQUFRLFdBQVc7Ozs7cUNBQ2pELEtBQUssRUFBRTtZQUNSLGdMQUFTLFNBQVMsNkJBQVQsU0FBUyw2RkFBeUU7WUFGN0YsNktBNmZDOzs7O1FBM2ZDLCtFQUFpRCxRQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFHLEVBQUM7UUFBM0YsSUFBUyxTQUFTLCtDQUF5RTtRQUEzRixJQUFTLFNBQVMscURBQXlFO1FBRTNGO1lBQ0UsS0FBSyxFQUFFLENBQUM7O1lBQ1IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUN4RSxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxD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
|
|
757
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctY2VydGlmaWNhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzL2RvbWFpbnMvb3BzLXZpZXctY2VydGlmaWNhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLElBQUksRUFDSixhQUFhLEVBRWIsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEdBQ1gsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztJQVNqRCxtQkFBbUI7NEJBRC9CLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQzs7OztzQkFDRSxXQUFXOzs7Ozs7O21DQUFuQixTQUFRLFdBQVc7Ozs7cUNBQ2pELEtBQUssRUFBRTtxQ0FHUCxLQUFLLEVBQUU7WUFGUixnTEFBUyxTQUFTLDZCQUFULFNBQVMsNkZBQXlFO1lBRzNGLGdMQUFTLFNBQVMsNkJBQVQsU0FBUyw2RkFBdUU7WUFMM0YsNktBd3NCQzs7OztRQXRzQkMsK0VBQWlELFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUcsRUFBQztRQUEzRixJQUFTLFNBQVMsK0NBQXlFO1FBQTNGLElBQVMsU0FBUyxxREFBeUU7UUFHM0YsdUlBQWdELFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUcsR0FBQztRQUF6RixJQUFTLFNBQVMsK0NBQXVFO1FBQXpGLElBQVMsU0FBUyxxREFBdUU7UUFFekY7WUFDRSxLQUFLLEVBQUUsQ0FBQzs7WUFDUixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsb0JBQW9CLENB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
|
package/package.json
CHANGED
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/acme/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './manager.acme-config.js';
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { logger } from '../logger.js';
|
|
2
|
+
import { AcmeConfigDoc } from '../db/documents/index.js';
|
|
3
|
+
import type { IDcRouterOptions } from '../classes.dcrouter.js';
|
|
4
|
+
import type { IAcmeConfig } from '../../ts_interfaces/data/acme-config.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* AcmeConfigManager — owns the singleton ACME configuration in the DB.
|
|
8
|
+
*
|
|
9
|
+
* Lifecycle:
|
|
10
|
+
* - `start()` — loads from the DB; if empty, seeds from legacy constructor
|
|
11
|
+
* fields (`tls.contactEmail`, `smartProxyConfig.acme.*`) on first boot.
|
|
12
|
+
* - `getConfig()` — returns the in-memory cached `IAcmeConfig` (or null)
|
|
13
|
+
* - `updateConfig(args, updatedBy)` — upserts and refreshes the cache
|
|
14
|
+
*
|
|
15
|
+
* Reload semantics: updates take effect on the next dcrouter restart because
|
|
16
|
+
* `SmartAcme` is instantiated once in `setupSmartProxy()`. `renewThresholdDays`
|
|
17
|
+
* applies immediately to the next renewal check. See
|
|
18
|
+
* `ts_web/elements/domains/ops-view-certificates.ts` for the UI warning.
|
|
19
|
+
*/
|
|
20
|
+
export class AcmeConfigManager {
|
|
21
|
+
private cached: IAcmeConfig | null = null;
|
|
22
|
+
|
|
23
|
+
constructor(private options: IDcRouterOptions) {}
|
|
24
|
+
|
|
25
|
+
public async start(): Promise<void> {
|
|
26
|
+
logger.log('info', 'AcmeConfigManager: starting');
|
|
27
|
+
let doc = await AcmeConfigDoc.load();
|
|
28
|
+
|
|
29
|
+
if (!doc) {
|
|
30
|
+
// First-boot path: seed from legacy constructor fields if present.
|
|
31
|
+
const seed = this.deriveSeedFromOptions();
|
|
32
|
+
if (seed) {
|
|
33
|
+
doc = await this.createSeedDoc(seed);
|
|
34
|
+
logger.log(
|
|
35
|
+
'info',
|
|
36
|
+
`AcmeConfigManager: seeded from constructor legacy fields (accountEmail=${seed.accountEmail}, useProduction=${seed.useProduction})`,
|
|
37
|
+
);
|
|
38
|
+
} else {
|
|
39
|
+
logger.log(
|
|
40
|
+
'info',
|
|
41
|
+
'AcmeConfigManager: no AcmeConfig in DB and no legacy constructor fields — ACME disabled until configured via Domains > Certificates > Settings.',
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
} else if (this.deriveSeedFromOptions()) {
|
|
45
|
+
logger.log(
|
|
46
|
+
'warn',
|
|
47
|
+
'AcmeConfigManager: ignoring constructor tls.contactEmail / smartProxyConfig.acme — DB already has AcmeConfigDoc. Manage via Domains > Certificates > Settings.',
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
this.cached = doc ? this.toPlain(doc) : null;
|
|
52
|
+
if (this.cached) {
|
|
53
|
+
logger.log(
|
|
54
|
+
'info',
|
|
55
|
+
`AcmeConfigManager: loaded ACME config (accountEmail=${this.cached.accountEmail}, enabled=${this.cached.enabled}, useProduction=${this.cached.useProduction})`,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public async stop(): Promise<void> {
|
|
61
|
+
this.cached = null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Returns the current ACME config, or null if not configured.
|
|
66
|
+
* In-memory — does not hit the DB.
|
|
67
|
+
*/
|
|
68
|
+
public getConfig(): IAcmeConfig | null {
|
|
69
|
+
return this.cached;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* True if there is an enabled ACME config. Used by `setupSmartProxy()` to
|
|
74
|
+
* decide whether to instantiate SmartAcme.
|
|
75
|
+
*/
|
|
76
|
+
public hasEnabledConfig(): boolean {
|
|
77
|
+
return this.cached !== null && this.cached.enabled;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Upsert the ACME config. All fields are optional; missing fields are
|
|
82
|
+
* preserved from the existing row (or defaulted if there is no row yet).
|
|
83
|
+
*/
|
|
84
|
+
public async updateConfig(
|
|
85
|
+
args: Partial<Omit<IAcmeConfig, 'updatedAt' | 'updatedBy'>>,
|
|
86
|
+
updatedBy: string,
|
|
87
|
+
): Promise<IAcmeConfig> {
|
|
88
|
+
let doc = await AcmeConfigDoc.load();
|
|
89
|
+
const now = Date.now();
|
|
90
|
+
|
|
91
|
+
if (!doc) {
|
|
92
|
+
doc = new AcmeConfigDoc();
|
|
93
|
+
doc.configId = 'acme-config';
|
|
94
|
+
doc.accountEmail = args.accountEmail ?? '';
|
|
95
|
+
doc.enabled = args.enabled ?? true;
|
|
96
|
+
doc.useProduction = args.useProduction ?? true;
|
|
97
|
+
doc.autoRenew = args.autoRenew ?? true;
|
|
98
|
+
doc.renewThresholdDays = args.renewThresholdDays ?? 30;
|
|
99
|
+
} else {
|
|
100
|
+
if (args.accountEmail !== undefined) doc.accountEmail = args.accountEmail;
|
|
101
|
+
if (args.enabled !== undefined) doc.enabled = args.enabled;
|
|
102
|
+
if (args.useProduction !== undefined) doc.useProduction = args.useProduction;
|
|
103
|
+
if (args.autoRenew !== undefined) doc.autoRenew = args.autoRenew;
|
|
104
|
+
if (args.renewThresholdDays !== undefined) doc.renewThresholdDays = args.renewThresholdDays;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
doc.updatedAt = now;
|
|
108
|
+
doc.updatedBy = updatedBy;
|
|
109
|
+
await doc.save();
|
|
110
|
+
|
|
111
|
+
this.cached = this.toPlain(doc);
|
|
112
|
+
return this.cached;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// ==========================================================================
|
|
116
|
+
// Internal helpers
|
|
117
|
+
// ==========================================================================
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Build a seed object from the legacy constructor fields. Returns null
|
|
121
|
+
* if the user has not provided any of them.
|
|
122
|
+
*
|
|
123
|
+
* Supports BOTH `tls.contactEmail` (short form) and `smartProxyConfig.acme`
|
|
124
|
+
* (full form). `smartProxyConfig.acme` wins when both are present.
|
|
125
|
+
*/
|
|
126
|
+
private deriveSeedFromOptions(): Omit<IAcmeConfig, 'updatedAt' | 'updatedBy'> | null {
|
|
127
|
+
const acme = this.options.smartProxyConfig?.acme;
|
|
128
|
+
const tls = this.options.tls;
|
|
129
|
+
|
|
130
|
+
// Prefer the explicit smartProxyConfig.acme block if present.
|
|
131
|
+
if (acme?.accountEmail) {
|
|
132
|
+
return {
|
|
133
|
+
accountEmail: acme.accountEmail,
|
|
134
|
+
enabled: acme.enabled !== false,
|
|
135
|
+
useProduction: acme.useProduction !== false,
|
|
136
|
+
autoRenew: acme.autoRenew !== false,
|
|
137
|
+
renewThresholdDays: acme.renewThresholdDays ?? 30,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Fall back to the short tls.contactEmail form.
|
|
142
|
+
if (tls?.contactEmail) {
|
|
143
|
+
return {
|
|
144
|
+
accountEmail: tls.contactEmail,
|
|
145
|
+
enabled: true,
|
|
146
|
+
useProduction: true,
|
|
147
|
+
autoRenew: true,
|
|
148
|
+
renewThresholdDays: 30,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
private async createSeedDoc(
|
|
156
|
+
seed: Omit<IAcmeConfig, 'updatedAt' | 'updatedBy'>,
|
|
157
|
+
): Promise<AcmeConfigDoc> {
|
|
158
|
+
const doc = new AcmeConfigDoc();
|
|
159
|
+
doc.configId = 'acme-config';
|
|
160
|
+
doc.accountEmail = seed.accountEmail;
|
|
161
|
+
doc.enabled = seed.enabled;
|
|
162
|
+
doc.useProduction = seed.useProduction;
|
|
163
|
+
doc.autoRenew = seed.autoRenew;
|
|
164
|
+
doc.renewThresholdDays = seed.renewThresholdDays;
|
|
165
|
+
doc.updatedAt = Date.now();
|
|
166
|
+
doc.updatedBy = 'seed';
|
|
167
|
+
await doc.save();
|
|
168
|
+
return doc;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private toPlain(doc: AcmeConfigDoc): IAcmeConfig {
|
|
172
|
+
return {
|
|
173
|
+
accountEmail: doc.accountEmail,
|
|
174
|
+
enabled: doc.enabled,
|
|
175
|
+
useProduction: doc.useProduction,
|
|
176
|
+
autoRenew: doc.autoRenew,
|
|
177
|
+
renewThresholdDays: doc.renewThresholdDays,
|
|
178
|
+
updatedAt: doc.updatedAt,
|
|
179
|
+
updatedBy: doc.updatedBy,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|