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