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