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