diff --git a/pkg/service/handlers/web/index.html b/pkg/service/handlers/web/index.html
index 4afcc34..a4f975f 100644
--- a/pkg/service/handlers/web/index.html
+++ b/pkg/service/handlers/web/index.html
@@ -548,7 +548,22 @@
| CA / TLS |
- |
+
+
+
+
+ Download CA cert
+
+ |
@@ -575,10 +590,6 @@
- SSH Connection:
- Telnet (Port 17000):
-
-
-
- Backup: ✅ Found .original config at
- /opt/Bose/etc/SoundTouchSdkPrivateCfg.xml.original
-
-
-
- Backup: ❌ Not found
-
-
-
- Remote Services Enabled:
-
-
-
-
- AfterTouch Local Root CA Trusted:
-
-
- Download CA cert
-
-
-
0 ? "(" + summary.remote_services_found.join(", ") + ")" : "";
+ // Trust CA Now button now lives inside the state card's CA / TLS
+ // cell. Show only when SSH is reachable AND the CA isn't already
+ // trusted on the device.
+ const trustBtn = document.getElementById("trust-ca-btn");
+ if (trustBtn) {
+ const canTrust = summary.ssh_success && !summary.ca_cert_trusted;
+ trustBtn.style.display = canTrust ? "inline-block" : "none";
+ trustBtn.onclick = () => trustCA(deviceId, ip);
+ }
- const caTrustStatus = document.getElementById("ca-trust-status");
- caTrustStatus.innerText = summary.ca_cert_trusted ? "✅ Yes" : "❌ No";
- caTrustStatus.style.color = summary.ca_cert_trusted ? "green" : "red";
- document.getElementById("trust-ca-btn").style.display = summary.ca_cert_trusted ? "none" : "inline-block";
- document.getElementById("trust-ca-btn").onclick = () => trustCA(deviceId, ip);
- } else {
- remoteStatus.innerText = "❓ Unknown";
- remoteStatus.style.color = "gray";
- remoteFound.innerText = "";
-
- const caTrustStatus = document.getElementById("ca-trust-status");
- caTrustStatus.innerText = "❓ Unknown";
- caTrustStatus.style.color = "gray";
+ // The HTTPS Connection Test runs `curl` on the device via SSH —
+ // upload-temp-CA + run-curl — so the panel is irrelevant when
+ // SSH isn't reachable. The implicit telnet-poke + observation
+ // alternative is on the roadmap but not implemented yet.
+ const connectionTestPane = document.getElementById("connection-test");
+ if (connectionTestPane) {
+ connectionTestPane.style.display = summary.ssh_success ? "block" : "none";
}
const currentConfigElem = document.getElementById("current-config");
@@ -1888,10 +1872,6 @@ async function showSummary(deviceId) {
removeRemoteBtn.onclick = () => removeRemoteServices(deviceId, ip);
removeRemoteBtn.disabled = !summary.ssh_success || !summary.remote_services_enabled;
- const backupBtn = document.getElementById("backup-config-btn");
- backupBtn.onclick = () => backupConfig(deviceId, ip);
- backupBtn.disabled = !summary.ssh_success || !!summary.original_config;
-
document.getElementById("migration-summary").style.display = "block";
document.getElementById("migration-summary").scrollIntoView();
} catch (error) {
@@ -2403,11 +2383,6 @@ async function testDNSRedirection(deviceId) {
}
}
-function toggleOriginalConfig() {
- const pane = document.getElementById("original-config-pane");
- pane.style.display = pane.style.display === "none" ? "block" : "none";
-}
-
// defaultTelnetURLs returns the canonical four URLs derived from a
// service base URL. Mirrors setup.defaultTelnetURLs (Go) — keep them in
// sync if either side changes.
@@ -2759,11 +2734,14 @@ function renderMigrationState(summary) {
}
// --- CA / TLS axis ---
- const caCell = document.getElementById("state-ca");
- if (caCell) {
- caCell.replaceChildren();
+ // The cell hosts both the verdict text and two action affordances
+ // (Trust CA Now button + Download CA cert link). We only rewrite
+ // the verdict span so the buttons stay put across re-renders.
+ const caLine = document.getElementById("state-ca-line");
+ if (caLine) {
+ caLine.replaceChildren();
const v = caVerdict(summary);
- caCell.appendChild(stateLine(v.icon, v.text, v.note));
+ caLine.appendChild(stateLine(v.icon, v.text, v.note));
}
// --- Preconditions ---