Gruppe einrichten, welche Templates bearbeiten kann
ist eigentlich ein fehler im
include.tpl.overview.php
da steht nur
Code: Alles auswählen
if ( $perm->have_perm_item($area, $db->f("idtpl")) ) { //idarea of area tpl is 12
und leider nicht ob das recht unter bereiche vorhanden ist...
eigentlich sollte der code so aussehen (4.4.4)
für die 4.4.4
Code: Alles auswählen
if ( $perm->have_perm_item($area, $db->f("idtpl")) ||
$perm->have_perm_area_action("tpl" , "tpl_delete") ||
$perm->have_perm_area_action("tpl" , "tpl_duplicate") ||
$perm->have_perm_area_action("tpl_edit" , "tpl_edit") ||
$perm->have_perm_area_action("tpl_edit" , "tpl_new")
) {
Code: Alles auswählen
if ( $perm->have_perm_item($area, $db->f("idtpl")) ||
$perm->have_perm_area_action("tpl" , "tpl_delete") ||
$perm->have_perm_area_action("tpl" , "tpl_duplicate") ||
$perm->have_perm_area_action("tpl_edit" , "tpl_edit") ||
$perm->have_perm_area_action("tpl_edit" , "tpl_new") ||
$perm->have_perm_area_action("tpl_visual" , "tpl_visedit")
) {
$perm->have_perm_area_action("tpl_edit" , "tpl_new")
wirklich gebraucht wird ist ne andere sache... wenn er das globale recht hat ein template zu erstellen würde er auch alle templates sehen...
classes/class.backend.php
Code: Alles auswählen
if ($perm->have_perm_area_action_item($area, $db->f("name"), $idcat) || $perm->have_perm_area_action($area, $db->f("name"))) {
$this->actions[$area][$db->f('name')] = $db->f('code');
}
die $idtpl etc fallen da durch den rost...
im endeffekt ist es nun so das wenn der user ein recht direkt beim item hat und sonst nirgends die action nicht ausgeführt wird...
nun gut bei der function select einfach nach der global definition folgendes ergänzen:
Code: Alles auswählen
global $idcat, $idtpl, $idmod, $idlay;
if (isset($idcat)) {
$itemid = $idcat;
} elseif (isset($idtpl)) {
$itemid = $idtpl;
} elseif (isset($idmod)) {
$itemid = $idmod;
} elseif (isset($idlay)) {
$itemid = $idlay;
} else {
$itemid = 0;
}
Code: Alles auswählen
if ($perm->have_perm_area_action_item($area, $db->f("name"), $idcat) || $perm->have_perm_area_action($area, $db->f("name"))) {
Code: Alles auswählen
if ($perm->have_perm_area_action_item($area, $db->f("name"), $itemid) || $perm->have_perm_area_action($area, $db->f("name"))) {
das ist natürlich keine saubere lösung, aber was besseres fällt mir momentan nicht ein...
-> http://contenido.de/forum/viewtopic.php ... light=perm
die erklärung am anfang wie der array aussieht ist falsch...
wäre an sich...
Code: Alles auswählen
/* the right_list array:
[client] => Array => parent area
(
[client] => Array => area name
(
[perm] => client => areaname = permission
[location] => navigation/administration/clients => location for the name in the languagefile only for the main areaid
[action] => Array
(
[0] => client_delete => actionnames
)
)
[client_edit] => Array => area name
(
[perm] => client_edit
[location] =>
[action] => Array
(
[0] => client_edit
[1] => client_new
)
)
)
*/
für rights.inc.php
Code: Alles auswählen
function saverights() {
global $rights_list, $rights_list_old, $db;
global $cfg, $userid, $rights_client, $rights_lang;
global $perm, $sess, $notification;
//if no checkbox is checked
if (!is_array($rights_list)) {
$rights_list = array ();
}
/*
echo "<pre>old:";
print_r($rights_list_old);
echo "new:";
print_r($rights_list);
echo "</pre>";
*/
//search all checks which are not in the new Rights_list for deleting
$arraydel = array_diff(array_keys($rights_list_old), array_keys($rights_list));
//search all checks which are not in the Rights_list_old for saving
$arraysave = array_diff(array_keys($rights_list), array_keys($rights_list_old));
if (is_array($arraydel)) {
foreach ($arraydel as $value) {
$data = explode("|", $value);
$data[0] = $perm->getIDForArea($data[0]);
$data[1] = $perm->getIDForAction($data[1]);
$sql = "DELETE FROM ".$cfg["tab"]["rights"]." WHERE user_id='$userid' AND idclient='$rights_client' AND idlang='$rights_lang' AND idarea='$data[0]' AND idcat='$data[2]' AND idaction='$data[1]' AND type=0";
$db->query($sql);
//echo $sql."<br>";
}
}
unset($data);
//search for all mentioned checkboxes
if (is_array($arraysave)) {
foreach ($arraysave as $value) {
//explodes the key it consits areait+actionid+itemid
$data = explode("|", $value);
// Since areas are stored in a numeric form in the rights table, we have
// to convert them from strings into numbers
$data[0] = $perm->getIDForArea($data[0]);
$data[1] = $perm->getIDForAction($data[1]);
if (!isset ($data[1])) {
$data[1] = 0;
}
// Insert new right
$sql = "INSERT INTO ".$cfg["tab"]["rights"]."
(idright, user_id,idarea,idaction,idcat,idclient,idlang,type)
VALUES ('".$db->nextid($cfg["tab"]["rights"])."', '$userid','$data[0]','$data[1]','$data[2]','$rights_client','$rights_lang',0)";
$db->query($sql);
//echo $sql."<br>";
}
}
$rights_list_old = $rights_list;
$notification->displayNotification("info", i18n("Changes saved"));
}
Code: Alles auswählen
function saverights() {
global $rights_list, $rights_list_old, $db;
global $cfg, $groupid, $rights_client, $rights_lang;
global $perm, $sess, $notification;
//if no checkbox is checked
if (!is_array($rights_list)) {
$rights_list = array ();
}
/*
echo "<pre>old:";
print_r($rights_list_old);
echo "new:";
print_r($rights_list);
echo "</pre>";
*/
//search all checks which are not in the new Rights_list for deleting
$arraydel = array_diff(array_keys($rights_list_old), array_keys($rights_list));
//search all checks which are not in the Rights_list_old for saving
$arraysave = array_diff(array_keys($rights_list), array_keys($rights_list_old));
if (is_array($arraydel)) {
foreach ($arraydel as $value) {
$data = explode("|", $value);
$data[0] = $perm->getIDForArea($data[0]);
$data[1] = $perm->getIDForAction($data[1]);
$sql = "DELETE FROM ".$cfg["tab"]["rights"]." WHERE user_id='$groupid' AND idclient='$rights_client' AND idlang='$rights_lang' AND idarea='$data[0]' AND idcat='$data[2]' AND idaction='$data[1]' AND type=1";
$db->query($sql);
//echo $sql."<br>";
}
}
unset($data);
//search for all mentioned checkboxes
if (is_array($arraysave)) {
foreach ($arraysave as $value) {
//explodes the key it consits areait+actionid+itemid
$data = explode("|", $value);
// Since areas are stored in a numeric form in the rights table, we have
// to convert them from strings into numbers
$data[0] = $perm->getIDForArea($data[0]);
$data[1] = $perm->getIDForAction($data[1]);
if (!isset ($data[1])) {
$data[1] = 0;
}
// Insert new right
$sql = "INSERT INTO ".$cfg["tab"]["rights"]."
(idright, user_id,idarea,idaction,idcat,idclient,idlang, type)
VALUES ('".$db->nextid($cfg["tab"]["rights"])."', '$groupid','$data[0]','$data[1]','$data[2]','$rights_client','$rights_lang',1)";
$db->query($sql);
//echo $sql."<br>";
}
}
$rights_list_old = $rights_list;
$notification->displayNotification("info", i18n("Changes saved"));
}
das mit $rights_list_old das manchmal rechte gespeichert werden und manchmal nicht...
rights.area.inc.php
vor
Code: Alles auswählen
if (($perm->have_perm_area_action($area, $action)) && ($action == "user_edit")) {
saverights();
} else {
if (!$perm->have_perm_area_action($area, $action)) {
$notification->displayNotification("error", i18n("Permission denied"));
}
}
Code: Alles auswählen
//set the areas which are in use fore selecting these
$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='$userid' AND idclient='$rights_client' AND idlang='$rights_lang' AND idcat='0' AND A.idaction = C.idaction AND A.idarea = B.idarea";
$db->query($sql);
$rights_list_old = array ();
while ($db->next_record()) { //set a new rights list fore this user
$rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x";
}
Code: Alles auswählen
//If rights_list is not set or you browse from a other site make a new rights_list from this user
if(!isset($rights_list_old)||$action==""||!isset($action)){
...
}
die änderungen in der grouprights.area.inc.php sind ident... bis auf
das query:
Code: Alles auswählen
user_id='$userid'
Code: Alles auswählen
user_id='$groupid'
rights_tpl.inc.php
rights_con.inc.php
rights_lay.inc.php
rights_mod.inc.php
rights_str.inc.php
am beginn
für tpl
Code: Alles auswählen
//set the areas which are in use fore selecting these
$possible_area = "'".implode("','", $area_tree[showareas("tpl")])."'";
$sql = "SELECT A.idarea, A.idaction, A.idcat, B.name, C.name FROM ".$cfg["tab"]["rights"]." AS A, ".$cfg["tab"]["area"]." AS B, ".$cfg["tab"]["actions"]." AS C WHERE user_id='$userid' AND idclient='$rights_client' AND A.type = 0 AND idlang='$rights_lang' AND B.idarea IN ($possible_area) AND idcat!='0' AND A.idaction = C.idaction AND A.idarea = C.idarea AND A.idarea = B.idarea";
$db->query($sql);
$rights_list_old = array ();
while ($db->next_record()) { //set a new rights list fore this user
$rights_list_old[$db->f(3)."|".$db->f(4)."|".$db->f("idcat")] = "x";
}
showareas("tpl") anpassen...
der teil mit
Code: Alles auswählen
//If rights_list is not set or you browse from a other site make a new rights_list from this user
if(!isset($rights_list_old)||$action==""||!isset($action)){
...
}
der unterschied bei den grouprights_*.inc.php liegt einfach nur darin das im query
Code: Alles auswählen
user_id='$userid'
Code: Alles auswählen
user_id='$groupid'
Code: Alles auswählen
A.type = 0
Code: Alles auswählen
A.type = 1
zum debuggen ist es wirklich ne katastrophe..
ein paar anmerkungen mal allgemein dazu...
die idee die dahintersteht ist ja nicht schlecht...
sämtliche rechte die gesetzt wurden, werden via ja
$perm->load_permissions();
initialisiert... (conlib/perm.inc)
dabei werden zwei arrays generiert
einmal
$area_rights
und
$item_rights
zusätzlich gibts die nette datei classes/class.backend.php
die nun dafür verantwortlich ist das die actions ausgeführt werden falls der benutzer ein recht darauf hat...
in der class.backend gibts ja die debug funktion die ja recht auskunftsfreudig ist, aber beim debuggen der berechtigungen nicht sonderlich hilfreich ist, da nicht angezeigt wird ob das in action gespeicherte recht nun wirklich ausgeführt ist...
ich hab mir dazu folgendes in der main.php zum debuggen dazugebaut...
Code: Alles auswählen
if (isset($action) && $backend->getCode($action) != '') {
eval($backend->getCode($action));
}
Code: Alles auswählen
if (isset($action)) {
if ($backend->getCode($action) != '') {
if ($backend->debug == 1) {
echo '<pre style="font-family: verdana; font-size: 10px"><b>Executing:</b>'."\n";
echo $backend->getCode($action)."\n";
echo '</pre>';
}
eval($backend->getCode($action));
} else {
if ($backend->debug == 1) {
echo '<pre style="font-family: verdana; font-size: 10px"><b>Executing:</b>'."\n";
echo "no code available in action\n";
echo '</pre>';
}
}
}
sagen wir mal der benutzer hat das recht auf den bereich template
und bei einem template selbst das recht ein template zu erstellen...
sollte man annehmen das dies funktionieren sollte... (tuts aber nicht..)
es gibt in der klasse perm keine möglichkeit herzuleiten ob bei einem x-beliebigen element ein recht gesetzt ist und die aktion dann zu erlauben...
ich hab mir jetzt in der perm.inc noch folgendes eingebaut
Code: Alles auswählen
function have_perm_area_action_anyitem($area, $action = 0) {
if ($this->have_perm_area_action($area,$action)) {
return true;
}
$area = $this->getIDForArea($area);
$action = $this->getIDForAction($action);
global $item_rights;
if (isset($item_rights[$area][$action])) {
return true;
} else {
return false;
}
}
um jetzt auf das beispiel mit tpl zurückzukommen...
bei include.tpl_edit_form.php
sollte die erste zeile wie folgt aussehen... ***
Code: Alles auswählen
if (($action == "tpl_new") && (!$perm->have_perm_area_action_anyitem($area, $action)))
weiters in functions.tpl.php
bei function tplEditTemplate
stollte am schluss
Code: Alles auswählen
//******** if layout is changed stay at 'tpl_edit' otherwise go to 'tpl'
if ($changelayout != 1) {
$url = $sess->url("main.php?area=tpl_edit&idtpl=$idtpl&frame=4");
header("location: $url");
}
return $idtpl;
sonst hebelt das den backend debug modus aus... da header nicht ausgeführt wird und $idtpl in dem fall leer wäre...
und nun zum wirklich intressanten teil in der class.backend.php
es ist zwingend erforderlich das die rechte beim erstellen eines neuen elements hergeleitet werden...
man sollte annehmen das die via tpl_new, mod_new, lay_new gemacht werden sollte...
dem ist aber nicht so...
Code: Alles auswählen
# Save the action only access to
# the desired action is granted.
# If this action is relevant for rights
# check if the user has permission to
# execute this action
if ($db->f("relevant_action") == 1 && $db->f("relevant_area") == 1) {
if ($perm->have_perm_area_action_item($area, $db->f("name"), $itemid) || $perm->have_perm_area_action($area, $db->f("name"))) {
$this->actions[$area][$db->f('name')] = $db->f('code');
}
} else {
$this->actions[$area][$db->f('name')] = $db->f('code');
}
Code: Alles auswählen
# Save the action only access to
# the desired action is granted.
# If this action is relevant for rights
# check if the user has permission to
# execute this action
if ($db->f("relevant_action") == 1 && $db->f("relevant_area") == 1) {
if ($perm->have_perm_area_action_item($area, $db->f("name"), $itemid) || $perm->have_perm_area_action($area, $db->f("name"))) {
$this->actions[$area][$db->f('name')] = $db->f('code');
}
if ($itemid == 0) {
// itemid not available, since its impossible the get the correct rights out
// we only check if userrights are given for these three items on any item
if ($action=="mod_edit" || $action=="tpl_edit" || $action=="lay_edit") {
if ($perm->have_perm_area_action_anyitem($area, $db->f("name"))) {
$this->actions[$area][$db->f('name')] = $db->f('code');
}
}
}
} else {
$this->actions[$area][$db->f('name')] = $db->f('code');
}
ident zu setzen bei include.mod_edit_form.php, include.lay_edit_form.php
ich schätze mal das der einbau in den snapshot für alle änderungen ca. 2 stunden mit tests in anspruch nehmen wird...
wie auch immer:
bei der gestaltung eines neuen rechte systems müsste man wirklich alles umbauen... ich hab mir gedacht solange ich das alte nicht ganz verstanden hab bringts das nicht wirklich...
hauptproblem ist natürlich das herleiten von rechten bei den einzelnen items... wie man das wirklich elegant machen könnte ?? keine ahnung
denke aber nicht das es via generic db einfacher aufbaubar wäre...
ad. windows rechte system
gibts da irgendwo im netz ne info wie das aufgebaut ist ?
-
- Beiträge: 6284
- Registriert: Do 15. Mai 2003, 18:32
- Wohnort: Da findet ihr mich nie!
- Kontaktdaten:
Keine Ahnung, aber so grob gesprochen funktioniert das so:emergence hat geschrieben:ad. windows rechte system
gibts da irgendwo im netz ne info wie das aufgebaut ist ?
Jedes "Objekt" (also Verzeichnis oder File) hat Berechtigungen (nicht nur lesen und schreiben, sondern auch "Spezialberechtigungen" sind möglich). Weiterhin ist es recht elegant gelöst:
Möchte man von einem Objekt wissen, welche Rechte es hat, dann macht man einen Rechtsklick drauf und sieht, welche Berechtigungen für das Objekt aktiv sind und welche eingestellt wurden. Weiterhin kann man entweder explizit zulassen oder sperren, egal, was das übergeordnete Objekt für Berechtigungen hat - alles auf Benutzer- oder Gruppenbasis.
hmm... das hört sich nach einem komplett anders aufgebauten cms an...timo hat geschrieben:Jedes "Objekt" (also Verzeichnis oder File) hat Berechtigungen (nicht nur lesen und schreiben, sondern auch "Spezialberechtigungen" sind möglich). Weiterhin ist es recht elegant gelöst:
Möchte man von einem Objekt wissen, welche Rechte es hat, dann macht man einen Rechtsklick drauf und sieht, welche Berechtigungen für das Objekt aktiv sind und welche eingestellt wurden. Weiterhin kann man entweder explizit zulassen oder sperren, egal, was das übergeordnete Objekt für Berechtigungen hat - alles auf Benutzer- oder Gruppenbasis.
nein scherz bei seite...
d.h. jedes objekt das angelegt wird bekommt einen grundstock an berechtigungen...
definiert über gruppen... zb sysadmin, admin
area definition + read, write, delete, modify
auf jedes objekt ? na hurra...
wenn es da mal die berechtigungstabelle zusammenlegt kann man sich die hand schütteln...
nimmt man das system wie im alten rechten system her als super user landet man fast wieder beim selben schlamassel...
ich kann mir das momentan noch nicht einfacher vorstellen... ich meine jetzt umsetzungstechnisch...
andere variation: die berechtigungen mit den funktionen zu koppeln...
aber ist auch immens kompliziert , da land ich beim action prinzip... egal...
aber eines ist klar, es muss ne vereinfachung vom system her...
gibt eigentlich schon mehr als die idee, dass es wie das windows berechtigungssystem funktionieren sollte ? eventuell den ansatz eines schriftlichen konzepts ? wenn nein sollten wir eines erstellen...
ich mach mal nen thread in development auf...
-> http://www.contenido.de/forum/viewtopic ... 8491#28491
Warning: Invalid argument supplied for foreach() in /var/www/contenido-4.4.4/conlib/perm.inc on line 426
Ich hatte gestern ein sehr sehr komisches Verhalten entdeckt, kann es aber heute nicht reproduzieren. Melde mich wenn es noch mal auftaucht. Er hat mir nämlich alle Rechte der area gelöscht nachdem ich die Rechte für einzelne Templates gesetzt hatte. Aber wie gesagt, kann das Verhalten heute nicht mehr reproduzieren.
gut...makemyday hat geschrieben:Ich hab auch noch mal ein bißchen rumgetestet. Totz diesem Fehler, den ich pro Template 1x im linken Fenster der Templatebearbeitung bekomme, funktioniert alles:
Code: Alles auswählen
Warning: Invalid argument supplied for foreach() in /var/www/contenido-4.4.4/conlib/perm.inc on line 426
poste mal die klassen funktion die es betrifft...
und zwar ist das Array $area_tree['tpl'] leer obwohl ich dem User alle Template Rechte in der Area zugewiesen habe. Wo $area_tree zusammengaut wird konnte ich auf die schnelle nicht nachvollziehen.
Bevor Du Dir aber über diesem Fehler zu viele Gedanken machst sollten wir versuchen den Fehler auf einem anderen System zu reproduzieren. Der Fehler tritt bei mir bei einem "Nicht-Admin-User" auf, unabhängig davon, ob die Rechte über die Gruppe oder die Benutzerebene vergeben wurden.