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
Fehler in User::hasMembership
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
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
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.
An welcher Stelle führt diese Funktion denn zu Problemen ?
Wir benutzen sie ja auch intern.
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):
Gruessle
mampfes
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)
mampfes
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.
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.