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