Merge branch '2014.11-develop' into 2015.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      * FEATURE_SHOW_ADVANCED_SEARCH
88      *
89      * @var string
90      */
91     const FEATURE_SHOW_ADVANCED_SEARCH = 'featureShowAdvancedSearch';
92
93     /**
94      * user defined page title postfix for browser page title
95      * 
96      * @var string
97      */
98     const PAGETITLEPOSTFIX = 'pagetitlepostfix';
99
100     /**
101      * logout redirect url
102      * 
103      * @var string
104      */
105     const REDIRECTURL = 'redirectUrl';
106     
107     /**
108      * redirect always
109      * 
110      * @var string
111      */
112     const REDIRECTALWAYS = 'redirectAlways';
113     
114     /**
115      * Config key for Setting "Redirect to referring site if exists?"
116      * 
117      * @var string
118      */
119     const REDIRECTTOREFERRER = 'redirectToReferrer';
120     
121     /**
122      * Config key for configuring allowed origins of the json frontend
123      *  
124      * @var string
125      */
126     const ALLOWEDJSONORIGINS = 'allowedJsonOrigins';
127     
128     /**
129      * Config key for acceptedTermsVersion
130      * @var string
131      */
132     const ACCEPTEDTERMSVERSION = 'acceptedTermsVersion';
133     
134     /**
135      * Config key for map panel in addressbook / include geoext code
136      * @var string
137      */
138     const MAPPANEL = 'mapPanel';
139
140     /**
141      * disable ldap certificate check
142      *
143      * @var string
144      */
145     const LDAP_DISABLE_TLSREQCERT = 'ldapDisableTlsReqCert';
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      * WARN_LOGIN_FAILURES
284      *
285      * @var string
286      */
287     const WARN_LOGIN_FAILURES = 'warnLoginFailures';
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      * ACCOUNT_DELETION_EVENTCONFIGURATION
312      *
313      * @var string
314      */
315     const ACCOUNT_DELETION_EVENTCONFIGURATION = 'accountDeletionEventConfiguration';
316     
317     /**
318      * roleChangeAllowed
319      *
320      * @var string
321      */
322     const ROLE_CHANGE_ALLOWED = 'roleChangeAllowed';
323     
324     /**
325      * max username length
326      *
327      * @var string
328      */
329     const MAX_USERNAME_LENGTH = 'max_username_length';
330
331     /**
332      * conf.d folder name
333      *
334      * @var string
335      */
336     const CONFD_FOLDER = 'confdfolder';
337
338     /**
339      * maintenance mode
340      *
341      * @var bool
342      */
343     const MAINTENANCE_MODE = 'maintenanceMode';
344
345     /**
346      * (non-PHPdoc)
347      * @see tine20/Tinebase/Config/Definition::$_properties
348      */
349     protected static $_properties = array(
350         /**
351          * possible values:
352          *
353          * $_deletePersonalContainers => delete personal containers
354          * $_keepAsContact => keep "account" as contact in the addressbook
355          * $_keepOrganizerEvents => keep accounts organizer events as external events in the calendar
356          * $_keepAsContact => keep accounts calender event attendee as external attendee
357          *
358          * TODO add more options (like move to another container)
359          */
360         self::ACCOUNT_DELETION_EVENTCONFIGURATION => array(
361             //_('Account Deletion Event')
362             'label'                 => 'Account Deletion Event',
363             //_('Configure what should happen to data of deleted users')
364             'description'           => 'Configure what should happen to data of deleted users',
365             'type'                  => 'object',
366             'class'                 => 'Tinebase_Config_Struct',
367             'clientRegistryInclude' => FALSE,
368             'setByAdminModule'      => TRUE,
369             'setBySetupModule'      => TRUE,
370         ),
371         self::IMAP => array(
372                                    //_('System IMAP')
373             'label'                 => 'System IMAP',
374                                    //_('System IMAP server configuration.')
375             'description'           => 'System IMAP server configuration.',
376             'type'                  => 'object',
377             'class'                 => 'Tinebase_Config_Struct',
378             'clientRegistryInclude' => FALSE,
379             'setByAdminModule'      => FALSE,
380             'setBySetupModule'      => TRUE,
381         ),
382         self::SMTP => array(
383                                    //_('System SMTP')
384             'label'                 => 'System SMTP',
385                                    //_('System SMTP server configuration.')
386             'description'           => 'System SMTP server configuration.',
387             'type'                  => 'object',
388             'class'                 => 'Tinebase_Config_Struct',
389             'clientRegistryInclude' => FALSE,
390             'setByAdminModule'      => FALSE,
391             'setBySetupModule'      => TRUE,
392         ),
393         self::SIEVE => array(
394                                    //_('System SIEVE')
395             'label'                 => 'System SIEVE',
396                                    //_('System SIEVE server configuration.')
397             'description'           => 'System SIEVE server configuration.',
398             'type'                  => 'object',
399             'class'                 => 'Tinebase_Config_Struct',
400             'clientRegistryInclude' => FALSE,
401             'setByAdminModule'      => FALSE,
402             'setBySetupModule'      => TRUE,
403         ),
404         self::AUTHENTICATIONBACKENDTYPE => array(
405                                    //_('Authentication Backend')
406             'label'                 => 'Authentication Backend',
407                                    //_('Backend adapter for user authentication.')
408             'description'           => 'Backend adapter for user authentication.',
409             'type'                  => 'string',
410             'clientRegistryInclude' => FALSE,
411             'setByAdminModule'      => FALSE,
412             'setBySetupModule'      => TRUE,
413         ),
414         self::AUTHENTICATIONBACKEND => array(
415                                    //_('Authentication Configuration')
416             'label'                 => 'Authentication Configuration',
417                                    //_('Authentication backend configuration.')
418             'description'           => 'Authentication backend configuration.',
419             'type'                  => 'object',
420             'class'                 => 'Tinebase_Config_Struct',
421             'clientRegistryInclude' => FALSE,
422             'setByAdminModule'      => FALSE,
423             'setBySetupModule'      => TRUE,
424         ),
425         self::USERBACKENDTYPE => array(
426                                    //_('User Backend')
427             'label'                 => 'User Backend',
428                                    //_('Backend adapter for user data.')
429             'description'           => 'Backend adapter for user data.',
430             'type'                  => 'string',
431             'clientRegistryInclude' => FALSE,
432             'setByAdminModule'      => FALSE,
433             'setBySetupModule'      => TRUE,
434         ),
435         self::USERBACKEND => array(
436                                    //_('User Configuration')
437             'label'                 => 'User Configuration',
438                                    //_('User backend configuration.')
439             'description'           => 'User backend configuration.',
440             'type'                  => 'object',
441             'class'                 => 'Tinebase_Config_Struct',
442             'clientRegistryInclude' => FALSE,
443             'setByAdminModule'      => FALSE,
444             'setBySetupModule'      => TRUE,
445         ),
446         self::ENABLED_FEATURES => array(
447             //_('Enabled Features')
448             'label'                 => 'Enabled Features',
449             'description'           => 'Enabled Features',
450             'type'                  => 'object',
451             'class'                 => 'Tinebase_Config_Struct',
452             'clientRegistryInclude' => TRUE,
453             'content'               => array(
454                 self::FEATURE_SHOW_ADVANCED_SEARCH => array(
455                     'label'         => 'Show Advanced Search', //_('Show Advanced Search')
456                     'description'   => 'Show toggle button to switch on or off the advanced search for the quickfilter',
457                     //_('Show toggle button to switch on or off the advanced search for the quickfilter')
458                 ),
459             ),
460             'default'               => array(
461                 self::FEATURE_SHOW_ADVANCED_SEARCH => false,
462             ),
463         ),
464         self::CRONUSERID => array(
465                                    //_('Cronuser ID')
466             'label'                 => 'Cronuser ID',
467                                    //_('User ID of the cron user.')
468             'description'           => 'User ID of the cron user.',
469             'type'                  => 'string',
470             'clientRegistryInclude' => FALSE,
471             'setByAdminModule'      => TRUE,
472             'setBySetupModule'      => TRUE,
473         ),
474         self::PAGETITLEPOSTFIX => array(
475                                    //_('Title Postfix')
476             'label'                 => 'Title Postfix',
477                                    //_('Postfix string appended to the title of this installation.')
478             'description'           => 'Postfix string appended to the title of this installation.',
479             'type'                  => 'string',
480             'clientRegistryInclude' => FALSE,
481             'setByAdminModule'      => TRUE,
482             'setBySetupModule'      => TRUE,
483         ),
484         self::REDIRECTURL => array(
485                                    //_('Redirect URL')
486             'label'                 => 'Redirect URL',
487                                    //_('Redirect to this URL after logout.')
488             'description'           => 'Redirect to this URL after logout.',
489             'type'                  => 'string',
490             'clientRegistryInclude' => FALSE,
491             'setByAdminModule'      => FALSE,
492             'setBySetupModule'      => TRUE,
493         ),
494         self::REDIRECTTOREFERRER => array(
495                                    //_('Redirect to Referrer')
496             'label'                 => 'Redirect to Referrer',
497                                    //_('Redirect to referrer after logout.')
498             'description'           => 'Redirect to referrer after logout.',
499             'type'                  => 'bool',
500             'clientRegistryInclude' => FALSE,
501             'setByAdminModule'      => FALSE,
502             'setBySetupModule'      => TRUE,
503         ),
504         self::REDIRECTALWAYS => array(
505                                    //_('Redirect Always')
506             'label'                 => 'Redirect Always',
507                                    //_('Redirect to configured redirect URL also for login.')
508             'description'           => 'Redirect to configured redirect URL also for login.',
509             'type'                  => 'bool',
510             'clientRegistryInclude' => FALSE,
511             'setByAdminModule'      => FALSE,
512             'setBySetupModule'      => TRUE,
513         ),
514         self::ALLOWEDJSONORIGINS => array(
515                                    //_('Allowed Origins')
516             'label'                 => 'Allowed Origins',
517                                    //_('Allowed Origins for the JSON API.')
518             'description'           => 'Allowed Origins for the JSON API.',
519             'type'                  => 'array',
520             'clientRegistryInclude' => FALSE,
521             'setByAdminModule'      => FALSE,
522             'setBySetupModule'      => FALSE,
523         ),
524         self::ACCEPTEDTERMSVERSION => array(
525                                    //_('Accepted Terms Version')
526             'label'                 => 'Accepted Terms Version',
527                                    //_('Accepted version number of the terms and conditions document.')
528             'description'           => 'Accepted version number of the terms and conditions document.',
529             'type'                  => 'int',
530             'clientRegistryInclude' => FALSE,
531             'setByAdminModule'      => FALSE,
532             'setBySetupModule'      => FALSE,
533         ),
534         self::MAPPANEL => array(
535                                    //_('Use Geolocation Services')
536             'label'                 => 'Use Geolocation Services',
537                                    //_('Use of external Geolocation services is allowed.')
538             'description'           => 'Use of external Geolocation services is allowed.',
539             'type'                  => 'bool',
540             'clientRegistryInclude' => TRUE,
541             'setByAdminModule'      => FALSE,
542             'setBySetupModule'      => TRUE,
543         ),
544         self::LDAP_DISABLE_TLSREQCERT => array(
545                                    //_('Disable LDAP TLS Certificate Check')
546             'label'                 => 'Disable LDAP TLS Certificate Check',
547                                    //_('LDAP TLS Certificate should not be checked')
548             'description'           => 'LDAP TLS Certificate should not be checked',
549             'type'                  => 'bool',
550             'clientRegistryInclude' => false,
551             'setByAdminModule'      => false,
552             'setBySetupModule'      => true,
553             'default'               => false
554         ),
555         self::SYNC_USER_HOOK_CLASS => array(
556                                    //_('Configure hook class for user sync')
557             'label'                 => 'Configure hook class for user sync',
558                                    //_('Allows to change data after fetching user from sync backend')
559             'description'           => 'Allows to change data after fetching user from sync backend',
560             'type'                  => 'string',
561             'clientRegistryInclude' => false,
562             'setByAdminModule'      => false,
563             'setBySetupModule'      => true,
564         ),
565         self::SYNC_USER_CONTACT_DATA => array(
566             //_('Sync contact data from sync backend')
567             'label'                 => 'Sync contact data from sync backend',
568             //_('Sync user contact data from sync backend')
569             'description'           => 'Sync user contact data from sync backend',
570             'type'                  => 'bool',
571             'clientRegistryInclude' => FALSE,
572             'setByAdminModule'      => FALSE,
573             'setBySetupModule'      => FALSE,
574             'default'               => TRUE
575         ),
576         self::SESSIONIPVALIDATION => array(
577                                    //_('IP Session Validator')
578             'label'                 => 'IP Session Validator',
579                                    //_('Destroy session if the users IP changes.')
580             'description'           => 'Destroy session if the users IP changes.',
581             'type'                  => 'bool',
582             'clientRegistryInclude' => FALSE,
583             'setByAdminModule'      => FALSE,
584             'setBySetupModule'      => TRUE,
585         ),
586         self::SESSIONUSERAGENTVALIDATION => array(
587                                    //_('UA Session Validator')
588             'label'                 => 'UA Session Validator',
589                                    //_('Destroy session if the users user agent string changes.')
590             'description'           => 'Destroy session if the users user agent string changes.',
591             'type'                  => 'bool',
592             'clientRegistryInclude' => FALSE,
593             'setByAdminModule'      => FALSE,
594             'setBySetupModule'      => TRUE,
595         ),
596         self::FILESDIR => array(
597                                    //_('Files Directory')
598             'label'                 => 'Files Directory',
599                                    //_('Directory with web server write access for user files.')
600             'description'           => 'Directory with web server write access for user files.',
601             'type'                  => 'string',
602             'clientRegistryInclude' => FALSE,
603             'setByAdminModule'      => FALSE,
604             'setBySetupModule'      => TRUE,
605         ),
606         self::REUSEUSERNAME_SAVEUSERNAME => array(
607             //_('Reuse last username logged')
608             'label'                 => 'Reuse last username logged',
609             //_('Reuse last username logged')            
610             'description'           => 'Reuse last username logged',
611             'type'                  => 'bool',
612             'clientRegistryInclude' => FALSE,
613             'setByAdminModule'      => FALSE,
614             'setBySetupModule'      => TRUE,
615         ),
616         self::PASSWORD_CHANGE => array(
617         //_('User may change password')
618             'label'                 => 'User may change password',
619         //_('User may change password')
620             'description'           => 'User may change password',
621             'type'                  => 'bool',
622             'clientRegistryInclude' => TRUE,
623             'setByAdminModule'      => FALSE,
624             'setBySetupModule'      => TRUE,
625             'default'               => TRUE
626         ),
627         self::PASSWORD_POLICY_ACTIVE => array(
628         //_('Enable password policy')
629             'label'                 => 'Enable password policy',
630         //_('Enable password policy')
631             'description'           => 'Enable password policy',
632             'type'                  => 'bool',
633             'clientRegistryInclude' => FALSE,
634             'setByAdminModule'      => FALSE,
635             'setBySetupModule'      => TRUE,
636         ),
637         self::PASSWORD_POLICY_ONLYASCII => array(
638         //_('Only ASCII')
639             'label'                 => 'Only ASCII',
640         //_('Only ASCII characters are allowed in passwords.')
641             'description'           => 'Only ASCII characters are allowed in passwords.',
642             'type'                  => 'bool',
643             'clientRegistryInclude' => FALSE,
644             'setByAdminModule'      => FALSE,
645             'setBySetupModule'      => TRUE,
646         ),
647         self::PASSWORD_POLICY_MIN_LENGTH => array(
648         //_('Minimum length')
649             'label'                 => 'Minimum length',
650         //_('Minimum password length')
651             'description'           => 'Minimum password length.',
652             'type'                  => 'int',
653             'clientRegistryInclude' => FALSE,
654             'setByAdminModule'      => FALSE,
655             'setBySetupModule'      => TRUE,
656         ),
657         self::PASSWORD_POLICY_MIN_WORD_CHARS => array(
658         //_('Minimum word chars')
659             'label'                 => 'Minimum word chars',
660         //_('Minimum word chars in password')
661             'description'           => 'Minimum word chars in password',
662             'type'                  => 'int',
663             'clientRegistryInclude' => FALSE,
664             'setByAdminModule'      => FALSE,
665             'setBySetupModule'      => TRUE,
666         ),
667         self::PASSWORD_POLICY_MIN_UPPERCASE_CHARS => array(
668         //_('Minimum uppercase chars')
669             'label'                 => 'Minimum uppercase chars',
670         //_('Minimum uppercase chars in password')
671             'description'           => 'Minimum uppercase chars in password',
672             'type'                  => 'int',
673             'clientRegistryInclude' => FALSE,
674             'setByAdminModule'      => FALSE,
675             'setBySetupModule'      => TRUE,
676         ),
677         self::PASSWORD_POLICY_MIN_SPECIAL_CHARS => array(
678         //_('Minimum special chars')
679             'label'                 => 'Minimum special chars',
680         //_('Minimum special chars in password')
681             'description'           => 'Minimum special chars in password',
682             'type'                  => 'int',
683             'clientRegistryInclude' => FALSE,
684             'setByAdminModule'      => FALSE,
685             'setBySetupModule'      => TRUE,
686         ),
687         self::PASSWORD_POLICY_MIN_NUMBERS => array(
688         //_('Minimum numbers')
689             'label'                 => 'Minimum numbers',
690         //_('Minimum numbers in password')
691             'description'           => 'Minimum numbers in password',
692             'type'                  => 'int',
693             'clientRegistryInclude' => FALSE,
694             'setByAdminModule'      => FALSE,
695             'setBySetupModule'      => TRUE,
696         ),
697         self::PASSWORD_POLICY_FORBID_USERNAME => array(
698         //_('Forbid part of username')
699             'label'                 => 'Forbid part of username',
700         //_('Forbid part of username in password')
701             'description'           => 'Forbid part of username in password',
702             'type'                  => 'bool',
703             'clientRegistryInclude' => FALSE,
704             'setByAdminModule'      => FALSE,
705             'setBySetupModule'      => TRUE,
706         ),
707         self::AUTOMATIC_BUGREPORTS => array(
708                                    //_('Automatic bugreports')
709             'label'                 => 'Automatic bugreports',
710                                    //_('Always send bugreports, even on timeouts and other exceptions / failures.')
711             'description'           => 'Always send bugreports, even on timeouts and other exceptions / failures.',
712             'type'                  => 'bool',
713             'clientRegistryInclude' => TRUE,
714             'setByAdminModule'      => FALSE,
715             'setBySetupModule'      => TRUE,
716         ),
717         self::LAST_SESSIONS_CLEANUP_RUN => array(
718                                    //_('Last sessions cleanup run')
719             'label'                 => 'Last sessions cleanup run',
720                                    //_('Stores the timestamp of the last sessions cleanup task run.')
721             'description'           => 'Stores the timestamp of the last sessions cleanup task run.',
722             'type'                  => self::TYPE_DATETIME,
723             'clientRegistryInclude' => FALSE,
724             'setByAdminModule'      => FALSE,
725             'setBySetupModule'      => FALSE,
726         ),
727         self::WARN_LOGIN_FAILURES => array(
728             //_('Warn after X login failures')
729             'label'                 => 'Warn after X login failures',
730             //_('Maximum allowed login failures before writing warn log messages')
731             'description'           => 'Maximum allowed login failures before writing warn log messages',
732             'type'                  => 'int',
733             'clientRegistryInclude' => FALSE,
734             'setByAdminModule'      => FALSE,
735             'setBySetupModule'      => TRUE,
736             'default'               => 4
737         ),
738         self::ANYONE_ACCOUNT_DISABLED => array(
739                                    //_('Disable Anyone Account')
740             'label'                 => 'Disable Anyone Account',
741                                    //_('Disallow anyone account in grant configurations')
742             'description'           => 'Disallow anyone account in grant configurations',
743             'type'                  => 'bool',
744             'clientRegistryInclude' => TRUE,
745             'setByAdminModule'      => FALSE,
746             'setBySetupModule'      => TRUE,
747         ),
748         self::ALARMS_EACH_JOB => array(
749                                    //_('Alarms sent each job')
750             'label'                 => 'Alarms sent each job',
751                                    //_('Allows to configure the maximum number of alarm notifications in each run of sendPendingAlarms (0 = no limit)')
752             'description'           => 'Allows to configure the maximum number of alarm notifications in each run of sendPendingAlarms (0 = no limit)',
753             'type'                  => 'integer',
754             'clientRegistryInclude' => FALSE,
755             'setByAdminModule'      => FALSE,
756             'setBySetupModule'      => TRUE,
757         ),
758         self::ACCOUNT_DEACTIVATION_NOTIFICATION => array(
759             //_('Account deactivation notfication')
760             'label'                 => 'Account deactivation notfication',
761             //_('Send E-Mail to user if the account is deactivated or the user tries to login with deactivated account')
762             'description'           => 'Send E-Mail to User if the account is deactivated or the user tries to login with deactivated account',
763             'type'                  => 'bool',
764             'clientRegistryInclude' => FALSE,
765             'setByAdminModule'      => FALSE,
766             'setBySetupModule'      => TRUE,
767         ),
768         self::ROLE_CHANGE_ALLOWED => array(
769                                    //_('Role change allowed')
770             'label'                 => 'Role change allowed',
771                                    //_('Allows to configure which user is allowed to switch to another users account')
772             'description'           => 'Allows to configure which user is allowed to switch to another users account',
773             'type'                  => 'Tinebase_Config_Struct',
774             'clientRegistryInclude' => TRUE,
775             'setByAdminModule'      => FALSE,
776             'setBySetupModule'      => TRUE,
777         ),
778         self::MAX_USERNAME_LENGTH => array(
779             //_('Max username length')
780             'label'                 => 'Max username length',
781             //_('Max username length')
782             'description'           => 'Max username length',
783             'type'                  => 'int',
784             'default'               => NULL,
785             'clientRegistryInclude' => FALSE,
786         ),
787         self::CONFD_FOLDER => array(
788             //_('conf.d folder name')
789             'label'                 => 'conf.d folder name',
790             //_('Folder for additional config files (conf.d) - NOTE: this is only used if set in config.inc.php!')
791             'description'           => 'Folder for additional config files (conf.d) - NOTE: this is only used if set in config.inc.php!',
792             'type'                  => 'string',
793             'default'               => '',
794             'clientRegistryInclude' => FALSE,
795             'setByAdminModule'      => FALSE,
796             'setBySetupModule'      => FALSE,
797         ),
798         self::MAINTENANCE_MODE => array(
799             //_('Maintenance mode enabled')
800             'label'                 => 'Maintenance mode enabled',
801             //_('Folder for additional config files (conf.d) - NOTE: this is only used if set in config.inc.php!')
802             'description'           => 'Installation is in maintenance mode. With this only users having the maintenance right can login',
803             'type'                  => 'bool',
804             'default'               => '',
805             'clientRegistryInclude' => FALSE,
806             'setByAdminModule'      => TRUE,
807             'setBySetupModule'      => TRUE,
808         ),
809     );
810     
811     /**
812      * (non-PHPdoc)
813      * @see tine20/Tinebase/Config/Abstract::$_appName
814      */
815     protected $_appName = 'Tinebase';
816     
817     /**
818      * holds the instance of the singleton
819      *
820      * @var Tinebase_Config
821      */
822     private static $_instance = NULL;
823
824     /**
825      * server classes
826      *
827      * @var array
828      */
829     protected static $_serverPlugins = array(
830         'Tinebase_Server_Plugin_Json'   => 80,
831         'Tinebase_Server_Plugin_WebDAV' => 80,
832         'Tinebase_Server_Plugin_Cli'    => 90,
833         'Tinebase_Server_Plugin_Http'   => 100
834     );
835
836     /**
837      * the constructor
838      *
839      * don't use the constructor. use the singleton 
840      */
841     private function __construct() {}
842     
843     /**
844      * the constructor
845      *
846      * don't use the constructor. use the singleton 
847      */
848     private function __clone() {}
849     
850     /**
851      * Returns instance of Tinebase_Config
852      *
853      * @return Tinebase_Config
854      */
855     public static function getInstance() 
856     {
857         if (self::$_instance === NULL) {
858             self::$_instance = new Tinebase_Config();
859         }
860         
861         return self::$_instance;
862     }
863     
864     /**
865      * (non-PHPdoc)
866      * @see tine20/Tinebase/Config/Abstract::getProperties()
867      */
868     public static function getProperties()
869     {
870         return self::$_properties;
871     }
872     
873     /**
874      * get config for client registry
875      * 
876      * @return Tinebase_Config_Struct
877      */
878     public function getClientRegistryConfig()
879     {
880         // get all config names to be included in registry
881         $clientProperties = new Tinebase_Config_Struct(array());
882         $userApplications = Tinebase_Core::getUser()->getApplications(TRUE);
883         foreach ($userApplications as $application) {
884             $config = Tinebase_Config_Abstract::factory($application->name);
885             if ($config) {
886                 $clientProperties[$application->name] = new Tinebase_Config_Struct(array());
887                 $properties = $config->getProperties();
888                 foreach ((array) $properties as $name => $definition) {
889                     
890                     if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
891                         . ' ' . print_r($definition, TRUE));
892                     
893                     if ((isset($definition['clientRegistryInclude']) || array_key_exists('clientRegistryInclude', $definition))
894                         && $definition['clientRegistryInclude'] === TRUE)
895                     {
896                         // add definition here till we have a better place
897                         try {
898                             $configRegistryItem = new Tinebase_Config_Struct(array(
899                                 'value' => $config->{$name},
900                                 'definition' => new Tinebase_Config_Struct($definition),
901                             ));
902                             if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__
903                                 . ' ' . print_r($configRegistryItem->toArray(), TRUE));
904                             $clientProperties[$application->name][$name] = $configRegistryItem;
905                         } catch (Exception $e) {
906                             Tinebase_Exception::log($e);
907                         }
908                     }
909                 }
910                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ 
911                     . ' Got ' . count($clientProperties[$application->name]) . ' config items for ' . $application->name . '.');
912             }
913         }
914         
915         return $clientProperties;
916     }
917     
918     /**
919      * get application config
920      *
921      * @param  string  $applicationName Application name
922      * @return Tinebase_Config_Abstract  $configClass
923      */
924     public static function getAppConfig($applicationName)
925     {
926         $configClassName = $applicationName . '_Config';
927         if (@class_exists($configClassName)) {
928             return $configClassName::getInstance();
929         } else {
930             if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
931                 . ' Application ' . $applicationName . ' has no config.');
932             return NULL;
933         }
934     }
935     
936     /**
937      * get option setting string
938      * 
939      * @deprecated
940      * @param Tinebase_Record_Interface $_record
941      * @param string $_id
942      * @param string $_label
943      * @return string
944      */
945     public static function getOptionString($_record, $_label)
946     {
947         $controller = Tinebase_Core::getApplicationInstance($_record->getApplication());
948         $settings = $controller->getConfigSettings();
949         $idField = $_label . '_id';
950         
951         $option = $settings->getOptionById($_record->{$idField}, $_label . 's');
952         
953         $result = (isset($option[$_label])) ? $option[$_label] : '';
954         
955         return $result;
956     }
957 }