chore(config): remove git.quad4.io references from codebase

This commit is contained in:
Ivan 2026-05-18 05:09:08 -05:00
parent 8a29c7fc14
commit 6327e16c1b
No known key found for this signature in database
GPG key ID: B84314E2D9332AE0
10 changed files with 85 additions and 27 deletions

View file

@ -513,7 +513,7 @@ app.whenReady().then(async () => {
"style-src 'self' 'unsafe-inline'",
"img-src 'self' data: blob: https://*.tile.openstreetmap.org https://tile.openstreetmap.org https://*.cartocdn.com https://tiles.openfreemap.org https://*.openfreemap.org",
"font-src 'self' data: https://tiles.openfreemap.org https://*.openfreemap.org",
"connect-src 'self' http://127.0.0.1:9337 https://127.0.0.1:9337 http://localhost:9337 https://localhost:9337 ws://127.0.0.1:* wss://127.0.0.1:* ws://localhost:* wss://localhost:* blob: https://*.tile.openstreetmap.org https://tile.openstreetmap.org https://nominatim.openstreetmap.org https://git.quad4.io https://*.cartocdn.com https://tiles.openfreemap.org https://*.openfreemap.org",
"connect-src 'self' http://127.0.0.1:9337 https://127.0.0.1:9337 http://localhost:9337 https://localhost:9337 ws://127.0.0.1:* wss://127.0.0.1:* ws://localhost:* wss://localhost:* blob: https://*.tile.openstreetmap.org https://tile.openstreetmap.org https://nominatim.openstreetmap.org https://github.com https://*.cartocdn.com https://tiles.openfreemap.org https://*.openfreemap.org",
"media-src 'self' blob:",
"worker-src 'self' blob:",
"frame-src 'self'",

View file

@ -3507,7 +3507,7 @@ class ReticulumMeshChat:
<p>The MeshChatX web interface files were not found.</p>
<p>If you are running from source, you must build the frontend first:</p>
<pre style="background: #1e293b; padding: 1rem; border-radius: 4px; color: #e2e8f0; border: 1px solid #334155;">pnpm install && pnpm run build-frontend</pre>
<p>For more information, see the <a href="https://git.quad4.io/RNS-Things/MeshChatX" style="color: #38bdf8;">README</a>.</p>
<p>For more information, see the <a href="https://github.com/Quad4-Software/MeshChatX" style="color: #38bdf8;">README</a>.</p>
</body>
</html>
""",
@ -4243,17 +4243,16 @@ class ReticulumMeshChat:
return web.json_response({"error": "URL is required"}, status=400)
# Restrict to allowed sources for safety
gitea_url = "https://git.quad4.io"
gitea_url = ""
if self.current_context and self.current_context.config:
gitea_url = self.current_context.config.gitea_base_url.get()
if (
not url.startswith(gitea_url + "/")
and not url.startswith("https://git.quad4.io/")
and not url.startswith("https://github.com/")
and not url.startswith("https://objects.githubusercontent.com/")
and not url.startswith("https://release-assets.githubusercontent.com/")
):
allowed = ["https://github.com/", "https://objects.githubusercontent.com/",
"https://release-assets.githubusercontent.com/"]
if gitea_url:
allowed.insert(0, gitea_url + "/")
if not any(url.startswith(a) for a in allowed):
return web.json_response({"error": "Invalid download URL"}, status=403)
try:

View file

@ -161,7 +161,7 @@ class ConfigManager:
self.gitea_base_url = self.StringConfig(
self,
"gitea_base_url",
"https://git.quad4.io",
None,
)
# desktop config

View file

@ -17,7 +17,7 @@
{{ $t("tools.micron_editor.title") }}
</h1>
<a
href="https://git.quad4.io/RFnexus"
href="https://github.com/RFnexus"
target="_blank"
rel="noopener noreferrer"
class="text-[10px] text-gray-500 hover:text-teal-500 transition-colors hidden sm:block leading-tight"
@ -89,6 +89,26 @@
</div>
</div>
</div>
<button
v-if="wasmBundled"
type="button"
class="secondary-chip py-1! px-2! gap-1 text-[11px]!"
:class="{ 'text-teal-600! dark:text-teal-300! border-teal-300! dark:border-teal-700!': useWasm }"
:disabled="wasmLoading"
:title="$t(useWasm ? 'tools.micron_editor.wasm_active' : 'tools.micron_editor.wasm_inactive')"
@click="toggleWasmEngine"
>
<span
v-if="wasmLoading"
class="w-3 h-3 rounded-full border-2 border-current border-t-transparent animate-spin"
></span>
<MaterialDesignIcon
v-else
:icon-name="useWasm ? 'lightning-bolt' : 'lightning-bolt-outline'"
class="w-3.5 h-3.5"
/>
<span class="hidden sm:inline">{{ useWasm ? "WASM" : "JS" }}</span>
</button>
<button v-if="isMobileView" type="button" class="primary-chip py-1! px-3!" @click="toggleView">
<MaterialDesignIcon :icon-name="showEditor ? 'eye' : 'pencil'" class="w-3.5 h-3.5" />
{{ showEditor ? $t("tools.micron_editor.view_preview") : $t("tools.micron_editor.edit") }}
@ -179,6 +199,7 @@
import MaterialDesignIcon from "../MaterialDesignIcon.vue";
import MicronParser from "../../js/MicronParser.js";
import { micronStorage } from "../../js/MicronStorage";
import { preloadNomadMicronWasm, isMicronWasmBundled } from "../../js/MicronWasmLoader";
import DialogUtils from "../../js/DialogUtils";
export default {
@ -198,6 +219,10 @@ export default {
editingTabName: "",
showPublishMenu: false,
pageNodes: [],
useWasm: false,
wasmReady: false,
wasmBundled: isMicronWasmBundled(),
wasmLoading: false,
};
},
watch: {
@ -232,7 +257,11 @@ export default {
}
try {
const parser = new MicronParser(true);
this.renderedContent = parser.convertMicronToHtml(this.tabs[this.activeTabIndex].content);
this.renderedContent = parser.convertMicronToHtml(
this.tabs[this.activeTabIndex].content,
{},
{ useWasm: this.useWasm && this.wasmReady }
);
} catch (error) {
console.error("Error rendering micron:", error);
this.renderedContent = `<p style="color: red;">Error rendering: ${error.message}</p>`;
@ -241,6 +270,25 @@ export default {
toggleView() {
this.showEditor = !this.showEditor;
},
async toggleWasmEngine() {
if (!this.wasmBundled) return;
if (this.useWasm) {
this.useWasm = false;
this.renderActiveTab();
return;
}
this.wasmLoading = true;
try {
const ready = await preloadNomadMicronWasm();
this.wasmReady = ready === true && typeof globalThis.micronConvert === "function";
if (this.wasmReady) {
this.useWasm = true;
this.renderActiveTab();
}
} finally {
this.wasmLoading = false;
}
},
async saveContent() {
try {
await micronStorage.saveTabs(this.tabs);

View file

@ -689,7 +689,7 @@ export default {
return isMicronWasmBundled() && (GlobalState.config || {}).nomad_micron_wasm_enabled === true;
},
micronParserGoRepoUrl() {
return "https://git.quad4.io/Go-Libs/micron-parser-go";
return "https://github.com/Quad4-Software/micron-parser-go";
},
nomadMicronWasmActive() {
const engineWasm = (GlobalState.config?.nomad_micron_default_engine || "js") === "wasm";

View file

@ -923,7 +923,7 @@
{{ $t("settings.nomad_micron_wasm_desc_before_link") }}
<a
class="text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 underline underline-offset-2"
href="https://git.quad4.io/Go-Libs/micron-parser-go"
href="https://github.com/Quad4-Software/micron-parser-go"
target="_blank"
rel="noopener noreferrer"
>{{ $t("settings.nomad_micron_wasm_link_label") }}</a
@ -2070,7 +2070,7 @@
<input
v-model="config.gitea_base_url"
type="text"
placeholder="https://git.quad4.io"
placeholder="https://github.com/example-org"
class="input-field"
@input="onGiteaConfigChange"
/>
@ -2728,7 +2728,7 @@ export default {
location_manual_lon: "0.0",
location_manual_alt: "0.0",
telemetry_enabled: false,
gitea_base_url: "https://git.quad4.io",
gitea_base_url: "",
csp_extra_connect_src: "",
csp_extra_img_src: "",
csp_extra_frame_src: "",

View file

@ -38,7 +38,6 @@ from pathlib import Path
DEFAULT_SOURCES = (
"https://github.com/markqvist/reticulum_website/archive/refs/heads/main.zip",
"https://git.quad4.io/Reticulum/reticulum_website/archive/main.zip",
)
DEFAULT_DEST = (
@ -257,6 +256,18 @@ def main(argv: list[str] | None = None) -> int:
env_dest = os.environ.get("MESHCHATX_RETICULUM_DOCS_DEST")
dest = args.dest or (Path(env_dest) if env_dest else DEFAULT_DEST)
if _is_truthy(os.environ.get("MESHCHATX_OFFLINE_BUILD")):
if dest.exists() and any(dest.iterdir()):
logging.info(
"MESHCHATX_OFFLINE_BUILD=1 and Reticulum manual already present at %s; skipping fetch.",
dest,
)
return 0
logging.error(
"MESHCHATX_OFFLINE_BUILD=1 but Reticulum manual is missing at %s", dest
)
return 1
fetch_manual(
sources=sources,
dest=dest.resolve(),

View file

@ -1,7 +1,7 @@
#!/usr/bin/env bash
set -euo pipefail
# Official defaults target Gitea at git.quad4.io. Override for forks or mirrors:
# Official defaults. Override for forks or mirrors:
# MESHCHATX_RELEASES_RSS Release feed (default: .../MeshChatX/releases.rss)
# MESHCHATX_REPO_BASE Repo root for synthesized wheel URLs if RSS has no
# .whl link in descriptions (default: derived from RSS URL)
@ -151,12 +151,12 @@ discover_release_wheels() {
err "curl is required (RSS and downloads)."
return 1
fi
MESHCHATX_RELEASES_RSS="${MESHCHATX_RELEASES_RSS:-https://git.quad4.io/RNS-Things/MeshChatX/releases.rss}"
MESHCHATX_RELEASES_RSS="${MESHCHATX_RELEASES_RSS:-https://github.com/Quad4-Software/MeshChatX/releases.rss}"
repo_base="${MESHCHATX_REPO_BASE:-}"
rss="$MESHCHATX_RELEASES_RSS"
[[ -n "$repo_base" ]] || repo_base="$(repo_base_from_rss "$rss")"
if ! raw="$(
curl -fsSL -m 90 -H "User-Agent: MeshChatX-rpi-installer/1 (+https://git.quad4.io/RNS-Things/MeshChatX)" \
curl -fsSL -m 90 -H "User-Agent: MeshChatX-rpi-installer/1 (+https://github.com/Quad4-Software/MeshChatX)" \
"$rss" 2>/dev/null
)"; then
return 1
@ -491,7 +491,7 @@ try_verify_and_localize_wheel() {
local src_url="${1:-}"
local bundle_url="${src_url}.cosign.bundle"
local code cbin kf wf bf
MESHCHATX_COSIGN_PUB_URL="${MESHCHATX_COSIGN_PUB_URL:-https://git.quad4.io/RNS-Things/MeshChatX/raw/branch/master/cosign.pub}"
MESHCHATX_COSIGN_PUB_URL="${MESHCHATX_COSIGN_PUB_URL:-https://github.com/Quad4-Software/MeshChatX/raw/branch/master/cosign.pub}"
if ! code="$(curl -fsS -o /dev/null -w '%{http_code}' -I -L -m 30 "$bundle_url" 2>/dev/null)"; then
code="000"
fi

View file

@ -49,7 +49,7 @@ describe("MarkdownRenderer.js", () => {
});
it("keeps underscores intact in long https links", () => {
const url = "https://git.quad4.io/RNS-Things/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md";
const url = "https://github.com/Quad4-Software/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md";
const result = MarkdownRenderer.render(`visit ${url}`);
expect(result).toContain(`href="${url}"`);
expect(result).toContain(url);
@ -396,7 +396,7 @@ describe("MarkdownRenderer.js", () => {
});
it("strip keeps intraword underscores intact", () => {
const url = "https://git.quad4.io/RNS-Things/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md";
const url = "https://github.com/Quad4-Software/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md";
expect(MarkdownRenderer.strip(url)).toBe(url);
});
@ -488,7 +488,7 @@ describe("MarkdownRenderer.js", () => {
const msg = [
"# Deploy notes",
"",
"Read https://git.quad4.io/RNS-Things/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md, then ping",
"Read https://github.com/Quad4-Software/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md, then ping",
"nomadnet://1dfeb0d794963579bd21ac8f153c77a4:/page/meshchatx_on_pi.mu",
"",
"`inline_code` and _italic_ and snake_case stay sane.",
@ -500,7 +500,7 @@ describe("MarkdownRenderer.js", () => {
const result = MarkdownRenderer.render(msg);
expect(result).toContain("<h1");
expect(result).toContain(
'href="https://git.quad4.io/RNS-Things/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md"'
'href="https://github.com/Quad4-Software/MeshChatX/src/branch/dev/docs/meshchatx_on_raspberry_pi.md"'
);
expect(result).toContain('data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/meshchatx_on_pi.mu"');
expect(result).toContain("<code");

View file

@ -126,7 +126,7 @@ export function buildFullServerConfig(overrides = {}) {
nomad_micron_wasm_enabled: true,
nomad_micron_default_engine: "js",
nomad_default_page_path: "/page/index.mu",
gitea_base_url: "https://git.quad4.io",
gitea_base_url: "",
...overrides,
};
}