Theseus 0.3.127: System section tightens — direct Ariadne, master N&C toggle, trust is implicit

System row changes:
  * Ariadne's Thread row has a direct open: the label jumps straight to
    the Ariadne plug-in sub-page (no intermediate landing). A toggle on
    the right runs ariadneToggle through the existing shared hook, so
    Ariadne can be turned on/off from the System page without opening it.
  * Names & Certificates row gets a master toggle. ON means at least one
    optional resolver is enabled; flipping it enables or disables every
    optional resolver together (BNS is always on either way). The per-
    resolver advanced fields are preserved, so toggling back ON restores
    the same configuration.
  * Aegis row is removed from System — Aegis stays as its own top-level
    nav entry, so having it in two places was clutter.
  * "About plug-ins on theseus.x" link moved from the System header to
    the plug-ins Ariadne sub-page, where it is actually about something.

Trust surface simplified:
  * Mozilla CA bundle and the Russian National CA are both always on.
    The Mozilla bundle was already always-on; the Russian CA defaults
    to enabled, scoped to .ru / .рф / gov.ru / online.ru. The scope
    keeps the Russian CA from signing for anything else on the web, so
    the UI toggle was moot — removed to shrink the Certificate trust
    section. The caRuOn and caRuScope inputs remain in the DOM as
    hidden placeholders so the existing init / save code keeps working.

Breadcrumbs on plugins-ariadne and plugins-aegis sub-pages now read
"System ›" instead of "Plug-ins ›" to match the renamed nav entry.
This commit is contained in:
Local Dev 2026-10-27 23:01:11 +02:00
parent d07f2ff757
commit 4e3fc4bb3d
3 changed files with 73 additions and 49 deletions

View file

@ -1042,7 +1042,12 @@ const DEFAULT_EXTRA_RESOLVERS = {
unstoppable: { enabled: false, endpoint: "https://resolve.unstoppabledomains.com", gateway: "https://ipfs.io" },
},
ca_bundles: {
ru_national: { enabled: false, scope_tlds: ["ru", "рф", "gov.ru", "online.ru"] },
// Mozilla bundle is always on (Chromium's own trust store); kept here
// for completeness. Russian national CA defaults on too — scoped to
// its own TLD set so no sites outside that scope ever see it, and the
// UI toggle was dropped in 0.3.127 since the scope makes the on/off
// moot. Advanced users still edit extra-resolvers.json by hand.
ru_national: { enabled: true, scope_tlds: ["ru", "рф", "gov.ru", "online.ru"] },
},
};
function cloneExtraResolvers() { return JSON.parse(JSON.stringify(DEFAULT_EXTRA_RESOLVERS)); }

View file

@ -1,6 +1,6 @@
{
"name": "theseus-navigator",
"version": "0.3.126",
"version": "0.3.127",
"license": "MPL-2.0",
"description": "Theseus Navigator — a browser that follows the thread. By Silent Mode, a Deviant project.",
"author": "Silent Mode",

View file

@ -547,29 +547,14 @@
<label class="sw"><input type="checkbox" id="rvUdOn"><span class="track"><span class="knob"></span></span></label>
</div>
<h2 class="sub">Certificate trust (TLS)</h2>
<div class="row">
<div class="txt">
<div class="t">Built-in Mozilla CA bundle</div>
<div class="d">The standard trust anchors that ship with Theseus.</div>
</div>
<label class="sw" title="Always on"><input type="checkbox" checked disabled><span class="track"><span class="knob"></span></span></label>
</div>
<div class="row">
<div class="txt">
<div class="t">Russian National CA</div>
<div class="d">
Lets Theseus open Russian government sites (gosuslugi.ru, nalog.gov.ru, …) that use the Russian national cert chain. <b>Does not</b> bypass network-level blocks — use Tor for that.
<br>⚠ Trust is scoped to the TLDs below only. The CA cannot sign for other sites while this scope is in place. Mozilla and Chrome do not trust this CA by default. <span class="muted" id="rvNotWiredRuCa">Not wired yet — coming in 0.3.99.</span>
</div>
<div class="acts"><details class="adv"><summary>Advanced</summary>
<label>Scope — this CA is trusted only for hosts under these TLDs (comma-separated)</label>
<input type="text" id="caRuScope" placeholder="ru, рф, gov.ru, online.ru">
</details></div>
</div>
<label class="sw"><input type="checkbox" id="caRuOn"><span class="track"><span class="knob"></span></span></label>
<!-- Certificate trust is simplified: the Mozilla CA bundle AND the
Russian National CA are both always on (scoped to the Russian
TLD set); no UI toggles. The caRuOn / caRuScope controls live
as hidden placeholders so the init code that reads them keeps
working. -->
<div hidden aria-hidden="true">
<input type="checkbox" id="caRuOn" checked>
<input type="text" id="caRuScope" value="ru, рф, gov.ru, online.ru">
</div>
<h2 class="sub">Preferences file</h2>
@ -591,32 +576,36 @@
nav just reads System in the sidebar now). -->
<section id="plugins" hidden>
<h1>System</h1>
<p class="lede">The Silent Mode components that live alongside Theseus and the name systems the browser can resolve.</p>
<div class="row" style="justify-content:flex-end;gap:8px"><a class="btn" style="text-decoration:none;display:inline-flex;align-items:center" href="https://theseus.x/plug-ins/" target="_blank" rel="noopener" title="Current signed versions, hashes and how plug-ins update">About plug-ins on theseus.x ↗</a></div>
<div class="row link" data-go="ariadne">
<div class="txt"><div class="t">Ariadne's Thread</div><div class="d">System-wide BCDN resolver.</div></div>
<span class="chev">›</span>
<p class="lede">Silent Mode components that live alongside Theseus and the name systems the browser can resolve.</p>
<!-- Ariadne's Thread row: a left-click on the label jumps straight into
the plug-in's sub-page (install / policy / sources / status). The
toggle on the right turns the daemon on/off through the shared
ariadneToggleMain hook; the plug-in init code wires it. -->
<div class="row" id="systemAriadneRow">
<div class="txt" id="systemAriadneOpen" role="button" tabindex="0" style="cursor:pointer" data-go="plugins/ariadne">
<div class="t">Ariadne's Thread <span class="chev">›</span></div>
<div class="d">System-wide BCDN resolver. <span id="ariadneStatusMain" class="pmuted"></span></div>
</div>
<label class="sw" id="ariadneSwWrap" title="Turn Ariadne's Thread on/off"><input type="checkbox" id="ariadneToggleMain"><span class="track"><span class="knob"></span></span></label>
</div>
<div class="row link" data-go="aegis">
<div class="txt"><div class="t">Aegis</div><div class="d">Built-in multi-chain wallet.</div></div>
<span class="chev">›</span>
<!-- Names & Certificates row: label jumps to the resolvers page. The
toggle flips every optional resolver on/off at once (BNS is always
on, Mozilla + Russian CA default on and hidden). -->
<div class="row" id="systemNamesRow">
<div class="txt" id="systemNamesOpen" role="button" tabindex="0" style="cursor:pointer" data-go="names">
<div class="t">Names &amp; Certificates <span class="chev">›</span></div>
<div class="d">Which name systems Theseus can resolve, and which certificate roots it trusts.</div>
</div>
<label class="sw" title="Turn every optional resolver on/off"><input type="checkbox" id="systemNamesAll"><span class="track"><span class="knob"></span></span></label>
</div>
<div class="row link" data-go="names">
<div class="txt"><div class="t">Names &amp; Certificates</div><div class="d">Which name systems Theseus can resolve, and which certificate roots it trusts.</div></div>
<span class="chev">›</span>
</div>
<!-- Hidden hooks: the plug-in init code wires several controls below by
id (status, toggles, install/update/apply buttons). Keep them in the
DOM so the sub-pages (plugins-ariadne / plugins-aegis) still work;
moving the plug-ins to top-level nav entries did not change their
sub-pages. These are offscreen placeholders that mirror the sub-page
controls, read by the shared refresh functions. -->
<!-- Hidden hooks: the plug-in init code wires several Ariadne / Aegis
controls by id (status, install / update / refresh / apply buttons,
the sub-page toggle). Keep them in the DOM so the sub-pages
(plugins-ariadne / plugins-aegis) still work. -->
<div hidden aria-hidden="true" id="pluginsMainHooks">
<span id="ariadneStatusMain"></span>
<button id="ariadneInstallMain"></button>
<button id="ariadneUpdateMain"></button>
<button id="ariadneCheckMain"></button>
<span id="ariadneSwWrap"><input type="checkbox" id="ariadneToggleMain"></span>
<span id="aegisStatusMain"></span>
<button id="aegisCheckMain"></button>
<button id="aegisApplyMain"></button>
@ -663,9 +652,10 @@
<!-- PLUG-INS › ARIADNE (sub-page) -->
<section id="plugins-ariadne" class="subpage" data-parent="plugins" hidden>
<div class="crumb"><a data-go="plugins">Plug-ins</a> › Ariadne's Thread</div>
<h1><button class="back" data-go="plugins" title="Back to Plug-ins" aria-label="Back">‹</button>Ariadne's Thread</h1>
<div class="crumb"><a data-go="plugins">System</a> › Ariadne's Thread</div>
<h1><button class="back" data-go="plugins" title="Back to System" aria-label="Back">‹</button>Ariadne's Thread</h1>
<p class="lede">A local daemon that resolves BCDN names for <b>every browser on this machine</b> (Chrome, Edge, Firefox, etc.), not just Theseus. Turning it off means non-Theseus browsers stop resolving <code>.bch</code> / <code>.x</code> / other BCNR TLDs; Theseus keeps working either way, since it has its own built-in resolver.</p>
<div class="row" style="justify-content:flex-end;gap:8px"><a class="btn" style="text-decoration:none;display:inline-flex;align-items:center" href="https://theseus.x/plug-ins/" target="_blank" rel="noopener" title="Current signed versions, hashes and how plug-ins update">About plug-ins on theseus.x ↗</a></div>
<h2 class="sub" style="border-top:0;padding-top:0;margin-top:0">Status</h2>
<div class="row plug-row">
@ -724,8 +714,8 @@
<!-- PLUG-INS › AEGIS (sub-page) -->
<section id="plugins-aegis" class="subpage" data-parent="plugins" hidden>
<div class="crumb"><a data-go="plugins">Plug-ins</a> › Aegis</div>
<h1><button class="back" data-go="plugins" title="Back to Plug-ins" aria-label="Back">‹</button>Aegis</h1>
<div class="crumb"><a data-go="plugins">System</a> › Aegis</div>
<h1><button class="back" data-go="plugins" title="Back to System" aria-label="Back">‹</button>Aegis</h1>
<p class="lede">Multi-chain wallet (BCH, BTC, TRX, ETH, SOL, SC, DGB) that ships in the box. Bundled with Theseus, but updates are delivered <b>over-the-air</b>: new signed versions land without a Theseus release. Runs entirely inside this browser — never system-wide.</p>
<h2 class="sub" style="border-top:0;padding-top:0;margin-top:0">Status</h2>
@ -3657,6 +3647,35 @@
// during showSection() before this IIFE registered the listener, so we
// kick wiring manually when the page is already visible.
try { if (!document.getElementById("names").hidden) ensureWired(); } catch {}
// System › Names & Certificates master toggle. Reflects "any optional
// resolver on"; toggling flips every resolver together. Non-destructive:
// the per-resolver advanced fields (RPC URLs, gateways) are left alone,
// so a later ON restores the same wiring.
const RESOLVER_KEYS = ["ens", "namecoin", "handshake", "sns", "unstoppable"];
const sysAll = el("systemNamesAll");
async function refreshSystemNamesAll() {
if (!sysAll) return;
try {
const s = await C.resolversGet();
sysAll.checked = RESOLVER_KEYS.some((k) => !!(s?.resolvers?.[k]?.enabled));
} catch {}
}
if (sysAll) {
sysAll.addEventListener("change", async () => {
const on = sysAll.checked;
try {
for (const k of RESOLVER_KEYS) await C.resolversSet(`resolvers.${k}.enabled`, on);
// Also refresh the N&C page if the user navigates to it after.
if (wired) {
const state = await C.resolversGet();
hydrate(state || {});
}
} catch (e) { console.warn("master names toggle failed", e); }
});
refreshSystemNamesAll();
document.addEventListener("section", (e) => { if (e.detail === "plugins") refreshSystemNamesAll(); });
}
})();
</script>
</body>