Index: kernel/classes/ezrole.php
===================================================================
--- kernel/classes/ezrole.php	(Revision 20524)
+++ kernel/classes/ezrole.php	(Arbeitskopie)
@@ -571,7 +571,7 @@
     */
     static function accessArrayByUserID( $userIDArray )
     {
-        $roles = eZRole::fetchByUser( $userIDArray );
+        /*$roles = eZRole::fetchByUser( $userIDArray );
         $userLimitation = false;
 
         $accessArray = array();
@@ -606,6 +606,81 @@
                 }
             }
         }
+        return $accessArray;*/
+        $ini           = eZINI::instance();
+        $enableCaching = $ini->variable( 'RoleSettings', 'EnableCaching' );
+        $accessArray   = array();
+
+        if ( $enableCaching == 'true' )
+        {
+            $http = eZHTTPTool::instance();
+
+            if ( $http->hasSessionVariable( 'AccessArray' ) )
+            {
+                $expiredTimeStamp = 0;
+                $handler = eZExpiryHandler::instance();
+                if ( $handler->hasTimestamp( 'user-access-cache' ) )
+                {
+                    $expiredTimeStamp = $handler->timestamp( 'user-access-cache' );
+                }
+                else
+                {
+                    $handler->setTimestamp( 'user-access-cache', time() );
+                }
+
+                $userAccessTimestamp = $http->sessionVariable( 'AccessArrayTimestamp' );
+
+                if ( $userAccessTimestamp > $expiredTimeStamp )
+                {
+                    $accessArray = $http->sessionVariable( 'AccessArray' );
+                    return $accessArray;
+                }
+            }
+        }
+
+        $roles = eZRole::fetchByUser( $userIDArray );
+
+        $userLimitation = false;
+        foreach ( array_keys ( $roles )  as $roleKey )
+        {
+            $accessArray = array_merge_recursive( $accessArray, $roles[$roleKey]->accessArray() );
+            if ( $roles[$roleKey]->attribute( 'limit_identifier' ) )
+            {
+                $userLimitation = true;
+            }
+        }
+
+        if ( $userLimitation )
+        {
+            foreach( array_keys( $accessArray ) as $moduleKey )
+            {
+                foreach( array_keys( $accessArray[$moduleKey] ) as $functionKey )
+                {
+                    foreach( array_keys( $accessArray[$moduleKey][$functionKey] ) as $policyKey )
+                    {
+                        if ( is_array( $accessArray[$moduleKey][$functionKey][$policyKey] ) )
+                        {
+                            foreach( array_keys( $accessArray[$moduleKey][$functionKey][$policyKey] ) as $limitationKey )
+                            {
+                                $limitKeyArray =& $accessArray[$moduleKey][$functionKey][$policyKey][$limitationKey];
+                                if ( is_array( $limitKeyArray ) )
+                                {
+                                    $limitKeyArray = array_unique( $limitKeyArray );
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        if ( $enableCaching == 'true' )
+        {
+            $http = eZHTTPTool::instance();
+            $http->setSessionVariable( 'AccessArray', $accessArray );
+            $http->setSessionVariable( 'AccessArrayTimestamp', time() );
+        }
+
         return $accessArray;
     }
 
@@ -795,16 +870,18 @@
                     ezuser_role.role_id = '$this->ID'";
 
         $userRoleArray = $db->arrayQuery( $query );
-        $userRoles = array();
-        foreach ( $userRoleArray as $userRole )
+        $userRoles     = array();
+        if ( is_array( $userRoleArray ) )
         {
-            $role = array();
-            $role['user_object'] = eZContentObject::fetch( $userRole['user_id'] );
-            $role['user_role_id'] = $userRole['id'];
-            $role['limit_ident'] = $userRole['limit_identifier'];
-            $role['limit_value'] = $userRole['limit_value'];
-
-            $userRoles[] = $role;
+            foreach ( $userRoleArray as $userRole )
+            {
+                $role                 = array();
+                $role['user_object']  = eZContentObject::fetch( $userRole['user_id'] );
+                $role['user_role_id'] = $userRole['id'];
+                $role['limit_ident']  = $userRole['limit_identifier'];
+                $role['limit_value']  = $userRole['limit_value'];
+                $userRoles[]          = $role;
+            }
         }
         return $userRoles;
     }
