C3MAWiki Diskussion:Zugriffsschutz

Aus C3MAWiki
Zur Navigation springenZur Suche springen

Aus unserer Todo-Liste:

  • Das Whitelist-Script verschluckt manche Namespacenamen, insbesondere Kategorie:. Das führt z.B. dazu, dass Kategorie:öffentliches Projekt nicht öffentlich lesbar ist. Das sollte ASAP behoben werden.

Nach einigem Experimentieren mit einer Mediawiki SQL-Datenbank, stellt sich das Problem mir Folgendermaßen dar:

  • Das Skript ist nicht in der Lage, die Namespace Information in die Whitelist einzutragen. Das bedeutet, dass die Seite der Kategorie Test welche eigentlich unter Kategorie:Test eingetragen werden sollte, nur als Test Eingetragen wird.
  • Der Grund dazu ist, dass für den Seitentitel in der Whitelist nur die Sortkey information aus der Tabelle categorylinks verwednet wird, welche default nur den Titel der Seite ohne Namespace angibt.


  • Ich sehe grade 2 Lösungen:
    • Der schnelle dreckige Weg: In den Sortkey mit | (Pipe) den "Richtigen" Seitentitel schreiben. Bsp.:
       [[Kategorie:öffentlich|Kategorie:Öffentliche Projekte]] 
    • Der gute Weg: den SQL Teil des Skriptes so modifizieren, dass er die Kategorie mit ausgeben kann (bei der Gelegenheit auch die Sortkeys abschalten). Die entsprechenden Informationen kann man der Tabelle page in der Spalte Namespace entnehmen.

Implementierung + Namensräume

#!/bin/sh

  1. Das Verzeichnis für die temporäre und die generierte Datei:

d=/var/www/chaostreff-mannheim.de/htdocs

  1. Name der temporären Datei

t=$d/Whitelist.tmp.php

  1. Name der generierten Datei

f=$d/Whitelist.php

  1. Name der Datei mit dem SQL Befehl

s=$d/befehl.txt

  1. Beginne PHP-Code in die temporäre Datei zu schreiben.
  2. Wir schreiben nicht in nach $f, weil sonst evtl. ein Zugriff
  3. auf das Wiki stattfinden könnte, während die Datei noch nicht
  4. fertig geschrieben ist. PHP würde einen Fehler melden.

echo '<?php $wgWhitelistRead = array ('>$t

  1. Schütze diese Datei vor fremdem Zugriff.

chown root:root $t chmod 0600 $t

  1. Passwort in Umgebungsvariable.

export MYSQL_PWD='****'

  1. Variable um zu erkennen, welcher Wert Eingelesen wird

z=1

  1. Schleife über die Ergebnisse (um die Sache Übersichtlicher zu gestallten, wurde der SQl Befehl in eine Separate Datei gelegt.)

for p in $(echo "SELECT T2.page_title, T2.page_namespace FROM categorylinks T1, page T2 WHERE T1.cl_from = T2.page_id AND T1.cl_to LIKE '__ffentlich' AND NOT EXISTS (SELECT T3.cl_from FROM categorylinks T3 WHERE T3.cl_from=T1.cl_from AND T3.cl_to LIKE '__ertraulich');" | mysql -u dbuser dbname | grep -v 'page_namespace'| tr '_' ' ' | sed "s/'/\\\\'/g"); do # If Abfrage welcher Wert eingelesen wird (Seitenname oder Namensraum) if [ $z = 1 ] ; then nname=$p; z=2; else # Zweig zur Verarbeitung der Namensraum nspace=$p; z=1; # Umsetzten der Nummer aus der Datenbank in den Titel des Namespace case $nspace in -1) nsn="Spezial";; 0) nsn="1";; 1) nsn="Diskussion";; 2) nsn="Benutzer";; 3) nsn="Benutzer_Diskussion";; 4) nsn="Projekt";; 5) nsn="Projekt_Diskussion";; 6) nsn="Datei";; 7) nsn="Datei_Diskussion";; 8) nsn="MediaWiki";; 9) nsn="MediaWiki_Diskussion";; 10) nsn="Vorlage";; 11) nsn="Vorlage_Diskussion";; 12) nsn="Hilfe";; 13) nsn="Hilfe_Diskussion";; 14) nsn="Kategorie";; 15) nsn="Kategorie_Diskussion";; esac; # Abfrage ob $nsn ungleich 1 ist (also ob Seite in einem bekannten Namensraum liegt) if [ $nsn != 1 ] ; then fert=$(echo "$nsn:$nname"); else # Code fur Haupnamensraum fert=$nname; fi # Erstellen der Fertigen Zeile echo "'$(echo "$fert" | tr '_' ' ' | sed "s/'/\\\\'/g")',">>$t fi done

  1. Noch ein paar andere Seiten verfügbar machen.

echo '"Special:Userlogin", "Spezial:Userlogin", "-", "MediaWiki:Monobook.css", "MediaWiki:Common.css" ); ?>'>>$t

  1. Wieder für alle lesbar.

chmod 0644 $t

  1. Und in einem Schlag die temporäre Datei über die bestehende schreiben.

mv $t $f

Einzutragen sind im Script der Ort des Script,der Datenbankuser, das Datenbank Passwort und und die SQL-Datenbank.

Geschrieben --Pcopfer 22:15, 14. Jan. 2010 (UTC)

Bei Fragen pcopfer (at) pcopfer.de