c26447a569c41c7da139702e3ada5d0cae3f475d
[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      * Config key for session ip validation -> if this is set to FALSE no Zend_Session_Validator_IpAddress is registered
142      * 
143      * @var string
144      */
145     const SESSIONIPVALIDATION = 'sessionIpValidation';
146     
147     /**
148      * Config key for session user agent validation -> if this is set to FALSE no Zend_Session_Validator_HttpUserAgent is registered
149      * 
150      * @var string
151      */
152     const SESSIONUSERAGENTVALIDATION = 'sessionUserAgentValidation';
153     
154     /**
155      * filestore directory
156      * 
157      * @var string
158      */
159     const FILESDIR = 'filesdir';
160     
161     /**
162      * xls export config
163      * 
164      * @deprecated move to app config
165      * @var string
166      */
167     const XLSEXPORTCONFIG = 'xlsexportconfig';
168     
169     /**
170      * app defaults
171      * 
172      * @deprecated move to app and split
173      * @var string
174      */
175     const APPDEFAULTS = 'appdefaults';
176     
177     /**
178     * REUSEUSERNAME_SAVEUSERNAME
179     *
180     * @var string
181     */
182     const REUSEUSERNAME_SAVEUSERNAME = 'saveusername';
183         
184     /**
185     * PASSWORD_CHANGE
186     *
187     * @var string
188     */
189     const PASSWORD_CHANGE = 'changepw';
190     
191     /**
192      * PASSWORD_POLICY_ACTIVE
193      *
194      * @var string
195      */
196     const PASSWORD_POLICY_ACTIVE = 'pwPolicyActive';
197     
198     /**
199      * PASSWORD_POLICY_ONLYASCII
200      *
201      * @var string
202      */
203     const PASSWORD_POLICY_ONLYASCII = 'pwPolicyOnlyASCII';
204     
205     /**
206      * PASSWORD_POLICY_MIN_LENGTH
207      *
208      * @var string
209      */
210     const PASSWORD_POLICY_MIN_LENGTH = 'pwPolicyMinLength';
211     
212     /**
213      * PASSWORD_POLICY_MIN_WORD_CHARS
214      *
215      * @var string
216      */
217     const PASSWORD_POLICY_MIN_WORD_CHARS = 'pwPolicyMinWordChars';
218     
219     /**
220      * PASSWORD_POLICY_MIN_UPPERCASE_CHARS
221      *
222      * @var string
223      */
224     const PASSWORD_POLICY_MIN_UPPERCASE_CHARS = 'pwPolicyMinUppercaseChars';
225     
226     /**
227      * PASSWORD_POLICY_MIN_SPECIAL_CHARS
228      *
229      * @var string
230      */
231     const PASSWORD_POLICY_MIN_SPECIAL_CHARS = 'pwPolicyMinSpecialChars';
232     
233     /**
234      * PASSWORD_POLICY_MIN_NUMBERS
235      *
236      * @var string
237      */
238     const PASSWORD_POLICY_MIN_NUMBERS = 'pwPolicyMinNumbers';
239     
240     /**
241      * PASSWORD_POLICY_FORBID_USERNAME
242      *
243      * @var string
244      */
245     const PASSWORD_POLICY_FORBID_USERNAME = 'pwPolicyForbidUsername';
246     
247     /**
248      * AUTOMATIC_BUGREPORTS
249      *
250      * @var string
251      */
252     const AUTOMATIC_BUGREPORTS = 'automaticBugreports';
253     
254     /**
255      * LAST_SESSIONS_CLEANUP_RUN
256      *
257      * @var string
258      */
259     const LAST_SESSIONS_CLEANUP_RUN = 'lastSessionsCleanupRun';
260     
261     /**
262      * MAX_LOGIN_FAILURES
263      *
264      * @var string
265      */
266     const MAX_LOGIN_FAILURES = 'maxLoginFailures';
267      
268     /**
269      * ANYONE_ACCOUNT_DISABLED
270      *
271      * @var string
272      */
273     const ANYONE_ACCOUNT_DISABLED = 'anyoneAccountDisabled';
274     
275     /**
276      * ALARMS_EACH_JOB
277      *
278      * @var string
279      */
280     const ALARMS_EACH_JOB = 'alarmsEachJob';
281     
282     /**
283      * (non-PHPdoc)
284      * @see tine20/Tinebase/Config/Definition::$_properties
285      */
286     protected static $_properties = array(
287         self::IMAP => array(
288                                    //_('System IMAP')
289             'label'                 => 'System IMAP',
290                                    //_('System IMAP server configuration.')
291             'description'           => 'System IMAP server configuration.',
292             'type'                  => 'object',
293             'class'                 => 'Tinebase_Config_Struct',
294             'clientRegistryInclude' => FALSE,
295             'setByAdminModule'      => FALSE,
296             'setBySetupModule'      => TRUE,
297         ),
298         self::SMTP => array(
299                                    //_('System SMTP')
300             'label'                 => 'System SMTP',
301                                    //_('System SMTP server configuration.')
302             'description'           => 'System SMTP server configuration.',
303             'type'                  => 'object',
304             'class'                 => 'Tinebase_Config_Struct',
305             'clientRegistryInclude' => FALSE,
306             'setByAdminModule'      => FALSE,
307             'setBySetupModule'      => TRUE,
308         ),
309         self::SIEVE => array(
310                                    //_('System SIEVE')
311             'label'                 => 'System SIEVE',
312                                    //_('System SIEVE server configuration.')
313             'description'           => 'System SIEVE server configuration.',
314             'type'                  => 'object',
315             'class'                 => 'Tinebase_Config_Struct',
316             'clientRegistryInclude' => FALSE,
317             'setByAdminModule'      => FALSE,
318             'setBySetupModule'      => TRUE,
319         ),
320         self::AUTHENTICATIONBACKENDTYPE => array(
321                                    //_('Authentication Backend')
322             'label'                 => 'Authentication Backend',
323                                    //_('Backend adapter for user authentication.')
324             'description'           => 'Backend adapter for user authentication.',
325             'type'                  => 'string',
326             'clientRegistryInclude' => FALSE,
327             'setByAdminModule'      => FALSE,
328             'setBySetupModule'      => TRUE,
329         ),
330         self::AUTHENTICATIONBACKEND => array(
331                                    //_('Authentication Configuration')
332             'label'                 => 'Authentication Configuration',
333                                    //_('Authentication backend configuration.')
334             'description'           => 'Authentication backend configuration.',
335             'type'                  => 'object',
336             'class'                 => 'Tinebase_Config_Struct',
337             'clientRegistryInclude' => FALSE,
338             'setByAdminModule'      => FALSE,
339             'setBySetupModule'      => TRUE,
340         ),
341         self::USERBACKENDTYPE => array(
342                                    //_('User Backend')
343             'label'                 => 'User Backend',
344                                    //_('Backend adapter for user data.')
345             'description'           => 'Backend adapter for user data.',
346             'type'                  => 'string',
347             'clientRegistryInclude' => FALSE,
348             'setByAdminModule'      => FALSE,
349             'setBySetupModule'      => TRUE,
350         ),
351         self::USERBACKEND => array(
352                                    //_('User Configuration')
353             'label'                 => 'User Configuration',
354                                    //_('User backend configuration.')
355             'description'           => 'User backend configuration.',
356             'type'                  => 'object',
357             'class'                 => 'Tinebase_Config_Struct',
358             'clientRegistryInclude' => FALSE,
359             'setByAdminModule'      => FALSE,
360             'setBySetupModule'      => TRUE,
361         ),
362         self::CRONUSERID => array(
363                                    //_('Cronuser ID')
364             'label'                 => 'Cronuser ID',
365                                    //_('User ID of the cron user.')
366             'description'           => 'User ID of the cron user.',
367             'type'                  => 'string',
368             'clientRegistryInclude' => FALSE,
369             'setByAdminModule'      => TRUE,
370             'setBySetupModule'      => TRUE,
371         ),
372         self::PAGETITLEPOSTFIX => array(
373                                    //_('Title Postfix')
374             'label'                 => 'Title Postfix',
375                                    //_('Postfix string appended to the title of this installation.')
376             'description'           => 'Postfix string appended to the title of this installation.',
377             'type'                  => 'string',
378             'clientRegistryInclude' => FALSE,
379             'setByAdminModule'      => TRUE,
380             'setBySetupModule'      => TRUE,
381         ),
382         self::REDIRECTURL => array(
383                                    //_('Redirect URL')
384             'label'                 => 'Redirect URL',
385                                    //_('Redirect to this URL after logout.')
386             'description'           => 'Redirect to this URL after logout.',
387             'type'                  => 'string',
388             'clientRegistryInclude' => FALSE,
389             'setByAdminModule'      => FALSE,
390             'setBySetupModule'      => TRUE,
391         ),
392         self::REDIRECTTOREFERRER => array(
393                                    //_('Redirect to Referrer')
394             'label'                 => 'Redirect to Referrer',
395                                    //_('Redirect to referrer after logout.')
396             'description'           => 'Redirect to referrer after logout.',
397             'type'                  => 'bool',
398             'clientRegistryInclude' => FALSE,
399             'setByAdminModule'      => FALSE,
400             'setBySetupModule'      => TRUE,
401         ),
402         self::REDIRECTALWAYS => array(
403                                    //_('Redirect Always')
404             'label'                 => 'Redirect Always',
405                                    //_('Redirect to configured redirect URL also for login.')
406             'description'           => 'Redirect to configured redirect URL also for login.',
407             'type'                  => 'bool',
408             'clientRegistryInclude' => FALSE,
409             'setByAdminModule'      => FALSE,
410             'setBySetupModule'      => TRUE,
411         ),
412         self::ALLOWEDJSONORIGINS => array(
413                                    //_('Allowed Origins')
414             'label'                 => 'Allowed Origins',
415                                    //_('Allowed Origins for the JSON API.')
416             'description'           => 'Allowed Origins for the JSON API.',
417             'type'                  => 'array',
418             'clientRegistryInclude' => FALSE,
419             'setByAdminModule'      => FALSE,
420             'setBySetupModule'      => FALSE,
421         ),
422         self::ACCEPTEDTERMSVERSION => array(
423                                    //_('Accepted Terms Version')
424             'label'                 => 'Accepted Terms Version',
425                                    //_('Accepted version number of the terms and conditions document.')
426             'description'           => 'Accepted version number of the terms and conditions document.',
427             'type'                  => 'int',
428             'clientRegistryInclude' => FALSE,
429             'setByAdminModule'      => FALSE,
430             'setBySetupModule'      => FALSE,
431         ),
432         self::MAPPANEL => array(
433                                    //_('Use Geolocation Services')
434             'label'                 => 'Use Geolocation Services',
435                                    //_('Use of external Geolocation services is allowed.')
436             'description'           => 'Use of external Geolocation services is allowed.',
437             'type'                  => 'bool',
438             'clientRegistryInclude' => TRUE,
439             'setByAdminModule'      => FALSE,
440             'setBySetupModule'      => TRUE,
441         ),
442         self::LDAP_DISABLE_TLSREQCERT => array(
443                                    //_('Disable LDAP TLS Certificate Check')
444             'label'                 => 'Disable LDAP TLS Certificate Check',
445                                    //_('LDAP TLS Certificate should not be checked')
446             'description'           => 'LDAP TLS Certificate should not be checked',
447             'type'                  => 'bool',
448             'clientRegistryInclude' => false,
449             'setByAdminModule'      => false,
450             'setBySetupModule'      => true,
451             'default'               => false
452         ),
453         self::SESSIONIPVALIDATION => array(
454                                    //_('IP Session Validator')
455             'label'                 => 'IP Session Validator',
456                                    //_('Destroy session if the users IP changes.')
457             'description'           => 'Destroy session if the users IP changes.',
458             'type'                  => 'bool',
459             'clientRegistryInclude' => FALSE,
460             'setByAdminModule'      => FALSE,
461             'setBySetupModule'      => TRUE,
462         ),
463         self::SESSIONUSERAGENTVALIDATION => array(
464                                    //_('UA Session Validator')
465             'label'                 => 'UA Session Validator',
466                                    //_('Destroy session if the users user agent string changes.')
467             'description'           => 'Destroy session if the users user agent string changes.',
468             'type'                  => 'bool',
469             'clientRegistryInclude' => FALSE,
470             'setByAdminModule'      => FALSE,
471             'setBySetupModule'      => TRUE,
472         ),
473         self::FILESDIR => array(
474                                    //_('Files Directory')
475             'label'                 => 'Files Directory',
476                                    //_('Directory with web server write access for user files.')
477             'description'           => 'Directory with web server write access for user files.',
478             'type'                  => 'string',
479             'clientRegistryInclude' => FALSE,
480             'setByAdminModule'      => FALSE,
481             'setBySetupModule'      => TRUE,
482         ),
483         self::REUSEUSERNAME_SAVEUSERNAME => array(
484             //_('Reuse last username logged')
485             'label'                 => 'Reuse last username logged',
486             //_('Reuse last username logged')            
487             'description'           => 'Reuse last username logged',
488             'type'                  => 'bool',
489             'clientRegistryInclude' => FALSE,
490             'setByAdminModule'      => FALSE,
491             'setBySetupModule'      => TRUE,
492         ),
493         self::PASSWORD_CHANGE => array(
494         //_('User may change password')
495             'label'                 => 'User may change password',
496         //_('User may change password')
497             'description'           => 'User may change password',
498             'type'                  => 'bool',
499             'clientRegistryInclude' => TRUE,
500             'setByAdminModule'      => FALSE,
501             'setBySetupModule'      => TRUE,
502             'default'               => TRUE
503         ),
504         self::PASSWORD_POLICY_ACTIVE => array(
505         //_('Enable password policy')
506             'label'                 => 'Enable password policy',
507         //_('Enable password policy')
508             'description'           => 'Enable password policy',
509             'type'                  => 'bool',
510             'clientRegistryInclude' => FALSE,
511             'setByAdminModule'      => FALSE,
512             'setBySetupModule'      => TRUE,
513         ),
514         self::PASSWORD_POLICY_ONLYASCII => array(
515         //_('Only ASCII')
516             'label'                 => 'Only ASCII',
517         //_('Only ASCII characters are allowed in passwords.')
518             'description'           => 'Only ASCII characters are allowed in passwords.',
519             'type'                  => 'bool',
520             'clientRegistryInclude' => FALSE,
521             'setByAdminModule'      => FALSE,
522             'setBySetupModule'      => TRUE,
523         ),
524         self::PASSWORD_POLICY_MIN_LENGTH => array(
525         //_('Minimum length')
526             'label'                 => 'Minimum length',
527         //_('Minimum password length')
528             'description'           => 'Minimum password length.',
529             'type'                  => 'int',
530             'clientRegistryInclude' => FALSE,
531             'setByAdminModule'      => FALSE,
532             'setBySetupModule'      => TRUE,
533         ),
534         self::PASSWORD_POLICY_MIN_WORD_CHARS => array(
535         //_('Minimum word chars')
536             'label'                 => 'Minimum word chars',
537         //_('Minimum word chars in password')
538             'description'           => 'Minimum word chars in password',
539             'type'                  => 'int',
540             'clientRegistryInclude' => FALSE,
541             'setByAdminModule'      => FALSE,
542             'setBySetupModule'      => TRUE,
543         ),
544         self::PASSWORD_POLICY_MIN_UPPERCASE_CHARS => array(
545         //_('Minimum uppercase chars')
546             'label'                 => 'Minimum uppercase chars',
547         //_('Minimum uppercase chars in password')
548             'description'           => 'Minimum uppercase chars in password',
549             'type'                  => 'int',
550             'clientRegistryInclude' => FALSE,
551             'setByAdminModule'      => FALSE,
552             'setBySetupModule'      => TRUE,
553         ),
554         self::PASSWORD_POLICY_MIN_SPECIAL_CHARS => array(
555         //_('Minimum special chars')
556             'label'                 => 'Minimum special chars',
557         //_('Minimum special chars in password')
558             'description'           => 'Minimum special chars in password',
559             'type'                  => 'int',
560             'clientRegistryInclude' => FALSE,
561             'setByAdminModule'      => FALSE,
562             'setBySetupModule'      => TRUE,
563         ),
564         self::PASSWORD_POLICY_MIN_NUMBERS => array(
565         //_('Minimum numbers')
566             'label'                 => 'Minimum numbers',
567         //_('Minimum numbers in password')
568             'description'           => 'Minimum numbers in password',
569             'type'                  => 'int',
570             'clientRegistryInclude' => FALSE,
571             'setByAdminModule'      => FALSE,
572             'setBySetupModule'      => TRUE,
573         ),
574         self::PASSWORD_POLICY_FORBID_USERNAME => array(
575         //_('Forbid part of username')
576             'label'                 => 'Forbid part of username',
577         //_('Forbid part of username in password')
578             'description'           => 'Forbid part of username in password',
579             'type'                  => 'bool',
580             'clientRegistryInclude' => FALSE,
581             'setByAdminModule'      => FALSE,
582             'setBySetupModule'      => TRUE,
583         ),
584         self::AUTOMATIC_BUGREPORTS => array(
585                                    //_('Automatic bugreports')
586             'label'                 => 'Automatic bugreports',
587                                    //_('Always send bugreports, even on timeouts and other exceptions / failures.')
588             'description'           => 'Always send bugreports, even on timeouts and other exceptions / failures.',
589             'type'                  => 'bool',
590             'clientRegistryInclude' => TRUE,
591             'setByAdminModule'      => FALSE,
592             'setBySetupModule'      => TRUE,
593         ),
594         self::LAST_SESSIONS_CLEANUP_RUN => array(
595                                    //_('Last sessions cleanup run')
596             'label'                 => 'Last sessions cleanup run',
597                                    //_('Stores the timestamp of the last sessions cleanup task run.')
598             'description'           => 'Stores the timestamp of the last sessions cleanup task run.',
599             'type'                  => self::TYPE_DATETIME,
600             'clientRegistryInclude' => FALSE,
601             'setByAdminModule'      => FALSE,
602             'setBySetupModule'      => FALSE,
603         ),
604         self::MAX_LOGIN_FAILURES => array(
605         //_('Maximum login failures')
606             'label'                 => 'Maximum login failures',
607         //_('Maximum allowed login failures before blocking account')
608             'description'           => 'Maximum allowed login failures before blocking account',
609             'type'                  => 'int',
610             'clientRegistryInclude' => FALSE,
611             'setByAdminModule'      => FALSE,
612             'setBySetupModule'      => TRUE,
613         ),
614         self::ANYONE_ACCOUNT_DISABLED => array(
615                                    //_('Disable Anyone Account')
616             'label'                 => 'Disable Anyone Account',
617                                    //_('Disallow anyone account in grant configurations')
618             'description'           => 'Disallow anyone account in grant configurations',
619             'type'                  => 'bool',
620             'clientRegistryInclude' => TRUE,
621             'setByAdminModule'      => FALSE,
622             'setBySetupModule'      => TRUE,
623         ),
624         self::ALARMS_EACH_JOB => array(
625                                    //_('Alarms sent each job')
626             'label'                 => 'Alarms sent each job',
627                                    //_('Allows to configure the maximum number of alarm notifications in each run of sendPendingAlarms (0 = no limit)')
628             'description'           => 'Allows to configure the maximum number of alarm notifications in each run of sendPendingAlarms (0 = no limit)',
629             'type'                  => 'integer',
630             'clientRegistryInclude' => FALSE,
631             'setByAdminModule'      => FALSE,
632             'setBySetupModule'      => TRUE,
633         ),
634     );
635     
636     /**
637      * (non-PHPdoc)
638      * @see tine20/Tinebase/Config/Abstract::$_appName
639      */
640     protected $_appName = 'Tinebase';
641     
642     /**
643      * holds the instance of the singleton
644      *
645      * @var Tinebase_Config
646      */
647     private static $_instance = NULL;
648     
649     /**
650      * the constructor
651      *
652      * don't use the constructor. use the singleton 
653      */    
654     private function __construct() {}
655     
656     /**
657      * the constructor
658      *
659      * don't use the constructor. use the singleton 
660      */    
661     private function __clone() {}
662     
663     /**
664      * Returns instance of Tinebase_Config
665      *
666      * @return Tinebase_Config
667      */
668     public static function getInstance() 
669     {
670         if (self::$_instance === NULL) {
671             self::$_instance = new Tinebase_Config();
672         }
673         
674         return self::$_instance;
675     }
676     
677     /**
678      * (non-PHPdoc)
679      * @see tine20/Tinebase/Config/Abstract::getProperties()
680      */
681     public static function getProperties()
682     {
683         return self::$_properties;
684     }
685     
686     /**
687      * get config for client registry
688      * 
689      * @return Tinebase_Config_Struct
690      */
691     public function getClientRegistryConfig()
692     {
693         // get all config names to be included in registry
694         $clientProperties = new Tinebase_Config_Struct(array());
695         $filters = array();
696         $userApplications = Tinebase_Core::getUser()->getApplications(TRUE);
697         foreach ($userApplications as $application) {
698             $config = Tinebase_Config_Abstract::factory($application->name);
699             if ($config) {
700                 $clientProperties[$application->name] = new Tinebase_Config_Struct(array());
701                 $properties = $config->getProperties();
702                 foreach ((array) $properties as $name => $definition) {
703                     
704                     if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
705                         . ' ' . print_r($definition, TRUE));
706                     
707                     if ((isset($definition['clientRegistryInclude']) || array_key_exists('clientRegistryInclude', $definition)) && $definition['clientRegistryInclude'] === TRUE) {
708                         // add definition here till we have a better place
709                         $configRegistryItem = new Tinebase_Config_Struct(array(
710                             'value'         => $config->{$name},
711                             'definition'    => new Tinebase_Config_Struct($definition),
712                         ));
713                         if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
714                             . ' ' . print_r($configRegistryItem->toArray(), TRUE));
715                         $clientProperties[$application->name][$name] = $configRegistryItem;
716                     }
717                 }
718                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ 
719                     . ' Got ' . count($clientProperties[$application->name]) . ' config items for ' . $application->name . '.');
720             }
721         }
722         
723         return $clientProperties;
724     }
725     
726     /**
727      * get application config
728      *
729      * @param  string  $applicationName Application name
730      * @return string  $configClassName
731      * 
732      * @todo shouldn't this return a config object??
733      */
734     public static function getAppConfig($applicationName)
735     {
736         $configClassName = $applicationName . '_Config';
737         if (@class_exists($configClassName)) {
738             return $configClassName;
739         } else {
740             if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
741                 . ' Application ' . $applicationName . ' has no config.');
742             return NULL;
743         }
744     }
745     
746     /**
747      * get option setting string
748      * 
749      * @deprecated
750      * @param Tinebase_Record_Interface $_record
751      * @param string $_id
752      * @param string $_label
753      * @return string
754      */
755     public static function getOptionString($_record, $_label)
756     {
757         $controller = Tinebase_Core::getApplicationInstance($_record->getApplication());
758         $settings = $controller->getConfigSettings();
759         $idField = $_label . '_id';
760         
761         $option = $settings->getOptionById($_record->{$idField}, $_label . 's');
762         
763         $result = (isset($option[$_label])) ? $option[$_label] : '';
764         
765         return $result;
766     }    
767 }