Fehler in perm.inc

Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Fehler in perm.inc

Beitrag 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
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag 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
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag von Brazo Alkher »

wenn ich $mainarea verwende, dann bekomme ich wenigstens auch Ergebnisse bei dem Query. aber dann ist das Skript noch langsamer...
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

verschoben...

und müsste da $value sein...
*** make your own tools (wishlist :: thx)
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag 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.
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag 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...
*** make your own tools (wishlist :: thx)
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag 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 :)
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag 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.
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag 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.
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag 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 ?
*** make your own tools (wishlist :: thx)
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag von Brazo Alkher »

ähh ja :-)
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag 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
*** make your own tools (wishlist :: thx)
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag 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);
		}
	}
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag 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
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag 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
Gesperrt