Files
silent-send/manifest.json
T
Claude 97e37e65ac fix: cross-browser sync import corrupting local encryption + v2.0.9
Root cause: when importing an encrypted sync code from another device,
_decryptFromSync was replacing the local encryption config (salt) with
the source device's salt. This caused:
1. Local key cache derived from wrong salt
2. Local data (encrypted with local salt) became unreadable
3. _applyData tried to write with the wrong key

Fixed with a complete refactor of cross-device decryption:
- authenticateForSync() derives a TEMPORARY key using the source salt
- Temporary key stored separately as 'tempSyncKey' in IndexedDB
- Local encryption config and cached key are NEVER modified
- After decryption, _applyData writes via _writeSecure using the
  LOCAL key (which uses the local salt)
- _handleDecryptedMeta extracted for code reuse

Also:
- Options.js auth handler detects pending sync import and routes to
  authenticateForSync instead of regular authenticate
- After auth success, automatically retries the import
- README updated: imported passwords are protected (dots in UI,
  vault password to reveal, AES-256 encrypted at rest)
- Bumped to v2.0.9

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 05:23:50 +00:00

86 lines
2.0 KiB
JSON

{
"manifest_version": 3,
"name": "Silent Send",
"version": "2.0.9",
"description": "Intercepts personal info and substitutes it with user-defined replacements before sending to AI services.",
"permissions": [
"storage",
"activeTab",
"scripting",
"notifications",
"alarms"
],
"host_permissions": [
"https://claude.ai/*",
"https://chatgpt.com/*",
"https://chat.openai.com/*",
"https://grok.x.ai/*",
"https://x.com/i/grok*",
"https://gemini.google.com/*",
"http://localhost/*",
"http://127.0.0.1/*"
],
"background": {
"service_worker": "src/background/service-worker.js",
"type": "module"
},
"content_scripts": [
{
"matches": [
"https://claude.ai/*",
"https://chatgpt.com/*",
"https://chat.openai.com/*",
"https://grok.x.ai/*",
"https://x.com/i/grok*",
"https://gemini.google.com/*",
"http://localhost/*",
"http://127.0.0.1/*"
],
"js": ["src/content/injector.js"],
"css": ["src/content/content.css"],
"run_at": "document_start",
"all_frames": true
}
],
"action": {
"default_popup": "src/popup/popup.html",
"default_icon": {
"16": "icons/icon16.svg",
"48": "icons/icon48.svg",
"128": "icons/icon128.svg"
}
},
"options_page": "src/options/options.html",
"icons": {
"16": "icons/icon16.svg",
"48": "icons/icon48.svg",
"128": "icons/icon128.svg"
},
"commands": {
"toggle-reveal": {
"suggested_key": {
"default": "Alt+Shift+R",
"mac": "Alt+Shift+R"
},
"description": "Toggle Reveal Mode"
},
"toggle-enabled": {
"suggested_key": {
"default": "Alt+Shift+S",
"mac": "Alt+Shift+S"
},
"description": "Toggle Silent Send on/off"
}
},
"optional_host_permissions": [
"https://*/*",
"http://*/*"
],
"web_accessible_resources": [
{
"resources": ["src/content/content.js"],
"matches": ["<all_urls>"]
}
]
}