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