4 # Copyright (c) 1999-2007 The SquirrelMail Project Team
5 # Licensed under the GNU GPL. For full terms see COPYING.
7 # A simple configure script to configure SquirrelMail
10 ############################################################
11 $conf_pl_version = "1.5.0";
13 ############################################################
14 # Check what directory we're supposed to be running in, and
15 # change there if necessary. File::Basename has been in
16 # Perl since at least 5.003_7, and nobody sane runs anything
17 # before that, but just in case.
18 ############################################################
20 if ( eval q{require "File/Basename.pm"} ) {
21 $dir = File
::Basename
::dirname
($0);
25 ############################################################
26 # Some people try to run this as a CGI. That's wrong!
27 ############################################################
28 if ( defined( $ENV{'PATH_INFO'} )
29 || defined( $ENV{'QUERY_STRING'} )
30 || defined( $ENV{'REQUEST_METHOD'} ) ) {
31 print "Content-Type: text/html\n\n";
32 print "You must run this script from the command line.";
36 ############################################################
37 # If we got here, use Cwd to get the full directory path
38 # (the Basename stuff above will sometimes return '.' as
39 # the base directory, which is not helpful here).
40 ############################################################
45 ############################################################
46 # First, lets read in the data already in there...
47 ############################################################
48 if ( -e
"config.php" ) {
49 # Make sure that file is readable
50 if (! -r
"config.php") {
53 print "The file \"config/config.php\" was found, but you don't\n";
54 print "have rights to read it.\n";
56 print "Press enter to continue";
60 open( FILE
, "config.php" );
61 while ( $line = <FILE
> ) {
67 if ( $var =~ /^([a-z])/i ) {
68 @o = split ( /\s*EQUALS\s*/, $var );
69 if ( $o[0] eq "config_version" ) {
71 $o[1] =~ s/[\'\"];\s*$//;
75 $config_version = $o[1];
82 if ( $config_version ne $conf_pl_version ) {
85 print " The file \"config/config.php\" was found, but it is for\n";
86 print " an older version of SquirrelMail. It is possible to still\n";
87 print " read the defaults from this file but be warned that many\n";
88 print " preferences change between versions. It is recommended that\n";
89 print " you start with a clean config.php for each upgrade that you\n";
90 print " do. To do this, just move config/config.php out of the way.\n";
92 print "Continue loading with the old config.php [y/N]? ";
95 if ( ( $ctu !~ /^y\n/i ) || ( $ctu =~ /^\n/ ) ) {
99 print "\nDo you want me to stop warning you [y/N]? ";
101 if ( $ctu =~ /^y\n/i ) {
102 $print_config_version = $conf_pl_version;
104 $print_config_version = $config_version;
107 $print_config_version = $config_version;
111 open( FILE
, "config.php" );
112 } elsif ( -e
"config_default.php" ) {
113 open( FILE
, "config_default.php" );
114 while ( $line = <FILE
> ) {
120 if ( $var =~ /^([a-z])/i ) {
121 @o = split ( /\s*EQUALS\s*/, $var );
122 if ( $o[0] eq "config_version" ) {
123 $o[1] =~ s/[\n\r]//g;
124 $o[1] =~ s/[\'\"];\s*$//;
126 $o[1] =~ s/^[\'\"]//;
128 $config_version = $o[1];
135 if ( $config_version ne $conf_pl_version ) {
138 print " You are trying to use a 'config_default.php' from an older\n";
139 print " version of SquirrelMail. This is HIGHLY unrecommended. You\n";
140 print " should get the 'config_default.php' that matches the version\n";
141 print " of SquirrelMail that you are running. You can get this from\n";
142 print " the SquirrelMail web page by going to the following URL:\n";
143 print " http://squirrelmail.org.\n";
145 print "Continue loading with old config_default.php (a bad idea) [y/N]? ";
148 if ( ( $ctu !~ /^y\n/i ) || ( $ctu =~ /^\n/ ) ) {
152 print "\nDo you want me to stop warning you [y/N]? ";
154 if ( $ctu =~ /^y\n/i ) {
155 $print_config_version = $conf_pl_version;
157 $print_config_version = $config_version;
160 $print_config_version = $config_version;
163 open( FILE
, "config_default.php" );
165 print "No configuration file found. Please get config_default.php\n";
166 print "or config.php before running this again. This program needs\n";
167 print "a default config file to get default values.\n";
171 # Read and parse the current configuration file
172 # (either config.php or config_default.php).
173 while ( $line = <FILE
> ) {
179 if ( $var =~ /^([a-z])/i ) {
180 @options = split ( /\s*EQUALS\s*/, $var );
181 $options[1] =~ s/[\n\r]//g;
182 $options[1] =~ s/[\'\"];\s*$//;
183 $options[1] =~ s/;$//;
184 $options[1] =~ s/^[\'\"]//;
185 # de-escape escaped strings
186 $options[1] =~ s/\\'/'/g;
187 $options[1] =~ s/\\\\/\\/g;
189 if ( $options[0] =~ /^user_themes\[[0-9]+\]\[['"]PATH['"]\]/ ) {
191 $sub =~ s/\]\[['"]PATH['"]\]//;
193 if ( -e
"../css/" ) {
194 $options[1] =~ s/^\.\.\/config/\
.\
.\
/css/;
196 $user_theme_path[$sub] = &change_to_rel_path
($options[1]);
197 } elsif ( $options[0] =~ /^user_themes\[[0-9]+\]\[['"]NAME['"]\]/ ) {
199 $sub =~ s/\]\[['"]NAME['"]\]//;
201 $user_theme_name[$sub] = $options[1];
202 } elsif ( $options[0] =~ /^icon_themes\[[0-9]+\]\[['"]PATH['"]\]/ ) {
204 $sub =~ s/\]\[['"]PATH['"]\]//;
206 if ( -e
"../images/" ) {
207 $options[1] =~ s/^\.\.\/config/\
.\
.\
/images/;
209 $icon_theme_path[$sub] = &change_to_rel_path
($options[1]);
210 } elsif ( $options[0] =~ /^icon_themes\[[0-9]+\]\[['"]NAME['"]\]/ ) {
212 $sub =~ s/\]\[['"]NAME['"]\]//;
214 $icon_theme_name[$sub] = $options[1];
215 } elsif ( $options[0] =~ /^aTemplateSet\[[0-9]+\]\[['"]ID['"]\]/ ) {
217 $sub =~ s/\]\[['"]ID['"]\]//;
219 if ( -e
"../templates" ) {
220 $options[1] =~ s/^\.\.\/config/\
.\
.\
/templates/;
222 $templateset_id[$sub] = $options[1];
223 ##### FIXME: This section BELOW here so old prefs files don't blow up when running conf.pl
224 ##### Remove after a month or two
225 } elsif ( $options[0] =~ /^aTemplateSet\[[0-9]+\]\[['"]PATH['"]\]/ ) {
227 $sub =~ s/\]\[['"]PATH['"]\]//;
229 if ( -e
"../templates" ) {
230 $options[1] =~ s/^\.\.\/config/\
.\
.\
/templates/;
232 $templateset_id[$sub] = $options[1];
233 ##### FIXME: This section ABOVE here so old prefs files don't blow up when running conf.pl
234 ##### Remove after a month or two
235 } elsif ( $options[0] =~ /^aTemplateSet\[[0-9]+\]\[['"]NAME['"]\]/ ) {
237 $sub =~ s/\]\[['"]NAME['"]\]//;
239 $templateset_name[$sub] = $options[1];
240 } elsif ( $options[0] =~ /^plugins\[[0-9]*\]/ ) {
243 $sub =~ s/^plugins\[//;
245 push @plugins, $options[1];
247 $plugins[$sub] = $options[1];
249 } elsif ($options[0] =~ /^fontsets\[\'[a-z]*\'\]/) {
250 # parse associative $fontsets array
253 $sub =~ s/^fontsets\[\'//;
254 $fontsets{$sub} = $options[1];
255 } elsif ( $options[0] =~ /^theme\[[0-9]+\]\[['"]PATH|NAME['"]\]/ ) {
257 ## $color themes are no longer supported. Please leave this
258 ## so conf.pl doesn't barf if it encounters a $theme.
260 } elsif ( $options[0] =~ /^ldap_server\[[0-9]+\]/ ) {
263 $sub =~ s/^ldap_server\[//;
265 while ( ( $tmp = <FILE
> ) && ( $continue != 1 ) ) {
266 if ( $tmp =~ /\);\s*$/ ) {
270 if ( $tmp =~ /^\s*[\'\"]host[\'\"]/i ) {
271 $tmp =~ s/^\s*[\'\"]host[\'\"]\s*=>\s*[\'\"]//i;
272 $tmp =~ s/[\'\"],?\s*$//;
273 $tmp =~ s/[\'\"]\);\s*$//;
275 } elsif ( $tmp =~ /^\s*[\'\"]base[\'\"]/i ) {
276 $tmp =~ s/^\s*[\'\"]base[\'\"]\s*=>\s*[\'\"]//i;
277 $tmp =~ s/[\'\"],?\s*$//;
278 $tmp =~ s/[\'\"]\);\s*$//;
280 } elsif ( $tmp =~ /^\s*[\'\"]charset[\'\"]/i ) {
281 $tmp =~ s/^\s*[\'\"]charset[\'\"]\s*=>\s*[\'\"]//i;
282 $tmp =~ s/[\'\"],?\s*$//;
283 $tmp =~ s/[\'\"]\);\s*$//;
285 } elsif ( $tmp =~ /^\s*[\'\"]port[\'\"]/i ) {
286 $tmp =~ s/^\s*[\'\"]port[\'\"]\s*=>\s*[\'\"]?//i;
287 $tmp =~ s/[\'\"]?,?\s*$//;
288 $tmp =~ s/[\'\"]?\);\s*$//;
290 } elsif ( $tmp =~ /^\s*[\'\"]maxrows[\'\"]/i ) {
291 $tmp =~ s/^\s*[\'\"]maxrows[\'\"]\s*=>\s*[\'\"]?//i;
292 $tmp =~ s/[\'\"]?,?\s*$//;
293 $tmp =~ s/[\'\"]?\);\s*$//;
295 } elsif ( $tmp =~ /^\s*[\'\"]filter[\'\"]/i ) {
296 $tmp =~ s/^\s*[\'\"]filter[\'\"]\s*=>\s*[\'\"]?//i;
297 $tmp =~ s/[\'\"]?,?\s*$//;
298 $tmp =~ s/[\'\"]?\);\s*$//;
300 } elsif ( $tmp =~ /^\s*[\'\"]name[\'\"]/i ) {
301 $tmp =~ s/^\s*[\'\"]name[\'\"]\s*=>\s*[\'\"]//i;
302 $tmp =~ s/[\'\"],?\s*$//;
303 $tmp =~ s/[\'\"]\);\s*$//;
305 } elsif ( $tmp =~ /^\s*[\'\"]binddn[\'\"]/i ) {
306 $tmp =~ s/^\s*[\'\"]binddn[\'\"]\s*=>\s*[\'\"]//i;
307 $tmp =~ s/[\'\"],?\s*$//;
308 $tmp =~ s/[\'\"]\);\s*$//;
310 } elsif ( $tmp =~ /^\s*[\'\"]bindpw[\'\"]/i ) {
311 $tmp =~ s/^\s*[\'\"]bindpw[\'\"]\s*=>\s*[\'\"]//i;
312 $tmp =~ s/[\'\"],?\s*$//;
313 $tmp =~ s/[\'\"]\);\s*$//;
315 } elsif ( $tmp =~ /^\s*[\'\"]protocol[\'\"]/i ) {
316 $tmp =~ s/^\s*[\'\"]protocol[\'\"]\s*=>\s*[\'\"]?//i;
317 $tmp =~ s/[\'\"]?,?\s*$//;
318 $tmp =~ s/[\'\"]?\);\s*$//;
320 } elsif ( $tmp =~ /^\s*[\'\"]limit_scope[\'\"]/i ) {
321 $tmp =~ s/^\s*[\'\"]limit_scope[\'\"]\s*=>\s*[\'\"]?//i;
322 $tmp =~ s/[\'\"]?,?\s*$//;
323 $tmp =~ s/[\'\"]?\);\s*$//;
325 } elsif ( $tmp =~ /^\s*[\'\"]listing[\'\"]/i ) {
326 $tmp =~ s/^\s*[\'\"]listing[\'\"]\s*=>\s*[\'\"]?//i;
327 $tmp =~ s/[\'\"]?,?\s*$//;
328 $tmp =~ s/[\'\"]?\);\s*$//;
330 } elsif ( $tmp =~ /^\s*[\'\"]writeable[\'\"]/i ) {
331 $tmp =~ s/^\s*[\'\"]writeable[\'\"]\s*=>\s*[\'\"]?//i;
332 $tmp =~ s/[\'\"]?,?\s*$//;
333 $tmp =~ s/[\'\"]?\);\s*$//;
335 } elsif ( $tmp =~ /^\s*[\'\"]search_tree[\'\"]/i ) {
336 $tmp =~ s/^\s*[\'\"]search_tree[\'\"]\s*=>\s*[\'\"]?//i;
337 $tmp =~ s/[\'\"]?,?\s*$//;
338 $tmp =~ s/[\'\"]?\);\s*$//;
340 } elsif ( $tmp =~ /^\s*[\'\"]starttls[\'\"]/i ) {
341 $tmp =~ s/^\s*[\'\"]starttls[\'\"]\s*=>\s*[\'\"]?//i;
342 $tmp =~ s/[\'\"]?,?\s*$//;
343 $tmp =~ s/[\'\"]?\);\s*$//;
347 $ldap_host[$sub] = $host;
348 $ldap_base[$sub] = $base;
349 $ldap_name[$sub] = $name;
350 $ldap_port[$sub] = $port;
351 $ldap_maxrows[$sub] = $maxrows;
352 $ldap_filter[$sub] = $filter;
353 $ldap_charset[$sub] = $charset;
354 $ldap_binddn[$sub] = $binddn;
355 $ldap_bindpw[$sub] = $bindpw;
356 $ldap_protocol[$sub] = $protocol;
357 $ldap_limit_scope[$sub] = $limit_scope;
358 $ldap_listing[$sub] = $listing;
359 $ldap_writeable[$sub] = $writeable;
360 $ldap_search_tree[$sub] = $search_tree;
361 $ldap_starttls[$sub] = $starttls;
362 } elsif ( $options[0] =~ /^(data_dir|attachment_dir|org_logo|signout_page|icon_theme_def)$/ ) {
363 ${ $options[0] } = &change_to_rel_path
($options[1]);
365 ${ $options[0] } = $options[1];
371 # FIXME: unknown introduction date
372 $useSendmail = 'false' if ( lc($useSendmail) ne 'true' );
373 $sendmail_path = "/usr/sbin/sendmail" if ( !$sendmail_path );
374 $pop_before_smtp = 'false' if ( !$pop_before_smtp );
375 $default_unseen_notify = 2 if ( !$default_unseen_notify );
376 $default_unseen_type = 1 if ( !$default_unseen_type );
377 $config_use_color = 0 if ( !$config_use_color );
378 $invert_time = 'false' if ( !$invert_time );
379 $force_username_lowercase = 'false' if ( !$force_username_lowercase );
380 $optional_delimiter = "detect" if ( !$optional_delimiter );
381 $auto_create_special = 'false' if ( !$auto_create_special );
382 $default_use_priority = 'true' if ( !$default_use_priority );
383 $default_use_mdn = 'true' if ( !$default_use_mdn );
384 $delete_folder = 'false' if ( !$delete_folder );
385 $noselect_fix_enable = 'false' if ( !$noselect_fix_enable );
386 $frame_top = "_top" if ( !$frame_top );
387 $provider_uri = '' if ( !$provider_uri );
388 $provider_name = '' if ( !$provider_name || $provider_name eq 'SquirrelMail');
389 $no_list_for_subscribe = 'false' if ( !$no_list_for_subscribe );
390 $allow_charset_search = 'true' if ( !$allow_charset_search );
391 $allow_advanced_search = 0 if ( !$allow_advanced_search) ;
392 $prefs_user_field = 'user' if ( !$prefs_user_field );
393 $prefs_key_field = 'prefkey' if ( !$prefs_key_field );
394 $prefs_val_field = 'prefval' if ( !$prefs_val_field );
395 $session_name = 'SQMSESSID' if ( !$session_name );
396 $skip_SM_header = 'false' if ( !$skip_SM_header );
397 $default_use_javascript_addr_book = 'false' if (! $default_use_javascript_addr_book);
400 $hide_sm_attributions = 'false' if ( !$hide_sm_attributions );
402 $edit_identity = 'true' if ( !$edit_identity );
403 $edit_name = 'true' if ( !$edit_name );
406 $use_smtp_tls= 'false' if ( !$use_smtp_tls);
407 $smtp_auth_mech = 'none' if ( !$smtp_auth_mech );
408 $use_imap_tls = 'false' if ( !$use_imap_tls );
409 $imap_auth_mech = 'login' if ( !$imap_auth_mech );
412 $show_alternative_names = 'false' if ( !$show_alternative_names );
413 # $available_languages option available only in 1.5.0. removed due to $languages
414 # implementation changes. options are provided by limit_languages plugin
415 # $available_languages = 'all' if ( !$available_languages );
416 $aggressive_decoding = 'false' if ( !$aggressive_decoding );
417 # available only in 1.5.0 and 1.5.1
418 # $advanced_tree = 'false' if ( !$advanced_tree );
419 $use_php_recode = 'false' if ( !$use_php_recode );
420 $use_php_iconv = 'false' if ( !$use_php_iconv );
423 $use_icons = 'false' if ( !$use_icons );
424 $use_iframe = 'false' if ( !$use_iframe );
425 $lossy_encoding = 'false' if ( !$lossy_encoding );
426 $allow_remote_configtest = 'false' if ( !$allow_remote_configtest );
427 $secured_config = 'true' if ( !$secured_config );
429 $sm_debug_mode = 'SM_DEBUG_MODE_MODERATE' if ( !$sm_debug_mode );
430 #FIXME: When this is STABLE software, remove the line above and uncomment the one below:
431 #$sm_debug_mode = 'SM_DEBUG_MODE_OFF' if ( !$sm_debug_mode );
432 $sm_debug_mode = convert_debug_binary_integer_to_constants
($sm_debug_mode);
434 $addrbook_global_table = 'global_abook' if ( !$addrbook_global_table );
435 $addrbook_global_writeable = 'false' if ( !$addrbook_global_writeable );
436 $addrbook_global_listing = 'false' if ( !$addrbook_global_listing );
437 $abook_global_file = '' if ( !$abook_global_file);
438 $abook_global_file_writeable = 'false' if ( !$abook_global_file_writeable);
439 $abook_global_file_listing = 'true' if ( !$abook_global_file_listing );
440 $encode_header_key = '' if ( !$encode_header_key );
441 $hide_auth_header = 'false' if ( !$hide_auth_header );
442 $time_zone_type = '0' if ( !$time_zone_type );
443 $prefs_user_size = 128 if ( !$prefs_user_size );
444 $prefs_key_size = 64 if ( !$prefs_key_size );
445 $prefs_val_size = 65536 if ( !$prefs_val_size );
447 # add qmail-inject test here for backwards compatibility
448 if ( !$sendmail_args && $sendmail_path =~ /qmail-inject/ ) {
450 } elsif ( !$sendmail_args ) {
451 $sendmail_args = '-i -t';
454 $default_fontsize = '' if ( !$default_fontsize);
455 $default_fontset = '' if ( !$default_fontset);
457 %fontsets = ('serif', 'serif',
458 'sans', 'helvetica,arial,sans-serif',
459 'comicsans', 'comic sans ms,sans-serif',
460 'tahoma', 'tahoma,sans-serif',
461 'verasans', 'bitstream vera sans,verdana,sans-serif');
464 # $use_imap_tls and $use_smtp_tls are switched to integer since 1.5.1
465 $use_imap_tls = 0 if ( $use_imap_tls eq 'false');
466 $use_imap_tls = 1 if ( $use_imap_tls eq 'true');
467 $use_smtp_tls = 0 if ( $use_smtp_tls eq 'false');
468 $use_smtp_tls = 1 if ( $use_smtp_tls eq 'true');
469 # sorting options changed names and reversed values in 1.5.1
470 $disable_thread_sort = 'false' if ( !$disable_thread_sort );
471 $disable_server_sort = 'false' if ( !$disable_server_sort );
474 $abook_file_line_length = 2048 if ( !$abook_file_line_length );
475 $config_location_base = '' if ( !$config_location_base );
476 $smtp_sitewide_user = '' if ( !$smtp_sitewide_user );
477 $smtp_sitewide_pass = '' if ( !$smtp_sitewide_pass );
478 $icon_theme_def = '' if ( !$icon_theme_def );
479 $disable_plugins = 'false' if ( !$disable_plugins );
480 $disable_plugins_user = '' if ( !$disable_plugins_user );
481 $only_secure_cookies = 'true' if ( !$only_secure_cookies );
482 $ask_user_info = 'true' if ( !$ask_user_info );
484 if ( $ARGV[0] eq '--install-plugin' ) {
485 print "Activating plugin " . $ARGV[1] . "\n";
486 if ( -d
"../plugins/" . $ARGV[1]) {
487 push @plugins, $ARGV[1];
491 print "No such plugin.\n";
494 } elsif ( $ARGV[0] eq '--remove-plugin' ) {
495 print "Removing plugin " . $ARGV[1] . "\n";
496 foreach $plugin (@plugins) {
497 if ( $plugin ne $ARGV[1] ) {
498 push @newplugins, $plugin;
501 @plugins = @newplugins;
504 } elsif ( $ARGV[0] eq '--update-plugins' or $ARGV[0] eq '-u') {
505 build_plugin_hook_array
();
507 } elsif ( $ARGV[0] eq '--help' or $ARGV[0] eq '-h') {
508 print "SquirrelMail Configuration Script\n";
510 print " * No arguments: initiates the configuration dialog\n";
511 print " * --install-plugin <plugin> : activates the specified plugin\n";
512 print " * --remove-plugin <plugin> : deactivates the specified plugin\n";
513 print " * --update-plugins , -u : rebuilds plugin_hooks.php according\n";
514 print " to plugins activated in config.php\n";
515 print " * --help , -h : Displays this help\n";
522 ####################################################################################
524 # used in multiple places, define once
525 $list_supported_imap_servers =
526 " bincimap = Binc IMAP server\n" .
527 " courier = Courier IMAP server\n" .
528 " cyrus = Cyrus IMAP server\n" .
529 " dovecot = Dovecot Secure IMAP server\n" .
530 " exchange = Microsoft Exchange IMAP server\n" .
531 " hmailserver = hMailServer\n" .
532 " macosx = Mac OS X Mailserver\n" .
533 " mercury32 = Mercury/32\n" .
534 " uw = University of Washington's IMAP server\n";
536 #####################################################################################
537 if ( $config_use_color == 1 ) {
543 $config_use_color = 2;
546 # lists can be printed in more than one column; default is just one
550 # try to get screen width dynamically if possible; default to 80
551 # (user can override with "w#" command)
553 eval { require "sys/ioctl.ph" };
555 || !defined &TIOCGWINSZ
556 || !open(TTY
, "+</dev/tty")
557 || !ioctl(TTY
, &TIOCGWINSZ
, $winsize='')) {
560 ($row, $col, $xpixel, $ypixel) = unpack('S4', $winsize);
561 $screen_width = $col;
564 while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
566 print $WHT. "SquirrelMail Configuration : " . $NRM;
567 if ( $config == 1 ) { print "Read: config.php"; }
568 elsif ( $config == 2 ) { print "Read: config_default.php"; }
569 print " ($print_config_version)\n";
570 print "---------------------------------------------------------\n";
573 print $WHT. "Main Menu --\n" . $NRM;
574 print "1. Organization Preferences\n";
575 print "2. Server Settings\n";
576 print "3. Folder Defaults\n";
577 print "4. General Options\n";
578 print "5. User Interface\n";
579 print "6. Address Books\n";
580 print "7. Message of the Day (MOTD)\n";
581 print "8. Plugins\n";
582 print "9. Database\n";
583 print "10. Language settings\n";
584 print "11. Tweaks\n";
586 print "D. Set pre-defined settings for specific IMAP servers\n";
588 } elsif ( $menu == 1 ) {
589 print $WHT. "Organization Preferences\n" . $NRM;
590 print "1. Organization Name : $WHT$org_name$NRM\n";
591 print "2. Organization Logo : $WHT$org_logo$NRM\n";
592 print "3. Org. Logo Width/Height : $WHT($org_logo_width/$org_logo_height)$NRM\n";
593 print "4. Organization Title : $WHT$org_title$NRM\n";
594 print "5. Signout Page : $WHT$signout_page$NRM\n";
595 print "6. Top Frame : $WHT$frame_top$NRM\n";
596 print "7. Provider link : $WHT$provider_uri$NRM\n";
597 print "8. Provider link text : $WHT$provider_name$NRM\n";
600 print "R Return to Main Menu\n";
601 } elsif ( $menu == 2 ) {
602 print $WHT. "Server Settings\n\n" . $NRM;
603 print $WHT . "General" . $NRM . "\n";
605 print "1. Domain : $WHT$domain$NRM\n";
606 print "2. Invert Time : $WHT$invert_time$NRM\n";
607 print "3. Sendmail or SMTP : $WHT";
608 if ( lc($useSendmail) eq 'true' ) {
616 if ( $show_imap_settings ) {
617 print $WHT . "IMAP Settings". $NRM . "\n--------------\n";
618 print "4. IMAP Server : $WHT$imapServerAddress$NRM\n";
619 print "5. IMAP Port : $WHT$imapPort$NRM\n";
620 print "6. Authentication type : $WHT$imap_auth_mech$NRM\n";
621 print "7. Secure IMAP (TLS) : $WHT" . display_use_tls
($use_imap_tls) . "$NRM\n";
622 print "8. Server software : $WHT$imap_server_type$NRM\n";
623 print "9. Delimiter : $WHT$optional_delimiter$NRM\n";
625 } elsif ( $show_smtp_settings ) {
626 if ( lc($useSendmail) eq 'true' ) {
627 print $WHT . "Sendmail" . $NRM . "\n--------\n";
628 print "4. Sendmail Path : $WHT$sendmail_path$NRM\n";
629 print "5. Sendmail arguments : $WHT$sendmail_args$NRM\n";
630 print "6. Header encryption key : $WHT$encode_header_key$NRM\n";
633 print $WHT . "SMTP Settings" . $NRM . "\n-------------\n";
634 print "4. SMTP Server : $WHT$smtpServerAddress$NRM\n";
635 print "5. SMTP Port : $WHT$smtpPort$NRM\n";
636 print "6. POP before SMTP : $WHT$pop_before_smtp$NRM\n";
637 print "7. SMTP Authentication : $WHT$smtp_auth_mech" . display_smtp_sitewide_userpass
() ."$NRM\n";
638 print "8. Secure SMTP (TLS) : $WHT" . display_use_tls
($use_smtp_tls) . "$NRM\n";
639 print "9. Header encryption key : $WHT$encode_header_key$NRM\n";
644 if ($show_imap_settings == 0) {
645 print "A. Update IMAP Settings : ";
646 print "$WHT$imapServerAddress$NRM:";
647 print "$WHT$imapPort$NRM ";
648 print "($WHT$imap_server_type$NRM)\n";
650 if ($show_smtp_settings == 0) {
651 if ( lc($useSendmail) eq 'true' ) {
652 print "B. Change Sendmail Config : $WHT$sendmail_path$NRM\n";
654 print "B. Update SMTP Settings : ";
655 print "$WHT$smtpServerAddress$NRM:";
656 print "$WHT$smtpPort$NRM\n";
659 if ( $show_smtp_settings || $show_imap_settings )
662 ($show_imap_settings ?
"IMAP Server" :
663 (lc($useSendmail) eq 'true') ?
"Sendmail" : "SMTP") . " Settings\n";
667 print "R Return to Main Menu\n";
668 } elsif ( $menu == 3 ) {
669 print $WHT. "Folder Defaults\n" . $NRM;
670 print "1. Default Folder Prefix : $WHT$default_folder_prefix$NRM\n";
671 print "2. Show Folder Prefix Option : $WHT$show_prefix_option$NRM\n";
672 print "3. Trash Folder : $WHT$trash_folder$NRM\n";
673 print "4. Sent Folder : $WHT$sent_folder$NRM\n";
674 print "5. Drafts Folder : $WHT$draft_folder$NRM\n";
675 print "6. By default, move to trash : $WHT$default_move_to_trash$NRM\n";
676 print "7. By default, save sent messages : $WHT$default_move_to_sent$NRM\n";
677 print "8. By default, save as draft : $WHT$default_save_as_draft$NRM\n";
678 print "9. List Special Folders First : $WHT$list_special_folders_first$NRM\n";
679 print "10. Show Special Folders Color : $WHT$use_special_folder_color$NRM\n";
680 print "11. Auto Expunge : $WHT$auto_expunge$NRM\n";
681 print "12. Default Sub. of INBOX : $WHT$default_sub_of_inbox$NRM\n";
682 print "13. Show 'Contain Sub.' Option : $WHT$show_contain_subfolders_option$NRM\n";
683 print "14. Default Unseen Notify : $WHT$default_unseen_notify$NRM\n";
684 print "15. Default Unseen Type : $WHT$default_unseen_type$NRM\n";
685 print "16. Auto Create Special Folders : $WHT$auto_create_special$NRM\n";
686 print "17. Folder Delete Bypasses Trash : $WHT$delete_folder$NRM\n";
687 print "18. Enable /NoSelect folder fix : $WHT$noselect_fix_enable$NRM\n";
689 print "R Return to Main Menu\n";
690 } elsif ( $menu == 4 ) {
691 print $WHT. "General Options\n" . $NRM;
692 print "1. Data Directory : $WHT$data_dir$NRM\n";
693 print "2. Attachment Directory : $WHT$attachment_dir$NRM\n";
694 print "3. Directory Hash Level : $WHT$dir_hash_level$NRM\n";
695 print "4. Default Left Size : $WHT$default_left_size$NRM\n";
696 print "5. Usernames in Lowercase : $WHT$force_username_lowercase$NRM\n";
697 print "6. Allow use of priority : $WHT$default_use_priority$NRM\n";
698 print "7. Hide SM attributions : $WHT$hide_sm_attributions$NRM\n";
699 print "8. Allow use of receipts : $WHT$default_use_mdn$NRM\n";
700 print "9. Allow editing of identity : $WHT$edit_identity$NRM\n";
701 print " Allow editing of name : $WHT$edit_name$NRM\n";
702 print " Remove username from header : $WHT$hide_auth_header$NRM\n";
703 print "10. Disable server thread sort : $WHT$disable_thread_sort$NRM\n";
704 print "11. Disable server-side sorting : $WHT$disable_server_sort$NRM\n";
705 print "12. Allow server charset search : $WHT$allow_charset_search$NRM\n";
706 print "13. Allow advanced search : $WHT$allow_advanced_search$NRM\n";
707 print "14. PHP session name : $WHT$session_name$NRM\n";
708 print "15. Time zone configuration : $WHT$time_zone_type$NRM\n";
709 print "16. Location base : $WHT$config_location_base$NRM\n";
710 print "17. Only secure cookies if poss. : $WHT$only_secure_cookies$NRM\n";
712 print "R Return to Main Menu\n";
713 } elsif ( $menu == 5 ) {
714 print $WHT. "User Interface\n" . $NRM;
715 print "1. Use Icons? : $WHT$use_icons$NRM\n";
716 # print "3. Default Icon Set : $WHT$icon_theme_def$NRM\n";
717 print "2. Default font size : $WHT$default_fontsize$NRM\n";
718 print "3. Manage template sets (skins)\n";
719 print "4. Manage user themes\n";
720 print "5. Manage font sets\n";
721 print "6. Manage icon themes\n";
724 print "R Return to Main Menu\n";
725 } elsif ( $menu == 6 ) {
726 print $WHT. "Address Books\n" . $NRM;
727 print "1. Change LDAP Servers\n";
728 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
729 print " > $ldap_host[$count]\n";
731 print "2. Use Javascript address book search : $WHT$default_use_javascript_addr_book$NRM\n";
732 print "3. Global address book file : $WHT$abook_global_file$NRM\n";
733 print "4. Allow writing into global file address book : $WHT$abook_global_file_writeable$NRM\n";
734 print "5. Allow listing of global file address book : $WHT$abook_global_file_listing$NRM\n";
735 print "6. Allowed address book line length : $WHT$abook_file_line_length$NRM\n";
737 print "R Return to Main Menu\n";
738 } elsif ( $menu == 7 ) {
739 print $WHT. "Message of the Day (MOTD)\n" . $NRM;
742 print "1 Edit the MOTD\n";
744 print "R Return to Main Menu\n";
745 } elsif ( $menu == 8 ) {
746 if (lc($disable_plugins) eq 'true' && $disable_plugins_user ne '') {
747 print $WHT. "Plugins (WARNING: All plugins are currently disabled\n for the user \"$disable_plugins_user\"!)\n" . $NRM;
748 } elsif (lc($disable_plugins) eq 'true') {
749 print $WHT. "Plugins (WARNING: All plugins are currently disabled!)\n" . $NRM;
751 print $WHT. "Plugins\n" . $NRM;
753 print " Installed Plugins\n";
755 $num = print_multi_col_list
(1, $columns, $screen_width, 1, @plugins);
758 for ( $count = 0 ; $count <= $#plugins ; $count++ ) {
760 $english_name = get_plugin_english_name
($plugins[$count]);
761 if ( $english_name eq "" ) {
762 print " $WHT$num.$NRM $plugins[$count]" . get_plugin_version
($plugins[$count]) . "\n";
764 print " $WHT$num.$NRM $english_name ($plugins[$count])" . get_plugin_version
($plugins[$count]) . "\n";
768 print "\n Available Plugins:\n";
769 opendir( DIR
, "../plugins" );
770 @files = sort(readdir(DIR
));
772 @unused_plugins = ();
773 for ( $i = 0 ; $i <= $#files ; $i++ ) {
774 if ( -d
"../plugins/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne ".svn" ) {
776 for ( $k = 0 ; $k <= $#plugins ; $k++ ) {
777 if ( $plugins[$k] eq $files[$i] ) {
782 $unused_plugins[$pos] = $files[$i];
789 $num = print_multi_col_list
($num + 1, $columns, $screen_width, 1, @unused_plugins);
791 for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
793 $english_name = get_plugin_english_name
($unused_plugins[$i]);
794 if ( $english_name eq "" ) {
795 print " $WHT$num.$NRM $unused_plugins[$i]" . get_plugin_version
($unused_plugins[$i]) . "\n";
797 print " $WHT$num.$NRM $english_name ($unused_plugins[$i])" . get_plugin_version
($unused_plugins[$i]) . "\n";
804 if (lc($disable_plugins) eq 'true' && $disable_plugins_user ne '') {
805 print "E Enable active plugins (all plugins currently\n disabled for the user \"$disable_plugins_user\")\n";
806 } elsif (lc($disable_plugins) eq 'true') {
807 print "E Enable active plugins (all plugins currently\n disabled)\n";
809 print "D Disable all plugins\n";
811 print "U Set the user for whom plugins can be disabled\n";
812 print "R Return to Main Menu\n";
813 print "C# List plugins in <#> number of columns\n";
814 print "W# Change screen width to <#> (currently $screen_width)\n";
815 } elsif ( $menu == 9 ) {
816 print $WHT. "Database\n" . $NRM;
817 print "1. DSN for Address Book : $WHT$addrbook_dsn$NRM\n";
818 print "2. Table for Address Book : $WHT$addrbook_table$NRM\n";
820 print "3. DSN for Preferences : $WHT$prefs_dsn$NRM\n";
821 print "4. Table for Preferences : $WHT$prefs_table$NRM\n";
822 print "5. Field for username : $WHT$prefs_user_field$NRM ($prefs_user_size)\n";
823 print "6. Field for prefs key : $WHT$prefs_key_field$NRM ($prefs_key_size)\n";
824 print "7. Field for prefs value : $WHT$prefs_val_field$NRM ($prefs_val_size)\n";
826 print "8. DSN for Global Address Book : $WHT$addrbook_global_dsn$NRM\n";
827 print "9. Table for Global Address Book : $WHT$addrbook_global_table$NRM\n";
828 print "10. Allow writing into Global Address Book : $WHT$addrbook_global_writeable$NRM\n";
829 print "11. Allow listing of Global Address Book : $WHT$addrbook_global_listing$NRM\n";
831 print "R Return to Main Menu\n";
832 } elsif ( $menu == 10 ) {
833 print $WHT. "Language settings\n" . $NRM;
834 print "1. Default Language : $WHT$squirrelmail_default_language$NRM\n";
835 print "2. Default Charset : $WHT$default_charset$NRM\n";
836 print "3. Show alternative language names : $WHT$show_alternative_names$NRM\n";
837 print "4. Enable aggressive decoding : $WHT$aggressive_decoding$NRM\n";
838 print "5. Enable lossy encoding : $WHT$lossy_encoding$NRM\n";
840 print "R Return to Main Menu\n";
841 } elsif ( $menu == 11 ) {
842 print $WHT. "Interface tweaks\n" . $NRM;
843 print "1. Display html mails in iframe : $WHT$use_iframe$NRM\n";
844 print "2. Ask user info on first login : $WHT$ask_user_info$NRM\n";
846 print $WHT. "PHP tweaks\n" . $NRM;
847 print "4. Use php recode functions : $WHT$use_php_recode$NRM\n";
848 print "5. Use php iconv functions : $WHT$use_php_iconv$NRM\n";
850 print $WHT. "Configuration tweaks\n" . $NRM;
851 print "6. Allow remote configtest : $WHT$allow_remote_configtest$NRM\n";
852 print "7. Debug mode : $WHT$sm_debug_mode$NRM\n";
853 print "8. Secured configuration mode : $WHT$secured_config$NRM\n";
855 print "R Return to Main Menu\n";
857 if ( $config_use_color == 1 ) {
858 print "C Turn color off\n";
860 print "C Turn color on\n";
862 print "S Save data\n";
866 print "Command >> " . $WHT;
868 $command =~ s/[\n\r]//g;
869 $command =~ tr/A-Z/a-z/;
872 # Read the commands they entered.
873 if ( $command eq "r" ) {
875 } elsif ( $command eq "s" ) {
877 print "Press enter to continue...";
880 } elsif ( ( $command eq "q" ) && ( $saved == 0 ) ) {
881 print "You have not saved your data.\n";
882 print "Save? [" . $WHT . "Y" . $NRM . "/n]: ";
884 if ( ( $save =~ /^y/i ) || ( $save =~ /^\s*$/ ) ) {
887 } elsif ( $command eq "c" ) {
888 if ( $config_use_color == 1 ) {
889 $config_use_color = 2;
893 $config_use_color = 1;
897 } elsif ( $command =~ /^w([0-9]+)/ ) {
899 } elsif ( $command eq "d" && $menu == 0 ) {
904 if ( ( $command > 0 ) && ( $command < 12 ) ) {
907 } elsif ( $menu == 1 ) {
908 if ( $command == 1 ) { $org_name = command1
(); }
909 elsif ( $command == 2 ) { $org_logo = command2
(); }
910 elsif ( $command == 3 ) { ($org_logo_width,$org_logo_height) = command2a
(); }
911 elsif ( $command == 4 ) { $org_title = command3
(); }
912 elsif ( $command == 5 ) { $signout_page = command4
(); }
913 elsif ( $command == 6 ) { $frame_top = command6
(); }
914 elsif ( $command == 7 ) { $provider_uri = command7
(); }
915 elsif ( $command == 8 ) { $provider_name = command8
(); }
917 } elsif ( $menu == 2 ) {
918 if ( $command eq "a" ) { $show_imap_settings = 1; $show_smtp_settings = 0; }
919 elsif ( $command eq "b" ) { $show_imap_settings = 0; $show_smtp_settings = 1; }
920 elsif ( $command eq "h" ) { $show_imap_settings = 0; $show_smtp_settings = 0; }
921 elsif ( $command <= 3 ) {
922 if ( $command == 1 ) { $domain = command11
(); }
923 elsif ( $command == 2 ) { $invert_time = command110
(); }
924 elsif ( $command == 3 ) { $useSendmail = command14
(); }
925 $show_imap_settings = 0; $show_smtp_settings = 0;
926 } elsif ( $show_imap_settings ) {
927 if ( $command == 4 ) { $imapServerAddress = command12
(); }
928 elsif ( $command == 5 ) { $imapPort = command13
(); }
929 elsif ( $command == 6 ) { $imap_auth_mech = command112a
(); }
930 elsif ( $command == 7 ) { $use_imap_tls = command_use_tls
("IMAP",$use_imap_tls); }
931 elsif ( $command == 8 ) { $imap_server_type = command19
(); }
932 elsif ( $command == 9 ) { $optional_delimiter = command111
(); }
933 } elsif ( $show_smtp_settings && lc($useSendmail) eq 'true' ) {
934 if ( $command == 4 ) { $sendmail_path = command15
(); }
935 elsif ( $command == 5 ) { $sendmail_args = command_sendmail_args
(); }
936 elsif ( $command == 6 ) { $encode_header_key = command114
(); }
937 } elsif ( $show_smtp_settings ) {
938 if ( $command == 4 ) { $smtpServerAddress = command16
(); }
939 elsif ( $command == 5 ) { $smtpPort = command17
(); }
940 elsif ( $command == 6 ) { $pop_before_smtp = command18a
(); }
941 elsif ( $command == 7 ) { $smtp_auth_mech = command112b
(); }
942 elsif ( $command == 8 ) { $use_smtp_tls = command_use_tls
("SMTP",$use_smtp_tls); }
943 elsif ( $command == 9 ) { $encode_header_key = command114
(); }
945 } elsif ( $menu == 3 ) {
946 if ( $command == 1 ) { $default_folder_prefix = command21
(); }
947 elsif ( $command == 2 ) { $show_prefix_option = command22
(); }
948 elsif ( $command == 3 ) { $trash_folder = command23a
(); }
949 elsif ( $command == 4 ) { $sent_folder = command23b
(); }
950 elsif ( $command == 5 ) { $draft_folder = command23c
(); }
951 elsif ( $command == 6 ) { $default_move_to_trash = command24a
(); }
952 elsif ( $command == 7 ) { $default_move_to_sent = command24b
(); }
953 elsif ( $command == 8 ) { $default_save_as_draft = command24c
(); }
954 elsif ( $command == 9 ) { $list_special_folders_first = command27
(); }
955 elsif ( $command == 10 ) { $use_special_folder_color = command28
(); }
956 elsif ( $command == 11 ) { $auto_expunge = command29
(); }
957 elsif ( $command == 12 ) { $default_sub_of_inbox = command210
(); }
958 elsif ( $command == 13 ) { $show_contain_subfolders_option = command211
(); }
959 elsif ( $command == 14 ) { $default_unseen_notify = command212
(); }
960 elsif ( $command == 15 ) { $default_unseen_type = command213
(); }
961 elsif ( $command == 16 ) { $auto_create_special = command214
(); }
962 elsif ( $command == 17 ) { $delete_folder = command215
(); }
963 elsif ( $command == 18 ) { $noselect_fix_enable = command216
(); }
964 } elsif ( $menu == 4 ) {
965 if ( $command == 1 ) { $data_dir = command33a
(); }
966 elsif ( $command == 2 ) { $attachment_dir = command33b
(); }
967 elsif ( $command == 3 ) { $dir_hash_level = command33c
(); }
968 elsif ( $command == 4 ) { $default_left_size = command35
(); }
969 elsif ( $command == 5 ) { $force_username_lowercase = command36
(); }
970 elsif ( $command == 6 ) { $default_use_priority = command37
(); }
971 elsif ( $command == 7 ) { $hide_sm_attributions = command38
(); }
972 elsif ( $command == 8 ) { $default_use_mdn = command39
(); }
973 elsif ( $command == 9 ) { $edit_identity = command310
(); }
974 elsif ( $command == 10 ) { $disable_thread_sort = command312
(); }
975 elsif ( $command == 11 ) { $disable_server_sort = command313
(); }
976 elsif ( $command == 12 ) { $allow_charset_search = command314
(); }
977 elsif ( $command == 13 ) { $allow_advanced_search = command316
(); }
978 elsif ( $command == 14 ) { $session_name = command317
(); }
979 elsif ( $command == 15 ) { $time_zone_type = command318
(); }
980 elsif ( $command == 16 ) { $config_location_base = command_config_location_base
(); }
981 elsif ( $command == 17 ) { $only_secure_cookies = command319
(); }
982 } elsif ( $menu == 5 ) {
983 if ( $command == 1 ) { $use_icons = commandB3
(); }
984 # elsif ( $command == 3 ) { $icon_theme_def = commandB7(); }
985 elsif ( $command == 2 ) { $default_fontsize = command_default_fontsize
(); }
986 elsif ( $command == 3 ) { $templateset_default = command_templates
(); }
987 elsif ( $command == 4 ) { command_userThemes
(); }
988 elsif ( $command == 5 ) { command_fontsets
(); }
989 elsif ( $command == 6 ) { command_iconSets
(); }
990 } elsif ( $menu == 6 ) {
991 if ( $command == 1 ) { command61
(); }
992 elsif ( $command == 2 ) { command62
(); }
993 elsif ( $command == 3 ) { $abook_global_file=command63
(); }
994 elsif ( $command == 4 ) { command64
(); }
995 elsif ( $command == 5 ) { command65
(); }
996 elsif ( $command == 6 ) { command_abook_file_line_length
(); }
997 } elsif ( $menu == 7 ) {
998 if ( $command == 1 ) { $motd = command71
(); }
999 } elsif ( $menu == 8 ) {
1000 if ( $command =~ /^[0-9]+/ ) { @plugins = command81
(); }
1001 elsif ( $command eq "u" ) { $disable_plugins_user = command82
(); }
1002 elsif ( $command eq "d" ) { $disable_plugins = 'true'; }
1003 elsif ( $command eq "e" ) { $disable_plugins = 'false'; }
1004 elsif ( $command =~ /^c([0-9]+)/ ) { $columns = $1; }
1005 } elsif ( $menu == 9 ) {
1006 if ( $command == 1 ) { $addrbook_dsn = command91
(); }
1007 elsif ( $command == 2 ) { $addrbook_table = command92
(); }
1008 elsif ( $command == 3 ) { $prefs_dsn = command93
(); }
1009 elsif ( $command == 4 ) { $prefs_table = command94
(); }
1010 elsif ( $command == 5 ) { $prefs_user_field = command95
(); }
1011 elsif ( $command == 6 ) { $prefs_key_field = command96
(); }
1012 elsif ( $command == 7 ) { $prefs_val_field = command97
(); }
1013 elsif ( $command == 8 ) { $addrbook_global_dsn = command98
(); }
1014 elsif ( $command == 9 ) { $addrbook_global_table = command99
(); }
1015 elsif ( $command == 10 ) { $addrbook_global_writeable = command910
(); }
1016 elsif ( $command == 11 ) { $addrbook_global_listing = command911
(); }
1017 } elsif ( $menu == 10 ) {
1018 if ( $command == 1 ) { $squirrelmail_default_language = commandA1
(); }
1019 elsif ( $command == 2 ) { $default_charset = commandA2
(); }
1020 elsif ( $command == 3 ) { $show_alternative_names = commandA3
(); }
1021 elsif ( $command == 4 ) { $aggressive_decoding = commandA4
(); }
1022 elsif ( $command == 5 ) { $lossy_encoding = commandA5
(); }
1023 } elsif ( $menu == 11 ) {
1024 if ( $command == 1 ) { $use_iframe = commandB2
(); }
1025 elsif ( $command == 2 ) { $ask_user_info = command_ask_user_info
(); }
1026 elsif ( $command == 4 ) { $use_php_recode = commandB4
(); }
1027 elsif ( $command == 5 ) { $use_php_iconv = commandB5
(); }
1028 elsif ( $command == 6 ) { $allow_remote_configtest = commandB6
(); }
1029 elsif ( $command == 7 ) { $sm_debug_mode = commandB8
(); }
1030 elsif ( $command == 8 ) { $secured_config = commandB9
(); }
1036 print "\nExiting conf.pl.\n".
1037 "You might want to test your configuration by browsing to\n".
1038 "http://your-squirrelmail-location/src/configtest.php\n".
1039 "Happy SquirrelMailing!\n\n";
1042 ####################################################################################
1046 print "We have tried to make the name SquirrelMail as transparent as\n";
1047 print "possible. If you set up an organization name, most places where\n";
1048 print "SquirrelMail would take credit will be credited to your organization.\n";
1050 print "If your Organization Name includes a '\$', please precede it with a \\. \n";
1051 print "Other '\$' will be considered the beginning of a variable that\n";
1052 print "must be defined before the \$org_name is printed.\n";
1054 print "[$WHT$org_name$NRM]: $WHT";
1055 $new_org_name = <STDIN
>;
1056 if ( $new_org_name eq "\n" ) {
1057 $new_org_name = $org_name;
1059 $new_org_name =~ s/[\r\n]//g;
1060 $new_org_name =~ s/\"/"/g;
1062 return $new_org_name;
1067 print "Your organization's logo is an image that will be displayed at\n";
1068 print "different times throughout SquirrelMail. ";
1070 print "Please be aware of the following: \n";
1071 print " - Relative URLs are relative to the config dir\n";
1072 print " to use the default logo, use ../images/sm_logo.png\n";
1073 print " - To specify a logo defined outside the SquirrelMail source tree\n";
1074 print " use the absolute URL the webserver would use to include the file\n";
1075 print " e.g. http://example.com/images/mylogo.gif or /images/mylogo.jpg\n";
1077 print "[$WHT$org_logo$NRM]: $WHT";
1078 $new_org_logo = <STDIN
>;
1079 if ( $new_org_logo eq "\n" ) {
1080 $new_org_logo = $org_logo;
1082 $new_org_logo =~ s/[\r\n]//g;
1084 return $new_org_logo;
1089 print "Your organization's logo is an image that will be displayed at\n";
1090 print "different times throughout SquirrelMail. Width\n";
1091 print "and Height of your logo image. Use '0' to disable.\n";
1093 print "Width: [$WHT$org_logo_width$NRM]: $WHT";
1094 $new_org_logo_width = <STDIN
>;
1095 $new_org_logo_width =~ tr/0-9//cd; # only want digits!
1096 if ( $new_org_logo_width eq '' ) {
1097 $new_org_logo_width = $org_logo_width;
1099 if ( $new_org_logo_width > 0 ) {
1100 print "Height: [$WHT$org_logo_height$NRM]: $WHT";
1101 $new_org_logo_height = <STDIN
>;
1102 $new_org_logo_height =~ tr/0-9//cd; # only want digits!
1103 if( $new_org_logo_height eq '' ) {
1104 $new_org_logo_height = $org_logo_height;
1107 $new_org_logo_height = 0;
1109 return ($new_org_logo_width, $new_org_logo_height);
1114 print "A title is what is displayed at the top of the browser window in\n";
1115 print "the titlebar. Usually this will end up looking something like:\n";
1116 print "\"Netscape: $org_title\"\n";
1118 print "If your Organization Title includes a '\$', please precede it with a \\. \n";
1119 print "Other '\$' will be considered the beginning of a variable that\n";
1120 print "must be defined before the \$org_title is printed.\n";
1122 print "[$WHT$org_title$NRM]: $WHT";
1123 $new_org_title = <STDIN
>;
1124 if ( $new_org_title eq "\n" ) {
1125 $new_org_title = $org_title;
1127 $new_org_title =~ s/[\r\n]//g;
1128 $new_org_title =~ s/\"/\'/g;
1130 return $new_org_title;
1135 print "When users click the Sign Out button they will be logged out and\n";
1136 print "then sent to signout_page. If signout_page is left empty,\n";
1137 print "(hit space and then return) they will be taken, as normal,\n";
1138 print "to the default and rather sparse SquirrelMail signout page.\n";
1140 print "[$WHT$signout_page$NRM]: $WHT";
1141 $new_signout_page = <STDIN
>;
1142 if ( $new_signout_page eq "\n" ) {
1143 $new_signout_page = $signout_page;
1145 $new_signout_page =~ s/[\r\n]//g;
1146 $new_signout_page =~ s/^\s+$//g;
1148 return $new_signout_page;
1153 print "SquirrelMail defaults to using the whole of the browser window.\n";
1154 print "This allows you to keep it within a specified frame. The default\n";
1155 print "is '_top'\n";
1157 print "[$WHT$frame_top$NRM]: $WHT";
1158 $new_frame_top = <STDIN
>;
1159 if ( $new_frame_top eq "\n" ) {
1160 $new_frame_top = '_top';
1162 $new_frame_top =~ s/[\r\n]//g;
1163 $new_frame_top =~ s/^\s+$//g;
1165 return $new_frame_top;
1168 # Default link to provider
1170 print "Here you can set the link on the top-right of the message list.\n";
1171 print "If empty, it will not be displayed.\n";
1173 print "[$WHT$provider_uri$NRM]: $WHT";
1174 $new_provider_uri = <STDIN
>;
1175 if ( $new_provider_uri eq "\n" ) {
1176 $new_provider_uri = '';
1178 $new_provider_uri =~ s/[\r\n]//g;
1179 $new_provider_uri =~ s/^\s+$//g;
1181 return $new_provider_uri;
1185 print "Here you can set the name of the link on the top-right of the message list.\n";
1186 print "The default is empty (do not display anything).'\n";
1188 print "[$WHT$provider_name$NRM]: $WHT";
1189 $new_provider_name = <STDIN
>;
1190 if ( $new_provider_name eq "\n" ) {
1191 $new_provider_name = '';
1193 $new_provider_name =~ s/[\r\n]//g;
1194 $new_provider_name =~ s/^\s+$//g;
1195 $new_provider_name =~ s/\'/\\'/g;
1197 return $new_provider_name;
1200 ####################################################################################
1204 print "The domain name is the suffix at the end of all email addresses. If\n";
1205 print "for example, your email address is jdoe\@example.com, then your domain\n";
1206 print "would be example.com.\n";
1208 print "[$WHT$domain$NRM]: $WHT";
1209 $new_domain = <STDIN
>;
1210 if ( $new_domain eq "\n" ) {
1211 $new_domain = $domain;
1213 $new_domain =~ s/\s//g;
1220 print "This is the hostname where your IMAP server can be contacted.\n";
1221 print "[$WHT$imapServerAddress$NRM]: $WHT";
1222 $new_imapServerAddress = <STDIN
>;
1223 if ( $new_imapServerAddress eq "\n" ) {
1224 $new_imapServerAddress = $imapServerAddress;
1226 $new_imapServerAddress =~ s/[\r\n]//g;
1228 return $new_imapServerAddress;
1233 print "This is the port that your IMAP server is on. Usually this is 143.\n";
1234 print "[$WHT$imapPort$NRM]: $WHT";
1235 $new_imapPort = <STDIN
>;
1236 if ( $new_imapPort eq "\n" ) {
1237 $new_imapPort = $imapPort;
1239 $new_imapPort =~ s/[\r\n]//g;
1241 return $new_imapPort;
1246 print "You now need to choose the method that you will use for sending\n";
1247 print "messages in SquirrelMail. You can either connect to an SMTP server\n";
1248 print "or use sendmail directly.\n";
1249 if ( lc($useSendmail) eq 'true' ) {
1250 $default_value = "1";
1252 $default_value = "2";
1255 print " 1. Sendmail\n";
1257 print "Your choice [1/2] [$WHT$default_value$NRM]: $WHT";
1258 $use_sendmail = <STDIN
>;
1259 if ( ( $use_sendmail =~ /^1\n/i )
1260 || ( ( $use_sendmail =~ /^\n/ ) && ( $default_value eq "1" ) ) ) {
1261 $useSendmail = 'true';
1263 $useSendmail = 'false';
1265 return $useSendmail;
1270 print "Specify where the sendmail executable is located. Usually /usr/sbin/sendmail\n";
1271 print "[$WHT$sendmail_path$NRM]: $WHT";
1272 $new_sendmail_path = <STDIN
>;
1273 if ( $new_sendmail_path eq "\n" ) {
1274 $new_sendmail_path = $sendmail_path;
1276 $new_sendmail_path =~ s/[\r\n]//g;
1278 return $new_sendmail_path;
1281 # Extra sendmail arguments
1282 sub command_sendmail_args
{
1283 print "Specify additional sendmail program arguments.\n";
1285 print "Make sure that arguments are supported by your sendmail program. -f argument \n";
1286 print "is added automatically by SquirrelMail scripts. Variable defaults to standard\n";
1287 print "/usr/sbin/sendmail arguments. If you use qmail-inject, nbsmtp or any other \n";
1288 print "sendmail wrapper, which does not support -i and -t arguments, set variable to\n";
1289 print "empty string or use arguments suitable for your mailer.\n";
1291 print "[$WHT$sendmail_args$NRM]: $WHT";
1292 $new_sendmail_args = <STDIN
>;
1293 if ( $new_sendmail_args eq "\n" ) {
1294 $new_sendmail_args = $sendmail_args;
1296 # strip linefeeds and crs.
1297 $new_sendmail_args =~ s/[\r\n]//g;
1299 return trim
($new_sendmail_args);
1304 print "This is the hostname of your SMTP server.\n";
1305 print "[$WHT$smtpServerAddress$NRM]: $WHT";
1306 $new_smtpServerAddress = <STDIN
>;
1307 if ( $new_smtpServerAddress eq "\n" ) {
1308 $new_smtpServerAddress = $smtpServerAddress;
1310 $new_smtpServerAddress =~ s/[\r\n]//g;
1312 return $new_smtpServerAddress;
1317 print "This is the port to connect to for SMTP. Usually 25.\n";
1318 print "[$WHT$smtpPort$NRM]: $WHT";
1319 $new_smtpPort = <STDIN
>;
1320 if ( $new_smtpPort eq "\n" ) {
1321 $new_smtpPort = $smtpPort;
1323 $new_smtpPort =~ s/[\r\n]//g;
1325 return $new_smtpPort;
1330 print "Do you wish to use POP3 before SMTP? Your server must\n";
1331 print "support this in order for SquirrelMail to work with it.\n";
1334 $YesNo = 'y' if ( lc($pop_before_smtp) eq 'true' );
1336 print "Use pop before SMTP (y/n) [$WHT$YesNo$NRM]: $WHT";
1338 $new_pop_before_smtp = <STDIN
>;
1339 $new_pop_before_smtp =~ tr/yn//cd;
1340 return 'true' if ( $new_pop_before_smtp eq "y" );
1341 return 'false' if ( $new_pop_before_smtp eq "n" );
1342 return $pop_before_smtp;
1347 print "Each IMAP server has its own quirks. As much as we tried to stick\n";
1348 print "to standards, it doesn't help much if the IMAP server doesn't follow\n";
1349 print "the same principles. We have made some work-arounds for some of\n";
1350 print "these servers. If you would like to use them, please select your\n";
1351 print "IMAP server. If you do not wish to use these work-arounds, you can\n";
1352 print "set this to \"other\", and none will be used.\n";
1353 print $list_supported_imap_servers;
1355 print " other = Not one of the above servers\n";
1357 print "[$WHT$imap_server_type$NRM]: $WHT";
1358 $new_imap_server_type = <STDIN
>;
1360 if ( $new_imap_server_type eq "\n" ) {
1361 $new_imap_server_type = $imap_server_type;
1363 $new_imap_server_type =~ s/[\r\n]//g;
1365 return $new_imap_server_type;
1370 print "Sometimes the date of messages sent is messed up (off by a few hours\n";
1371 print "on some machines). Typically this happens if the system doesn't support\n";
1372 print "tm_gmtoff. It will happen only if your time zone is \"negative\".\n";
1373 print "This most often occurs on Solaris 7 machines in the United States.\n";
1374 print "By default, this is off. It should be kept off unless problems surface\n";
1375 print "about the time that messages are sent.\n";
1376 print " no = Do NOT fix time -- almost always correct\n";
1377 print " yes = Fix the time for this system\n";
1380 $YesNo = 'y' if ( lc($invert_time) eq 'true' );
1382 print "Fix the time for this system (y/n) [$WHT$YesNo$NRM]: $WHT";
1384 $new_invert_time = <STDIN
>;
1385 $new_invert_time =~ tr/yn//cd;
1386 return 'true' if ( $new_invert_time eq "y" );
1387 return 'false' if ( $new_invert_time eq "n" );
1388 return $invert_time;
1392 print "This is the delimiter that your IMAP server uses to distinguish between\n";
1393 print "folders. For example, Cyrus uses '.' as the delimiter and a complete\n";
1394 print "folder would look like 'INBOX.Friends.Bob', while UW uses '/' and would\n";
1395 print "look like 'INBOX/Friends/Bob'. Normally this should be left at 'detect'\n";
1396 print "but if you are sure you know what delimiter your server uses, you can\n";
1397 print "specify it here.\n";
1398 print "\nTo have it autodetect the delimiter, set it to 'detect'.\n\n";
1399 print "[$WHT$optional_delimiter$NRM]: $WHT";
1400 $new_optional_delimiter = <STDIN
>;
1402 if ( $new_optional_delimiter eq "\n" ) {
1403 $new_optional_delimiter = $optional_delimiter;
1405 $new_optional_delimiter =~ s/[\r\n]//g;
1407 return $new_optional_delimiter;
1409 # IMAP authentication type
1410 # Possible values: login, plain, cram-md5, digest-md5
1411 # Now offers to detect supported mechs, assuming server & port are set correctly
1414 if ($use_imap_tls ne "0") {
1415 # 1. Script does not handle TLS.
1416 # 2. Server does not have to declare all supported authentication mechs when
1417 # STARTTLS is used. Supported mechs are declared only after STARTTLS.
1418 print "Auto-detection of login methods is unavailable when using TLS or STARTTLS.\n";
1420 print "If you have already set the hostname and port number, I can try to\n";
1421 print "detect the mechanisms your IMAP server supports.\n";
1422 print "I will try to detect CRAM-MD5 and DIGEST-MD5 support. I can't test\n";
1423 print "for \"login\" or \"plain\" without knowing a username and password.\n";
1424 print "Auto-detecting is optional - you can safely say \"n\" here.\n";
1425 print "\nTry to detect supported mechanisms? [y/N]: ";
1428 if ($inval =~ /^y\b/i) {
1429 # Yes, let's try to detect.
1430 print "Trying to detect IMAP capabilities...\n";
1431 my $host = $imapServerAddress . ':'. $imapPort;
1432 print "CRAM-MD5:\t";
1433 my $tmp = detect_auth_support
('IMAP',$host,'CRAM-MD5');
1434 if (defined($tmp)) {
1435 if ($tmp eq 'YES') {
1436 print "$WHT SUPPORTED$NRM\n";
1438 print "$WHT NOT SUPPORTED$NRM\n";
1441 print $WHT . " ERROR DETECTING$NRM\n";
1444 print "DIGEST-MD5:\t";
1445 $tmp = detect_auth_support
('IMAP',$host,'DIGEST-MD5');
1446 if (defined($tmp)) {
1447 if ($tmp eq 'YES') {
1448 print "$WHT SUPPORTED$NRM\n";
1450 print "$WHT NOT SUPPORTED$NRM\n";
1453 print $WHT . " ERROR DETECTING$NRM\n";
1458 print "\nWhat authentication mechanism do you want to use for IMAP connections?\n\n";
1459 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1460 print $WHT . "plain" . $NRM . " - SASL PLAIN. If you need this, you already know it.\n";
1461 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext methods.\n";
1462 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1463 print "\n*** YOUR IMAP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n";
1464 print "If you don't understand or are unsure, you probably want \"login\"\n\n";
1465 print "login, plain, cram-md5, or digest-md5 [$WHT$imap_auth_mech$NRM]: $WHT";
1468 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || ($inval =~ /^login\b/i) || ($inval =~ /^plain\b/i)) {
1471 # user entered garbage or default value so nothing needs to be set
1472 return $imap_auth_mech;
1477 # SMTP authentication type
1478 # Possible choices: none, plain, cram-md5, digest-md5
1480 if ($use_smtp_tls ne "0") {
1481 print "Auto-detection of login methods is unavailable when using TLS or STARTTLS.\n";
1482 } elsif (eval ("use IO::Socket; 1")) {
1483 # try loading IO::Socket module
1484 print "If you have already set the hostname and port number, I can try to\n";
1485 print "automatically detect some of the mechanisms your SMTP server supports.\n";
1486 print "Auto-detection is *optional* - you can safely say \"n\" here.\n";
1487 print "\nTry to detect auth mechanisms? [y/N]: ";
1490 if ($inval =~ /^y\b/i) {
1491 # Yes, let's try to detect.
1492 print "Trying to detect supported methods (SMTP)...\n";
1495 # Check none by trying to relay to junk@microsoft.com
1496 $host = $smtpServerAddress . ':' . $smtpPort;
1497 my $sock = IO
::Socket
::INET
->new($host);
1498 print "Testing none:\t\t$WHT";
1499 if (!defined($sock)) {
1500 print " ERROR TESTING\n";
1503 $got = <$sock>; # Discard greeting
1504 print $sock "HELO $domain\r\n";
1505 $got = <$sock>; # Discard
1506 print $sock "MAIL FROM:<tester\@squirrelmail.org>\r\n";
1507 $got = <$sock>; # Discard
1508 print $sock "RCPT TO:<junk\@microsoft.com\r\n";
1509 $got = <$sock>; # This is the important line
1510 if ($got =~ /^250\b/) { # SMTP will relay without auth
1511 print "SUPPORTED$NRM\n";
1513 print "NOT SUPPORTED$NRM\n";
1515 print $sock "RSET\r\n";
1516 print $sock "QUIT\r\n";
1519 # Try login (SquirrelMail default)
1520 print "Testing login:\t\t";
1521 $tmp=detect_auth_support
('SMTP',$host,'LOGIN');
1522 if (defined($tmp)) {
1523 if ($tmp eq 'YES') {
1524 print $WHT . "SUPPORTED$NRM\n";
1526 print $WHT . "NOT SUPPORTED$NRM\n";
1529 print $WHT . "ERROR DETECTING$NRM\n";
1533 print "Testing CRAM-MD5:\t";
1534 $tmp=detect_auth_support
('SMTP',$host,'CRAM-MD5');
1535 if (defined($tmp)) {
1536 if ($tmp eq 'YES') {
1537 print $WHT . "SUPPORTED$NRM\n";
1539 print $WHT . "NOT SUPPORTED$NRM\n";
1542 print $WHT . "ERROR DETECTING$NRM\n";
1546 print "Testing DIGEST-MD5:\t";
1547 $tmp=detect_auth_support
('SMTP',$host,'DIGEST-MD5');
1548 if (defined($tmp)) {
1549 if ($tmp eq 'YES') {
1550 print $WHT . "SUPPORTED$NRM\n";
1552 print $WHT . "NOT SUPPORTED$NRM\n";
1555 print $WHT . "ERROR DETECTING$NRM\n";
1559 print "\nWhat authentication mechanism do you want to use for SMTP connections?\n";
1560 print $WHT . "none" . $NRM . " - Your SMTP server does not require authorization.\n";
1561 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1562 print $WHT . "plain" . $NRM . " - SASL PLAIN. You already know it if you need this.\n";
1563 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext.\n";
1564 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1565 print $WHT . "\n*** YOUR SMTP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n" . $NRM;
1566 print "If you don't understand or are unsure, you probably want \"none\"\n\n";
1567 print "none, login, cram-md5, or digest-md5 [$WHT$smtp_auth_mech$NRM]: $WHT";
1570 if ($inval =~ /^none\b/i) {
1571 # remove sitewide smtp authentication information
1572 $smtp_sitewide_user = '';
1573 $smtp_sitewide_pass = '';
1574 # SMTP doesn't necessarily require logins
1576 } elsif ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) ||
1577 ($inval =~ /^login\b/i) || ($inval =~/^plain\b/i)) {
1578 command_smtp_sitewide_userpass
($inval);
1580 } elsif (trim
($inval) eq '') {
1581 # user selected default value
1582 command_smtp_sitewide_userpass
($smtp_auth_mech);
1583 return $smtp_auth_mech;
1585 # user entered garbage
1586 return $smtp_auth_mech;
1590 sub command_smtp_sitewide_userpass
($) {
1591 # get first function argument
1592 my $auth_mech = shift(@_);
1594 $auth_mech = lc(trim
($auth_mech));
1595 if ($auth_mech eq 'none') {
1598 print "SMTP authentication uses IMAP username and password by default.\n";
1600 print "Would you like to use other login and password for all SquirrelMail \n";
1601 print "SMTP connections?";
1602 if ($smtp_sitewide_user ne '') {
1619 $smtp_sitewide_user = '';
1620 $smtp_sitewide_pass = '';
1621 } elsif ($tmp eq 'y') {
1622 print "Enter username [$smtp_sitewide_user]:";
1623 my $new_user = <STDIN
>;
1624 $new_user = trim
($new_user);
1625 if ($new_user ne '') {
1626 $smtp_sitewide_user = $new_user;
1628 if ($smtp_sitewide_user ne '') {
1629 print "If you don't enter any password, current sitewide password will be used.\n";
1630 print "If you enter space, password will be set to empty string.\n";
1631 print "Enter password:";
1632 my $new_pass = <STDIN
>;
1633 if ($new_pass ne "\n") {
1634 $smtp_sitewide_pass = trim
($new_pass);
1637 print "Invalid input. You must set username used for SMTP authentication.\n";
1638 print "Click enter to continue\n";
1642 print "Invalid input\n";
1643 print "Click enter to continue\n";
1648 # Sub adds information about SMTP authentication type to menu
1649 sub display_smtp_sitewide_userpass
() {
1651 if ($smtp_auth_mech ne 'none') {
1652 if ($smtp_sitewide_user ne '') {
1653 $ret = ' (with custom username and password)';
1655 $ret = ' (with IMAP username and password)';
1662 # This sub is reused for IMAP and SMTP
1663 # Args: service name, default value
1664 sub command_use_tls
{
1665 my($default_val,$service,$inval);
1668 print "TLS (Transport Layer Security) encrypts the traffic between server and client.\n";
1669 print "STARTTLS extensions allow to start encryption on existing plain text connection.\n";
1670 print "These options add specific PHP and IMAP server configuration requirements.\n";
1671 print "See SquirrelMail documentation about connection security.\n";
1673 print "If your " . $service . " server is localhost, you can safely disable this.\n";
1674 print "If it is remote, you may wish to seriously consider enabling this.\n";
1676 while ($valid_input eq 0) {
1677 print "\nSelect connection security model:\n";
1678 print " 0 - Use plain text connection\n";
1679 print " 1 - Use TLS connection\n";
1680 print " 2 - Use STARTTLS extension\n";
1681 print "Select [$default_val]: ";
1683 $inval=trim
($inval);
1684 if ($inval =~ /^[012]$/ || $inval eq '') {
1688 if ($inval ne '') {$default_val = $inval};
1689 return $default_val;
1692 # This sub is used to display human readable text for
1693 # $use_imap_tls and $use_smtp_tls values in conf.pl menu
1694 sub display_use_tls
($) {
1695 my $val = shift(@_);
1696 my $ret = 'disabled';
1699 } elsif ($val eq '1') {
1705 # $encode_header_key
1707 print "Encryption key allows to hide SquirrelMail Received: headers\n";
1708 print "in outbound messages. Interface uses encryption key to encode\n";
1709 print "username, remote address and proxied address, then stores encoded\n";
1710 print "information in X-Squirrel-* headers.\n";
1712 print "Warning: used encryption function is not bulletproof. When used\n";
1713 print "with static encryption keys, it provides only minimal security\n";
1714 print "measures and information can be decoded quickly.\n";
1716 print "Encoded information can be decoded with decrypt_headers.php script\n";
1717 print "from SquirrelMail contrib/ directory.\n";
1719 print "Enter encryption key: ";
1720 $new_encode_header_key = <STDIN
>;
1721 if ( $new_encode_header_key eq "\n" ) {
1722 $new_encode_header_key = $encode_header_key;
1724 $new_encode_header_key =~ s/[\r\n]//g;
1726 return $new_encode_header_key;
1731 print "\nYou can now create the welcome message that is displayed\n";
1732 print "every time a user logs on. You can use HTML or just plain\n";
1734 "text. If you do not wish to have one, just make it blank.\n\n(Type @ on a blank line to exit)\n";
1740 $line =~ s/[\r\n]//g;
1741 if ( $line ne "@" ) {
1742 $line =~ s/ /\ \ /g;
1743 $line =~ s/\t/\ \ \ \ /g;
1745 $line =~ s/\"/\\\"/g;
1747 $new_motd = $new_motd . $line;
1749 } while ( $line ne "@" );
1753 ################# PLUGINS ###################
1756 $command =~ s/[\s\n\r]*//g;
1757 if ( $command > 0 ) {
1758 $command = $command - 1;
1759 if ( $command <= $#plugins ) {
1762 while ( $ct <= $#plugins ) {
1763 if ( $ct != $command ) {
1764 @newplugins = ( @newplugins, $plugins[$ct] );
1768 @plugins = @newplugins;
1769 } elsif ( $command <= $#plugins + $#unused_plugins + 1 ) {
1770 $num = $command - $#plugins - 1;
1771 @newplugins = @plugins;
1773 while ( $ct <= $#unused_plugins ) {
1774 if ( $ct == $num ) {
1775 @newplugins = ( @newplugins, $unused_plugins[$ct] );
1779 @plugins = @newplugins;
1785 # disable_plugins_user
1787 print "When all active plugins are disabled, they can be disabled only\n";
1788 print "for the one user named here. If left blank, plugins will be\n";
1789 print "disabled for ALL users. This setting has no effect if plugins\n";
1790 print "are not disabled.\n";
1792 print "This must be the exact IMAP login name for the desired user.\n";
1794 print "[$WHT$disable_plugins_user$NRM]: $WHT";
1795 $new_disable_plugins_user = <STDIN
>;
1796 if ( $new_disable_plugins_user eq "\n" ) {
1797 $new_disable_plugins_user = $disable_plugins_user;
1799 $new_disable_plugins_user =~ s/[\r\n]//g;
1801 return $new_disable_plugins_user;
1804 ################# FOLDERS ###################
1806 # default_folder_prefix
1808 print "Some IMAP servers (UW, for example) store mail and folders in\n";
1809 print "your user space in a separate subdirectory. This is where you\n";
1810 print "specify what that directory is.\n";
1812 print "EXAMPLE: mail/";
1814 print "NOTE: If you use Cyrus, or some server that would not use this\n";
1815 print " option, you must set this to 'none'.\n";
1817 print "[$WHT$default_folder_prefix$NRM]: $WHT";
1818 $new_default_folder_prefix = <STDIN
>;
1820 if ( $new_default_folder_prefix eq "\n" ) {
1821 $new_default_folder_prefix = $default_folder_prefix;
1823 $new_default_folder_prefix =~ s/[\r\n]//g;
1825 if ( ( $new_default_folder_prefix =~ /^\s*$/ ) || ( $new_default_folder_prefix =~ m/^none$/i ) ) {
1826 $new_default_folder_prefix = "";
1828 # add the trailing delimiter only if we know what the server is.
1829 if (($imap_server_type eq 'cyrus' and
1830 $optional_delimiter eq 'detect') or
1831 ($imap_server_type eq 'courier' and
1832 $optional_delimiter eq 'detect')) {
1833 $new_default_folder_prefix =~ s/\.*$/\./;
1834 } elsif ($imap_server_type eq 'uw' and
1835 $optional_delimiter eq 'detect') {
1836 $new_default_folder_prefix =~ s/\/*$/\
//;
1839 return $new_default_folder_prefix;
1842 # Show Folder Prefix
1844 print "It is possible to set up the default folder prefix as a user\n";
1845 print "specific option, where each user can specify what their mail\n";
1846 print "folder is. If you set this to false, they will never see the\n";
1847 print "option, but if it is true, this option will appear in the\n";
1848 print "'options' section.\n";
1850 print "NOTE: You set the default folder prefix in option '1' of this\n";
1851 print " section. That will be the default if the user doesn't\n";
1852 print " specify anything different.\n";
1855 if ( lc($show_prefix_option) eq 'true' ) {
1856 $default_value = "y";
1858 $default_value = "n";
1861 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1862 $new_show = <STDIN
>;
1863 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1864 $show_prefix_option = 'true';
1866 $show_prefix_option = 'false';
1868 return $show_prefix_option;
1873 print "You can now specify where the default trash folder is located.\n";
1874 print "On servers where you do not want this, you can set it to anything\n";
1875 print "and set option 6 to false.\n";
1877 print "This is relative to where the rest of your email is kept. You do\n";
1878 print "not need to worry about their mail directory. If this folder\n";
1879 print "would be ~/mail/trash on the filesystem, you only need to specify\n";
1880 print "that this is 'trash', and be sure to put 'mail/' in option 1.\n";
1883 print "[$WHT$trash_folder$NRM]: $WHT";
1884 $new_trash_folder = <STDIN
>;
1885 if ( $new_trash_folder eq "\n" ) {
1886 $new_trash_folder = $trash_folder;
1888 if (check_imap_folder
($new_trash_folder)) {
1889 $new_trash_folder =~ s/[\r\n]//g;
1891 $new_trash_folder = $trash_folder;
1894 return $new_trash_folder;
1899 print "This is where messages that are sent will be stored. SquirrelMail\n";
1900 print "by default puts a copy of all outgoing messages in this folder.\n";
1902 print "This is relative to where the rest of your email is kept. You do\n";
1903 print "not need to worry about their mail directory. If this folder\n";
1904 print "would be ~/mail/sent on the filesystem, you only need to specify\n";
1905 print "that this is 'sent', and be sure to put 'mail/' in option 1.\n";
1908 print "[$WHT$sent_folder$NRM]: $WHT";
1909 $new_sent_folder = <STDIN
>;
1910 if ( $new_sent_folder eq "\n" ) {
1911 $new_sent_folder = $sent_folder;
1913 if (check_imap_folder
($new_sent_folder)) {
1914 $new_sent_folder =~ s/[\r\n]//g;
1916 $new_sent_folder = $sent_folder;
1919 return $new_sent_folder;
1924 print "You can now specify where the default draft folder is located.\n";
1925 print "On servers where you do not want this, you can set it to anything\n";
1926 print "and set option 9 to false.\n";
1928 print "This is relative to where the rest of your email is kept. You do\n";
1929 print "not need to worry about their mail directory. If this folder\n";
1930 print "would be ~/mail/drafts on the filesystem, you only need to specify\n";
1931 print "that this is 'drafts', and be sure to put 'mail/' in option 1.\n";
1934 print "[$WHT$draft_folder$NRM]: $WHT";
1935 $new_draft_folder = <STDIN
>;
1936 if ( $new_draft_folder eq "\n" ) {
1937 $new_draft_folder = $draft_folder;
1939 if (check_imap_folder
($new_draft_folder)) {
1940 $new_draft_folder =~ s/[\r\n]//g;
1942 $new_draft_folder = $draft_folder;
1945 return $new_draft_folder;
1948 # default move to trash
1950 print "By default, should messages get moved to the trash folder? You\n";
1951 print "can specify the default trash folder in option 3. If this is set\n";
1952 print "to false, messages will get deleted immediately without moving\n";
1953 print "to the trash folder.\n";
1955 print "Trash folder is currently: $trash_folder\n";
1958 if ( lc($default_move_to_trash) eq 'true' ) {
1959 $default_value = "y";
1961 $default_value = "n";
1963 print "By default, move to trash (y/n) [$WHT$default_value$NRM]: $WHT";
1964 $new_show = <STDIN
>;
1965 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1966 $default_move_to_trash = 'true';
1968 $default_move_to_trash = 'false';
1970 return $default_move_to_trash;
1973 # default move to sent (save sent messages)
1975 print "By default, should copies of outgoing messages get saved in the\n";
1976 print "sent folder? You can specify the default sent folder in option 4.\n";
1977 print "If this is set to false, messages will get sent and no copy will\n";
1980 print "Sent folder is currently: $sent_folder\n";
1983 if ( lc($default_move_to_sent) eq 'true' ) {
1984 $default_value = "y";
1986 $default_value = "n";
1988 print "By default, save sent messages (y/n) [$WHT$default_value$NRM]: $WHT";
1989 $new_show = <STDIN
>;
1990 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1991 $default_move_to_sent = 'true';
1993 $default_move_to_sent = 'false';
1995 return $default_move_to_sent;
1998 # default save as draft
2000 print "By default, should the save to draft option be shown? You can\n";
2001 print "specify the default drafts folder in option 5. If this is set\n";
2002 print "to false, users will not be shown the save to draft option.\n";
2004 print "Drafts folder is currently: $draft_folder\n";
2007 if ( lc($default_save_as_draft) eq 'true' ) {
2008 $default_value = "y";
2010 $default_value = "n";
2012 print "By default, save as draft (y/n) [$WHT$default_value$NRM]: $WHT";
2013 $new_show = <STDIN
>;
2014 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2015 $default_save_as_draft = 'true';
2017 $default_save_as_draft = 'false';
2019 return $default_save_as_draft;
2022 # List special folders first
2024 print "SquirrelMail has what we call 'special folders' that are not\n";
2025 print "manipulated and viewed like normal folders. Some examples of\n";
2026 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
2027 print "Simply asks if you want these folders listed first in the folder\n";
2031 if ( lc($list_special_folders_first) eq 'true' ) {
2032 $default_value = "y";
2034 $default_value = "n";
2037 print "List first (y/n) [$WHT$default_value$NRM]: $WHT";
2038 $new_show = <STDIN
>;
2039 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2040 $list_special_folders_first = 'true';
2042 $list_special_folders_first = 'false';
2044 return $list_special_folders_first;
2047 # Show special folders color
2049 print "SquirrelMail has what we call 'special folders' that are not\n";
2050 print "manipulated and viewed like normal folders. Some examples of\n";
2051 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
2052 print "wants to know if we should display special folders in a\n";
2053 print "color than the other folders.\n";
2056 if ( lc($use_special_folder_color) eq 'true' ) {
2057 $default_value = "y";
2059 $default_value = "n";
2062 print "Show color (y/n) [$WHT$default_value$NRM]: $WHT";
2063 $new_show = <STDIN
>;
2064 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2065 $use_special_folder_color = 'true';
2067 $use_special_folder_color = 'false';
2069 return $use_special_folder_color;
2074 print "The way that IMAP handles deleting messages is as follows. You\n";
2075 print "mark the message as deleted, and then to 'really' delete it, you\n";
2076 print "expunge it. This option asks if you want to just have messages\n";
2077 print "marked as deleted, or if you want SquirrelMail to expunge the \n";
2078 print "messages too.\n";
2081 if ( lc($auto_expunge) eq 'true' ) {
2082 $default_value = "y";
2084 $default_value = "n";
2086 print "Auto expunge (y/n) [$WHT$default_value$NRM]: $WHT";
2087 $new_show = <STDIN
>;
2088 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2089 $auto_expunge = 'true';
2091 $auto_expunge = 'false';
2093 return $auto_expunge;
2096 # Default sub of inbox
2098 print "Some IMAP servers (Cyrus) have all folders as subfolders of INBOX.\n";
2099 print "This can cause some confusion in folder creation for users when\n";
2100 print "they try to create folders and don't put it as a subfolder of INBOX\n";
2101 print "and get permission errors. This option asks if you want folders\n";
2102 print "to be subfolders of INBOX by default.\n";
2105 if ( lc($default_sub_of_inbox) eq 'true' ) {
2106 $default_value = "y";
2108 $default_value = "n";
2110 print "Default sub of INBOX (y/n) [$WHT$default_value$NRM]: $WHT";
2111 $new_show = <STDIN
>;
2112 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2113 $default_sub_of_inbox = 'true';
2115 $default_sub_of_inbox = 'false';
2117 return $default_sub_of_inbox;
2120 # Show contain subfolder option
2122 print "Some IMAP servers (UW) make it so that there are two types of\n";
2123 print "folders. Those that contain messages, and those that contain\n";
2124 print "subfolders. If this is the case for your server, set this to\n";
2125 print "true, and it will ask the user whether the folder they are\n";
2126 print "creating contains subfolders or messages.\n";
2129 if ( lc($show_contain_subfolders_option) eq 'true' ) {
2130 $default_value = "y";
2132 $default_value = "n";
2134 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
2135 $new_show = <STDIN
>;
2136 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2137 $show_contain_subfolders_option = 'true';
2139 $show_contain_subfolders_option = 'false';
2141 return $show_contain_subfolders_option;
2144 # Default Unseen Notify
2146 print "This option specifies where the users will receive notification\n";
2147 print "about unseen messages by default. This is of course an option that\n";
2148 print "can be changed on a user level.\n";
2149 print " 1 = No notification\n";
2150 print " 2 = Only on the INBOX\n";
2151 print " 3 = On all folders\n";
2154 print "Which one should be default (1,2,3)? [$WHT$default_unseen_notify$NRM]: $WHT";
2155 $new_show = <STDIN
>;
2156 if ( $new_show =~ /^[123]\n/i ) {
2157 $default_unseen_notify = $new_show;
2159 $default_unseen_notify =~ s/[\r\n]//g;
2160 return $default_unseen_notify;
2163 # Default Unseen Type
2165 print "Here you can define the default way that unseen messages will be displayed\n";
2166 print "to the user in the folder listing on the left side.\n";
2167 print " 1 = Only unseen messages (4)\n";
2168 print " 2 = Unseen and Total messages (4/27)\n";
2171 print "Which one should be default (1,2)? [$WHT$default_unseen_type$NRM]: $WHT";
2172 $new_show = <STDIN
>;
2173 if ( $new_show =~ /^[12]\n/i ) {
2174 $default_unseen_type = $new_show;
2176 $default_unseen_type =~ s/[\r\n]//g;
2177 return $default_unseen_type;
2180 # Auto create special folders
2182 print "Would you like the Sent, Trash, and Drafts folders to be created\n";
2183 print "automatically print for you when a user logs in? If the user\n";
2184 print "accidentally deletes their special folders, this option will\n";
2185 print "automatically create it again for them.\n";
2188 if ( lc($auto_create_special) eq 'true' ) {
2189 $default_value = "y";
2191 $default_value = "n";
2193 print "Auto create special folders? (y/n) [$WHT$default_value$NRM]: $WHT";
2194 $new_show = <STDIN
>;
2195 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2196 $auto_create_special = 'true';
2198 $auto_create_special = 'false';
2200 return $auto_create_special;
2203 # Automatically delete folders
2205 if ( $imap_server_type eq "uw" ) {
2206 print "UW IMAP servers will not allow folders containing mail to also contain folders.\n";
2207 print "Deleting folders will bypass the trash folder and be immediately deleted\n\n";
2208 print "If this is not the correct value for your server,\n";
2209 print "please use option D on the Main Menu to configure your server correctly.\n\n";
2210 print "Press enter to continue...\n";
2211 $new_delete = <STDIN
>;
2212 $delete_folder = 'true';
2214 if ( $imap_server_type eq "courier" ) {
2215 print "Courier (or Courier-IMAP) IMAP servers may not support ";
2216 print "subfolders of Trash. \n";
2217 print "Specifically, if Courier is set to always move messages to Trash, \n";
2218 print "Trash will be treated by Courier as a special folder that does not \n";
2219 print "allow subfolders. \n\n";
2220 print "Please verify your Courier configuration, and test folder deletion \n";
2221 print "when changing this setting.\n\n";
2224 print "Are subfolders of the Trash supported by your IMAP server?\n";
2225 print "If so, should deleted folders be sent to Trash?\n";
2226 print "If not, say no (deleted folders should not be sent to Trash)\n\n";
2227 # reversal of logic.
2228 # question was: Should folders be automatically deleted instead of sent to trash..
2229 # we've changed the question to make it more clear,
2230 # and are here handling that to avoid changing the answers..
2231 if ( lc($delete_folder) eq 'true' ) {
2232 $default_value = "n";
2234 $default_value = "y";
2236 print "Send deleted folders to Trash? (y/n) [$WHT$default_value$NRM]: $WHT";
2237 $new_delete = <STDIN
>;
2238 if ( ( $new_delete =~ /^y\n/i ) || ( ( $new_delete =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2239 $delete_folder = 'false';
2241 $delete_folder = 'true';
2244 return $delete_folder;
2249 print "Some IMAP servers allow subfolders to exist even if the parent\n";
2250 print "folders do not. This fixes some problems with the folder list\n";
2251 print "when this is the case, causing the /NoSelect folders to be displayed\n";
2254 if ( lc($noselect_fix_enable) eq 'true' ) {
2255 $default_value = "y";
2257 $default_value = "n";
2259 print "enable noselect fix? (y/n) [$WHT$noselect_fix_enable$NRM]: $WHT";
2260 $noselect_fix_enable = <STDIN
>;
2261 if ( ( $noselect_fix_enable =~ /^y\n/i ) || ( ( $noselect_fix_enable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2262 $noselect_fix_enable = 'true';
2264 $noselect_fix_enable = 'false';
2266 return $noselect_fix_enable;
2268 ############# GENERAL OPTIONS #####################
2272 print "Specify the location for your data directory.\n";
2273 print "You need to create this directory yourself.\n";
2274 print "The path name can be absolute or relative (to the config directory).\n";
2275 print "Here are two examples:\n";
2276 print " Absolute: /var/local/squirrelmail/data/\n";
2277 print " Relative: ../data/\n";
2278 print "Relative paths to directories outside of the SquirrelMail distribution\n";
2279 print "will be converted to their absolute path equivalents in config.php.\n\n";
2280 print "Note: There are potential security risks with having a writeable directory\n";
2281 print "under the web server's root directory (ex: /home/httpd/html).\n";
2282 print "For this reason, it is recommended to put the data directory\n";
2283 print "in an alternate location of your choice. \n";
2286 print "[$WHT$data_dir$NRM]: $WHT";
2287 $new_data_dir = <STDIN
>;
2288 if ( $new_data_dir eq "\n" ) {
2289 $new_data_dir = $data_dir;
2291 $new_data_dir =~ s/[\r\n]//g;
2293 if ( $new_data_dir =~ /^\s*$/ ) {
2296 $new_data_dir =~ s/\/*$//g
;
2297 $new_data_dir =~ s/$/\//g
;
2299 return $new_data_dir;
2302 # Attachment directory
2304 print "Path to directory used for storing attachments while a mail is\n";
2305 print "being composed. The path name can be absolute or relative (to the\n";
2306 print "config directory). Here are two examples:\n";
2307 print " Absolute: /var/local/squirrelmail/attach/\n";
2308 print " Relative: ../attach/\n";
2309 print "Relative paths to directories outside of the SquirrelMail distribution\n";
2310 print "will be converted to their absolute path equivalents in config.php.\n\n";
2311 print "Note: There are a few security considerations regarding this\n";
2312 print "directory:\n";
2313 print " 1. It should have the permission 733 (rwx-wx-wx) to make it\n";
2314 print " impossible for a random person with access to the webserver\n";
2315 print " to list files in this directory. Confidential data might\n";
2316 print " be laying around in there.\n";
2317 print " Depending on your user:group assignments, 730 (rwx-wx---)\n";
2318 print " may be possible, and more secure (e.g. root:apache)\n";
2319 print " 2. Since the webserver is not able to list the files in the\n";
2320 print " content is also impossible for the webserver to delete files\n";
2321 print " lying around there for too long.\n";
2322 print " 3. It should probably be another directory than the data\n";
2323 print " directory specified in option 3.\n";
2326 print "[$WHT$attachment_dir$NRM]: $WHT";
2327 $new_attachment_dir = <STDIN
>;
2328 if ( $new_attachment_dir eq "\n" ) {
2329 $new_attachment_dir = $attachment_dir;
2331 $new_attachment_dir =~ s/[\r\n]//g;
2333 if ( $new_attachment_dir =~ /^\s*$/ ) {
2334 $new_attachment_dir = "";
2336 $new_attachment_dir =~ s/\/*$//g
;
2337 $new_attachment_dir =~ s/$/\//g
;
2339 return $new_attachment_dir;
2343 print "The directory hash level setting allows you to configure the level\n";
2344 print "of hashing that SquirrelMail employs in your data and attachment\n";
2345 print "directories. This value must be an integer ranging from 0 to 4.\n";
2346 print "When this value is set to 0, SquirrelMail will simply store all\n";
2347 print "files as normal in the data and attachment directories. However,\n";
2348 print "when set to a value from 1 to 4, a simple hashing scheme will be\n";
2349 print "used to organize the files in this directory. In short, the crc32\n";
2350 print "value for a username will be computed. Then, up to the first 4\n";
2351 print "digits of the hash, as set by this configuration value, will be\n";
2352 print "used to directory hash the files for that user in the data and\n";
2353 print "attachment directory. This allows for better performance on\n";
2354 print "servers with larger numbers of users.\n";
2357 print "[$WHT$dir_hash_level$NRM]: $WHT";
2358 $new_dir_hash_level = <STDIN
>;
2359 if ( $new_dir_hash_level eq "\n" ) {
2360 $new_dir_hash_level = $dir_hash_level;
2362 $new_dir_hash_level =~ s/[\r\n]//g;
2364 if ( ( int($new_dir_hash_level) < 0 )
2365 || ( int($new_dir_hash_level) > 4 )
2366 || !( int($new_dir_hash_level) eq $new_dir_hash_level ) ) {
2367 print "Invalid Directory Hash Level.\n";
2368 print "Value must be an integer ranging from 0 to 4\n";
2369 print "Hit enter to continue.\n";
2370 $enter_key = <STDIN
>;
2372 $new_dir_hash_level = $dir_hash_level;
2375 return $new_dir_hash_level;
2379 print "This is the default size (in pixels) of the left folder list.\n";
2380 print "Default is 200, but you can set it to whatever you wish. This\n";
2381 print "is a user preference, so this will only show up as their default.\n";
2383 print "[$WHT$default_left_size$NRM]: $WHT";
2384 $new_default_left_size = <STDIN
>;
2385 if ( $new_default_left_size eq "\n" ) {
2386 $new_default_left_size = $default_left_size;
2388 $new_default_left_size =~ s/[\r\n]//g;
2390 return $new_default_left_size;
2394 print "Some IMAP servers only have lowercase letters in the usernames\n";
2395 print "but they still allow people with uppercase to log in. This\n";
2396 print "causes a problem with the user's preference files. This option\n";
2397 print "transparently changes all usernames to lowercase.";
2400 if ( lc($force_username_lowercase) eq 'true' ) {
2401 $default_value = "y";
2403 $default_value = "n";
2405 print "Convert usernames to lowercase (y/n) [$WHT$default_value$NRM]: $WHT";
2406 $new_show = <STDIN
>;
2407 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2417 if ( lc($default_use_priority) eq 'true' ) {
2418 $default_value = "y";
2420 $default_value = "n";
2423 print "Allow users to specify priority of outgoing mail (y/n) [$WHT$default_value$NRM]: $WHT";
2424 $new_show = <STDIN
>;
2425 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2435 if ( lc($hide_sm_attributions) eq 'true' ) {
2436 $default_value = "y";
2438 $default_value = "n";
2441 print "Hide SM attributions (y/n) [$WHT$default_value$NRM]: $WHT";
2442 $new_show = <STDIN
>;
2443 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2453 if ( lc($default_use_mdn) eq 'true' ) {
2454 $default_value = "y";
2456 $default_value = "n";
2459 print "Enable support for read/delivery receipt support (y/n) [$WHT$default_value$NRM]: $WHT";
2460 $new_show = <STDIN
>;
2461 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2469 print " In loosely managed environments, you may want to allow users
2470 to edit their full name and email address. In strictly managed
2471 environments, you may want to force users to use the name
2472 and email address assigned to them.
2474 'y' - allow a user to edit their full name and email address,
2475 'n' - users must use the assigned values.
2479 if ( lc($edit_identity) eq 'true' ) {
2480 $default_value = "y";
2482 $default_value = "n";
2484 print "Allow editing of user's identity? (y/n) [$WHT$default_value$NRM]: $WHT";
2485 $new_edit = <STDIN
>;
2486 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2487 $edit_identity = 'true';
2488 $edit_name = 'true';
2489 $hide_auth_header = command311b
();
2491 $edit_identity = 'false';
2492 $edit_name = command311
();
2493 $hide_auth_header = command311b
();
2495 return $edit_identity;
2499 print " Given that users are not allowed to modify their
2500 email address, can they edit their full name?
2504 if ( lc($edit_name) eq 'true' ) {
2505 $default_value = "y";
2507 $default_value = "n";
2509 print "Allow the user to edit their full name? (y/n) [$WHT$default_value$NRM]: $WHT";
2510 $new_edit = <STDIN
>;
2511 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2512 $edit_name = 'true';
2514 $edit_name = 'false';
2520 print " SquirrelMail adds username information to every sent email
2521 in order to prevent possible sender forging when users are allowed
2522 to change their email and/or full name.
2524 You can remove user information from this header (y), if you think that
2525 it violates privacy or security.
2527 Note: If users are allowed to change their email addresses,
2528 this setting will make it difficult to determine who sent what where.
2529 Use at your own risk.
2533 if ( lc($hide_auth_header) eq "true" ) {
2534 $default_value = "y";
2536 $default_value = "n";
2538 print "Remove username from email headers? (y/n) [$WHT$default_value$NRM]: $WHT";
2539 $new_header = <STDIN
>;
2540 if ( ( $new_header =~ /^y\n/i ) || ( ( $new_header =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2541 $hide_auth_header = "true";
2543 $hide_auth_header = "false";
2545 return $hide_auth_header;
2549 print "This option allows you to disable server side thread sorting if your server \n";
2550 print "declares THREAD support, but you don't want to provide threading options \n";
2551 print "to end users or THREAD extension is broken or extension does not work with \n";
2552 print "options used by SquirrelMail. Option is not used, if THREAD extension is \n";
2553 print "not declared in IMAP CAPABILITY.\n";
2556 if ( lc($disable_thread_sort) eq 'true' ) {
2557 $default_value = "y";
2559 $default_value = "n";
2561 print "Disable server side thread sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2562 $disable_thread_sort = <STDIN
>;
2563 if ( ( $disable_thread_sort =~ /^y\n/i ) || ( ( $disable_thread_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2564 $disable_thread_sort = 'true';
2566 $disable_thread_sort = 'false';
2568 return $disable_thread_sort;
2572 print "This option allows you to disable server side sorting if your server declares \n";
2573 print "SORT support, but SORT extension is broken or does not work with options \n";
2574 print "used by SquirrelMail. Option is not used, if SORT extension is not declared \n";
2575 print "in IMAP CAPABILITY.\n";
2577 print "It is strongly recommended to keep server side sorting enabled, if your ";
2578 print "IMAP server supports it.";
2581 if ( lc($disable_server_sort) eq 'true' ) {
2582 $default_value = "y";
2584 $default_value = "n";
2586 print "Disable server-side sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2587 $disable_server_sort = <STDIN
>;
2588 if ( ( $disable_server_sort =~ /^y\n/i ) || ( ( $disable_server_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2589 $disable_server_sort = 'true';
2591 $disable_server_sort = 'false';
2593 return $disable_server_sort;
2597 print "This option allows you to choose if SM uses charset search\n";
2598 print "Your IMAP server must support the SEARCH CHARSET command for this to work\n";
2601 if ( lc($allow_charset_search) eq 'true' ) {
2602 $default_value = "y";
2604 $default_value = "n";
2606 print "Allow charset searching? (y/n) [$WHT$default_value$NRM]: $WHT";
2607 $allow_charset_search = <STDIN
>;
2608 if ( ( $allow_charset_search =~ /^y\n/i ) || ( ( $allow_charset_search =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2609 $allow_charset_search = 'true';
2611 $allow_charset_search = 'false';
2613 return $allow_charset_search;
2616 # command315 (UID support) obsoleted.
2618 # advanced search option
2620 print "This option allows you to control the use of advanced search form.\n";
2621 print " 0 = enable basic search only\n";
2622 print " 1 = enable advanced search only\n";
2623 print " 2 = enable both\n";
2626 print "Allowed search (0,1,2)? [$WHT$allow_advanced_search$NRM]: $WHT";
2627 $new_allow_advanced_search = <STDIN
>;
2628 if ( $new_allow_advanced_search =~ /^[012]\n/i ) {
2629 $allow_advanced_search = $new_allow_advanced_search;
2631 $allow_advanced_search =~ s/[\r\n]//g;
2632 return $allow_advanced_search;
2637 print "This option allows you to change the name of the PHP session used\n";
2638 print "by SquirrelMail. Unless you know what you are doing, you probably\n";
2639 print "don't need or want to change this from the default of SQMSESSID.\n";
2640 print "[$WHT$session_name$NRM]: $WHT";
2641 $new_session_name = <STDIN
>;
2642 chomp($new_session_name);
2643 if ( $new_session_name eq "" ) {
2644 $new_session_name = $session_name;
2646 return $new_session_name;
2649 # time zone config (since 1.5.1)
2651 print "This option allows you to control the use of time zones.\n";
2652 print " 0 = (default) standard, GNU C time zone names\n";
2653 print " 1 = strict, generic time zone codes with offsets\n";
2654 print " 2 = custom, GNU C time zones loaded from config/timezones.php\n";
2655 print " 3 = custom strict, generic time zone codes with offsets loaded \n";
2656 print " from config/timezones.php\n";
2657 print "See SquirrelMail documentation about format of config/timezones.php file.\n";
2660 print "Desired time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT";
2661 $new_time_zone_type = <STDIN
>;
2662 if ( $new_time_zone_type =~ /^[0123]\n/i ) {
2663 $time_zone_type = $new_time_zone_type;
2665 print "\nInvalid configuration value.\n";
2666 print "\nPress enter to continue...";
2669 $time_zone_type =~ s/[\r\n]//g;
2670 return $time_zone_type;
2673 # set the location base for redirects (since 1.5.2)
2674 sub command_config_location_base
{
2675 print "Here you can set the base part of the SquirrelMail URL.\n";
2676 print "It is normally autodetected but if that fails, use this\n";
2677 print "option to override.\n";
2678 print "It should contain only the protocol and hostname/port parts\n";
2679 print "of the URL; the full path will be appended automatically.\n\n";
2680 print "Examples:\nhttp://webmail.example.org\nhttp://webmail.example.com:8080\nhttps://webmail.example.com:6691\n\n";
2681 print "Do not add any path elements.\n";
2683 print "URL base? [" .$WHT."autodetect$NRM]: $WHT";
2684 $new_config_location_base = <STDIN
>;
2685 chomp($new_config_location_base);
2686 $config_location_base = $new_config_location_base;
2688 return $config_location_base;
2691 # only_secure_cookies (since 1.5.2)
2693 print "This option allows you to specify that if a user session is initiated\n";
2694 print "under a secure (HTTPS, SSL-encrypted) connection, the cookies given to\n";
2695 print "the browser will ONLY be transmitted via a secure connection henceforth.\n\n";
2696 print "Generally this is a Good Thing, and should NOT be disabled. However,\n";
2697 print "if you intend to use the Secure Login or Show SSL Link plugins to\n";
2698 print "encrypt the user login, but not the rest of the SquirrelMail session,\n";
2699 print "this can be turned off. Think twice before doing so.\n";
2702 if ( lc($only_secure_cookies) eq 'true' ) {
2703 $default_value = "y";
2705 $default_value = "n";
2707 print "Transmit cookies only on secure connection when available? (y/n) [$WHT$default_value$NRM]: $WHT";
2708 $only_secure_cookies = <STDIN
>;
2709 if ( ( $only_secure_cookies =~ /^y\n/i ) || ( ( $only_secure_cookies =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2710 $only_secure_cookies = 'true';
2712 $only_secure_cookies = 'false';
2714 return $only_secure_cookies;
2718 sub command_userThemes
{
2719 print "\nDefine the user themes that you wish to use. If you have added\n";
2720 print "a theme of your own, just follow the instructions (?) about\n";
2721 print "how to add them. You can also change the default theme.\n\n";
2723 print "Available user themes:\n";
2725 while ( $count <= $#user_theme_name ) {
2726 if ( $count == $user_theme_default ) {
2731 if ( $count < 10 ) {
2734 $name = $user_theme_name[$count];
2735 $num_spaces = 35 - length($name);
2736 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2737 $name = $name . " ";
2740 print " $count. $name";
2741 print "($user_theme_path[$count])\n";
2747 print ".------------------------------------.\n";
2748 print "| t (detect user themes) |\n";
2749 print "| + (add user theme) |\n";
2750 print "| - N (remove user theme) |\n";
2751 print "| m N (mark default user theme) |\n";
2752 print "| l (list user themes) |\n";
2753 print "| d (done) |\n";
2754 print "`------------------------------------'\n";
2756 print "\n[user_themes] command (?=help) > ";
2758 $input =~ s/[\r\n]//g;
2759 while ( $input ne "d" ) {
2760 if ( $input =~ /^\s*l\s*/i ) {
2762 while ( $count <= $#user_theme_name ) {
2763 if ( $count == $user_theme_default ) {
2768 if ( $count < 10 ) {
2771 $name = $user_theme_name[$count];
2772 $num_spaces = 35 - length($name);
2773 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2774 $name = $name . " ";
2777 print " $count. $name";
2778 print "($user_theme_path[$count])\n";
2782 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
2783 $old_def = $user_theme_default;
2784 $user_theme_default = $input;
2785 $user_theme_default =~ s/^\s*m\s*//;
2786 if ( ( $user_theme_default > $#user_theme_name ) || ( $user_theme_default < 0 ) ) {
2787 print "Cannot set default theme to $user_theme_default. That theme does not exist.\n";
2788 $user_theme_default = $old_def;
2790 } elsif ( $input =~ /^\s*\+/ ) {
2791 print "What is the name of this theme? ";
2793 $name =~ s/[\r\n]//g;
2794 $user_theme_name[ $#user_theme_name + 1 ] = $name;
2795 print "Be sure to put ../css/ before the filename.\n";
2796 print "What file is this stored in (ex: ../css/my_theme/): ";
2798 $name =~ s/[\r\n]//g;
2799 $user_theme_path[ $#user_theme_path + 1 ] = $name;
2800 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
2801 if ( $input =~ /[0-9]+\s*$/ ) {
2803 $rem_num =~ s/^\s*-\s*//g;
2804 $rem_num =~ s/\s*$//;
2806 $rem_num = $#user_theme_name;
2808 if ( $rem_num == $user_theme_default ) {
2809 print "You cannot remove the default theme!\n";
2812 @new_theme_name = ();
2813 @new_theme_path = ();
2814 while ( $count <= $#user_theme_name ) {
2815 if ( $count != $rem_num ) {
2816 @new_theme_name = ( @new_theme_name, $user_theme_name[$count] );
2817 @new_theme_path = ( @new_theme_path, $user_theme_path[$count] );
2821 @user_theme_name = @new_theme_name;
2822 @user_theme_path = @new_theme_path;
2823 if ( $user_theme_default > $rem_num ) {
2824 $user_theme_default--;
2827 } elsif ( $input =~ /^\s*t\s*/i ) {
2828 print "\nStarting detection...\n\n";
2830 opendir( DIR
, "../css" );
2831 @files = sort(readdir(DIR
));
2833 while ( $cnt <= $#files ) {
2834 $filename = "../css/" . $files[$cnt] .'/';
2835 if ( $files[$cnt] !~ /^\./ && $filename ne "../css/rtl.css" && -e
$filename . "default.css" ) {
2837 for ( $x = 0 ; $x <= $#user_theme_path ; $x++ ) {
2838 if ( $user_theme_path[$x] eq $filename ) {
2842 if ( $found != 1 ) {
2843 print "** Found user theme: $filename\n";
2844 $def = $files[$cnt];
2847 #$def =~ s/(^\w+)/ucfirst $1/eg;
2848 #$def =~ s/(\s+)(\w+)/$1 . ucfirst $2/eg;
2849 $def =~ s/(^\w+)|(\s+)(\w+)/ucfirst $1 . $2 . ucfirst $3/eg;
2850 print " What is its name? [$def]: ";
2852 $nm =~ s/^\s+|\s+$|[\n\r]//g;
2853 if ( $nm eq '' ) { $nm = $def; }
2854 $user_theme_name[ $#user_theme_name + 1 ] = $nm;
2855 $user_theme_path[ $#user_theme_path + 1 ] = $filename;
2861 for ( $cnt = 0 ; $cnt <= $#user_theme_path ; $cnt++ ) {
2862 $filename = $user_theme_path[$cnt];
2863 if ( $filename != 'none' && !( -e
$filename ."/default.css" ) ) {
2864 print " Removing $filename (file not found)\n";
2866 @new_user_theme_name = ();
2867 @new_user_theme_path = ();
2868 for ( $x = 0 ; $x < $#user_theme_path ; $x++ ) {
2869 if ( $user_theme_path[$x] eq $filename ) {
2872 if ( $offset == 1 ) {
2873 $new_user_theme_name[$x] = $user_theme_name[ $x + 1 ];
2874 $new_user_theme_path[$x] = $user_theme_path[ $x + 1 ];
2876 $new_user_theme_name[$x] = $user_theme_name[$x];
2877 $new_user_theme_path[$x] = $user_theme_path[$x];
2880 @user_theme_name = @new_user_theme_name;
2881 @user_theme_path = @new_user_theme_path;
2884 print "\nDetection complete!\n\n";
2887 } elsif ( $input =~ /^\s*\?\s*/ ) {
2888 print ".------------------------------------.\n";
2889 print "| t (detect user themes) |\n";
2890 print "| + (add user theme) |\n";
2891 print "| - N (remove user theme) |\n";
2892 print "| m N (mark default user theme) |\n";
2893 print "| l (list user themes) |\n";
2894 print "| d (done) |\n";
2895 print "`------------------------------------'\n";
2897 print "[user_themes] command (?=help) > ";
2899 $input =~ s/[\r\n]//g;
2903 sub command_iconSets
{
2904 print "\nDefine the icon themes that you wish to use. If you have added\n";
2905 print "a theme of your own, just follow the instructions (?) about\n";
2906 print "how to add them. You can also change the default and fallback\n";
2907 print "themes. The default theme will be used when no icon theme is\n";
2908 print "set by the user. The fallback theme will be used if an icon\n";
2909 print "cannot be found in the currently selected icon theme.\n\n";
2911 print "Available icon themes:\n\n";
2914 while ( $count <= $#icon_theme_name ) {
2915 if ( $count == $icon_theme_def ) {
2920 if ( $count eq $icon_theme_fallback ) {
2925 if ( $count < 10 ) {
2928 $name = $icon_theme_name[$count];
2929 $num_spaces = 35 - length($name);
2930 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2931 $name = $name . " ";
2934 print " $count. $name";
2935 print "($icon_theme_path[$count])\n";
2940 print "\n d = Default icon theme\n";
2941 print " f = Fallback icon theme\n";
2943 print ".------------------------------------.\n";
2944 print "| t (detect icon themes) |\n";
2945 print "| + (add icon theme) |\n";
2946 print "| - N (remove icon theme) |\n";
2947 print "| m N (mark default icon theme) |\n";
2948 print "| f N (set fallback icon set) |\n";
2949 print "| l (list icon themes) |\n";
2950 print "| d (done) |\n";
2951 print "`------------------------------------'\n";
2953 print "\n[icon_themes] command (?=help) > ";
2955 $input =~ s/[\r\n]//g;
2956 while ( $input ne "d" ) {
2957 if ( $input =~ /^\s*l\s*/i ) {
2960 while ( $count <= $#icon_theme_name ) {
2961 if ( $count == $icon_theme_def ) {
2966 if ( $count eq $icon_theme_fallback ) {
2971 $name = $icon_theme_name[$count];
2972 $num_spaces = 35 - length($name);
2973 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2974 $name = $name . " ";
2977 print " $count. $name";
2978 print "($icon_theme_path[$count])\n";
2982 print "\n d = Default icon theme\n";
2983 print " f = Fallback icon theme\n\n";
2984 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
2985 $old_def = $icon_theme_def;
2986 $icon_theme_def = $input;
2987 $icon_theme_def =~ s/^\s*m\s*//;
2988 if ( ( $icon_theme_default > $#icon_theme_name ) || ( $icon_theme_default < 0 ) ) {
2989 print "Cannot set default icon theme to $icon_theme_default. That theme does not exist.\n";
2990 $icon_theme_def = $old_def;
2992 } elsif ( $input =~ /^\s*f\s*[0-9]+/i ) {
2993 $old_fb = $icon_theme_fallback;
2994 $icon_theme_fallback = $input;
2995 $icon_theme_fallback =~ s/^\s*f\s*//;
2996 if ( ( $icon_theme_fallback > $#icon_theme_name ) || ( $icon_theme_fallback < 0 ) ) {
2997 print "Cannot set fallback icon theme to $icon_theme_fallback. That theme does not exist.\n";
2998 $icon_theme_fallback = $old_fb;
3000 } elsif ( $input =~ /^\s*\+/ ) {
3001 print "What is the name of this icon theme? ";
3003 $name =~ s/[\r\n]//g;
3004 $icon_theme_name[ $#icon_theme_name + 1 ] = $name;
3005 print "Be sure to put ../images/themes/ before the filename.\n";
3006 print "What directory is this icon theme stored in (ex: ../images/themes/my_theme/)? ";
3008 $name =~ s/[\r\n]//g;
3009 $icon_theme_path[ $#icon_theme_path + 1 ] = $name;
3010 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
3011 if ( $input =~ /[0-9]+\s*$/ ) {
3013 $rem_num =~ s/^\s*-\s*//g;
3014 $rem_num =~ s/\s*$//;
3016 $rem_num = $#icon_theme_name;
3018 if ( $rem_num == $icon_theme_def ) {
3019 print "You cannot remove the default icon theme!\n";
3020 } elsif ( $rem_num == $icon_theme_fallback ) {
3021 print "You cannot remove the fallback icon theme!\n";
3024 @new_theme_name = ();
3025 @new_theme_path = ();
3026 while ( $count <= $#icon_theme_name ) {
3027 if ( $count != $rem_num ) {
3028 @new_theme_name = ( @new_theme_name, $icon_theme_name[$count] );
3029 @new_theme_path = ( @new_theme_path, $icon_theme_path[$count] );
3033 @icon_theme_name = @new_theme_name;
3034 @icon_theme_path = @new_theme_path;
3035 if ( $icon_theme_def > $rem_num ) {
3039 } elsif ( $input =~ /^\s*t\s*/i ) {
3040 print "\nStarting detection...\n\n";
3042 opendir( DIR
, "../images/themes/" );
3043 @files = sort(readdir(DIR
));
3045 while ( $cnt <= $#files ) {
3046 $filename = "../images/themes/" . $files[$cnt] .'/';
3047 if ( -d
"../images/themes/" . $files[$cnt] && $files[$cnt] !~ /^\
./ && $files[$cnt] ne ".svn" ) {
3049 for ( $x = 0 ; $x <= $#icon_theme_path ; $x++ ) {
3050 if ( $icon_theme_path[$x] eq $filename ) {
3054 if ( $found != 1 ) {
3055 print "** Found icon theme: $filename\n";
3056 $def = $files[$cnt];
3059 #$def =~ s/(^\w+)/ucfirst $1/eg;
3060 #$def =~ s/(\s+)(\w+)/$1 . ucfirst $2/eg;
3061 $def =~ s/(^\w+)|(\s+)(\w+)/ucfirst $1 . $2 . ucfirst $3/eg;
3062 print " What is its name? [$def]: ";
3064 $nm =~ s/^\s+|\s+$|[\n\r]//g;
3065 if ( $nm eq '' ) { $nm = $def; }
3066 $icon_theme_name[ $#icon_theme_name + 1 ] = $nm;
3067 $icon_theme_path[ $#icon_theme_path + 1 ] = $filename;
3073 for ( $cnt = 0 ; $cnt <= $#icon_theme_path ; $cnt++ ) {
3074 $filename = $icon_theme_path[$cnt];
3075 if ( $filename ne "none" && $filename ne "template" && ! -d
$filename ) {