xref: /plugin/extranet/DOKU (revision ef5bb1f3884025c3556b3c46e33332ca386a73a6)
1*ef5bb1f3SLORTET====== Extranet Plugin ======
2*ef5bb1f3SLORTET
3*ef5bb1f3SLORTET---- plugin ----
4*ef5bb1f3SLORTETdescription: Restreint pages, médias et actions pour les visiteurs extranet
5*ef5bb1f3SLORTETauthor     : Valentin LORTET
6*ef5bb1f3SLORTETemail      : contact@valentinlortet.fr
7*ef5bb1f3SLORTETtype       : Action, Syntax, Helper
8*ef5bb1f3SLORTETlastupdate : 2026-03-13
9*ef5bb1f3SLORTETcompatible : Librarian
10*ef5bb1f3SLORTETdepends    : prosemirror
11*ef5bb1f3SLORTETconflicts  :
12*ef5bb1f3SLORTETsimilar    :
13*ef5bb1f3SLORTETtags       : Access, Extranet, Intranet, Proxy, Security, Helper
14*ef5bb1f3SLORTET
15*ef5bb1f3SLORTETdownloadurl: https://github.com/Lortet/dokuwiki-plugin-extranet/zipball/master
16*ef5bb1f3SLORTETbugtracker : https://github.com/Lortet/dokuwiki-plugin-extranet/issues
17*ef5bb1f3SLORTETsourcerepo : https://github.com/Lortet/dokuwiki-plugin-extranet/
18*ef5bb1f3SLORTETdonationurl:
19*ef5bb1f3SLORTETscreenshot_img :
20*ef5bb1f3SLORTET----
21*ef5bb1f3SLORTET
22*ef5bb1f3SLORTET���� **Français** | [[plugin:extranet|���� English]] | [[de:plugin:extranet|���� Deutsch]] | [[es:plugin:extranet|���� Español]]
23*ef5bb1f3SLORTET
24*ef5bb1f3SLORTET===== Installation =====
25*ef5bb1f3SLORTET
26*ef5bb1f3SLORTETInstaller le plugin depuis le [[fr:plugin:extension|Gestionnaire d'extensions]] avec l'URL ci-dessus, ou en copiant le dossier dans ''lib/plugins/extranet''.
27*ef5bb1f3SLORTET
28*ef5bb1f3SLORTET===== Description =====
29*ef5bb1f3SLORTET
30*ef5bb1f3SLORTETLe plugin **extranet** permet :
31*ef5bb1f3SLORTET  * de détecter si une requête vient de l'extranet à partir d'une valeur configurable de ''$_SERVER'' ;
32*ef5bb1f3SLORTET  * de restreindre l'affichage des pages et des médias ;
33*ef5bb1f3SLORTET  * de désactiver certaines actions DokuWiki pour les visiteurs extranet ;
34*ef5bb1f3SLORTET  * d'appliquer des règles globales par filtre ;
35*ef5bb1f3SLORTET  * d'ajouter des exceptions par page avec ''~~NOEXTRANET~~'' et ''~~EXTRANET~~'' ;
36*ef5bb1f3SLORTET  * de s'intégrer à ProseMirror pour conserver ces macros en édition WYSIWYG.
37*ef5bb1f3SLORTET
38*ef5bb1f3SLORTETLe plugin est adapté à une logique de segmentation intranet/extranet. Il complète les ACL, mais ne remplace pas un vrai contrôle d'accès.
39*ef5bb1f3SLORTET
40*ef5bb1f3SLORTET===== Paramètres =====
41*ef5bb1f3SLORTET
42*ef5bb1f3SLORTET^ Nom ^ Description ^ Valeur par défaut ^
43*ef5bb1f3SLORTET| request_match_key | Clé de ''$_SERVER'' utilisée pour déterminer si la requête vient de l'extranet. Peut être ''REMOTE_ADDR'' ou une clé ''HTTP_*''. | '''' |
44*ef5bb1f3SLORTET| extranet_match_list | Liste de valeurs considérées comme extranet, séparées par des virgules. | '''' |
45*ef5bb1f3SLORTET| extranet_match_regex | Regex permettant de détecter une requête extranet à partir de la valeur lue. | '''' |
46*ef5bb1f3SLORTET| default_policy | Politique par défaut : ''allow'', ''block'', ''force_allow'' ou ''force_block''. | ''allow'' |
47*ef5bb1f3SLORTET| filter_list | Liste d'identifiants de pages ou médias ciblés par la politique. Supporte les IDs exacts, namespaces finissant par '':'', et jokers ''*''. | '''' |
48*ef5bb1f3SLORTET| filter_regex | Regex complémentaire pour cibler pages ou médias. | '''' |
49*ef5bb1f3SLORTET| hide_files | Gestion des médias restreints : ''all'', ''except_pageicons'' ou ''none''. | ''none'' |
50*ef5bb1f3SLORTET| disable_actions | Actions DokuWiki désactivées pour les visiteurs extranet. | ''admin,edit,preview,save,revisions,diff,export_raw,export_xhtml,export_xhtmlbody,permalink,register'' |
51*ef5bb1f3SLORTET| restricted_disable_actions | Actions supplémentaires désactivées seulement quand la page courante est restreinte. | '''' |
52*ef5bb1f3SLORTET| preserve_first_title | Conserver le premier titre quand une page est masquée. | ''true'' |
53*ef5bb1f3SLORTET| message_prefix | Préfixe ajouté avant le message de restriction. | '''' |
54*ef5bb1f3SLORTET| message_suffix | Suffixe ajouté après le message de restriction. | '''' |
55*ef5bb1f3SLORTET
56*ef5bb1f3SLORTET===== Compatibilité =====
57*ef5bb1f3SLORTET
58*ef5bb1f3SLORTETLes anciennes clés de configuration suivantes restent acceptées :
59*ef5bb1f3SLORTET  * ''server_ip_key''
60*ef5bb1f3SLORTET  * ''extranet_ip_list''
61*ef5bb1f3SLORTET  * ''extranet_ip_regex''
62*ef5bb1f3SLORTET
63*ef5bb1f3SLORTETLes nouveaux noms sont toutefois à privilégier :
64*ef5bb1f3SLORTET  * ''request_match_key''
65*ef5bb1f3SLORTET  * ''extranet_match_list''
66*ef5bb1f3SLORTET  * ''extranet_match_regex''
67*ef5bb1f3SLORTET
68*ef5bb1f3SLORTET===== Utilisation =====
69*ef5bb1f3SLORTET
70*ef5bb1f3SLORTETDeux macros sont disponibles :
71*ef5bb1f3SLORTET  * ''~~NOEXTRANET~~'' : bloque la page depuis l'extranet quand la politique l'autorise ;
72*ef5bb1f3SLORTET  * ''~~EXTRANET~~'' : autorise la page depuis l'extranet quand la politique l'autorise.
73*ef5bb1f3SLORTET
74*ef5bb1f3SLORTETComportement selon ''default_policy'' :
75*ef5bb1f3SLORTET  * ''allow'' : tout est autorisé sauf les pages filtrées ou marquées ''~~NOEXTRANET~~'' ;
76*ef5bb1f3SLORTET  * ''block'' : tout est bloqué sauf les pages filtrées ou marquées ''~~EXTRANET~~'' ;
77*ef5bb1f3SLORTET  * ''force_allow'' : seules les règles de filtre s'appliquent, ''~~NOEXTRANET~~'' est ignoré ;
78*ef5bb1f3SLORTET  * ''force_block'' : seules les règles de filtre s'appliquent, ''~~EXTRANET~~'' est ignoré.
79*ef5bb1f3SLORTET
80*ef5bb1f3SLORTET===== Exemples =====
81*ef5bb1f3SLORTET
82*ef5bb1f3SLORTETDétection par IP directe :
83*ef5bb1f3SLORTET  * ''request_match_key = REMOTE_ADDR''
84*ef5bb1f3SLORTET  * ''extranet_match_regex = /^10\.100\./''
85*ef5bb1f3SLORTET
86*ef5bb1f3SLORTETDétection par header proxy :
87*ef5bb1f3SLORTET  * ''request_match_key = HTTP_X_NETWORK_ZONE''
88*ef5bb1f3SLORTET  * ''extranet_match_list = extranet''
89*ef5bb1f3SLORTET
90*ef5bb1f3SLORTETDétection par nom d'upstream :
91*ef5bb1f3SLORTET  * ''request_match_key = HTTP_X_UPSTREAM_HOST''
92*ef5bb1f3SLORTET  * ''extranet_match_regex = /^frontend-ext-/''
93*ef5bb1f3SLORTET
94*ef5bb1f3SLORTET===== API Helper =====
95*ef5bb1f3SLORTET
96*ef5bb1f3SLORTETCharger le helper :
97*ef5bb1f3SLORTET''$extranet = plugin_load('helper', 'extranet');''
98*ef5bb1f3SLORTET
99*ef5bb1f3SLORTET==== Méthodes principales ====
100*ef5bb1f3SLORTET
101*ef5bb1f3SLORTET^ Méthode ^ Depuis ^ Description ^
102*ef5bb1f3SLORTET| ''getDefaultPolicy()'' | ''2026-03-13'' | Retourne la politique par défaut effective. |
103*ef5bb1f3SLORTET| ''getRequestMatchKey()'' | ''2026-03-13'' | Retourne la clé ''$_SERVER'' utilisée pour la détection. |
104*ef5bb1f3SLORTET| ''getExtranetMatchList()'' | ''2026-03-13'' | Retourne la liste des valeurs considérées comme extranet. |
105*ef5bb1f3SLORTET| ''getExtranetMatchRegex()'' | ''2026-03-13'' | Retourne la regex de détection extranet. |
106*ef5bb1f3SLORTET| ''isExtranetRequest()'' | ''2026-03-13'' | Indique si la requête courante est traitée comme extranet. |
107*ef5bb1f3SLORTET| ''isPageVisibleFromExtranet($id, $content = null)'' | ''2026-03-13'' | Indique si une page est visible depuis l'extranet. |
108*ef5bb1f3SLORTET| ''isMediaVisibleFromExtranet($mediaID)'' | ''2026-03-13'' | Indique si un média est visible depuis l'extranet. |
109*ef5bb1f3SLORTET| ''isPageAllowed($id, $content = null)'' | ''2026-03-13'' | Indique si une page est autorisée dans le contexte courant. |
110*ef5bb1f3SLORTET| ''isMediaAllowed($mediaID)'' | ''2026-03-13'' | Indique si un média est autorisé dans le contexte courant. |
111*ef5bb1f3SLORTET| ''parseRuleList($raw)'' | ''2026-03-13'' | Convertit une configuration de règles en tableau exploitable. |
112*ef5bb1f3SLORTET| ''idMatchesRule($id, $rule)'' | ''2026-03-13'' | Teste un identifiant contre une règle exacte, namespace, joker ou regex. |
113*ef5bb1f3SLORTET
114*ef5bb1f3SLORTET===== Fonctionnement =====
115*ef5bb1f3SLORTET
116*ef5bb1f3SLORTETLa détection extranet repose sur une valeur lue dans ''$_SERVER'' :
117*ef5bb1f3SLORTET  * la valeur brute complète est testée ;
118*ef5bb1f3SLORTET  * si elle contient des virgules, chaque élément séparé est aussi testé.
119*ef5bb1f3SLORTET
120*ef5bb1f3SLORTETCela permet de couvrir :
121*ef5bb1f3SLORTET  * une IP directe ;
122*ef5bb1f3SLORTET  * un header de type ''X-Forwarded-For'' ;
123*ef5bb1f3SLORTET  * un marqueur réseau injecté par proxy ;
124*ef5bb1f3SLORTET  * un nom d'upstream ou de frontal.
125*ef5bb1f3SLORTET
126*ef5bb1f3SLORTETQuand une page est restreinte :
127*ef5bb1f3SLORTET  * le cache est séparé entre intranet et extranet ;
128*ef5bb1f3SLORTET  * le contenu wiki est remplacé par un message configurable ;
129*ef5bb1f3SLORTET  * le premier titre peut être conservé si ''preserve_first_title'' est activé.
130*ef5bb1f3SLORTET
131*ef5bb1f3SLORTETQuand un média est restreint et que ''hide_files'' n'est pas à ''none'', le plugin renvoie une image dédiée à la place du fichier réel.
132*ef5bb1f3SLORTET
133*ef5bb1f3SLORTET===== Notes =====
134*ef5bb1f3SLORTET
135*ef5bb1f3SLORTET  * Le plugin ne doit pas être vu comme un remplacement des ACL.
136*ef5bb1f3SLORTET  * La fiabilité dépend du marqueur transmis par l'infrastructure web. Un header non fiable ou forgé rendra la détection non sûre.
137