SOWA Privacy pour les développeurs

Installer depuis les sources

SOWA Privacy est distribué via le Chrome Web Store sous forme binaire, mais le code source est ouvert à l'inspection et à l'usage personnel sous la licence source-disponible dans LICENSE. Pour le compiler et le charger localement :

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

Ouvrez ensuite chrome://extensions/, activez le mode développeur, puis cliquez sur Charger l'extension non empaquetée et sélectionnez le dossier dist/.

Trois bundles tiers volumineux

Compilés une seule fois avec esbuild avant l'exécution de Vite, le build de production est donc entièrement autonome :

  • web-llm.bundle.js – ~5,4 Mo – inférence LLM locale (optionnel, activation manuelle).
  • transformers.bundle.js + onnx-wasm/* – ~32 Mo – runtime du pipeline NER (optionnel, activation manuelle).
  • file-parsers.bundle.js + pdf.worker.min.mjs + xlsx-worker.bundle.js – ~2 Mo – analyse PDF, DOCX, XLSX pour l'intercepteur d'envoi de fichiers.

Ce que contient l'extension

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

Garanties de confidentialité

Ce sont des règles appliquées dans le code, pas de simples promesses marketing :

  • Aucune télémétrie, aucune analytique, aucun appel à un serveur propriétaire – avec une seule exception à portée limitée : la vérification des droits de l'utilisateur (un unique POST authentifié vers /api/entitlements/me qui ne retourne que les indicateurs d'abonnement). Mis en cache pendant une heure. Aucune DCP, aucune invite.
  • NER désactivé par défaut, activation manuelle uniquement – le modèle NER est un téléchargement tiers de 65 Mo (HuggingFace). Il ne commence jamais à se charger avant que l'utilisateur active explicitement la bascule dans les Paramètres.
  • LLM local désactivé par défaut, activation manuelle uniquement – même règle. Les modèles WebLLM sont volumineux ; le téléchargement est à l'initiative de l'utilisateur.
  • Le widget Owl est limité aux sites concernés – le content script s'enregistre sur <all_urls> pour les hooks de cycle de vie, mais la détection, le préchauffage du modèle et le widget Owl ne s'exécutent que sur les sept hôtes dans contentIntegration.entries (ChatGPT, OpenAI, Claude, Gemini, Copilot, Grok, x.ai).
  • La CSP interdit l'exécution de code dynamique'wasm-unsafe-eval' est autorisé pour ONNX ; 'unsafe-eval' ne l'est pas. Pas de Function-depuis-chaîne, pas de plugins pilotés par eval.
  • Uniquement des promesses pour les API chrome.* – aucune forme de callback qui masque la gestion des erreurs.
  • Service worker sans état – MV3 se termine de manière agressive ; la persistance est dans chrome.storage, pas dans les variables globales de module.

Tests

Les tests constituent le principal contrôle de conformité. En version v1.2.5.x : 688 sur 689 réussis dans 17 suites. Tout nouveau code doit maintenir ce résultat au vert.

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

Les corrections de bogues suivent une approche TDD : écrire d'abord le test défaillant, corriger le bogue, le test sert ensuite de garde-fou contre les régressions. Exemple concret livré dans tests/unit/lib/ner-detector.test.js – le test « detect-counter does NOT reset on subsequent init successes » a été écrit avant son correctif correspondant et a détecté une mauvaise première tentative d'implémentation.

Contribuer

Les contributions au dépôt officiel sont les bienvenues dans le respect des termes de la licence. Ouvrez un ticket ou soumettez une pull request en suivant les normes d'ingénierie dans CONTRIBUTING.md :

  • Partir de la branche main. Un seul changement logique par PR.
  • Convention de message de commit : type(scope): description (vX.Y.Z.W).
  • Mettre à jour MIGRATION_LOG.md pour les changements non triviaux (nouveaux modules, modifications de contrat, changements architecturaux).
  • Liste de contrôle pré-soumission pour les PR touchant la détection ou le réseau : aucun nouveau fetch() vers un serveur propriétaire, aucune nouvelle télémétrie, aucun composant lourd activé automatiquement, tout ce qui est stocké doit figurer dans le journal de migration, toute nouvelle permission doit être justifiée pour le relecteur du Chrome Web Store.

Divulgation responsable

Pour les vulnérabilités de sécurité, veuillez ne pas ouvrir de tickets publics sur GitHub. Envoyez un rapport détaillé à security@sowaprivacy.ai :

  • Description claire de la vulnérabilité.
  • Étapes pour reproduire.
  • Version concernée (le champ version dans manifest.json).
  • Évaluation de l'impact si vous en avez une.
  • Correctif suggéré le cas échéant.

Nous nous engageons à accuser réception de votre rapport dans les 72 heures, à fournir une mise à jour de statut dans les 7 jours, à vous créditer dans les notes de version (sauf si vous préférez l'anonymat), et à coordonner avec vous le calendrier de divulgation publique.

Le périmètre publié, des exemples de ce que nous considérons comme une vulnérabilité, et un Tableau d'honneur se trouvent dans SECURITY.md à la racine du dépôt.