adds directory scanning for apps as fallback
[tine20] / tine20 / Tinebase / UserProfile.php
1 <?php
2 /**
3  * Tine 2.0
4  *
5  * @package     Tinebase
6  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
7  * @author      Cornelius Weiss <c.weiss@metaways.de>
8  * @copyright   Copyright (c) 2010-2013 Metaways Infosystems GmbH (http://www.metaways.de)
9  */
10
11 /**
12  * userprofile class
13  * 
14  * @package     Tinebase
15  */
16 class Tinebase_UserProfile
17 {
18     /**
19      * Config key for allowed userProfile fields
20      * @staticvar string
21      */
22     const USERPROFILEFIELDS = 'userProfileFields';
23     
24     /**
25      * possible profile fields
26      * @var array
27      */
28     protected $_possibleFields = array(
29         'n_prefix',
30         'n_given',
31         'n_middle',
32         'n_family',
33         'n_suffix',
34         //'bday',
35         'org_name',
36         'org_unit',
37         'role',
38         'title',
39         'room',
40         'email',
41         'email_home',    
42         'tel_cell',
43         'tel_cell_private',
44         'tel_fax',
45         'tel_fax_home',
46         'tel_home',
47         'tel_work',
48         'url',
49         'adr_one_countryname', 'adr_one_locality', 'adr_one_postalcode', 'adr_one_region', 'adr_one_street', 'adr_one_street2',
50         'adr_two_countryname', 'adr_two_locality', 'adr_two_postalcode', 'adr_two_region', 'adr_two_street', 'adr_two_street2',
51         'note',
52     );
53     
54     /**
55      * fields readable per default
56      * 
57      * @var array
58      */
59     protected $_defaultReadableFields = array(
60         'n_prefix', 'n_given', 'n_middle', 'n_family',
61         'email_home',
62         'tel_home', 'tel_cell_private', 'tel_fax_home', 
63         'adr_two_street', 'adr_two_postalcode', 'adr_two_locality',
64     );
65     
66     /**
67      * fields updateable per default
68      * 
69      * @var array
70      */
71     protected $_defaultUpdateableFields = array(
72         'n_prefix', 'n_given', 'n_middle', 'n_family',
73         'email_home',
74         'tel_home', 'tel_cell_private', 'tel_fax_home', 
75         'adr_two_street', 'adr_two_postalcode', 'adr_two_locality',
76     );
77     
78     /**
79      * generic fields the framework needs to function
80      * 
81      * @var array
82      */
83     protected $_genericFields = array(
84         'account_id',
85         'created_by',
86         'creation_time',
87         'last_modified_by',
88         'last_modified_time',
89         'is_deleted',
90         'deleted_time',
91         'deleted_by'
92     );
93     
94     /**
95      * fields readable
96      * 
97      * @var array
98      */
99     protected $_readableFields = array();
100     
101     /**
102      * fields updateable
103      * 
104      * @var array
105      */
106     protected $_updateableFields = array();
107     
108     /**
109      * holds the instance of the singleton
110      *
111      * @var Tinebase_UserProfile
112      */
113     private static $instance = NULL;
114     
115     /**
116      * don't clone
117      */
118     private function __clone() {}
119     
120     /**
121      * the constructor
122      */
123     private function __construct()
124     {
125         $this->_initConfig();
126     }
127     
128     /**
129      * the singleton pattern
130      *
131      * @return Tinebase_UserProfile
132      */
133     public static function getInstance() 
134     {
135         if (self::$instance === NULL) {
136             self::$instance = new Tinebase_UserProfile();
137         }
138         return self::$instance;
139     }
140     
141     /**
142      * get list of readable fields from Addressbook_Model_Contact
143      * 
144      * @return array
145      */
146     public function getReadableFields()
147     {
148         return $this->_readableFields;
149     }
150     
151     /**
152      * get list of updateable fields from Addressbook_Model_Contact
153      * 
154      * @return array
155      */
156     public function getUpdateableFields()
157     {
158         return $this->_updateableFields;
159     }
160     
161     /**
162      * get list of possible fields from Addressbook_Model_Contact
163      * 
164      * @return array
165      */
166     public function getPossibleFields()
167     {
168         return $this->_possibleFields;
169     }
170     
171     /**
172      * get userProfile
173      *
174      * @param  string $_userId
175      * @return Addressbook_Model_Contact
176      */
177     public function get($_userId)
178     {
179         return Addressbook_Controller_Contact::getInstance()->getUserProfile($_userId);
180     }
181     
182     /**
183      * update userProfile
184      *
185      * @param  Addressbook_Model_Contact $_userProfile
186      * @return Addressbook_Model_Contact
187      */
188     public function update($_userProfile)
189     {
190         return Addressbook_Controller_Contact::getInstance()->updateUserProfile($_userProfile);
191     }
192     
193     /**
194      * return a profile only cleaned up copy of the given contact
195      * 
196      * @param  Addressbook_Model_Contact $_contact
197      * @return Addressbook_Model_Contact
198      */
199     public function doProfileCleanup($_contact)
200     {
201         $userProfile = new Addressbook_Model_Contact(array(), TRUE);
202         
203         foreach($this->getReadableFields() as $fieldName) {
204             $userProfile->$fieldName = $_contact->$fieldName;
205         }
206         
207         return $userProfile;
208     }
209     
210     /**
211      * checks if user has right to manage this profile
212      * 
213      * @param string $_userId
214      * @throws Tasks_Exception_AccessDenied
215      */
216     public function checkRight($_userId)
217     {
218         // check if user is permitted to update profile -> skip normal grant checking
219         if (!Tinebase_Core::getUser()->hasRight('Tinebase', Tinebase_Acl_Rights::MANAGE_OWN_PROFILE)) {
220             throw new Tinebase_Exception_AccessDenied('No rights to manage own profile');
221         }
222         
223         if (Tinebase_Core::getUser()->getId() != $_userId) {
224             // We might itroduce a MANAGE_OTHER_PROFILE ?
225             throw new Tinebase_Exception_AccessDenied('given profile does not belong to current user');
226         }
227     }
228     
229     /**
230      * merges allowed fields from $userProfile into a clone of given $contact
231      * 
232      * @param  Addressbook_Model_Contact $contact
233      * @param  Addressbook_Model_Contact $userProfile
234      * @return Addressbook_Model_Contact
235      */
236     public function mergeProfileInfo($_contact, $_userProfile)
237     {
238         $contact = clone $_contact;
239         
240         foreach($this->getUpdateableFields() as $fieldName) {
241             $contact->$fieldName = $_userProfile->$fieldName;
242         }
243         
244         return $contact;
245     }
246     
247     /**
248      * set readable fields
249      * 
250      * @param array $_readableFields
251      */
252     public function setReadableFields($_readableFields)
253     {
254         Tinebase_Core::getLogger()->debug('setting userProfile readable fields to ' . print_r($_readableFields, TRUE));
255         if (!Tinebase_Core::getUser()->hasRight('Tinebase', Tinebase_Acl_Rights::ADMIN)) {
256             throw new Tinebase_Exception_AccessDenied('No rights to set userProfile config');
257         }
258         
259         $this->_readableFields = $_readableFields;
260         $this->_setConfig();
261     }
262     
263     /**
264      * set updateable fields
265      * 
266      * @param array $_readableFields
267      */
268     public function setUpdateableFields($_updateableFields)
269     {
270         Tinebase_Core::getLogger()->debug('setting userProfile updateable fields to ' . print_r($_updateableFields, TRUE));
271         if (!Tinebase_Core::getUser()->hasRight('Tinebase', Tinebase_Acl_Rights::ADMIN)) {
272             throw new Tinebase_Exception_AccessDenied('No rights to set userProfile config');
273         }
274         
275         $this->_updateableFields = $_updateableFields;
276         $this->_setConfig();
277     }
278     
279     /**
280      * saves userProfile config
281      */
282     public function _setConfig()
283     {
284         $config = array(
285             'readableFields'   => $this->_readableFields,
286             'updateableFields' => $this->_updateableFields
287         );
288         
289         Tinebase_Config::getInstance()->set(self::USERPROFILEFIELDS, $config);
290     }
291     
292     /**
293      * init the config
294      * 
295      */
296     protected function _initConfig()
297     {
298         $config = Tinebase_Config::getInstance()->get(self::USERPROFILEFIELDS, new Tinebase_Config_Struct(array(
299             'readableFields'   => $this->_defaultReadableFields,
300             'updateableFields' => $this->_defaultUpdateableFields
301         )))->toArray();
302         
303         // ensure generic fields are in readable fields
304         $this->_readableFields = array_merge(
305             $config['readableFields'], 
306             $this->_genericFields
307         );
308         
309         $this->_updateableFields = $config['updateableFields'];
310     }
311 }
312