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