You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by jf...@apache.org on 2014/10/17 04:58:10 UTC

svn commit: r1632463 - in /vcl/trunk/web/.ht-inc: privileges.php xmlrpcWrappers.php

Author: jfthomps
Date: Fri Oct 17 02:58:10 2014
New Revision: 1632463

URL: http://svn.apache.org/r1632463
Log:
VCL-672 - privilege page does not handle user groups with the same name but different affiliations correctly

xmlrpcWrappers.php: modified XMLRPCgetUserGroupPrivs, XMLRPCaddUserGroupPriv, and XMLRPCremoveUserGroupPriv: use $groupid as key for data in arrays returned by getNodeCascadePrivileges and getNodePrivileges instead of $name

privileges.php:
-modified viewNodes, selectNode, printUserPrivRow, getUserPrivRowHTML, and checkUserHasPriv: use group id as key for data in arrays returned by getNodeCascadePrivileges and getNodePrivileges instead of group name
-modified userLookup: (unrelated to issue) expanded query for loginlog to include unityid@affiliation
-modified getNodePrivileges and getNodeCascadePrivileges: use group id as key in returned array of data instead of group name

Modified:
    vcl/trunk/web/.ht-inc/privileges.php
    vcl/trunk/web/.ht-inc/xmlrpcWrappers.php

Modified: vcl/trunk/web/.ht-inc/privileges.php
URL: http://svn.apache.org/viewvc/vcl/trunk/web/.ht-inc/privileges.php?rev=1632463&r1=1632462&r2=1632463&view=diff
==============================================================================
--- vcl/trunk/web/.ht-inc/privileges.php (original)
+++ vcl/trunk/web/.ht-inc/privileges.php Fri Oct 17 02:58:10 2014
@@ -212,11 +212,19 @@ function viewNodes() {
 			print "    <TH>$img</TH>\n";
 		}
 		print "  </TR>\n";
-		$groups = array_unique(array_merge(array_keys($privs["usergroups"]), 
-		                      array_keys($cascadePrivs["usergroups"])));
-		sort($groups);
-		foreach($groups as $group) {
-			printUserPrivRow($group, $i, $privs["usergroups"], $usertypes["users"],
+		$groupids = array_unique(array_merge(array_keys($privs["usergroups"]), 
+		                         array_keys($cascadePrivs["usergroups"])));
+		$allids = implode(',', $groupids);
+		$query = "SELECT id "
+		       . "FROM usergroup "
+		       . "WHERE id IN ($allids) "
+		       . "ORDER BY name";
+		$qh = doQuery($query);
+		$orderedgroups = array();
+		while($row = mysql_fetch_assoc($qh))
+			$orderedgroups[] = $row['id'];
+		foreach($orderedgroups as $id) {
+			printUserPrivRow($id, $i, $privs["usergroups"], $usertypes["users"],
 			                $cascadePrivs["usergroups"], 'group', ! $hasUserGrant);
 			$i++;
 		}
@@ -833,11 +841,19 @@ function selectNode() {
 			$text .= "    <TH>$img</TH>";
 		}
 		$text .= "  </TR>";
-		$groups = array_unique(array_merge(array_keys($privs["usergroups"]), 
-		                      array_keys($cascadePrivs["usergroups"])));
-		sort($groups);
-		foreach($groups as $group) {
-			$tmpArr = getUserPrivRowHTML($group, $i, $privs["usergroups"],
+		$groupids = array_unique(array_merge(array_keys($privs["usergroups"]), 
+		                         array_keys($cascadePrivs["usergroups"])));
+		$allids = implode(',', $groupids);
+		$query = "SELECT id "
+		       . "FROM usergroup "
+		       . "WHERE id IN ($allids) "
+		       . "ORDER BY name";
+		$qh = doQuery($query);
+		$orderedgroups = array();
+		while($row = mysql_fetch_assoc($qh))
+			$orderedgroups[] = $row['id'];
+		foreach($orderedgroups as $id) {
+			$tmpArr = getUserPrivRowHTML($id, $i, $privs["usergroups"],
 			                  $usertypes["users"], $cascadePrivs["usergroups"],
 			                  'group', ! $hasUserGrant);
 			$text .= $tmpArr['html'];
@@ -1432,7 +1448,8 @@ function userLookup() {
 		       .        "remoteIP, "
 		       .        "code "
 		       . "FROM loginlog "
-		       . "WHERE user = '{$userdata['unityid']}' AND "
+		       . "WHERE (user = '{$userdata['unityid']}' OR "
+		       .       "user = '{$userdata['unityid']}@{$userdata['affiliation']}') AND "
 		       .       "affiliationid = {$userdata['affiliationid']} "
 		       . "ORDER BY timestamp DESC "
 		       . "LIMIT 8";
@@ -1718,11 +1735,10 @@ function printUserPrivRow($privname, $ro
 	$allprivs = $cascadeprivs + $privs;
 	print "  <TR>\n";
 	if($usergroup == 'group') {
-		$id = $allprivs[$privname]['id'];
-		print "    <TH><span id=\"usergrp$id\" onmouseover=getGroupMembers(";
-		print "\"$id\",\"usergrp$id\",\"ugmcont\"); onmouseout=";
-		print "getGroupMembersCancel(\"usergrp$id\");>$privname";
-		if($usergroup == 'group' && ! empty($allprivs[$privname]['affiliation']))
+		print "    <TH><span id=\"usergrp$privname\" onmouseover=getGroupMembers(";
+		print "\"$privname\",\"usergrp$privname\",\"ugmcont\"); onmouseout=";
+		print "getGroupMembersCancel(\"usergrp$privname\");>{$allprivs[$privname]['name']}";
+		if(! empty($allprivs[$privname]['affiliation']))
 			print "@{$allprivs[$privname]['affiliation']}";
 		print "</span></TH>\n";
 	}
@@ -1754,7 +1770,7 @@ function printUserPrivRow($privname, $ro
 	}
 	elseif($usergroup == 'group') {
 		$usergroup = 2;
-		$name = "privrow[{$allprivs[$privname]['id']}:block]";
+		$name = "privrow[$privname:block]";
 	}
 	print "    <TD align=center bgcolor=gray>\n";
 	print "<INPUT type=checkbox dojoType=dijit.form.CheckBox id=ck$rownum:block ";
@@ -1773,7 +1789,7 @@ function printUserPrivRow($privname, $ro
 	if($usergroup == 1)
 		$name = "privrow[$privname:cascade]";
 	else
-		$name = "privrow[{$allprivs[$privname]['id']}:cascade]";
+		$name = "privrow[$privname:cascade]";
 	print "    <TD align=center bgcolor=\"#008000\" id=cell$rownum:0>";
 	print "<INPUT type=checkbox dojoType=dijit.form.CheckBox id=ck$rownum:0 ";
 	print "name=\"$name\" onClick=\"privChange(this.checked, $rownum, 0, ";
@@ -1809,10 +1825,7 @@ function printUserPrivRow($privname, $ro
 				$value = "value=single";
 			}
 		}
-		if($usergroup == 1)
-			$name = "privrow[$privname:$type]";
-		else
-			$name = "privrow[{$allprivs[$privname]['id']}:$type]";
+		$name = "privrow[$privname:$type]";
 		print "    <TD align=center id=cell$rownum:$j $bgcolor><INPUT ";
 		print "type=checkbox dojoType=dijit.form.CheckBox name=\"$name\" ";
 		print "id=ck$rownum:$j $checked $value $disabled ";
@@ -1856,11 +1869,10 @@ function getUserPrivRowHTML($privname, $
 	$js = "";
 	$text .= "<TR>";
 	if($usergroup == 'group') {
-		$id = $allprivs[$privname]['id'];
-		$text .= "<TH><span id=\"usergrp$id\" onmouseover=getGroupMembers(";
-		$text .= "\"$id\",\"usergrp$id\",\"ugmcont\"); onmouseout=";
-		$text .= "getGroupMembersCancel(\"usergrp$id\");>$privname";
-		if($usergroup == 'group' && ! empty($allprivs[$privname]['affiliation']))
+		$text .= "<TH><span id=\"usergrp$privname\" onmouseover=getGroupMembers(";
+		$text .= "\"$privname\",\"usergrp$privname\",\"ugmcont\"); onmouseout=";
+		$text .= "getGroupMembersCancel(\"usergrp$privname\");>{$allprivs[$privname]['name']}";
+		if(! empty($allprivs[$privname]['affiliation']))
 			$text .= "@{$allprivs[$privname]['affiliation']}";
 		$text .= "</span></TH>";
 	}
@@ -1892,7 +1904,7 @@ function getUserPrivRowHTML($privname, $
 	}
 	elseif($usergroup == 'group') {
 		$usergroup = 2;
-		$name = "privrow[{$allprivs[$privname]['id']}:block]";
+		$name = "privrow[$privname:block]";
 	}
 	$text .= "    <TD align=center bgcolor=gray><INPUT type=checkbox ";
 	$text .= "dojoType=dijit.form.CheckBox id=ck$rownum:block name=\"$name\" ";
@@ -1908,10 +1920,7 @@ function getUserPrivRowHTML($privname, $
 		$checked = "checked";
 	else
 		$checked = "";
-	if($usergroup == 1)
-		$name = "privrow[$privname:cascade]";
-	else
-		$name = "privrow[{$allprivs[$privname]['id']}:cascade]";
+	$name = "privrow[$privname:cascade]";
 	$text .= "    <TD align=center bgcolor=\"#008000\" id=cell$rownum:0>";
 	$text .= "<INPUT type=checkbox dojoType=dijit.form.CheckBox id=ck$rownum:0 ";
 	$text .= "name=\"$name\" onClick=\"privChange(this.checked, $rownum, 0, ";
@@ -1947,10 +1956,7 @@ function getUserPrivRowHTML($privname, $
 				$value = "value=single";
 			}
 		}
-		if($usergroup == 1)
-			$name = "privrow[$privname:$type]";
-		else
-			$name = "privrow[{$allprivs[$privname]['id']}:$type]";
+		$name = "privrow[$privname:$type]";
 		$text .= "    <TD align=center id=cell$rownum:$j $bgcolor><INPUT ";
 		$text .= "type=checkbox dojoType=dijit.form.CheckBox name=\"$name\" ";
 		$text .= "id=ck$rownum:$j $checked $value $disabled ";
@@ -2233,14 +2239,14 @@ function jsonGetResourceGroupMembers() {
 ///        )\n
 ///    [usergroups] => Array\n
 ///        (\n
-///            [group0] => Array\n
+///            [group0 id] => Array\n
 ///                (\n
 ///                    [0] => priv0\n
 ///                        ...\n
 ///                    [N] => privN\n
 ///                )\n
 ///                ...\n
-///            [groupN] => Array()\n
+///            [groupN id] => Array()\n
 ///        )\n
 ///)
 ///
@@ -2326,13 +2332,14 @@ function getNodePrivileges($node, $type=
 		       . "ORDER BY g.name";
 		$qh = doQuery($query, 352);
 		while($row = mysql_fetch_assoc($qh)) {
-			if(array_key_exists($row["groupname"], $privs["usergroups"]))
-				array_push($privs["usergroups"][$row["groupname"]]['privs'], $row["priv"]);
+			if(array_key_exists($row["id"], $privs["usergroups"]))
+				array_push($privs["usergroups"][$row["id"]]['privs'], $row["priv"]);
 			else
-				$privs["usergroups"][$row["groupname"]] = array('id' => $row['id'],
-				                                                'affiliationid' => $row['affiliationid'],
-				                                                'affiliation' => $row['affiliation'],
-				                                                'privs' => array($row['priv']));
+				$privs["usergroups"][$row["id"]] = array('id' => $row['id'],
+				                                         'name' => $row['groupname'],
+				                                         'affiliationid' => $row['affiliationid'],
+				                                         'affiliation' => $row['affiliation'],
+				                                         'privs' => array($row['priv']));
 		}
 	}
 	$_SESSION['nodeprivileges'][$key] = $privs;
@@ -2367,14 +2374,14 @@ function getNodePrivileges($node, $type=
 ///        )\n
 ///    [usergroups] => Array\n
 ///        (\n
-///            [group0] => Array\n
+///            [group0 id] => Array\n
 ///                (\n
 ///                    [0] => priv0\n
 ///                        ...\n
 ///                    [N] => privN\n
 ///                )\n
 ///                ...\n
-///            [groupN] => Array()\n
+///            [groupN id] => Array()\n
 ///        )\n
 ///)
 ///
@@ -2545,7 +2552,7 @@ function getNodeCascadePrivileges($node,
 		while(count($mynodelist)) {
 			$node = array_pop($mynodelist);
 			# get all groups with block set at this node and remove any cascaded privs
-			$query = "SELECT g.name AS groupname "
+			$query = "SELECT g.id "
 			       . "FROM usergroup g, "
 			       .      "userpriv up, "
 			       .      "userprivtype t "
@@ -2556,7 +2563,7 @@ function getNodeCascadePrivileges($node,
 			       .       "t.name = 'block'";
 			$qh = doQuery($query, 357);
 			while($row = mysql_fetch_assoc($qh)) {
-				unset($privs["usergroups"][$row["groupname"]]);
+				unset($privs["usergroups"][$row["id"]]);
 			}
 
 			# get all privs for groups with cascaded privs
@@ -2585,14 +2592,15 @@ function getNodeCascadePrivileges($node,
 			$qh = doQuery($query, 358);
 			while($row = mysql_fetch_assoc($qh)) {
 				// if we've already seen this group, add it to the user's privs
-				if(array_key_exists($row["groupname"], $privs["usergroups"]))
-					array_push($privs["usergroups"][$row["groupname"]]['privs'], $row["priv"]);
+				if(array_key_exists($row["id"], $privs["usergroups"]))
+					array_push($privs["usergroups"][$row["id"]]['privs'], $row["priv"]);
 				// if we haven't seen this group, create an array containing this priv
 				else 
-					$privs["usergroups"][$row["groupname"]] = array('id' => $row['id'],
-					                                                'affiliationid' => $row['affiliationid'],
-					                                                'affiliation' => $row['affiliation'],
-					                                                'privs' => array($row['priv']));
+					$privs["usergroups"][$row["id"]] = array('id' => $row['id'],
+					                                         'name' => $row['groupname'],
+					                                         'affiliationid' => $row['affiliationid'],
+					                                         'affiliation' => $row['affiliation'],
+					                                         'privs' => array($row['priv']));
 			}
 		}
 	}
@@ -2993,15 +3001,12 @@ function checkUserHasPriv($priv, $uid, $
 	foreach($_user["groups"] as $groupid => $groupname) {
 		// if group (has $priv at this node) ||
 		# (has cascaded $priv && ! have block at this node) return 1
-		if((array_key_exists($groupname, $privs["usergroups"]) &&
-		   $groupid == $privs['usergroups'][$groupname]['id'] &&
-		   in_array($priv, $privs["usergroups"][$groupname]['privs'])) ||
-		   ((array_key_exists($groupname, $cascadePrivs["usergroups"]) &&
-		   $groupid == $cascadePrivs['usergroups'][$groupname]['id'] &&
-		   in_array($priv, $cascadePrivs["usergroups"][$groupname]['privs'])) &&
-		   (! array_key_exists($groupname, $privs["usergroups"]) ||
-		   (! in_array("block", $privs["usergroups"][$groupname]['privs']) && 
-		   $groupid == $privs['usergroups'][$groupname]['id'])))) {
+		if((array_key_exists($groupid, $privs["usergroups"]) &&
+		   in_array($priv, $privs["usergroups"][$groupid]['privs'])) ||
+		   ((array_key_exists($groupid, $cascadePrivs["usergroups"]) &&
+		   in_array($priv, $cascadePrivs["usergroups"][$groupid]['privs'])) &&
+		   (! array_key_exists($groupid, $privs["usergroups"]) ||
+		   (! in_array("block", $privs["usergroups"][$groupid]['privs']))))) {
 			$_SESSION['userhaspriv'][$key] = 1;
 			return 1;
 		}

Modified: vcl/trunk/web/.ht-inc/xmlrpcWrappers.php
URL: http://svn.apache.org/viewvc/vcl/trunk/web/.ht-inc/xmlrpcWrappers.php?rev=1632463&r1=1632462&r2=1632463&view=diff
==============================================================================
--- vcl/trunk/web/.ht-inc/xmlrpcWrappers.php (original)
+++ vcl/trunk/web/.ht-inc/xmlrpcWrappers.php Fri Oct 17 02:58:10 2014
@@ -1858,20 +1858,22 @@ function XMLRPCgetUserGroupPrivs($name, 
 	if($rc['status'] == 'error')
 		return $rc;
 
+	$groupid = $rc['id'];
+
 	$privileges = array();
 	$nodePrivileges = getNodePrivileges($nodeid, 'usergroups');
 	$cascadedNodePrivileges = getNodeCascadePrivileges($nodeid, 'usergroups'); 
 	$cngp = $cascadedNodePrivileges['usergroups'];
 	$ngp = $nodePrivileges['usergroups'];
-	if(array_key_exists($name, $cngp)) {
-		foreach($cngp[$name]['privs'] as $p) {
-			if(! array_key_exists($name, $ngp) ||
-			   ! in_array("block", $ngp[$name]['privs']))
+	if(array_key_exists($groupid, $cngp)) {
+		foreach($cngp[$groupid]['privs'] as $p) {
+			if(! array_key_exists($groupid, $ngp) ||
+			   ! in_array("block", $ngp[$groupid]['privs']))
 				array_push($privileges, $p);
 		}
 	}
-	if(array_key_exists($name, $ngp)) {
-		foreach($ngp[$name]['privs'] as $p) {
+	if(array_key_exists($groupid, $ngp)) {
+		foreach($ngp[$groupid]['privs'] as $p) {
 			if($p != "block")
 				array_push($privileges, $p);
 		}
@@ -1925,7 +1927,6 @@ function XMLRPCaddUserGroupPriv($name, $
 		return $rc;
 
 	$groupid = $rc['id'];
-	#$name = "$name@$affiliation";
 	$perms = explode(':', $permissions);
 	$usertypes = getTypes('users');
 	array_push($usertypes["users"], "block");
@@ -1942,8 +1943,8 @@ function XMLRPCaddUserGroupPriv($name, $
 	$cnp = getNodeCascadePrivileges($nodeid, "usergroups");
 	$np = getNodePrivileges($nodeid, "usergroups", $cnp);
 
-	if(array_key_exists($name, $np['usergroups'])) {
-		$diff = array_diff($perms, $np['usergroups'][$name]['privs']);
+	if(array_key_exists($groupid, $np['usergroups'])) {
+		$diff = array_diff($perms, $np['usergroups'][$groupid]['privs']);
 		if(empty($diff))
 			return array('status' => 'success');
 	}
@@ -1999,7 +2000,6 @@ function XMLRPCremoveUserGroupPriv($name
 		return $rc;
 
 	$groupid = $rc['id'];
-	#$name = "$name@$affiliation";
 	$perms = explode(':', $permissions);
 	$usertypes = getTypes('users');
 	array_push($usertypes["users"], "block");
@@ -2015,10 +2015,10 @@ function XMLRPCremoveUserGroupPriv($name
 	$cnp = getNodeCascadePrivileges($nodeid, "usergroups");
 	$np = getNodePrivileges($nodeid, "usergroups");
 
-	if(array_key_exists($name, $cnp['usergroups']) &&
-	   (! array_key_exists($name, $np['usergroups']) ||
-	   ! in_array('block', $np['usergroups'][$name]))) {
-		$intersect = array_intersect($cnp['usergroups'][$name]['privs'], $perms);
+	if(array_key_exists($groupid, $cnp['usergroups']) &&
+	   (! array_key_exists($groupid, $np['usergroups']) ||
+	   ! in_array('block', $np['usergroups'][$groupid]['privs']))) {
+		$intersect = array_intersect($cnp['usergroups'][$groupid]['privs'], $perms);
 		if(count($intersect)) {
 			return array('status' => 'error',
 			             'errorcode' => 80,
@@ -2026,7 +2026,7 @@ function XMLRPCremoveUserGroupPriv($name
 		}
 	}
 
-	$diff = array_diff($np['usergroups'][$name]['privs'], $perms);
+	$diff = array_diff($np['usergroups'][$groupid]['privs'], $perms);
 	if(count($diff) == 1 && in_array("cascade", $diff))
 		array_push($perms, "cascade");