From 2fd6648349a6e255cb91c381f4d4da6b7e15a4ec Mon Sep 17 00:00:00 2001 From: nbm Date: Thu, 21 Jul 2005 10:58:40 +0000 Subject: [PATCH] GroupUtil provides high-level Group functions, as well as providing for other common Group-related needs. --- lib/groups/GroupUtil.php | 199 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+), 0 deletions(-) create mode 100644 lib/groups/GroupUtil.php diff --git a/lib/groups/GroupUtil.php b/lib/groups/GroupUtil.php new file mode 100644 index 0000000..5bf7c4c --- /dev/null +++ b/lib/groups/GroupUtil.php @@ -0,0 +1,199 @@ + array(2, 3, 4), + * 2 => array(5, 3), + * 3 => array(5), + * } + * + * This function returns a list of group ids from the group + * membership array that may safely to added to the original group. + */ + // STATIC + function filterCyclicalGroups ($iTargetGroupID, $aGroupMemberships) { + $aReturnGroupIDs = array(); + + // PHP5: clone/copy + $aLocalGroupMemberships = $aGroupMemberships; + + // In case we get given ourself, we know we can't add ourselves + // to each other. + unset($aLocalGroupMemberships[$iTargetGroupID]); + + // Groups that have no group members can safely be added to the + // group. Simplifies debugging of later code. + foreach ($aLocalGroupMemberships as $k => $v) { + if (is_null($v) || (!count($v))) { + unset($aLocalGroupMemberships[$k]); + $aReturnGroupIDs[] = $k; + } + } + + $aBadGroupIDs = GroupUtil::listBadGroups($iTargetGroupID, $aLocalGroupMemberships); + + foreach ($aLocalGroupMemberships as $k => $v) { + if (!in_array($k, $aBadGroupIDs)) { + $aReturnGroupIDs[] = $k; + } + } + + return $aReturnGroupIDs; + } + // }}} + + // {{{ + /** + * This utility function takes a group whose membership is being + * considered, and a dictionary with group ids as keys and a list of + * their member groups as values. + * + * $aGroupMembership = array( + * 1 => array(2, 3, 4), + * 2 => array(5, 3), + * 3 => array(5), + * } + * + * This function returns a list of group ids from the group + * membership array that can't be safely to added to the original + * group. + */ + // STATIC + function listBadGroups ($iTargetGroupID, $aGroupMemberships) { + // PHP5: clone/copy + $aLocalGroupMemberships = $aGroupMemberships; + + // Two ways to do this - either expand the list we're given of + // immediate children to all children, OR mark group IDs as bad + // (starting with the group we're planning to add the groups + // into), and cycle while we're finding new bad groups. + // + // Marking bad group IDs seems like the easier-to-understand + // option. + + $aBadGroupIDs = array($iTargetGroupID); + $aLastBadGroupCount = 0; + + // While we've discovered new bad groups... + while (count($aBadGroupIDs) > $aLastBadGroupCount) { + $aLastBadGroupCount = count($aBadGroupIDs); + foreach ($aLocalGroupMemberships as $iThisGroupID => $aGroupIDs) { + + // This check isn't strictly necessary, as the groups + // should be removed from the local list of groups in + // the later check, but who knows whether one can unset + // array keys while iterating over the list. + + if (in_array($iThisGroupID, $aBadGroupIDs)) { + // print "Not considering $iThisGroupID, it is in bad group list: " . print_r($aBadGroupIDs, true); + unset($aLocalGroupMemberships[$iThisGroupID]); + continue; + } + + foreach ($aGroupIDs as $k) { + if (in_array($k, $aBadGroupIDs)) { + // print "Adding $iThisGroupID to bad list, because it contains $k, which is in bad group list: " . print_r($aBadGroupIDs, true); + unset($aLocalGroupMemberships[$iThisGroupID]); + $aBadGroupIDs[] = $iThisGroupID; + break; + } + } + } + } + return $aBadGroupIDs; + } + // }}} + + // {{{ addGroup + function add($aGroupDetails) { + $aDefaultDetails = array( + "is_unit_admin" => false, + "is_system_admin" => false, + ); + $aDetails = array_merge($aDefaultDetails, $aGroupDetails); + if (is_null(KTUtil::arrayGet($aDetails, "name"))) { + return PEAR::raiseError("Needed key name is not provided"); + } + $oGroup = new Group($aDetails["name"], + $aDetails["is_unit_admin"], + $aDetails["is_system_admin"]); + $ret = $oGroup->create(); + if ($ret === false) { + return PEAR::raiseError("Legacy error creating group, may be: " . $_SESSION["errorMessage"]); + } + if (PEAR::isError($ret)) { + return $ret; + } + if ($ret !== true) { + return PEAR::raiseError("Non-true and non-error return value"); + } + return true; + } + // }}} + + // {{{ list + function listGroups($aGivenOptions = null) { + if (is_null($aGivenOptions)) { + $aGivenOptions = array(); + } + $aDefaultOptions = array( + //"active" => true, + ); + $aOptions = array_merge($aDefaultOptions, $aGivenOptions); + + $aWhere = array(); + /* if ($aOptions["active"] === true) { + $aWhere[] = array("active = ?", true); + } */ + + $sWhere = KTUtil::whereToString($aWhere); + + return Group::getList($sWhere); + } + // }}} + + // {{{ + function getNameForID($id) { + global $default; + $sName = lookupField($default->groups_table, "name", "id", $id); + return $sName; + } + // }}} + +} +// }}} + +?> -- libgit2 0.21.4