sometimes we have no relayEvents
[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     const BRANDING_LOGO = 'branding_logo';
372     const BRANDING_FAVICON = 'branding_favicon';
373     const BRANDING_TITLE = 'branding_title';
374     const BRANDING_WEBURL = 'branding_weburl';
375     const BRANDING_DESCRIPTION = 'branding_description';
376
377     /**
378      * (non-PHPdoc)
379      * @see tine20/Tinebase/Config/Definition::$_properties
380      */
381     protected static $_properties = array(
382         /**
383          * possible values:
384          *
385          * $_deletePersonalContainers => delete personal containers
386          * $_keepAsContact => keep "account" as contact in the addressbook
387          * $_keepOrganizerEvents => keep accounts organizer events as external events in the calendar
388          * $_keepAsContact => keep accounts calender event attendee as external attendee
389          *
390          * TODO add more options (like move to another container)
391          */
392         self::ACCOUNT_DELETION_EVENTCONFIGURATION => array(
393             //_('Account Deletion Event')
394             'label'                 => 'Account Deletion Event',
395             //_('Configure what should happen to data of deleted users')
396             'description'           => 'Configure what should happen to data of deleted users',
397             'type'                  => 'object',
398             'class'                 => 'Tinebase_Config_Struct',
399             'clientRegistryInclude' => FALSE,
400             'setByAdminModule'      => TRUE,
401             'setBySetupModule'      => TRUE,
402         ),
403         self::IMAP => array(
404                                    //_('System IMAP')
405             'label'                 => 'System IMAP',
406                                    //_('System IMAP server configuration.')
407             'description'           => 'System IMAP server configuration.',
408             'type'                  => 'object',
409             'class'                 => 'Tinebase_Config_Struct',
410             'clientRegistryInclude' => FALSE,
411             'setByAdminModule'      => FALSE,
412             'setBySetupModule'      => TRUE,
413         ),
414         self::SMTP => array(
415                                    //_('System SMTP')
416             'label'                 => 'System SMTP',
417                                    //_('System SMTP server configuration.')
418             'description'           => 'System SMTP server configuration.',
419             'type'                  => 'object',
420             'class'                 => 'Tinebase_Config_Struct',
421             'clientRegistryInclude' => FALSE,
422             'setByAdminModule'      => FALSE,
423             'setBySetupModule'      => TRUE,
424         ),
425         self::SIEVE => array(
426                                    //_('System SIEVE')
427             'label'                 => 'System SIEVE',
428                                    //_('System SIEVE server configuration.')
429             'description'           => 'System SIEVE server configuration.',
430             'type'                  => 'object',
431             'class'                 => 'Tinebase_Config_Struct',
432             'clientRegistryInclude' => FALSE,
433             'setByAdminModule'      => FALSE,
434             'setBySetupModule'      => TRUE,
435         ),
436         self::AUTHENTICATIONBACKENDTYPE => array(
437                                    //_('Authentication Backend')
438             'label'                 => 'Authentication Backend',
439                                    //_('Backend adapter for user authentication.')
440             'description'           => 'Backend adapter for user authentication.',
441             'type'                  => 'string',
442             'clientRegistryInclude' => FALSE,
443             'setByAdminModule'      => FALSE,
444             'setBySetupModule'      => TRUE,
445         ),
446         self::AUTHENTICATIONBACKEND => array(
447                                    //_('Authentication Configuration')
448             'label'                 => 'Authentication Configuration',
449                                    //_('Authentication backend configuration.')
450             'description'           => 'Authentication backend configuration.',
451             'type'                  => 'object',
452             'class'                 => 'Tinebase_Config_Struct',
453             'clientRegistryInclude' => FALSE,
454             'setByAdminModule'      => FALSE,
455             'setBySetupModule'      => TRUE,
456         ),
457         self::USERBACKENDTYPE => array(
458                                    //_('User Backend')
459             'label'                 => 'User Backend',
460                                    //_('Backend adapter for user data.')
461             'description'           => 'Backend adapter for user data.',
462             'type'                  => 'string',
463             'clientRegistryInclude' => FALSE,
464             'setByAdminModule'      => FALSE,
465             'setBySetupModule'      => TRUE,
466         ),
467         self::USERBACKEND => array(
468                                    //_('User Configuration')
469             'label'                 => 'User Configuration',
470                                    //_('User backend configuration.')
471             'description'           => 'User backend configuration.',
472             'type'                  => 'object',
473             'class'                 => 'Tinebase_Config_Struct',
474             'clientRegistryInclude' => FALSE,
475             'setByAdminModule'      => FALSE,
476             'setBySetupModule'      => TRUE,
477         ),
478         self::ENABLED_FEATURES => array(
479             //_('Enabled Features')
480             'label'                 => 'Enabled Features',
481             'description'           => 'Enabled Features',
482             'type'                  => 'object',
483             'class'                 => 'Tinebase_Config_Struct',
484             'clientRegistryInclude' => TRUE,
485             'content'               => array(
486                 self::FEATURE_SHOW_ADVANCED_SEARCH => array(
487                     'label'         => 'Show Advanced Search', //_('Show Advanced Search')
488                     'description'   => 'Show toggle button to switch on or off the advanced search for the quickfilter',
489                     //_('Show toggle button to switch on or off the advanced search for the quickfilter')
490                 ),
491                 self::FEATURE_CONTAINER_CUSTOM_SORT => array(
492                     'label'         => 'Container Custom Sort', //_('Container Custom Sort')
493                     'description'   => 'Allows to sort containers by setting the sort order in Admin/Container',
494                     //_('Allows to sort containers by setting the sort order in Admin/Container')
495                 ),
496                 self::FEATURE_SHOW_ACCOUNT_EMAIL => array(
497                     'label'         => 'Show Account Email Address', //_('Show Account Email Address')
498                     'description'   => 'Show email address in account picker and attendee grids',
499                     //_('Show email address in account picker and attendee grids')
500                 ),
501             ),
502             'default'               => array(
503                 self::FEATURE_SHOW_ADVANCED_SEARCH  => false,
504                 self::FEATURE_CONTAINER_CUSTOM_SORT => false,
505                 self::FEATURE_SHOW_ACCOUNT_EMAIL => false,
506             ),
507         ),
508         self::CRONUSERID => array(
509                                    //_('Cronuser ID')
510             'label'                 => 'Cronuser ID',
511                                    //_('User ID of the cron user.')
512             'description'           => 'User ID of the cron user.',
513             'type'                  => 'string',
514             'clientRegistryInclude' => FALSE,
515             'setByAdminModule'      => TRUE,
516             'setBySetupModule'      => TRUE,
517         ),
518         self::PAGETITLEPOSTFIX => array(
519                                    //_('Title Postfix')
520             'label'                 => 'Title Postfix',
521                                    //_('Postfix string appended to the title of this installation.')
522             'description'           => 'Postfix string appended to the title of this installation.',
523             'type'                  => 'string',
524             'clientRegistryInclude' => FALSE,
525             'setByAdminModule'      => TRUE,
526             'setBySetupModule'      => TRUE,
527         ),
528         self::REDIRECTURL => array(
529                                    //_('Redirect URL')
530             'label'                 => 'Redirect URL',
531                                    //_('Redirect to this URL after logout.')
532             'description'           => 'Redirect to this URL after logout.',
533             'type'                  => 'string',
534             'clientRegistryInclude' => FALSE,
535             'setByAdminModule'      => FALSE,
536             'setBySetupModule'      => TRUE,
537         ),
538         self::REDIRECTTOREFERRER => array(
539                                    //_('Redirect to Referrer')
540             'label'                 => 'Redirect to Referrer',
541                                    //_('Redirect to referrer after logout.')
542             'description'           => 'Redirect to referrer after logout.',
543             'type'                  => 'bool',
544             'clientRegistryInclude' => FALSE,
545             'setByAdminModule'      => FALSE,
546             'setBySetupModule'      => TRUE,
547         ),
548         self::REDIRECTALWAYS => array(
549                                    //_('Redirect Always')
550             'label'                 => 'Redirect Always',
551                                    //_('Redirect to configured redirect URL also for login.')
552             'description'           => 'Redirect to configured redirect URL also for login.',
553             'type'                  => 'bool',
554             'clientRegistryInclude' => FALSE,
555             'setByAdminModule'      => FALSE,
556             'setBySetupModule'      => TRUE,
557         ),
558         self::ALLOWEDJSONORIGINS => array(
559                                    //_('Allowed Origins')
560             'label'                 => 'Allowed Origins',
561                                    //_('Allowed Origins for the JSON API.')
562             'description'           => 'Allowed Origins for the JSON API.',
563             'type'                  => 'array',
564             'clientRegistryInclude' => FALSE,
565             'setByAdminModule'      => FALSE,
566             'setBySetupModule'      => FALSE,
567         ),
568         self::ACCEPTEDTERMSVERSION => array(
569                                    //_('Accepted Terms Version')
570             'label'                 => 'Accepted Terms Version',
571                                    //_('Accepted version number of the terms and conditions document.')
572             'description'           => 'Accepted version number of the terms and conditions document.',
573             'type'                  => 'int',
574             'clientRegistryInclude' => FALSE,
575             'setByAdminModule'      => FALSE,
576             'setBySetupModule'      => FALSE,
577         ),
578         self::MAPPANEL => array(
579                                    //_('Use Geolocation Services')
580             'label'                 => 'Use Geolocation Services',
581                                    //_('Use of external Geolocation services is allowed.')
582             'description'           => 'Use of external Geolocation services is allowed.',
583             'type'                  => 'bool',
584             'clientRegistryInclude' => TRUE,
585             'setByAdminModule'      => FALSE,
586             'setBySetupModule'      => TRUE,
587         ),
588         self::LDAP_DISABLE_TLSREQCERT => array(
589                                    //_('Disable LDAP TLS Certificate Check')
590             'label'                 => 'Disable LDAP TLS Certificate Check',
591                                    //_('LDAP TLS Certificate should not be checked')
592             'description'           => 'LDAP TLS Certificate should not be checked',
593             'type'                  => 'bool',
594             'clientRegistryInclude' => false,
595             'setByAdminModule'      => false,
596             'setBySetupModule'      => true,
597             'default'               => false
598         ),
599         self::SYNC_USER_HOOK_CLASS => array(
600                                    //_('Configure hook class for user sync')
601             'label'                 => 'Configure hook class for user sync',
602                                    //_('Allows to change data after fetching user from sync backend')
603             'description'           => 'Allows to change data after fetching user from sync backend',
604             'type'                  => 'string',
605             'clientRegistryInclude' => false,
606             'setByAdminModule'      => false,
607             'setBySetupModule'      => true,
608         ),
609         self::SYNC_USER_CONTACT_DATA => array(
610             //_('Sync contact data from sync backend')
611             'label'                 => 'Sync contact data from sync backend',
612             //_('Sync user contact data from sync backend')
613             'description'           => 'Sync user contact data from sync backend',
614             'type'                  => 'bool',
615             'clientRegistryInclude' => FALSE,
616             'setByAdminModule'      => FALSE,
617             'setBySetupModule'      => FALSE,
618             'default'               => TRUE
619         ),
620         self::SESSIONIPVALIDATION => array(
621                                    //_('IP Session Validator')
622             'label'                 => 'IP Session Validator',
623                                    //_('Destroy session if the users IP changes.')
624             'description'           => 'Destroy session if the users IP changes.',
625             'type'                  => 'bool',
626             'clientRegistryInclude' => FALSE,
627             'setByAdminModule'      => FALSE,
628             'setBySetupModule'      => TRUE,
629         ),
630         self::SESSIONUSERAGENTVALIDATION => array(
631                                    //_('UA Session Validator')
632             'label'                 => 'UA Session Validator',
633                                    //_('Destroy session if the users user agent string changes.')
634             'description'           => 'Destroy session if the users user agent string changes.',
635             'type'                  => 'bool',
636             'clientRegistryInclude' => FALSE,
637             'setByAdminModule'      => FALSE,
638             'setBySetupModule'      => TRUE,
639         ),
640         self::FILESDIR => array(
641                                    //_('Files Directory')
642             'label'                 => 'Files Directory',
643                                    //_('Directory with web server write access for user files.')
644             'description'           => 'Directory with web server write access for user files.',
645             'type'                  => 'string',
646             'clientRegistryInclude' => FALSE,
647             'setByAdminModule'      => FALSE,
648             'setBySetupModule'      => TRUE,
649         ),
650         self::REUSEUSERNAME_SAVEUSERNAME => array(
651             //_('Reuse last username logged')
652             'label'                 => 'Reuse last username logged',
653             //_('Reuse last username logged')            
654             'description'           => 'Reuse last username logged',
655             'type'                  => 'bool',
656             'clientRegistryInclude' => FALSE,
657             'setByAdminModule'      => FALSE,
658             'setBySetupModule'      => TRUE,
659         ),
660         self::PASSWORD_CHANGE => array(
661         //_('User may change password')
662             'label'                 => 'User may change password',
663         //_('User may change password')
664             'description'           => 'User may change password',
665             'type'                  => 'bool',
666             'clientRegistryInclude' => TRUE,
667             'setByAdminModule'      => FALSE,
668             'setBySetupModule'      => TRUE,
669             'default'               => TRUE
670         ),
671         self::PASSWORD_POLICY_ACTIVE => array(
672         //_('Enable password policy')
673             'label'                 => 'Enable password policy',
674         //_('Enable password policy')
675             'description'           => 'Enable password policy',
676             'type'                  => 'bool',
677             'clientRegistryInclude' => FALSE,
678             'setByAdminModule'      => FALSE,
679             'setBySetupModule'      => TRUE,
680         ),
681         self::PASSWORD_POLICY_ONLYASCII => array(
682         //_('Only ASCII')
683             'label'                 => 'Only ASCII',
684         //_('Only ASCII characters are allowed in passwords.')
685             'description'           => 'Only ASCII characters are allowed in passwords.',
686             'type'                  => 'bool',
687             'clientRegistryInclude' => FALSE,
688             'setByAdminModule'      => FALSE,
689             'setBySetupModule'      => TRUE,
690         ),
691         self::PASSWORD_POLICY_MIN_LENGTH => array(
692         //_('Minimum length')
693             'label'                 => 'Minimum length',
694         //_('Minimum password length')
695             'description'           => 'Minimum password length.',
696             'type'                  => 'int',
697             'clientRegistryInclude' => FALSE,
698             'setByAdminModule'      => FALSE,
699             'setBySetupModule'      => TRUE,
700         ),
701         self::PASSWORD_POLICY_MIN_WORD_CHARS => array(
702         //_('Minimum word chars')
703             'label'                 => 'Minimum word chars',
704         //_('Minimum word chars in password')
705             'description'           => 'Minimum word chars in password',
706             'type'                  => 'int',
707             'clientRegistryInclude' => FALSE,
708             'setByAdminModule'      => FALSE,
709             'setBySetupModule'      => TRUE,
710         ),
711         self::PASSWORD_POLICY_MIN_UPPERCASE_CHARS => array(
712         //_('Minimum uppercase chars')
713             'label'                 => 'Minimum uppercase chars',
714         //_('Minimum uppercase chars in password')
715             'description'           => 'Minimum uppercase chars in password',
716             'type'                  => 'int',
717             'clientRegistryInclude' => FALSE,
718             'setByAdminModule'      => FALSE,
719             'setBySetupModule'      => TRUE,
720         ),
721         self::PASSWORD_POLICY_MIN_SPECIAL_CHARS => array(
722         //_('Minimum special chars')
723             'label'                 => 'Minimum special chars',
724         //_('Minimum special chars in password')
725             'description'           => 'Minimum special chars in password',
726             'type'                  => 'int',
727             'clientRegistryInclude' => FALSE,
728             'setByAdminModule'      => FALSE,
729             'setBySetupModule'      => TRUE,
730         ),
731         self::PASSWORD_POLICY_MIN_NUMBERS => array(
732         //_('Minimum numbers')
733             'label'                 => 'Minimum numbers',
734         //_('Minimum numbers in password')
735             'description'           => 'Minimum numbers in password',
736             'type'                  => 'int',
737             'clientRegistryInclude' => FALSE,
738             'setByAdminModule'      => FALSE,
739             'setBySetupModule'      => TRUE,
740         ),
741         self::PASSWORD_POLICY_FORBID_USERNAME => array(
742         //_('Forbid part of username')
743             'label'                 => 'Forbid part of username',
744         //_('Forbid part of username in password')
745             'description'           => 'Forbid part of username in password',
746             'type'                  => 'bool',
747             'clientRegistryInclude' => FALSE,
748             'setByAdminModule'      => FALSE,
749             'setBySetupModule'      => TRUE,
750         ),
751         self::AUTOMATIC_BUGREPORTS => array(
752                                    //_('Automatic bugreports')
753             'label'                 => 'Automatic bugreports',
754                                    //_('Always send bugreports, even on timeouts and other exceptions / failures.')
755             'description'           => 'Always send bugreports, even on timeouts and other exceptions / failures.',
756             'type'                  => 'bool',
757             'clientRegistryInclude' => TRUE,
758             'setByAdminModule'      => FALSE,
759             'setBySetupModule'      => TRUE,
760         ),
761         self::LAST_SESSIONS_CLEANUP_RUN => array(
762                                    //_('Last sessions cleanup run')
763             'label'                 => 'Last sessions cleanup run',
764                                    //_('Stores the timestamp of the last sessions cleanup task run.')
765             'description'           => 'Stores the timestamp of the last sessions cleanup task run.',
766             'type'                  => self::TYPE_DATETIME,
767             'clientRegistryInclude' => FALSE,
768             'setByAdminModule'      => FALSE,
769             'setBySetupModule'      => FALSE,
770         ),
771         self::WARN_LOGIN_FAILURES => array(
772             //_('Warn after X login failures')
773             'label'                 => 'Warn after X login failures',
774             //_('Maximum allowed login failures before writing warn log messages')
775             'description'           => 'Maximum allowed login failures before writing warn log messages',
776             'type'                  => 'int',
777             'clientRegistryInclude' => FALSE,
778             'setByAdminModule'      => FALSE,
779             'setBySetupModule'      => TRUE,
780             'default'               => 4
781         ),
782         self::ANYONE_ACCOUNT_DISABLED => array(
783                                    //_('Disable Anyone Account')
784             'label'                 => 'Disable Anyone Account',
785                                    //_('Disallow anyone account in grant configurations')
786             'description'           => 'Disallow anyone account in grant configurations',
787             'type'                  => 'bool',
788             'clientRegistryInclude' => TRUE,
789             'setByAdminModule'      => FALSE,
790             'setBySetupModule'      => TRUE,
791         ),
792         self::ALARMS_EACH_JOB => array(
793                                    //_('Alarms sent each job')
794             'label'                 => 'Alarms sent each job',
795                                    //_('Allows to configure the maximum number of alarm notifications in each run of sendPendingAlarms (0 = no limit)')
796             'description'           => 'Allows to configure the maximum number of alarm notifications in each run of sendPendingAlarms (0 = no limit)',
797             'type'                  => 'integer',
798             'clientRegistryInclude' => FALSE,
799             'setByAdminModule'      => FALSE,
800             'setBySetupModule'      => TRUE,
801         ),
802         self::ACCOUNT_DEACTIVATION_NOTIFICATION => array(
803             //_('Account deactivation notfication')
804             'label'                 => 'Account deactivation notfication',
805             //_('Send E-Mail to user if the account is deactivated or the user tries to login with deactivated account')
806             'description'           => 'Send E-Mail to User if the account is deactivated or the user tries to login with deactivated account',
807             'type'                  => 'bool',
808             'clientRegistryInclude' => FALSE,
809             'setByAdminModule'      => FALSE,
810             'setBySetupModule'      => TRUE,
811         ),
812         self::ROLE_CHANGE_ALLOWED => array(
813                                    //_('Role change allowed')
814             'label'                 => 'Role change allowed',
815                                    //_('Allows to configure which user is allowed to switch to another users account')
816             'description'           => 'Allows to configure which user is allowed to switch to another users account',
817             'type'                  => 'Tinebase_Config_Struct',
818             'clientRegistryInclude' => TRUE,
819             'setByAdminModule'      => FALSE,
820             'setBySetupModule'      => TRUE,
821         ),
822         self::MAX_USERNAME_LENGTH => array(
823             //_('Max username length')
824             'label'                 => 'Max username length',
825             //_('Max username length')
826             'description'           => 'Max username length',
827             'type'                  => 'int',
828             'default'               => NULL,
829             'clientRegistryInclude' => FALSE,
830         ),
831         self::CONFD_FOLDER => array(
832             //_('conf.d folder name')
833             'label'                 => 'conf.d folder name',
834             //_('Folder for additional config files (conf.d) - NOTE: this is only used if set in config.inc.php!')
835             'description'           => 'Folder for additional config files (conf.d) - NOTE: this is only used if set in config.inc.php!',
836             'type'                  => 'string',
837             'default'               => '',
838             'clientRegistryInclude' => FALSE,
839             'setByAdminModule'      => FALSE,
840             'setBySetupModule'      => FALSE,
841         ),
842         self::MAINTENANCE_MODE => array(
843             //_('Maintenance mode enabled')
844             'label'                 => 'Maintenance mode enabled',
845             //_('Folder for additional config files (conf.d) - NOTE: this is only used if set in config.inc.php!')
846             'description'           => 'Installation is in maintenance mode. With this only users having the maintenance right can login',
847             'type'                  => 'bool',
848             'default'               => '',
849             'clientRegistryInclude' => FALSE,
850             'setByAdminModule'      => TRUE,
851             'setBySetupModule'      => TRUE,
852         ),
853         self::FAT_CLIENT_CUSTOM_JS => array(
854             // NOTE: it's possible to deliver customjs vom vfs by using the tine20:// streamwrapper
855             //       tine20://<applicationid>/folders/shared/<containerid>/custom.js
856             //_('Custom Javascript includes for Fat-Client')
857             'label'                 => 'Custom Javascript includes for Fat-Client',
858             //_('An array of javascript files to include for the fat client. This files might be stored outside the docroot of the webserver.')
859             'description'           => "An array of javascript files to include for the fat client. This files might be stored outside the docroot of the webserver.",
860             'type'                  => 'array',
861             'default'               => array(),
862             'clientRegistryInclude' => FALSE,
863             'setByAdminModule'      => FALSE,
864             'setBySetupModule'      => FALSE,
865         ),
866         self::BRANDING_DESCRIPTION => array(
867                 //_('custom description')
868                 'label'                 => 'custom description',
869                 //_('Custom description for branding.')
870                 'description'           => 'Custom description for branding.',
871                 'type'                  => 'string',
872                 'default'               => '',
873                 'clientRegistryInclude' => FALSE,
874                 'setByAdminModule'      => FALSE,
875                 'setBySetupModule'      => FALSE,
876         ),
877         self::BRANDING_WEBURL => array(
878                 //_('custom weburl')
879                 'label'                 => 'custom weburl',
880                 //_('Custom weburl for branding.')
881                 'description'           => 'Custom weburl for branding.',
882                 'type'                  => 'string',
883                 'default'               => '',
884                 'clientRegistryInclude' => FALSE,
885                 'setByAdminModule'      => FALSE,
886                 'setBySetupModule'      => FALSE,
887         ),
888         self::BRANDING_TITLE => array(
889                 //_('custom title')
890                 'label'                 => 'custom title',
891                 //_('Custom title for branding.')
892                 'description'           => 'Custom ltitle for branding.',
893                 'type'                  => 'string',
894                 'default'               => '',
895                 'clientRegistryInclude' => FALSE,
896                 'setByAdminModule'      => FALSE,
897                 'setBySetupModule'      => FALSE,
898         ),
899         self::BRANDING_LOGO => array(
900                 //_('custom logo path')
901                 'label'                 => 'custom logo path',
902                 //_('Path to custom logo.')
903                 'description'           => 'Path to custom logo.',
904                 'type'                  => 'string',
905                 'default'               => '',
906                 'clientRegistryInclude' => FALSE,
907                 'setByAdminModule'      => FALSE,
908                 'setBySetupModule'      => FALSE,
909         ),
910         self::BRANDING_FAVICON => array(
911                 //_('custom favicon path')
912                 'label'                 => 'custom favicon path',
913                 //_('Path to custom favicon.')
914                 'description'           => 'Path to custom favicon.',
915                 'type'                  => 'string',
916                 'default'               => '',
917                 'clientRegistryInclude' => FALSE,
918                 'setByAdminModule'      => FALSE,
919                 'setBySetupModule'      => FALSE,
920         ),
921     );
922     
923     /**
924      * (non-PHPdoc)
925      * @see tine20/Tinebase/Config/Abstract::$_appName
926      */
927     protected $_appName = 'Tinebase';
928     
929     /**
930      * holds the instance of the singleton
931      *
932      * @var Tinebase_Config
933      */
934     private static $_instance = NULL;
935
936     /**
937      * server classes
938      *
939      * @var array
940      */
941     protected static $_serverPlugins = array(
942         'Tinebase_Server_Plugin_Json'   => 80,
943         'Tinebase_Server_Plugin_WebDAV' => 80,
944         'Tinebase_Server_Plugin_Cli'    => 90,
945         'Tinebase_Server_Plugin_Http'   => 100
946     );
947
948     /**
949      * the constructor
950      *
951      * don't use the constructor. use the singleton 
952      */
953     private function __construct() {}
954     
955     /**
956      * the constructor
957      *
958      * don't use the constructor. use the singleton 
959      */
960     private function __clone() {}
961     
962     /**
963      * Returns instance of Tinebase_Config
964      *
965      * @return Tinebase_Config
966      */
967     public static function getInstance() 
968     {
969         if (self::$_instance === NULL) {
970             self::$_instance = new Tinebase_Config();
971         }
972         
973         return self::$_instance;
974     }
975     
976     /**
977      * (non-PHPdoc)
978      * @see tine20/Tinebase/Config/Abstract::getProperties()
979      */
980     public static function getProperties()
981     {
982         return self::$_properties;
983     }
984     
985     /**
986      * get config for client registry
987      * 
988      * @return Tinebase_Config_Struct
989      */
990     public function getClientRegistryConfig()
991     {
992         // get all config names to be included in registry
993         $clientProperties = new Tinebase_Config_Struct(array());
994         $userApplications = Tinebase_Core::getUser()->getApplications(TRUE);
995         foreach ($userApplications as $application) {
996             $config = Tinebase_Config_Abstract::factory($application->name);
997             if ($config) {
998                 $clientProperties[$application->name] = new Tinebase_Config_Struct(array());
999                 $properties = $config->getProperties();
1000                 foreach ((array) $properties as $name => $definition) {
1001                     
1002                     if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
1003                         . ' ' . print_r($definition, TRUE));
1004                     
1005                     if ((isset($definition['clientRegistryInclude']) || array_key_exists('clientRegistryInclude', $definition))
1006                         && $definition['clientRegistryInclude'] === TRUE)
1007                     {
1008                         // add definition here till we have a better place
1009                         try {
1010                             $configRegistryItem = new Tinebase_Config_Struct(array(
1011                                 'value' => $config->{$name},
1012                                 'definition' => new Tinebase_Config_Struct($definition),
1013                             ));
1014                             if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__
1015                                 . ' ' . print_r($configRegistryItem->toArray(), TRUE));
1016                             $clientProperties[$application->name][$name] = $configRegistryItem;
1017                         } catch (Exception $e) {
1018                             Tinebase_Exception::log($e);
1019                         }
1020                     }
1021                 }
1022                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ 
1023                     . ' Got ' . count($clientProperties[$application->name]) . ' config items for ' . $application->name . '.');
1024             }
1025         }
1026         
1027         return $clientProperties;
1028     }
1029     
1030     /**
1031      * get application config
1032      *
1033      * @param  string  $applicationName Application name
1034      * @return Tinebase_Config_Abstract  $configClass
1035      */
1036     public static function getAppConfig($applicationName)
1037     {
1038         $configClassName = $applicationName . '_Config';
1039         if (@class_exists($configClassName)) {
1040             return $configClassName::getInstance();
1041         } else {
1042             if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
1043                 . ' Application ' . $applicationName . ' has no config.');
1044             return NULL;
1045         }
1046     }
1047     
1048     /**
1049      * get option setting string
1050      * 
1051      * @deprecated
1052      * @param Tinebase_Record_Interface $_record
1053      * @param string $_id
1054      * @param string $_label
1055      * @return string
1056      */
1057     public static function getOptionString($_record, $_label)
1058     {
1059         $controller = Tinebase_Core::getApplicationInstance($_record->getApplication());
1060         $settings = $controller->getConfigSettings();
1061         $idField = $_label . '_id';
1062         
1063         $option = $settings->getOptionById($_record->{$idField}, $_label . 's');
1064         
1065         $result = (isset($option[$_label])) ? $option[$_label] : '';
1066         
1067         return $result;
1068     }
1069 }