Gruppe einrichten, welche Templates bearbeiten kann

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 25. Nov 2004, 19:06

makemyday hat geschrieben:Ob ich jetzt zehn Usern oder zehn Gruppen unterschiedliche Rechte gebe ist doch egal oder?
wie bereits gesagt, nicht wirklich...
makemyday hat geschrieben:Nehmt das bitte nicht als neumalkluges Gelaber, sondern als eine hoffentlich hilfreiche Unterstützung für die Verbesserung von contenido.
okay unterstützung kann ich da natürlich brauchen... ;-)

ansatzpunkt ist neues template erstellen und duplizieren...

bei duplizieren sehe ich weniger ein problem da die rechte auf dieses template ja einfach nur kopiert werden müssen...
wenn unter bereiche das recht vergeben ist muss gar nichts weiters gemacht werden, da die rechte global für alle templates gelten...

das herleiten bei einem neuen template ist nun das intressantere... aber bleiben wir mal beim duplizieren...

sämtliche rechte was jetzt jemand mit einem template machen kann darf sind in der tabelle con_rights gespeichert, sowohl für die benutzer als auch für die gruppen...

bleiben wir hier mal bei den gruppen...
zuerst muss überprüft werden ob das bereichsrecht vergeben ist, falls nein
muss überprüft werden ob die gruppe ein recht auf das zu duplizierende template hat... in dem fall müsste das recht der gruppe dupliziert werden...
das würde bedeuten das alle mitglieder in dieser gruppe ab sofort auf das duplizierte template nun ebenso rechte haben...

nun weiter direkt beim benutzer
selbes spielchen... prüfen ob ein bereichsrecht vergeben ist, falls nein ->
diese rechte nur für diesen benutzer in der con_rights duplizieren...

das wäre in etwa die bugfix vorgehensweise die ich mir vorgestellt habe...

beim anlegen eines templates muss an sich keine herleitung erfolgen...
in dem fall würde ich nur dem benutzer alle rechte auf dieses template geben... -> nicht jedoch der gruppe...

frage: gute oder schlechte variante... ?
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 25. Nov 2004, 19:09

timo hat geschrieben:Sicherlich ist es lösbar, aber wenn du dir mal die 3fach-geschachtelten Arrays ansiehst, weißt du, warum wir das nicht lösen wollen ;)
ich glaube nicht mal das ich mir die arrays überhaupt ansehen muss...
ich muss den array dann nur neu erzeugen lassen..
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 25. Nov 2004, 19:20

ich hab mir jetzt mal die tabellen angesehen...

con_groups
con_groupmembers
con_phplib_auth_user_md5
con_rights

im prinzip wird ja alles aus der
con_phplib_auth_user_md5 feld user_id hergeleitet...

bei diesem wert muss zuerst überprüft werden ob er in
con_groupmembers vorhanden ist falls ja die werte bei group_id in einen array selektieren...

nach dieser group_id kann ich nun an sich ja in der con_rights suchen (feld user_id)

muss jetzt mal was testen...
*** make your own tools (wishlist :: thx)

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Do 25. Nov 2004, 19:34

ja richtig...ich meinte aber mit dem Debugging das komplette Rechtesystem, also auch die Zuweisungen im Backend - DAS ist wirklich nicht mehr ordentlich debugbar ;)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 25. Nov 2004, 19:48

okay ;-)

wenn ich mir die tabelle con_rights ansehe

hab ich nun folgendes vor mir

1. die user_id
2. die area_id
3. die action_id
4. die idcat (die null ist wenn es unter bereiche vergeben wurde!)
5. idlang
6. idclient
7. type (0 = beim user, 1= bei einer gruppe)

d.h die idcat enthält in dem fall die idtpl
also das erste was ich da jetzt mal weiss ist das idcat auf alle fälle den zu kopierenden wert entsprechen muss...
die userid nach der ich selektiere muss ich zwar ermitteln, aber das stellt kein problem dar...

idlang und idclient kann ich da ignorieren...
den type an sich auch weils über die user_id logisch sein muss...

ich muss jetzt eigentlich nur noch die idarea und idaction werte für die area in dem fall tpl raussuchen und im query berücksichtigen...

wenn ich das hätte schreib ich das ganze mittels insert und angepasster neuer idtpl in die db zurück

und fertig... bitte korrigier mich falls ich was übersehen habe...
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 25. Nov 2004, 20:06

jetzt nur mal so nebenbei da ist mir noch was aufgefallen...

beispiel ich geb nen benutzer das recht auf eine sprache...
setze dort zb unter bereiche alle rechte
und nehme den benutzer dann unter eigenschaften dann das recht auf diese sprache, bleiben alle einträge in der con_rights erhalten...

die andere sache
ich nehme den benutzer wieder alle rechte beim bereich und klicke auf ok
werden mir keine rechte mehr angezeigt, jedoch unter con_rights bleiben sie bestehen...
wechsle ich jetzt zb auf eigenschaften und wieder zurück in bereiche ist wieder alles markiert
entferne ich jetzt alle rechte und klicke auf ok werden die einträge aus con_rights entfernt...
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 25. Nov 2004, 22:05

nun gut ich hab mal was geschrieben das eigentlich ganz intressant geworden ist...

das funktioniert aber nur wenn was dupliziert wird...

vorgehensweise:

ich suche zuerst mal die user_id + alle group_ids raus...
dann such ich die areaid + dazugehörige actionid
raus...

die unterscheidung gruppe und user hab ich zusammengefasst...

anschließend selektiere ich alle werte die in der con_rights vorhanden sind und dem kriterium der idarea + idaction + übergebenen idcat + user_id werten entsprechen raus

bau die insert statements und führe sie aus...

vielleicht kann es ja einer testen...

als platz für die funktion hab ich die functions.rights.php genommen...
die ist sowieso leer...

Code: Alles auswählen

<?php
/******************************************
* File		:	functions.rights.php
* Project	:	Contenido
* Descr 	:	Defines the 'rights' related
*				functions
*
* Author	:	Martin Horwath
* Created	:	25.11.2004
* Modified	:	11.12.2004
*
* © dayside.net
*****************************************/


/**
 * Duplicate rights for any element
 *
 * @param string $area main area name
 * @param int $iditem ID of element to copy
 * @param int $newiditem ID of the new element
 *
 * @author Martin Horwath <horwath@dayside.net>
 * @copyright dayside.net <dayside.net>
 */
function copyRightsForElement ($area, $iditem, $newiditem) {

	global $cfg, $perm, $auth, $area_tree;

	$db = new DB_Contenido;
	$db2 = new DB_Contenido;

	// get all user_id values for con_rights

	$userIDContainer[0] = $auth->auth["uid"]; // user_id of current user
	$userIDContainer = array_merge($userIDContainer, $perm->getGroupsForUser($auth->auth["uid"]));

	// long way start
	/*
		$sql = "SELECT
				group_id
			FROM
				".$cfg["tab"]["groupmembers"]."
			WHERE
				user_id = '".$userIDContainer[0]."'";

	$db->query($sql);

	while ($db->next_record()) {
		$userIDContainer[] = $db->f("group_id"); // add group_ids
	}
	*/
	// long way end

	foreach ($userIDContainer as $key) {
		$statement_where2[] = "user_id = '".$key."' ";
	}

	$where_users =	"(".implode(" OR ", $statement_where2 ) .")"; // only duplicate on user and where user is member of

	// get all idarea values for $area
	// short way
	$AreaContainer = $area_tree[showareas($area)];

	// long way
	/*
	$AreaContainer[0] = $perm->getIDForArea($area);
	$sql = "SELECT
				idarea
			FROM
				".$cfg["tab"]["area"]."
			WHERE
				parent_id = '".$area."'";

	$db->query($sql);

	while ($db->next_record()) {
		$AreaContainer[] = $db->f("idarea");
	}
	*/

	// long version start
	// get all actions for corresponding area
	$AreaActionContainer = array();
	$sql = "SELECT
				idarea, idaction
			FROM
				".$cfg["tab"]["actions"]."
			WHERE
				idarea IN (".implode (',', $AreaContainer).")";
	$db->query($sql);

	while ($db->next_record()) {
		$AreaActionContainer[] = Array ("idarea"=>$db->f("idarea"), "idaction"=>$db->f("idaction"));
	}

	// build sql statement for con_rights
	foreach ($AreaActionContainer as $key) {
		$statement_where[] = "( idarea = ".$key["idarea"]." AND idaction = ".$key["idaction"]." )";
	}

	$where_area_actions = "(".implode(" OR ", $statement_where ) .")"; // only correct area action pairs possible

	// final sql statement to get all effected elements in con_right
	$sql = "SELECT
				*
			FROM
				".$cfg["tab"]["rights"]."
			WHERE
				{$where_area_actions} AND
				{$where_users} AND
				idcat = {$iditem}";
	// long version end

	/*
	// short version start
	$sql = "SELECT
				*
			FROM
				".$cfg["tab"]["rights"]."
			WHERE
				idarea IN (".implode (',', $AreaContainer).") AND
				idaction != 0 AND
				{$where_users} AND
				idcat = {$iditem}";
	// short version end
	*/

	$db->query($sql);

	while ($db->next_record()) {
		$sql = "INSERT INTO ".$cfg["tab"]["rights"]." (idright,user_id,idarea,idaction,idcat,idclient,idlang,`type`) VALUES ('".$db2->nextid($cfg["tab"]["rights"])."','".$db->f("user_id")."','".$db->f("idarea")."','".$db->f("idaction")."','".$newiditem."','".$db->f("idclient")."','".$db->f("idlang")."','".$db->f("type")."');";
		$db2->query($sql);
	}

	// permissions reloaded...
	$perm->load_permissions(true);

}


/**
 * Create rights for any element
 *
 * @param string $area main area name
 * @param int $iditem ID of new element
 *
 * @author Martin Horwath <horwath@dayside.net>
 * @copyright dayside.net <dayside.net>
 */
function createRightsForElement ($area, $iditem) {

	global $cfg, $perm, $auth, $area_tree, $client;

	$db = new DB_Contenido;
	$db2 = new DB_Contenido;

	// get all user_id values for con_rights

	$userIDContainer[0] = $auth->auth["uid"]; // user_id of current user
	$userIDContainer = array_merge($userIDContainer, $perm->getGroupsForUser($auth->auth["uid"])); // add group ids

	foreach ($userIDContainer as $key) {
		$statement_where2[] = "user_id = '".$key."' ";
	}

	$where_users =	"(".implode(" OR ", $statement_where2 ) .")"; // only duplicate on user and where user is member of

	// get all idarea values for $area
	// short way
	$AreaContainer = $area_tree[showareas($area)];

	$sql="SELECT
			  *
		  FROM
			  ".$cfg["tab"]["rights"]."
		  WHERE
			  idclient='$client' AND
			  idarea IN (".implode (',', $AreaContainer).") AND
			  idcat != 0 AND
			  idaction!='0' AND
			  {$where_users}";

	$db->query($sql);

	$RightsContainer = array();

	while($db->next_record()){
		 $RightsContainer[$db->f("user_id")][$db->f("idlang")][$db->f("type")][$db->f("idaction")] = $db->f("idarea");
	}

	// i found no better way to set the rights
	// double entries should not be possible anymore...

	foreach ($RightsContainer as $userid=>$LangContainer) {

		foreach ($LangContainer as $idlang=>$TypeContainer) {

			foreach ($TypeContainer as $type=>$ActionContainer) {

				foreach ($ActionContainer as $idaction=>$idarea) {

					$sql="INSERT INTO ".$cfg["tab"]["rights"]."
						  (idright, user_id,idarea,idaction,idcat,idclient,idlang,`type`)
						  VALUES ('".$db2->nextid($cfg["tab"]["rights"])."', '".$userid."','".$idarea."','".$idaction."','$iditem','$client','".$idlang."','".$type."')";
					$db2->query($sql);
				}
			}
		}
	}

	// permissions reloaded...
	$perm->load_permissions(true);

}

?>
anschließend folgende änderung in
functions.tpl.php bei

Code: Alles auswählen

function tplDuplicateTemplate($idtpl) {

...

    return $new_idtpl;

}
folgendes vor dem return ergänzen:

Code: Alles auswählen

    cInclude ("includes", "functions.rights.php");
    copyRightsForElement("tpl", $idtpl, $new_idtpl);
und der letzte schritt... da hab ich noch nen bug entdeckt...
functions.general.php

die funktion

Code: Alles auswählen

function showareas($mainarea){
...
}
ersetzen durch

Code: Alles auswählen

function showareas($mainarea){

         global $area_tree, $sess, $perm, $cfg;

         $db=new DB_Contenido;

         $mainarea = $perm->getIDForArea($mainarea);

         //if $area_tree for this area is not register
         if(!isset($area_tree[$mainarea])){
                 $sess->register("area_tree");

                 // parent_id uses the name not the idarea
                 $sql="SELECT name FROM ".$cfg["tab"]["area"]." WHERE idarea='$mainarea'";
                 $db->query($sql);
                 $db->next_record();
                 $name = $db->f("name");

                 //check which subareas are there and write them in the array
                 $sql="SELECT idarea FROM ".$cfg["tab"]["area"]." WHERE parent_id='$name' OR idarea='$mainarea'";

                 $db->query($sql);
                 $area_tree[$mainarea]=array();
                 while($db->next_record()){
                       $area_tree[$mainarea][]=$db->f("idarea");
                 }


         }
         return $mainarea;
}
das sollte es sein...
Zuletzt geändert von emergence am Mo 13. Dez 2004, 10:47, insgesamt 10-mal geändert.
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 25. Nov 2004, 23:52

ähm und die zweite sache beim erstellen eines neuen templates ist auch intressant da die funktion 2 bugs hatte...

ist ne intressante variante wie die rechte dort vergeben werden...

wie auch immer in der functions.tpl.php
bei function tplEditTemplate

am beginn einmal

Code: Alles auswählen

        global $perm;
hinzufügen

und etwas weiter unten...

Code: Alles auswählen

            //select The overall rights for this actions
            $sql="SELECT * FROM ".$cfg["tab"]["rights"]." WHERE idclient='$client' AND idarea IN ($poss_area) AND idcat='0' AND idaction!='0'";
            $db->query($sql);

            while($db->next_record()){
                  //insert this rights for the new id
                  $sql="INSERT INTO ".$cfg["tab"]["rights"]."
                        (idright, user_id,idarea,idaction,idcat,idclient,idlang)
                        VALUES ('".$db->nextid($cfg["tab"]["rights"])."', '".$db->f("user_id")."','".$db->f("idarea")."','".$db->f("idaction")."','$idtpl','$client','".$db->f("idlang")."')";
                  $db2->query($sql);
            }
                
        } else {
durch

Code: Alles auswählen

            //select The overall rights for this actions
            $sql="SELECT * FROM ".$cfg["tab"]["rights"]." WHERE idclient='$client' AND idarea IN ($poss_area) AND idcat='0' AND idaction!='0'";
            $db->query($sql);

            while($db->next_record()){
                  //insert this rights for the new id
                  $sql="INSERT INTO ".$cfg["tab"]["rights"]."
                        (idright, user_id,idarea,idaction,idcat,idclient,idlang,`type`)
                        VALUES ('".$db2->nextid($cfg["tab"]["rights"])."', '".$db->f("user_id")."','".$db->f("idarea")."','".$db->f("idaction")."','$idtpl','$client','".$db->f("idlang")."','".$db->f("type")."')";
                  $db2->query($sql);

            }

            $perm->load_permissions(true);

        } else {
ersetzen...

ob die selektion der rechte so 100%ig korrekt ist weiss ich jetzt momentan nicht... ist schon etwas spät geworden um mich da noch reinzudenken...

ach ja zu den bugs:
innerhalb der insert schleife wurde $db->nextid() verwendet...
da wird aber nicht wirklich funktionieren, da nur ein query ausgeführt...
mittels $db2->nextid() ist das aber kein problem...
nach dem setzen der rechte müssen die rechte für den user neu geladen werden... !
ach ja und type fehlte beim insert...
*** make your own tools (wishlist :: thx)

makemyday
Beiträge: 53
Registriert: Fr 11. Jul 2003, 09:49
Wohnort: Gießen
Kontaktdaten:

Beitrag von makemyday » Fr 26. Nov 2004, 11:18

Kaum sitze ich einen Abend mal nicht am Rechner, legt der schon so richtig los.
emergence hat geschrieben:die andere sache
ich nehme den benutzer wieder alle rechte beim bereich und klicke auf ok
werden mir keine rechte mehr angezeigt, jedoch unter con_rights bleiben sie bestehen...
wechsle ich jetzt zb auf eigenschaften und wieder zurück in bereiche ist wieder alles markiert
entferne ich jetzt alle rechte und klicke auf ok werden die einträge aus con_rights entfernt...
Ich bin mir nicht sicher, aber kann es sein, dass dieses Problem hier im Forum als Bug diskutiert wurde, der nicht wirklich nachzuvollziehen war.

Ich werde mich am Wochenende mal zum Debuggen und testen anbieten. Ich geh mal davon aus, dass Du in der 4.4.4 entwickelt hast.

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 26. Nov 2004, 11:36

das ist nett... ;-) sollte in der 4.4.x serie laufen... sicher bin ich mir aber nicht... :?:

ich bin aber noch nicht ganz fertig...

ich hab noch etwas geändert und ne neue funktion entwickelt die die rechte vergabe etwas abändert...

bezieht sich hauptsächlich auf den teil mit neues element anlegen

die funktion nimmt rücksicht darauf in welchen gruppen der user rechte hat und dupliziert sie dann nur in den angebenen bereichen...
sieht zwar etwas merkwürdig aus wie ich es gemacht habe aber da gab es ein problem das rechte zu oft in die con_rights geschrieben wurden... und zeitweise auch falsch da entweder die nextid mittels $db angefordert wurde oder gruppenrechte nicht funktionierten da type nicht ergänzt wird...

die neue funktion hab ich oben in functions.right.php ergänzt...

die zweite funktion ersetzt die rechte vergabe in
functions.tpl.php
functions.lay.php
functions.str.php
functions.mod.php

die rechte vergabe ist dann wirklich mal für alle elemente gleich

es wird jeweils der part mit

Code: Alles auswählen

        //set new $poss_area

        $poss_area = "'".implode("','",$area_tree[showareas("mod")])."'";

        //select The overall rights for this actions
        $sql="SELECT * FROM ".$cfg["tab"]["rights"]." WHERE idclient='$client' AND idarea IN ($poss_area) AND idcat = '0' AND idaction != '0'";
        $db->query($sql);

        while($db->next_record()){

            # insert this rights for the new id
            $sql="INSERT INTO ".$cfg["tab"]["rights"]."
            (idright, user_id,idarea,idaction,idcat,idclient,idlang)
            VALUES ('".$db->nextid($cfg["tab"]["rights"])."', '".$db->f("user_id")."','".$db->f("idarea")."','".$db->f("idaction")."','$tmp_newid','$client','".$db->f("idlang")."')";
            $db2->query($sql);

        $perm->load_permissions(true); // unnütz ->  manchmal da vorhanden 

        showareas("WASAUCHIMMER"); // unnütz -> auch mal vorhanden 
        }
durch

bei functions.tpl.php

Code: Alles auswählen

            // set correct rights for element
            cInclude ("includes", "functions.rights.php");
            createRightsForElement("tpl", $idtpl);
bei functions.mod.php

Code: Alles auswählen

        // set correct rights for element
        cInclude ("includes", "functions.rights.php");
        createRightsForElement("mod", $idmod);
bei functions.lay.php

Code: Alles auswählen

        // set correct rights for element
        cInclude ("includes", "functions.rights.php");
        createRightsForElement("lay", $idlay);
bei functions.str.php

Code: Alles auswählen

        // set correct rights for element
        cInclude ("includes", "functions.rights.php");
        createRightsForElement("str", $tmp_newid);
ersetzt...
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 26. Nov 2004, 18:42

hab mich heute etwas mit dem rechte system backend einstellungen gespielt...

wer hat das denn verbrochen... ?

bis ich den unterschied zwischen
$rights_list
und
$right_list gecheckt hab ist doch einiges an zeit draufgegangen...
zuerst dachte ich das ist ein typo dabei werden die teile für komplett unterschiedliche dinge benötigt...

nun gut wie auch immer das problem warum einzelne teile manchmal gecheckt sind und manchmal nicht hat mit der faulheit desjenigen zu tun der auf die idee gekommen $rights_list_old in der session zu speichern... nur um den code nicht umzuschreiben...
der teil muss nur an den beginn des scripts gestellt werden... ohne session speicherung... die $rights_list_old muss immer erzeugt werden...

ich hab heute sicher an die 20 ungereimtheiten in dem system entdeckt...

in den sql abfragen sind zeitweise fehler vorhanden die die einträge in der con_rights verdreifachen... zb bei content, module etc...

hab mittlerweile aber ne gute methode gefunden das entsprechend zu debuggen... eclipse sei dank... code formatierung kann ich nur empfehlen...

ich werd mich da noch ein wenig spielen und die einzelnen funktionen in die functions.rights.php auslagern...

die dateien werden dann so richtig schön schlank und übersichtlich...

wie auch immer das rechte system funktioniert somit eigentlich ziemlich perfekt...
*** make your own tools (wishlist :: thx)

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Fr 26. Nov 2004, 19:01

das Rechtesystem hat mal einer verbrochen, der nicht so genau wußte, was er da eigentlich tat ;)

makemyday
Beiträge: 53
Registriert: Fr 11. Jul 2003, 09:49
Wohnort: Gießen
Kontaktdaten:

Beitrag von makemyday » Sa 27. Nov 2004, 17:36

@emergence: So, will das ganze mal testen, bekomme aber ein Fehler wenn ich die Original contenido include.tpl_overview.php verwende. Hast Du mit meiner Änderung in dieser Datei weitergearbeitet?

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Sa 27. Nov 2004, 17:55

nein hab ich nicht...
in der include.tpl_overview.php hab ich nichts geändert...

welche fehlermeldung bekommst du denn ?
*** make your own tools (wishlist :: thx)

makemyday
Beiträge: 53
Registriert: Fr 11. Jul 2003, 09:49
Wohnort: Gießen
Kontaktdaten:

Beitrag von makemyday » Sa 27. Nov 2004, 18:12

Warning: Invalid argument supplied for foreach() in D:\FoxServ\www\contenido-4.4.4\conlib\perm.inc on line 426

Im linken Fenster bei der Templateverarbeitung. Werde aber noch mal checken ob ich die Änderungen in den Dateien:
functions.tpl.php
functions.lay.php
functions.str.php
functions.mod.php
richtig gemacht habe

Gesperrt