AdHole est un logiciel propriétaire et gratuit. Son code source n'est pas fourni, et le programme n'est pas redistribuable. Les conditions d'utilisation sont dans CGU.md.
Le programme s'appuie néanmoins sur des bibliothèques écrites par d'autres, publiées sous des licences libres permissives. Toutes autorisent leur usage dans un logiciel fermé, gratuit ou payant. Toutes, sauf celles placées dans le domaine public, demandent en échange que leur texte et la mention de copyright de leur auteur accompagnent le programme distribué.
C'est pourquoi l'installateur pose le fichier LICENCES-TIERCES.txt à côté du programme. Il
contient le texte intégral de chaque licence, recopié depuis le fichier livré par chaque projet. Ce
fichier n'est pas décoratif : il est la contrepartie de ces licences. Ne pas le supprimer, ne pas
le retirer de l'installateur.
Modules obtenus par go version -m bin/adhole.exe, licences lues dans le fichier livré par chaque
projet. Vérifié le 13 septembre 2026.
| Composant | Rôle | Licence |
|---|---|---|
| Go — bibliothèque standard et moteur d'exécution | le langage lui-même, compilé dans le programme | BSD 3 clauses |
| golang.org/x/crypto, exp, net, sys, text | bibliothèques Go officielles | BSD 3 clauses (texte identique) |
| Public Suffix List (via golang.org/x/net/publicsuffix) | savoir où s'arrête un nom de domaine | MPL-2.0 |
| WebView2Loader.dll (Microsoft) | chargeur du composant WebView2, embarqué dans le binaire | BSD 3 clauses |
| github.com/jchv/go-webview2 | fenêtre d'application du tableau de bord | MIT |
| github.com/jchv/go-winloader | chargement en mémoire du composant WebView2 | ISC |
| github.com/AdguardTeam/dnsproxy | résolveurs DNS chiffrés | Apache-2.0 |
| github.com/AdguardTeam/dnscrypt | protocole DNSCrypt | Unlicense |
| github.com/AdguardTeam/golibs | utilitaires AdGuard | Unlicense |
| github.com/ameshkov/dnsstamps | adresses de résolveurs | Unlicense |
| github.com/miekg/dns | protocole DNS | BSD 3 clauses |
| github.com/elazarl/goproxy | proxy HTTP(S) déchiffrant | BSD 3 clauses |
| github.com/quic-go/quic-go | transport QUIC (DNS-over-QUIC, HTTP/3) | MIT |
| github.com/quic-go/qpack | compression d'en-têtes HTTP/3 | MIT |
| github.com/robfig/cron | planification interne | MIT |
| gopkg.in/yaml.v3 | lecture de la configuration | MIT et Apache-2.0 |
Aucune de ces licences n'oblige à publier le code d'AdHole.
Deux composants méritent une phrase de plus.
La Public Suffix List est la seule brique sous licence Mozilla. Ses données sont compilées dans
le programme pour savoir que lemonde.fr est un domaine et co.uk un suffixe. La MPL-2.0 autorise
la distribution en binaire sous des conditions propriétaires, à condition d'indiquer où obtenir sa
forme source : c'est fait dans LICENCES-TIERCES.txt, qui renvoie à
https://publicsuffix.org/list/public_suffix_list.dat.
WebView2Loader.dll est un composant de Microsoft, redistribué sous licence BSD 3 clauses et
compilé dans le binaire par la bibliothèque go-webview2. Le moteur WebView2 lui-même n'est pas
distribué avec AdHole : il fait partie de Windows, ou s'installe séparément depuis Microsoft.
Les outils qui servent à fabriquer le programme et son installateur — Inno Setup, goversioninfo,
garble — ne sont pas liés dans les exécutables. Leurs licences figurent tout de même dans
LICENCES-TIERCES.txt.
Les moteurs de filtrage sont écrits pour ce projet
Les trois moteurs qui décident ce qui est bloqué sont propres à AdHole :
internal/dnsfilter— le filtre DNS de toute la maison ;internal/filtre/reseau— les règles réseau appliquées aux pages web ;internal/filtre/cosmetique— le masquage des emplacements publicitaires.
Ils interprètent les listes au format AdGuard / EasyList, format que ces listes publient et que n'importe quel programme peut lire. Une syntaxe et un format de fichier ne sont pas protégés par le droit d'auteur. Aucun code d'un autre bloqueur n'est repris.
Listes de filtrage
Sur ordinateur (Windows, macOS, Linux), elles ne sont pas incluses dans le programme. Il les télécharge depuis les serveurs de leurs auteurs, sur la machine de l'utilisateur, au premier démarrage, puis les rafraîchit toutes les 24 heures.
L'application Android contient une copie des trois listes DNS par défaut, pour filtrer dès la première ouverture sans attendre de téléchargement. Chaque copie est identique, octet pour octet, au fichier publié par son auteur ; l'application la remplace par la version publiée dès qu'elle télécharge la liste à nouveau. L'application iPhone n'en contient aucune : son filtre DNS tourne sur le serveur de l'éditeur, qui télécharge les listes lui-même.
L'application iPhone livre en outre les règles de ses deux bloqueurs Safari. Ce ne sont pas
des copies de listes mais des fichiers dérivés : AdHole traduit deux listes dans le format
déclaratif de Safari, et ce sont ces traductions qui sont livrées, pour que Safari filtre dès que
l'utilisateur active les bloqueurs. Ces deux listes-là sont sous licence Creative Commons, qui
autorise la redistribution d'un travail dérivé ; aucune liste sous GPL n'est traduite avant
d'arriver sur l'appareil. Détail : LICENCES-TIERCES.txt, section 17, et mobile/SAFARI.md.
Dans les deux cas, les listes restent la propriété de leurs auteurs.
| Liste | Auteur | Moteur | Copie dans les applis mobiles | Licence annoncée |
|---|---|---|---|---|
| AdGuard DNS filter | AdGuard | DNS | Android seulement | GPL-3.0 |
| HaGeZi's Multi PRO | hagezi | DNS | Android seulement | GPL-3.0 |
| HaGeZi's Encrypted DNS Bypass | hagezi | DNS | Android seulement | GPL-3.0 |
| AdGuard Base filter | AdGuard | proxy (PC seulement) | non | GPL-3.0 |
| AdGuard Tracking Protection filter | AdGuard | proxy (PC seulement) | non | GPL-3.0 |
| AdGuard French filter | AdGuard | proxy (PC seulement) | non | GPL-3.0 |
| EasyList | The EasyList authors | Safari (iPhone) | oui, traduite | CC BY-SA 3.0 (ou GPL-3.0, au choix) |
| Easylist Cookie List | The EasyList authors | Safari (iPhone) | oui, traduite | CC BY 3.0 |
| AdGuard Base filter | AdGuard | Safari (iPhone) | non | GPL-3.0 |
| AdGuard French filter | AdGuard | Safari (iPhone) | non | GPL-3.0 |
| AdGuard Cookie Notices filter | AdGuard | Safari (iPhone) | non | GPL-3.0 |
Les titres et les licences sont ceux annoncés dans l'en-tête de chaque fichier. AdGuard décrit son filtre de base comme « EasyList + AdGuard English filter » : du travail d'EasyList s'y trouve, sous la licence d'AdGuard. Son filtre DNS est lui aussi composé d'autres listes (EasyList, EasyPrivacy…), nommées dans son en-tête.
La GPL v3 ne pose ses conditions qu'à celui qui transmet une copie (section 2 : « You may make, run and propagate covered works that you do not convey, without conditions »).
- Sur ordinateur, AdHole n'en transmet aucune : le téléchargement part de la machine de l'utilisateur et va droit chez l'auteur de la liste.
- L'application Android en transmet une. Elle remplit donc la section 4 de la GPL v3 (copies
conformes) : copie inchangée, en-têtes et mentions de licence conservés, auteurs nommés, texte
intégral de la licence livré avec l'application. Par prudence, elle remplit aussi la section 6,
au cas où une copie compressée serait vue comme une « forme non source » : l'adresse de la
source, l'historique des versions et la version exacte de chaque copie sont indiqués. Tout cela
est dans
LICENCES-TIERCES.txt(section 16 et annexe B), que l'application affiche. - L'application iPhone n'en transmet aucune : elle ne contient aucune de ces listes.
- Ces listes forment avec AdHole un agrégat au sens de la section 5 : le moteur les lit comme des données, exactement comme une liste ajoutée par l'utilisateur, et fonctionne sans elles. Leur licence s'applique à elles, pas au programme. Les conditions d'utilisation d'AdHole ne restreignent aucun des droits que la GPL v3 donne sur ces listes.
Règles à ne pas enfreindre, parce que ce sont elles qui maintiennent cette situation :
- ne jamais embarquer une copie d'une liste dans l'installateur du PC, ni la re-servir depuis un serveur à nous ;
- ne jamais livrer dans une application les règles Safari dérivées d'une liste sous GPL. La
traduction d'une liste en est un travail dérivé : la livrer, ce serait la transmettre, avec tout
ce que la GPL v3 y attache.
tools/safari-basene lit que les listes Creative Commons (internal/filtre/safari/sources.go, champEmbarquee) ; les listes d'AdGuard ne sont traduites que sur l'appareil de l'utilisateur, et leur traduction ne le quitte jamais ; - ne jamais modifier les copies livrées dans l'application Android : elles doivent rester
identiques au fichier de l'auteur.
go generate ./mobileles régénère et met à jour la ligne « Copie » de la section 16 deLICENCES-TIERCES.txt; il s'arrête si une liste embarquée n'y est pas décrite, et un test du moteur mobile échoue si la section ne correspond plus aux copies ; - ne jamais rafraîchir plus souvent que la fréquence annoncée par chaque liste dans son en-tête
(
! Expires:— 8 heures chez hagezi, 12 heures chez AdGuard). Le rythme actuel, 24 heures, est plus lent que les deux.
Retirer une liste de la configuration laisse le programme fonctionnel, avec moins de règles.
Ce qui est écrit ici, et pas ailleurs
Deux endroits du code parlent le même langage que des projets libres existants, sans en reprendre le code.
L'exécutant de scriptlets (internal/filtre/pages/scriptlets.js) reconnaît les noms et la
sémantique des scriptlets AdGuard — set-cookie, abort-on-property-read, remove-class… —
afin que les règles des listes publiques soient interprétables. Un nom de fonction et une syntaxe ne
sont pas protégés par le droit d'auteur ; l'implémentation, elle, est propre au projet, et n'a ni la
forme ni les fonctions d'appui de la bibliothèque d'AdGuard.
Elle s'en écarte volontairement sur un point : elle refuse d'exécuter une règle qui enregistrerait un consentement positif ou cliquerait « accepter ». Plusieurs listes publiques contiennent de telles règles. AdHole refuse les traceurs, il ne les accepte pas à votre place.
Le retrait des publicités YouTube s'inspire de projets libres, dont les mécanismes ont été compris puis réécrits :
- webosbrew/youtube-webos — retirer les champs publicitaires des réponses du lecteur, et ajouter un champ à la requête sortante pour éviter l'attente punitive dite « fake buffering ».
- uBlockOrigin/uAssets — analyse de cette attente et des règles de filtrage associées.
- TizenTube — même approche côté téléviseur.
Ces trois projets sont sous GPL. Aucune ligne de leur code n'est reprise ici : ni leur structure, ni
leurs fonctions, ni leurs commentaires. Ce qui est commun tient aux noms des champs de l'API de
YouTube (adPlacements, adSlots, playerAds…), qui sont ceux de Google, pas les leurs.