From 44f9d9444c90c728df66d26d77a0cee71b18785c Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 2 Apr 2026 13:55:04 +0000 Subject: [PATCH] Fix encryption enable by removing broken org UI references, bump to 0.9.44 Removed Organization section JS (initOrgUI, showOrgJoined, showOrgNotJoined, setOrgStatus) and OrgPolicy import from options.js. These referenced DOM elements deleted in a prior commit, causing DOMContentLoaded init to fail before the encryption button listener could be registered. https://claude.ai/code/session_01CwcZK8nqL8pyBH9AxDs9qo --- manifest.firefox.json | 2 +- manifest.json | 2 +- package.json | 2 +- src/options/options.js | 95 ------------------------------------------ 4 files changed, 3 insertions(+), 98 deletions(-) diff --git a/manifest.firefox.json b/manifest.firefox.json index ae8355f..365d636 100644 --- a/manifest.firefox.json +++ b/manifest.firefox.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Silent Send", - "version": "0.9.43", + "version": "0.9.44", "description": "Intercepts personal info and substitutes it with user-defined replacements before sending to AI services.", "browser_specific_settings": { "gecko": { diff --git a/manifest.json b/manifest.json index 425b3ec..ecf7f99 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Silent Send", - "version": "0.9.43", + "version": "0.9.44", "description": "Intercepts personal info and substitutes it with user-defined replacements before sending to AI services.", "permissions": [ "storage", diff --git a/package.json b/package.json index 0baad02..ce657dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "silent-send", - "version": "0.9.43", + "version": "0.9.44", "private": true, "license": "MIT", "description": "Browser extension that substitutes personal data before sending to AI services", diff --git a/src/options/options.js b/src/options/options.js index f78374a..91505db 100644 --- a/src/options/options.js +++ b/src/options/options.js @@ -4,7 +4,6 @@ import SilentSendSync from '../lib/sync.js'; import VersionHistory from '../lib/version-history.js'; import ImportParser from '../lib/import-parser.js'; import SilentSendMerge from '../lib/merge.js'; -import OrgPolicy from '../lib/org-policy.js'; import TamperGuard from '../lib/tamper-guard.js'; import api from '../lib/browser-polyfill.js'; @@ -40,7 +39,6 @@ document.addEventListener('DOMContentLoaded', async () => { await initAutoSyncUI(); await initVersionHistoryUI(); await initDeviceDashboard(); - await initOrgUI(); await initTamperUI(); await checkConflicts(); @@ -1444,99 +1442,6 @@ async function renderDevices() { }); } -// ---------------------------------------------------------------- -// Organization UI -// ---------------------------------------------------------------- - -async function initOrgUI() { - const inOrg = await OrgPolicy.isInOrg(); - if (inOrg) { - await showOrgJoined(); - } else { - showOrgNotJoined(); - } - - $('#btnJoinOrgCode').addEventListener('click', async () => { - const code = $('#orgInviteCode').value.trim(); - if (!code) { setOrgStatus('Enter an invite code.', 'warn'); return; } - setOrgStatus('Joining...', 'neutral'); - const result = await OrgPolicy.joinOrg({ inviteCode: code }); - if (result.success) { - setOrgStatus(`Joined ${result.orgName}.`, 'ok'); - await showOrgJoined(); - } else { - setOrgStatus('Failed: ' + result.reason, 'error'); - } - }); - - $('#btnJoinOrgUrl').addEventListener('click', async () => { - const url = $('#orgPolicyUrl').value.trim(); - if (!url) { setOrgStatus('Enter a policy URL.', 'warn'); return; } - setOrgStatus('Joining...', 'neutral'); - const result = await OrgPolicy.joinOrg({ policyUrl: url }); - if (result.success) { - setOrgStatus(`Joined ${result.orgName}.`, 'ok'); - await showOrgJoined(); - } else { - setOrgStatus('Failed: ' + result.reason, 'error'); - } - }); - - $('#btnLeaveOrg').addEventListener('click', async () => { - // Check tamper protection - if (await TamperGuard.isActionProtected('changeOrgPolicy')) { - const pw = await promptAdminPassword('Leave organization'); - if (!pw) return; - const auth = await TamperGuard.verify(pw); - if (!auth) { setOrgStatus('Wrong admin password.', 'error'); return; } - } - if (!confirm('Leave this organization? Org-required mappings will be removed.')) return; - await OrgPolicy.leaveOrg(); - showOrgNotJoined(); - setOrgStatus('Left organization.', 'neutral'); - }); -} - -async function showOrgJoined() { - $('#orgNotJoined').style.display = 'none'; - $('#orgJoined').style.display = 'block'; - - const config = await OrgPolicy.getOrgConfig(); - const policy = await OrgPolicy.getPolicy(); - if (config) { - $('#orgNameDisplay').textContent = config.orgName; - $('#orgPolicyVersion').textContent = `v${policy?.version || '?'}`; - } - - const compliance = await OrgPolicy.checkCompliance(); - const statusEl = $('#orgComplianceStatus'); - if (compliance.compliant) { - statusEl.innerHTML = '✓ Compliant — all required fields configured'; - } else { - statusEl.innerHTML = `Missing: ${compliance.missing.join(', ')}`; - } - - const reqMappings = policy?.requiredMappings || []; - const reqEl = $('#orgRequiredMappings'); - if (reqMappings.length > 0) { - reqEl.textContent = `${reqMappings.length} required mapping(s) enforced by org policy`; - } else { - reqEl.textContent = ''; - } -} - -function showOrgNotJoined() { - $('#orgNotJoined').style.display = 'block'; - $('#orgJoined').style.display = 'none'; -} - -function setOrgStatus(msg, type) { - const el = $('#orgStatus'); - if (!el) return; - el.textContent = msg; - el.style.color = type === 'ok' ? '#10b981' : type === 'warn' ? '#f59e0b' : type === 'error' ? '#dc2626' : '#6b7280'; -} - // ---------------------------------------------------------------- // Tamper Protection UI // ----------------------------------------------------------------