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