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