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