Gruppe einrichten, welche Templates bearbeiten kann

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

Beitrag von emergence » Di 30. Nov 2004, 22:04

mal ganz auf die schnelle
$area_tree wird in
function showarea
erzeugt...

bei have_perm_item
schau mal nach ob nach der global ...;

Code: Alles auswählen

		$mainarea = $this->getIDForArea($mainarea);
vorhanden ist... fehlt glaube ich in der 4.4.4...

ähm, showarea gehört an sich auch in die perm klasse...
kreuz und quer durchs system zu springen und sich die teile zusammenzusuchen ist einfach sch*****
Zuletzt geändert von emergence am Mi 1. Dez 2004, 13:48, insgesamt 1-mal geändert.
*** make your own tools (wishlist :: thx)

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

Beitrag von makemyday » Mi 1. Dez 2004, 10:35

Wunderbar... das wars. Funktioniert jetzt einwandfrei

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

Beitrag von emergence » Mi 1. Dez 2004, 13:05

na wunderbar...

nun der letzter schritt der aufräum aktion...

in perm.inc wird folgendes ergänzt:

Code: Alles auswählen

	function showareas($mainarea){

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

		$db = new DB_Contenido;

		$mainarea = $this->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;
	}
innerhalb dieser klasse sollten sämtliche aufrufe zur
showareas um
$this->showareas("was auch immer"); ergänzt werden... (1-2 mal)

die anderen aufrufe die geändert werden müssten befinden sich alle in
contenido/includes/

einfach nach showareas -> dateiinhalt suchen... (warum xp das nicht standardmäßig drinnen hat php dateien zu durchsuchen ist wirklich ein witz)

innerhalb von funktion muss kontrolliert werden ob $perm bei global vorhanden ist...

es muss dann nur mehr vor jedem gefundenen showareas("was auch immer")
$perm-> ergänzt werden...
also
$perm->showareas("was auch immer")
ist das ziel !

in functions.general.php kann dann die funktion showareas entfernt werden...

in perm.inc befinden sich dann ausnahmslos alle funktionen um die rechte abzufragen bzw zu überprüfen...

tja nun ist das contenido team am drücker, mal sehen ob es die änderungen in den cvs_head schafft...
*** make your own tools (wishlist :: thx)

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

Beitrag von emergence » So 12. Dez 2004, 11:55

noch ein kleiner nachtrag

functions.rights.php

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	:	12.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
 * @param int $idlang ID of lang parameter
 *
 * @author Martin Horwath <horwath@dayside.net>
 * @copyright dayside.net <dayside.net>
 */
function copyRightsForElement ($area, $iditem, $newiditem, $idlang=false) {

	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[$perm->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
	*/

	if ($idlang) {
		$sql.= " AND idlang='$idlang'";
	}

	$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
 * @param int $idlang ID of lang parameter
 *
 * @author Martin Horwath <horwath@dayside.net>
 * @copyright dayside.net <dayside.net>
 */
function createRightsForElement ($area, $iditem, $idlang=false) {

	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[$perm->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}";

	if ($idlang) {
		$sql.= " AND idlang='$idlang'";
	}

	$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);

}


/**
 * Delete rights for any element
 *
 * @param string $area main area name
 * @param int $iditem ID of new element
 * @param int $idlang ID of lang parameter
 *
 * @author Martin Horwath <horwath@dayside.net>
 * @copyright dayside.net <dayside.net>
 */
function deleteRightsForElement ($area, $iditem, $idlang=false) {

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

	// get all idarea values for $area
	$AreaContainer = $area_tree[$perm->showareas($area)];

	$db = new DB_Contenido;

	$sql = "DELETE FROM ".$cfg["tab"]["rights"]." WHERE idcat='$iditem' AND idclient='$client' AND idarea IN (".implode (',', $AreaContainer).")";
	if ($idlang) {
		$sql.= " AND idlang='$idlang'";
	}
	$db->query($sql);

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

}


?>
ich hab jetzt noch ne neue funktion zum löschen der rechte hinzugefügt...
-> deleteRightsForElement ($area, $iditem)
ebenso ein optionaler parameter um auf eine sprache zu begrenzen bei allen drei funktionen...

damit wäre das auch halbwegs einheitlich...
die geänderten funktionen sehen für folgende daten so aus:
functions.tpl.php

Code: Alles auswählen

function tplDeleteTemplate($idtpl) {

        global $db, $client, $lang, $cfg;

        $sql = "DELETE FROM ".$cfg["tab"]["tpl"]." WHERE idtpl='$idtpl'";
        $db->query($sql);

        /* JL 160603 : Delete all unnecessary entries */

        $sql = "DELETE FROM ".$cfg["tab"]["container"]." WHERE idtpl = $idtpl";
        $db->query($sql);

        $idsToDelete = array();
        $sql = "SELECT idtplcfg FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtpl = $idtpl";
        $db->query($sql);
        while ( $db->next_record() ) {
        	$idsToDelete[] = $db->f("idtplcfg");
        }

        foreach ( $idsToDelete as $id ) {

        	$sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg = $id";
        	$db->query($sql);

        	$sql = "DELETE FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = $id";
        	$db->query($sql);

        }

        // delete rights for element
        cInclude ("includes", "functions.rights.php");
        deleteRightsForElement("tpl", $idtpl);

}
functions.mod.php

Code: Alles auswählen

function modDeleteModule($idmod) {

    # Global vars
    global $db, $client, $cfg;

    $sql = "DELETE FROM ".$cfg["tab"]["mod"]." WHERE idmod = '".$idmod."' AND idclient = '".$client."'";
    $db->query($sql);

    // delete rights for element
    cInclude ("includes", "functions.rights.php");
    deleteRightsForElement("mod", $idmod);

}
functions.lay.php

Code: Alles auswählen

function layDeleteLayout($idlay) {

        global $db, $client, $cfg;

        $sql = "SELECT * FROM ".$cfg["tab"]["tpl"]." WHERE idlay='$idlay'";
        $db->query($sql);
        if ($db->next_record()) {
                return "0301";                // layout is still in use, you cannot delete it
        } else {
                $sql = "DELETE FROM ".$cfg["tab"]["lay"]." WHERE idlay='$idlay'";
                $db->query($sql);
        }

        // delete rights for element
        cInclude ("includes", "functions.rights.php");
        deleteRightsForElement("lay", $idlay);

}
bei
functions.str.php

function strDeleteCategory
am ende

Code: Alles auswählen

        //set new $poss_area

        $poss_area="'".implode("','",$area_tree[$perm->showareas("str")])."'";

        $sql="DELETE FROM ".$cfg["tab"]["rights"]." WHERE idcat='$idcat' AND idclient='$client' AND idarea IN ($poss_area)";
        $db->query($sql);
durch

Code: Alles auswählen

        // delete rights for element
        cInclude ("includes", "functions.rights.php");
        deleteRightsForElement("str", $idcat);
ersetzen... (für die 4.4.x)

da in der 4.5.x serie beim löschen einer kategorie die rechte bei einer anderen sprache erhalten bleiben müssen...
für (4.5.x)

Code: Alles auswählen

        // delete rights for element
        cInclude ("includes", "functions.rights.php");
        deleteRightsForElement("str", $idcat, $lang);
die rechte vergabe sehe ich mir in dieser datei noch etwas an...
Zuletzt geändert von emergence am Mo 13. Dez 2004, 10:45, insgesamt 1-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 » So 12. Dez 2004, 14:19

functions.str.php

function strNewCategory

Code: Alles auswählen

    //set new $poss_area

    $poss_area="'".implode("','",$area_tree[$perm->showareas("str")])."'";

    //Select all rights for the parentid
    $sql="SELECT * FROM ".$cfg["tab"]["rights"]." WHERE idclient = '$client' AND idcat = '$tmp_parentid' 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 ('".$db2->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);
    $perm->showareas("str");
wird ersetzt durch

Code: Alles auswählen

    // set correct rights for element
    cInclude ("includes", "functions.rights.php");
    copyRightsForElement("str", $tmp_parentid, $tmp_newid);
für die 4.5.x

Code: Alles auswählen

    // set correct rights for element
    cInclude ("includes", "functions.rights.php");
    foreach ($a_languages as $tmp_lang) {

        copyRightsForElement("str", $tmp_parentid, $tmp_newid, $tmp_lang);

    }
sollte es auch tun...

bei der function strNewTree (4.5.x)

sollte es so aussehen:

Code: Alles auswählen

        // set correct rights for element
        cInclude ("includes", "functions.rights.php");
        foreach ($a_languages as $tmp_lang) {

            createRightsForElement("str", $tmp_newid, $tmp_lang);

        }
bei den änderungen für die 4.4.x sind die foreach schleifen nicht notwenig...

nun ja mit dieser letzten änderung ist es nicht mehr nötig irgendwelche berechtigungen innerhalb der funktionen selbst zu setzen...
*** make your own tools (wishlist :: thx)

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

Beitrag von emergence » Mo 13. Dez 2004, 11:01

das ist jetzt ne reine 4.5.x geschichte...

offener punkt ist eigentlich nur mehr was beim syncen von kategorien passieren soll...

beim syncen der kategorie in die andere sprache könnte man nun die rechte herleiten... die frage ist jetzt eigentlich nur mehr von wo... ;-)

in der function strSyncCategory müsste ich das noch einbauen...

@timo
ich geh mal davon aus das in der anderen sprache der benutzer schon irgendwelche rechte haben muss sonst könnte er gar nicht syncen oder ?

wie auch immer die funktion müsste so aussehen (schätze ich mal)

Code: Alles auswählen

function strSyncCategory($idcat, $sourcelang, $targetlang)
{
    global $cfg;

    $sql = "SELECT  idcat, idlang, idtplcfg, name,
            visible, public, status, author,
            created, lastmodified
        FROM
            ".$cfg["tab"]["cat_lang"]."
        WHERE
            idcat = '$idcat' AND idlang = '$sourcelang'";

    $tmpdb = new DB_Contenido;
    $tmpdb->query($sql);

    if ($tmpdb->next_record())
    {
    if ($tmpdb->f("idtplcfg") != 0)
    {
        /* Copy the template configuration */
        $newidtplcfg = tplcfgDuplicate($tmpdb->f("idtplcfg"));
    } else {
        $newidtplcfg = 0;
    }
    $newidcatlang = $tmpdb->nextid($cfg["tab"]["cat_lang"]);

    $idcat = $tmpdb->f("idcat");
    $idlang = $targetlang;
    $idtplcfg = $newidtplcfg;
    $name = $tmpdb->f("name");
    $visible = 0;
    $public = $tmpdb->f("public");
    $status = $tmpdb->f("status");
    $author = $tmpdb->f("author");
    $created = $tmpdb->f("created");
    $lastmodified = $tmpdb->f("lastmodified");

    $sql = "INSERT INTO
        ".$cfg["tab"]["cat_lang"]."
        (idcatlang, idcat, idlang, idtplcfg, name,
         visible, public, status, author, created,
         lastmodified)
        VALUES
           ('$newidcatlang',
        '$idcat',
        '$idlang',
        '$idtplcfg',
        '$name',
        '$visible',
        '$public',
        '$status',
        '$author',
        '$created',
        '$lastmodified')";
    $tmpdb->query($sql);

    // set correct rights for element
    cInclude ("includes", "functions.rights.php");
    createRightsForElement("str", $idcat, $targetlang);

    }

}
*** make your own tools (wishlist :: thx)

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

Beitrag von emergence » Do 16. Dez 2004, 20:54

ich hab mir gerade noch ein paar gedanken zu dem thread gemacht und hab da noch was

class.backend

findet sich an sich

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"))) {
wenn ich nicht ganz behämmert bin sollte

Code: Alles auswählen

                     if ($perm->have_perm_area_action_item($area, $db->f("name"), $itemid)) {
vollkommen reichen...

ach ja das weiss ich jetzt eigentlich nicht
perm.inc

sollte
have_perm_item
nicht ebenso auf die rechte in den gruppen checken ?
*** make your own tools (wishlist :: thx)

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

Beitrag von emergence » Sa 18. Dez 2004, 12:58

noch etwas unnötiges entdeckt...

rights.inc.php
grouprights.inc.php

Code: Alles auswählen

			//if Area is an plugin
			if (strstr($db->f('location'), $cfg['path']['plugins'])) {
				$plugxml->load($db->f('location').'lang_de.xml');
				$location = $plugxml->valueOf("language/sub");
				eval ($plugxml->valueOf("language/action"));

			} else {
				$location = $xml->valueOf($cfgPath['xmlroot'].$db->f('location'));
			}
den code kann man kübeln da er nicht mehr verwendet wird...
*** make your own tools (wishlist :: thx)

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

Beitrag von emergence » Mo 27. Dez 2004, 20:36

noch ne kleine nachbesserung (nur bei mehrsprachigkeit relevant)

bei
functions.str.php

function strDeleteCategory

Code: Alles auswählen

            if ($db->num_rows() > 0)
            {
                return;
            }
sollte

Code: Alles auswählen

            if ($db->num_rows() > 0)
            {
		        // more languages found...
		        // delete rights for element
        		cInclude ("includes", "functions.rights.php");
        		deleteRightsForElement("str", $idcat, $lang);

                return;
            }
wenn man sich den code ansieht weiss man dann auch warum ;-)

ähm kleine bitte an diejenigen die das testen (über 600 views)...
mit bitte um feedback...
*** make your own tools (wishlist :: thx)

Hulk
Beiträge: 25
Registriert: So 21. Nov 2004, 23:29
Kontaktdaten:

Ich blicke nicht mehr durch...

Beitrag von Hulk » Sa 1. Jan 2005, 23:19

Ich habe den thread jetzt vollständig durchgelesen und den Eindruck gewonnen, dass ich die Rechteverwaltung in der 444-Version nicht in der ursprünglichen Form beibehalten kann, wenn ich in Produktion gehen will.

Leider blicke ich nicht durch, welche Änderungen schlussendlich durchzuführen sind. Gibt es eine Möglichkeit, eine aktuelle Aufstellung der erforderlichen Änderungen oder - noch besser - einen Download sämtlicher geänderter Dateien zu erhalten? Zum Beispiel von jemandem, der das jetzt durchgetestet hat?

Hulk

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

Beitrag von timo » Mi 12. Jan 2005, 14:36

WOW - erstmal ein riesen Dankeschön und eine Menge Respekt emergence....ich habe die ganzen Änderungen in den 4.4 und CVS Branch eingebaut...hoffentlich funktioniert alles.

Hört sich aber alles schonmal sehr gut an!

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

Beitrag von emergence » Mi 12. Jan 2005, 15:17

dankeschön ;-)
sobald ein neuer snapshot da ist werd ich nochmal drüberschauen...
*** 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 » Mi 12. Jan 2005, 15:18

Ich kann später mal einen erzeugen - mittlerweile sind wieder unglaublich viele Änderungen zusammengekommen...

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

Beitrag von emergence » Mi 12. Jan 2005, 17:54

ähm,
ad snapshot
die inhalte der datei functions.perm.php sollten an sich in der functions.rights.php sein sonst rührt sich momentan gar nichts... ;-)
*** 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 » Mi 12. Jan 2005, 18:00

ist ein argument ;)

neuer Snapshot folgt (ich hoffe, daß das Script kapiert, daß es heute schon einen Snapshot gibt ;))

Gesperrt