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