Author: david
Date: Fri Sep 18 17:42:19 2009
New Revision: 3419

Log:
Go up acl group hierarchy if permissions not found at current group level. Add 
'anonymous' and 'authenticated' users to acl chain.

Modified:
   trunk/plugins/qbAclPlugin/lib/QubitAcl.class.php

Modified: trunk/plugins/qbAclPlugin/lib/QubitAcl.class.php
==============================================================================
--- trunk/plugins/qbAclPlugin/lib/QubitAcl.class.php    Fri Sep 18 16:51:33 
2009        (r3418)
+++ trunk/plugins/qbAclPlugin/lib/QubitAcl.class.php    Fri Sep 18 17:42:19 
2009        (r3419)
@@ -133,6 +133,13 @@
 
   protected static function checkUserPermissions($user, $acoChain, $actionId, 
$options = array())
   {
+    // Anonymous users, check (anonymous) group permissions
+    if (null == $user)
+    {
+
+      return self::INHERIT;
+    }
+
     $criteria = new Criteria;
     $criteria->add(QubitAclPermission::USER_ID, $user->id, Criteria::EQUAL);
     $criteria->add(QubitAclPermission::ACTION_ID, $actionId, Criteria::EQUAL);
@@ -143,20 +150,18 @@
     return self::checkAcoPermissionChain($acoChain, $criteria, $options);
   }
 
-  protected static function checkGroupPermissions($user, $acoChain, $actionId, 
$options = array())
+  protected static function addObjectCriteria($criteria, $objectId)
   {
-    $criteria = new Criteria;
-    $criteria->add(QubitAclUserGroup::USER_ID, $user->id, Criteria::EQUAL);
-    $criteria->addJoin(QubitAclUserGroup::GROUP_ID, 
QubitAclPermission::GROUP_ID, Criteria::INNER_JOIN);
-    $criteria->add(QubitAclPermission::ACTION_ID, $actionId, Criteria::EQUAL);
-
-    // Check 'higher level' groups first
-    $criteria->addAscendingOrderByColumn(QubitAclPermission::GROUP_ID);
-
-    // Check 'last-in' permissions first
-    $criteria->addDescendingOrderByColumn(QubitAclPermission::ID);
+    if (null == $objectId)
+    {
+      $criteria->add(QubitAclPermission::OBJECT_ID, null, Criteria::ISNULL);
+    }
+    else
+    {
+      $criteria->add(QubitAclPermission::OBJECT_ID, $objectId, 
Criteria::EQUAL);
+    }
 
-    return self::checkAcoPermissionChain($acoChain, $criteria, $options);
+    return $criteria;
   }
 
   protected static function checkAcoPermissionChain($acoChain, $criteria, 
$options = array())
@@ -195,18 +200,95 @@
     return $authorize;
   }
 
-  protected static function addObjectCriteria($criteria, $objectId)
+  protected static function checkGroupPermissions($user, $acoChain, $actionId, 
$options = array())
   {
-    if (null == $objectId)
+    $authorize = self::INHERIT;
+    $groupsByGeneration = self::getGroupsByGeneration($user);
+
+    // Test siblings from youngest (last) to oldest (first) generation
+    while ($currentGeneration = array_pop($groupsByGeneration))
     {
-      $criteria->add(QubitAclPermission::OBJECT_ID, null, Criteria::ISNULL);
+      foreach ($currentGeneration as $groupId)
+      {
+        $group = QubitAclGroup::getById($groupId);
+
+        $criteria = new Criteria;
+        $criteria->add(QubitAclPermission::GROUP_ID, $groupId, 
Criteria::EQUAL);
+        $criteria->add(QubitAclPermission::ACTION_ID, $actionId, 
Criteria::EQUAL);
+
+        $groupAuthorize = self::checkAcoPermissionChain($acoChain, $criteria, 
$options);
+
+        if (self::GRANT == $groupAuthorize)
+        {
+          // If *any* sibling group returns "grant" reponse, then grant access
+          $authorize = self::GRANT;
+          break 2;
+        }
+        else if (self::DENY == $groupAuthorize)
+        {
+          // If siblings return one (or more) 'deny' reponses, and no 'grant'
+          // responses then deny access
+          $authorize = self::DENY;
+        }
+      }
+
+      // If the current generation gives 'grant' or 'deny' result, don't check
+      // ancestor generations
+      if (self::INHERIT != $authorize)
+      {
+        break;
+      }
     }
-    else
+
+    return $authorize;
+  }
+
+  protected static function getGroupsByGeneration($user)
+  {
+    $groupsByGeneration = array();
+
+    if ($user == null)
     {
-      $criteria->add(QubitAclPermission::OBJECT_ID, $objectId, 
Criteria::EQUAL);
+
+      // If user is not logged in, then 'anonymous' group is only one
+      return array(0 => array(0 => QubitAclGroup::ANONYMOUS_ID));
     }
 
-    return $criteria;
+    // Get 1st order groups (link directory from user)
+    // Note: may be mixed generations (e.g. parents and children)
+    $criteria = new Criteria;
+    $criteria->add(QubitAclUserGroup::USER_ID, $user->id, Criteria::EQUAL);
+    $criteria->addJoin(QubitAclUserGroup::GROUP_ID, QubitAclGroup::ID, 
Criteria::INNER_JOIN);
+
+    if (0 == count($linkedGroups = QubitAclGroup::get($criteria)))
+    {
+      // user always belongs to the 'authenticated' group
+      $linkedGroups = 
array(QubitAclGroup::getById(QubitAclGroup::AUTHENTICATED_ID));
+    }
+
+    // Build a list of groups, organized by generation (siblings together)
+    foreach ($linkedGroups as $group)
+    {
+      $generation = 0;
+      $lineage = $group->getAncestors()->andSelf()->orderBy('lft');
+
+      foreach ($lineage as $node)
+      {
+        // Ignore the root node
+        if (QubitAclGroup::ROOT_ID != $node->id)
+        {
+          // Don't re-add siblings already in array
+          if (!isset($groupsByGeneration[$generation]) || !in_array($node->id, 
$groupsByGeneration[$generation]))
+          {
+            $groupsByGeneration[$generation][] = $node->id;
+          }
+
+          $generation++;
+        }
+      }
+    }
+
+    return $groupsByGeneration;
   }
 
   protected static function checkPermissionList($permissions, $parameters = 
array())

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Qubit Toolkit Commits" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.ca/group/qubit-commits?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to