SOWA Privacy для розробників
Встановлення з джерела
SOWA Privacy постачається через Chrome Web Store у вигляді бінарного файлу, проте вихідний код відкритий для перевірки та особистого використання за ліцензією Source-Available у файлі LICENSE. Щоб зібрати та завантажити локально:
git clone https://github.com/Sowa-Privacy/sowa-privacy-chrome-extension.git
cd sowa-privacy-chrome-extension
npm install
npm run build
Потім відкрийте chrome://extensions/, увімкніть Режим розробника та натисніть Завантажити розпаковане, вказавши папку dist/.
Три великі вендорні пакети
Збираються один раз за допомогою esbuild до запуску Vite, тому виробнича збірка є повністю автономною:
web-llm.bundle.js– ~5,4 МБ – локальний висновок LLM (необов'язково, за вибором).transformers.bundle.js+onnx-wasm/*– ~32 МБ – середовище виконання конвеєра NER (необов'язково, за вибором).file-parsers.bundle.js+pdf.worker.min.mjs+xlsx-worker.bundle.js– ~2 МБ – розбір PDF, DOCX, XLSX для перехоплювача завантаження файлів.
Що всередині
manifest.json Chrome MV3 manifest (single source of truth for version)
contentScript.js MV3 content script entrypoint
service_worker.js MV3 service worker (stateless)
offscreen.js Offscreen doc for NER inference
lib/
constants.js DEF_CONFIG, PRESET_PATTERNS, NER_MODELS,
WEBLLM_MODELS, INDUSTRY_BLACKLISTS
pii-core.js detectPII, mergeDetectionHits, blacklist + regex pipeline
ner-detector.js NER pipeline + diagnostic state surface
ui-utils.js shouldUseRegex / NER / LLM helpers, theme, debounce
ui_i18n.js t() + RESOURCES (4 locales) + applyI18n
cs/
owl-guardian.js Owl widget Shadow DOM, continuous scan, badge counter
upload-interceptor.js File drag/drop / file input intercept
host-matcher.js contentIntegration.entries pattern matching
tests/unit/ 688 модульних тестів – мають залишатись зеленими
scripts/ esbuild bundle + zip packaging
Гарантії конфіденційності
Це правила, закріплені в коді, а не лише обіцянки маркетингових текстів:
- Без телеметрії, без аналітики, без викликів власних серверів – з однією вузько визначеною винятком: власна перевірка прав користувача (один авторизований POST до
/api/entitlements/me, який повертає лише прапорці тарифного плану). Кешується на годину. Без персональних даних, без підказок. - NER за замовчуванням ВИМКНЕНО, лише за вибором – Модель NER – це сторонній завантажувальний файл розміром 65 МБ (HuggingFace). Вона ніколи не починає завантажуватись, поки користувач явно не ввімкне перемикач у Налаштуваннях.
- Локальний LLM за замовчуванням ВИМКНЕНО, лише за вибором – Те саме правило. Моделі WebLLM великі; завантаження – це рішення користувача.
- Owl прив'язаний до сайту – Контентний скрипт реєструється на
<all_urls>для гачків життєвого циклу, але виявлення, попереднє прогрівання моделі та віджет owl працюють лише на семи хостах уcontentIntegration.entries(ChatGPT, OpenAI, Claude, Gemini, Copilot, Grok, x.ai). - CSP забороняє динамічне виконання коду –
'wasm-unsafe-eval'для ONNX дозволено;'unsafe-eval'– ні. ЖоднихFunction-з-рядка, жодних плагінів на основі eval. - Лише Promise для chrome.* API – жодних функцій зворотного виклику, що приховують обробку помилок.
- Сервісний воркер без стану – MV3 завершує роботу агресивно; збереження даних здійснюється через
chrome.storage, а не через глобальні змінні модуля.
Тести
Тести – основний контрольний механізм правильності. Станом на v1.2.5.x: 688 з 689 проходять у 17 наборах. Новий код повинен зберігати їх зеленими.
npm run test:unit:nocov # fast loop during development (~3s)
npm run test:unit # CI gate with coverage
npm run typecheck # tsc --noEmit
npm run lint # eslint
Виправлення помилок слідують підходу TDD: спочатку пишеться тест, що не проходить, потім виправляється помилка, і тест залишається як захист від регресії. Реальний приклад в tests/unit/lib/ner-detector.test.js – тест "detect-counter does NOT reset on subsequent init successes" був написаний до відповідного виправлення і виявив невдалу першу спробу реалізації.
Участь у розробці
Внески до офіційного репозиторію вітаються відповідно до умов ліцензії. Відкрийте issue або надішліть pull request, дотримуючись інженерних стандартів у CONTRIBUTING.md:
- Гілка від
main. Одна логічна зміна на PR. - Угода про повідомлення комітів:
type(scope): description (vX.Y.Z.W). - Оновлюйте
MIGRATION_LOG.mdдля нетривіальних змін (нові модулі, зміни контрактів, архітектурні зміни). - Контрольний список перед поданням для PR, що торкаються виявлення або мережі: жодних нових
fetch()до власного сервера, жодної нової телеметрії, жоден важкий компонент не вмикається автоматично, все, що зберігається, вноситься до журналу міграції, кожний новий дозвіл обґрунтовується для рецензента Chrome Web Store.
Відповідальне розкриття інформації
Щодо вразливостей безпеки, будь ласка, не відкривайте публічні проблеми на GitHub. Надішліть детальний звіт на security@sowaprivacy.ai:
- Чіткий опис вразливості.
- Кроки для відтворення.
- Уражена версія (поле
versionуmanifest.json). - Оцінка впливу, якщо є.
- Запропоноване виправлення, якщо застосовно.
Ми зобов'язуємось підтвердити отримання вашого звіту протягом 72 годин, надати оновлення статусу протягом 7 днів, зазначити вас у примітках до випуску (якщо ви не надаєте перевагу анонімності) та узгодити з вами терміни публічного розкриття.
Опублікована область охоплення, приклади того, що ми вважаємо вразливістю, та Зал Слави знаходяться у SECURITY.md в кореневій директорії репозиторію.