97aeddef295d73b1cf676a0f1b484f88469e8d67
[tine20] / tine20 / Tinebase / Config.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Tinebase
6  * @subpackage  Config
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @copyright   Copyright (c) 2007-2012 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Philipp Schüle <p.schuele@metaways.de>
10  * 
11  */
12
13 /**
14  * the class provides functions to handle config options
15  * 
16  * @package     Tinebase
17  * @subpackage  Config
18  * 
19  * @todo remove all deprecated stuff
20  */
21 class Tinebase_Config extends Tinebase_Config_Abstract
22 {
23     /**
24      * imap conf name
25      * 
26      * @var string
27      */
28     const IMAP = 'imap';
29     
30     /**
31      * smtp conf name
32      * 
33      * @var string
34      */
35     const SMTP = 'smtp';
36
37     /**
38      * sieve conf name
39      * 
40      * @var string
41      */
42     const SIEVE = 'sieve';
43
44     /**
45      * authentication backend config
46      * 
47      * @var string
48      */
49     const AUTHENTICATIONBACKEND = 'Tinebase_Authentication_BackendConfiguration';
50     
51     /**
52      * authentication backend type config
53      * 
54      * @var string
55      */
56     const AUTHENTICATIONBACKENDTYPE = 'Tinebase_Authentication_BackendType';
57     
58     /**
59      * save automatic alarms when creating new record
60      * 
61      * @var string
62      */
63     const AUTOMATICALARM = 'automaticalarm';
64     
65     /**
66      * user backend config
67      * 
68      * @var string
69      */
70     const USERBACKEND = 'Tinebase_User_BackendConfiguration';
71     
72     /**
73      * user backend type config
74      * 
75      * @var string
76      */
77     const USERBACKENDTYPE = 'Tinebase_User_BackendType';
78     
79     /**
80      * cronjob user id
81      * 
82      * @var string
83      */
84     const CRONUSERID = 'cronuserid';
85     
86     /**
87      * user defined page title postfix for browser page title
88      * 
89      * @var string
90      */
91     const PAGETITLEPOSTFIX = 'pagetitlepostfix';
92
93     /**
94      * logout redirect url
95      * 
96      * @var string
97      */
98     const REDIRECTURL = 'redirectUrl';
99     
100     /**
101      * redirect always
102      * 
103      * @var string
104      */
105     const REDIRECTALWAYS = 'redirectAlways';
106     
107     /**
108      * Config key for Setting "Redirect to referring site if exists?"
109      * 
110      * @var string
111      */
112     const REDIRECTTOREFERRER = 'redirectToReferrer';
113     
114     /**
115      * Config key for configuring allowed origins of the json frontend
116      *  
117      * @var string
118      */
119     const ALLOWEDJSONORIGINS = 'allowedJsonOrigins';
120     
121     /**
122      * Config key for acceptedTermsVersion
123      * @var string
124      */
125     const ACCEPTEDTERMSVERSION = 'acceptedTermsVersion';
126     
127     /**
128      * Config key for map panel in addressbook / include geoext code
129      * @var string
130      */
131     const MAPPANEL = 'mapPanel';
132
133     /**
134      * disable ldap certificate check
135      *
136      * @var string
137      */
138     const LDAP_DISABLE_TLSREQCERT = 'ldapDisableTlsReqCert';
139     
140     /**
141      * configure hook class for user sync
142      *
143      * @var string
144      */
145     const SYNC_USER_HOOK_CLASS = 'syncUserHookClass';
146     
147     /**
148      * Config key for session ip validation -> if this is set to FALSE no Zend_Session_Validator_IpAddress is registered
149      * 
150      * @var string
151      */
152     const SESSIONIPVALIDATION = 'sessionIpValidation';
153     
154     /**
155      * Config key for session user agent validation -> if this is set to FALSE no Zend_Session_Validator_HttpUserAgent is registered
156      * 
157      * @var string
158      */
159     const SESSIONUSERAGENTVALIDATION = 'sessionUserAgentValidation';
160     
161     /**
162      * filestore directory
163      * 
164      * @var string
165      */
166     const FILESDIR = 'filesdir';
167     
168     /**
169      * xls export config
170      * 
171      * @deprecated move to app config
172      * @var string
173      */
174     const XLSEXPORTCONFIG = 'xlsexportconfig';
175     
176     /**
177      * app defaults
178      * 
179      * @deprecated move to app and split
180      * @var string
181      */
182     const APPDEFAULTS = 'appdefaults';
183     
184     /**
185     * REUSEUSERNAME_SAVEUSERNAME
186     *
187     * @var string
188     */
189     const REUSEUSERNAME_SAVEUSERNAME = 'saveusername';
190         
191     /**
192     * PASSWORD_CHANGE
193     *
194     * @var string
195     */
196     const PASSWORD_CHANGE = 'changepw';
197     
198     /**
199      * PASSWORD_POLICY_ACTIVE
200      *
201      * @var string
202      */
203     const PASSWORD_POLICY_ACTIVE = 'pwPolicyActive';
204     
205     /**
206      * PASSWORD_POLICY_ONLYASCII
207      *
208      * @var string
209      */
210     const PASSWORD_POLICY_ONLYASCII = 'pwPolicyOnlyASCII';
211     
212     /**
213      * PASSWORD_POLICY_MIN_LENGTH
214      *
215      * @var string
216      */
217     const PASSWORD_POLICY_MIN_LENGTH = 'pwPolicyMinLength';
218     
219     /**
220      * PASSWORD_POLICY_MIN_WORD_CHARS
221      *
222      * @var string
223      */
224     const PASSWORD_POLICY_MIN_WORD_CHARS = 'pwPolicyMinWordChars';
225     
226     /**
227      * PASSWORD_POLICY_MIN_UPPERCASE_CHARS
228      *
229      * @var string
230      */
231     const PASSWORD_POLICY_MIN_UPPERCASE_CHARS = 'pwPolicyMinUppercaseChars';
232     
233     /**
234      * PASSWORD_POLICY_MIN_SPECIAL_CHARS
235      *
236      * @var string
237      */
238     const PASSWORD_POLICY_MIN_SPECIAL_CHARS = 'pwPolicyMinSpecialChars';
239     
240     /**
241      * PASSWORD_POLICY_MIN_NUMBERS
242      *
243      * @var string
244      */
245     const PASSWORD_POLICY_MIN_NUMBERS = 'pwPolicyMinNumbers';
246     
247     /**
248      * PASSWORD_POLICY_FORBID_USERNAME
249      *
250      * @var string
251      */
252     const PASSWORD_POLICY_FORBID_USERNAME = 'pwPolicyForbidUsername';
253     
254     /**
255      * AUTOMATIC_BUGREPORTS
256      *
257      * @var string
258      */
259     const AUTOMATIC_BUGREPORTS = 'automaticBugreports';
260     
261     /**
262      * LAST_SESSIONS_CLEANUP_RUN
263      *
264      * @var string
265      */
266     const LAST_SESSIONS_CLEANUP_RUN = 'lastSessionsCleanupRun';
267     
268     /**
269      * MAX_LOGIN_FAILURES
270      *
271      * @var string
272      */
273     const MAX_LOGIN_FAILURES = 'maxLoginFailures';
274      
275     /**
276      * ANYONE_ACCOUNT_DISABLED
277      *
278      * @var string
279      */
280     const ANYONE_ACCOUNT_DISABLED = 'anyoneAccountDisabled';
281     
282     /**
283      * ALARMS_EACH_JOB
284      *
285      * @var string
286      */
287     const ALARMS_EACH_JOB = 'alarmsEachJob';
288     
289     /**
290      * (non-PHPdoc)
291      * @see tine20/Tinebase/Config/Definition::$_properties
292      */
293     protected static $_properties = array(
294         self::IMAP => array(
295                                    //_('System IMAP')
296             'label'                 => 'System IMAP',
297                                    //_('System IMAP server configuration.')
298             'description'           => 'System IMAP server configuration.',
299             'type'                  => 'object',
300             'class'                 => 'Tinebase_Config_Struct',
301             'clientRegistryInclude' => FALSE,
302             'setByAdminModule'      => FALSE,
303             'setBySetupModule'      => TRUE,
304         ),
305         self::SMTP => array(
306                                    //_('System SMTP')
307             'label'                 => 'System SMTP',
308                                    //_('System SMTP server configuration.')
309             'description'           => 'System SMTP server configuration.',
310             'type'                  => 'object',
311             'class'                 => 'Tinebase_Config_Struct',
312             'clientRegistryInclude' => FALSE,
313             'setByAdminModule'      => FALSE,
314             'setBySetupModule'      => TRUE,
315         ),
316         self::SIEVE => array(
317                                    //_('System SIEVE')
318             'label'                 => 'System SIEVE',
319                                    //_('System SIEVE server configuration.')
320             'description'           => 'System SIEVE server configuration.',
321             'type'                  => 'object',
322             'class'                 => 'Tinebase_Config_Struct',
323             'clientRegistryInclude' => FALSE,
324             'setByAdminModule'      => FALSE,
325             'setBySetupModule'      => TRUE,
326         ),
327         self::AUTHENTICATIONBACKENDTYPE => array(
328                                    //_('Authentication Backend')
329             'label'                 => 'Authentication Backend',
330                                    //_('Backend adapter for user authentication.')
331             'description'           => 'Backend adapter for user authentication.',
332             'type'                  => 'string',
333             'clientRegistryInclude' => FALSE,
334             'setByAdminModule'      => FALSE,
335             'setBySetupModule'      => TRUE,
336         ),
337         self::AUTHENTICATIONBACKEND => array(
338                                    //_('Authentication Configuration')
339             'label'                 => 'Authentication Configuration',
340                                    //_('Authentication backend configuration.')
341             'description'           => 'Authentication backend configuration.',
342             'type'                  => 'object',
343             'class'                 => 'Tinebase_Config_Struct',
344             'clientRegistryInclude' => FALSE,
345             'setByAdminModule'      => FALSE,
346             'setBySetupModule'      => TRUE,
347         ),
348         self::USERBACKENDTYPE => array(
349                                    //_('User Backend')
350             'label'                 => 'User Backend',
351                                    //_('Backend adapter for user data.')
352             'description'           => 'Backend adapter for user data.',
353             'type'                  => 'string',
354             'clientRegistryInclude' => FALSE,
355             'setByAdminModule'      => FALSE,
356             'setBySetupModule'      => TRUE,
357         ),
358         self::USERBACKEND => array(
359                                    //_('User Configuration')
360             'label'                 => 'User Configuration',
361                                    //_('User backend configuration.')
362             'description'           => 'User backend configuration.',
363             'type'                  => 'object',
364             'class'                 => 'Tinebase_Config_Struct',
365             'clientRegistryInclude' => FALSE,
366             'setByAdminModule'      => FALSE,
367             'setBySetupModule'      => TRUE,
368         ),
369         self::CRONUSERID => array(
370                                    //_('Cronuser ID')
371             'label'                 => 'Cronuser ID',
372                                    //_('User ID of the cron user.')
373             'description'           => 'User ID of the cron user.',
374             'type'                  => 'string',
375             'clientRegistryInclude' => FALSE,
376             'setByAdminModule'      => TRUE,
377             'setBySetupModule'      => TRUE,
378         ),
379         self::PAGETITLEPOSTFIX => array(
380                                    //_('Title Postfix')
381             'label'                 => 'Title Postfix',
382                                    //_('Postfix string appended to the title of this installation.')
383             'description'           => 'Postfix string appended to the title of this installation.',
384             'type'                  => 'string',
385             'clientRegistryInclude' => FALSE,
386             'setByAdminModule'      => TRUE,
387             'setBySetupModule'      => TRUE,
388         ),
389         self::REDIRECTURL => array(
390                                    //_('Redirect URL')
391             'label'                 => 'Redirect URL',
392                                    //_('Redirect to this URL after logout.')
393             'description'           => 'Redirect to this URL after logout.',
394             'type'                  => 'string',
395             'clientRegistryInclude' => FALSE,
396             'setByAdminModule'      => FALSE,
397             'setBySetupModule'      => TRUE,
398         ),
399         self::REDIRECTTOREFERRER => array(
400                                    //_('Redirect to Referrer')
401             'label'                 => 'Redirect to Referrer',
402                                    //_('Redirect to referrer after logout.')
403             'description'           => 'Redirect to referrer after logout.',
404             'type'                  => 'bool',
405             'clientRegistryInclude' => FALSE,
406             'setByAdminModule'      => FALSE,
407             'setBySetupModule'      => TRUE,
408         ),
409         self::REDIRECTALWAYS => array(
410                                    //_('Redirect Always')
411             'label'                 => 'Redirect Always',
412                                    //_('Redirect to configured redirect URL also for login.')
413             'description'           => 'Redirect to configured redirect URL also for login.',
414             'type'                  => 'bool',
415             'clientRegistryInclude' => FALSE,
416             'setByAdminModule'      => FALSE,
417             'setBySetupModule'      => TRUE,
418         ),
419         self::ALLOWEDJSONORIGINS => array(
420                                    //_('Allowed Origins')
421             'label'                 => 'Allowed Origins',
422                                    //_('Allowed Origins for the JSON API.')
423             'description'           => 'Allowed Origins for the JSON API.',
424             'type'                  => 'array',
425             'clientRegistryInclude' => FALSE,
426             'setByAdminModule'      => FALSE,
427             'setBySetupModule'      => FALSE,
428         ),
429         self::ACCEPTEDTERMSVERSION => array(
430                                    //_('Accepted Terms Version')
431             'label'                 => 'Accepted Terms Version',
432                                    //_('Accepted version number of the terms and conditions document.')
433             'description'           => 'Accepted version number of the terms and conditions document.',
434             'type'                  => 'int',
435             'clientRegistryInclude' => FALSE,
436             'setByAdminModule'      => FALSE,
437             'setBySetupModule'      => FALSE,
438         ),
439         self::MAPPANEL => array(
440                                    //_('Use Geolocation Services')
441             'label'                 => 'Use Geolocation Services',
442                                    //_('Use of external Geolocation services is allowed.')
443             'description'           => 'Use of external Geolocation services is allowed.',
444             'type'                  => 'bool',
445             'clientRegistryInclude' => TRUE,
446             'setByAdminModule'      => FALSE,
447             'setBySetupModule'      => TRUE,
448         ),
449         self::LDAP_DISABLE_TLSREQCERT => array(
450                                    //_('Disable LDAP TLS Certificate Check')
451             'label'                 => 'Disable LDAP TLS Certificate Check',
452                                    //_('LDAP TLS Certificate should not be checked')
453             'description'           => 'LDAP TLS Certificate should not be checked',
454             'type'                  => 'bool',
455             'clientRegistryInclude' => false,
456             'setByAdminModule'      => false,
457             'setBySetupModule'      => true,
458             'default'               => false
459         ),
460         self::SYNC_USER_HOOK_CLASS => array(
461                                    //_('Configure hook class for user sync')
462             'label'                 => 'Configure hook class for user sync',
463                                    //_('Allows to change data after fetching user from sync backend')
464             'description'           => 'Allows to change data after fetching user from sync backend',
465             'type'                  => 'string',
466             'clientRegistryInclude' => false,
467             'setByAdminModule'      => false,
468             'setBySetupModule'      => true,
469         ),
470         self::SESSIONIPVALIDATION => array(
471                                    //_('IP Session Validator')
472             'label'                 => 'IP Session Validator',
473                                    //_('Destroy session if the users IP changes.')
474             'description'           => 'Destroy session if the users IP changes.',
475             'type'                  => 'bool',
476             'clientRegistryInclude' => FALSE,
477             'setByAdminModule'      => FALSE,
478             'setBySetupModule'      => TRUE,
479         ),
480         self::SESSIONUSERAGENTVALIDATION => array(
481                                    //_('UA Session Validator')
482             'label'                 => 'UA Session Validator',
483                                    //_('Destroy session if the users user agent string changes.')
484             'description'           => 'Destroy session if the users user agent string changes.',
485             'type'                  => 'bool',
486             'clientRegistryInclude' => FALSE,
487             'setByAdminModule'      => FALSE,
488             'setBySetupModule'      => TRUE,
489         ),
490         self::FILESDIR => array(
491                                    //_('Files Directory')
492             'label'                 => 'Files Directory',
493                                    //_('Directory with web server write access for user files.')
494             'description'           => 'Directory with web server write access for user files.',
495             'type'                  => 'string',
496             'clientRegistryInclude' => FALSE,
497             'setByAdminModule'      => FALSE,
498             'setBySetupModule'      => TRUE,
499         ),
500         self::REUSEUSERNAME_SAVEUSERNAME => array(
501             //_('Reuse last username logged')
502             'label'                 => 'Reuse last username logged',
503             //_('Reuse last username logged')            
504             'description'           => 'Reuse last username logged',
505             'type'                  => 'bool',
506             'clientRegistryInclude' => FALSE,
507             'setByAdminModule'      => FALSE,
508             'setBySetupModule'      => TRUE,
509         ),
510         self::PASSWORD_CHANGE => array(
511         //_('User may change password')
512             'label'                 => 'User may change password',
513         //_('User may change password')
514             'description'           => 'User may change password',
515             'type'                  => 'bool',
516             'clientRegistryInclude' => TRUE,
517             'setByAdminModule'      => FALSE,
518             'setBySetupModule'      => TRUE,
519             'default'               => TRUE
520         ),
521         self::PASSWORD_POLICY_ACTIVE => array(
522         //_('Enable password policy')
523             'label'                 => 'Enable password policy',
524         //_('Enable password policy')
525             'description'           => 'Enable password policy',
526             'type'                  => 'bool',
527             'clientRegistryInclude' => FALSE,
528             'setByAdminModule'      => FALSE,
529             'setBySetupModule'      => TRUE,
530         ),
531         self::PASSWORD_POLICY_ONLYASCII => array(
532         //_('Only ASCII')
533             'label'                 => 'Only ASCII',
534         //_('Only ASCII characters are allowed in passwords.')
535             'description'           => 'Only ASCII characters are allowed in passwords.',
536             'type'                  => 'bool',
537             'clientRegistryInclude' => FALSE,
538             'setByAdminModule'      => FALSE,
539             'setBySetupModule'      => TRUE,
540         ),
541         self::PASSWORD_POLICY_MIN_LENGTH => array(
542         //_('Minimum length')
543             'label'                 => 'Minimum length',
544         //_('Minimum password length')
545             'description'           => 'Minimum password length.',
546             'type'                  => 'int',
547             'clientRegistryInclude' => FALSE,
548             'setByAdminModule'      => FALSE,
549             'setBySetupModule'      => TRUE,
550         ),
551         self::PASSWORD_POLICY_MIN_WORD_CHARS => array(
552         //_('Minimum word chars')
553             'label'                 => 'Minimum word chars',
554         //_('Minimum word chars in password')
555             'description'           => 'Minimum word chars in password',
556             'type'                  => 'int',
557             'clientRegistryInclude' => FALSE,
558             'setByAdminModule'      => FALSE,
559             'setBySetupModule'      => TRUE,
560         ),
561         self::PASSWORD_POLICY_MIN_UPPERCASE_CHARS => array(
562         //_('Minimum uppercase chars')
563             'label'                 => 'Minimum uppercase chars',
564         //_('Minimum uppercase chars in password')
565             'description'           => 'Minimum uppercase chars in password',
566             'type'                  => 'int',
567             'clientRegistryInclude' => FALSE,
568             'setByAdminModule'      => FALSE,
569             'setBySetupModule'      => TRUE,
570         ),
571         self::PASSWORD_POLICY_MIN_SPECIAL_CHARS => array(
572         //_('Minimum special chars')
573             'label'                 => 'Minimum special chars',
574         //_('Minimum special chars in password')
575             'description'           => 'Minimum special chars in password',
576             'type'                  => 'int',
577             'clientRegistryInclude' => FALSE,
578             'setByAdminModule'      => FALSE,
579             'setBySetupModule'      => TRUE,
580         ),
581         self::PASSWORD_POLICY_MIN_NUMBERS => array(
582         //_('Minimum numbers')
583             'label'                 => 'Minimum numbers',
584         //_('Minimum numbers in password')
585             'description'           => 'Minimum numbers in password',
586             'type'                  => 'int',
587             'clientRegistryInclude' => FALSE,
588             'setByAdminModule'      => FALSE,
589             'setBySetupModule'      => TRUE,
590         ),
591         self::PASSWORD_POLICY_FORBID_USERNAME => array(
592         //_('Forbid part of username')
593             'label'                 => 'Forbid part of username',
594         //_('Forbid part of username in password')
595             'description'           => 'Forbid part of username in password',
596             'type'                  => 'bool',
597             'clientRegistryInclude' => FALSE,
598             'setByAdminModule'      => FALSE,
599             'setBySetupModule'      => TRUE,
600         ),
601         self::AUTOMATIC_BUGREPORTS => array(
602                                    //_('Automatic bugreports')
603             'label'                 => 'Automatic bugreports',
604                                    //_('Always send bugreports, even on timeouts and other exceptions / failures.')
605             'description'           => 'Always send bugreports, even on timeouts and other exceptions / failures.',
606             'type'                  => 'bool',
607             'clientRegistryInclude' => TRUE,
608             'setByAdminModule'      => FALSE,
609             'setBySetupModule'      => TRUE,
610         ),
611         self::LAST_SESSIONS_CLEANUP_RUN => array(
612                                    //_('Last sessions cleanup run')
613             'label'                 => 'Last sessions cleanup run',
614                                    //_('Stores the timestamp of the last sessions cleanup task run.')
615             'description'           => 'Stores the timestamp of the last sessions cleanup task run.',
616             'type'                  => self::TYPE_DATETIME,
617             'clientRegistryInclude' => FALSE,
618             'setByAdminModule'      => FALSE,
619             'setBySetupModule'      => FALSE,
620         ),
621         self::MAX_LOGIN_FAILURES => array(
622         //_('Maximum login failures')
623             'label'                 => 'Maximum login failures',
624         //_('Maximum allowed login failures before blocking account')
625             'description'           => 'Maximum allowed login failures before blocking account',
626             'type'                  => 'int',
627             'clientRegistryInclude' => FALSE,
628             'setByAdminModule'      => FALSE,
629             'setBySetupModule'      => TRUE,
630         ),
631         self::ANYONE_ACCOUNT_DISABLED => array(
632                                    //_('Disable Anyone Account')
633             'label'                 => 'Disable Anyone Account',
634                                    //_('Disallow anyone account in grant configurations')
635             'description'           => 'Disallow anyone account in grant configurations',
636             'type'                  => 'bool',
637             'clientRegistryInclude' => TRUE,
638             'setByAdminModule'      => FALSE,
639             'setBySetupModule'      => TRUE,
640         ),
641         self::ALARMS_EACH_JOB => array(
642                                    //_('Alarms sent each job')
643             'label'                 => 'Alarms sent each job',
644                                    //_('Allows to configure the maximum number of alarm notifications in each run of sendPendingAlarms (0 = no limit)')
645             'description'           => 'Allows to configure the maximum number of alarm notifications in each run of sendPendingAlarms (0 = no limit)',
646             'type'                  => 'integer',
647             'clientRegistryInclude' => FALSE,
648             'setByAdminModule'      => FALSE,
649             'setBySetupModule'      => TRUE,
650         ),
651     );
652     
653     /**
654      * (non-PHPdoc)
655      * @see tine20/Tinebase/Config/Abstract::$_appName
656      */
657     protected $_appName = 'Tinebase';
658     
659     /**
660      * holds the instance of the singleton
661      *
662      * @var Tinebase_Config
663      */
664     private static $_instance = NULL;
665     
666     /**
667      * the constructor
668      *
669      * don't use the constructor. use the singleton 
670      */    
671     private function __construct() {}
672     
673     /**
674      * the constructor
675      *
676      * don't use the constructor. use the singleton 
677      */    
678     private function __clone() {}
679     
680     /**
681      * Returns instance of Tinebase_Config
682      *
683      * @return Tinebase_Config
684      */
685     public static function getInstance() 
686     {
687         if (self::$_instance === NULL) {
688             self::$_instance = new Tinebase_Config();
689         }
690         
691         return self::$_instance;
692     }
693     
694     /**
695      * (non-PHPdoc)
696      * @see tine20/Tinebase/Config/Abstract::getProperties()
697      */
698     public static function getProperties()
699     {
700         return self::$_properties;
701     }
702     
703     /**
704      * get config for client registry
705      * 
706      * @return Tinebase_Config_Struct
707      */
708     public function getClientRegistryConfig()
709     {
710         // get all config names to be included in registry
711         $clientProperties = new Tinebase_Config_Struct(array());
712         $filters = array();
713         $userApplications = Tinebase_Core::getUser()->getApplications(TRUE);
714         foreach ($userApplications as $application) {
715             $config = Tinebase_Config_Abstract::factory($application->name);
716             if ($config) {
717                 $clientProperties[$application->name] = new Tinebase_Config_Struct(array());
718                 $properties = $config->getProperties();
719                 foreach ((array) $properties as $name => $definition) {
720                     
721                     if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
722                         . ' ' . print_r($definition, TRUE));
723                     
724                     if ((isset($definition['clientRegistryInclude']) || array_key_exists('clientRegistryInclude', $definition)) && $definition['clientRegistryInclude'] === TRUE) {
725                         // add definition here till we have a better place
726                         $configRegistryItem = new Tinebase_Config_Struct(array(
727                             'value'         => $config->{$name},
728                             'definition'    => new Tinebase_Config_Struct($definition),
729                         ));
730                         if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
731                             . ' ' . print_r($configRegistryItem->toArray(), TRUE));
732                         $clientProperties[$application->name][$name] = $configRegistryItem;
733                     }
734                 }
735                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ 
736                     . ' Got ' . count($clientProperties[$application->name]) . ' config items for ' . $application->name . '.');
737             }
738         }
739         
740         return $clientProperties;
741     }
742     
743     /**
744      * get application config
745      *
746      * @param  string  $applicationName Application name
747      * @return string  $configClassName
748      * 
749      * @todo shouldn't this return a config object??
750      */
751     public static function getAppConfig($applicationName)
752     {
753         $configClassName = $applicationName . '_Config';
754         if (@class_exists($configClassName)) {
755             return $configClassName;
756         } else {
757             if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
758                 . ' Application ' . $applicationName . ' has no config.');
759             return NULL;
760         }
761     }
762     
763     /**
764      * get option setting string
765      * 
766      * @deprecated
767      * @param Tinebase_Record_Interface $_record
768      * @param string $_id
769      * @param string $_label
770      * @return string
771      */
772     public static function getOptionString($_record, $_label)
773     {
774         $controller = Tinebase_Core::getApplicationInstance($_record->getApplication());
775         $settings = $controller->getConfigSettings();
776         $idField = $_label . '_id';
777         
778         $option = $settings->getOptionById($_record->{$idField}, $_label . 's');
779         
780         $result = (isset($option[$_label])) ? $option[$_label] : '';
781         
782         return $result;
783     }    
784 }