Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > Gruppierte Rechteverwaltung mittels PHP und MySQL
Antwort
 
Themen-Optionen
Alt 12.10.2006, 11:01   Nach oben    #1
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard Gruppierte Rechteverwaltung mittels PHP und MySQL

Tag,
da ich nun bald bei meinem Projekt an eine Stelle komme, an dem ich eine Rechteverwaltung brauch, wollte ich hier mal fragen, wie ich dies am besten löse.
Folgende Aufgabenstellung hab ich mir gegeben:

Von Anfang an wird es 4 Gruppen geben:
  1. Gast
  2. User
  3. Moderator
  4. Administartor
Jedem dieser Gruppen dürfen nun Rechte für bestimmte Aktionen zugewiesen werden, wie z.B. eine private Nachricht schreiben, einen Raum zu moderieren, im Foren-Modul bestimmte Aktionen durchzuführen (wie z.B. einen Beitrag verschieben / zusammenzuführen), etc..
Simple abfragen wie isAllowedTo('moderate_forum') oder so wären an sich schon möglich, aber ich nehme mal an, dass es noch bessere Möglichkeiten gibt, deshalb frage ich auch erstmal nach, bevor ich mich durch ettliche bereits fertige Systeme schlage und mir dort etwas zusammensuche.

Mal ein Einwand, der auch gerne komplett gestrichen werden kann, wenn er Schwachfug ist:
Gibt es nicht auch irgendwie eine Möglichkeit, das "bitweise" zu berechnen? Ich habe mal über einen Artikel drübergeflogen (ist leider schon länger her), in dem die Rechte irgendwie mit dem & Operator geprüft wurden, und auch in einer anderen Art und Weise in der MySQL Datenbank abgelegt wurden (nicht mit dem Flag 0 und 1 sondern 0001001, was dann eben bestimmte Rechte bedeutet hatte) .. ? Den Artikel hab ich nicht mehr, sonst hätte ich da ja nachlesen können.

Vielen Dank für die Antworten im Vorraus ..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2006, 11:37   Nach oben    #2
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

Ich bevorzuge dynamische Rechtevergaben, sprich:
Du hast eine Verknüpfungstabelle, die deine definierten Rechte-IDs mit den User-IDs verknüpft. Existiert also die Verknüpfung, dann darf er das auch. Existiert sie nicht, darf er es nicht.
Damit hast du jederzeit die Möglichkeit, deine Rechte zu erweitern, ohne, wie bei der "bitweisen" Methode, beim Erstellen eines neuen Rechts die alten Rechte"bits" um eine Stelle zu erweitern.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2006, 12:12   Nach oben    #3
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Damit hast du jederzeit die Möglichkeit, deine Rechte zu erweitern, ohne, wie bei der "bitweisen" Methode, beim Erstellen eines neuen Rechts die alten Rechte"bits" um eine Stelle zu erweitern.
Hm das klingt einleuchtend, ja.
Nun, wie sehen denn dann die Rechte-IDs aus? Ist jedem Recht (z.B. threads zusammenführen, bearbeiten) .. eine unique Rechte-ID zugewiesen?
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2006, 12:55   Nach oben    #4
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

Die Tabelle für die Rechte würden aus ID (Primary Key) und Name bestehen, wobei auch der Name fürs bessere Programmieren Unique sein sollte. Sprich du cached die Rechte in der Session und fragst dann nur, ob $_SESSION['rights']['rechtename'] existiert und kannst damit verständlicher arbeiten als dauernd in der Doku nachschauen zu müssen, welche Nummer welches Recht darstellt.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2006, 20:02   Nach oben    #5
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Hi.

Ich benutze gerade Controller mit mehreren Action-Methoden. Jeder solchen Methode kann eine eigene Methode beigeügt werden, die, falls sie eben vorhenden ist, die Rechte prüft und true oder false zurückgibt. Das passt für sehr spezielle Anforderungen allemal, gibt aber sicher universellere Möglichkeiten. Dass man z.B. in der DAtenbank für jedes Modul bestimmte Aktionen anlegt und diese den Benutzern/Gruppen etc. zuornet.

Aber so wirklich durchgestiegen bin ich da auch noch nicht. Oft sieht es ja so aus, dass, z.B. zum Ändern eines Objektes einmal der Besitzer das Recht hat, dann der Redakteur, der sich dessen angenommen hat und dann der Admin. Hab noch nicht raus, wei sich das einheitlich beschreiben ließe - daher eben auch die Methoden, in denen "manuell" geprüft wird, wem das Objekt gehört und welche Rollen der Benutzer in welchen Gruppen hat.

Das Manual von phpGACL ist auch kein schlechter Einstieg (zumindest, wenn du auf Star Wars stehst).

Basti

PS@"WarrenFaith":
Meine PM nicht bekommen?
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2006, 21:07   Nach oben    #6
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von WarrenFaith
Die Tabelle für die Rechte würden aus ID (Primary Key) und Name bestehen, wobei auch der Name fürs bessere Programmieren Unique sein sollte. Sprich du cached die Rechte in der Session und fragst dann nur, ob $_SESSION['rights']['rechtename'] existiert und kannst damit verständlicher arbeiten als dauernd in der Doku nachschauen zu müssen, welche Nummer welches Recht darstellt.
Ja okay, so in der Richtung hatte ich mir auch was gedacht.

Zitat:
Zitat von Basti
Ich benutze gerade Controller mit mehreren Action-Methoden. Jeder solchen Methode kann eine eigene Methode beigeügt werden, die, falls sie eben vorhenden ist, die Rechte prüft und true oder false zurückgibt.
So habe ich es auch. Je nach aufgerufener URL wird das dazugehörige Modul mittels dem Controller aufgerufen. Somit könnte ich auch solch eine Rechteverwaltung machen. Das Prinzip von phpGACL klingt interessant, auch, wenn ich nicht so der Star Wars Fan bin ..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.10.2006, 20:31   Nach oben    #7
Semantic Web Fanatic
 
Benutzerbild von Artemis
 
Registriert seit: 03.06.2006
Beiträge: 237
Standard

Zitat:
Zitat von WarrenFaith Beitrag anzeigen
Du hast eine Verknüpfungstabelle, die deine definierten Rechte-IDs mit den User-IDs verknüpft.
Ich sitze auch an so einem Problem, und deshalb frage ich mich folgendes:

Wie Verknüpfe ich denn die Rechte mit dem User am besten?

Bisher ist meine Überlegung so:
Code:
table "rights"

id | name
---+-------------------
 1 | "create_root_node"
 2 | "edit_root_node"
 3 | "delete_root_node"
Der Benutzer sieht vereinfacht so aus, dass die IDs von Rechten in einem String sind:
Code:
table "users"

id | rights
---+--------
 1 | "1,2"
 2 | "1"
 3 | "1,2,3"
Kann man das effizienter lösen? Oder ist die Idee mit dem String völlig Banane?
__________________
Applikations-Programmierung:
BlitzMax, BlitzPlus

Webentwicklung:
PHP, (X)HTML, CSS, JavaScript, MySQL


Artemis ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.10.2006, 20:51   Nach oben    #8
Blubb... öfz
 
Benutzerbild von ljungi
 
Registriert seit: 16.03.2006
Ort: Berlin
Beiträge: 419
Standard

Warum extra in einen String packen?

einfach 1,2,3,4,5
oder 1|2|3|4|5
oder sonst ein Seperator.

Kannst mit Explode dann gaaaaaaaaanz einfach trennen
__________________
Vive la France! Welcome to Sarkoworld...
ljungi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.10.2006, 20:55   Nach oben    #9
Semantic Web Fanatic
 
Benutzerbild von Artemis
 
Registriert seit: 03.06.2006
Beiträge: 237
Standard

Genau das was du vorschlägst habe ich doch bisher - die Rechte-IDs mit einem Komma getrennt. Oder versteh ich dich nicht?

Was ich mit der Frage (Oder ist die Idee mit dem String völlig Banane?) meinte ist, ob es für so etwas einen besseren MySQL-Datentyp, oder Ansatz gibt.
__________________
Applikations-Programmierung:
BlitzMax, BlitzPlus

Webentwicklung:
PHP, (X)HTML, CSS, JavaScript, MySQL


Artemis ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.10.2006, 21:17   Nach oben    #10
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard

Es gibt einen MySQL-Datenformat, welches mehrere Zustände in einem Datensatz unterstützt, allerdings müsstest du zur Erweiterung die Struktur der Tabelle dazu ändern.

Abgesehen davon wollte ich mal darauf hinweisen, dass die Art und Weise, in dieser Form die Daten in eine Datenbank zu speichern nicht den Normalformen entspricht, die da besagt, dass keine multiplen Daten in einem einzelnen Feld gespeichert werden sollen. Vielmehr würde es mehr Sinn machen, eine extra Tabelle anzulegen, in der die einzelnen Werte gespeichert werden.
So wurde es ja auch von Warren gemeint.

Aussehen wird es dann wie folgt:

Code:
table "user"

id | name
---+--------
 1 | "User1"
 2 | "User2"
 3 | "User3"


table "rights"

id | name
---+--------
 1 | "Right1"
 2 | "Right2"
 3 | "Right3"


table "user_rights"

user_id | right_id
---+--------
 1 | 3
 2 | 1
 3 | 2
Im obigen Beispiel wären folgende Verknüpfungen aus der DB ersichtlich: User1 <-> Right3, User2 <-> Right1 und User3 <-> Right2.
Um nun alle Rechte der User2 auslesen zu können, benötigt man nun lediglich die ID des Benutzers (in diesem Beispiel die 2

Code:
SELECT `r`.`name` FROM `user_rights` AS `ur` LEFT OUTER JOIN `rights` AS `r` ON `r`.`id`=`ur`.`right_id` WHERE `ur`.`user_id`='2'
Damit erhält man dann eine Liste mit allen Rechte-Namen, die dem Benutzer mit der ID 2 (User2) zugewiesen sind.

Ich hoffe ich konnte ein wenig Licht ins Dunkle bringen!?
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.10.2006, 21:19   Nach oben    #11
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Jou, das klingt ja irgendwie logisch, ne? Und wirkt auch irgendwie recht .. sagen wir mal .. simpel.
Danke.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.10.2006, 22:11   Nach oben    #12
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Kommt halt daruf an, was man vorhat. Wie in dem phpGACL-Tutorial schön beschrieben, kmmt man halt nicht besonders weit, wenn man einfach nur Rechte und Benutzer hat. Das geht bei ein paar Benutzern ganz gut, wird aber schnell nicht mehr verwaltbar. Mir taugt da folgendes System:

Es gibt unterschiedliche Gruppentypen. Für jeden Gruppentyp können verschiedene Rollen definiert werden. Jede Gruppe ist von genau einem Gruppentyp und ein Benutzer kann nun eben in allen möglichen Gruppen in die Rolen schlüpfen, die durch den Gruppentypen vorgegeben sind. Damit kan ich eben sagen, dass an der Stelle nur Administratoren der Besitzer-Gruppe einer Seite oder Moderatoren und Administratoren der globalen Gruppe eine neue Unterseite einfügen dürfen etc.

Das ließe sich nur mit Benutzern nicht handeln!

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.10.2006, 22:32   Nach oben    #13
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

MrNiceGuy hat also mein Post gut dargestellt. Nur als Zusatz: Wenn ein User mehrere Rechte hat, dann werden die nicht zusammen in einen String geschrieben sondern ein neuer Eintrag erzeugt.
Code:
table "user_rights"

user_id | right_id
---+--------
 1 | 3
 2 | 1
 3 | 2
 3 | 1
Allerdings sollte man keine Tabelle ohne ID (Primärschlüssel) machen, von daher noch eine Spalte ID und dann ists richtig.
Das gleiche geht mit den Gruppen.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.10.2006, 06:23   Nach oben    #14
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard

@Basti: Natürlich kommt es darauf an, was man machen will, deine beschriebene Methode ist ja auch lediglich eine erweiterte Darstellung von dem System, was Warren "prädigte" und ich nochmal in einem kleinen Beispiel darstellte, das Prinzip ist jedoch das Gleiche.
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.10.2006, 09:19   Nach oben    #15
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Jein. Das Ding ist halt, dass du bei einem Mapping Benutzer <-> Recht eine einfache Verknüfpung hast, in der keine Konflikte auftreten (höchstens durch die Art, welche Rechte es gibt selbst). Wenn du nun mit Gruppen hantierst kann das auch kein Problem sein, wenn du die Rechte einfach nur "addierst". Kann aber auch darauf rauslaufen, dass es nicht reicht, einfach nur zu definieren: Die Gruppe oder die Rolle hat dieses Recht: ja oder nein.

Und, was spricht gagegen, eine gute Darstellung zu erweitern?

Und, welches Prinzip meinst du? Wie man eine n:m-Relation abbildet? Jo, da gibts nicht viel Spielraum. *g

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.10.2006, 09:29   Nach oben    #16
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

Wir haben uns im Beispiel nur auf Nutzer - Rechte bezogen, das stimmt. Allerdings ist eine Erweiterung auf Gruppen leicht erweiterbar.
Letzten endes meinem wir drei das gleiche, nur kommen aus einer anderen Richtung auf das Thema zu.

Zusammenfassend kann man das Beispiel von MrNiceGuy um Gruppen erweitern, wenn man will kann man sogar Rollen dazu definieren (um z.B bei 300 Rechten leichter einen Moderator alle notwendigen Rechte per Rolle zu geben und nicht jede der 300 Rechte per Hand definieren muss).
Das ist letzten endes aber nur eine Umsetzung auf SQL/PHP Basis die erfolgen muss. Die Logik dahinter sollte klar sein.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.10.2006, 10:43   Nach oben    #17
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Wie gesagt: Wenn du nur Benutzer auf Rechte abbildest, dann gibt es keine Konflikte, die du lösen musst. Wenn ein Benutzer aber in zwei Gruppen ist und die eine Gruppe hat das Recht Aktion A durchführen, die andere nicht, dann gibt es einen Konflikt, der bei dieser Erweiterung neu ist und der gelöst werden muss. Im einfachsten Fall kannst du definieren: Wenn ein Benutzer in mindestens einer Gruppe ist, die das Recht hat, Aktion A durchzuführen, dann darf er diese durchführen, auch wenn er ev. in anderen Gruppen ist, die keine Erlaubnis haben, das zu tun.

Damit kommt man ja auch schon sehr weit. Aber man muss den Konflikt eben sehen und sich für eine Lösung entscheiden.

Bei den hier vorgestellten vier Gruppen fällt eine Entscheidung nicht schwer, da diese wahrscheinlich hierarchisch angelegt sind, so dass die jeweilige Gruppe "drüber" einfach nur Rechte dazu bekommt.

Was ich sagen wollte:
Das ist keine "lineare" Erweiterung (das wäre der Fall, wenn man prüfen wolle, ob eine Gruppe ein Recht hat - man fragt in der Regel aber, ob der Benutzer, der in mehreren Gruppen sein kann, ein Recht hat), sondern bringt einen neunen Aspekt mit sich.

Ist aber - glaube ich - jetzt auch genug zerkaut... *g

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.10.2006, 11:02   Nach oben    #18
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

Zitat:
Zitat von Basti Beitrag anzeigen
Was ich sagen wollte:
Das ist keine "lineare" Erweiterung (das wäre der Fall, wenn man prüfen wolle, ob eine Gruppe ein Recht hat - man fragt in der Regel aber, ob der Benutzer, der in mehreren Gruppen sein kann, ein Recht hat), sondern bringt einen neunen Aspekt mit sich.
Da möchte ich gerne wiedersprechen, denn letztlich ist genau das eine einzige SQL Abfrage. Letzlich wichtig ist die von die genannte Entscheidung, ob bei mehreren Gruppen es reicht, wenn eine das Recht hat. Dazu müsste man dann vielleicht Gültigkeiten für einzelne Rechte aufweisen. So z.b. darf ein Mod ja nicht überall moderieren, sondern nur dort, wo er den Posten bekleidet. Dafür bräuchte man definitiv eine Einschränkung der Rechte.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.10.2006, 14:06   Nach oben    #19
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Zitat:
Zitat von WarrenFaith Beitrag anzeigen
So z.b. darf ein Mod ja nicht überall moderieren, sondern nur dort, wo er den Posten bekleidet. Dafür bräuchte man definitiv eine Einschränkung der Rechte.
Ich glaube, es wäre ungeschickt bzw. schwer wartbar, hier einzeln Rechte zu definieren. Sinniger wäre es, die Rechte von den Relationen zwischen z.B. dem Beitrag, den es zu editieren gilt, dem Forum, in dem er liegt und der Rolle, die der Benutzer am Forum hat abzuleiten. Also nicht zu sagen: Okay, nun, da er Moderator ist, darf Paul Beiträge in Forum x editieren, sondern zwei Definitionen beizubehalten: "Paul ist jetzt Moderator des Forum x" und "alle Moderatoren dürfen Beiträge in ihren Foren editieren". Das wäre natürlich.

Konkret:

* Jedes Forum kann 0-n Moderatoren haben.
* Jeder Benutzer kann Moderator in 0-n Fore sein.
* Jeder Moderator eines Forums hat das Recht, Beiträge darin zu editieren.

* Ferner darf jeder Benutzer seine eigenen Beiräge edtieren.

Hat also der Benutzer das Recht, einen Beitrag zu editeren?

Ja, wenn er entweder der Autor des Beitrags ist, oder wenn er ein Moderator des Forums ist, in dem der Beitrag geschrieben wurde.


Auf diese Weise kannst du auch pauschal die Rechte aller Moderatoren verändern. Wie das allerdings geschickt "pauschal" abgebildet werden kann, weiß ich (noch) nicht. Ich mach die Anfragen wie geschieben eben immernoch von Hand:

PHP-Code:
class Mod_Forum_Action_EditThread extends Mod_Forum_Action
{
    protected 
$Thread null;

    public function 
__construct()
    {
        
$sThreadId $this->Request->get('thread');
        
$this->Thread $this->Persistance->getManager('Thread')->get($sThreadId);
    }

    public function 
isValidRequest()
    {
        return 
is_a($this->Thead'IThread');
    }

    public function 
hasRights()
    {
        if (
$this->Session->User === $this->Thread->getAuthor())
            return 
true;

       return 
$this->Thread->getForum()->getModerators()->contains($this->Session->User);
    }

    public function 
execute()
    {
        
//...
    
}

...oder so ähnlich halt (ein Mod_Forum gibts noch nicht *g).

Basti

Geändert von Basti (18.10.2006 um 14:19 Uhr).
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen