map panel / Nominatim service should be enabled by default
[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      * FEATURE_SHOW_ACCOUNT_EMAIL
95      *
96      * @var string
97      */
98     const FEATURE_SHOW_ACCOUNT_EMAIL = 'featureShowAccountEmail';
99
100     /**
101      * user defined page title postfix for browser page title
102      * 
103      * @var string
104      */
105     const PAGETITLEPOSTFIX = 'pagetitlepostfix';
106
107     /**
108      * logout redirect url
109      * 
110      * @var string
111      */
112     const REDIRECTURL = 'redirectUrl';
113     
114     /**
115      * redirect always
116      * 
117      * @var string
118      */
119     const REDIRECTALWAYS = 'redirectAlways';
120     
121     /**
122      * Config key for Setting "Redirect to referring site if exists?"
123      * 
124      * @var string
125      */
126     const REDIRECTTOREFERRER = 'redirectToReferrer';
127     
128     /**
129      * Config key for configuring allowed origins of the json frontend
130      *  
131      * @var string
132      */
133     const ALLOWEDJSONORIGINS = 'allowedJsonOrigins';
134     
135     /**
136      * Config key for acceptedTermsVersion
137      * @var string
138      */
139     const ACCEPTEDTERMSVERSION = 'acceptedTermsVersion';
140     
141     /**
142      * Config key for map panel in addressbook / include geoext code
143      * @var string
144      */
145     const MAPPANEL = 'mapPanel';
146
147     /**
148      * disable ldap certificate check
149      *
150      * @var string
151      */
152     const LDAP_DISABLE_TLSREQCERT = 'ldapDisableTlsReqCert';
153
154     /**
155      * overwritten ldap fields
156      *
157      * @var string
158      */
159     const LDAP_OVERWRITE_CONTACT_FIELDS = 'ldapOverwriteContactFields';
160
161     /**
162      * configure hook class for user sync
163      *
164      * @var string
165      */
166     const SYNC_USER_HOOK_CLASS = 'syncUserHookClass';
167     
168     /**
169      * configure if user contact data should be synced from sync backend
170      *
171      * @var boolean
172      */
173     const SYNC_USER_CONTACT_DATA = 'syncUserContactData';
174     
175     /**
176      * Config key for session ip validation -> if this is set to FALSE no Zend_Session_Validator_IpAddress is registered
177      * 
178      * @var string
179      */
180     const SESSIONIPVALIDATION = 'sessionIpValidation';
181     
182     /**
183      * Config key for session user agent validation -> if this is set to FALSE no Zend_Session_Validator_HttpUserAgent is registered
184      * 
185      * @var string
186      */
187     const SESSIONUSERAGENTVALIDATION = 'sessionUserAgentValidation';
188     
189     /**
190      * filestore directory
191      * 
192      * @var string
193      */
194     const FILESDIR = 'filesdir';
195     
196     /**
197      * xls export config
198      * 
199      * @deprecated move to app config
200      * @var string
201      */
202     const XLSEXPORTCONFIG = 'xlsexportconfig';
203     
204     /**
205      * app defaults
206      * 
207      * @deprecated move to app and split
208      * @var string
209      */
210     const APPDEFAULTS = 'appdefaults';
211     
212     /**
213     * REUSEUSERNAME_SAVEUSERNAME
214     *
215     * @var string
216     */
217     const REUSEUSERNAME_SAVEUSERNAME = 'saveusername';
218         
219     /**
220     * PASSWORD_CHANGE
221     *
222     * @var string
223     */
224     const PASSWORD_CHANGE = 'changepw';
225     
226     /**
227      * PASSWORD_POLICY_ACTIVE
228      *
229      * @var string
230      */
231     const PASSWORD_POLICY_ACTIVE = 'pwPolicyActive';
232     
233     /**
234      * PASSWORD_POLICY_ONLYASCII
235      *
236      * @var string
237      */
238     const PASSWORD_POLICY_ONLYASCII = 'pwPolicyOnlyASCII';
239     
240     /**
241      * PASSWORD_POLICY_MIN_LENGTH
242      *
243      * @var string
244      */
245     const PASSWORD_POLICY_MIN_LENGTH = 'pwPolicyMinLength';
246     
247     /**
248      * PASSWORD_POLICY_MIN_WORD_CHARS
249      *
250      * @var string
251      */
252     const PASSWORD_POLICY_MIN_WORD_CHARS = 'pwPolicyMinWordChars';
253     
254     /**
255      * PASSWORD_POLICY_MIN_UPPERCASE_CHARS
256      *
257      * @var string
258      */
259     const PASSWORD_POLICY_MIN_UPPERCASE_CHARS = 'pwPolicyMinUppercaseChars';
260     
261     /**
262      * PASSWORD_POLICY_MIN_SPECIAL_CHARS
263      *
264      * @var string
265      */
266     const PASSWORD_POLICY_MIN_SPECIAL_CHARS = 'pwPolicyMinSpecialChars';
267     
268     /**
269      * PASSWORD_POLICY_MIN_NUMBERS
270      *
271      * @var string
272      */
273     const PASSWORD_POLICY_MIN_NUMBERS = 'pwPolicyMinNumbers';
274     
275     /**
276      * PASSWORD_POLICY_FORBID_USERNAME
277      *
278      * @var string
279      */
280     const PASSWORD_POLICY_FORBID_USERNAME = 'pwPolicyForbidUsername';
281     
282     /**
283      * AUTOMATIC_BUGREPORTS
284      *
285      * @var string
286      */
287     const AUTOMATIC_BUGREPORTS = 'automaticBugreports';
288     
289     /**
290      * LAST_SESSIONS_CLEANUP_RUN
291      *
292      * @var string
293      */
294     const LAST_SESSIONS_CLEANUP_RUN = 'lastSessionsCleanupRun';
295     
296     /**
297      * WARN_LOGIN_FAILURES
298      *
299      * @var string
300      */
301     const WARN_LOGIN_FAILURES = 'warnLoginFailures';
302      
303     /**
304      * ANYONE_ACCOUNT_DISABLED
305      *
306      * @var string
307      */
308     const ANYONE_ACCOUNT_DISABLED = 'anyoneAccountDisabled';
309     
310     /**
311      * ALARMS_EACH_JOB
312      *
313      * @var string
314      */
315     const ALARMS_EACH_JOB = 'alarmsEachJob';
316     
317     /**
318      * ACCOUNT_DEACTIVATION_NOTIFICATION
319      *
320      * @var string
321      */
322     const ACCOUNT_DEACTIVATION_NOTIFICATION = 'accountDeactivationNotification';
323
324     /**
325      * ACCOUNT_DELETION_EVENTCONFIGURATION
326      *
327      * @var string
328      */
329     const ACCOUNT_DELETION_EVENTCONFIGURATION = 'accountDeletionEventConfiguration';
330     
331     /**
332      * roleChangeAllowed
333      *
334      * @var string
335      */
336     const ROLE_CHANGE_ALLOWED = 'roleChangeAllowed';
337     
338     /**
339      * max username length
340      *
341      * @var string
342      */
343     const MAX_USERNAME_LENGTH = 'max_username_length';
344
345     /**
346      * conf.d folder name
347      *
348      * @var string
349      */
350     const CONFD_FOLDER = 'confdfolder';
351
352     /**
353      * maintenance mode
354      *
355      * @var bool
356      */
357     const MAINTENANCE_MODE = 'maintenanceMode';
358
359     /**
360      * @var array of strings
361      */
362     const FAT_CLIENT_CUSTOM_JS = 'fatClientCustomJS';
363     
364     /**
365      * @var boolean
366      */
367     const USE_LOGINNAME_AS_FOLDERNAME = 'useLoginnameAsFoldername';
368
369     /**
370      * @var array of strings
371      */
372     const VERSION_CHECK = 'versionCheck';
373
374     /**
375      * (non-PHPdoc)
376      * @see tine20/Tinebase/Config/Definition::$_properties
377      */
378     protected static $_properties = array(
379         /**
380          * possible values:
381          *
382          * $_deletePersonalContainers => delete personal containers
383          * $_keepAsContact => keep "account" as contact in the addressbook
384          * $_keepOrganizerEvents => keep accounts organizer events as external events in the calendar
385          * $_keepAsContact => keep accounts calender event attendee as external attendee
386          *
387          * TODO add more options (like move to another container)
388          */
389         self::ACCOUNT_DELETION_EVENTCONFIGURATION => array(
390             //_('Account Deletion Event')
391             'label'                 => 'Account Deletion Event',
392             //_('Configure what should happen to data of deleted users')
393             'description'           => 'Configure what should happen to data of deleted users',
394             'type'                  => 'object',
395             'class'                 => 'Tinebase_Config_Struct',
396             'clientRegistryInclude' => FALSE,
397             'setByAdminModule'      => TRUE,
398             'setBySetupModule'      => TRUE,
399         ),
400         self::IMAP => array(
401                                    //_('System IMAP')
402             'label'                 => 'System IMAP',
403                                    //_('System IMAP server configuration.')
404             'description'           => 'System IMAP server configuration.',
405             'type'                  => 'object',
406             'class'                 => 'Tinebase_Config_Struct',
407             'clientRegistryInclude' => FALSE,
408             'setByAdminModule'      => FALSE,
409             'setBySetupModule'      => TRUE,
410         ),
411         self::SMTP => array(
412                                    //_('System SMTP')
413             'label'                 => 'System SMTP',
414                                    //_('System SMTP server configuration.')
415             'description'           => 'System SMTP server configuration.',
416             'type'                  => 'object',
417             'class'                 => 'Tinebase_Config_Struct',
418             'clientRegistryInclude' => FALSE,
419             'setByAdminModule'      => FALSE,
420             'setBySetupModule'      => TRUE,
421         ),
422         self::SIEVE => array(
423                                    //_('System SIEVE')
424             'label'                 => 'System SIEVE',
425                                    //_('System SIEVE server configuration.')
426             'description'           => 'System SIEVE server configuration.',
427             'type'                  => 'object',
428             'class'                 => 'Tinebase_Config_Struct',
429             'clientRegistryInclude' => FALSE,
430             'setByAdminModule'      => FALSE,
431             'setBySetupModule'      => TRUE,
432         ),
433         self::AUTHENTICATIONBACKENDTYPE => array(
434                                    //_('Authentication Backend')
435             'label'                 => 'Authentication Backend',
436                                    //_('Backend adapter for user authentication.')
437             'description'           => 'Backend adapter for user authentication.',
438             'type'                  => 'string',
439             'clientRegistryInclude' => FALSE,
440             'setByAdminModule'      => FALSE,
441             'setBySetupModule'      => TRUE,
442         ),
443         self::AUTHENTICATIONBACKEND => array(
444                                    //_('Authentication Configuration')
445             'label'                 => 'Authentication Configuration',
446                                    //_('Authentication backend configuration.')
447             'description'           => 'Authentication backend configuration.',
448             'type'                  => 'object',
449             'class'                 => 'Tinebase_Config_Struct',
450             'clientRegistryInclude' => FALSE,
451             'setByAdminModule'      => FALSE,
452             'setBySetupModule'      => TRUE,
453         ),
454         self::USERBACKENDTYPE => array(
455                                    //_('User Backend')
456             'label'                 => 'User Backend',
457                                    //_('Backend adapter for user data.')
458             'description'           => 'Backend adapter for user data.',
459             'type'                  => 'string',
460             'clientRegistryInclude' => FALSE,
461             'setByAdminModule'      => FALSE,
462             'setBySetupModule'      => TRUE,
463         ),
464         self::USERBACKEND => array(
465                                    //_('User Configuration')
466             'label'                 => 'User Configuration',
467                                    //_('User backend configuration.')
468             'description'           => 'User backend configuration.',
469             'type'                  => 'object',
470             'class'                 => 'Tinebase_Config_Struct',
471             'clientRegistryInclude' => FALSE,
472             'setByAdminModule'      => FALSE,
473             'setBySetupModule'      => TRUE,
474         ),
475         self::ENABLED_FEATURES => array(
476             //_('Enabled Features')
477             'label'                 => 'Enabled Features',
478             'description'           => 'Enabled Features',
479             'type'                  => 'object',
480             'class'                 => 'Tinebase_Config_Struct',
481             'clientRegistryInclude' => TRUE,
482             'content'               => array(
483                 self::FEATURE_SHOW_ADVANCED_SEARCH => array(
484                     'label'         => 'Show Advanced Search', //_('Show Advanced Search')
485                     'description'   => 'Show toggle button to switch on or off the advanced search for the quickfilter',
486                     //_('Show toggle button to switch on or off the advanced search for the quickfilter')
487                 ),
488                 self::FEATURE_SHOW_ACCOUNT_EMAIL => array(
489                     'label'         => 'Show Account Email Address', //_('Show Account Email Address')
490                     'description'   => 'Show email address in account picker and attendee grids',
491                     //_('Show email address in account picker and attendee grids')
492                 ),
493             ),
494             'default'               => array(
495                 self::FEATURE_SHOW_ADVANCED_SEARCH => false,
496                 self::FEATURE_SHOW_ACCOUNT_EMAIL => false,
497             ),
498         ),
499         self::CRONUSERID => array(
500                                    //_('Cronuser ID')
501             'label'                 => 'Cronuser ID',
502                                    //_('User ID of the cron user.')
503             'description'           => 'User ID of the cron user.',
504             'type'                  => 'string',
505             'clientRegistryInclude' => FALSE,
506             'setByAdminModule'      => TRUE,
507             'setBySetupModule'      => TRUE,
508         ),
509         self::PAGETITLEPOSTFIX => array(
510                                    //_('Title Postfix')
511             'label'                 => 'Title Postfix',
512                                    //_('Postfix string appended to the title of this installation.')
513             'description'           => 'Postfix string appended to the title of this installation.',
514             'type'                  => 'string',
515             'clientRegistryInclude' => FALSE,
516             'setByAdminModule'      => TRUE,
517             'setBySetupModule'      => TRUE,
518         ),
519         self::REDIRECTURL => array(
520                                    //_('Redirect URL')
521             'label'                 => 'Redirect URL',
522                                    //_('Redirect to this URL after logout.')
523             'description'           => 'Redirect to this URL after logout.',
524             'type'                  => 'string',
525             'clientRegistryInclude' => FALSE,
526             'setByAdminModule'      => FALSE,
527             'setBySetupModule'      => TRUE,
528         ),
529         self::REDIRECTTOREFERRER => array(
530                                    //_('Redirect to Referrer')
531             'label'                 => 'Redirect to Referrer',
532                                    //_('Redirect to referrer after logout.')
533             'description'           => 'Redirect to referrer after logout.',
534             'type'                  => 'bool',
535             'clientRegistryInclude' => FALSE,
536             'setByAdminModule'      => FALSE,
537             'setBySetupModule'      => TRUE,
538         ),
539         self::REDIRECTALWAYS => array(
540                                    //_('Redirect Always')
541             'label'                 => 'Redirect Always',
542                                    //_('Redirect to configured redirect URL also for login.')
543             'description'           => 'Redirect to configured redirect URL also for login.',
544             'type'                  => 'bool',
545             'clientRegistryInclude' => FALSE,
546             'setByAdminModule'      => FALSE,
547             'setBySetupModule'      => TRUE,
548         ),
549         self::ALLOWEDJSONORIGINS => array(
550                                    //_('Allowed Origins')
551             'label'                 => 'Allowed Origins',
552                                    //_('Allowed Origins for the JSON API.')
553             'description'           => 'Allowed Origins for the JSON API.',
554             'type'                  => 'array',
555             'clientRegistryInclude' => FALSE,
556             'setByAdminModule'      => FALSE,
557             'setBySetupModule'      => FALSE,
558         ),
559         self::ACCEPTEDTERMSVERSION => array(
560                                    //_('Accepted Terms Version')
561             'label'                 => 'Accepted Terms Version',
562                                    //_('Accepted version number of the terms and conditions document.')
563             'description'           => 'Accepted version number of the terms and conditions document.',
564             'type'                  => 'int',
565             'clientRegistryInclude' => FALSE,
566             'setByAdminModule'      => FALSE,
567             'setBySetupModule'      => FALSE,
568         ),
569         self::MAPPANEL => array(
570                                    //_('Use Geolocation Services')
571             'label'                 => 'Use Geolocation Services',
572                                    //_('Use of external Geolocation services is allowed.')
573             'description'           => 'Use of external Geolocation services is allowed.',
574             'type'                  => 'bool',
575             'clientRegistryInclude' => true,
576             'setByAdminModule'      => false,
577             'setBySetupModule'      => true,
578             'default'               => true,
579         ),
580         self::LDAP_DISABLE_TLSREQCERT => array(
581                                    //_('Disable LDAP TLS Certificate Check')
582             'label'                 => 'Disable LDAP TLS Certificate Check',
583                                    //_('LDAP TLS Certificate should not be checked')
584             'description'           => 'LDAP TLS Certificate should not be checked',
585             'type'                  => 'bool',
586             'clientRegistryInclude' => false,
587             'setByAdminModule'      => false,
588             'setBySetupModule'      => true,
589             'default'               => false
590         ),
591         // TODO should this be added to LDAP config array/struct?
592         // TODO does this depend on LDAP readonly option?
593         self::LDAP_OVERWRITE_CONTACT_FIELDS => array(
594             //_('Contact fields overwritten by LDAP')
595             'label'                 => 'Contact fields overwritten by LDAP',
596             //_('These fields are overwritten during LDAP sync if empty')
597             'description'           => 'These fields are overwritten during LDAP sync if empty',
598             'type'                  => 'array',
599             'clientRegistryInclude' => false,
600             'setByAdminModule'      => false,
601             'setBySetupModule'      => true,
602             'default'               => array()
603         ),
604         self::SYNC_USER_HOOK_CLASS => array(
605                                    //_('Configure hook class for user sync')
606             'label'                 => 'Configure hook class for user sync',
607                                    //_('Allows to change data after fetching user from sync backend')
608             'description'           => 'Allows to change data after fetching user from sync backend',
609             'type'                  => 'string',
610             'clientRegistryInclude' => false,
611             'setByAdminModule'      => false,
612             'setBySetupModule'      => true,
613         ),
614         self::SYNC_USER_CONTACT_DATA => array(
615             //_('Sync contact data from sync backend')
616             'label'                 => 'Sync contact data from sync backend',
617             //_('Sync user contact data from sync backend')
618             'description'           => 'Sync user contact data from sync backend',
619             'type'                  => 'bool',
620             'clientRegistryInclude' => FALSE,
621             'setByAdminModule'      => FALSE,
622             'setBySetupModule'      => FALSE,
623             'default'               => TRUE
624         ),
625         self::SESSIONIPVALIDATION => array(
626                                    //_('IP Session Validator')
627             'label'                 => 'IP Session Validator',
628                                    //_('Destroy session if the users IP changes.')
629             'description'           => 'Destroy session if the users IP changes.',
630             'type'                  => 'bool',
631             'clientRegistryInclude' => FALSE,
632             'setByAdminModule'      => FALSE,
633             'setBySetupModule'      => TRUE,
634         ),
635         self::SESSIONUSERAGENTVALIDATION => array(
636                                    //_('UA Session Validator')
637             'label'                 => 'UA Session Validator',
638                                    //_('Destroy session if the users user agent string changes.')
639             'description'           => 'Destroy session if the users user agent string changes.',
640             'type'                  => 'bool',
641             'clientRegistryInclude' => FALSE,
642             'setByAdminModule'      => FALSE,
643             'setBySetupModule'      => TRUE,
644         ),
645         self::FILESDIR => array(
646                                    //_('Files Directory')
647             'label'                 => 'Files Directory',
648                                    //_('Directory with web server write access for user files.')
649             'description'           => 'Directory with web server write access for user files.',
650             'type'                  => 'string',
651             'clientRegistryInclude' => FALSE,
652             'setByAdminModule'      => FALSE,
653             'setBySetupModule'      => TRUE,
654         ),
655         self::REUSEUSERNAME_SAVEUSERNAME => array(
656             //_('Reuse last username logged')
657             'label'                 => 'Reuse last username logged',
658             //_('Reuse last username logged')            
659             'description'           => 'Reuse last username logged',
660             'type'                  => 'bool',
661             'clientRegistryInclude' => FALSE,
662             'setByAdminModule'      => FALSE,
663             'setBySetupModule'      => TRUE,
664         ),
665         self::PASSWORD_CHANGE => array(
666         //_('User may change password')
667             'label'                 => 'User may change password',
668         //_('User may change password')
669             'description'           => 'User may change password',
670             'type'                  => 'bool',
671             'clientRegistryInclude' => TRUE,
672             'setByAdminModule'      => FALSE,
673             'setBySetupModule'      => TRUE,
674             'default'               => TRUE
675         ),
676         self::PASSWORD_POLICY_ACTIVE => array(
677         //_('Enable password policy')
678             'label'                 => 'Enable password policy',
679         //_('Enable password policy')
680             'description'           => 'Enable password policy',
681             'type'                  => 'bool',
682             'clientRegistryInclude' => FALSE,
683             'setByAdminModule'      => FALSE,
684             'setBySetupModule'      => TRUE,
685         ),
686         self::PASSWORD_POLICY_ONLYASCII => array(
687         //_('Only ASCII')
688             'label'                 => 'Only ASCII',
689         //_('Only ASCII characters are allowed in passwords.')
690             'description'           => 'Only ASCII characters are allowed in passwords.',
691             'type'                  => 'bool',
692             'clientRegistryInclude' => FALSE,
693             'setByAdminModule'      => FALSE,
694             'setBySetupModule'      => TRUE,
695         ),
696         self::PASSWORD_POLICY_MIN_LENGTH => array(
697         //_('Minimum length')
698             'label'                 => 'Minimum length',
699         //_('Minimum password length')
700             'description'           => 'Minimum password length.',
701             'type'                  => 'int',
702             'clientRegistryInclude' => FALSE,
703             'setByAdminModule'      => FALSE,
704             'setBySetupModule'      => TRUE,
705         ),
706         self::PASSWORD_POLICY_MIN_WORD_CHARS => array(
707         //_('Minimum word chars')
708             'label'                 => 'Minimum word chars',
709         //_('Minimum word chars in password')
710             'description'           => 'Minimum word chars in password',
711             'type'                  => 'int',
712             'clientRegistryInclude' => FALSE,
713             'setByAdminModule'      => FALSE,
714             'setBySetupModule'      => TRUE,
715         ),
716         self::PASSWORD_POLICY_MIN_UPPERCASE_CHARS => array(
717         //_('Minimum uppercase chars')
718             'label'                 => 'Minimum uppercase chars',
719         //_('Minimum uppercase chars in password')
720             'description'           => 'Minimum uppercase chars in password',
721             'type'                  => 'int',
722             'clientRegistryInclude' => FALSE,
723             'setByAdminModule'      => FALSE,
724             'setBySetupModule'      => TRUE,
725         ),
726         self::PASSWORD_POLICY_MIN_SPECIAL_CHARS => array(
727         //_('Minimum special chars')
728             'label'                 => 'Minimum special chars',
729         //_('Minimum special chars in password')
730             'description'           => 'Minimum special chars in password',
731             'type'                  => 'int',
732             'clientRegistryInclude' => FALSE,
733             'setByAdminModule'      => FALSE,
734             'setBySetupModule'      => TRUE,
735         ),
736         self::PASSWORD_POLICY_MIN_NUMBERS => array(
737         //_('Minimum numbers')
738             'label'                 => 'Minimum numbers',
739         //_('Minimum numbers in password')
740             'description'           => 'Minimum numbers in password',
741             'type'                  => 'int',
742             'clientRegistryInclude' => FALSE,
743             'setByAdminModule'      => FALSE,
744             'setBySetupModule'      => TRUE,
745         ),
746         self::PASSWORD_POLICY_FORBID_USERNAME => array(
747         //_('Forbid part of username')
748             'label'                 => 'Forbid part of username',
749         //_('Forbid part of username in password')
750             'description'           => 'Forbid part of username in password',
751             'type'                  => 'bool',
752             'clientRegistryInclude' => FALSE,
753             'setByAdminModule'      => FALSE,
754             'setBySetupModule'      => TRUE,
755         ),
756         self::AUTOMATIC_BUGREPORTS => array(
757                                    //_('Automatic bugreports')
758             'label'                 => 'Automatic bugreports',
759                                    //_('Always send bugreports, even on timeouts and other exceptions / failures.')
760             'description'           => 'Always send bugreports, even on timeouts and other exceptions / failures.',
761             'type'                  => 'bool',
762             'clientRegistryInclude' => TRUE,
763             'setByAdminModule'      => FALSE,
764             'setBySetupModule'      => TRUE,
765         ),
766         self::LAST_SESSIONS_CLEANUP_RUN => array(
767                                    //_('Last sessions cleanup run')
768             'label'                 => 'Last sessions cleanup run',
769                                    //_('Stores the timestamp of the last sessions cleanup task run.')
770             'description'           => 'Stores the timestamp of the last sessions cleanup task run.',
771             'type'                  => self::TYPE_DATETIME,
772             'clientRegistryInclude' => FALSE,
773             'setByAdminModule'      => FALSE,
774             'setBySetupModule'      => FALSE,
775         ),
776         self::WARN_LOGIN_FAILURES => array(
777             //_('Warn after X login failures')
778             'label'                 => 'Warn after X login failures',
779             //_('Maximum allowed login failures before writing warn log messages')
780             'description'           => 'Maximum allowed login failures before writing warn log messages',
781             'type'                  => 'int',
782             'clientRegistryInclude' => FALSE,
783             'setByAdminModule'      => FALSE,
784             'setBySetupModule'      => TRUE,
785             'default'               => 4
786         ),
787         self::ANYONE_ACCOUNT_DISABLED => array(
788                                    //_('Disable Anyone Account')
789             'label'                 => 'Disable Anyone Account',
790                                    //_('Disallow anyone account in grant configurations')
791             'description'           => 'Disallow anyone account in grant configurations',
792             'type'                  => 'bool',
793             'clientRegistryInclude' => TRUE,
794             'setByAdminModule'      => FALSE,
795             'setBySetupModule'      => TRUE,
796         ),
797         self::ALARMS_EACH_JOB => array(
798                                    //_('Alarms sent each job')
799             'label'                 => 'Alarms sent each job',
800                                    //_('Allows to configure the maximum number of alarm notifications in each run of sendPendingAlarms (0 = no limit)')
801             'description'           => 'Allows to configure the maximum number of alarm notifications in each run of sendPendingAlarms (0 = no limit)',
802             'type'                  => 'integer',
803             'clientRegistryInclude' => FALSE,
804             'setByAdminModule'      => FALSE,
805             'setBySetupModule'      => TRUE,
806         ),
807         self::ACCOUNT_DEACTIVATION_NOTIFICATION => array(
808             //_('Account deactivation notfication')
809             'label'                 => 'Account deactivation notfication',
810             //_('Send E-Mail to user if the account is deactivated or the user tries to login with deactivated account')
811             'description'           => 'Send E-Mail to User if the account is deactivated or the user tries to login with deactivated account',
812             'type'                  => 'bool',
813             'clientRegistryInclude' => FALSE,
814             'setByAdminModule'      => FALSE,
815             'setBySetupModule'      => TRUE,
816         ),
817         self::ROLE_CHANGE_ALLOWED => array(
818                                    //_('Role change allowed')
819             'label'                 => 'Role change allowed',
820                                    //_('Allows to configure which user is allowed to switch to another users account')
821             'description'           => 'Allows to configure which user is allowed to switch to another users account',
822             'type'                  => 'Tinebase_Config_Struct',
823             'clientRegistryInclude' => TRUE,
824             'setByAdminModule'      => FALSE,
825             'setBySetupModule'      => TRUE,
826         ),
827         self::MAX_USERNAME_LENGTH => array(
828             //_('Max username length')
829             'label'                 => 'Max username length',
830             //_('Max username length')
831             'description'           => 'Max username length',
832             'type'                  => 'int',
833             'default'               => NULL,
834             'clientRegistryInclude' => FALSE,
835         ),
836         self::CONFD_FOLDER => array(
837             //_('conf.d folder name')
838             'label'                 => 'conf.d folder name',
839             //_('Folder for additional config files (conf.d) - NOTE: this is only used if set in config.inc.php!')
840             'description'           => 'Folder for additional config files (conf.d) - NOTE: this is only used if set in config.inc.php!',
841             'type'                  => 'string',
842             'default'               => '',
843             'clientRegistryInclude' => FALSE,
844             'setByAdminModule'      => FALSE,
845             'setBySetupModule'      => FALSE,
846         ),
847         self::MAINTENANCE_MODE => array(
848             //_('Maintenance mode enabled')
849             'label'                 => 'Maintenance mode enabled',
850             //_('Folder for additional config files (conf.d) - NOTE: this is only used if set in config.inc.php!')
851             'description'           => 'Installation is in maintenance mode. With this only users having the maintenance right can login',
852             'type'                  => 'bool',
853             'default'               => '',
854             'clientRegistryInclude' => FALSE,
855             'setByAdminModule'      => TRUE,
856             'setBySetupModule'      => TRUE,
857         ),
858         self::VERSION_CHECK => array(
859             //_('Version check enabled')
860             'label'                 => 'Version check enabled',
861             'description'           => 'Version check enabled',
862             'type'                  => 'bool',
863             'default'               => true,
864             'clientRegistryInclude' => true,
865             'setByAdminModule'      => false,
866             'setBySetupModule'      => false,
867         ),
868         self::FAT_CLIENT_CUSTOM_JS => array(
869             // NOTE: it's possible to deliver customjs vom vfs by using the tine20:// streamwrapper
870             //       tine20://<applicationid>/folders/shared/<containerid>/custom.js
871             //_('Custom Javascript includes for Fat-Client')
872             'label'                 => 'Custom Javascript includes for Fat-Client',
873             //_('An array of javascript files to include for the fat client. This files might be stored outside the docroot of the webserver.')
874             'description'           => "An array of javascript files to include for the fat client. This files might be stored outside the docroot of the webserver.",
875             'type'                  => 'array',
876             'default'               => array(),
877             'clientRegistryInclude' => FALSE,
878             'setByAdminModule'      => FALSE,
879             'setBySetupModule'      => FALSE,
880         ),
881         self::USE_LOGINNAME_AS_FOLDERNAME => array(
882         //_('Use login name instead of full name')
883             'label'                 => 'Use login name instead of full name',
884         //_('Use login name instead of full name for webdav.')
885             'description'           => 'Use login name instead of full name for webdav.',
886             'type'                  => 'bool',
887             'clientRegistryInclude' => FALSE,
888             'setByAdminModule'      => FALSE,
889             'setBySetupModule'      => FALSE,
890             'default'               => FALSE,
891         )
892     );
893     
894     /**
895      * (non-PHPdoc)
896      * @see tine20/Tinebase/Config/Abstract::$_appName
897      */
898     protected $_appName = 'Tinebase';
899     
900     /**
901      * holds the instance of the singleton
902      *
903      * @var Tinebase_Config
904      */
905     private static $_instance = NULL;
906
907     /**
908      * server classes
909      *
910      * @var array
911      */
912     protected static $_serverPlugins = array(
913         'Tinebase_Server_Plugin_Json'   => 80,
914         'Tinebase_Server_Plugin_WebDAV' => 80,
915         'Tinebase_Server_Plugin_Cli'    => 90,
916         'Tinebase_Server_Plugin_Http'   => 100
917     );
918
919     /**
920      * the constructor
921      *
922      * don't use the constructor. use the singleton 
923      */
924     private function __construct() {}
925     
926     /**
927      * the constructor
928      *
929      * don't use the constructor. use the singleton 
930      */
931     private function __clone() {}
932     
933     /**
934      * Returns instance of Tinebase_Config
935      *
936      * @return Tinebase_Config
937      */
938     public static function getInstance() 
939     {
940         if (self::$_instance === NULL) {
941             self::$_instance = new Tinebase_Config();
942         }
943         
944         return self::$_instance;
945     }
946     
947     /**
948      * (non-PHPdoc)
949      * @see tine20/Tinebase/Config/Abstract::getProperties()
950      */
951     public static function getProperties()
952     {
953         return self::$_properties;
954     }
955     
956     /**
957      * get config for client registry
958      * 
959      * @return Tinebase_Config_Struct
960      */
961     public function getClientRegistryConfig()
962     {
963         // get all config names to be included in registry
964         $clientProperties = new Tinebase_Config_Struct(array());
965         $userApplications = Tinebase_Core::getUser()->getApplications(TRUE);
966         foreach ($userApplications as $application) {
967             $config = Tinebase_Config_Abstract::factory($application->name);
968             if ($config) {
969                 $clientProperties[$application->name] = new Tinebase_Config_Struct(array());
970                 $properties = $config->getProperties();
971                 foreach ((array) $properties as $name => $definition) {
972                     
973                     if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
974                         . ' ' . print_r($definition, TRUE));
975                     
976                     if ((isset($definition['clientRegistryInclude']) || array_key_exists('clientRegistryInclude', $definition))
977                         && $definition['clientRegistryInclude'] === TRUE)
978                     {
979                         // add definition here till we have a better place
980                         try {
981                             $configRegistryItem = new Tinebase_Config_Struct(array(
982                                 'value' => $config->{$name},
983                                 'definition' => new Tinebase_Config_Struct($definition),
984                             ));
985                             if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__
986                                 . ' ' . print_r($configRegistryItem->toArray(), TRUE));
987                             $clientProperties[$application->name][$name] = $configRegistryItem;
988                         } catch (Exception $e) {
989                             Tinebase_Exception::log($e);
990                         }
991                     }
992                 }
993                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ 
994                     . ' Got ' . count($clientProperties[$application->name]) . ' config items for ' . $application->name . '.');
995             }
996         }
997         
998         return $clientProperties;
999     }
1000     
1001     /**
1002      * get application config
1003      *
1004      * @param  string  $applicationName Application name
1005      * @return Tinebase_Config_Abstract  $configClass
1006      */
1007     public static function getAppConfig($applicationName)
1008     {
1009         $configClassName = $applicationName . '_Config';
1010         if (@class_exists($configClassName)) {
1011             return $configClassName::getInstance();
1012         } else {
1013             if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
1014                 . ' Application ' . $applicationName . ' has no config.');
1015             return NULL;
1016         }
1017     }
1018     
1019     /**
1020      * get option setting string
1021      * 
1022      * @deprecated
1023      * @param Tinebase_Record_Interface $_record
1024      * @param string $_id
1025      * @param string $_label
1026      * @return string
1027      */
1028     public static function getOptionString($_record, $_label)
1029     {
1030         $controller = Tinebase_Core::getApplicationInstance($_record->getApplication());
1031         $settings = $controller->getConfigSettings();
1032         $idField = $_label . '_id';
1033         
1034         $option = $settings->getOptionById($_record->{$idField}, $_label . 's');
1035         
1036         $result = (isset($option[$_label])) ? $option[$_label] : '';
1037         
1038         return $result;
1039     }
1040 }