Seite 1 von 2

Fehler in perm.inc

Verfasst: Di 27. Mär 2007, 11:57
von Brazo Alkher
in der Datei perm.inc ist glaube ich in der Funktion have_perm_item() ein Fehler.

und zwar ab Zeile 682 steht:

Code: Alles auswählen

$sql = "SELECT
                        *
                     FROM
                        ".$cfg["tab"]["rights"]."
                     WHERE
                        user_id IN ('".implode("','", $groupsForUser)."') AND
                        idclient = '$client' AND
                        idlang = '$lang' AND
                        idarea = '$area' AND
                        idcat != '0'";
$db->query($sql);

//if there are no rights for this area set the flag norights
if ($db->affected_rows() == 0)
{
	$item_rights[$area] = "noright";
}
dort wird zweimal die Variable $area verwendet, die immer undefiniert ist.

Wahscheinlich müsste statt dessen die Variable $value verwendet werden, wenn ich die Funktion richtig verstanden habe :-)

Contenido Version 4.6.15

Verfasst: Di 27. Mär 2007, 12:01
von Brazo Alkher
vielleicht auch doch nicht (also das $value verwendet werden muss)
da jetzt gar kein Kategoriebaum mehr angezeigt wird. Aber zumindest scheint das Skript dann etwas schneller zu laufen ;-P

Verfasst: Di 27. Mär 2007, 12:05
von Brazo Alkher
wenn ich $mainarea verwende, dann bekomme ich wenigstens auch Ergebnisse bei dem Query. aber dann ist das Skript noch langsamer...

Verfasst: Di 27. Mär 2007, 12:32
von emergence
verschoben...

und müsste da $value sein...

Verfasst: Di 27. Mär 2007, 13:09
von Brazo Alkher
also $value ist es definitv nicht da dann der Kategoriebaum immer leer ist
und zwischen $area und $mainarea gibt es kein Unterschied beim Kategorienbaum der angezeigt wird.

Verfasst: Di 27. Mär 2007, 13:23
von emergence
seltsam,
das steckt in einer foreach schleife wo sich dann alles auf $value bezieht ...

die selbe sql abfrage gibts noch in der have_perm_area_action_item
und da bezieht sich alles auf $area (da ist es ja anscheinend richtig)

somit gleich gedacht -> weiter unten gleich gemacht...

Verfasst: Di 27. Mär 2007, 14:28
von Brazo Alkher
an sich ist es auch logisch gesehen richtig
also das $value verwendet wird
das habe ich jetzt auch mit debug meldungen nachvollziehen können.

ich versuche jetzt noch raus zu finden, woran es dann nur liegen kann, das trotzdem dann keine einzige Kategorie mehr im Baum angezeigt wird...
ich melde mich :)

Verfasst: Di 27. Mär 2007, 14:58
von Brazo Alkher
so....

also es MUSS in perm.inc in der Funktion EDIT:have_perm_item() $value verwendet werden.
Damit dann aber in include.con_str_overview.php trotzdem ein Kategoriebaum angezeigt wird muss noch vor der foreach-Schleife

Code: Alles auswählen

foreach ($objects as $key => $value)

folgende Zeilen eingefügt werden

Code: Alles auswählen

$groupsForUser		= $perm->getGroupsForUser($auth->auth['uid']);
$groupsForUser[]	= $auth->auth['uid'];

$tmp_userstring		= implode('","', $groupsForUser);

damit in der SQL-Abfrage auch ein Ergbeniss kommt

Code: Alles auswählen

		$sql = '
			SELECT
				*
			FROM
				'.$cfg['tab']['rights'].'
			WHERE
				user_id		IN ("'.$tmp_userstring.'")
				AND
				idclient	= "'.$client.'"
				AND
				idlang		= "'.$lang.'"
				AND
				idcat		= "'.$value->id.'"
			';
Nachteil vom ganzen ist: das dann der Kategoriebaum etwa so aussieht, wenn ein User nicht von der untersten Ebene an Rechte für Kategorien / Artikel hat:

Bild

vorher sah es nämlich so aus:

Bild

dort konnte man die Kategorien zwar anklicken, auf die man keine Rechte hatte, bekam aber dann auf der rechten Seite lediglich "Zugriff verweigert" angezeigt.

Verfasst: Di 27. Mär 2007, 15:02
von Brazo Alkher
jetzt ist das ganze schonmal nen bissl schneller, aber wenn der User die Kategorien (oder Alle) zuklappt, sieht er nix mehr. Ausser klappt wieder mit "Alle Kategorien öffnen" alle wieder auf.

Verfasst: Di 27. Mär 2007, 17:25
von emergence
Brazo Alkher hat geschrieben:so....

also es MUSS in perm.inc in der Funktion have_perm_area_action_item() $value verwendet werden.....
ähm ?? du meinst wohl have_perm_item oder nicht ?

Verfasst: Mi 28. Mär 2007, 08:34
von Brazo Alkher
ähh ja :-)

Verfasst: Mi 28. Mär 2007, 08:53
von emergence
ähm ich hab mir das jetzt mal genauer angesehen und muss sagen ich kann die änderungen ab

Code: Alles auswählen

foreach ($objects as $key => $value)
nicht nachvollziehen... die zeile finde ich nicht mal...

was

Code: Alles auswählen

$value->id
bei einem array bringen soll ist mir auch nicht wirklich klar...

poste am besten mal die ganze methode
function have_perm_item

Verfasst: Do 29. Mär 2007, 14:23
von Brazo Alkher
perm.inc

Code: Alles auswählen

	function have_perm_item($mainarea, $itemid)
	{
		global $cfg, $item_rights, $cfg, $client, $lang, $auth, $area_tree, $sess;

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

		// if is not admin or sysadmin
		if (!$this->have_perm())
		{
			$db = new DB_Contenido;

			$this->showareas($mainarea);

			$flg = false;

			// check if there are any rights for this areas
			foreach ($area_tree[$mainarea] as $value)
			{
				// if the flag noright is set there are no rights in this area
				if ($item_rights[$value] == 'noright')
					return false;

				elseif (is_array($item_rights[$value]))
				{
					// if there are any rights
					foreach ($item_rights[$value] as $value2)
						if (in_array($itemid, $value2))
							return true;

				}
				elseif ($item_rights[$value] != 'noright')
				{
					$groupsForUser		= $this->getGroupsForUser($auth->auth['uid']);
					$groupsForUser[]	= $auth->auth['uid'];

					// else search for rights for this user in this area
					$sql = '
						SELECT
							*
						FROM
							'.$cfg['tab']['rights'].'
						WHERE
							user_id		IN ("'.implode('","', $groupsForUser).'")
							AND
							idclient	= "'.$client.'"
							AND
							idlang		= "'.$lang.'"
							AND
							idarea		= "'.$value.'"
							AND
							idcat		!= "0"
						';
					$db->query($sql);

					// if there are no rights for this area set the flag norights
					if ($db->affected_rows() == 0)
						$item_rights[$value] = 'noright';

					// set the rights
					while ($db->next_record())
					{
						if ($db->f('idcat') == $itemid)
							$flg = true;

						$item_rights[$db->f('idarea')][$db->f('idaction')][$db->f('idcat')] = $db->f('idcat');
					}
				} //end if
			} //end foreach
			return $flg;
		} //end if
		return true;
	}
include.con_str_overview.php

um folgende Zeilen

Code: Alles auswählen

unset($objects[0]);
foreach ($objects as $key => $value)
dieses:

Code: Alles auswählen

$groupsForUser		= $perm->getGroupsForUser($auth->auth['uid']);
$groupsForUser[]	= $auth->auth['uid'];

$tmp_userstring		= implode('","', $groupsForUser);


unset($objects[0]);
foreach ($objects as $key => $value)
{

	# Check global rights
	$check_rights = $perm->have_perm_area_action('con', 'con_makestart');
	if (!$check_rights) $check_rights = $perm->have_perm_area_action('con', 'con_makeonline');
	if (!$check_rights) $check_rights = $perm->have_perm_area_action('con', 'con_deleteart');
	if (!$check_rights) $check_rights = $perm->have_perm_area_action('con', 'con_tplcfg_edit');
	if (!$check_rights) $check_rights = $perm->have_perm_area_action('con', 'con_makecatonline');
	if (!$check_rights) $check_rights = $perm->have_perm_area_action('con', 'con_changetemplate');
	if (!$check_rights) $check_rights = $perm->have_perm_area_action('con_editcontent', 'con_editart');
	if (!$check_rights) $check_rights = $perm->have_perm_area_action('con_editart', 'con_edit');
	if (!$check_rights) $check_rights = $perm->have_perm_area_action('con_editart', 'con_newart');
	if (!$check_rights) $check_rights = $perm->have_perm_area_action('con_editart', 'con_saveart');

	# Check rights per cat
	if (!$check_rights)
	{
		# Check if any rights are applied to current user or his groups
		$sql = '
			SELECT
				*
			FROM
				'.$cfg['tab']['rights'].'
			WHERE
				user_id		IN ("'.$tmp_userstring.'")
				AND
				idclient	= "'.$client.'"
				AND
				idlang		= "'.$lang.'"
				AND
				idcat		= "'.$value->id.'"
			';

		$db->query($sql);

		if ($db->num_rows() != 0)
		{
			if (!$check_rights) $check_rights = $perm->have_perm_area_action_item('con', 'con_makestart', $value->id);
			if (!$check_rights) $check_rights = $perm->have_perm_area_action_item('con', 'con_makeonline', $value->id);
			if (!$check_rights) $check_rights = $perm->have_perm_area_action_item('con', 'con_deleteart', $value->id);
			if (!$check_rights) $check_rights = $perm->have_perm_area_action_item('con', 'con_tplcfg_edit', $value->id);
			if (!$check_rights) $check_rights = $perm->have_perm_area_action_item('con', 'con_makecatonline', $value->id);
			if (!$check_rights) $check_rights = $perm->have_perm_area_action_item('con', 'con_changetemplate', $value->id);
			if (!$check_rights) $check_rights = $perm->have_perm_area_action_item('con_editcontent', 'con_editart', $value->id);
			if (!$check_rights) $check_rights = $perm->have_perm_area_action_item('con_editart', 'con_edit', $value->id);
			if (!$check_rights) $check_rights = $perm->have_perm_area_action_item('con_editart', 'con_newart', $value->id);
			if (!$check_rights) $check_rights = $perm->have_perm_area_action_item('con_editart', 'con_saveart', $value->id);
		}
	}

Verfasst: So 24. Jun 2007, 19:18
von HerrB
Ähm, vielleicht kann mir jemand kurz helfen:

Der Bug ist noch drin - mit $value ersetzen? Wie ist der Zusammenhang mit str_overview.php?

Gruß
HerrB

Verfasst: Mo 9. Jul 2007, 12:09
von Brazo Alkher
HerrB hat geschrieben:Ähm, vielleicht kann mir jemand kurz helfen:

Der Bug ist noch drin - mit $value ersetzen? Wie ist der Zusammenhang mit str_overview.php?

Gruß
HerrB
die Anpassung in str_overview.php ist notwendig damit ein User mit eingeschränkten Rechten einen Kategoriebaum angezeigt bekommt, wenn die Routine in perm.inc angepasst wurde. Ansonsten sieht der nämlich nix