From eb18108fb1aacd7bcfdd16c4d7d2dd5136d2f636 Mon Sep 17 00:00:00 2001 From: Local Dev Date: Thu, 30 Jul 2026 21:21:01 +0200 Subject: [PATCH] gateway: /search endpoint = universal "set as default search engine" fix Adds handleSearch() to public-gateway.mjs: users add https://navigate.st/search?q=%s as their browser's default search engine and typing bare "silentmode.bch" in the URL bar (which Chromium and Firefox otherwise send to Google as a search query, since .bch isn't in ICANN's TLD list) arrives here. Native BNS TLDs (.bch, .p2p, .bit, .nav) 302 to the relay; anything else falls through to DuckDuckGo so ordinary search still works. Live on the VPS gateway at /opt/bns-gateway/public-gateway.mjs. Nginx now proxies location = /search to 127.0.0.1:8700 as well. Solves: bare "silentmode.bch" in Chrome/Edge went to Google. It now resolves to the site via the relay in every browser. --- src/gateway/public-gateway.mjs | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/gateway/public-gateway.mjs b/src/gateway/public-gateway.mjs index b0cecd1..e0f3838 100644 --- a/src/gateway/public-gateway.mjs +++ b/src/gateway/public-gateway.mjs @@ -91,10 +91,45 @@ async function serve(res, name, reqPath, baseHref) { } catch (e) { res.writeHead(502); res.end("gateway error: " + e.message); } } +// Native BNS TLDs — never overlap ICANN, so hijacking them here is safe. +// Dual TLDs (.com, .de, .dev) always fall through to search, so a bare +// `github.com` in the URL bar keeps going to the real GitHub, not to a +// BNS registration that happens to share the name. +const NATIVE_TLDS = new Set(["bch", "p2p", "bit", "nav"]); + +// Universal "set-as-default-search-engine" shim. Users add +// https://navigate.st/search?q=%s +// as their browser's default search engine; typing `silentmode.bch` in the URL +// bar (which Chromium/Firefox otherwise send to Google as a search query +// because .bch isn't in ICANN's known-TLD list) arrives here. If q looks like +// a native BNS name we 302 to the relay (works in every browser, no local +// daemon needed); otherwise forward to DuckDuckGo so ordinary search still +// works. Even an unregistered native-TLD query goes to the relay so the user +// gets a clear NXDOMAIN page instead of a confusing search detour. +async function handleSearch(url, res) { + const q = (url.searchParams.get("q") || "").trim().toLowerCase(); + const bare = q.replace(/^[a-z]+:\/\//, "").split("/")[0]; + const m = bare.match(/^([a-z0-9-]+)\.([a-z0-9-]+)$/); + let target; + if (m && NATIVE_TLDS.has(m[2])) { + target = `https://navigate.st/bns/${m[1]}.${m[2]}/`; + } else { + target = `https://duckduckgo.com/?q=${encodeURIComponent(q)}`; + } + res.writeHead(302, { location: target }); + res.end(); +} + const server = http.createServer(async (req, res) => { try { const hostHeader = (req.headers.host || "").split(":")[0].toLowerCase(); + // --- smart search endpoint (default-search-engine shim) --- + if (req.url.startsWith("/search")) { + const u = new URL(req.url, "http://x"); + return handleSearch(u, res); + } + // --- registrar API: availability of a name --- // GET /api/name/ -> { name, tld, registered, records? } if (req.url.startsWith("/api/name/")) {