1====== Extranet Plugin ======
2
3---- plugin ----
4description: Restreint pages, médias et actions pour les visiteurs extranet
5author     : Valentin LORTET
6email      : contact@valentinlortet.fr
7type       : Action, Syntax, Helper
8lastupdate : 2026-03-13
9compatible : Librarian
10depends    : prosemirror
11conflicts  :
12similar    :
13tags       : Access, Extranet, Intranet, Proxy, Security, Helper
14
15downloadurl: https://github.com/Lortet/dokuwiki-plugin-extranet/zipball/master
16bugtracker : https://github.com/Lortet/dokuwiki-plugin-extranet/issues
17sourcerepo : https://github.com/Lortet/dokuwiki-plugin-extranet/
18donationurl:
19screenshot_img :
20----
21
22���� **Français** | [[plugin:extranet|���� English]] | [[de:plugin:extranet|���� Deutsch]] | [[es:plugin:extranet|���� Español]]
23
24===== Installation =====
25
26Installer 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
28===== Description =====
29
30Le plugin **extranet** permet :
31  * de détecter si une requête vient de l'extranet à partir d'une valeur configurable de ''$_SERVER'' ;
32  * de restreindre l'affichage des pages et des médias ;
33  * de désactiver certaines actions DokuWiki pour les visiteurs extranet ;
34  * d'appliquer des règles globales par filtre ;
35  * d'ajouter des exceptions par page avec ''~~NOEXTRANET~~'' et ''~~EXTRANET~~'' ;
36  * de s'intégrer à ProseMirror pour conserver ces macros en édition WYSIWYG.
37
38Le 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
40===== Paramètres =====
41
42^ Nom ^ Description ^ Valeur par défaut ^
43| 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| extranet_match_list | Liste de valeurs considérées comme extranet, séparées par des virgules. | '''' |
45| extranet_match_regex | Regex permettant de détecter une requête extranet à partir de la valeur lue. | '''' |
46| default_policy | Politique par défaut : ''allow'', ''block'', ''force_allow'' ou ''force_block''. | ''allow'' |
47| 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| filter_regex | Regex complémentaire pour cibler pages ou médias. | '''' |
49| hide_files | Gestion des médias restreints : ''all'', ''except_pageicons'' ou ''none''. | ''none'' |
50| 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| restricted_disable_actions | Actions supplémentaires désactivées seulement quand la page courante est restreinte. | '''' |
52| preserve_first_title | Conserver le premier titre quand une page est masquée. | ''true'' |
53| message_prefix | Préfixe ajouté avant le message de restriction. | '''' |
54| message_suffix | Suffixe ajouté après le message de restriction. | '''' |
55
56===== Compatibilité =====
57
58Les anciennes clés de configuration suivantes restent acceptées :
59  * ''server_ip_key''
60  * ''extranet_ip_list''
61  * ''extranet_ip_regex''
62
63Les nouveaux noms sont toutefois à privilégier :
64  * ''request_match_key''
65  * ''extranet_match_list''
66  * ''extranet_match_regex''
67
68===== Utilisation =====
69
70Deux macros sont disponibles :
71  * ''~~NOEXTRANET~~'' : bloque la page depuis l'extranet quand la politique l'autorise ;
72  * ''~~EXTRANET~~'' : autorise la page depuis l'extranet quand la politique l'autorise.
73
74Comportement selon ''default_policy'' :
75  * ''allow'' : tout est autorisé sauf les pages filtrées ou marquées ''~~NOEXTRANET~~'' ;
76  * ''block'' : tout est bloqué sauf les pages filtrées ou marquées ''~~EXTRANET~~'' ;
77  * ''force_allow'' : seules les règles de filtre s'appliquent, ''~~NOEXTRANET~~'' est ignoré ;
78  * ''force_block'' : seules les règles de filtre s'appliquent, ''~~EXTRANET~~'' est ignoré.
79
80===== Exemples =====
81
82Détection par IP directe :
83  * ''request_match_key = REMOTE_ADDR''
84  * ''extranet_match_regex = /^10\.100\./''
85
86Détection par header proxy :
87  * ''request_match_key = HTTP_X_NETWORK_ZONE''
88  * ''extranet_match_list = extranet''
89
90Détection par nom d'upstream :
91  * ''request_match_key = HTTP_X_UPSTREAM_HOST''
92  * ''extranet_match_regex = /^frontend-ext-/''
93
94===== API Helper =====
95
96Charger le helper :
97''$extranet = plugin_load('helper', 'extranet');''
98
99==== Méthodes principales ====
100
101^ Méthode ^ Depuis ^ Description ^
102| ''getDefaultPolicy()'' | ''2026-03-13'' | Retourne la politique par défaut effective. |
103| ''getRequestMatchKey()'' | ''2026-03-13'' | Retourne la clé ''$_SERVER'' utilisée pour la détection. |
104| ''getExtranetMatchList()'' | ''2026-03-13'' | Retourne la liste des valeurs considérées comme extranet. |
105| ''getExtranetMatchRegex()'' | ''2026-03-13'' | Retourne la regex de détection extranet. |
106| ''isExtranetRequest()'' | ''2026-03-13'' | Indique si la requête courante est traitée comme extranet. |
107| ''isPageVisibleFromExtranet($id, $content = null)'' | ''2026-03-13'' | Indique si une page est visible depuis l'extranet. |
108| ''isMediaVisibleFromExtranet($mediaID)'' | ''2026-03-13'' | Indique si un média est visible depuis l'extranet. |
109| ''isPageAllowed($id, $content = null)'' | ''2026-03-13'' | Indique si une page est autorisée dans le contexte courant. |
110| ''isMediaAllowed($mediaID)'' | ''2026-03-13'' | Indique si un média est autorisé dans le contexte courant. |
111| ''parseRuleList($raw)'' | ''2026-03-13'' | Convertit une configuration de règles en tableau exploitable. |
112| ''idMatchesRule($id, $rule)'' | ''2026-03-13'' | Teste un identifiant contre une règle exacte, namespace, joker ou regex. |
113
114===== Fonctionnement =====
115
116La détection extranet repose sur une valeur lue dans ''$_SERVER'' :
117  * la valeur brute complète est testée ;
118  * si elle contient des virgules, chaque élément séparé est aussi testé.
119
120Cela permet de couvrir :
121  * une IP directe ;
122  * un header de type ''X-Forwarded-For'' ;
123  * un marqueur réseau injecté par proxy ;
124  * un nom d'upstream ou de frontal.
125
126Quand une page est restreinte :
127  * le cache est séparé entre intranet et extranet ;
128  * le contenu wiki est remplacé par un message configurable ;
129  * le premier titre peut être conservé si ''preserve_first_title'' est activé.
130
131Quand 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
133===== Notes =====
134
135  * Le plugin ne doit pas être vu comme un remplacement des ACL.
136  * 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