0013342: allow to configure default user/admin role names
[tine20] / tine20 / Setup / Initialize.php
1 <?php
2 /**
3  * Tine 2.0
4   * 
5  * @package     Setup
6  * @subpackage  Initialize
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @author      Jonas Fischer <j.fischer@metaways.de>
9  * @copyright   Copyright (c) 2008-2011 Metaways Infosystems GmbH (http://www.metaways.de)
10  */
11
12 /**
13  * Class to handle application initialization
14  * 
15  * @package     Setup
16  * @subpackage  Initialize
17  */
18 class Setup_Initialize
19 {
20     /**
21      * array with user role rights, overwrite this in your app to add more rights to user role
22      * 
23      * @var array
24      */
25     static protected $_userRoleRights = array(
26         Tinebase_Acl_Rights::RUN
27     );
28     
29     /**
30      * Call {@see _initialize} on an instance of the concrete Setup_Initialize class for the given {@param $_application}  
31      * 
32      * @param Tinebase_Model_Application $_application
33      * @param array | optional $_options
34      * @return void
35      */
36     public static function initialize(Tinebase_Model_Application $_application, $_options = null)
37     {
38         $applicationName = $_application->name;
39         $classname = "{$applicationName}_Setup_Initialize";
40
41         if (class_exists($classname)) {
42             Setup_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Initializing application: ' . $applicationName);
43
44             // custom init might need a valid user
45             if (! is_object(Tinebase_Core::getUser()) && ! in_array($applicationName, array('Setup', 'Tinebase', 'Addressbook', 'Admin'))) {
46                 $user = Setup_Update_Abstract::getSetupFromConfigOrCreateOnTheFly();
47                 if ($user) {
48                     Tinebase_Core::set(Tinebase_Core::USER, $user);
49                 }
50             }
51
52             $instance = new $classname;
53             $instance->_initialize($_application, $_options);
54         } else {
55             Setup_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Skipping custom init of application: '
56                 . $applicationName . '. Class ' . $classname . ' not found.');
57
58             self::createInitialRights($_application);
59         }
60     }
61     
62     /**
63      * Call {@see createInitialRights} on an instance of the concrete Setup_Initialize class for the given {@param $_application}
64      * 
65      * @param Tinebase_Model_Application $_application
66      * @param array | optional $_options
67      * @return void
68      */
69     public static function initializeApplicationRights(Tinebase_Model_Application $_application, $_options = null)
70     {
71         $applicationName = $_application->name;
72         $classname = "{$applicationName}_Setup_Initialize";
73         $instance = new $classname;
74         $instance::createInitialRights($_application);
75     }
76     
77     /**
78      * initialize application
79      *
80      * @param Tinebase_Model_Application $_application
81      * @param array | optional $_options
82      * @return void
83      */
84     protected function _initialize(Tinebase_Model_Application $_application, $_options = null)
85     {
86         self::initializeApplicationRights($_application);
87         $initClasses = array($this);
88
89         $customInitClass = $_application->name . '_Setup_Initialize_Custom';
90         if (class_exists($customInitClass)) {
91             $customInit = new $customInitClass();
92             $initClasses[] = $customInit;
93         }
94
95         foreach ($initClasses as $initClass) {
96             $reflectionClass = new ReflectionClass($initClass);
97             $methods = $reflectionClass->getMethods();
98             foreach ($methods as $method) {
99                 $methodName = $method->name;
100                 if ((strpos($methodName, '_initialize') === 0 && $methodName !== '_initialize')
101                     || (get_class($initClass) === $customInitClass && (strpos($methodName, 'initialize') === 0))
102                 ) {
103                     Setup_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Calling init function '
104                         . get_class($initClass) . '::' . $methodName);
105
106                     $initClass->$methodName($_application, $_options);
107                 }
108             }
109         }
110     }
111     
112     /**
113      * create inital rights
114      * 
115      * @param Tinebase_Application $application
116      * @return void
117      */
118     public static function createInitialRights(Tinebase_Model_Application $_application)
119     {
120         Setup_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Creating initial rights for application '
121             . $_application->name);
122
123         $allRights = Tinebase_Application::getInstance()->getAllRights($_application->getId());
124         $userRights = static::$_userRoleRights;
125         
126         if (in_array(Tinebase_Acl_Rights::USE_PERSONAL_TAGS, $allRights)) {
127             $userRights[] = Tinebase_Acl_Rights::USE_PERSONAL_TAGS;
128         }
129
130         $userRoleName = Tinebase_Config::getInstance()->get(Tinebase_Config::DEFAULT_USER_ROLE_NAME);
131         $adminRoleName = Tinebase_Config::getInstance()->get(Tinebase_Config::DEFAULT_ADMIN_ROLE_NAME);
132         $roleRights = array(
133             $userRoleName     => $userRights,
134             $adminRoleName    => $allRights
135         );
136         
137         foreach ($roleRights as $roleName => $rights) {
138             try {
139                 $role = Tinebase_Acl_Roles::getInstance()->getRoleByName($roleName);
140             } catch(Tinebase_Exception_NotFound $tenf) {
141                 Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' ' . $tenf->getMessage());
142                 continue;
143             }
144             
145             foreach ($rights as $right) {
146                 try {
147                     Tinebase_Acl_Roles::getInstance()->addSingleRight($role->getId(), $_application->getId(), $right);
148                 } catch(Exception $e) {
149                     Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ 
150                         . ' Cannot add right: ' . $right . ' for application: ' . $_application->name
151                         . ' - ' . $roleName . ' - ' . print_r($e->getMessage(), true)
152                     );
153                 }
154             }
155         }
156     }
157     
158 }