SOWA Privacy dla programistów

Instalacja ze źródła

SOWA Privacy jest dystrybuowane przez Chrome Web Store jako plik binarny, jednak kod źródłowy jest otwarty do wglądu i użytku osobistego na warunkach licencji Source-Available opisanej w pliku LICENSE. Aby zbudować i załadować rozszerzenie lokalnie:

git clone https://github.com/Sowa-Privacy/sowa-privacy-chrome-extension.git
cd sowa-privacy-chrome-extension
npm install
npm run build

Następnie otwórz chrome://extensions/, włącz Tryb dewelopera i kliknij Załaduj rozpakowane, wskazując folder dist/.

Trzy duże pakiety zewnętrzne

Budowane jednorazowo przez esbuild przed uruchomieniem Vite, dzięki czemu build produkcyjny jest w pełni samodzielny:

  • web-llm.bundle.js – ~5.4 MB – lokalne wnioskowanie LLM (opcjonalne, wymaga zgody).
  • transformers.bundle.js + onnx-wasm/* – ~32 MB – środowisko uruchomieniowe pipeline NER (opcjonalne, wymaga zgody).
  • file-parsers.bundle.js + pdf.worker.min.mjs + xlsx-worker.bundle.js – ~2 MB – parsowanie PDF, DOCX, XLSX na potrzeby interceptora przesyłania plików.

Zawartość rozszerzenia

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 unit tests – keep green
scripts/                      esbuild bundle + zip packaging

Gwarancje prywatności

Są to zasady egzekwowane w kodzie, a nie tylko obietnice w materiałach marketingowych:

  • Brak telemetrii, analityki i wywołań serwerów własnych – z jednym ściśle ograniczonym wyjątkiem: sprawdzeniem uprawnień użytkownika (pojedynczy uwierzytelniony POST do /api/entitlements/me, który zwraca wyłącznie flagi planu użytkownika). Wynik jest buforowany przez godzinę. Żadnych danych osobowych, żadnych promptów.
  • NER domyślnie WYŁĄCZONE, wymaga aktywacji – the model NER to pobieranie zewnętrzne o rozmiarze 65 MB (HuggingFace). Nie rozpoczyna ładowania, dopóki użytkownik nie włączy przełącznika w Ustawieniach.
  • Lokalny LLM domyślnie WYŁĄCZONY, wymaga aktywacji – ta sama zasada. Modele WebLLM są duże; decyzja o pobraniu należy do użytkownika.
  • Owl jest ograniczony do witryny – skrypt treści rejestruje się na <all_urls> dla hooków cyklu życia, jednak wykrywanie, wstępne ładowanie modelu i widget owl działają wyłącznie na siedmiu hostach w contentIntegration.entries (ChatGPT, OpenAI, Claude, Gemini, Copilot, Grok, x.ai).
  • CSP zabrania dynamicznego wykonywania kodu'wasm-unsafe-eval' dla ONNX jest dozwolone; 'unsafe-eval' nie. Brak Function z ciągu znaków, brak wtyczek opartych na eval.
  • Wyłącznie Promise dla API chrome.* – żadnych callbacków, które utrudniają obsługę błędów.
  • Bezstanowy service worker – MV3 agresywnie kończy działanie procesów; trwałość danych zapewnia chrome.storage, a nie globalne zmienne modułów.

Testy

Testy stanowią główną bramę poprawności. Stan dla v1.2.5.x: 688 z 689 przechodzi w 17 zestawach. Nowy kod musi utrzymywać ten wynik.

npm run test:unit:nocov   # szybka pętla podczas tworzenia (~3s)
npm run test:unit          # bramka CI z pokryciem
npm run typecheck          # tsc --noEmit
npm run lint               # eslint

Poprawki błędów mają kształt TDD: najpierw napisz nieudany test, napraw błąd, a test pozostaje jako zabezpieczenie przed regresją. Rzeczywisty przykład w tests/unit/lib/ner-detector.test.js – test „detect-counter does NOT reset on subsequent init successes" został napisany przed odpowiednią poprawką i wykrył nieudaną pierwszą próbę implementacji.

Wkład w projekt

Wkład w oficjalne repozytorium jest mile widziany na warunkach licencji. Otwórz zgłoszenie lub prześlij pull request zgodnie ze standardami inżynieryjnymi opisanymi w CONTRIBUTING.md:

  • Twórz gałąź od main. Jedna logiczna zmiana na PR.
  • Konwencja komunikatów commitów: type(scope): description (vX.Y.Z.W).
  • Aktualizuj MIGRATION_LOG.md w przypadku nietrywialnych zmian (nowe moduły, zmiany kontraktów, przesunięcia architektoniczne).
  • Lista kontrolna przed przesłaniem dla PR dotyczących wykrywania lub sieci: brak nowych wywołań fetch() do serwerów własnych, brak nowej telemetrii, brak automatycznie włączonych ciężkich komponentów, wszystko co zapisujesz trafia do dziennika migracji, każde nowe uprawnienie jest uzasadnione dla recenzenta Chrome Web Store.

Odpowiedzialne ujawnianie

W przypadku podatności bezpieczeństwa prosimy nie otwierać publicznych zgłoszeń na GitHub. Wyślij szczegółowy raport na adres security@sowaprivacy.ai:

  • Czytelny opis podatności.
  • Kroki reprodukcji.
  • Wersja, której dotyczy problem (pole version w manifest.json).
  • Ocena wpływu, jeśli jest dostępna.
  • Sugerowana poprawka, jeśli dotyczy.

Zobowiązujemy się do potwierdzenia zgłoszenia w ciągu 72 godzin, przekazania aktualizacji statusu w ciągu 7 dni, wymienienia Twojego nazwiska w informacjach o wydaniu (chyba że wolisz anonimowość) oraz uzgodnienia z Tobą terminu publicznego ujawnienia.

Opublikowany zakres, przykłady tego, co uznajemy za podatność, oraz Hall of Fame znajdują się w SECURITY.md w katalogu głównym repozytorium.