Changeset 26329


Ignore:
Timestamp:
06/12/10 11:27:15 (7 years ago)
Author:
flack
Message:

remove tmp object creation and rely on guid instead, refs #1848

Location:
branches/developers/flack/acltuning/midcom.core/midcom
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/developers/flack/acltuning/midcom.core/midcom/core/collector.php

    r26289 r26329  
    283283        $classname = $this->_real_class;
    284284
    285         $user_id = false;
    286 
    287285        foreach ($result as $object_guid => $empty_copy)
    288286        {
  • branches/developers/flack/acltuning/midcom.core/midcom/services/auth.php

    r26290 r26329  
    483483        $user_id = $this->acl->get_user_id($user);
    484484
    485         return $this->acl->can_do_byguid($privilege, $content_object->guid, get_class($content_object), $user_id);
     485        if ($_MIDCOM->dbclassloader->is_midcom_db_object($content_object))
     486        {
     487            $object = $content_object;
     488        }
     489        else
     490        {
     491            $object = $_MIDCOM->dbfactory->convert_midgard_to_midcom($content_object);
     492            if (is_null($object))
     493            {
     494                debug_push_class(__CLASS__, __FUNCTION__);
     495                debug_add('Failed to convert an object, falling back to false for the object in question');
     496                debug_pop();
     497                return false;
     498            }
     499        }
     500
     501        return $this->acl->can_do_byguid($privilege, $object->guid, get_class($object), $user_id);
    486502    }
    487503
     
    558574    function get_privileges(&$content_object, $user = null)
    559575    {
     576        if ($_MIDCOM->dbclassloader->is_midcom_db_object($content_object))
     577        {
     578            $object = $content_object;
     579        }
     580        else
     581        {
     582            $object = $_MIDCOM->dbfactory->convert_midgard_to_midcom($content_object);
     583            if (is_null($object))
     584            {
     585                debug_push_class(__CLASS__, __FUNCTION__);
     586                debug_add('Failed to convert an object, falling back to empty privilege set for the object in question');
     587                debug_pop();
     588                return array();
     589            }
     590        }
     591
    560592        $user_id = $this->acl->get_user_id($user);
    561593
    562         return $this->acl->get_privileges_byguid($content_object->guid, get_class($content_object), $user_id);
     594        return $this->acl->get_privileges_byguid($object->guid, get_class($object), $user_id);
    563595    }
    564596
  • branches/developers/flack/acltuning/midcom.core/midcom/services/auth/acl.php

    r26291 r26329  
    418418     * usage. It will assign them to the $_*_default_class_privileges members.
    419419     *
    420      * @param MidcomDBAObject $class An instance of the object for which the class defaults should be
    421      *     loaded. Be aware, that this may be a simply a default constructed class instance.
     420     * @param string $class The class name for which defaults should be loaded.
    422421     * @access private
    423422     */
    424     private function _load_class_magic_privileges(&$class)
     423    private function _load_class_magic_privileges($class)
    425424    {
    426425        // Check if we have loaded these privileges already...
    427         if (!isset($class->__mgdschema_class_name__))
    428         {
    429             $loadable_class = get_class($class);
    430         }
    431         else
    432         {
    433             $loadable_class = $class->__mgdschema_class_name__;
    434         }
    435 
    436         if (array_key_exists($loadable_class, self::$_default_magic_class_privileges))
     426        if (array_key_exists($class, self::$_default_magic_class_privileges))
    437427        {
    438428            return;
    439429        }
    440430
    441         if (!method_exists($class, 'get_class_magic_default_privileges'))
    442         {
    443             self::$_default_magic_class_privileges[$loadable_class] = array
     431        $object = new $class();
     432
     433        if (!method_exists($object, 'get_class_magic_default_privileges'))
     434        {
     435            self::$_default_magic_class_privileges[$class] = array
    444436            (
    445437                'EVERYONE' => array(),
     
    450442        }
    451443
    452         $privs = $class->get_class_magic_default_privileges();
    453         self::$_default_magic_class_privileges[$loadable_class] = $privs;
     444        $privs = $object->get_class_magic_default_privileges();
     445
     446        self::$_default_magic_class_privileges[$class] = $privs;
    454447
    455448        return;
     
    590583            {
    591584                $tmp_object = $class;
    592             }
    593             $this->_load_class_magic_privileges($tmp_object);
     585                $class = get_class($tmp_object);
     586            }
     587            $this->_load_class_magic_privileges($class);
    594588        }
    595589        else
     
    604598            if ($tmp_object !== null)
    605599            {
    606                 if (!isset($tmp_object->__mgdschema_class_name__))
    607                 {
    608                     $tmp_class_name = get_class($tmp_object);
    609                 }
    610                 else
    611                 {
    612                     $tmp_class_name = $tmp_object->__mgdschema_class_name__;
    613                 }
    614 
    615600                $default_magic_class_privileges = array_merge
    616601                (
    617                     self::$_default_magic_class_privileges[$tmp_class_name]['EVERYONE'],
    618                     self::$_default_magic_class_privileges[$tmp_class_name]['ANONYMOUS']
     602                    self::$_default_magic_class_privileges[$class]['EVERYONE'],
     603                    self::$_default_magic_class_privileges[$class]['ANONYMOUS']
    619604                );
    620605            }
     
    629614            else
    630615            {
    631                 if (!isset($tmp_object->__mgdschema_class_name__))
    632                 {
    633                     $tmp_class_name = get_class($tmp_object);
    634                 }
    635                 else
    636                 {
    637                     $tmp_class_name = $tmp_object->__mgdschema_class_name__;
    638                 }
    639 
    640616                $user_per_class_privileges = $user->get_per_class_privileges($tmp_object);
    641617                $default_magic_class_privileges = array_merge
    642618                (
    643                     self::$_default_magic_class_privileges[$tmp_class_name]['EVERYONE'],
    644                     self::$_default_magic_class_privileges[$tmp_class_name]['USERS']
     619                    self::$_default_magic_class_privileges[$class]['EVERYONE'],
     620                    self::$_default_magic_class_privileges[$class]['USERS']
    645621                );
    646622            }
     
    785761     *
    786762     * @param string $object_guid A Midgard GUID pointing to an object
    787      * @param string $object_class Class of the object in question
     763     * @param string $object_class DBA Class of the object in question
    788764     * @param string $user_id The user against which to check the privilege, defaults to the currently authenticated user.
    789765     *     You may specify "EVERYONE" instead of an object to check what an anonymous user can do.
     
    818794        //debug_pop();
    819795
    820         /* FIXME! We create new instance of the same class, which means we will check privileges once again
    821          * for newly created object, which means we will create another one object once again.... and so on.
    822          * This may produce very ugly loops */
    823         $dummy_object_init = new $object_class();
    824         if ($_MIDCOM->dbclassloader->is_midcom_db_object($dummy_object_init))
    825         {
    826             $dummy_object = $dummy_object_init;
    827         }
    828         else
    829         {
    830             $dummy_object = $_MIDCOM->dbfactory->convert_midgard_to_midcom($dummy_object_init);
    831             if (is_null($dummy_object))
    832             {
    833                 debug_push_class(__CLASS__, __FUNCTION__);
    834                 debug_add('Failed to convert an object, falling back to an empty privilege set for the object in question. See debug level log for details.');
    835                 debug_pop();
    836                 return;
    837             }
    838         }
    839 
    840         $this->_load_class_magic_privileges($dummy_object);
    841         $dummy_object->__guid = $object_guid;
    842 
     796        $this->_load_class_magic_privileges($object_class);
    843797
    844798        // content privileges
    845         $content_privileges = self::_collect_content_privileges($dummy_object, $user_id);
     799        $content_privileges = self::_collect_content_privileges($object_guid, $user_id, $object_class);
    846800
    847801        $user = $this->auth->get_user($user_id);
     
    853807        {
    854808            $user_privileges = $user->get_privileges();
    855             $user_per_class_privileges = $user->get_per_class_privileges($dummy_object);
     809            $user_per_class_privileges = $this->_get_user_per_class_privileges($object_class, $user);
    856810        }
    857811        else
     
    867821        $full_privileges = array_merge(
    868822            self::$_default_privileges,
    869             self::$_default_magic_class_privileges[$dummy_object->__mgdschema_class_name__]['EVERYONE'],
    870             self::$_default_magic_class_privileges[$dummy_object->__mgdschema_class_name__][$dmcp_user],
     823            self::$_default_magic_class_privileges[$object_class]['EVERYONE'],
     824            self::$_default_magic_class_privileges[$object_class][$dmcp_user],
    871825            $user_privileges,
    872826            $user_per_class_privileges,
     
    880834        }
    881835        self::$_privileges_cache[$cache_id] = $full_privileges;
     836    }
     837
     838    private function _get_user_per_class_privileges($classname, $user)
     839    {
     840        static $cache = array();
     841
     842        $cache_id = $user->id . '::' . $classname;
     843
     844        if (array_key_exists($cache_id, $cache))
     845        {
     846            return $cache[$cache_id];
     847        }
     848
     849        $tmp_object = new $classname;
     850
     851        $cache[$cache_id] = $user->get_per_class_privileges($tmp_object);
     852
     853        return $cache[$cache_id];
     854    }
     855
     856
     857    private static function _get_parent_class($classname)
     858    {
     859        static $cache = array();
     860
     861        if (array_key_exists($classname, $cache))
     862        {
     863            return $cache[$classname];
     864        }
     865
     866        $tmp_object = new $classname();
     867
     868        $cache[$classname] = $tmp_object->get_dba_parent_class();
     869
     870        return $cache[$classname];
    882871    }
    883872
     
    902891     *
    903892     * @access private
    904      * @param mixed &$arg A reference to the GUID or the full object instance for which we should load privileges.
     893     * @param $guid The GUID for which we should load privileges.
    905894     * @param string $user_id The MidCOM user assignee for which we should collect the privileges.
     895     * @param $class The DBA classname
    906896     * @return Array An array of privilege_name => privilege_value pairs valid for the given user.
    907897     * @static
    908898     */
    909     private static function _collect_content_privileges($arg, $user_id)
    910     {
    911         // set $object and $guid
    912         if (mgd_is_guid($arg))
    913         {
    914             $object = null;
    915             $guid = $arg;
    916         }
    917         elseif (is_object($arg))
    918         {
    919             $object = $arg;
    920             $guid = null;
    921 
    922             if (   isset($object->guid)
    923                 && mgd_is_guid($object->guid))
    924             {
    925                 $guid = $object->guid;
    926             }
    927             elseif (   isset($object->__guid)
    928                     && mgd_is_guid($object->__guid))
    929             {
    930                 $guid = $object->__guid;
    931             }
    932         }
    933 
    934         // guid not found => err
    935         if ($guid === null)
    936         {
    937             return array();
    938         }
    939 
     899    private static function _collect_content_privileges($guid, $user_id, $class = null)
     900    {
    940901        static $cached_collected_privileges = array();
    941902
     
    957918        $_MIDCOM->auth->acl->_internal_sudo = true;
    958919
    959         // We need to be careful here in case we have non-persistent objects.
    960         if ($object !== null)
    961         {
    962             $parent_class = $object->get_dba_parent_class();
    963             $parent_guid = $_MIDCOM->dbfactory->get_parent_guid($guid, get_class($object));
    964         }
    965         else
    966         {
    967             $parent_class = null;
    968             $parent_guid = $_MIDCOM->dbfactory->get_parent_guid($guid);
    969         }
     920        $parent_guid = $_MIDCOM->dbfactory->get_parent_guid($guid, $class);
    970921
    971922        $_MIDCOM->auth->acl->_internal_sudo = $previous_sudo;
    972923        // <== out of SUDO
    973924
    974         if (   $parent_guid === null
    975             || $parent_guid == $guid)
     925        if (   $parent_guid == $guid
     926            || !mgd_is_guid($parent_guid))
    976927        {
    977928            $base_privileges = array();
    978929        }
    979         elseif ($parent_class === null)
     930        else
    980931        {
    981932            // recursion
    982933            $base_privileges = self::_collect_content_privileges($parent_guid, $user_id);
    983         }
    984         else
    985         {
    986             $parent_dummy_object = new $parent_class();
    987             $parent_dummy_object->__guid = $parent_guid;
    988 
    989             // recursion
    990             $base_privileges = self::_collect_content_privileges($parent_dummy_object, $user_id);
    991934        }
    992935
Note: See TracChangeset for help on using the changeset viewer.