roster-server 2.3.12 → 2.3.16
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/index.js
CHANGED
|
@@ -258,17 +258,14 @@ class Roster {
|
|
|
258
258
|
this.maxLocalPort = options.maxLocalPort || 9999;
|
|
259
259
|
this.tlsMinVersion = options.tlsMinVersion ?? 'TLSv1.2';
|
|
260
260
|
this.tlsMaxVersion = options.tlsMaxVersion ?? 'TLSv1.3';
|
|
261
|
-
this.disableWildcard = options.disableWildcard
|
|
262
|
-
|
|
263
|
-
: parseBooleanFlag(process.env.ROSTER_DISABLE_WILDCARD, false);
|
|
264
|
-
const combineDefault = false;
|
|
265
|
-
this.combineWildcardCerts = options.combineWildcardCerts !== undefined
|
|
266
|
-
? parseBooleanFlag(options.combineWildcardCerts, combineDefault)
|
|
267
|
-
: parseBooleanFlag(process.env.ROSTER_COMBINE_WILDCARD_CERTS, combineDefault);
|
|
261
|
+
this.disableWildcard = parseBooleanFlag(options.disableWildcard, false);
|
|
262
|
+
this.combineWildcardCerts = parseBooleanFlag(options.combineWildcardCerts, false);
|
|
268
263
|
if (isBunRuntime && this.combineWildcardCerts) {
|
|
269
264
|
log.info('Bun runtime detected: combined wildcard certificates enabled (SNI bypass)');
|
|
270
265
|
}
|
|
271
266
|
|
|
267
|
+
this.skipLocalCheck = parseBooleanFlag(options.skipLocalCheck, true);
|
|
268
|
+
|
|
272
269
|
const port = options.port === undefined ? 443 : options.port;
|
|
273
270
|
if (port === 80 && !this.local) {
|
|
274
271
|
throw new Error('⚠️ Port 80 is reserved for ACME challenge. Please use a different port.');
|
|
@@ -749,6 +746,8 @@ class Roster {
|
|
|
749
746
|
maintainerEmail: this.email,
|
|
750
747
|
cluster: this.cluster,
|
|
751
748
|
staging: this.staging,
|
|
749
|
+
skipDryRun: this.skipLocalCheck,
|
|
750
|
+
skipChallengeTest: this.skipLocalCheck,
|
|
752
751
|
notify: (event, details) => {
|
|
753
752
|
const eventDomain = (() => {
|
|
754
753
|
if (!details || typeof details !== 'object') return null;
|
package/package.json
CHANGED
|
@@ -302,27 +302,13 @@ describe('Roster', () => {
|
|
|
302
302
|
const roster = new Roster({ local: true, disableWildcard: true });
|
|
303
303
|
assert.strictEqual(roster.disableWildcard, true);
|
|
304
304
|
});
|
|
305
|
-
it('
|
|
306
|
-
const
|
|
307
|
-
|
|
308
|
-
try {
|
|
309
|
-
const roster = new Roster({ local: true });
|
|
310
|
-
assert.strictEqual(roster.disableWildcard, true);
|
|
311
|
-
} finally {
|
|
312
|
-
if (previous === undefined) delete process.env.ROSTER_DISABLE_WILDCARD;
|
|
313
|
-
else process.env.ROSTER_DISABLE_WILDCARD = previous;
|
|
314
|
-
}
|
|
305
|
+
it('enables disableWildcard from constructor option (truthy string)', () => {
|
|
306
|
+
const roster = new Roster({ local: true, disableWildcard: '1' });
|
|
307
|
+
assert.strictEqual(roster.disableWildcard, true);
|
|
315
308
|
});
|
|
316
|
-
it('enables combined wildcard certs from
|
|
317
|
-
const
|
|
318
|
-
|
|
319
|
-
try {
|
|
320
|
-
const roster = new Roster({ local: false });
|
|
321
|
-
assert.strictEqual(roster.combineWildcardCerts, true);
|
|
322
|
-
} finally {
|
|
323
|
-
if (previous === undefined) delete process.env.ROSTER_COMBINE_WILDCARD_CERTS;
|
|
324
|
-
else process.env.ROSTER_COMBINE_WILDCARD_CERTS = previous;
|
|
325
|
-
}
|
|
309
|
+
it('enables combined wildcard certs from constructor option', () => {
|
|
310
|
+
const roster = new Roster({ local: false, combineWildcardCerts: true });
|
|
311
|
+
assert.strictEqual(roster.combineWildcardCerts, true);
|
|
326
312
|
});
|
|
327
313
|
it('defaults combineWildcardCerts to false', () => {
|
|
328
314
|
const roster = new Roster({ local: false });
|
|
@@ -373,7 +373,9 @@ G.create = function(gconf) {
|
|
|
373
373
|
maintainerEmail: gconf.maintainerEmail,
|
|
374
374
|
packageAgent: packageAgent,
|
|
375
375
|
notify: greenlock._notify,
|
|
376
|
-
debug: greenlock._defaults.debug || args.debug
|
|
376
|
+
debug: greenlock._defaults.debug || args.debug,
|
|
377
|
+
skipDryRun: gconf.skipDryRun || false,
|
|
378
|
+
skipChallengeTest: gconf.skipChallengeTest || false
|
|
377
379
|
});
|
|
378
380
|
|
|
379
381
|
var dir = caches[dirUrl];
|
|
@@ -382,13 +384,34 @@ G.create = function(gconf) {
|
|
|
382
384
|
return dir.promise;
|
|
383
385
|
}
|
|
384
386
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
387
|
+
var maxRetries = 3;
|
|
388
|
+
var lastErr;
|
|
389
|
+
for (var attempt = 1; attempt <= maxRetries; attempt++) {
|
|
390
|
+
try {
|
|
391
|
+
await acme.init(dirUrl);
|
|
392
|
+
lastErr = null;
|
|
393
|
+
break;
|
|
394
|
+
} catch (err) {
|
|
395
|
+
lastErr = err;
|
|
396
|
+
log.error(
|
|
397
|
+
"ACME init attempt " +
|
|
398
|
+
attempt +
|
|
399
|
+
"/" +
|
|
400
|
+
maxRetries +
|
|
401
|
+
" failed (directory may be down or directoryUrl wrong):",
|
|
402
|
+
err.message
|
|
403
|
+
);
|
|
404
|
+
if (attempt < maxRetries) {
|
|
405
|
+
await new Promise(function(resolve) {
|
|
406
|
+
setTimeout(resolve, 1000 * attempt);
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
if (lastErr) {
|
|
412
|
+
delete caches[dirUrl];
|
|
413
|
+
throw lastErr;
|
|
414
|
+
}
|
|
392
415
|
|
|
393
416
|
caches[dirUrl] = {
|
|
394
417
|
promise: Promise.resolve(acme),
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: ac8ba0ra21
|
|
3
|
-
type: decision
|
|
4
|
-
title: Roster default IPv6 bind
|
|
5
|
-
created: '2026-03-16 21:57:18'
|
|
6
|
-
---
|
|
7
|
-
Changed Roster default bind hostname from 0.0.0.0 to :: in index.js constructor (`this.hostname = options.hostname ?? '::'`). This makes default listen IPv6-first. Existing explicit hostname option still overrides. Verified with full test suite: 74 passing.
|