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/mequi 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 danscontentIntegration.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 deFunction-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.mdpour 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
versiondansmanifest.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.