1====== Extranet Plugin ======
2
3---- plugin ----
4description: Beschränkt Seiten, Medien und Aktionen für Extranet-Besucher
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]] | ���� **Deutsch** | [[es:plugin:extranet|���� Español]]
23
24===== Installation =====
25
26Das Plugin über den [[plugin:extension|Erweiterungs-Manager]] mit der obigen URL installieren oder den Ordner nach ''lib/plugins/extranet'' kopieren.
27
28===== Beschreibung =====
29
30Das Plugin **extranet** kann:
31  * erkennen, ob eine Anfrage aus dem Extranet kommt, basierend auf einem konfigurierbaren Wert aus ''$_SERVER'';
32  * die Anzeige von Seiten und Mediendateien einschränken;
33  * ausgewählte DokuWiki-Aktionen für Extranet-Besucher deaktivieren;
34  * globale Regeln über Filter anwenden;
35  * seitenbezogene Ausnahmen mit ''~~NOEXTRANET~~'' und ''~~EXTRANET~~'' hinzufügen;
36  * sich in ProseMirror integrieren, damit diese Makros im WYSIWYG-Modus erhalten bleiben.
37
38Das Plugin eignet sich für die Trennung zwischen Intranet und Extranet. Es ergänzt ACLs, ersetzt aber keine echte Zugriffskontrolle.
39
40===== Einstellungen =====
41
42^ Name ^ Beschreibung ^ Standardwert ^
43| request_match_key | ''$_SERVER''-Schlüssel, mit dem festgestellt wird, ob die Anfrage aus dem Extranet kommt. Kann ''REMOTE_ADDR'' oder ein ''HTTP_*''-Schlüssel sein. | '''' |
44| extranet_match_list | Durch Kommas getrennte Liste von Werten, die als Extranet gelten. | '''' |
45| extranet_match_regex | Regex zur Erkennung einer Extranet-Anfrage anhand des konfigurierten Werts. | '''' |
46| default_policy | Standardrichtlinie: ''allow'', ''block'', ''force_allow'' oder ''force_block''. | ''allow'' |
47| filter_list | Liste von Seiten- oder Medien-IDs, auf die die Richtlinie angewendet wird. Unterstützt exakte IDs, Namensraum-Präfixe mit '':'', und Platzhalter ''*''. | '''' |
48| filter_regex | Zusätzliche Regex zum Ansprechen von Seiten oder Mediendateien. | '''' |
49| hide_files | Behandlung eingeschränkter Mediendateien: ''all'', ''except_pageicons'' oder ''none''. | ''none'' |
50| disable_actions | DokuWiki-Aktionen, die für Extranet-Besucher deaktiviert werden. | ''admin,edit,preview,save,revisions,diff,export_raw,export_xhtml,export_xhtmlbody,permalink,register'' |
51| restricted_disable_actions | Zusätzliche Aktionen, die nur deaktiviert werden, wenn die aktuelle Seite eingeschränkt ist. | '''' |
52| preserve_first_title | Erste Überschrift beibehalten, wenn eine Seite ausgeblendet wird. | ''true'' |
53| message_prefix | Präfix vor der Einschränkungsmeldung. | '''' |
54| message_suffix | Suffix nach der Einschränkungsmeldung. | '''' |
55
56===== Kompatibilität =====
57
58Die folgenden alten Konfigurationsschlüssel werden weiterhin akzeptiert:
59  * ''server_ip_key''
60  * ''extranet_ip_list''
61  * ''extranet_ip_regex''
62
63Bevorzugt werden sollten jedoch die neuen Namen:
64  * ''request_match_key''
65  * ''extranet_match_list''
66  * ''extranet_match_regex''
67
68===== Verwendung =====
69
70Es stehen zwei Makros zur Verfügung:
71  * ''~~NOEXTRANET~~'' : sperrt die Seite aus dem Extranet, wenn die Richtlinie dies zulässt;
72  * ''~~EXTRANET~~'' : erlaubt die Seite aus dem Extranet, wenn die Richtlinie dies zulässt.
73
74Verhalten je nach ''default_policy'':
75  * ''allow'' : alles ist erlaubt, außer gefilterten Seiten oder Seiten mit ''~~NOEXTRANET~~'';
76  * ''block'' : alles ist gesperrt, außer gefilterten Seiten oder Seiten mit ''~~EXTRANET~~'';
77  * ''force_allow'' : nur Filterregeln gelten, ''~~NOEXTRANET~~'' wird ignoriert;
78  * ''force_block'' : nur Filterregeln gelten, ''~~EXTRANET~~'' wird ignoriert.
79
80===== Beispiele =====
81
82Erkennung über direkte IP:
83  * ''request_match_key = REMOTE_ADDR''
84  * ''extranet_match_regex = /^10\.100\./''
85
86Erkennung über Proxy-Header:
87  * ''request_match_key = HTTP_X_NETWORK_ZONE''
88  * ''extranet_match_list = extranet''
89
90Erkennung über den Namen des Upstream-Hosts:
91  * ''request_match_key = HTTP_X_UPSTREAM_HOST''
92  * ''extranet_match_regex = /^frontend-ext-/''
93
94===== Helper-API =====
95
96Helper laden:
97''$extranet = plugin_load('helper', 'extranet');''
98
99==== Hauptmethoden ====
100
101^ Methode ^ Seit ^ Beschreibung ^
102| ''getDefaultPolicy()'' | ''2026-03-13'' | Gibt die effektive Standardrichtlinie zurück. |
103| ''getRequestMatchKey()'' | ''2026-03-13'' | Gibt den für die Erkennung verwendeten ''$_SERVER''-Schlüssel zurück. |
104| ''getExtranetMatchList()'' | ''2026-03-13'' | Gibt die Liste der als Extranet behandelten Werte zurück. |
105| ''getExtranetMatchRegex()'' | ''2026-03-13'' | Gibt die Extranet-Erkennungs-Regex zurück. |
106| ''isExtranetRequest()'' | ''2026-03-13'' | Prüft, ob die aktuelle Anfrage als Extranet behandelt wird. |
107| ''isPageVisibleFromExtranet($id, $content = null)'' | ''2026-03-13'' | Prüft, ob eine Seite aus dem Extranet sichtbar ist. |
108| ''isMediaVisibleFromExtranet($mediaID)'' | ''2026-03-13'' | Prüft, ob eine Mediendatei aus dem Extranet sichtbar ist. |
109| ''isPageAllowed($id, $content = null)'' | ''2026-03-13'' | Prüft, ob eine Seite im aktuellen Kontext erlaubt ist. |
110| ''isMediaAllowed($mediaID)'' | ''2026-03-13'' | Prüft, ob eine Mediendatei im aktuellen Kontext erlaubt ist. |
111| ''parseRuleList($raw)'' | ''2026-03-13'' | Wandelt eine Regelkonfiguration in ein nutzbares Array um. |
112| ''idMatchesRule($id, $rule)'' | ''2026-03-13'' | Prüft eine ID gegen eine exakte Regel, einen Namensraum, einen Platzhalter oder eine Regex. |
113
114===== Funktionsweise =====
115
116Die Extranet-Erkennung basiert auf einem aus ''$_SERVER'' gelesenen Wert:
117  * der vollständige Rohwert wird geprüft;
118  * wenn er Kommata enthält, wird auch jedes einzelne Element geprüft.
119
120Damit lassen sich abdecken:
121  * eine direkte IP;
122  * ein Header im Stil von ''X-Forwarded-For'';
123  * ein vom Proxy injizierter Netzwerk-Marker;
124  * ein Upstream- oder Frontend-Hostname.
125
126Wenn eine Seite eingeschränkt ist:
127  * wird der Cache zwischen Intranet und Extranet getrennt;
128  * wird der Wiki-Inhalt durch eine konfigurierbare Meldung ersetzt;
129  * kann die erste Überschrift erhalten bleiben, wenn ''preserve_first_title'' aktiviert ist.
130
131Wenn eine Mediendatei eingeschränkt ist und ''hide_files'' nicht ''none'' ist, liefert das Plugin ein spezielles Bild statt der echten Datei aus.
132
133===== Hinweise =====
134
135  * Das Plugin ist kein Ersatz für ACLs.
136  * Die Zuverlässigkeit hängt vom Request-Marker ab, den die Web-Infrastruktur liefert. Ein nicht vertrauenswürdiger oder fälschbarer Header macht die Erkennung unsicher.
137