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