Changeset 26282


Ignore:
Timestamp:
06/05/10 16:50:10 (7 years ago)
Author:
flack
Message:

when privilege data is passed in constructor, we don't instantiate
the mgd privilege object (this is done on-demand for write actions if necessary).

This allows us to keep the ACL memcache a lot smaller and faster

Attention: You have to invalidate your cache after updating to this revision!

refs #1848

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ragnaroek/midcom/midcom.core/midcom/core/privilege.php

    r26281 r26282  
    3434{
    3535    /**
    36      * Cached actual midcom_core_privilege_db object for this privilege.
     36     * Cached actual midcom_core_privilege_db data for this privilege.
     37     *
     38     * @access private
     39     * @var array
     40     */
     41    private $__privilege = array
     42    (
     43        'guid' => '',
     44        'objectguid' => '',
     45        'privilegename'=> '',
     46        'assignee' => null,
     47        'classname' => '',
     48        'value' => null
     49    );
     50
     51    /**
     52     * The actual midcom_core_privilege_db object for this privilege.
    3753     *
    3854     * @access private
    3955     * @var midcom_core_privilege_db
    4056     */
    41     private $__privilege = null;
     57    private $__privilege_object = null;
    4258
    4359    /**
     
    6581    public function __construct($src = null)
    6682    {
    67         if (   is_object($src)
    68             && is_a($src, 'midcom_core_privilege_db'))
    69         {
    70             // Got a privilege object as argument, use that
     83        if (is_array($src))
     84        {
     85            // Store given values to our privilege array
    7186            $this->__privilege = $src;
    72             $this->__guid = $src->guid;
    73         }
    74         elseif (   is_string($src)
    75             && mgd_is_guid($src))
    76         {
    77             $this->__privilege = new midcom_core_privilege_db($src);
    78             $this->__guid = $src;
    7987        }
    8088        else
    8189        {
    82             // Have a nonpersistent privilege
    83             $this->__privilege = new midcom_core_privilege_db();
    84         }
    85 
    86         if (is_array($src))
    87         {
    88             if (   isset($src['guid'])
    89                 && $src['guid'])
    90             {
    91                 // Set the GUID so we know to update correct persistent object
    92                 $this->__guid = $src['guid'];
    93             }
    94             // Store given values to our privilege object
    95             $this->__privilege->objectguid = (string) $src['objectguid'];
    96             $this->__privilege->privilegename = $src['privilegename'];
    97             $this->__privilege->assignee = $src['assignee'];
    98             $this->__privilege->classname = $src['classname'];
    99             $this->__privilege->value = $src['value'];
     90            $this->_load($src);
     91            $this->_sync_from_db_object();
    10092        }
    10193    }
    10294
    10395    // Magic getter and setter for object property mapping
    104     public function __get($property)
    105     {
    106         if (!is_object($this->__privilege))
    107         {
     96    public function __get($property)
     97    {
     98        if (!array_key_exists($property, $this->__privilege))
     99        {
     100            if ($property == 'name')
     101            {
     102                debug_push_class(__CLASS__, __FUNCTION__);
     103                debug_add("Deprecated property name used instead of privilegename", MIDCOM_LOG_DEBUG);
     104                debug_pop();
     105                return $this->__privilege['privilegename'];
     106            }
    108107            return null;
    109108        }
    110109
     110        return $this->__privilege[$property];
     111    }
     112    public function __set($property, $value)
     113    {
    111114        if ($property == 'name')
    112115        {
     
    114117            debug_add("Deprecated property name used instead of privilegename", MIDCOM_LOG_DEBUG);
    115118            debug_pop();
    116             return $this->__privilege->privilegename;
    117         }
    118 
    119         return $this->__privilege->$property;
    120     }
    121     public function __set($property, $value)
    122     {
    123         if ($property == 'name')
    124         {
    125             debug_push_class(__CLASS__, __FUNCTION__);
    126             debug_add("Deprecated property name used instead of privilegename", MIDCOM_LOG_DEBUG);
    127             debug_pop();
    128             return $this->__privilege->privilegename = $value;
    129         }
    130 
    131         return $this->__privilege->$property = $value;
    132     }
    133     public function __isset($property)
    134     {
    135         return isset($this->__privilege->$property);
     119            return $this->__privilege['privilegename'] = $value;
     120        }
     121
     122        return $this->__privilege[$property] = $value;
     123    }
     124    public function __isset($property)
     125    {
     126        return isset($this->__privilege[$property]);
    136127    }
    137128
     
    441432        {
    442433            $return = $_MIDCOM->cache->memcache->get('ACL', $guid);
     434
    443435            if (! is_array($return))
    444436            {
     
    613605    public static function collect_content_privileges($arg, $user = null)
    614606    {
    615         if (is_null($user))
    616         {
    617             $user = $_MIDCOM->auth->user;
    618         }
    619 
    620         /*if ($user == 'EVERYONE')
    621         {
    622             $user = null;
    623         }*/
    624 
    625607        // set $object and $guid
    626608        if (mgd_is_guid($arg))
     
    653635
    654636        static $cached_collected_privileges = array();
     637
     638        if (is_null($user))
     639        {
     640            $user = $_MIDCOM->auth->user;
     641        }
    655642
    656643        if (!is_object($user))
     
    701688        {
    702689            // recursion
    703             $base_privileges = midcom_core_privilege::collect_content_privileges($parent_guid, $user);
     690            $base_privileges = self::collect_content_privileges($parent_guid, $user);
    704691        }
    705692        else
     
    709696
    710697            // recursion
    711             $base_privileges = midcom_core_privilege::collect_content_privileges($parent_dummy_object, $user);
     698            $base_privileges = self::collect_content_privileges($parent_dummy_object, $user);
    712699        }
    713700
     
    734721        $valid_privileges[MIDCOM_PRIVILEGE_SCOPE_OWNER] = $_MIDCOM->auth->get_owner_default_privileges();
    735722
    736         $object_privileges = midcom_core_privilege::get_content_privileges($guid);
     723        $object_privileges = self::get_content_privileges($guid);
    737724
    738725        foreach ($object_privileges as $privilege)
     
    869856                && $user == 'EVERYONE'))
    870857        {
    871             if (   $this->__privilege->assignee != 'EVERYONE'
    872                 && $this->__privilege->assignee != 'ANONYMOUS')
     858            if (   $this->assignee != 'EVERYONE'
     859                && $this->assignee != 'ANONYMOUS')
    873860            {
    874861                return false;
     
    877864        else
    878865        {
    879             if ($this->__privilege->assignee == 'ANONYMOUS')
     866            if ($this->assignee == 'ANONYMOUS')
    880867            {
    881868                return false;
    882869            }
    883             if (    strstr($this->__privilege->assignee, 'user:') !== false
    884                 && $this->__privilege->assignee != $user->id)
     870            if (    strstr($this->assignee, 'user:') !== false
     871                && $this->assignee != $user->id)
    885872            {
    886873                return false;
    887874            }
    888             if (strstr($this->__privilege->assignee, 'group:') !== false)
    889             {
    890                 if (! $user->is_in_group($this->__privilege->assignee))
     875            if (strstr($this->assignee, 'group:') !== false)
     876            {
     877                if (! $user->is_in_group($this->assignee))
    891878                {
    892879                    return false;
     
    897884    }
    898885
     886    private function _load($src)
     887    {
     888        if (   is_object($src)
     889            && is_a($src, 'midcom_core_privilege_db'))
     890        {
     891            // Got a privilege object as argument, use that
     892            $this->__guid = $src->guid;
     893            $this->__privilege_object = $src;
     894        }
     895        elseif (   is_string($src)
     896            && mgd_is_guid($src))
     897        {
     898            $this->__guid = $src;
     899            $this->__privilege_object = new midcom_core_privilege_db($src);
     900        }
     901        else
     902        {
     903            // Have a nonpersistent privilege
     904            $this->__privilege_object = new midcom_core_privilege_db();
     905        }
     906    }
     907
     908    private function _sync_to_db_object()
     909    {
     910        if (!is_object($this->__privilege_object))
     911        {
     912            $this->_load($this->guid);
     913        }
     914        $this->__privilege_object->objectguid = $this->objectguid;
     915        $this->__privilege_object->privilegename = $this->privilegename;
     916        $this->__privilege_object->assignee = $this->assignee;
     917        $this->__privilege_object->classname = $this->classname;
     918        $this->__privilege_object->value = $this->value;
     919    }
     920
     921    private function _sync_from_db_object()
     922    {
     923        if (!is_object($this->__privilege_object))
     924        {
     925            return;
     926        }
     927        $this->objectguid = $this->__privilege_object->objectguid;
     928        $this->privilegename = $this->__privilege_object->privilegename;
     929        $this->assignee = $this->__privilege_object->assignee;
     930        $this->classname = $this->__privilege_object->classname;
     931        $this->value = $this->__privilege_object->value;
     932    }
     933
    899934    /**
    900935     * Store the privilege. This will validate it first and then either
     
    915950            return false;
    916951        }
     952
     953        $this->_sync_to_db_object();
    917954
    918955        if ($this->value == MIDCOM_PRIVILEGE_INHERIT)
     
    952989        if ($this->__guid)
    953990        {
    954             if (!$this->__privilege->update())
     991            if (!$this->__privilege_object->update())
    955992            {
    956993                return false;
     
    9871024            else
    9881025            {
    989                 $result = $this->__privilege->create();
     1026                $result = $this->__privilege_object->create();
    9901027                if ($result)
    9911028                {
    992                     $this->__guid = $this->__privilege->guid;
     1029                    $this->__guid = $this->__privilege_object->guid;
    9931030                    $this->_invalidate_cache();
    9941031                }
     
    10231060    public function drop()
    10241061    {
     1062        $this->_sync_to_db_object();
     1063
    10251064        if (!$this->__guid)
    10261065        {
     
    10391078            return false;
    10401079        }
    1041        
    1042         if (!$this->__privilege->guid)
     1080
     1081        if (!$this->__privilege_object->guid)
    10431082        {
    10441083            // We created this via collector, instantiate a new one
     
    10491088        try
    10501089        {
    1051             if (!$this->__privilege->delete())
     1090            if (!$this->__privilege_object->delete())
    10521091            {
    10531092                debug_push_class(__CLASS__, __FUNCTION__);
     
    10641103            return false;
    10651104        }
    1066        
     1105
    10671106        debug_push_class(__CLASS__, __FUNCTION__);
    1068         debug_add("Delete privilege record {$this->__guid} ({$this->__privilege->objectguid} {$this->__privilege->privilegename} {$this->__privilege->assignee} {$this->__privilege->value}", MIDCOM_LOG_DEBUG);
     1107        debug_add("Delete privilege record {$this->__guid} ({$this->__privilege_object->objectguid} {$this->__privilege_object->privilegename} {$this->__privilege_object->assignee} {$this->__privilege_object->value}", MIDCOM_LOG_DEBUG);
    10691108        debug_pop();
    1070        
    1071         $this->__privilege->purge();
     1109
     1110        $this->__privilege_object->purge();
    10721111        $this->_invalidate_cache();
    10731112        $this->value = MIDCOM_PRIVILEGE_INHERIT;
Note: See TracChangeset for help on using the changeset viewer.