1*ef5bb1f3SLORTET====== Extranet Plugin ====== 2*ef5bb1f3SLORTET 3*ef5bb1f3SLORTET---- plugin ---- 4*ef5bb1f3SLORTETdescription: Restringe páginas, medios y acciones para visitantes de la 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[[fr:plugin:extranet| Français]] | [[plugin:extranet| English]] | [[de:plugin:extranet| Deutsch]] | **Español** 23*ef5bb1f3SLORTET 24*ef5bb1f3SLORTET===== Instalación ===== 25*ef5bb1f3SLORTET 26*ef5bb1f3SLORTETInstalar el plugin desde el [[plugin:extension|Gestor de extensiones]] con la URL anterior, o copiando la carpeta en ''lib/plugins/extranet''. 27*ef5bb1f3SLORTET 28*ef5bb1f3SLORTET===== Descripción ===== 29*ef5bb1f3SLORTET 30*ef5bb1f3SLORTETEl plugin **extranet** puede: 31*ef5bb1f3SLORTET * detectar si una solicitud proviene de la extranet a partir de un valor configurable de ''$_SERVER''; 32*ef5bb1f3SLORTET * restringir la visualización de páginas y archivos multimedia; 33*ef5bb1f3SLORTET * desactivar acciones seleccionadas de DokuWiki para los visitantes de la extranet; 34*ef5bb1f3SLORTET * aplicar reglas globales mediante filtros; 35*ef5bb1f3SLORTET * añadir excepciones por página con ''~~NOEXTRANET~~'' y ''~~EXTRANET~~''; 36*ef5bb1f3SLORTET * integrarse con ProseMirror para conservar estas macros en edición WYSIWYG. 37*ef5bb1f3SLORTET 38*ef5bb1f3SLORTETEl plugin está pensado para una lógica de segmentación intranet/extranet. Complementa las ACL, pero no sustituye un control de acceso real. 39*ef5bb1f3SLORTET 40*ef5bb1f3SLORTET===== Parámetros ===== 41*ef5bb1f3SLORTET 42*ef5bb1f3SLORTET^ Nombre ^ Descripción ^ Valor predeterminado ^ 43*ef5bb1f3SLORTET| request_match_key | Clave de ''$_SERVER'' usada para determinar si la solicitud proviene de la extranet. Puede ser ''REMOTE_ADDR'' o una clave ''HTTP_*''. | '''' | 44*ef5bb1f3SLORTET| extranet_match_list | Lista de valores separados por comas tratados como extranet. | '''' | 45*ef5bb1f3SLORTET| extranet_match_regex | Regex usada para detectar una solicitud de extranet a partir del valor configurado. | '''' | 46*ef5bb1f3SLORTET| default_policy | Política predeterminada: ''allow'', ''block'', ''force_allow'' o ''force_block''. | ''allow'' | 47*ef5bb1f3SLORTET| filter_list | Lista de IDs de páginas o archivos multimedia afectados por la política. Admite IDs exactos, prefijos de espacio de nombres terminados en '':'', y comodines ''*''. | '''' | 48*ef5bb1f3SLORTET| filter_regex | Regex adicional para apuntar a páginas o archivos multimedia. | '''' | 49*ef5bb1f3SLORTET| hide_files | Cómo se gestionan los archivos multimedia restringidos: ''all'', ''except_pageicons'' o ''none''. | ''none'' | 50*ef5bb1f3SLORTET| disable_actions | Acciones de DokuWiki desactivadas para los visitantes de la extranet. | ''admin,edit,preview,save,revisions,diff,export_raw,export_xhtml,export_xhtmlbody,permalink,register'' | 51*ef5bb1f3SLORTET| restricted_disable_actions | Acciones adicionales desactivadas solo cuando la página actual está restringida. | '''' | 52*ef5bb1f3SLORTET| preserve_first_title | Conserva el primer encabezado cuando una página se oculta. | ''true'' | 53*ef5bb1f3SLORTET| message_prefix | Prefijo insertado antes del mensaje de restricción. | '''' | 54*ef5bb1f3SLORTET| message_suffix | Sufijo insertado después del mensaje de restricción. | '''' | 55*ef5bb1f3SLORTET 56*ef5bb1f3SLORTET===== Compatibilidad ===== 57*ef5bb1f3SLORTET 58*ef5bb1f3SLORTETLas siguientes claves de configuración antiguas siguen siendo aceptadas: 59*ef5bb1f3SLORTET * ''server_ip_key'' 60*ef5bb1f3SLORTET * ''extranet_ip_list'' 61*ef5bb1f3SLORTET * ''extranet_ip_regex'' 62*ef5bb1f3SLORTET 63*ef5bb1f3SLORTETConviene usar los nuevos nombres: 64*ef5bb1f3SLORTET * ''request_match_key'' 65*ef5bb1f3SLORTET * ''extranet_match_list'' 66*ef5bb1f3SLORTET * ''extranet_match_regex'' 67*ef5bb1f3SLORTET 68*ef5bb1f3SLORTET===== Uso ===== 69*ef5bb1f3SLORTET 70*ef5bb1f3SLORTETHay dos macros disponibles: 71*ef5bb1f3SLORTET * ''~~NOEXTRANET~~'' : bloquea la página desde la extranet cuando la política lo permite; 72*ef5bb1f3SLORTET * ''~~EXTRANET~~'' : permite la página desde la extranet cuando la política lo permite. 73*ef5bb1f3SLORTET 74*ef5bb1f3SLORTETComportamiento según ''default_policy'': 75*ef5bb1f3SLORTET * ''allow'' : todo está permitido excepto las páginas filtradas o las páginas marcadas con ''~~NOEXTRANET~~''; 76*ef5bb1f3SLORTET * ''block'' : todo está bloqueado excepto las páginas filtradas o las páginas marcadas con ''~~EXTRANET~~''; 77*ef5bb1f3SLORTET * ''force_allow'' : solo se aplican las reglas de filtro, ''~~NOEXTRANET~~'' se ignora; 78*ef5bb1f3SLORTET * ''force_block'' : solo se aplican las reglas de filtro, ''~~EXTRANET~~'' se ignora. 79*ef5bb1f3SLORTET 80*ef5bb1f3SLORTET===== Ejemplos ===== 81*ef5bb1f3SLORTET 82*ef5bb1f3SLORTETDetección por IP directa: 83*ef5bb1f3SLORTET * ''request_match_key = REMOTE_ADDR'' 84*ef5bb1f3SLORTET * ''extranet_match_regex = /^10\.100\./'' 85*ef5bb1f3SLORTET 86*ef5bb1f3SLORTETDetección por cabecera de proxy: 87*ef5bb1f3SLORTET * ''request_match_key = HTTP_X_NETWORK_ZONE'' 88*ef5bb1f3SLORTET * ''extranet_match_list = extranet'' 89*ef5bb1f3SLORTET 90*ef5bb1f3SLORTETDetección por nombre del host 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*ef5bb1f3SLORTETCargar el helper: 97*ef5bb1f3SLORTET''$extranet = plugin_load('helper', 'extranet');'' 98*ef5bb1f3SLORTET 99*ef5bb1f3SLORTET==== Métodos principales ==== 100*ef5bb1f3SLORTET 101*ef5bb1f3SLORTET^ Método ^ Desde ^ Descripción ^ 102*ef5bb1f3SLORTET| ''getDefaultPolicy()'' | ''2026-03-13'' | Devuelve la política predeterminada efectiva. | 103*ef5bb1f3SLORTET| ''getRequestMatchKey()'' | ''2026-03-13'' | Devuelve la clave ''$_SERVER'' usada para la detección. | 104*ef5bb1f3SLORTET| ''getExtranetMatchList()'' | ''2026-03-13'' | Devuelve la lista de valores tratados como extranet. | 105*ef5bb1f3SLORTET| ''getExtranetMatchRegex()'' | ''2026-03-13'' | Devuelve la regex de detección de extranet. | 106*ef5bb1f3SLORTET| ''isExtranetRequest()'' | ''2026-03-13'' | Indica si la solicitud actual se trata como extranet. | 107*ef5bb1f3SLORTET| ''isPageVisibleFromExtranet($id, $content = null)'' | ''2026-03-13'' | Indica si una página es visible desde la extranet. | 108*ef5bb1f3SLORTET| ''isMediaVisibleFromExtranet($mediaID)'' | ''2026-03-13'' | Indica si un archivo multimedia es visible desde la extranet. | 109*ef5bb1f3SLORTET| ''isPageAllowed($id, $content = null)'' | ''2026-03-13'' | Indica si una página está permitida en el contexto actual. | 110*ef5bb1f3SLORTET| ''isMediaAllowed($mediaID)'' | ''2026-03-13'' | Indica si un archivo multimedia está permitido en el contexto actual. | 111*ef5bb1f3SLORTET| ''parseRuleList($raw)'' | ''2026-03-13'' | Convierte una configuración de reglas en un array utilizable. | 112*ef5bb1f3SLORTET| ''idMatchesRule($id, $rule)'' | ''2026-03-13'' | Comprueba un ID frente a una regla exacta, espacio de nombres, comodín o regex. | 113*ef5bb1f3SLORTET 114*ef5bb1f3SLORTET===== Funcionamiento ===== 115*ef5bb1f3SLORTET 116*ef5bb1f3SLORTETLa detección de extranet se basa en un valor leído desde ''$_SERVER'': 117*ef5bb1f3SLORTET * se prueba el valor bruto completo; 118*ef5bb1f3SLORTET * si contiene comas, también se prueba cada elemento por separado. 119*ef5bb1f3SLORTET 120*ef5bb1f3SLORTETEsto permite cubrir: 121*ef5bb1f3SLORTET * una IP directa; 122*ef5bb1f3SLORTET * una cabecera del tipo ''X-Forwarded-For''; 123*ef5bb1f3SLORTET * un marcador de red inyectado por un proxy; 124*ef5bb1f3SLORTET * un nombre de host upstream o frontend. 125*ef5bb1f3SLORTET 126*ef5bb1f3SLORTETCuando una página está restringida: 127*ef5bb1f3SLORTET * la caché se separa entre intranet y extranet; 128*ef5bb1f3SLORTET * el contenido wiki se sustituye por un mensaje configurable; 129*ef5bb1f3SLORTET * el primer encabezado puede conservarse si ''preserve_first_title'' está activado. 130*ef5bb1f3SLORTET 131*ef5bb1f3SLORTETCuando un archivo multimedia está restringido y ''hide_files'' no es ''none'', el plugin devuelve una imagen dedicada en lugar del archivo real. 132*ef5bb1f3SLORTET 133*ef5bb1f3SLORTET===== Notas ===== 134*ef5bb1f3SLORTET 135*ef5bb1f3SLORTET * El plugin no debe considerarse un sustituto de las ACL. 136*ef5bb1f3SLORTET * La fiabilidad depende del marcador de solicitud proporcionado por la infraestructura web. Una cabecera no fiable o falsificable hace que la detección sea insegura. 137