@serve.zone/dcrouter 6.8.0 → 6.10.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 +2638 -2556
- package/dist_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/opsserver/handlers/certificate.handler.d.ts +12 -0
- package/dist_ts/opsserver/handlers/certificate.handler.js +127 -1
- package/dist_ts_interfaces/requests/certificate.d.ts +50 -0
- package/dist_ts_web/00_commitinfo_data.js +2 -2
- package/dist_ts_web/appstate.d.ts +23 -0
- package/dist_ts_web/appstate.js +49 -1
- package/dist_ts_web/elements/ops-view-certificates.d.ts +1 -0
- package/dist_ts_web/elements/ops-view-certificates.js +123 -1
- package/package.json +2 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/opsserver/handlers/certificate.handler.ts +180 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate.ts +74 -0
- package/ts_web/elements/ops-view-certificates.ts +125 -0
|
@@ -268,6 +268,59 @@ let OpsViewCertificates = (() => {
|
|
|
268
268
|
: '',
|
|
269
269
|
})}
|
|
270
270
|
.dataActions=${[
|
|
271
|
+
{
|
|
272
|
+
name: 'Import Certificate',
|
|
273
|
+
iconName: 'lucide:upload',
|
|
274
|
+
type: ['header'],
|
|
275
|
+
actionFunc: async () => {
|
|
276
|
+
const { DeesModal } = await import('@design.estate/dees-catalog');
|
|
277
|
+
await DeesModal.createAndShow({
|
|
278
|
+
heading: 'Import Certificate',
|
|
279
|
+
content: html `
|
|
280
|
+
<dees-form>
|
|
281
|
+
<dees-input-fileupload
|
|
282
|
+
key="certJsonFile"
|
|
283
|
+
label="Certificate JSON (.tsclass.cert.json)"
|
|
284
|
+
accept=".json"
|
|
285
|
+
.multiple=${false}
|
|
286
|
+
required
|
|
287
|
+
></dees-input-fileupload>
|
|
288
|
+
</dees-form>
|
|
289
|
+
`,
|
|
290
|
+
menuOptions: [
|
|
291
|
+
{
|
|
292
|
+
name: 'Import',
|
|
293
|
+
iconName: 'lucide:upload',
|
|
294
|
+
action: async (modal) => {
|
|
295
|
+
const { DeesToast } = await import('@design.estate/dees-catalog');
|
|
296
|
+
try {
|
|
297
|
+
const form = modal.shadowRoot.querySelector('dees-form');
|
|
298
|
+
const formData = await form.collectFormData();
|
|
299
|
+
const files = formData.certJsonFile;
|
|
300
|
+
if (!files || files.length === 0) {
|
|
301
|
+
DeesToast.show({ message: 'Please select a JSON file.', type: 'warning', duration: 3000 });
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
const file = files[0];
|
|
305
|
+
const text = await file.text();
|
|
306
|
+
const cert = JSON.parse(text);
|
|
307
|
+
if (!cert.domainName || !cert.publicKey || !cert.privateKey) {
|
|
308
|
+
DeesToast.show({ message: 'Invalid cert JSON: missing domainName, publicKey, or privateKey.', type: 'error', duration: 4000 });
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
await appstate.certificateStatePart.dispatchAction(appstate.importCertificateAction, cert);
|
|
312
|
+
DeesToast.show({ message: `Certificate imported for ${cert.domainName}`, type: 'success', duration: 3000 });
|
|
313
|
+
modal.destroy();
|
|
314
|
+
}
|
|
315
|
+
catch (err) {
|
|
316
|
+
DeesToast.show({ message: `Import failed: ${err.message}`, type: 'error', duration: 4000 });
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
},
|
|
320
|
+
],
|
|
321
|
+
});
|
|
322
|
+
},
|
|
323
|
+
},
|
|
271
324
|
{
|
|
272
325
|
name: 'Reprovision',
|
|
273
326
|
iconName: 'lucide:RefreshCw',
|
|
@@ -292,6 +345,63 @@ let OpsViewCertificates = (() => {
|
|
|
292
345
|
});
|
|
293
346
|
},
|
|
294
347
|
},
|
|
348
|
+
{
|
|
349
|
+
name: 'Export',
|
|
350
|
+
iconName: 'lucide:download',
|
|
351
|
+
type: ['inRow', 'contextmenu'],
|
|
352
|
+
actionFunc: async (actionData) => {
|
|
353
|
+
const { DeesToast } = await import('@design.estate/dees-catalog');
|
|
354
|
+
const cert = actionData.item;
|
|
355
|
+
try {
|
|
356
|
+
const response = await appstate.fetchCertificateExport(cert.domain);
|
|
357
|
+
if (response.success && response.cert) {
|
|
358
|
+
const safeDomain = cert.domain.replace(/\*/g, '_wildcard');
|
|
359
|
+
this.downloadJsonFile(`${safeDomain}.tsclass.cert.json`, response.cert);
|
|
360
|
+
DeesToast.show({ message: `Certificate exported for ${cert.domain}`, type: 'success', duration: 3000 });
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
DeesToast.show({ message: response.message || 'Export failed', type: 'error', duration: 4000 });
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
catch (err) {
|
|
367
|
+
DeesToast.show({ message: `Export failed: ${err.message}`, type: 'error', duration: 4000 });
|
|
368
|
+
}
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
name: 'Delete',
|
|
373
|
+
iconName: 'lucide:trash-2',
|
|
374
|
+
type: ['inRow', 'contextmenu'],
|
|
375
|
+
actionFunc: async (actionData) => {
|
|
376
|
+
const cert = actionData.item;
|
|
377
|
+
const { DeesModal, DeesToast } = await import('@design.estate/dees-catalog');
|
|
378
|
+
await DeesModal.createAndShow({
|
|
379
|
+
heading: `Delete Certificate: ${cert.domain}`,
|
|
380
|
+
content: html `
|
|
381
|
+
<div style="padding: 20px; font-size: 14px;">
|
|
382
|
+
<p>Are you sure you want to delete the certificate data for <strong>${cert.domain}</strong>?</p>
|
|
383
|
+
<p style="color: #f59e0b; margin-top: 12px;">Note: The certificate may remain in proxy memory until the next restart or reprovisioning.</p>
|
|
384
|
+
</div>
|
|
385
|
+
`,
|
|
386
|
+
menuOptions: [
|
|
387
|
+
{
|
|
388
|
+
name: 'Delete',
|
|
389
|
+
iconName: 'lucide:trash-2',
|
|
390
|
+
action: async (modal) => {
|
|
391
|
+
try {
|
|
392
|
+
await appstate.certificateStatePart.dispatchAction(appstate.deleteCertificateAction, cert.domain);
|
|
393
|
+
DeesToast.show({ message: `Certificate deleted for ${cert.domain}`, type: 'success', duration: 3000 });
|
|
394
|
+
modal.destroy();
|
|
395
|
+
}
|
|
396
|
+
catch (err) {
|
|
397
|
+
DeesToast.show({ message: `Delete failed: ${err.message}`, type: 'error', duration: 4000 });
|
|
398
|
+
}
|
|
399
|
+
},
|
|
400
|
+
},
|
|
401
|
+
],
|
|
402
|
+
});
|
|
403
|
+
},
|
|
404
|
+
},
|
|
295
405
|
{
|
|
296
406
|
name: 'View Details',
|
|
297
407
|
iconName: 'lucide:Search',
|
|
@@ -332,6 +442,18 @@ let OpsViewCertificates = (() => {
|
|
|
332
442
|
></dees-table>
|
|
333
443
|
`;
|
|
334
444
|
}
|
|
445
|
+
downloadJsonFile(filename, data) {
|
|
446
|
+
const json = JSON.stringify(data, null, 2);
|
|
447
|
+
const blob = new Blob([json], { type: 'application/json' });
|
|
448
|
+
const url = URL.createObjectURL(blob);
|
|
449
|
+
const a = document.createElement('a');
|
|
450
|
+
a.href = url;
|
|
451
|
+
a.download = filename;
|
|
452
|
+
document.body.appendChild(a);
|
|
453
|
+
a.click();
|
|
454
|
+
document.body.removeChild(a);
|
|
455
|
+
URL.revokeObjectURL(url);
|
|
456
|
+
}
|
|
335
457
|
renderRoutePills(routeNames) {
|
|
336
458
|
const maxShow = 3;
|
|
337
459
|
const visible = routeNames.slice(0, maxShow);
|
|
@@ -403,4 +525,4 @@ let OpsViewCertificates = (() => {
|
|
|
403
525
|
return OpsViewCertificates = _classThis;
|
|
404
526
|
})();
|
|
405
527
|
export { OpsViewCertificates };
|
|
406
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctY2VydGlmaWNhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL2VsZW1lbnRzL29wcy12aWV3LWNlcnRpZmljYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUNMLFdBQVcsRUFDWCxJQUFJLEVBQ0osYUFBYSxFQUViLEdBQUcsRUFDSCxLQUFLLEVBQ0wsVUFBVSxHQUNYLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxLQUFLLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEtBQUssVUFBVSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQW1CLE1BQU0sNkJBQTZCLENBQUM7SUFTakQsbUJBQW1COzRCQUQvQixhQUFhLENBQUMsdUJBQXVCLENBQUM7Ozs7c0JBQ0UsV0FBVzs7OzttQ0FBbkIsU0FBUSxXQUFXOzs7O3FDQUNqRCxLQUFLLEVBQUU7WUFDUixnTEFBUyxTQUFTLDZCQUFULFNBQVMsNkZBQXdFO1lBRjVGLDZLQXNXQzs7OztRQXBXQywrRUFBaUQsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxFQUFDO1FBQTFGLElBQVMsU0FBUywrQ0FBd0U7UUFBMUYsSUFBUyxTQUFTLHFEQUF3RTtRQUUxRjtZQUNFLEtBQUssRUFBRSxDQUFDOztZQUNSLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ3JFLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDaEM7UUFFRCxLQUFL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
|
|
528
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctY2VydGlmaWNhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL2VsZW1lbnRzL29wcy12aWV3LWNlcnRpZmljYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUNMLFdBQVcsRUFDWCxJQUFJLEVBQ0osYUFBYSxFQUViLEdBQUcsRUFDSCxLQUFLLEVBQ0wsVUFBVSxHQUNYLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxLQUFLLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEtBQUssVUFBVSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQW1CLE1BQU0sNkJBQTZCLENBQUM7SUFTakQsbUJBQW1COzRCQUQvQixhQUFhLENBQUMsdUJBQXVCLENBQUM7Ozs7c0JBQ0UsV0FBVzs7OzttQ0FBbkIsU0FBUSxXQUFXOzs7O3FDQUNqRCxLQUFLLEVBQUU7WUFDUixnTEFBUyxTQUFTLDZCQUFULFNBQVMsNkZBQXdFO1lBRjVGLDZLQW1lQzs7OztRQWplQywrRUFBaUQsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxFQUFDO1FBQTFGLElBQVMsU0FBUywrQ0FBd0U7UUFBMUYsSUFBUyxTQUFTLHFEQUF3RTtRQUUxRjtZQUNFLEtBQUssRUFBRSxDQUFDOztZQUNSLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ3JFLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDaEM7UUFFRCxLQUFL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
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@serve.zone/dcrouter",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "6.
|
|
4
|
+
"version": "6.10.0",
|
|
5
5
|
"description": "A multifaceted routing service handling mail and SMS delivery functions.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"exports": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"@api.global/typedserver": "^8.3.0",
|
|
33
33
|
"@api.global/typedsocket": "^4.1.0",
|
|
34
34
|
"@apiclient.xyz/cloudflare": "^7.1.0",
|
|
35
|
-
"@design.estate/dees-catalog": "^3.
|
|
35
|
+
"@design.estate/dees-catalog": "^3.43.0",
|
|
36
36
|
"@design.estate/dees-element": "^2.1.6",
|
|
37
37
|
"@push.rocks/projectinfo": "^5.0.2",
|
|
38
38
|
"@push.rocks/qenv": "^6.1.3",
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -42,6 +42,36 @@ export class CertificateHandler {
|
|
|
42
42
|
}
|
|
43
43
|
)
|
|
44
44
|
);
|
|
45
|
+
|
|
46
|
+
// Delete certificate
|
|
47
|
+
this.typedrouter.addTypedHandler(
|
|
48
|
+
new plugins.typedrequest.TypedHandler<interfaces.requests.IReq_DeleteCertificate>(
|
|
49
|
+
'deleteCertificate',
|
|
50
|
+
async (dataArg) => {
|
|
51
|
+
return this.deleteCertificate(dataArg.domain);
|
|
52
|
+
}
|
|
53
|
+
)
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
// Export certificate
|
|
57
|
+
this.typedrouter.addTypedHandler(
|
|
58
|
+
new plugins.typedrequest.TypedHandler<interfaces.requests.IReq_ExportCertificate>(
|
|
59
|
+
'exportCertificate',
|
|
60
|
+
async (dataArg) => {
|
|
61
|
+
return this.exportCertificate(dataArg.domain);
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
// Import certificate
|
|
67
|
+
this.typedrouter.addTypedHandler(
|
|
68
|
+
new plugins.typedrequest.TypedHandler<interfaces.requests.IReq_ImportCertificate>(
|
|
69
|
+
'importCertificate',
|
|
70
|
+
async (dataArg) => {
|
|
71
|
+
return this.importCertificate(dataArg.cert);
|
|
72
|
+
}
|
|
73
|
+
)
|
|
74
|
+
);
|
|
45
75
|
}
|
|
46
76
|
|
|
47
77
|
/**
|
|
@@ -324,4 +354,154 @@ export class CertificateHandler {
|
|
|
324
354
|
|
|
325
355
|
return { success: false, message: `No routes found for domain '${domain}'` };
|
|
326
356
|
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Delete certificate data for a domain from storage
|
|
360
|
+
*/
|
|
361
|
+
private async deleteCertificate(domain: string): Promise<{ success: boolean; message?: string }> {
|
|
362
|
+
const dcRouter = this.opsServerRef.dcRouterRef;
|
|
363
|
+
const cleanDomain = domain.replace(/^\*\.?/, '');
|
|
364
|
+
|
|
365
|
+
// Delete from all known storage paths
|
|
366
|
+
const paths = [
|
|
367
|
+
`/proxy-certs/${domain}`,
|
|
368
|
+
`/proxy-certs/${cleanDomain}`,
|
|
369
|
+
`/certs/${cleanDomain}`,
|
|
370
|
+
];
|
|
371
|
+
|
|
372
|
+
for (const path of paths) {
|
|
373
|
+
try {
|
|
374
|
+
await dcRouter.storageManager.delete(path);
|
|
375
|
+
} catch {
|
|
376
|
+
// Path may not exist — ignore
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// Clear from in-memory status map
|
|
381
|
+
dcRouter.certificateStatusMap.delete(domain);
|
|
382
|
+
|
|
383
|
+
// Clear backoff info
|
|
384
|
+
if (dcRouter.certProvisionScheduler) {
|
|
385
|
+
await dcRouter.certProvisionScheduler.clearBackoff(domain);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
return { success: true, message: `Certificate data deleted for '${domain}'` };
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Export certificate data for a domain as ICert-shaped JSON
|
|
393
|
+
*/
|
|
394
|
+
private async exportCertificate(domain: string): Promise<{
|
|
395
|
+
success: boolean;
|
|
396
|
+
cert?: {
|
|
397
|
+
id: string;
|
|
398
|
+
domainName: string;
|
|
399
|
+
created: number;
|
|
400
|
+
validUntil: number;
|
|
401
|
+
privateKey: string;
|
|
402
|
+
publicKey: string;
|
|
403
|
+
csr: string;
|
|
404
|
+
};
|
|
405
|
+
message?: string;
|
|
406
|
+
}> {
|
|
407
|
+
const dcRouter = this.opsServerRef.dcRouterRef;
|
|
408
|
+
const cleanDomain = domain.replace(/^\*\.?/, '');
|
|
409
|
+
|
|
410
|
+
// Try SmartAcme /certs/ path first (has full ICert fields)
|
|
411
|
+
let certData = await dcRouter.storageManager.getJSON(`/certs/${cleanDomain}`);
|
|
412
|
+
if (certData && certData.publicKey && certData.privateKey) {
|
|
413
|
+
return {
|
|
414
|
+
success: true,
|
|
415
|
+
cert: {
|
|
416
|
+
id: certData.id || plugins.crypto.randomUUID(),
|
|
417
|
+
domainName: certData.domainName || domain,
|
|
418
|
+
created: certData.created || Date.now(),
|
|
419
|
+
validUntil: certData.validUntil || 0,
|
|
420
|
+
privateKey: certData.privateKey,
|
|
421
|
+
publicKey: certData.publicKey,
|
|
422
|
+
csr: certData.csr || '',
|
|
423
|
+
},
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// Fallback: try /proxy-certs/ with original domain
|
|
428
|
+
certData = await dcRouter.storageManager.getJSON(`/proxy-certs/${domain}`);
|
|
429
|
+
if (!certData || !certData.publicKey) {
|
|
430
|
+
// Try with clean domain
|
|
431
|
+
certData = await dcRouter.storageManager.getJSON(`/proxy-certs/${cleanDomain}`);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
if (certData && certData.publicKey && certData.privateKey) {
|
|
435
|
+
return {
|
|
436
|
+
success: true,
|
|
437
|
+
cert: {
|
|
438
|
+
id: plugins.crypto.randomUUID(),
|
|
439
|
+
domainName: domain,
|
|
440
|
+
created: certData.validFrom || Date.now(),
|
|
441
|
+
validUntil: certData.validUntil || 0,
|
|
442
|
+
privateKey: certData.privateKey,
|
|
443
|
+
publicKey: certData.publicKey,
|
|
444
|
+
csr: '',
|
|
445
|
+
},
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
return { success: false, message: `No certificate data found for '${domain}'` };
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Import a certificate from ICert-shaped JSON
|
|
454
|
+
*/
|
|
455
|
+
private async importCertificate(cert: {
|
|
456
|
+
id: string;
|
|
457
|
+
domainName: string;
|
|
458
|
+
created: number;
|
|
459
|
+
validUntil: number;
|
|
460
|
+
privateKey: string;
|
|
461
|
+
publicKey: string;
|
|
462
|
+
csr: string;
|
|
463
|
+
}): Promise<{ success: boolean; message?: string }> {
|
|
464
|
+
// Validate PEM content
|
|
465
|
+
if (!cert.publicKey || !cert.publicKey.includes('-----BEGIN CERTIFICATE-----')) {
|
|
466
|
+
return { success: false, message: 'Invalid publicKey: must contain a PEM-encoded certificate' };
|
|
467
|
+
}
|
|
468
|
+
if (!cert.privateKey || !cert.privateKey.includes('-----BEGIN')) {
|
|
469
|
+
return { success: false, message: 'Invalid privateKey: must contain a PEM-encoded key' };
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
const dcRouter = this.opsServerRef.dcRouterRef;
|
|
473
|
+
const cleanDomain = cert.domainName.replace(/^\*\.?/, '');
|
|
474
|
+
|
|
475
|
+
// Save to /certs/ (SmartAcme-compatible path)
|
|
476
|
+
await dcRouter.storageManager.setJSON(`/certs/${cleanDomain}`, {
|
|
477
|
+
id: cert.id,
|
|
478
|
+
domainName: cert.domainName,
|
|
479
|
+
created: cert.created,
|
|
480
|
+
validUntil: cert.validUntil,
|
|
481
|
+
privateKey: cert.privateKey,
|
|
482
|
+
publicKey: cert.publicKey,
|
|
483
|
+
csr: cert.csr || '',
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
// Also save to /proxy-certs/ (proxy-cert format)
|
|
487
|
+
await dcRouter.storageManager.setJSON(`/proxy-certs/${cert.domainName}`, {
|
|
488
|
+
domain: cert.domainName,
|
|
489
|
+
publicKey: cert.publicKey,
|
|
490
|
+
privateKey: cert.privateKey,
|
|
491
|
+
ca: undefined,
|
|
492
|
+
validUntil: cert.validUntil,
|
|
493
|
+
validFrom: cert.created,
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
// Update in-memory status map
|
|
497
|
+
dcRouter.certificateStatusMap.set(cert.domainName, {
|
|
498
|
+
status: 'valid',
|
|
499
|
+
source: 'static',
|
|
500
|
+
expiryDate: cert.validUntil ? new Date(cert.validUntil).toISOString() : undefined,
|
|
501
|
+
issuedAt: cert.created ? new Date(cert.created).toISOString() : undefined,
|
|
502
|
+
routeNames: [],
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
return { success: true, message: `Certificate imported for '${cert.domainName}'` };
|
|
506
|
+
}
|
|
327
507
|
}
|
package/ts_web/appstate.ts
CHANGED
|
@@ -780,6 +780,80 @@ export const reprovisionCertificateAction = certificateStatePart.createAction<st
|
|
|
780
780
|
}
|
|
781
781
|
);
|
|
782
782
|
|
|
783
|
+
export const deleteCertificateAction = certificateStatePart.createAction<string>(
|
|
784
|
+
async (statePartArg, domain) => {
|
|
785
|
+
const context = getActionContext();
|
|
786
|
+
const currentState = statePartArg.getState();
|
|
787
|
+
|
|
788
|
+
try {
|
|
789
|
+
const request = new plugins.domtools.plugins.typedrequest.TypedRequest<
|
|
790
|
+
interfaces.requests.IReq_DeleteCertificate
|
|
791
|
+
>('/typedrequest', 'deleteCertificate');
|
|
792
|
+
|
|
793
|
+
await request.fire({
|
|
794
|
+
identity: context.identity,
|
|
795
|
+
domain,
|
|
796
|
+
});
|
|
797
|
+
|
|
798
|
+
// Re-fetch overview after deletion
|
|
799
|
+
await certificateStatePart.dispatchAction(fetchCertificateOverviewAction, null);
|
|
800
|
+
return statePartArg.getState();
|
|
801
|
+
} catch (error) {
|
|
802
|
+
return {
|
|
803
|
+
...currentState,
|
|
804
|
+
error: error instanceof Error ? error.message : 'Failed to delete certificate',
|
|
805
|
+
};
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
);
|
|
809
|
+
|
|
810
|
+
export const importCertificateAction = certificateStatePart.createAction<{
|
|
811
|
+
id: string;
|
|
812
|
+
domainName: string;
|
|
813
|
+
created: number;
|
|
814
|
+
validUntil: number;
|
|
815
|
+
privateKey: string;
|
|
816
|
+
publicKey: string;
|
|
817
|
+
csr: string;
|
|
818
|
+
}>(
|
|
819
|
+
async (statePartArg, cert) => {
|
|
820
|
+
const context = getActionContext();
|
|
821
|
+
const currentState = statePartArg.getState();
|
|
822
|
+
|
|
823
|
+
try {
|
|
824
|
+
const request = new plugins.domtools.plugins.typedrequest.TypedRequest<
|
|
825
|
+
interfaces.requests.IReq_ImportCertificate
|
|
826
|
+
>('/typedrequest', 'importCertificate');
|
|
827
|
+
|
|
828
|
+
await request.fire({
|
|
829
|
+
identity: context.identity,
|
|
830
|
+
cert,
|
|
831
|
+
});
|
|
832
|
+
|
|
833
|
+
// Re-fetch overview after import
|
|
834
|
+
await certificateStatePart.dispatchAction(fetchCertificateOverviewAction, null);
|
|
835
|
+
return statePartArg.getState();
|
|
836
|
+
} catch (error) {
|
|
837
|
+
return {
|
|
838
|
+
...currentState,
|
|
839
|
+
error: error instanceof Error ? error.message : 'Failed to import certificate',
|
|
840
|
+
};
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
);
|
|
844
|
+
|
|
845
|
+
export async function fetchCertificateExport(domain: string) {
|
|
846
|
+
const context = getActionContext();
|
|
847
|
+
const request = new plugins.domtools.plugins.typedrequest.TypedRequest<
|
|
848
|
+
interfaces.requests.IReq_ExportCertificate
|
|
849
|
+
>('/typedrequest', 'exportCertificate');
|
|
850
|
+
|
|
851
|
+
return request.fire({
|
|
852
|
+
identity: context.identity,
|
|
853
|
+
domain,
|
|
854
|
+
});
|
|
855
|
+
}
|
|
856
|
+
|
|
783
857
|
// ============================================================================
|
|
784
858
|
// Remote Ingress Actions
|
|
785
859
|
// ============================================================================
|
|
@@ -241,6 +241,61 @@ export class OpsViewCertificates extends DeesElement {
|
|
|
241
241
|
: '',
|
|
242
242
|
})}
|
|
243
243
|
.dataActions=${[
|
|
244
|
+
{
|
|
245
|
+
name: 'Import Certificate',
|
|
246
|
+
iconName: 'lucide:upload',
|
|
247
|
+
type: ['header'],
|
|
248
|
+
actionFunc: async () => {
|
|
249
|
+
const { DeesModal } = await import('@design.estate/dees-catalog');
|
|
250
|
+
await DeesModal.createAndShow({
|
|
251
|
+
heading: 'Import Certificate',
|
|
252
|
+
content: html`
|
|
253
|
+
<dees-form>
|
|
254
|
+
<dees-input-fileupload
|
|
255
|
+
key="certJsonFile"
|
|
256
|
+
label="Certificate JSON (.tsclass.cert.json)"
|
|
257
|
+
accept=".json"
|
|
258
|
+
.multiple=${false}
|
|
259
|
+
required
|
|
260
|
+
></dees-input-fileupload>
|
|
261
|
+
</dees-form>
|
|
262
|
+
`,
|
|
263
|
+
menuOptions: [
|
|
264
|
+
{
|
|
265
|
+
name: 'Import',
|
|
266
|
+
iconName: 'lucide:upload',
|
|
267
|
+
action: async (modal) => {
|
|
268
|
+
const { DeesToast } = await import('@design.estate/dees-catalog');
|
|
269
|
+
try {
|
|
270
|
+
const form = modal.shadowRoot.querySelector('dees-form') as any;
|
|
271
|
+
const formData = await form.collectFormData();
|
|
272
|
+
const files = formData.certJsonFile;
|
|
273
|
+
if (!files || files.length === 0) {
|
|
274
|
+
DeesToast.show({ message: 'Please select a JSON file.', type: 'warning', duration: 3000 });
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const file = files[0];
|
|
278
|
+
const text = await file.text();
|
|
279
|
+
const cert = JSON.parse(text);
|
|
280
|
+
if (!cert.domainName || !cert.publicKey || !cert.privateKey) {
|
|
281
|
+
DeesToast.show({ message: 'Invalid cert JSON: missing domainName, publicKey, or privateKey.', type: 'error', duration: 4000 });
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
await appstate.certificateStatePart.dispatchAction(
|
|
285
|
+
appstate.importCertificateAction,
|
|
286
|
+
cert,
|
|
287
|
+
);
|
|
288
|
+
DeesToast.show({ message: `Certificate imported for ${cert.domainName}`, type: 'success', duration: 3000 });
|
|
289
|
+
modal.destroy();
|
|
290
|
+
} catch (err) {
|
|
291
|
+
DeesToast.show({ message: `Import failed: ${err.message}`, type: 'error', duration: 4000 });
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
},
|
|
295
|
+
],
|
|
296
|
+
});
|
|
297
|
+
},
|
|
298
|
+
},
|
|
244
299
|
{
|
|
245
300
|
name: 'Reprovision',
|
|
246
301
|
iconName: 'lucide:RefreshCw',
|
|
@@ -268,6 +323,63 @@ export class OpsViewCertificates extends DeesElement {
|
|
|
268
323
|
});
|
|
269
324
|
},
|
|
270
325
|
},
|
|
326
|
+
{
|
|
327
|
+
name: 'Export',
|
|
328
|
+
iconName: 'lucide:download',
|
|
329
|
+
type: ['inRow', 'contextmenu'],
|
|
330
|
+
actionFunc: async (actionData: { item: interfaces.requests.ICertificateInfo }) => {
|
|
331
|
+
const { DeesToast } = await import('@design.estate/dees-catalog');
|
|
332
|
+
const cert = actionData.item;
|
|
333
|
+
try {
|
|
334
|
+
const response = await appstate.fetchCertificateExport(cert.domain);
|
|
335
|
+
if (response.success && response.cert) {
|
|
336
|
+
const safeDomain = cert.domain.replace(/\*/g, '_wildcard');
|
|
337
|
+
this.downloadJsonFile(`${safeDomain}.tsclass.cert.json`, response.cert);
|
|
338
|
+
DeesToast.show({ message: `Certificate exported for ${cert.domain}`, type: 'success', duration: 3000 });
|
|
339
|
+
} else {
|
|
340
|
+
DeesToast.show({ message: response.message || 'Export failed', type: 'error', duration: 4000 });
|
|
341
|
+
}
|
|
342
|
+
} catch (err) {
|
|
343
|
+
DeesToast.show({ message: `Export failed: ${err.message}`, type: 'error', duration: 4000 });
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
name: 'Delete',
|
|
349
|
+
iconName: 'lucide:trash-2',
|
|
350
|
+
type: ['inRow', 'contextmenu'],
|
|
351
|
+
actionFunc: async (actionData: { item: interfaces.requests.ICertificateInfo }) => {
|
|
352
|
+
const cert = actionData.item;
|
|
353
|
+
const { DeesModal, DeesToast } = await import('@design.estate/dees-catalog');
|
|
354
|
+
await DeesModal.createAndShow({
|
|
355
|
+
heading: `Delete Certificate: ${cert.domain}`,
|
|
356
|
+
content: html`
|
|
357
|
+
<div style="padding: 20px; font-size: 14px;">
|
|
358
|
+
<p>Are you sure you want to delete the certificate data for <strong>${cert.domain}</strong>?</p>
|
|
359
|
+
<p style="color: #f59e0b; margin-top: 12px;">Note: The certificate may remain in proxy memory until the next restart or reprovisioning.</p>
|
|
360
|
+
</div>
|
|
361
|
+
`,
|
|
362
|
+
menuOptions: [
|
|
363
|
+
{
|
|
364
|
+
name: 'Delete',
|
|
365
|
+
iconName: 'lucide:trash-2',
|
|
366
|
+
action: async (modal) => {
|
|
367
|
+
try {
|
|
368
|
+
await appstate.certificateStatePart.dispatchAction(
|
|
369
|
+
appstate.deleteCertificateAction,
|
|
370
|
+
cert.domain,
|
|
371
|
+
);
|
|
372
|
+
DeesToast.show({ message: `Certificate deleted for ${cert.domain}`, type: 'success', duration: 3000 });
|
|
373
|
+
modal.destroy();
|
|
374
|
+
} catch (err) {
|
|
375
|
+
DeesToast.show({ message: `Delete failed: ${err.message}`, type: 'error', duration: 4000 });
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
},
|
|
379
|
+
],
|
|
380
|
+
});
|
|
381
|
+
},
|
|
382
|
+
},
|
|
271
383
|
{
|
|
272
384
|
name: 'View Details',
|
|
273
385
|
iconName: 'lucide:Search',
|
|
@@ -309,6 +421,19 @@ export class OpsViewCertificates extends DeesElement {
|
|
|
309
421
|
`;
|
|
310
422
|
}
|
|
311
423
|
|
|
424
|
+
private downloadJsonFile(filename: string, data: any): void {
|
|
425
|
+
const json = JSON.stringify(data, null, 2);
|
|
426
|
+
const blob = new Blob([json], { type: 'application/json' });
|
|
427
|
+
const url = URL.createObjectURL(blob);
|
|
428
|
+
const a = document.createElement('a');
|
|
429
|
+
a.href = url;
|
|
430
|
+
a.download = filename;
|
|
431
|
+
document.body.appendChild(a);
|
|
432
|
+
a.click();
|
|
433
|
+
document.body.removeChild(a);
|
|
434
|
+
URL.revokeObjectURL(url);
|
|
435
|
+
}
|
|
436
|
+
|
|
312
437
|
private renderRoutePills(routeNames: string[]): TemplateResult {
|
|
313
438
|
const maxShow = 3;
|
|
314
439
|
const visible = routeNames.slice(0, maxShow);
|