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
86 lines
2.0 KiB
JSON
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>"]
|
|
}
|
|
]
|
|
}
|