Fehler in User::hasMembership

Hast du einen Fehler in der aktuellen Version gefunden ? Diesen kannst du uns hier mitteilen und uns bei der Fehlersuche helfen.
Antworten
mampfes
Beiträge: 4
Registriert: 7. Mai 2008, 12:46

Fehler in User::hasMembership

Beitrag von mampfes »

hasMembership liefert true zurueck sobald es einen Eintrag im Array roles_membership gefunden hat. Leider stehen in dem Array alle Rollen drin (auch die in denen der User nicht Mitglied ist) und erst der Wert des Eintrages gibt an ob der User Mitglied der Rolle ist oder nicht. Deshalb fehlt hier offensichtlich noch ein Check ala '&& $this->roles_membership[$rol_id] > 0'.

Gruessle

mampfes
Benutzeravatar
fasse
Administrator
Beiträge: 6228
Registriert: 12. Nov 2005, 16:06

Beitrag von fasse »

Hallo mampfes,

in roles_membership stehen nur die Rollen drin, denen der User auch zugeordnet ist. Dies sieht man im entsprechenden SQL-Statement. Dort wird auf mem_valid = 1 geprüft.

Gruß
Fasse
mampfes
Beiträge: 4
Registriert: 7. Mai 2008, 12:46

Beitrag von mampfes »

Hallo fasse,

ich glaube Du hast da was verwechselt: mem_valid gibt an ob ein User noch Mitglied eines Vereins ist oder bereits zu den Ehemaligen gehoert. Mit den Rollen hat das nicht's zu tun.
Ungluecklicherweise liegt durch die Namensgebung von 'hasMembership' die Vermutung nahe dass die Funktion true zurueckliefert falls ein User noch Mitglied ist. Die Dokumentation zu 'hasMembership' (und natuerlich auch die Funktionsparameter) zeigen aber eindeutig dass die Funktion Mitgliedschaften in Rollen bewertet.

Gruessle

mampfes
Benutzeravatar
fasse
Administrator
Beiträge: 6228
Registriert: 12. Nov 2005, 16:06

Beitrag von fasse »

Natürlich hat das was mit den Rollen zu tun. In dem ich nur Rollen in das Array aufnehme, bei denen der Benutzer Mitglied ist, ist die Rückgabe der Funktion hasMembership auch richtig, wenn sie einfach nur schaut, ob die Rolle in dem Array existiert. Rollen bei denen der User kein Mitglied ist, sind auch nciht in dem Array.

An welcher Stelle führt diese Funktion denn zu Problemen ?
Wir benutzen sie ja auch intern.
mampfes
Beiträge: 4
Registriert: 7. Mai 2008, 12:46

Beitrag von mampfes »

Hi fasse,

sorry aber ich glaube hier herrscht immer noch ein Missverstaendnis, deshalb fange ich nochmal von vorne an:

Die Klasse User (in der Datei user_class.php) baut mit Hilfe der Funktion 'checkRolesRight' ein Array der Rollen in 'roles_membership' auf. Das verwendete SQL Statement ('SELECT * FROM adm_categories, adm_roles LEFT JOIN adm_members ON mem_usr_id = ". $this->db_fields['usr_id']. " AND mem_rol_id = rol_id AND mem_valid = 1 ...') beinhaltet ein LEFT JOIN und damit ALLE Zeilen der Tabelle adm_roles (sofern sie nicht durch das WHERE Statement ausgeschlossen wurden), also auch die Rollen in denen ein valides Mitglied (mem_valid=1) NICHT Mitglied ist.
Im folgenden Code werden diese Zeilen aus der Tabelle adm_roles nicht ausgeschlossen sondern ebenfalls in das Array roles_membership aufgenommen und mit dem Wert 0 belegt (Zeile 478).

Die Funktion 'hasMembership' prueft lediglich ob es einen Eintrag fuer die Rolle im Array 'roles_membership' einen Eintrag gibt und gibt dadurch auch true zurueck falls der User kein Mitglied der Rolle ist.

Ich bin auf das Problem aufmerksam geworden, da ich eine kleine Erweiterung fuer Admidio schreiben wollte und deshalb die Funktion 'hasMembership' benutzen moechte.

Uebrigens: 'hasMembership' wird in Admidio nirgends verwendet (zumindest nicht in den core Sourcen, die Plugins habe ich nicht untersucht). Ausserdem scheint das von mir geschilderte Problem auch an anderer Stelle schon mal aufgefallen zu sein (user_class.php, Zeile 668):

Code: Alles auswählen

if(array_key_exists($rol_id, $this->roles_membership)
            && $this->roles_membership[$rol_id] > 0)
Gruessle

mampfes
Benutzeravatar
fasse
Administrator
Beiträge: 6228
Registriert: 12. Nov 2005, 16:06

Beitrag von fasse »

Hallo Mampfes,

ich glaube ich werde alt. Du hast natürlich vollkommen Recht. Die Funktion arbeitet nicht richtig. Allerdings scheint hier einiges durcheinander geraten zu sein, da auch das Array nicht das enthält, was der Name verspricht. Im Array stehen auch nur die Rollen mit 1 drin, die man sehen darf.

Ich werde da mal aufräumen und die Funktion hasMembership auch entfernen. Hier kann man für eigene Anpassungen dann hasRole() benutzen.
mampfes
Beiträge: 4
Registriert: 7. Mai 2008, 12:46

Beitrag von mampfes »

OK! Vielen Dank fuer die Info. Bin gespannt auf die naechste Version.

Gruessle

mampfes
Antworten