43 lines
2.5 KiB
JavaScript
43 lines
2.5 KiB
JavaScript
import fs from 'node:fs';
|
|
import vm from 'node:vm';
|
|
import assert from 'node:assert/strict';
|
|
|
|
const ui = fs.readFileSync('src/admin/web/vhosts/core.js', 'utf8');
|
|
const head = 'function debugOriginIssues(members) {';
|
|
const tail = '\nfunction aclEditor(';
|
|
const start = ui.indexOf(head);
|
|
const end = ui.indexOf(tail, start);
|
|
assert(start >= 0 && end > start, 'debug origin verification helper is present');
|
|
const warn = vm.runInNewContext('(' + ui.slice(start, end).trim() + ')', { URL });
|
|
|
|
function member(protocol, more={}) { return {
|
|
url:'https://10.87.20.2:443',protocol,preserve_host:true,
|
|
pool_eligible:true,allow_private:true,tls_verify:false,...more,
|
|
}; }
|
|
for (const protocol of ['http1', 'auto', 'http2', 'h2']) {
|
|
assert.equal(warn([member(protocol)]).length, 0,
|
|
`${protocol} is accepted without forcing H1 or disabling preserved Host`);
|
|
assert.equal(warn([member(protocol, {tls_server_name:'unitraklub.pl',tls_verify:true})]).length, 0,
|
|
`${protocol} supports explicitly verified certificate DNS names`);
|
|
}
|
|
assert.equal(warn([member('h2',{pool_eligible:false,allow_private:false})]).length,0,
|
|
'pool and private-origin flags must not be mistaken for protocol requirements');
|
|
assert.equal(warn([member('auto',{tls_verify:true})]).length,1,
|
|
'HTTPS-by-IP without TLS identity receives a nonblocking warning');
|
|
assert.equal(warn([{...member('h2',{tls_verify:true}),url:'https://site.example'}]).length,0,
|
|
'DNS HTTPS origin needs no IP-certificate warning');
|
|
assert.equal(warn([{...member('h2',{tls_verify:true}),url:'http://10.87.20.2:80'}]).length,0);
|
|
assert(!/preserve\.disabled\s*=|preserve\.checked\s*=\s*false/.test(ui),
|
|
'Protocol selector may not disable or clear Preserve Host');
|
|
assert(ui.includes('value.preserve_host === true'), 'Existing backend preference remains visible');
|
|
assert(ui.includes('protocol.value = "http1"; preserve.checked = true'),
|
|
'Optional explicit H1 troubleshooting preset is retained');
|
|
assert(!ui.includes('syncProtocol()'), 'Do not call removed protocol-only Host limiter');
|
|
assert(ui.includes('protocol.dispatchEvent(new Event("change"))'), 'Preset refreshes protocol help text');
|
|
for (const lang of ['en_US','pl_pl']) {
|
|
const t=JSON.parse(fs.readFileSync(`langs/${lang}.json`,'utf8')).translations;
|
|
for (const key of ['vhPreserveHost','vhDebugOriginPreset','vhOriginPresetHelp','vhDebugOriginMismatch'])
|
|
assert(t[key] && t[key].length>30,`${lang}.${key}`);
|
|
}
|
|
console.log('PASS: Preserve Host is available for four modes; IP/TLS hint is conditional and optional');
|