4 # Copyright (c) 1999-2015 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 # Try to determine what the version of SquirrelMail is
47 ############################################################
48 $sm_version = 'unknown';
49 if ( -e
"../include/constants.php" && -r
"../include/constants.php") {
50 open( FILE
, "../include/constants.php" );
51 while ( $line = <FILE
> ) {
52 if ($line =~ m/^define\('SM_VERSION', ?'(\d+\.\d+\.\d+( ?\[\w+]|))'/) {
61 ############################################################
62 # First, let's read in the data already in there...
63 ############################################################
64 if ( -e
"config.php" ) {
65 # Make sure that file is readable
66 if (! -r
"config.php") {
69 print "The file \"config/config.php\" was found, but you don't\n";
70 print "have rights to read it.\n";
72 print "Press enter to continue";
76 open( FILE
, "config.php" );
77 while ( $line = <FILE
> ) {
83 if ( $var =~ /^([a-z])/i ) {
84 @o = split ( /\s*EQUALS\s*/, $var );
85 if ( $o[0] eq "config_version" ) {
87 $o[1] =~ s/[\'\"];\s*$//;
91 $config_version = $o[1];
98 if ( $config_version ne $conf_pl_version ) {
101 print " The file \"config/config.php\" was found, but it is for\n";
102 print " an older version of SquirrelMail. It is possible to still\n";
103 print " read the defaults from this file but be warned that many\n";
104 print " preferences change between versions. It is recommended that\n";
105 print " you start with a clean config.php for each upgrade that you\n";
106 print " do. To do this, just move config/config.php out of the way.\n";
108 print "Continue loading with the old config.php [y/N]? ";
111 if ( ( $ctu !~ /^y\n/i ) || ( $ctu =~ /^\n/ ) ) {
115 print "\nDo you want me to stop warning you [y/N]? ";
117 if ( $ctu =~ /^y\n/i ) {
118 $print_config_version = $conf_pl_version;
120 $print_config_version = $config_version;
123 $print_config_version = $config_version;
127 open( FILE
, "config.php" );
128 } elsif ( -e
"config_default.php" ) {
129 open( FILE
, "config_default.php" );
130 while ( $line = <FILE
> ) {
136 if ( $var =~ /^([a-z])/i ) {
137 @o = split ( /\s*EQUALS\s*/, $var );
138 if ( $o[0] eq "config_version" ) {
139 $o[1] =~ s/[\n\r]//g;
140 $o[1] =~ s/[\'\"];\s*$//;
142 $o[1] =~ s/^[\'\"]//;
144 $config_version = $o[1];
151 if ( $config_version ne $conf_pl_version ) {
154 print " You are trying to use a 'config_default.php' from an older\n";
155 print " version of SquirrelMail. This is HIGHLY unrecommended. You\n";
156 print " should get the 'config_default.php' that matches the version\n";
157 print " of SquirrelMail that you are running. You can get this from\n";
158 print " the SquirrelMail web page by going to the following URL:\n";
159 print " http://squirrelmail.org.\n";
161 print "Continue loading with old config_default.php (a bad idea) [y/N]? ";
164 if ( ( $ctu !~ /^y\n/i ) || ( $ctu =~ /^\n/ ) ) {
168 print "\nDo you want me to stop warning you [y/N]? ";
170 if ( $ctu =~ /^y\n/i ) {
171 $print_config_version = $conf_pl_version;
173 $print_config_version = $config_version;
176 $print_config_version = $config_version;
179 open( FILE
, "config_default.php" );
181 print "No configuration file found. Please get config_default.php\n";
182 print "or config.php before running this again. This program needs\n";
183 print "a default config file to get default values.\n";
187 # Read and parse the current configuration file
188 # (either config.php or config_default.php).
189 while ( $line = <FILE
> ) {
195 if ( $var =~ /^([a-z])/i ) {
196 @options = split ( /\s*EQUALS\s*/, $var );
197 $options[1] =~ s/[\n\r]//g;
198 $options[1] =~ s/[\'\"];\s*$//;
199 $options[1] =~ s/;$//;
200 $options[1] =~ s/^[\'\"]//;
201 # de-escape escaped strings
202 $options[1] =~ s/\\'/'/g;
203 $options[1] =~ s/\\\\/\\/g;
205 if ( $options[0] =~ /^user_themes\[[0-9]+\]\[['"]PATH['"]\]/ ) {
207 $sub =~ s/\]\[['"]PATH['"]\]//;
209 if ( -e
"../css/" ) {
210 $options[1] =~ s/^\.\.\/config/\
.\
.\
/css/;
212 $user_theme_path[$sub] = &change_to_rel_path
($options[1]);
213 } elsif ( $options[0] =~ /^user_themes\[[0-9]+\]\[['"]NAME['"]\]/ ) {
215 $sub =~ s/\]\[['"]NAME['"]\]//;
217 $user_theme_name[$sub] = $options[1];
218 } elsif ( $options[0] =~ /^icon_themes\[[0-9]+\]\[['"]PATH['"]\]/ ) {
220 $sub =~ s/\]\[['"]PATH['"]\]//;
222 if ( -e
"../images/" ) {
223 $options[1] =~ s/^\.\.\/config/\
.\
.\
/images/;
225 $icon_theme_path[$sub] = &change_to_rel_path
($options[1]);
226 } elsif ( $options[0] =~ /^icon_themes\[[0-9]+\]\[['"]NAME['"]\]/ ) {
228 $sub =~ s/\]\[['"]NAME['"]\]//;
230 $icon_theme_name[$sub] = $options[1];
231 } elsif ( $options[0] =~ /^aTemplateSet\[[0-9]+\]\[['"]ID['"]\]/ ) {
233 $sub =~ s/\]\[['"]ID['"]\]//;
235 if ( -e
"../templates" ) {
236 $options[1] =~ s/^\.\.\/config/\
.\
.\
/templates/;
238 $templateset_id[$sub] = $options[1];
239 ##### FIXME: This section BELOW here so old prefs files don't blow up when running conf.pl
240 ##### Remove after a month or two
241 } elsif ( $options[0] =~ /^aTemplateSet\[[0-9]+\]\[['"]PATH['"]\]/ ) {
243 $sub =~ s/\]\[['"]PATH['"]\]//;
245 if ( -e
"../templates" ) {
246 $options[1] =~ s/^\.\.\/config/\
.\
.\
/templates/;
248 $templateset_id[$sub] = $options[1];
249 ##### FIXME: This section ABOVE here so old prefs files don't blow up when running conf.pl
250 ##### Remove after a month or two
251 } elsif ( $options[0] =~ /^aTemplateSet\[[0-9]+\]\[['"]NAME['"]\]/ ) {
253 $sub =~ s/\]\[['"]NAME['"]\]//;
255 $templateset_name[$sub] = $options[1];
256 } elsif ( $options[0] =~ /^plugins\[[0-9]*\]/ ) {
259 $sub =~ s/^plugins\[//;
261 push @plugins, $options[1];
263 $plugins[$sub] = $options[1];
265 } elsif ($options[0] =~ /^fontsets\[\'[a-z]*\'\]/) {
266 # parse associative $fontsets array
269 $sub =~ s/^fontsets\[\'//;
270 $fontsets{$sub} = $options[1];
271 } elsif ( $options[0] =~ /^theme\[[0-9]+\]\[['"]PATH|NAME['"]\]/ ) {
273 ## $color themes are no longer supported. Please leave this
274 ## so conf.pl doesn't barf if it encounters a $theme.
276 } elsif ( $options[0] =~ /^ldap_server\[[0-9]+\]/ ) {
279 $sub =~ s/^ldap_server\[//;
281 while ( ( $tmp = <FILE
> ) && ( $continue != 1 ) ) {
282 if ( $tmp =~ /\);\s*$/ ) {
286 if ( $tmp =~ /^\s*[\'\"]host[\'\"]/i ) {
287 $tmp =~ s/^\s*[\'\"]host[\'\"]\s*=>\s*[\'\"]//i;
288 $tmp =~ s/[\'\"],?\s*$//;
289 $tmp =~ s/[\'\"]\);\s*$//;
291 } elsif ( $tmp =~ /^\s*[\'\"]base[\'\"]/i ) {
292 $tmp =~ s/^\s*[\'\"]base[\'\"]\s*=>\s*[\'\"]//i;
293 $tmp =~ s/[\'\"],?\s*$//;
294 $tmp =~ s/[\'\"]\);\s*$//;
296 } elsif ( $tmp =~ /^\s*[\'\"]charset[\'\"]/i ) {
297 $tmp =~ s/^\s*[\'\"]charset[\'\"]\s*=>\s*[\'\"]//i;
298 $tmp =~ s/[\'\"],?\s*$//;
299 $tmp =~ s/[\'\"]\);\s*$//;
301 } elsif ( $tmp =~ /^\s*[\'\"]port[\'\"]/i ) {
302 $tmp =~ s/^\s*[\'\"]port[\'\"]\s*=>\s*[\'\"]?//i;
303 $tmp =~ s/[\'\"]?,?\s*$//;
304 $tmp =~ s/[\'\"]?\);\s*$//;
306 } elsif ( $tmp =~ /^\s*[\'\"]maxrows[\'\"]/i ) {
307 $tmp =~ s/^\s*[\'\"]maxrows[\'\"]\s*=>\s*[\'\"]?//i;
308 $tmp =~ s/[\'\"]?,?\s*$//;
309 $tmp =~ s/[\'\"]?\);\s*$//;
311 } elsif ( $tmp =~ /^\s*[\'\"]filter[\'\"]/i ) {
312 $tmp =~ s/^\s*[\'\"]filter[\'\"]\s*=>\s*[\'\"]?//i;
313 $tmp =~ s/[\'\"]?,?\s*$//;
314 $tmp =~ s/[\'\"]?\);\s*$//;
316 } elsif ( $tmp =~ /^\s*[\'\"]name[\'\"]/i ) {
317 $tmp =~ s/^\s*[\'\"]name[\'\"]\s*=>\s*[\'\"]//i;
318 $tmp =~ s/[\'\"],?\s*$//;
319 $tmp =~ s/[\'\"]\);\s*$//;
321 } elsif ( $tmp =~ /^\s*[\'\"]binddn[\'\"]/i ) {
322 $tmp =~ s/^\s*[\'\"]binddn[\'\"]\s*=>\s*[\'\"]//i;
323 $tmp =~ s/[\'\"],?\s*$//;
324 $tmp =~ s/[\'\"]\);\s*$//;
326 } elsif ( $tmp =~ /^\s*[\'\"]bindpw[\'\"]/i ) {
327 $tmp =~ s/^\s*[\'\"]bindpw[\'\"]\s*=>\s*[\'\"]//i;
328 $tmp =~ s/[\'\"],?\s*$//;
329 $tmp =~ s/[\'\"]\);\s*$//;
331 } elsif ( $tmp =~ /^\s*[\'\"]protocol[\'\"]/i ) {
332 $tmp =~ s/^\s*[\'\"]protocol[\'\"]\s*=>\s*[\'\"]?//i;
333 $tmp =~ s/[\'\"]?,?\s*$//;
334 $tmp =~ s/[\'\"]?\);\s*$//;
336 } elsif ( $tmp =~ /^\s*[\'\"]limit_scope[\'\"]/i ) {
337 $tmp =~ s/^\s*[\'\"]limit_scope[\'\"]\s*=>\s*[\'\"]?//i;
338 $tmp =~ s/[\'\"]?,?\s*$//;
339 $tmp =~ s/[\'\"]?\);\s*$//;
341 } elsif ( $tmp =~ /^\s*[\'\"]listing[\'\"]/i ) {
342 $tmp =~ s/^\s*[\'\"]listing[\'\"]\s*=>\s*[\'\"]?//i;
343 $tmp =~ s/[\'\"]?,?\s*$//;
344 $tmp =~ s/[\'\"]?\);\s*$//;
346 } elsif ( $tmp =~ /^\s*[\'\"]writeable[\'\"]/i ) {
347 $tmp =~ s/^\s*[\'\"]writeable[\'\"]\s*=>\s*[\'\"]?//i;
348 $tmp =~ s/[\'\"]?,?\s*$//;
349 $tmp =~ s/[\'\"]?\);\s*$//;
351 } elsif ( $tmp =~ /^\s*[\'\"]search_tree[\'\"]/i ) {
352 $tmp =~ s/^\s*[\'\"]search_tree[\'\"]\s*=>\s*[\'\"]?//i;
353 $tmp =~ s/[\'\"]?,?\s*$//;
354 $tmp =~ s/[\'\"]?\);\s*$//;
356 } elsif ( $tmp =~ /^\s*[\'\"]starttls[\'\"]/i ) {
357 $tmp =~ s/^\s*[\'\"]starttls[\'\"]\s*=>\s*[\'\"]?//i;
358 $tmp =~ s/[\'\"]?,?\s*$//;
359 $tmp =~ s/[\'\"]?\);\s*$//;
363 $ldap_host[$sub] = $host;
364 $ldap_base[$sub] = $base;
365 $ldap_name[$sub] = $name;
366 $ldap_port[$sub] = $port;
367 $ldap_maxrows[$sub] = $maxrows;
368 $ldap_filter[$sub] = $filter;
369 $ldap_charset[$sub] = $charset;
370 $ldap_binddn[$sub] = $binddn;
371 $ldap_bindpw[$sub] = $bindpw;
372 $ldap_protocol[$sub] = $protocol;
373 $ldap_limit_scope[$sub] = $limit_scope;
374 $ldap_listing[$sub] = $listing;
375 $ldap_writeable[$sub] = $writeable;
376 $ldap_search_tree[$sub] = $search_tree;
377 $ldap_starttls[$sub] = $starttls;
378 } elsif ( $options[0] =~ /^(data_dir|attachment_dir|org_logo|signout_page|icon_theme_def)$/ ) {
379 ${ $options[0] } = &change_to_rel_path
($options[1]);
381 ${ $options[0] } = $options[1];
387 # RPC template sets aren't included in user interface skin list,
388 # so add the one from the config file here
390 if ($rpc_templateset =~ /_rpc$/) {
391 $templateset_name[$#templateset_name + 1] = $rpc_templateset;
392 $templateset_id[$#templateset_id + 1] = $rpc_templateset;
395 # FIXME: unknown introduction date
396 $useSendmail = 'false' if ( lc($useSendmail) ne 'true' );
397 $sendmail_path = "/usr/sbin/sendmail" if ( !$sendmail_path );
398 $pop_before_smtp = 'false' if ( !$pop_before_smtp );
399 $pop_before_smtp_host = '' if ( !$pop_before_smtp_host );
400 $default_unseen_notify = 2 if ( !$default_unseen_notify );
401 $default_unseen_type = 1 if ( !$default_unseen_type );
402 $config_use_color = 0 if ( !$config_use_color );
403 $invert_time = 'false' if ( !$invert_time );
404 $force_username_lowercase = 'false' if ( !$force_username_lowercase );
405 $optional_delimiter = "detect" if ( !$optional_delimiter );
406 $auto_create_special = 'false' if ( !$auto_create_special );
407 $default_use_priority = 'true' if ( !$default_use_priority );
408 $default_use_mdn = 'true' if ( !$default_use_mdn );
409 $delete_folder = 'false' if ( !$delete_folder );
410 $noselect_fix_enable = 'false' if ( !$noselect_fix_enable );
411 $frame_top = "_top" if ( !$frame_top );
412 $provider_uri = '' if ( !$provider_uri );
413 $provider_name = '' if ( !$provider_name || $provider_name eq 'SquirrelMail');
414 $no_list_for_subscribe = 'false' if ( !$no_list_for_subscribe );
415 $allow_charset_search = 'true' if ( !$allow_charset_search );
416 $allow_advanced_search = 0 if ( !$allow_advanced_search) ;
417 $prefs_user_field = 'user' if ( !$prefs_user_field );
418 $prefs_key_field = 'prefkey' if ( !$prefs_key_field );
419 $prefs_val_field = 'prefval' if ( !$prefs_val_field );
420 $session_name = 'SQMSESSID' if ( !$session_name );
421 $skip_SM_header = 'false' if ( !$skip_SM_header );
422 $default_use_javascript_addr_book = 'false' if (! $default_use_javascript_addr_book);
425 $hide_sm_attributions = 'false' if ( !$hide_sm_attributions );
427 $edit_identity = 'true' if ( !$edit_identity );
428 $edit_name = 'true' if ( !$edit_name );
430 $edit_reply_to = 'true' if ( !$edit_reply_to );
433 $use_smtp_tls= 'false' if ( !$use_smtp_tls);
434 $smtp_auth_mech = 'none' if ( !$smtp_auth_mech );
435 $use_imap_tls = 'false' if ( !$use_imap_tls );
436 $imap_auth_mech = 'login' if ( !$imap_auth_mech );
438 # $use_imap_tls and $use_smtp_tls are switched to integer since 1.5.1
439 $use_imap_tls = 0 if ( $use_imap_tls eq 'false');
440 $use_imap_tls = 1 if ( $use_imap_tls eq 'true');
441 $use_smtp_tls = 0 if ( $use_smtp_tls eq 'false');
442 $use_smtp_tls = 1 if ( $use_smtp_tls eq 'true');
445 $show_alternative_names = 'false' if ( !$show_alternative_names );
446 # $available_languages option available only in 1.5.0. removed due to $languages
447 # implementation changes. options are provided by limit_languages plugin
448 # $available_languages = 'all' if ( !$available_languages );
449 $aggressive_decoding = 'false' if ( !$aggressive_decoding );
450 # available only in 1.5.0 and 1.5.1
451 # $advanced_tree = 'false' if ( !$advanced_tree );
452 $use_php_recode = 'false' if ( !$use_php_recode );
453 $use_php_iconv = 'false' if ( !$use_php_iconv );
454 $buffer_output = 'false' if ( !$buffer_output );
457 $use_icons = 'false' if ( !$use_icons );
458 $use_iframe = 'false' if ( !$use_iframe );
459 $lossy_encoding = 'false' if ( !$lossy_encoding );
460 $allow_remote_configtest = 'false' if ( !$allow_remote_configtest );
461 $secured_config = 'true' if ( !$secured_config );
462 $sq_https_port = 443 if ( !$sq_https_port );
463 $sq_ignore_http_x_forwarded_headers = 'true' if ( !$sq_ignore_http_x_forwarded_headers );
465 $sm_debug_mode = 'SM_DEBUG_MODE_MODERATE' if ( !$sm_debug_mode );
466 #FIXME: When this is STABLE software, remove the line above and uncomment the one below:
467 #$sm_debug_mode = 'SM_DEBUG_MODE_OFF' if ( !$sm_debug_mode );
468 $sm_debug_mode = convert_debug_binary_integer_to_constants
($sm_debug_mode);
470 $addrbook_global_table = 'global_abook' if ( !$addrbook_global_table );
471 $addrbook_global_writeable = 'false' if ( !$addrbook_global_writeable );
472 $addrbook_global_listing = 'false' if ( !$addrbook_global_listing );
473 $abook_global_file = '' if ( !$abook_global_file);
474 $abook_global_file_writeable = 'false' if ( !$abook_global_file_writeable);
475 $abook_global_file_listing = 'true' if ( !$abook_global_file_listing );
476 $encode_header_key = '' if ( !$encode_header_key );
477 $hide_auth_header = 'false' if ( !$hide_auth_header );
478 $time_zone_type = '0' if ( !$time_zone_type );
479 $prefs_user_size = 128 if ( !$prefs_user_size );
480 $prefs_key_size = 64 if ( !$prefs_key_size );
481 $prefs_val_size = 65536 if ( !$prefs_val_size );
483 # add qmail-inject test here for backwards compatibility
484 if ( !$sendmail_args && $sendmail_path =~ /qmail-inject/ ) {
486 } elsif ( !$sendmail_args ) {
487 $sendmail_args = '-i -t';
490 $default_fontsize = '' if ( !$default_fontsize);
491 $default_fontset = '' if ( !$default_fontset);
493 %fontsets = ('serif', 'serif',
494 'sans', 'helvetica,arial,sans-serif',
495 'comicsans', 'comic sans ms,sans-serif',
496 'tahoma', 'tahoma,sans-serif',
497 'verasans', 'bitstream vera sans,verdana,sans-serif');
500 # sorting options changed names and reversed values in 1.5.1
501 $disable_thread_sort = 'false' if ( !$disable_thread_sort );
502 $disable_server_sort = 'false' if ( !$disable_server_sort );
505 $abook_file_line_length = 2048 if ( !$abook_file_line_length );
506 $config_location_base = '' if ( !$config_location_base );
507 $smtp_sitewide_user = '' if ( !$smtp_sitewide_user );
508 $smtp_sitewide_pass = '' if ( !$smtp_sitewide_pass );
509 $icon_theme_def = '' if ( !$icon_theme_def );
510 $disable_plugins = 'false' if ( !$disable_plugins );
511 $disable_plugins_user = '' if ( !$disable_plugins_user );
512 $only_secure_cookies = 'true' if ( !$only_secure_cookies );
513 $disable_security_tokens = 'false' if ( !$disable_security_tokens );
514 $check_referrer = '' if ( !$check_referrer );
515 $ask_user_info = 'true' if ( !$ask_user_info );
516 $use_transparent_security_image = 'true' if ( !$use_transparent_security_image );
517 $display_imap_login_error = 'false' if ( !$display_imap_login_error );
519 if ( $ARGV[0] eq '--install-plugin' ) {
520 print "Activating plugin " . $ARGV[1] . "\n";
521 if ( -d
"../plugins/" . $ARGV[1]) {
522 push @plugins, $ARGV[1];
526 print "No such plugin.\n";
529 } elsif ( $ARGV[0] eq '--remove-plugin' ) {
530 print "Removing plugin " . $ARGV[1] . "\n";
531 foreach $plugin (@plugins) {
532 if ( $plugin ne $ARGV[1] ) {
533 push @newplugins, $plugin;
536 @plugins = @newplugins;
539 } elsif ( $ARGV[0] eq '--update-plugins' or $ARGV[0] eq '-u') {
540 build_plugin_hook_array
();
542 } elsif ( $ARGV[0] eq '--help' or $ARGV[0] eq '-h') {
543 print "SquirrelMail Configuration Script\n";
545 print " * No arguments: initiates the configuration dialog\n";
546 print " * --install-plugin <plugin> : activates the specified plugin\n";
547 print " * --remove-plugin <plugin> : deactivates the specified plugin\n";
548 print " * --update-plugins , -u : rebuilds plugin_hooks.php according\n";
549 print " to plugins activated in config.php\n";
550 print " * --help , -h : Displays this help\n";
557 ####################################################################################
559 # used in multiple places, define once
560 $list_supported_imap_servers =
561 " bincimap = Binc IMAP server\n" .
562 " courier = Courier IMAP server\n" .
563 " cyrus = Cyrus IMAP server\n" .
564 " dovecot = Dovecot Secure IMAP server\n" .
565 " exchange = Microsoft Exchange IMAP server\n" .
566 " hmailserver = hMailServer\n" .
567 " macosx = Mac OS X Mailserver\n" .
568 " mercury32 = Mercury/32\n" .
569 " uw = University of Washington's IMAP server\n" .
570 " gmail = IMAP access to Google mail (Gmail) accounts\n";
572 #####################################################################################
573 if ( $config_use_color == 1 ) {
579 $config_use_color = 2;
582 # lists can be printed in more than one column; default is just one
586 # try to get screen width dynamically if possible; default to 80
587 # (user can override with "w#" command)
589 eval { require "sys/ioctl.ph" };
591 || !defined &TIOCGWINSZ
592 || !open(TTY
, "+</dev/tty")
593 || !ioctl(TTY
, &TIOCGWINSZ
, $winsize='')) {
596 ($row, $col, $xpixel, $ypixel) = unpack('S4', $winsize);
597 $screen_width = $col;
600 while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
602 print $WHT. "SquirrelMail Configuration : " . $NRM;
603 if ( $config == 1 ) { print "Read: config.php"; }
604 elsif ( $config == 2 ) { print "Read: config_default.php"; }
605 print "\nConfig version $print_config_version; SquirrelMail version $sm_version\n";
606 print "---------------------------------------------------------\n";
609 print $WHT. "Main Menu --\n" . $NRM;
610 print "1. Organization Preferences\n";
611 print "2. Server Settings\n";
612 print "3. Folder Defaults\n";
613 print "4. General Options\n";
614 print "5. User Interface\n";
615 print "6. Address Books\n";
616 print "7. Message of the Day (MOTD)\n";
617 print "8. Plugins\n";
618 print "9. Database\n";
619 print "10. Language settings\n";
620 print "11. Tweaks\n";
622 print "D. Set pre-defined settings for specific IMAP servers\n";
624 } elsif ( $menu == 1 ) {
625 print $WHT. "Organization Preferences\n" . $NRM;
626 print "1. Organization Name : $WHT$org_name$NRM\n";
627 print "2. Organization Logo : $WHT$org_logo$NRM\n";
628 print "3. Org. Logo Width/Height : $WHT($org_logo_width/$org_logo_height)$NRM\n";
629 print "4. Organization Title : $WHT$org_title$NRM\n";
630 print "5. Signout Page : $WHT$signout_page$NRM\n";
631 print "6. Top Frame : $WHT$frame_top$NRM\n";
632 print "7. Provider link : $WHT$provider_uri$NRM\n";
633 print "8. Provider link text : $WHT$provider_name$NRM\n";
636 print "R Return to Main Menu\n";
637 } elsif ( $menu == 2 ) {
638 print $WHT. "Server Settings\n\n" . $NRM;
639 print $WHT . "General" . $NRM . "\n";
641 print "1. Domain : $WHT$domain$NRM\n";
642 print "2. Invert Time : $WHT$invert_time$NRM\n";
643 print "3. Sendmail or SMTP : $WHT";
644 if ( lc($useSendmail) eq 'true' ) {
652 if ( $show_imap_settings ) {
653 print $WHT . "IMAP Settings". $NRM . "\n--------------\n";
654 print "4. IMAP Server : $WHT$imapServerAddress$NRM\n";
655 print "5. IMAP Port : $WHT$imapPort$NRM\n";
656 print "6. Authentication type : $WHT$imap_auth_mech$NRM\n";
657 print "7. Secure IMAP (TLS) : $WHT" . display_use_tls
($use_imap_tls) . "$NRM\n";
658 print "8. Server software : $WHT$imap_server_type$NRM\n";
659 print "9. Delimiter : $WHT$optional_delimiter$NRM\n";
661 } elsif ( $show_smtp_settings ) {
662 if ( lc($useSendmail) eq 'true' ) {
663 print $WHT . "Sendmail" . $NRM . "\n--------\n";
664 print "4. Sendmail Path : $WHT$sendmail_path$NRM\n";
665 print "5. Sendmail arguments : $WHT$sendmail_args$NRM\n";
666 print "6. Header encryption key : $WHT$encode_header_key$NRM\n";
669 print $WHT . "SMTP Settings" . $NRM . "\n-------------\n";
670 print "4. SMTP Server : $WHT$smtpServerAddress$NRM\n";
671 print "5. SMTP Port : $WHT$smtpPort$NRM\n";
672 print "6. POP before SMTP : $WHT$pop_before_smtp$NRM\n";
673 print "7. SMTP Authentication : $WHT$smtp_auth_mech" . display_smtp_sitewide_userpass
() ."$NRM\n";
674 print "8. Secure SMTP (TLS) : $WHT" . display_use_tls
($use_smtp_tls) . "$NRM\n";
675 print "9. Header encryption key : $WHT$encode_header_key$NRM\n";
680 if ($show_imap_settings == 0) {
681 print "A. Update IMAP Settings : ";
682 print "$WHT$imapServerAddress$NRM:";
683 print "$WHT$imapPort$NRM ";
684 print "($WHT$imap_server_type$NRM)\n";
686 if ($show_smtp_settings == 0) {
687 if ( lc($useSendmail) eq 'true' ) {
688 print "B. Change Sendmail Config : $WHT$sendmail_path$NRM\n";
690 print "B. Update SMTP Settings : ";
691 print "$WHT$smtpServerAddress$NRM:";
692 print "$WHT$smtpPort$NRM\n";
695 if ( $show_smtp_settings || $show_imap_settings )
698 ($show_imap_settings ?
"IMAP Server" :
699 (lc($useSendmail) eq 'true') ?
"Sendmail" : "SMTP") . " Settings\n";
703 print "R Return to Main Menu\n";
704 } elsif ( $menu == 3 ) {
705 print $WHT. "Folder Defaults\n" . $NRM;
706 print "1. Default Folder Prefix : $WHT$default_folder_prefix$NRM\n";
707 print "2. Show Folder Prefix Option : $WHT$show_prefix_option$NRM\n";
708 print "3. Trash Folder : $WHT$trash_folder$NRM\n";
709 print "4. Sent Folder : $WHT$sent_folder$NRM\n";
710 print "5. Drafts Folder : $WHT$draft_folder$NRM\n";
711 print "6. By default, move to trash : $WHT$default_move_to_trash$NRM\n";
712 print "7. By default, save sent messages : $WHT$default_move_to_sent$NRM\n";
713 print "8. By default, save as draft : $WHT$default_save_as_draft$NRM\n";
714 print "9. List Special Folders First : $WHT$list_special_folders_first$NRM\n";
715 print "10. Show Special Folders Color : $WHT$use_special_folder_color$NRM\n";
716 print "11. Auto Expunge : $WHT$auto_expunge$NRM\n";
717 print "12. Default Sub. of INBOX : $WHT$default_sub_of_inbox$NRM\n";
718 print "13. Show 'Contain Sub.' Option : $WHT$show_contain_subfolders_option$NRM\n";
719 print "14. Default Unseen Notify : $WHT$default_unseen_notify$NRM\n";
720 print "15. Default Unseen Type : $WHT$default_unseen_type$NRM\n";
721 print "16. Auto Create Special Folders : $WHT$auto_create_special$NRM\n";
722 print "17. Folder Delete Bypasses Trash : $WHT$delete_folder$NRM\n";
723 print "18. Enable /NoSelect folder fix : $WHT$noselect_fix_enable$NRM\n";
725 print "R Return to Main Menu\n";
726 } elsif ( $menu == 4 ) {
727 print $WHT. "General Options\n" . $NRM;
728 print "1. Data Directory : $WHT$data_dir$NRM\n";
729 print "2. Attachment Directory : $WHT$attachment_dir$NRM\n";
730 print "3. Directory Hash Level : $WHT$dir_hash_level$NRM\n";
731 print "4. Default Left Size : $WHT$default_left_size$NRM\n";
732 print "5. Usernames in Lowercase : $WHT$force_username_lowercase$NRM\n";
733 print "6. Allow use of priority : $WHT$default_use_priority$NRM\n";
734 print "7. Hide SM attributions : $WHT$hide_sm_attributions$NRM\n";
735 print "8. Allow use of receipts : $WHT$default_use_mdn$NRM\n";
736 print "9. Allow editing of identity : $WHT$edit_identity$NRM\n";
737 print " Allow editing of name : $WHT$edit_name$NRM\n";
738 print " Allow editing of reply-to : $WHT$edit_reply_to$NRM\n";
739 print " Remove username from header : $WHT$hide_auth_header$NRM\n";
740 print "10. Disable server thread sort : $WHT$disable_thread_sort$NRM\n";
741 print "11. Disable server-side sorting : $WHT$disable_server_sort$NRM\n";
742 print "12. Allow server charset search : $WHT$allow_charset_search$NRM\n";
743 print "13. Allow advanced search : $WHT$allow_advanced_search$NRM\n";
744 print "14. PHP session name : $WHT$session_name$NRM\n";
745 print "15. Time zone configuration : $WHT$time_zone_type$NRM\n";
746 print "16. Location base : $WHT$config_location_base$NRM\n";
747 print "17. Only secure cookies if poss. : $WHT$only_secure_cookies$NRM\n";
748 print "18. Disable secure forms : $WHT$disable_security_tokens$NRM\n";
749 print "19. Page referal requirement : $WHT$check_referrer$NRM\n";
750 print "20. Security image : $WHT" . (lc($use_transparent_security_image) eq 'true' ?
'Transparent' : 'Textual') . "$NRM\n";
751 print "21. Display login error from IMAP: $WHT$display_imap_login_error$NRM\n";
753 print "R Return to Main Menu\n";
754 } elsif ( $menu == 5 ) {
755 print $WHT. "User Interface\n" . $NRM;
756 print "1. Use Icons? : $WHT$use_icons$NRM\n";
757 # print "3. Default Icon Set : $WHT$icon_theme_def$NRM\n";
758 print "2. Default font size : $WHT$default_fontsize$NRM\n";
759 print "3. Manage template sets (skins)\n";
760 print "4. Manage user themes\n";
761 print "5. Manage font sets\n";
762 print "6. Manage icon themes\n";
765 print "R Return to Main Menu\n";
766 } elsif ( $menu == 6 ) {
767 print $WHT. "Address Books\n" . $NRM;
768 print "1. Change LDAP Servers\n";
769 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
770 print " > $ldap_host[$count]\n";
772 print "2. Use Javascript address book search : $WHT$default_use_javascript_addr_book$NRM\n";
773 print "3. Global address book file : $WHT$abook_global_file$NRM\n";
774 print "4. Allow writing into global file address book : $WHT$abook_global_file_writeable$NRM\n";
775 print "5. Allow listing of global file address book : $WHT$abook_global_file_listing$NRM\n";
776 print "6. Allowed address book line length : $WHT$abook_file_line_length$NRM\n";
778 print "R Return to Main Menu\n";
779 } elsif ( $menu == 7 ) {
780 print $WHT. "Message of the Day (MOTD)\n" . $NRM;
783 print "1 Edit the MOTD\n";
785 print "R Return to Main Menu\n";
786 } elsif ( $menu == 8 ) {
787 if (lc($disable_plugins) eq 'true' && $disable_plugins_user ne '') {
788 print $WHT. "Plugins (WARNING: All plugins are currently disabled\n for the user \"$disable_plugins_user\"!)\n" . $NRM;
789 } elsif (lc($disable_plugins) eq 'true') {
790 print $WHT. "Plugins (WARNING: All plugins are currently disabled!)\n" . $NRM;
792 print $WHT. "Plugins\n" . $NRM;
794 print " Installed Plugins\n";
796 $num = print_multi_col_list
(1, $columns, $screen_width, 1, @plugins);
799 for ( $count = 0 ; $count <= $#plugins ; $count++ ) {
801 $english_name = get_plugin_english_name
($plugins[$count]);
802 if ( $english_name eq "" ) {
803 print " $WHT$num.$NRM $plugins[$count]" . get_plugin_version
($plugins[$count]) . "\n";
805 print " $WHT$num.$NRM $english_name ($plugins[$count])" . get_plugin_version
($plugins[$count]) . "\n";
809 print "\n Available Plugins:\n";
810 opendir( DIR
, "../plugins" );
811 @files = sort(readdir(DIR
));
813 @unused_plugins = ();
814 for ( $i = 0 ; $i <= $#files ; $i++ ) {
815 if ( -d
"../plugins/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne ".svn" ) {
817 for ( $k = 0 ; $k <= $#plugins ; $k++ ) {
818 if ( $plugins[$k] eq $files[$i] ) {
823 $unused_plugins[$pos] = $files[$i];
830 $num = print_multi_col_list
($num + 1, $columns, $screen_width, 1, @unused_plugins);
832 for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
834 $english_name = get_plugin_english_name
($unused_plugins[$i]);
835 if ( $english_name eq "" ) {
836 print " $WHT$num.$NRM $unused_plugins[$i]" . get_plugin_version
($unused_plugins[$i]) . "\n";
838 print " $WHT$num.$NRM $english_name ($unused_plugins[$i])" . get_plugin_version
($unused_plugins[$i]) . "\n";
845 if (lc($disable_plugins) eq 'true' && $disable_plugins_user ne '') {
846 print "E Enable active plugins (all plugins currently\n disabled for the user \"$disable_plugins_user\")\n";
847 } elsif (lc($disable_plugins) eq 'true') {
848 print "E Enable active plugins (all plugins currently\n disabled)\n";
850 print "D Disable all plugins\n";
852 print "U Set the user for whom plugins can be disabled\n";
853 print "R Return to Main Menu\n";
854 print "C# List plugins in <#> number of columns\n";
855 print "W# Change screen width to <#> (currently $screen_width)\n";
856 } elsif ( $menu == 9 ) {
857 print $WHT. "Database\n" . $NRM;
858 print "1. DSN for Address Book : $WHT$addrbook_dsn$NRM\n";
859 print "2. Table for Address Book : $WHT$addrbook_table$NRM\n";
861 print "3. DSN for Preferences : $WHT$prefs_dsn$NRM\n";
862 print "4. Table for Preferences : $WHT$prefs_table$NRM\n";
863 print "5. Field for username : $WHT$prefs_user_field$NRM ($prefs_user_size)\n";
864 print "6. Field for prefs key : $WHT$prefs_key_field$NRM ($prefs_key_size)\n";
865 print "7. Field for prefs value : $WHT$prefs_val_field$NRM ($prefs_val_size)\n";
867 print "8. DSN for Global Address Book : $WHT$addrbook_global_dsn$NRM\n";
868 print "9. Table for Global Address Book : $WHT$addrbook_global_table$NRM\n";
869 print "10. Allow writing into Global Address Book : $WHT$addrbook_global_writeable$NRM\n";
870 print "11. Allow listing of Global Address Book : $WHT$addrbook_global_listing$NRM\n";
872 print "R Return to Main Menu\n";
873 } elsif ( $menu == 10 ) {
874 print $WHT. "Language settings\n" . $NRM;
875 print "1. Default Language : $WHT$squirrelmail_default_language$NRM\n";
876 print "2. Default Charset : $WHT$default_charset$NRM\n";
877 print "3. Show alternative language names : $WHT$show_alternative_names$NRM\n";
878 print "4. Enable aggressive decoding : $WHT$aggressive_decoding$NRM\n";
879 print "5. Enable lossy encoding : $WHT$lossy_encoding$NRM\n";
881 print "R Return to Main Menu\n";
882 } elsif ( $menu == 11 ) {
883 print $WHT. "Interface tweaks\n" . $NRM;
884 print "1. Display html mails in iframe : $WHT$use_iframe$NRM\n";
885 print "2. Ask user info on first login : $WHT$ask_user_info$NRM\n";
887 print $WHT. "PHP tweaks\n" . $NRM;
888 print "4. Use php recode functions : $WHT$use_php_recode$NRM\n";
889 print "5. Use php iconv functions : $WHT$use_php_iconv$NRM\n";
890 print "6. Buffer all output : $WHT$buffer_output$NRM\n";
892 print $WHT. "Configuration tweaks\n" . $NRM;
893 print "7. Allow remote configtest : $WHT$allow_remote_configtest$NRM\n";
894 print "8. Debug mode : $WHT$sm_debug_mode$NRM\n";
895 print "9. Secured configuration mode : $WHT$secured_config$NRM\n";
896 print "10. HTTPS port : $WHT$sq_https_port$NRM\n";
897 print "11. Ignore HTTP_X_FORWARDED headers: $WHT$sq_ignore_http_x_forwarded_headers$NRM\n";
899 print "R Return to Main Menu\n";
901 if ( $config_use_color == 1 ) {
902 print "C Turn color off\n";
904 print "C Turn color on\n";
906 print "S Save data\n";
910 print "Command >> " . $WHT;
912 $command =~ s/[\n\r]//g;
913 $command =~ tr/A-Z/a-z/;
916 # Read the commands they entered.
917 if ( $command eq "r" ) {
919 } elsif ( $command eq "s" ) {
921 print "Press enter to continue...";
924 } elsif ( ( $command eq "q" ) && ( $saved == 0 ) ) {
925 print "You have not saved your data.\n";
926 print "Save? [" . $WHT . "Y" . $NRM . "/n]: ";
928 if ( ( $save =~ /^y/i ) || ( $save =~ /^\s*$/ ) ) {
931 } elsif ( $command eq "c" ) {
932 if ( $config_use_color == 1 ) {
933 $config_use_color = 2;
937 $config_use_color = 1;
941 } elsif ( $command =~ /^w([0-9]+)/ ) {
943 } elsif ( $command eq "d" && $menu == 0 ) {
948 if ( ( $command > 0 ) && ( $command < 12 ) ) {
951 } elsif ( $menu == 1 ) {
952 if ( $command == 1 ) { $org_name = command1
(); }
953 elsif ( $command == 2 ) { $org_logo = command2
(); }
954 elsif ( $command == 3 ) { ($org_logo_width,$org_logo_height) = command2a
(); }
955 elsif ( $command == 4 ) { $org_title = command3
(); }
956 elsif ( $command == 5 ) { $signout_page = command4
(); }
957 elsif ( $command == 6 ) { $frame_top = command6
(); }
958 elsif ( $command == 7 ) { $provider_uri = command7
(); }
959 elsif ( $command == 8 ) { $provider_name = command8
(); }
961 } elsif ( $menu == 2 ) {
962 if ( $command eq "a" ) { $show_imap_settings = 1; $show_smtp_settings = 0; }
963 elsif ( $command eq "b" ) { $show_imap_settings = 0; $show_smtp_settings = 1; }
964 elsif ( $command eq "h" ) { $show_imap_settings = 0; $show_smtp_settings = 0; }
965 elsif ( $command <= 3 ) {
966 if ( $command == 1 ) { $domain = command11
(); }
967 elsif ( $command == 2 ) { $invert_time = command110
(); }
968 elsif ( $command == 3 ) { $useSendmail = command14
(); }
969 $show_imap_settings = 0; $show_smtp_settings = 0;
970 } elsif ( $show_imap_settings ) {
971 if ( $command == 4 ) { $imapServerAddress = command12
(); }
972 elsif ( $command == 5 ) { $imapPort = command13
(); }
973 elsif ( $command == 6 ) { $imap_auth_mech = command112a
(); }
974 elsif ( $command == 7 ) { $use_imap_tls = command_use_tls
("IMAP",$use_imap_tls); }
975 elsif ( $command == 8 ) { $imap_server_type = command19
(); }
976 elsif ( $command == 9 ) { $optional_delimiter = command111
(); }
977 } elsif ( $show_smtp_settings && lc($useSendmail) eq 'true' ) {
978 if ( $command == 4 ) { $sendmail_path = command15
(); }
979 elsif ( $command == 5 ) { $sendmail_args = command_sendmail_args
(); }
980 elsif ( $command == 6 ) { $encode_header_key = command114
(); }
981 } elsif ( $show_smtp_settings ) {
982 if ( $command == 4 ) { $smtpServerAddress = command16
(); }
983 elsif ( $command == 5 ) { $smtpPort = command17
(); }
984 elsif ( $command == 6 ) { $pop_before_smtp = command18a
(); }
985 elsif ( $command == 7 ) { $smtp_auth_mech = command112b
(); }
986 elsif ( $command == 8 ) { $use_smtp_tls = command_use_tls
("SMTP",$use_smtp_tls); }
987 elsif ( $command == 9 ) { $encode_header_key = command114
(); }
989 } elsif ( $menu == 3 ) {
990 if ( $command == 1 ) { $default_folder_prefix = command21
(); }
991 elsif ( $command == 2 ) { $show_prefix_option = command22
(); }
992 elsif ( $command == 3 ) { $trash_folder = command23a
(); }
993 elsif ( $command == 4 ) { $sent_folder = command23b
(); }
994 elsif ( $command == 5 ) { $draft_folder = command23c
(); }
995 elsif ( $command == 6 ) { $default_move_to_trash = command24a
(); }
996 elsif ( $command == 7 ) { $default_move_to_sent = command24b
(); }
997 elsif ( $command == 8 ) { $default_save_as_draft = command24c
(); }
998 elsif ( $command == 9 ) { $list_special_folders_first = command27
(); }
999 elsif ( $command == 10 ) { $use_special_folder_color = command28
(); }
1000 elsif ( $command == 11 ) { $auto_expunge = command29
(); }
1001 elsif ( $command == 12 ) { $default_sub_of_inbox = command210
(); }
1002 elsif ( $command == 13 ) { $show_contain_subfolders_option = command211
(); }
1003 elsif ( $command == 14 ) { $default_unseen_notify = command212
(); }
1004 elsif ( $command == 15 ) { $default_unseen_type = command213
(); }
1005 elsif ( $command == 16 ) { $auto_create_special = command214
(); }
1006 elsif ( $command == 17 ) { $delete_folder = command215
(); }
1007 elsif ( $command == 18 ) { $noselect_fix_enable = command216
(); }
1008 } elsif ( $menu == 4 ) {
1009 if ( $command == 1 ) { $data_dir = command33a
(); }
1010 elsif ( $command == 2 ) { $attachment_dir = command33b
(); }
1011 elsif ( $command == 3 ) { $dir_hash_level = command33c
(); }
1012 elsif ( $command == 4 ) { $default_left_size = command35
(); }
1013 elsif ( $command == 5 ) { $force_username_lowercase = command36
(); }
1014 elsif ( $command == 6 ) { $default_use_priority = command37
(); }
1015 elsif ( $command == 7 ) { $hide_sm_attributions = command38
(); }
1016 elsif ( $command == 8 ) { $default_use_mdn = command39
(); }
1017 elsif ( $command == 9 ) { $edit_identity = command310
(); }
1018 elsif ( $command == 10 ) { $disable_thread_sort = command312
(); }
1019 elsif ( $command == 11 ) { $disable_server_sort = command313
(); }
1020 elsif ( $command == 12 ) { $allow_charset_search = command314
(); }
1021 elsif ( $command == 13 ) { $allow_advanced_search = command316
(); }
1022 elsif ( $command == 14 ) { $session_name = command317
(); }
1023 elsif ( $command == 15 ) { $time_zone_type = command318
(); }
1024 elsif ( $command == 16 ) { $config_location_base = command_config_location_base
(); }
1025 elsif ( $command == 17 ) { $only_secure_cookies = command319
(); }
1026 elsif ( $command == 18 ) { $disable_security_tokens = command320
(); }
1027 elsif ( $command == 19 ) { $check_referrer = command321
(); }
1028 elsif ( $command == 20 ) { $use_transparent_security_image = command322
(); }
1029 elsif ( $command == 21 ) { $display_imap_login_error = command323
(); }
1030 } elsif ( $menu == 5 ) {
1031 if ( $command == 1 ) { $use_icons = commandB3
(); }
1032 # elsif ( $command == 3 ) { $icon_theme_def = command53(); }
1033 elsif ( $command == 2 ) { $default_fontsize = command_default_fontsize
(); }
1034 elsif ( $command == 3 ) { $templateset_default = command_templates
(); }
1035 elsif ( $command == 4 ) { command_userThemes
(); }
1036 elsif ( $command == 5 ) { command_fontsets
(); }
1037 elsif ( $command == 6 ) { command_iconSets
(); }
1038 } elsif ( $menu == 6 ) {
1039 if ( $command == 1 ) { command61
(); }
1040 elsif ( $command == 2 ) { command62
(); }
1041 elsif ( $command == 3 ) { $abook_global_file=command63
(); }
1042 elsif ( $command == 4 ) { command64
(); }
1043 elsif ( $command == 5 ) { command65
(); }
1044 elsif ( $command == 6 ) { command_abook_file_line_length
(); }
1045 } elsif ( $menu == 7 ) {
1046 if ( $command == 1 ) { $motd = command71
(); }
1047 } elsif ( $menu == 8 ) {
1048 if ( $command =~ /^[0-9]+/ ) { @plugins = command81
(); }
1049 elsif ( $command eq "u" ) { $disable_plugins_user = command82
(); }
1050 elsif ( $command eq "d" ) { $disable_plugins = 'true'; }
1051 elsif ( $command eq "e" ) { $disable_plugins = 'false'; }
1052 elsif ( $command =~ /^c([0-9]+)/ ) { $columns = $1; }
1053 } elsif ( $menu == 9 ) {
1054 if ( $command == 1 ) { $addrbook_dsn = command91
(); }
1055 elsif ( $command == 2 ) { $addrbook_table = command92
(); }
1056 elsif ( $command == 3 ) { $prefs_dsn = command93
(); }
1057 elsif ( $command == 4 ) { $prefs_table = command94
(); }
1058 elsif ( $command == 5 ) { $prefs_user_field = command95
(); }
1059 elsif ( $command == 6 ) { $prefs_key_field = command96
(); }
1060 elsif ( $command == 7 ) { $prefs_val_field = command97
(); }
1061 elsif ( $command == 8 ) { $addrbook_global_dsn = command98
(); }
1062 elsif ( $command == 9 ) { $addrbook_global_table = command99
(); }
1063 elsif ( $command == 10 ) { $addrbook_global_writeable = command910
(); }
1064 elsif ( $command == 11 ) { $addrbook_global_listing = command911
(); }
1065 } elsif ( $menu == 10 ) {
1066 if ( $command == 1 ) { $squirrelmail_default_language = commandA1
(); }
1067 elsif ( $command == 2 ) { $default_charset = commandA2
(); }
1068 elsif ( $command == 3 ) { $show_alternative_names = commandA3
(); }
1069 elsif ( $command == 4 ) { $aggressive_decoding = commandA4
(); }
1070 elsif ( $command == 5 ) { $lossy_encoding = commandA5
(); }
1071 } elsif ( $menu == 11 ) {
1072 if ( $command == 1 ) { $use_iframe = commandB2
(); }
1073 elsif ( $command == 2 ) { $ask_user_info = command_ask_user_info
(); }
1074 elsif ( $command == 4 ) { $use_php_recode = commandB4
(); }
1075 elsif ( $command == 5 ) { $use_php_iconv = commandB5
(); }
1076 elsif ( $command == 6 ) { $buffer_output = commandB6
(); }
1077 elsif ( $command == 7 ) { $allow_remote_configtest = commandB7
(); }
1078 elsif ( $command == 8 ) { $sm_debug_mode = commandB8
(); }
1079 elsif ( $command == 9 ) { $secured_config = commandB9
(); }
1080 elsif ( $command == 10 ) { $sq_https_port = commandB10
(); }
1081 elsif ( $command == 11 ) { $sq_ignore_http_x_forwarded_headers = commandB11
(); }
1087 print "\nExiting conf.pl.\n".
1088 "You might want to test your configuration by browsing to\n".
1089 "http://your-squirrelmail-location/src/configtest.php\n".
1090 "Happy SquirrelMailing!\n\n";
1093 ####################################################################################
1097 print "We have tried to make the name SquirrelMail as transparent as\n";
1098 print "possible. If you set up an organization name, most places where\n";
1099 print "SquirrelMail would take credit will be credited to your organization.\n";
1101 print "If your Organization Name includes a '\$', please precede it with a \\. \n";
1102 print "Other '\$' will be considered the beginning of a variable that\n";
1103 print "must be defined before the \$org_name is printed.\n";
1105 print "[$WHT$org_name$NRM]: $WHT";
1106 $new_org_name = <STDIN
>;
1107 if ( $new_org_name eq "\n" ) {
1108 $new_org_name = $org_name;
1110 $new_org_name =~ s/[\r\n]//g;
1111 $new_org_name =~ s/\"/"/g;
1113 return $new_org_name;
1118 print "Your organization's logo is an image that will be displayed at\n";
1119 print "different times throughout SquirrelMail. ";
1121 print "Please be aware of the following: \n";
1122 print " - Relative URLs are relative to the config dir\n";
1123 print " to use the default logo, use ../images/sm_logo.png\n";
1124 print " - To specify a logo defined outside the SquirrelMail source tree\n";
1125 print " use the absolute URL the webserver would use to include the file\n";
1126 print " e.g. http://example.com/images/mylogo.gif or /images/mylogo.jpg\n";
1128 print "[$WHT$org_logo$NRM]: $WHT";
1129 $new_org_logo = <STDIN
>;
1130 if ( $new_org_logo eq "\n" ) {
1131 $new_org_logo = $org_logo;
1133 $new_org_logo =~ s/[\r\n]//g;
1135 return $new_org_logo;
1140 print "Your organization's logo is an image that will be displayed at\n";
1141 print "different times throughout SquirrelMail. Width\n";
1142 print "and Height of your logo image. Use '0' to disable.\n";
1144 print "Width: [$WHT$org_logo_width$NRM]: $WHT";
1145 $new_org_logo_width = <STDIN
>;
1146 $new_org_logo_width =~ tr/0-9//cd; # only want digits!
1147 if ( $new_org_logo_width eq '' ) {
1148 $new_org_logo_width = $org_logo_width;
1150 if ( $new_org_logo_width > 0 ) {
1151 print "Height: [$WHT$org_logo_height$NRM]: $WHT";
1152 $new_org_logo_height = <STDIN
>;
1153 $new_org_logo_height =~ tr/0-9//cd; # only want digits!
1154 if( $new_org_logo_height eq '' ) {
1155 $new_org_logo_height = $org_logo_height;
1158 $new_org_logo_height = 0;
1160 return ($new_org_logo_width, $new_org_logo_height);
1165 print "A title is what is displayed at the top of the browser window in\n";
1166 print "the titlebar. Usually this will end up looking something like:\n";
1167 print "\"Netscape: $org_title\"\n";
1169 print "If your Organization Title includes a '\$', please precede it with a \\. \n";
1170 print "Other '\$' will be considered the beginning of a variable that\n";
1171 print "must be defined before the \$org_title is printed.\n";
1173 print "[$WHT$org_title$NRM]: $WHT";
1174 $new_org_title = <STDIN
>;
1175 if ( $new_org_title eq "\n" ) {
1176 $new_org_title = $org_title;
1178 $new_org_title =~ s/[\r\n]//g;
1179 $new_org_title =~ s/\"/\'/g;
1181 return $new_org_title;
1186 print "When users click the Sign Out button they will be logged out and\n";
1187 print "then sent to signout_page. If signout_page is left empty,\n";
1188 print "(hit space and then return) they will be taken, as normal,\n";
1189 print "to the default and rather sparse SquirrelMail signout page.\n";
1191 print "[$WHT$signout_page$NRM]: $WHT";
1192 $new_signout_page = <STDIN
>;
1193 if ( $new_signout_page eq "\n" ) {
1194 $new_signout_page = $signout_page;
1196 $new_signout_page =~ s/[\r\n]//g;
1197 $new_signout_page =~ s/^\s+$//g;
1199 return $new_signout_page;
1204 print "SquirrelMail defaults to using the whole of the browser window.\n";
1205 print "This allows you to keep it within a specified frame. The default\n";
1206 print "is '_top'\n";
1208 print "[$WHT$frame_top$NRM]: $WHT";
1209 $new_frame_top = <STDIN
>;
1210 if ( $new_frame_top eq "\n" ) {
1211 $new_frame_top = '_top';
1213 $new_frame_top =~ s/[\r\n]//g;
1214 $new_frame_top =~ s/^\s+$//g;
1216 return $new_frame_top;
1219 # Default link to provider
1221 print "Here you can set the link on the top-right of the message list.\n";
1222 print "If empty, it will not be displayed.\n";
1224 print "[$WHT$provider_uri$NRM]: $WHT";
1225 $new_provider_uri = <STDIN
>;
1226 if ( $new_provider_uri eq "\n" ) {
1227 $new_provider_uri = '';
1229 $new_provider_uri =~ s/[\r\n]//g;
1230 $new_provider_uri =~ s/^\s+$//g;
1232 return $new_provider_uri;
1236 print "Here you can set the name of the link on the top-right of the message list.\n";
1237 print "The default is empty (do not display anything).'\n";
1239 print "[$WHT$provider_name$NRM]: $WHT";
1240 $new_provider_name = <STDIN
>;
1241 if ( $new_provider_name eq "\n" ) {
1242 $new_provider_name = '';
1244 $new_provider_name =~ s/[\r\n]//g;
1245 $new_provider_name =~ s/^\s+$//g;
1246 $new_provider_name =~ s/\'/\\'/g;
1248 return $new_provider_name;
1251 ####################################################################################
1255 print "The domain name is the suffix at the end of all email addresses. If\n";
1256 print "for example, your email address is jdoe\@example.com, then your domain\n";
1257 print "would be example.com.\n";
1259 print "[$WHT$domain$NRM]: $WHT";
1260 $new_domain = <STDIN
>;
1261 if ( $new_domain eq "\n" ) {
1262 $new_domain = $domain;
1264 $new_domain =~ s/\s//g;
1271 print "This is the hostname where your IMAP server can be contacted.\n";
1272 print "[$WHT$imapServerAddress$NRM]: $WHT";
1273 $new_imapServerAddress = <STDIN
>;
1274 if ( $new_imapServerAddress eq "\n" ) {
1275 $new_imapServerAddress = $imapServerAddress;
1277 $new_imapServerAddress =~ s/[\r\n]//g;
1279 return $new_imapServerAddress;
1284 print "This is the port that your IMAP server is on. Usually this is 143.\n";
1285 print "[$WHT$imapPort$NRM]: $WHT";
1286 $new_imapPort = <STDIN
>;
1287 if ( $new_imapPort eq "\n" ) {
1288 $new_imapPort = $imapPort;
1290 $new_imapPort =~ s/[\r\n]//g;
1292 return $new_imapPort;
1297 print "You now need to choose the method that you will use for sending\n";
1298 print "messages in SquirrelMail. You can either connect to an SMTP server\n";
1299 print "or use sendmail directly.\n";
1300 if ( lc($useSendmail) eq 'true' ) {
1301 $default_value = "1";
1303 $default_value = "2";
1306 print " 1. Sendmail\n";
1308 print "Your choice [1/2] [$WHT$default_value$NRM]: $WHT";
1309 $use_sendmail = <STDIN
>;
1310 if ( ( $use_sendmail =~ /^1\n/i )
1311 || ( ( $use_sendmail =~ /^\n/ ) && ( $default_value eq "1" ) ) ) {
1312 $useSendmail = 'true';
1314 $useSendmail = 'false';
1316 return $useSendmail;
1321 print "Specify where the sendmail executable is located. Usually /usr/sbin/sendmail\n";
1322 print "[$WHT$sendmail_path$NRM]: $WHT";
1323 $new_sendmail_path = <STDIN
>;
1324 if ( $new_sendmail_path eq "\n" ) {
1325 $new_sendmail_path = $sendmail_path;
1327 $new_sendmail_path =~ s/[\r\n]//g;
1329 return $new_sendmail_path;
1332 # Extra sendmail arguments
1333 sub command_sendmail_args
{
1334 print "Specify additional sendmail program arguments.\n";
1336 print "Make sure that arguments are supported by your sendmail program. -f argument \n";
1337 print "is added automatically by SquirrelMail scripts. Variable defaults to standard\n";
1338 print "/usr/sbin/sendmail arguments. If you use qmail-inject, nbsmtp or any other \n";
1339 print "sendmail wrapper, which does not support -i and -t arguments, set variable to\n";
1340 print "empty string or use arguments suitable for your mailer.\n";
1342 print "[$WHT$sendmail_args$NRM]: $WHT";
1343 $new_sendmail_args = <STDIN
>;
1344 if ( $new_sendmail_args eq "\n" ) {
1345 $new_sendmail_args = $sendmail_args;
1347 # strip linefeeds and crs.
1348 $new_sendmail_args =~ s/[\r\n]//g;
1350 return trim
($new_sendmail_args);
1355 print "This is the hostname of your SMTP server.\n";
1356 print "[$WHT$smtpServerAddress$NRM]: $WHT";
1357 $new_smtpServerAddress = <STDIN
>;
1358 if ( $new_smtpServerAddress eq "\n" ) {
1359 $new_smtpServerAddress = $smtpServerAddress;
1361 $new_smtpServerAddress =~ s/[\r\n]//g;
1363 return $new_smtpServerAddress;
1368 print "This is the port to connect to for SMTP. Usually 25.\n";
1369 print "[$WHT$smtpPort$NRM]: $WHT";
1370 $new_smtpPort = <STDIN
>;
1371 if ( $new_smtpPort eq "\n" ) {
1372 $new_smtpPort = $smtpPort;
1374 $new_smtpPort =~ s/[\r\n]//g;
1376 return $new_smtpPort;
1381 print "Do you wish to use POP3 before SMTP? Your server must\n";
1382 print "support this in order for SquirrelMail to work with it.\n";
1385 $YesNo = 'y' if ( lc($pop_before_smtp) eq 'true' );
1387 print "Use POP before SMTP (y/n) [$WHT$YesNo$NRM]: $WHT";
1389 $new_pop_before_smtp = <STDIN
>;
1390 $new_pop_before_smtp =~ tr/yn//cd;
1391 if ( $new_pop_before_smtp eq "y" ) {
1392 $new_pop_before_smtp = "true";
1393 } elsif ( $new_pop_before_smtp eq "n" ) {
1394 $new_pop_before_smtp = "false";
1396 $new_pop_before_smtp = $pop_before_smtp;
1399 # if using POP before SMTP, allow setting of custom POP server address
1400 if ($new_pop_before_smtp eq "true") {
1401 print "$NRM\nIf the address of the POP server is not the same as\n";
1402 print "your SMTP server, you may specify it here. Leave blank (to\n";
1403 print "clear this, enter only spaces) to use the same address as\n";
1404 print "your SMTP server.\n";
1405 print "POP before SMTP server address [$WHT$pop_before_smtp_host$NRM]: $WHT";
1407 $new_pop_before_smtp_host = <STDIN
>;
1408 if ( $new_pop_before_smtp_host eq "\n" ) {
1409 $new_pop_before_smtp_host = $pop_before_smtp_host;
1410 } elsif ($new_pop_before_smtp_host =~ /^\s+$/) {
1411 $new_pop_before_smtp_host = '';
1413 $new_pop_before_smtp_host =~ s/[\r|\n]//g;
1415 $pop_before_smtp_host = $new_pop_before_smtp_host;
1418 return $new_pop_before_smtp;
1423 print "Each IMAP server has its own quirks. As much as we tried to stick\n";
1424 print "to standards, it doesn't help much if the IMAP server doesn't follow\n";
1425 print "the same principles. We have made some work-arounds for some of\n";
1426 print "these servers. If you would like to use them, please select your\n";
1427 print "IMAP server. If you do not wish to use these work-arounds, you can\n";
1428 print "set this to \"other\", and none will be used.\n";
1429 print $list_supported_imap_servers;
1431 print " other = Not one of the above servers\n";
1433 print "[$WHT$imap_server_type$NRM]: $WHT";
1434 $new_imap_server_type = <STDIN
>;
1436 if ( $new_imap_server_type eq "\n" ) {
1437 $new_imap_server_type = $imap_server_type;
1439 $new_imap_server_type =~ s/[\r\n]//g;
1441 return $new_imap_server_type;
1446 print "Sometimes the date of messages sent is messed up (off by a few hours\n";
1447 print "on some machines). Typically this happens if the system doesn't support\n";
1448 print "tm_gmtoff. It will happen only if your time zone is \"negative\".\n";
1449 print "This most often occurs on Solaris 7 machines in the United States.\n";
1450 print "By default, this is off. It should be kept off unless problems surface\n";
1451 print "about the time that messages are sent.\n";
1452 print " no = Do NOT fix time -- almost always correct\n";
1453 print " yes = Fix the time for this system\n";
1456 $YesNo = 'y' if ( lc($invert_time) eq 'true' );
1458 print "Fix the time for this system (y/n) [$WHT$YesNo$NRM]: $WHT";
1460 $new_invert_time = <STDIN
>;
1461 $new_invert_time =~ tr/yn//cd;
1462 return 'true' if ( $new_invert_time eq "y" );
1463 return 'false' if ( $new_invert_time eq "n" );
1464 return $invert_time;
1468 print "This is the delimiter that your IMAP server uses to distinguish between\n";
1469 print "folders. For example, Cyrus uses '.' as the delimiter and a complete\n";
1470 print "folder would look like 'INBOX.Friends.Bob', while UW uses '/' and would\n";
1471 print "look like 'INBOX/Friends/Bob'. Normally this should be left at 'detect'\n";
1472 print "but if you are sure you know what delimiter your server uses, you can\n";
1473 print "specify it here.\n";
1474 print "\nTo have it autodetect the delimiter, set it to 'detect'.\n\n";
1475 print "[$WHT$optional_delimiter$NRM]: $WHT";
1476 $new_optional_delimiter = <STDIN
>;
1478 if ( $new_optional_delimiter eq "\n" ) {
1479 $new_optional_delimiter = $optional_delimiter;
1481 $new_optional_delimiter =~ s/[\r\n]//g;
1483 return $new_optional_delimiter;
1485 # IMAP authentication type
1486 # Possible values: login, plain, cram-md5, digest-md5
1487 # Now offers to detect supported mechs, assuming server & port are set correctly
1490 if ($use_imap_tls ne "0") {
1491 # 1. Script does not handle TLS.
1492 # 2. Server does not have to declare all supported authentication mechs when
1493 # STARTTLS is used. Supported mechs are declared only after STARTTLS.
1494 print "Auto-detection of login methods is unavailable when using TLS or STARTTLS.\n";
1496 print "If you have already set the hostname and port number, I can try to\n";
1497 print "detect the mechanisms your IMAP server supports.\n";
1498 print "I will try to detect CRAM-MD5 and DIGEST-MD5 support. I can't test\n";
1499 print "for \"login\" or \"plain\" without knowing a username and password.\n";
1500 print "Auto-detecting is optional - you can safely say \"n\" here.\n";
1501 print "\nTry to detect supported mechanisms? [y/N]: ";
1504 if ($inval =~ /^y\b/i) {
1505 # Yes, let's try to detect.
1506 print "Trying to detect IMAP capabilities...\n";
1507 my $host = $imapServerAddress . ':'. $imapPort;
1508 print "CRAM-MD5:\t";
1509 my $tmp = detect_auth_support
('IMAP',$host,'CRAM-MD5');
1510 if (defined($tmp)) {
1511 if ($tmp eq 'YES') {
1512 print "$WHT SUPPORTED$NRM\n";
1514 print "$WHT NOT SUPPORTED$NRM\n";
1517 print $WHT . " ERROR DETECTING$NRM\n";
1520 print "DIGEST-MD5:\t";
1521 $tmp = detect_auth_support
('IMAP',$host,'DIGEST-MD5');
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";
1534 print "\nWhat authentication mechanism do you want to use for IMAP connections?\n\n";
1535 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1536 print $WHT . "plain" . $NRM . " - SASL PLAIN. If you need this, you already know it.\n";
1537 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext methods.\n";
1538 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1539 print "\n*** YOUR IMAP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n";
1540 print "If you don't understand or are unsure, you probably want \"login\"\n\n";
1541 print "login, plain, cram-md5, or digest-md5 [$WHT$imap_auth_mech$NRM]: $WHT";
1544 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || ($inval =~ /^login\b/i) || ($inval =~ /^plain\b/i)) {
1547 # user entered garbage or default value so nothing needs to be set
1548 return $imap_auth_mech;
1553 # SMTP authentication type
1554 # Possible choices: none, login, plain, cram-md5, digest-md5
1556 if ($use_smtp_tls ne "0") {
1557 print "Auto-detection of login methods is unavailable when using TLS or STARTTLS.\n";
1558 } elsif (eval ("use IO::Socket; 1")) {
1559 # try loading IO::Socket module
1560 print "If you have already set the hostname and port number, I can try to\n";
1561 print "automatically detect some of the mechanisms your SMTP server supports.\n";
1562 print "Auto-detection is *optional* - you can safely say \"n\" here.\n";
1563 print "\nTry to detect auth mechanisms? [y/N]: ";
1566 if ($inval =~ /^y\b/i) {
1567 # Yes, let's try to detect.
1568 print "Trying to detect supported methods (SMTP)...\n";
1571 # Check none by trying to relay to junk@microsoft.com
1572 $host = $smtpServerAddress . ':' . $smtpPort;
1573 my $sock = IO
::Socket
::INET
->new($host);
1574 print "Testing none:\t\t$WHT";
1575 if (!defined($sock)) {
1576 print " ERROR TESTING\n";
1579 $got = <$sock>; # Discard greeting
1580 print $sock "HELO $domain\r\n";
1581 $got = <$sock>; # Discard
1582 print $sock "MAIL FROM:<tester\@squirrelmail.org>\r\n";
1583 $got = <$sock>; # Discard
1584 print $sock "RCPT TO:<junk\@microsoft.com\r\n";
1585 $got = <$sock>; # This is the important line
1586 if ($got =~ /^250\b/) { # SMTP will relay without auth
1587 print "SUPPORTED$NRM\n";
1589 print "NOT SUPPORTED$NRM\n";
1591 print $sock "RSET\r\n";
1592 print $sock "QUIT\r\n";
1596 # Try login (SquirrelMail default)
1597 print "Testing login:\t\t";
1598 $tmp=detect_auth_support
('SMTP',$host,'LOGIN');
1599 if (defined($tmp)) {
1600 if ($tmp eq 'YES') {
1601 print $WHT . "SUPPORTED$NRM\n";
1603 print $WHT . "NOT SUPPORTED$NRM\n";
1606 print $WHT . "ERROR DETECTING$NRM\n";
1610 print "Testing plain:\t\t";
1611 $tmp=detect_auth_support
('SMTP',$host,'PLAIN');
1612 if (defined($tmp)) {
1613 if ($tmp eq 'YES') {
1614 print $WHT . "SUPPORTED$NRM\n";
1616 print $WHT . "NOT SUPPORTED$NRM\n";
1619 print $WHT . "ERROR DETECTING$NRM\n";
1623 print "Testing CRAM-MD5:\t";
1624 $tmp=detect_auth_support
('SMTP',$host,'CRAM-MD5');
1625 if (defined($tmp)) {
1626 if ($tmp eq 'YES') {
1627 print $WHT . "SUPPORTED$NRM\n";
1629 print $WHT . "NOT SUPPORTED$NRM\n";
1632 print $WHT . "ERROR DETECTING$NRM\n";
1636 print "Testing DIGEST-MD5:\t";
1637 $tmp=detect_auth_support
('SMTP',$host,'DIGEST-MD5');
1638 if (defined($tmp)) {
1639 if ($tmp eq 'YES') {
1640 print $WHT . "SUPPORTED$NRM\n";
1642 print $WHT . "NOT SUPPORTED$NRM\n";
1645 print $WHT . "ERROR DETECTING$NRM\n";
1649 print "\nWhat authentication mechanism do you want to use for SMTP connections?\n";
1650 print $WHT . "none" . $NRM . " - Your SMTP server does not require authorization.\n";
1651 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1652 print $WHT . "plain" . $NRM . " - SASL PLAIN. Plaintext. If you can do better, you probably should.\n";
1653 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext.\n";
1654 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1655 print $WHT . "\n*** YOUR SMTP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n" . $NRM;
1656 print "If you don't understand or are unsure, you probably want \"none\"\n\n";
1657 print "none, login, plain, cram-md5, or digest-md5 [$WHT$smtp_auth_mech$NRM]: $WHT";
1660 if ($inval =~ /^none\b/i) {
1661 # remove sitewide smtp authentication information
1662 $smtp_sitewide_user = '';
1663 $smtp_sitewide_pass = '';
1664 # SMTP doesn't necessarily require logins
1666 } elsif ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) ||
1667 ($inval =~ /^login\b/i) || ($inval =~/^plain\b/i)) {
1668 command_smtp_sitewide_userpass
($inval);
1670 } elsif (trim
($inval) eq '') {
1671 # user selected default value
1672 command_smtp_sitewide_userpass
($smtp_auth_mech);
1673 return $smtp_auth_mech;
1675 # user entered garbage
1676 return $smtp_auth_mech;
1680 sub command_smtp_sitewide_userpass
($) {
1681 # get first function argument
1682 my $auth_mech = shift(@_);
1684 $auth_mech = lc(trim
($auth_mech));
1685 if ($auth_mech eq 'none') {
1688 print "SMTP authentication uses IMAP username and password by default.\n";
1690 print "Would you like to use other login and password for all SquirrelMail \n";
1691 print "SMTP connections?";
1692 if ($smtp_sitewide_user ne '') {
1709 $smtp_sitewide_user = '';
1710 $smtp_sitewide_pass = '';
1711 } elsif ($tmp eq 'y') {
1712 print "Enter username [$smtp_sitewide_user]:";
1713 my $new_user = <STDIN
>;
1714 $new_user = trim
($new_user);
1715 if ($new_user ne '') {
1716 $smtp_sitewide_user = $new_user;
1718 if ($smtp_sitewide_user ne '') {
1719 print "If you don't enter any password, current sitewide password will be used.\n";
1720 print "If you enter space, password will be set to empty string.\n";
1721 print "Enter password:";
1722 my $new_pass = <STDIN
>;
1723 if ($new_pass ne "\n") {
1724 $smtp_sitewide_pass = trim
($new_pass);
1727 print "Invalid input. You must set username used for SMTP authentication.\n";
1728 print "Click enter to continue\n";
1732 print "Invalid input\n";
1733 print "Click enter to continue\n";
1738 # Sub adds information about SMTP authentication type to menu
1739 sub display_smtp_sitewide_userpass
() {
1741 if ($smtp_auth_mech ne 'none') {
1742 if ($smtp_sitewide_user ne '') {
1743 $ret = ' (with custom username and password)';
1745 $ret = ' (with IMAP username and password)';
1752 # This sub is reused for IMAP and SMTP
1753 # Args: service name, default value
1754 sub command_use_tls
{
1755 my($default_val,$service,$inval);
1758 print "TLS (Transport Layer Security) encrypts the traffic between server and client.\n";
1759 print "STARTTLS extensions allow to start encryption on existing plain text connection.\n";
1760 print "These options add specific PHP and IMAP server configuration requirements.\n";
1761 print "See SquirrelMail documentation about connection security.\n";
1763 print "If your " . $service . " server is localhost, you can safely disable this.\n";
1764 print "If it is remote, you may wish to seriously consider enabling this.\n";
1766 while ($valid_input eq 0) {
1767 print "\nSelect connection security model:\n";
1768 print " 0 - Use plain text connection\n";
1769 print " 1 - Use TLS connection\n";
1770 print " 2 - Use STARTTLS extension\n";
1771 print "Select [$default_val]: ";
1773 $inval=trim
($inval);
1774 if ($inval =~ /^[012]$/ || $inval eq '') {
1778 if ($inval ne '') {$default_val = $inval};
1779 return $default_val;
1782 # This sub is used to display human readable text for
1783 # $use_imap_tls and $use_smtp_tls values in conf.pl menu
1784 sub display_use_tls
($) {
1785 my $val = shift(@_);
1786 my $ret = 'disabled';
1789 } elsif ($val eq '1') {
1795 # $encode_header_key
1797 print "This encryption key allows the hiding of SquirrelMail Received:\n";
1798 print "headers in outbound messages. SquirrelMail uses the encryption\n";
1799 print "key to encode the username, remote address, and proxied address\n";
1800 print "and then stores that encoded information in X-Squirrel-* headers.\n";
1802 print "Warning: the encryption function used to accomplish this is not\n";
1803 print "bulletproof. When used with a static encryption key as it is here,\n";
1804 print "it provides only minimal security and the encoded user information\n";
1805 print "in the X-Squirrel-* headers can be decoded quickly by a skilled\n";
1806 print "attacker.\n";
1808 print "When you need to inspect an email sent from your system with the\n";
1809 print "X-Squirrel-* headers, you can decode the user information therein\n";
1810 print "by using the decrypt_headers.php script found in the SquirrelMail\n";
1811 print "contrib/ directory. You'll need the encryption key that you\n";
1812 print "defined here when doing so.\n";
1814 print "Enter encryption key: ";
1815 $new_encode_header_key = <STDIN
>;
1816 if ( $new_encode_header_key eq "\n" ) {
1817 $new_encode_header_key = $encode_header_key;
1819 $new_encode_header_key =~ s/[\r\n]//g;
1821 return $new_encode_header_key;
1826 print "\nYou can now create the welcome message that is displayed\n";
1827 print "every time a user logs on. You can use HTML or just plain\n";
1829 "text. If you do not wish to have one, just make it blank.\n\n(Type @ on a blank line to exit)\n";
1835 $line =~ s/[\r\n]//g;
1836 if ( $line ne "@" ) {
1837 $line =~ s/ /\ \ /g;
1838 $line =~ s/\t/\ \ \ \ /g;
1840 $line =~ s/\"/\\\"/g;
1842 $new_motd = $new_motd . $line;
1844 } while ( $line ne "@" );
1848 ################# PLUGINS ###################
1851 $command =~ s/[\s\n\r]*//g;
1852 if ( $command > 0 ) {
1853 $command = $command - 1;
1854 if ( $command <= $#plugins ) {
1857 while ( $ct <= $#plugins ) {
1858 if ( $ct != $command ) {
1859 @newplugins = ( @newplugins, $plugins[$ct] );
1863 @plugins = @newplugins;
1864 } elsif ( $command <= $#plugins + $#unused_plugins + 1 ) {
1865 $num = $command - $#plugins - 1;
1866 @newplugins = @plugins;
1868 while ( $ct <= $#unused_plugins ) {
1869 if ( $ct == $num ) {
1870 @newplugins = ( @newplugins, $unused_plugins[$ct] );
1874 @plugins = @newplugins;
1880 # disable_plugins_user
1882 print "When all active plugins are disabled, they can be disabled only\n";
1883 print "for the one user named here. If left blank, plugins will be\n";
1884 print "disabled for ALL users. This setting has no effect if plugins\n";
1885 print "are not disabled.\n";
1887 print "This must be the exact IMAP login name for the desired user.\n";
1889 print "[$WHT$disable_plugins_user$NRM]: $WHT";
1890 $new_disable_plugins_user = <STDIN
>;
1891 if ( $new_disable_plugins_user eq "\n" ) {
1892 $new_disable_plugins_user = $disable_plugins_user;
1894 $new_disable_plugins_user =~ s/[\r\n]//g;
1896 return $new_disable_plugins_user;
1899 ################# FOLDERS ###################
1901 # default_folder_prefix
1903 print "Some IMAP servers (UW, for example) store mail and folders in\n";
1904 print "your user space in a separate subdirectory. This is where you\n";
1905 print "specify what that directory is.\n";
1907 print "EXAMPLE: mail/";
1909 print "NOTE: If you use Cyrus, or some server that would not use this\n";
1910 print " option, you must set this to 'none'.\n";
1912 print "[$WHT$default_folder_prefix$NRM]: $WHT";
1913 $new_default_folder_prefix = <STDIN
>;
1915 if ( $new_default_folder_prefix eq "\n" ) {
1916 $new_default_folder_prefix = $default_folder_prefix;
1918 $new_default_folder_prefix =~ s/[\r\n]//g;
1920 if ( ( $new_default_folder_prefix =~ /^\s*$/ ) || ( $new_default_folder_prefix =~ m/^none$/i ) ) {
1921 $new_default_folder_prefix = "";
1923 # add the trailing delimiter only if we know what the server is.
1924 if (($imap_server_type eq 'cyrus' and
1925 $optional_delimiter eq 'detect') or
1926 ($imap_server_type eq 'courier' and
1927 $optional_delimiter eq 'detect')) {
1928 $new_default_folder_prefix =~ s/\.*$/\./;
1929 } elsif ($imap_server_type eq 'uw' and
1930 $optional_delimiter eq 'detect') {
1931 $new_default_folder_prefix =~ s/\/*$/\
//;
1934 return $new_default_folder_prefix;
1937 # Show Folder Prefix
1939 print "It is possible to set up the default folder prefix as a user\n";
1940 print "specific option, where each user can specify what their mail\n";
1941 print "folder is. If you set this to false, they will never see the\n";
1942 print "option, but if it is true, this option will appear in the\n";
1943 print "'options' section.\n";
1945 print "NOTE: You set the default folder prefix in option '1' of this\n";
1946 print " section. That will be the default if the user doesn't\n";
1947 print " specify anything different.\n";
1950 if ( lc($show_prefix_option) eq 'true' ) {
1951 $default_value = "y";
1953 $default_value = "n";
1956 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1957 $new_show = <STDIN
>;
1958 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1959 $show_prefix_option = 'true';
1961 $show_prefix_option = 'false';
1963 return $show_prefix_option;
1968 print "You can now specify where the default trash folder is located.\n";
1969 print "On servers where you do not want this, you can set it to anything\n";
1970 print "and set option 6 to false.\n";
1972 print "This is relative to where the rest of your email is kept. You do\n";
1973 print "not need to worry about their mail directory. If this folder\n";
1974 print "would be ~/mail/trash on the filesystem, you only need to specify\n";
1975 print "that this is 'trash', and be sure to put 'mail/' in option 1.\n";
1978 print "[$WHT$trash_folder$NRM]: $WHT";
1979 $new_trash_folder = <STDIN
>;
1980 if ( $new_trash_folder eq "\n" ) {
1981 $new_trash_folder = $trash_folder;
1983 if (check_imap_folder
($new_trash_folder)) {
1984 $new_trash_folder =~ s/[\r\n]//g;
1986 $new_trash_folder = $trash_folder;
1989 return $new_trash_folder;
1994 print "This is where messages that are sent will be stored. SquirrelMail\n";
1995 print "by default puts a copy of all outgoing messages in this folder.\n";
1997 print "This is relative to where the rest of your email is kept. You do\n";
1998 print "not need to worry about their mail directory. If this folder\n";
1999 print "would be ~/mail/sent on the filesystem, you only need to specify\n";
2000 print "that this is 'sent', and be sure to put 'mail/' in option 1.\n";
2003 print "[$WHT$sent_folder$NRM]: $WHT";
2004 $new_sent_folder = <STDIN
>;
2005 if ( $new_sent_folder eq "\n" ) {
2006 $new_sent_folder = $sent_folder;
2008 if (check_imap_folder
($new_sent_folder)) {
2009 $new_sent_folder =~ s/[\r\n]//g;
2011 $new_sent_folder = $sent_folder;
2014 return $new_sent_folder;
2019 print "You can now specify where the default draft folder is located.\n";
2020 print "On servers where you do not want this, you can set it to anything\n";
2021 print "and set option 9 to false.\n";
2023 print "This is relative to where the rest of your email is kept. You do\n";
2024 print "not need to worry about their mail directory. If this folder\n";
2025 print "would be ~/mail/drafts on the filesystem, you only need to specify\n";
2026 print "that this is 'drafts', and be sure to put 'mail/' in option 1.\n";
2029 print "[$WHT$draft_folder$NRM]: $WHT";
2030 $new_draft_folder = <STDIN
>;
2031 if ( $new_draft_folder eq "\n" ) {
2032 $new_draft_folder = $draft_folder;
2034 if (check_imap_folder
($new_draft_folder)) {
2035 $new_draft_folder =~ s/[\r\n]//g;
2037 $new_draft_folder = $draft_folder;
2040 return $new_draft_folder;
2043 # default move to trash
2045 print "By default, should messages get moved to the trash folder? You\n";
2046 print "can specify the default trash folder in option 3. If this is set\n";
2047 print "to false, messages will get deleted immediately without moving\n";
2048 print "to the trash folder.\n";
2050 print "Trash folder is currently: $trash_folder\n";
2053 if ( lc($default_move_to_trash) eq 'true' ) {
2054 $default_value = "y";
2056 $default_value = "n";
2058 print "By default, move to trash (y/n) [$WHT$default_value$NRM]: $WHT";
2059 $new_show = <STDIN
>;
2060 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2061 $default_move_to_trash = 'true';
2063 $default_move_to_trash = 'false';
2065 return $default_move_to_trash;
2068 # default move to sent (save sent messages)
2070 print "By default, should copies of outgoing messages get saved in the\n";
2071 print "sent folder? You can specify the default sent folder in option 4.\n";
2072 print "If this is set to false, messages will get sent and no copy will\n";
2075 print "Sent folder is currently: $sent_folder\n";
2078 if ( lc($default_move_to_sent) eq 'true' ) {
2079 $default_value = "y";
2081 $default_value = "n";
2083 print "By default, save sent messages (y/n) [$WHT$default_value$NRM]: $WHT";
2084 $new_show = <STDIN
>;
2085 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2086 $default_move_to_sent = 'true';
2088 $default_move_to_sent = 'false';
2090 return $default_move_to_sent;
2093 # default save as draft
2095 print "By default, should the save to draft option be shown? You can\n";
2096 print "specify the default drafts folder in option 5. If this is set\n";
2097 print "to false, users will not be shown the save to draft option.\n";
2099 print "Drafts folder is currently: $draft_folder\n";
2102 if ( lc($default_save_as_draft) eq 'true' ) {
2103 $default_value = "y";
2105 $default_value = "n";
2107 print "By default, save as draft (y/n) [$WHT$default_value$NRM]: $WHT";
2108 $new_show = <STDIN
>;
2109 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2110 $default_save_as_draft = 'true';
2112 $default_save_as_draft = 'false';
2114 return $default_save_as_draft;
2117 # List special folders first
2119 print "SquirrelMail has what we call 'special folders' that are not\n";
2120 print "manipulated and viewed like normal folders. Some examples of\n";
2121 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
2122 print "Simply asks if you want these folders listed first in the folder\n";
2126 if ( lc($list_special_folders_first) eq 'true' ) {
2127 $default_value = "y";
2129 $default_value = "n";
2132 print "List first (y/n) [$WHT$default_value$NRM]: $WHT";
2133 $new_show = <STDIN
>;
2134 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2135 $list_special_folders_first = 'true';
2137 $list_special_folders_first = 'false';
2139 return $list_special_folders_first;
2142 # Show special folders color
2144 print "SquirrelMail has what we call 'special folders' that are not\n";
2145 print "manipulated and viewed like normal folders. Some examples of\n";
2146 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
2147 print "wants to know if we should display special folders in a\n";
2148 print "color than the other folders.\n";
2151 if ( lc($use_special_folder_color) eq 'true' ) {
2152 $default_value = "y";
2154 $default_value = "n";
2157 print "Show color (y/n) [$WHT$default_value$NRM]: $WHT";
2158 $new_show = <STDIN
>;
2159 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2160 $use_special_folder_color = 'true';
2162 $use_special_folder_color = 'false';
2164 return $use_special_folder_color;
2169 print "The way that IMAP handles deleting messages is as follows. You\n";
2170 print "mark the message as deleted, and then to 'really' delete it, you\n";
2171 print "expunge it. This option asks if you want to just have messages\n";
2172 print "marked as deleted, or if you want SquirrelMail to expunge the \n";
2173 print "messages too.\n";
2176 if ( lc($auto_expunge) eq 'true' ) {
2177 $default_value = "y";
2179 $default_value = "n";
2181 print "Auto expunge (y/n) [$WHT$default_value$NRM]: $WHT";
2182 $new_show = <STDIN
>;
2183 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2184 $auto_expunge = 'true';
2186 $auto_expunge = 'false';
2188 return $auto_expunge;
2191 # Default sub of inbox
2193 print "Some IMAP servers (Cyrus) have all folders as subfolders of INBOX.\n";
2194 print "This can cause some confusion in folder creation for users when\n";
2195 print "they try to create folders and don't put it as a subfolder of INBOX\n";
2196 print "and get permission errors. This option asks if you want folders\n";
2197 print "to be subfolders of INBOX by default.\n";
2200 if ( lc($default_sub_of_inbox) eq 'true' ) {
2201 $default_value = "y";
2203 $default_value = "n";
2205 print "Default sub of INBOX (y/n) [$WHT$default_value$NRM]: $WHT";
2206 $new_show = <STDIN
>;
2207 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2208 $default_sub_of_inbox = 'true';
2210 $default_sub_of_inbox = 'false';
2212 return $default_sub_of_inbox;
2215 # Show contain subfolder option
2217 print "Some IMAP servers (UW) make it so that there are two types of\n";
2218 print "folders. Those that contain messages, and those that contain\n";
2219 print "subfolders. If this is the case for your server, set this to\n";
2220 print "true, and it will ask the user whether the folder they are\n";
2221 print "creating contains subfolders or messages.\n";
2224 if ( lc($show_contain_subfolders_option) eq 'true' ) {
2225 $default_value = "y";
2227 $default_value = "n";
2229 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
2230 $new_show = <STDIN
>;
2231 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2232 $show_contain_subfolders_option = 'true';
2234 $show_contain_subfolders_option = 'false';
2236 return $show_contain_subfolders_option;
2239 # Default Unseen Notify
2241 print "This option specifies where the users will receive notification\n";
2242 print "about unseen messages by default. This is of course an option that\n";
2243 print "can be changed on a user level.\n";
2244 print " 1 = No notification\n";
2245 print " 2 = Only on the INBOX\n";
2246 print " 3 = On all folders\n";
2249 print "Which one should be default (1,2,3)? [$WHT$default_unseen_notify$NRM]: $WHT";
2250 $new_show = <STDIN
>;
2251 if ( $new_show =~ /^[123]\n/i ) {
2252 $default_unseen_notify = $new_show;
2254 $default_unseen_notify =~ s/[\r\n]//g;
2255 return $default_unseen_notify;
2258 # Default Unseen Type
2260 print "Here you can define the default way that unseen messages will be displayed\n";
2261 print "to the user in the folder listing on the left side.\n";
2262 print " 1 = Only unseen messages (4)\n";
2263 print " 2 = Unseen and Total messages (4/27)\n";
2266 print "Which one should be default (1,2)? [$WHT$default_unseen_type$NRM]: $WHT";
2267 $new_show = <STDIN
>;
2268 if ( $new_show =~ /^[12]\n/i ) {
2269 $default_unseen_type = $new_show;
2271 $default_unseen_type =~ s/[\r\n]//g;
2272 return $default_unseen_type;
2275 # Auto create special folders
2277 print "Would you like the Sent, Trash, and Drafts folders to be created\n";
2278 print "automatically print for you when a user logs in? If the user\n";
2279 print "accidentally deletes their special folders, this option will\n";
2280 print "automatically create it again for them.\n";
2283 if ( lc($auto_create_special) eq 'true' ) {
2284 $default_value = "y";
2286 $default_value = "n";
2288 print "Auto create special folders? (y/n) [$WHT$default_value$NRM]: $WHT";
2289 $new_show = <STDIN
>;
2290 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2291 $auto_create_special = 'true';
2293 $auto_create_special = 'false';
2295 return $auto_create_special;
2298 # Automatically delete folders
2300 if ( $imap_server_type eq "uw" ) {
2301 print "UW IMAP servers will not allow folders containing mail to also contain folders.\n";
2302 print "Deleting folders will bypass the trash folder and be immediately deleted\n\n";
2303 print "If this is not the correct value for your server,\n";
2304 print "please use option D on the Main Menu to configure your server correctly.\n\n";
2305 print "Press enter to continue...\n";
2306 $new_delete = <STDIN
>;
2307 $delete_folder = 'true';
2309 if ( $imap_server_type eq "courier" ) {
2310 print "Courier (or Courier-IMAP) IMAP servers may not support ";
2311 print "subfolders of Trash. \n";
2312 print "Specifically, if Courier is set to always move messages to Trash, \n";
2313 print "Trash will be treated by Courier as a special folder that does not \n";
2314 print "allow subfolders. \n\n";
2315 print "Please verify your Courier configuration, and test folder deletion \n";
2316 print "when changing this setting.\n\n";
2319 print "Are subfolders of the Trash supported by your IMAP server?\n";
2320 print "If so, should deleted folders be sent to Trash?\n";
2321 print "If not, say no (deleted folders should not be sent to Trash)\n\n";
2322 # reversal of logic.
2323 # question was: Should folders be automatically deleted instead of sent to trash..
2324 # we've changed the question to make it more clear,
2325 # and are here handling that to avoid changing the answers..
2326 if ( lc($delete_folder) eq 'true' ) {
2327 $default_value = "n";
2329 $default_value = "y";
2331 print "Send deleted folders to Trash? (y/n) [$WHT$default_value$NRM]: $WHT";
2332 $new_delete = <STDIN
>;
2333 if ( ( $new_delete =~ /^y\n/i ) || ( ( $new_delete =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2334 $delete_folder = 'false';
2336 $delete_folder = 'true';
2339 return $delete_folder;
2344 print "Some IMAP servers allow subfolders to exist even if the parent\n";
2345 print "folders do not. This fixes some problems with the folder list\n";
2346 print "when this is the case, causing the /NoSelect folders to be displayed\n";
2349 if ( lc($noselect_fix_enable) eq 'true' ) {
2350 $default_value = "y";
2352 $default_value = "n";
2354 print "enable noselect fix? (y/n) [$WHT$noselect_fix_enable$NRM]: $WHT";
2355 $noselect_fix_enable = <STDIN
>;
2356 if ( ( $noselect_fix_enable =~ /^y\n/i ) || ( ( $noselect_fix_enable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2357 $noselect_fix_enable = 'true';
2359 $noselect_fix_enable = 'false';
2361 return $noselect_fix_enable;
2363 ############# GENERAL OPTIONS #####################
2367 print "Specify the location for your data directory.\n";
2368 print "You need to create this directory yourself.\n";
2369 print "The path name can be absolute or relative (to the config directory).\n";
2370 print "Here are two examples:\n";
2371 print " Absolute: /var/local/squirrelmail/data/\n";
2372 print " Relative: ../data/\n";
2373 print "Relative paths to directories outside of the SquirrelMail distribution\n";
2374 print "will be converted to their absolute path equivalents in config.php.\n\n";
2375 print "Note: There are potential security risks with having a writeable directory\n";
2376 print "under the web server's root directory (ex: /home/httpd/html).\n";
2377 print "For this reason, it is recommended to put the data directory\n";
2378 print "in an alternate location of your choice. \n";
2381 print "[$WHT$data_dir$NRM]: $WHT";
2382 $new_data_dir = <STDIN
>;
2383 if ( $new_data_dir eq "\n" ) {
2384 $new_data_dir = $data_dir;
2386 $new_data_dir =~ s/[\r\n]//g;
2388 if ( $new_data_dir =~ /^\s*$/ ) {
2391 $new_data_dir =~ s/\/*$//g
;
2392 $new_data_dir =~ s/$/\//g
;
2394 return $new_data_dir;
2397 # Attachment directory
2399 print "Path to directory used for storing attachments while a mail is\n";
2400 print "being composed. The path name can be absolute or relative (to the\n";
2401 print "config directory). Here are two examples:\n";
2402 print " Absolute: /var/local/squirrelmail/attach/\n";
2403 print " Relative: ../attach/\n";
2404 print "Relative paths to directories outside of the SquirrelMail distribution\n";
2405 print "will be converted to their absolute path equivalents in config.php.\n\n";
2406 print "Note: There are a few security considerations regarding this\n";
2407 print "directory:\n";
2408 print " 1. It should have the permission 733 (rwx-wx-wx) to make it\n";
2409 print " impossible for a random person with access to the webserver\n";
2410 print " to list files in this directory. Confidential data might\n";
2411 print " be laying around in there.\n";
2412 print " Depending on your user:group assignments, 730 (rwx-wx---)\n";
2413 print " may be possible, and more secure (e.g. root:apache)\n";
2414 print " 2. Since the webserver is not able to list the files in the\n";
2415 print " content is also impossible for the webserver to delete files\n";
2416 print " lying around there for too long.\n";
2417 print " 3. It should probably be another directory than the data\n";
2418 print " directory specified in option 3.\n";
2421 print "[$WHT$attachment_dir$NRM]: $WHT";
2422 $new_attachment_dir = <STDIN
>;
2423 if ( $new_attachment_dir eq "\n" ) {
2424 $new_attachment_dir = $attachment_dir;
2426 $new_attachment_dir =~ s/[\r\n]//g;
2428 if ( $new_attachment_dir =~ /^\s*$/ ) {
2429 $new_attachment_dir = "";
2431 $new_attachment_dir =~ s/\/*$//g
;
2432 $new_attachment_dir =~ s/$/\//g
;
2434 return $new_attachment_dir;
2438 print "The directory hash level setting allows you to configure the level\n";
2439 print "of hashing that SquirrelMail employs in your data and attachment\n";
2440 print "directories. This value must be an integer ranging from 0 to 4.\n";
2441 print "When this value is set to 0, SquirrelMail will simply store all\n";
2442 print "files as normal in the data and attachment directories. However,\n";
2443 print "when set to a value from 1 to 4, a simple hashing scheme will be\n";
2444 print "used to organize the files in this directory. In short, the crc32\n";
2445 print "value for a username will be computed. Then, up to the first 4\n";
2446 print "digits of the hash, as set by this configuration value, will be\n";
2447 print "used to directory hash the files for that user in the data and\n";
2448 print "attachment directory. This allows for better performance on\n";
2449 print "servers with larger numbers of users.\n";
2452 print "[$WHT$dir_hash_level$NRM]: $WHT";
2453 $new_dir_hash_level = <STDIN
>;
2454 if ( $new_dir_hash_level eq "\n" ) {
2455 $new_dir_hash_level = $dir_hash_level;
2457 $new_dir_hash_level =~ s/[\r\n]//g;
2459 if ( ( int($new_dir_hash_level) < 0 )
2460 || ( int($new_dir_hash_level) > 4 )
2461 || !( int($new_dir_hash_level) eq $new_dir_hash_level ) ) {
2462 print "Invalid Directory Hash Level.\n";
2463 print "Value must be an integer ranging from 0 to 4\n";
2464 print "Hit enter to continue.\n";
2465 $enter_key = <STDIN
>;
2467 $new_dir_hash_level = $dir_hash_level;
2470 return $new_dir_hash_level;
2474 print "This is the default size (in pixels) of the left folder list.\n";
2475 print "Default is 200, but you can set it to whatever you wish. This\n";
2476 print "is a user preference, so this will only show up as their default.\n";
2478 print "[$WHT$default_left_size$NRM]: $WHT";
2479 $new_default_left_size = <STDIN
>;
2480 if ( $new_default_left_size eq "\n" ) {
2481 $new_default_left_size = $default_left_size;
2483 $new_default_left_size =~ s/[\r\n]//g;
2485 return $new_default_left_size;
2489 print "Some IMAP servers only have lowercase letters in the usernames\n";
2490 print "but they still allow people with uppercase to log in. This\n";
2491 print "causes a problem with the user's preference files. This option\n";
2492 print "transparently changes all usernames to lowercase.";
2495 if ( lc($force_username_lowercase) eq 'true' ) {
2496 $default_value = "y";
2498 $default_value = "n";
2500 print "Convert usernames to lowercase (y/n) [$WHT$default_value$NRM]: $WHT";
2501 $new_show = <STDIN
>;
2502 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2512 if ( lc($default_use_priority) eq 'true' ) {
2513 $default_value = "y";
2515 $default_value = "n";
2518 print "Allow users to specify priority of outgoing mail (y/n) [$WHT$default_value$NRM]: $WHT";
2519 $new_show = <STDIN
>;
2520 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2530 if ( lc($hide_sm_attributions) eq 'true' ) {
2531 $default_value = "y";
2533 $default_value = "n";
2536 print "Hide SM attributions (y/n) [$WHT$default_value$NRM]: $WHT";
2537 $new_show = <STDIN
>;
2538 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2548 if ( lc($default_use_mdn) eq 'true' ) {
2549 $default_value = "y";
2551 $default_value = "n";
2554 print "Enable support for read/delivery receipt support (y/n) [$WHT$default_value$NRM]: $WHT";
2555 $new_show = <STDIN
>;
2556 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2564 print " In loosely managed environments, you may want to allow users
2565 to edit their full name and email address. In strictly managed
2566 environments, you may want to force users to use the name
2567 and email address assigned to them.
2569 'y' - allow a user to edit their full name and email address,
2570 'n' - users must use the assigned values.
2574 if ( lc($edit_identity) eq 'true' ) {
2575 $default_value = "y";
2577 $default_value = "n";
2579 print "Allow editing of user's identity? (y/n) [$WHT$default_value$NRM]: $WHT";
2580 $new_edit = <STDIN
>;
2581 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2582 $edit_identity = 'true';
2583 $edit_name = 'true';
2584 $edit_reply_to = 'true';
2585 $hide_auth_header = command311c
();
2587 $edit_identity = 'false';
2588 $edit_name = command311
();
2589 $edit_reply_to = command311b
();
2590 $hide_auth_header = command311c
();
2592 return $edit_identity;
2597 print "\n Given that users are not allowed to modify their
2598 email address, can they edit their full name?
2602 if ( lc($edit_name) eq 'true' ) {
2603 $default_value = "y";
2605 $default_value = "n";
2607 print "Allow the user to edit their full name? (y/n) [$WHT$default_value$NRM]: $WHT";
2608 $new_edit = <STDIN
>;
2609 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2610 $edit_name = 'true';
2612 $edit_name = 'false';
2619 print "\n Given that users are not allowed to modify their
2620 email address, can they edit their reply-to address?
2624 if ( lc($edit_reply_to) eq 'true' ) {
2625 $default_value = "y";
2627 $default_value = "n";
2629 print "Allow the user to edit their reply-to address? (y/n) [$WHT$default_value$NRM]: $WHT";
2630 $new_edit = <STDIN
>;
2631 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2632 $edit_reply_to = 'true';
2634 $edit_reply_to = 'false';
2636 return $edit_reply_to;
2641 print "\n SquirrelMail adds username information to every outgoing email in
2642 order to prevent possible sender forging by users that are allowed
2643 to change their email and/or full name.
2645 You can remove user information from this header (y) if you think
2646 that it violates privacy or security.
2648 Note: If users are allowed to change their email addresses, this
2649 setting will make it difficult to determine who sent what where.
2650 Use at your own risk.
2652 Note: If you have defined a header encryption key in your SMTP or
2653 Sendmail settings (see the \"Server Settings\" option page), this
2654 setting is ignored because all user information in outgoing messages
2659 if ( lc($hide_auth_header) eq "true" ) {
2660 $default_value = "y";
2662 $default_value = "n";
2664 print "Remove username from email headers? (y/n) [$WHT$default_value$NRM]: $WHT";
2665 $new_header = <STDIN
>;
2666 if ( ( $new_header =~ /^y\n/i ) || ( ( $new_header =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2667 $hide_auth_header = "true";
2669 $hide_auth_header = "false";
2671 return $hide_auth_header;
2675 print "This option allows you to disable server side thread sorting if your server \n";
2676 print "declares THREAD support, but you don't want to provide threading options \n";
2677 print "to end users or THREAD extension is broken or extension does not work with \n";
2678 print "options used by SquirrelMail. Option is not used, if THREAD extension is \n";
2679 print "not declared in IMAP CAPABILITY.\n";
2682 if ( lc($disable_thread_sort) eq 'true' ) {
2683 $default_value = "y";
2685 $default_value = "n";
2687 print "Disable server side thread sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2688 $disable_thread_sort = <STDIN
>;
2689 if ( ( $disable_thread_sort =~ /^y\n/i ) || ( ( $disable_thread_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2690 $disable_thread_sort = 'true';
2692 $disable_thread_sort = 'false';
2694 return $disable_thread_sort;
2698 print "This option allows you to disable server side sorting if your server declares \n";
2699 print "SORT support, but SORT extension is broken or does not work with options \n";
2700 print "used by SquirrelMail. Option is not used, if SORT extension is not declared \n";
2701 print "in IMAP CAPABILITY.\n";
2703 print "It is strongly recommended to keep server side sorting enabled, if your ";
2704 print "IMAP server supports it.";
2707 if ( lc($disable_server_sort) eq 'true' ) {
2708 $default_value = "y";
2710 $default_value = "n";
2712 print "Disable server-side sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2713 $disable_server_sort = <STDIN
>;
2714 if ( ( $disable_server_sort =~ /^y\n/i ) || ( ( $disable_server_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2715 $disable_server_sort = 'true';
2717 $disable_server_sort = 'false';
2719 return $disable_server_sort;
2723 print "This option allows you to choose if SM uses charset search\n";
2724 print "Your IMAP server must support the SEARCH CHARSET command for this to work\n";
2727 if ( lc($allow_charset_search) eq 'true' ) {
2728 $default_value = "y";
2730 $default_value = "n";
2732 print "Allow charset searching? (y/n) [$WHT$default_value$NRM]: $WHT";
2733 $allow_charset_search = <STDIN
>;
2734 if ( ( $allow_charset_search =~ /^y\n/i ) || ( ( $allow_charset_search =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2735 $allow_charset_search = 'true';
2737 $allow_charset_search = 'false';
2739 return $allow_charset_search;
2742 # command315 (UID support) obsoleted.
2744 # advanced search option
2746 print "This option allows you to control the use of advanced search form.\n";
2747 print " 0 = enable basic search only\n";
2748 print " 1 = enable advanced search only\n";
2749 print " 2 = enable both\n";
2752 print "Allowed search (0,1,2)? [$WHT$allow_advanced_search$NRM]: $WHT";
2753 $new_allow_advanced_search = <STDIN
>;
2754 if ( $new_allow_advanced_search =~ /^[012]\n/i ) {
2755 $allow_advanced_search = $new_allow_advanced_search;
2757 $allow_advanced_search =~ s/[\r\n]//g;
2758 return $allow_advanced_search;
2763 print "This option allows you to change the name of the PHP session used\n";
2764 print "by SquirrelMail. Unless you know what you are doing, you probably\n";
2765 print "don't need or want to change this from the default of SQMSESSID.\n";
2766 print "[$WHT$session_name$NRM]: $WHT";
2767 $new_session_name = <STDIN
>;
2768 chomp($new_session_name);
2769 if ( $new_session_name eq "" ) {
2770 $new_session_name = $session_name;
2772 return $new_session_name;
2775 # time zone config (since 1.5.1)
2777 print "This option allows you to control the use of time zones.\n";
2778 print " 0 = (default) standard, GNU C time zone names\n";
2779 print " 1 = strict, generic time zone codes with offsets\n";
2780 print " 2 = custom, GNU C time zones loaded from config/timezones.php\n";
2781 print " 3 = custom strict, generic time zone codes with offsets loaded \n";
2782 print " from config/timezones.php\n";
2783 print "See SquirrelMail documentation about format of config/timezones.php file.\n";
2786 print "Desired time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT";
2787 $new_time_zone_type = <STDIN
>;
2788 if ( $new_time_zone_type =~ /^[0123]\n/i ) {
2789 $time_zone_type = $new_time_zone_type;
2791 print "\nInvalid configuration value.\n";
2792 print "\nPress enter to continue...";
2795 $time_zone_type =~ s/[\r\n]//g;
2796 return $time_zone_type;
2799 # set the location base for redirects (since 1.5.2)
2800 sub command_config_location_base
{
2801 print "Here you can set the base part of the SquirrelMail URL.\n";
2802 print "It is normally autodetected but if that fails, use this\n";
2803 print "option to override.\n";
2804 print "It should contain only the protocol and hostname/port parts\n";
2805 print "of the URL; the full path will be appended automatically.\n\n";
2806 print "Examples:\nhttp://webmail.example.org\nhttp://webmail.example.com:8080\nhttps://webmail.example.com:6691\n\n";
2807 print "Do not add any path elements.\n";
2809 print "URL base? [" .$WHT."autodetect$NRM]: $WHT";
2810 $new_config_location_base = <STDIN
>;
2811 chomp($new_config_location_base);
2812 $config_location_base = $new_config_location_base;
2814 return $config_location_base;
2817 # only_secure_cookies (since 1.5.2)
2819 print "This option allows you to specify that if a user session is initiated\n";
2820 print "under a secure (HTTPS, SSL-encrypted) connection, the cookies given to\n";
2821 print "the browser will ONLY be transmitted via a secure connection henceforth.\n\n";
2822 print "Generally this is a Good Thing, and should NOT be disabled. However,\n";
2823 print "if you intend to use the Secure Login or Show SSL Link plugins to\n";
2824 print "encrypt the user login, but not the rest of the SquirrelMail session,\n";
2825 print "this can be turned off. Think twice before doing so.\n";
2828 if ( lc($only_secure_cookies) eq 'true' ) {
2829 $default_value = "y";
2831 $default_value = "n";
2833 print "Transmit cookies only on secure connection when available? (y/n) [$WHT$default_value$NRM]: $WHT";
2834 $only_secure_cookies = <STDIN
>;
2835 if ( ( $only_secure_cookies =~ /^y\n/i ) || ( ( $only_secure_cookies =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2836 $only_secure_cookies = 'true';
2838 $only_secure_cookies = 'false';
2840 return $only_secure_cookies;
2844 # disable_security_tokens (since 1.5.2)
2846 print "This option allows you to turn off the security checks in the forms\n";
2847 print "that SquirrelMail generates. It is NOT RECOMMENDED that you disable\n";
2848 print "this feature - otherwise, your users may be exposed to phishing and\n";
2849 print "other attacks.\n";
2850 print "Unless you know what you are doing, you should leave this set to \"NO\".\n";
2853 if ( lc($disable_security_tokens) eq 'true' ) {
2854 $default_value = "y";
2856 $default_value = "n";
2858 print "Disable secure forms? (y/n) [$WHT$default_value$NRM]: $WHT";
2859 $disable_security_tokens = <STDIN
>;
2860 if ( ( $disable_security_tokens =~ /^y\n/i ) || ( ( $disable_security_tokens =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2861 $disable_security_tokens = 'true';
2863 $disable_security_tokens = 'false';
2865 return $disable_security_tokens;
2870 # check_referrer (since 1.5.2)
2872 print "This option allows you to enable referal checks for all page requests\n";
2873 print "made to SquirrelMail. This can help ensure that page requests came\n";
2874 print "from the same server and not from an attacker's site (usually the\n";
2875 print "result of a XSS or phishing attack). To enable referal checking,\n";
2876 print "this setting can be set to the domain where your SquirrelMail is\n";
2877 print "being hosted (usually the same as the Domain setting under Server\n";
2878 print "Settings). For example, it could be \"example.com\", or if you\n";
2879 print "use a plugin (such as Login Manager) to host SquirrelMail on more\n";
2880 print "than one domain, you can set this to \"###DOMAIN###\" to tell it\n";
2881 print "to use the current domain.\n";
2883 print "However, in some cases (where proxy servers are in use, etc.), the\n";
2884 print "domain might be different.\n";
2886 print "NOTE that referal checks are not foolproof - they can be spoofed by\n";
2887 print "browsers, and some browsers intentionally don't send referal\n";
2888 print "information (in which case, the check is silently bypassed)\n";
2891 print "Referal requirement? [$WHT$check_referrer$NRM]: $WHT";
2892 $new_check_referrer = <STDIN
>;
2893 chomp($new_check_referrer);
2894 $check_referrer = $new_check_referrer;
2896 return $check_referrer;
2901 # use_transparent_security_image (since 1.5.2)
2903 print "When HTML messages are being displayed, SquirrelMail's default behavior\n";
2904 print "is to remove all remote images and replace them with a local one.\n";
2906 print "This option allows you to specify whether the local image should contain\n";
2907 print "text that indicates to the user that \"this image has been removed for\n";
2908 print "security reasons\" (translated into most languages), or if it should be\n";
2909 print "transparent.\n";
2912 if ( lc($use_transparent_security_image) eq 'true' ) {
2913 $default_value = "y";
2915 $default_value = "n";
2917 print "Use transparent security image? (y/n) [$WHT$default_value$NRM]: $WHT";
2918 $use_transparent_security_image = <STDIN
>;
2919 if ( ( $use_transparent_security_image =~ /^y\n/i ) || ( ( $use_transparent_security_image =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2920 $use_transparent_security_image = 'true';
2922 $use_transparent_security_image = 'false';
2924 return $use_transparent_security_image;
2929 # display_imap_login_error (since 1.5.2)
2931 print "Some IMAP servers return detailed information about why a login is\n";
2932 print "being refused (the username or password could be invalid or there\n";
2933 print "might be an administrative lock on the account).\n";
2935 print "Enabling this option will cause SquirrelMail to display login failure\n";
2936 print "messages directly from the IMAP server. When it is disabled, login\n";
2937 print "failures are always reported to the user with the traditional \"Unknown\n";
2938 print "user or password incorrect.\"\n";
2941 if ( lc($display_imap_login_error) eq 'true' ) {
2942 $default_value = "y";
2944 $default_value = "n";
2946 print "Display login error messages directly from the IMAP server? (y/n) [$WHT$default_value$NRM]: $WHT";
2947 $display_imap_login_error = <STDIN
>;
2948 if ( ( $display_imap_login_error =~ /^y\n/i ) || ( ( $display_imap_login_error =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2949 $display_imap_login_error = 'true';
2951 $display_imap_login_error = 'false';
2953 return $display_imap_login_error;
2958 sub command_userThemes
{
2959 print "\nDefine the user themes that you wish to use. If you have added\n";
2960 print "a theme of your own, just follow the instructions (?) about\n";
2961 print "how to add them. You can also change the default theme.\n\n";
2963 print "Available user themes:\n";
2965 while ( $count <= $#user_theme_name ) {
2966 if ( $count == $user_theme_default ) {
2971 if ( $count < 10 ) {
2974 $name = $user_theme_name[$count];
2975 $num_spaces = 35 - length($name);
2976 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2977 $name = $name . " ";
2980 print " $count. $name";
2981 print "($user_theme_path[$count])\n";
2987 print ".------------------------------------.\n";
2988 print "| t (detect user themes) |\n";
2989 print "| + (add user theme) |\n";
2990 print "| - N (remove user theme) |\n";
2991 print "| m N (mark default user theme) |\n";
2992 print "| l (list user themes) |\n";
2993 print "| d (done) |\n";
2994 print "`------------------------------------'\n";
2996 print "\n[user_themes] command (?=help) > ";
2998 $input =~ s/[\r\n]//g;
2999 while ( $input ne "d" ) {
3000 if ( $input =~ /^\s*l\s*/i ) {
3002 while ( $count <= $#user_theme_name ) {
3003 if ( $count == $user_theme_default ) {
3008 if ( $count < 10 ) {
3011 $name = $user_theme_name[$count];
3012 $num_spaces = 35 - length($name);
3013 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3014 $name = $name . " ";
3017 print " $count. $name";
3018 print "($user_theme_path[$count])\n";
3022 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
3023 $old_def = $user_theme_default;
3024 $user_theme_default = $input;
3025 $user_theme_default =~ s/^\s*m\s*//;
3026 if ( ( $user_theme_default > $#user_theme_name ) || ( $user_theme_default < 0 ) ) {
3027 print "Cannot set default theme to $user_theme_default. That theme does not exist.\n";
3028 $user_theme_default = $old_def;
3030 } elsif ( $input =~ /^\s*\+/ ) {
3031 print "What is the name of this theme? ";
3033 $name =~ s/[\r\n]//g;
3034 $user_theme_name[ $#user_theme_name + 1 ] = $name;
3035 print "Be sure to put ../css/ before the filename.\n";
3036 print "What file is this stored in (ex: ../css/my_theme/): ";
3038 $name =~ s/[\r\n]//g;
3039 $user_theme_path[ $#user_theme_path + 1 ] = $name;
3040 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
3041 if ( $input =~ /[0-9]+\s*$/ ) {
3043 $rem_num =~ s/^\s*-\s*//g;
3044 $rem_num =~ s/\s*$//;
3046 $rem_num = $#user_theme_name;
3048 if ( $rem_num == $user_theme_default ) {
3049 print "You cannot remove the default theme!\n";
3052 @new_theme_name = ();
3053 @new_theme_path = ();
3054 while ( $count <= $#user_theme_name ) {
3055 if ( $count != $rem_num ) {
3056 @new_theme_name = ( @new_theme_name, $user_theme_name[$count] );
3057 @new_theme_path = ( @new_theme_path, $user_theme_path[$count] );
3061 @user_theme_name = @new_theme_name;
3062 @user_theme_path = @new_theme_path;
3063 if ( $user_theme_default > $rem_num ) {
3064 $user_theme_default--;
3067 } elsif ( $input =~ /^\s*t\s*/i ) {
3068 print "\nStarting detection...\n\n";
3070 opendir( DIR
, "../css" );
3071 @files = sort(readdir(DIR
));
3073 while ( $cnt <= $#files ) {
3074 $filename = "../css/" . $files[$cnt] .'/';
3075 if ( $files[$cnt] !~ /^\./ && $filename ne "../css/rtl.css" && -e
$filename . "default.css" ) {
3077 for ( $x = 0 ; $x <= $#user_theme_path ; $x++ ) {
3078 if ( $user_theme_path[$x] eq $filename ) {
3082 if ( $found != 1 ) {
3083 print "** Found user theme: $filename\n";
3084 $def = $files[$cnt];
3087 #$def =~ s/(^\w+)/ucfirst $1/eg;
3088 #$def =~ s/(\s+)(\w+)/$1 . ucfirst $2/eg;
3089 $def =~ s/(^\w+)|(\s+)(\w+)/ucfirst $1 . $2 . ucfirst $3/eg;
3090 print " What is its name? [$def]: ";
3092 $nm =~ s/^\s+|\s+$|[\n\r]//g;
3093 if ( $nm eq '' ) { $nm = $def; }
3094 $user_theme_name[ $#user_theme_name + 1 ] = $nm;
3095 $user_theme_path[ $#user_theme_path + 1 ] = $filename;
3101 for ( $cnt = 0 ; $cnt <= $#user_theme_path ; $cnt++ ) {
3102 $filename = $user_theme_path[$cnt];
3103 if ( $filename != 'none' && !( -e
$filename ."/default.css" ) ) {
3104 print " Removing $filename (file not found)\n";
3106 @new_user_theme_name = ();
3107 @new_user_theme_path = ();
3108 for ( $x = 0 ; $x < $#user_theme_path ; $x++ ) {
3109 if ( $user_theme_path[$x] eq $filename ) {
3112 if ( $offset == 1 ) {
3113 $new_user_theme_name[$x] = $user_theme_name[ $x + 1 ];
3114 $new_user_theme_path[$x] = $user_theme_path[ $x + 1 ];
3116 $new_user_theme_name[$x] = $user_theme_name[$x];
3117 $new_user_theme_path[$x] = $user_theme_path[$x];
3120 @user_theme_name = @new_user_theme_name;
3121 @user_theme_path = @new_user_theme_path;
3124 print "\nDetection complete!\n\n";
3127 } elsif ( $input =~ /^\s*\?\s*/ ) {
3128 print ".------------------------------------.\n";
3129 print "| t (detect user themes) |\n";
3130 print "| + (add user theme) |\n";
3131 print "| - N (remove user theme) |\n";
3132 print "| m N (mark default user theme) |\n";
3133 print "| l (list user themes) |\n";
3134 print "| d (done) |\n";
3135 print "`------------------------------------'\n";
3137 print "[user_themes] command (?=help) > ";
3139 $input =~ s/[\r\n]//g;
3143 sub command_iconSets
{
3144 print "\nDefine the icon themes that you wish to use. If you have added\n";
3145 print "a theme of your own, just follow the instructions (?) about\n";
3146 print "how to add them. You can also change the default and fallback\n";
3147 print "themes. The default theme will be used when no icon theme is\n";
3148 print "set by the user. The fallback theme will be used if an icon\n";
3149 print "cannot be found in the currently selected icon theme.\n\n";
3151 print "Available icon themes:\n\n";
3154 while ( $count <= $#icon_theme_name ) {
3155 if ( $count == $icon_theme_def ) {
3160 if ( $count eq $icon_theme_fallback ) {
3165 if ( $count < 10 ) {
3168 $name = $icon_theme_name[$count];
3169 $num_spaces = 35 - length($name);
3170 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3171 $name = $name . " ";
3174 print " $count. $name";
3175 print "($icon_theme_path[$count])\n";
3180 print "\n d = Default icon theme\n";
3181 print " f = Fallback icon theme\n";
3183 print ".------------------------------------.\n";
3184 print "| t (detect icon themes) |\n";
3185 print "| + (add icon theme) |\n";
3186 print "| - N (remove icon theme) |\n";
3187 print "| m N (mark default icon theme) |\n";
3188 print "| f N (set fallback icon set) |\n";
3189 print "| l (list icon themes) |\n";
3190 print "| d (done) |\n";
3191 print "`------------------------------------'\n";
3193 print "\n[icon_themes] command (?=help) > ";
3195 $input =~ s/[\r\n]//g;
3196 while ( $input ne "d" ) {
3197 if ( $input =~ /^\s*l\s*/i ) {
3200 while ( $count <= $#icon_theme_name ) {
3201 if ( $count == $icon_theme_def ) {
3206 if ( $count eq $icon_theme_fallback ) {
3211 $name = $icon_theme_name[$count];
3212 $num_spaces = 35 - length($name);
3213 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3214 $name = $name . " ";
3217 print " $count. $name";
3218 print "($icon_theme_path[$count])\n";
3222 print "\n d = Default icon theme\n";
3223 print " f = Fallback icon theme\n\n";
3224 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
3225 $old_def = $icon_theme_def;
3226 $icon_theme_def = $input;
3227 $icon_theme_def =~ s/^\s*m\s*//;
3228 if ( ( $icon_theme_default > $#icon_theme_name ) || ( $icon_theme_default < 0 ) ) {
3229 print "Cannot set default icon theme to $icon_theme_default. That theme does not exist.\n";
3230 $icon_theme_def = $old_def;
3232 } elsif ( $input =~ /^\s*f\s*[0-9]+/i ) {
3233 $old_fb = $icon_theme_fallback;
3234 $icon_theme_fallback = $input;
3235 $icon_theme_fallback =~ s/^\s*f\s*//;
3236 if ( ( $icon_theme_fallback > $#icon_theme_name ) || ( $icon_theme_fallback < 0 ) ) {
3237 print "Cannot set fallback icon theme to $icon_theme_fallback. That theme does not exist.\n";
3238 $icon_theme_fallback = $old_fb;
3240 } elsif ( $input =~ /^\s*\+/ ) {
3241 print "What is the name of this icon theme? ";
3243 $name =~ s/[\r\n]//g;
3244 $icon_theme_name[ $#icon_theme_name + 1 ] = $name;
3245 print "Be sure to put ../images/themes/ before the filename.\n";
3246 print "What directory is this icon theme stored in (ex: ../images/themes/my_theme/)? ";
3248 $name =~ s/[\r\n]//g;
3249 $icon_theme_path[ $#icon_theme_path + 1 ] = $name;
3250 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
3251 if ( $input =~ /[0-9]+\s*$/ ) {
3253 $rem_num =~ s/^\s*-\s*//g;
3254 $rem_num =~ s/\s*$//;
3256 $rem_num = $#icon_theme_name;
3258 if ( $rem_num == $icon_theme_def ) {
3259 print "You cannot remove the default icon theme!\n";
3260 } elsif ( $rem_num == $icon_theme_fallback ) {
3261 print "You cannot remove the fallback icon theme!\n";
3264 @new_theme_name = ();
3265 @new_theme_path = ();
3266 while ( $count <= $#icon_theme_name ) {
3267 if ( $count != $rem_num ) {
3268 @new_theme_name = ( @new_theme_name, $icon_theme_name[$count] );
3269 @new_theme_path = ( @new_theme_path, $icon_theme_path[$count] );
3273 @icon_theme_name = @new_theme_name;
3274 @icon_theme_path = @new_theme_path;
3275 if ( $icon_theme_def > $rem_num ) {
3279 } elsif ( $input =~ /^\s*t\s*/i ) {
3280 print "\nStarting detection...\n\n";
3282 opendir( DIR
, "../images/themes/" );
3283 @files = sort(readdir(DIR
));
3285 while ( $cnt <= $#files ) {
3286 $filename = "../images/themes/" . $files[$cnt] .'/';
3287 if ( -d
"../images/themes/" . $files[$cnt] && $files[$cnt] !~ /^\
./ && $files[$cnt] ne ".svn" ) {
3289 for ( $x = 0 ; $x <= $#icon_theme_path ; $x++ ) {
3290 if ( $icon_theme_path[$x] eq $filename ) {
3294 if ( $found != 1 ) {
3295 print "** Found icon theme: $filename\n";
3296 $def = $files[$cnt];
3299 #$def =~ s/(^\w+)/ucfirst $1/eg;
3300 #$def =~ s/(\s+)(\w+)/$1 . ucfirst $2/eg;
3301 $def =~ s/(^\w+)|(\s+)(\w+)/ucfirst $1 . $2 . ucfirst $3/eg;
3302 print " What is its name? [$def]: ";
3304 $nm =~ s/^\s+|\s+$|[\n\r]//g;
3305 if ( $nm eq '' ) { $nm = $def; }
3306 $icon_theme_name[ $#icon_theme_name + 1 ] = $nm;
3307 $icon_theme_path[ $#icon_theme_path + 1 ] = $filename;
3313 for ( $cnt = 0 ; $cnt <= $#icon_theme_path ; $cnt++ ) {
3314 $filename = $icon_theme_path[$cnt];
3315 if ( $filename ne "none" && $filename ne "template" && ! -d
$filename ) {
3316 print " Removing $filename (file not found)\n";
3318 @new_icon_theme_name = ();
3319 @new_icon_theme_path = ();
3320 for ( $x = 0 ; $x < $#icon_theme_path ; $x++ ) {
3321 if ( $icon_theme_path[$x] eq $filename ) {
3324 if ( $offset == 1 ) {
3325 $new_icon_theme_name[$x] = $icon_theme_name[ $x + 1 ];
3326 $new_icon_theme_path[$x] = $icon_theme_path[ $x + 1 ];
3328 $new_icon_theme_name[$x] = $icon_theme_name[$x];
3329 $new_icon_theme_path[$x] = $icon_theme_path[$x];
3332 @icon_theme_name = @new_icon_theme_name;
3333 @icon_theme_path = @new_icon_theme_path;
3336 print "\nDetection complete!\n\n";
3339 } elsif ( $input =~ /^\s*\?\s*/ ) {
3340 print ".------------------------------------.\n";
3341 print "| t (detect icon themes) |\n";
3342 print "| + (add icon theme) |\n";
3343 print "| - N (remove icon theme) |\n";
3344 print "| m N (mark default icon theme) |\n";
3345 print "| f N (set fallback icon set) |\n";
3346 print "| l (list icon themes) |\n";
3347 print "| d (done) |\n";
3348 print "`------------------------------------'\n";
3350 print "[icon_themes] command (?=help) > ";
3352 $input =~ s/[\r\n]//g;
3356 sub command_templates
{
3357 print "\nDefine the template sets (skins) that you wish to use. If you have added\n";
3358 print "a template set of your own, just follow the instructions (?) about\n";
3359 print "how to add them. You can also change the default template.\n";
3361 print "\n Available Templates:\n";
3364 while ( $count <= $#templateset_name ) {
3365 if ( $templateset_id[$count] eq $templateset_default ) {
3370 if ( $templateset_id[$count] eq $templateset_fallback ) {
3375 if ( $templateset_id[$count] eq $rpc_templateset ) {
3380 if ( $count < 10 ) {
3383 if ( $count < 100 ) {
3386 $name = $templateset_name[$count];
3388 # present RPC template sets differently
3390 if ( $templateset_id[$count] =~ /_rpc$/ ) {
3391 $name = $name . " (not shown in user interface; used for RPC interface only)";
3394 $num_spaces = 35 - length($name);
3395 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3396 $name = $name . " ";
3398 $name = $name . "($templateset_id[$count])";
3402 print " $count. $name\n";
3406 print "\n d = default template set\n"
3407 . " f = fallback template set\n"
3408 . " r = RPC template set\n\n";
3410 $menu_text = ".-------------------------------------.\n"
3411 . "| t (detect template set) |\n"
3412 . "| + (add template set) |\n"
3413 . "| - N (remove template set) |\n"
3414 . "| m N (mark default template set) |\n"
3415 . "| f N (set fallback template set) |\n"
3416 . "| r N (set RPC template set) |\n"
3417 . "| l (list template sets/skins) |\n"
3419 . "|-------------------------------------|\n"
3420 . "| where N is a template set number |\n"
3421 . "`-------------------------------------'\n";
3424 print "\n[template set] command (?=help) > ";
3427 $input =~ s/[\r\n]//g;
3428 while ( $input ne "d" ) {
3430 # list template sets
3432 if ( $input =~ /^\s*l\s*/i ) {
3434 while ( $count <= $#templateset_name ) {
3435 if ( $templateset_id[$count] eq $templateset_default ) {
3440 if ( $templateset_id[$count] eq $templateset_fallback ) {
3445 if ( $templateset_id[$count] eq $rpc_templateset ) {
3450 if ( $count < 10 ) {
3453 if ( $count < 100 ) {
3456 $name = $templateset_name[$count];
3458 # present RPC template sets differently
3460 if ( $templateset_id[$count] =~ /_rpc$/ ) {
3461 $name = $name . " (not shown in user interface; used for RPC interface only)";
3464 $num_spaces = 35 - length($name);
3465 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3466 $name = $name . " ";
3468 $name = $name . "($templateset_id[$count])";
3472 print " $count. $name\n";
3476 print "\n d = default template set\n"
3477 . " f = fallback template set\n"
3478 . " r = RPC template set\n\n";
3480 # mark default template set
3482 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
3483 $old_def = $templateset_default;
3484 $input =~ s/^\s*m\s*//;
3485 $templateset_default = $templateset_id[$input];
3486 if ( $templateset_default =~ /^\s*$/ ) {
3487 print "Cannot set default template set to $input. That template set does not exist.\n";
3488 $templateset_default = $old_def;
3490 if ( $templateset_default =~ /_rpc$/ ) {
3491 print "Cannot set default template set to $input. That template set is intended for the RPC interface only.\n";
3492 $templateset_default = $old_def;
3495 # set fallback template set
3497 } elsif ( $input =~ /^\s*f\s*[0-9]+/i ) {
3498 $old_def = $templateset_fallback;
3499 $input =~ s/^\s*f\s*//;
3500 $templateset_fallback = $templateset_id[$input];
3501 if ( $templateset_fallback =~ /^\s*$/ ) {
3502 print "Cannot set fallback template set to $input. That template set does not exist.\n";
3503 $templateset_fallback = $old_def;
3505 if ( $templateset_fallback =~ /_rpc$/ ) {
3506 print "Cannot set fallback template set to $input. That template set is intended for the RPC interface only.\n";
3507 $templateset_fallback = $old_def;
3510 # set RPC template set
3512 } elsif ( $input =~ /^\s*r\s*[0-9]+/i ) {
3513 $old_def = $rpc_templateset;
3514 $input =~ s/^\s*r\s*//;
3515 $rpc_templateset = $templateset_id[$input];
3516 if ( $rpc_templateset =~ /^\s*$/ ) {
3517 print "Cannot set RPC template set to $input. That template set does not exist.\n";
3518 $rpc_templateset = $old_def;
3520 if ( $rpc_templateset !~ /_rpc$/ ) {
3521 print "Cannot set fallback template set to $input. That template set is not intended for the RPC interface.\n";
3522 $rpc_templateset = $old_def;
3527 } elsif ( $input =~ /^\s*\+/ ) {
3528 print "\nWhat is the name of this template (as shown to your users): ";
3530 $name =~ s/[\r\n]//g;
3531 $templateset_name[ $#templateset_name + 1 ] = $name;
3532 print "\n\nThe directory name should not contain any path information\n"
3533 . "or slashes, and should be the name of the directory that the\n"
3534 . "template set is found in within the SquirrelMail templates\n"
3536 print "What directory is this stored in (ex: default_advanced): ";
3538 $name =~ s/[\r\n]//g;
3539 $templateset_id[ $#templateset_id + 1 ] = $name;
3541 # detect template sets
3543 } elsif ( $input =~ /^\s*t\s*/i ) {
3544 print "\nStarting detection...\n\n";
3545 opendir( DIR
, "../templates" );
3546 @files = sort(readdir(DIR
));
3548 while ( $cnt <= $#files ) {
3549 if ( -d
"../templates/" . $files[$cnt] && $files[$cnt] !~ /^\./ && $files[$cnt] ne ".svn" ) {
3550 $filename = $files[$cnt];
3552 for ( $x = 0 ; $x <= $#templateset_id ; $x++ ) {
3553 if ( $templateset_id[$x] eq $filename ) {
3559 print "** Found template set: $filename\n";
3560 $def = $files[$cnt];
3562 # no user-friendly names needed for RPC template sets
3564 if ( $def =~ /_rpc$/ ) {
3569 #$def =~ s/(^\w+)/ucfirst $1/eg;
3570 #$def =~ s/(\s+)(\w+)/$1 . ucfirst $2/eg;
3571 $def =~ s/(^\w+)|(\s+)(\w+)/ucfirst $1 . $2 . ucfirst $3/eg;
3572 print " What is it's name (as shown to your users)? [$def]: ";
3574 $nm =~ s/^\s+|\s+$|[\n\r]//g;
3575 if ( $nm eq '' ) { $nm = $def; }
3577 $templateset_id[ $#templateset_id + 1 ] = $filename;
3578 $templateset_name[ $#templateset_name + 1 ] = $nm;
3584 for ( $cnt= 0 ; $cnt <= $#templateset_id ; ) {
3585 $filename = $templateset_id[$cnt];
3586 if ( !(-d change_to_rel_path
('SM_PATH . \'templates/' . $filename)) ) {
3587 print " Removing \"$filename\" (template set directory not found)\n";
3588 if ( $templateset_default eq $filename ) { $templateset_default = 'default'; }
3589 if ( $templateset_fallback eq $filename ) { $templateset_fallback = 'default'; }
3590 if ( $rpc_templateset eq $filename ) { $rpc_templateset = 'default_rpc'; }
3592 @new_templateset_name = ();
3593 @new_templateset_id = ();
3594 for ( $x = 0 ; $x < $#templateset_id ; $x++ ) {
3595 if ( $templateset_id[$x] eq $filename ) {
3598 if ( $offset == 1 ) {
3599 $new_templateset_name[$x] = $templateset_name[ $x + 1 ];
3600 $new_templateset_id[$x] = $templateset_id[ $x + 1 ];
3602 $new_templateset_name[$x] = $templateset_name[$x];
3603 $new_templateset_id[$x] = $templateset_id[$x];
3606 @templateset_name = @new_templateset_name;
3607 @templateset_id = @new_templateset_id;
3610 print "\nDetection complete!\n\n";
3614 # remove template set
3616 # undocumented functionality of removing last template set isn't that great
3617 #} elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
3618 } elsif ( $input =~ /^\s*-\s*[0-9]+/ ) {
3619 if ( $input =~ /[0-9]+\s*$/ ) {
3621 $rem_num =~ s/^\s*-\s*//g;
3622 $rem_num =~ s/\s*$//;
3624 $rem_num = $#templateset_name;
3626 if ( $templateset_id[$rem_num] eq $templateset_default ) {
3627 print "You cannot remove the default template set!\n";
3628 } elsif ( $templateset_id[$rem_num] eq $templateset_fallback ) {
3629 print "You cannot remove the fallback template set!\n";
3630 } elsif ( $templateset_id[$rem_num] eq $rpc_templateset ) {
3631 print "You cannot remove the RPC template set!\n";
3634 @new_templateset_name = ();
3635 @new_templateset_id = ();
3636 while ( $count <= $#templateset_name ) {
3637 if ( $count != $rem_num ) {
3638 @new_templateset_name = ( @new_templateset_name, $templateset_name[$count] );
3639 @new_templateset_id = ( @new_templateset_id, $templateset_id[$count] );
3643 @templateset_name = @new_templateset_name;
3644 @templateset_id = @new_templateset_id;
3649 } elsif ( $input =~ /^\s*\?\s*/ ) {
3652 # command not understood
3655 print "Command not understood\n";
3658 print "[template set] command (?=help) > ";
3660 $input =~ s/[\r\n]//g;
3662 return $templateset_default;
3666 # sets default font size option
3667 sub command_default_fontsize
{
3668 print "Enter default font size [$WHT$$default_fontsize$NRM]: $WHT";
3669 $new_size = <STDIN
>;
3670 if ( $new_size eq "\n" ) {
3673 $new_size =~ s/[\r\n]//g;
3678 # controls available fontsets
3679 sub command_fontsets
{
3681 print "You can control fontsets available to end users here.\n";
3682 # set initial $input value
3684 while ( $input ne "x" ) {
3685 if ( $input =~ /^\s*a\s*/i ) {
3687 print "\nFontset name: ";
3689 if (! $fontsets{trim
($name)}) {
3690 print "Fontset string: ";
3692 $fontsets{trim
($name)} = trim
($value);
3694 print "\nERROR: Such fontset already exists.\n";
3696 } elsif ( $input =~ /^\s*e\s*/i ) {
3697 # edit existing fontset
3698 print "\nFontset name: ";
3700 if (! $fontsets{trim
($name)}) {
3701 print "\nERROR: No such fontset.\n";
3703 print "Fontset string [$fontsets{trim($name)}]: ";
3705 $fontsets{trim
($name)} = trim
($value);
3707 } elsif ( $input =~ /^\s*d\s*/ ) {
3708 # delete existing fontset
3709 print "\nFontset name: ";
3711 if (! $fontsets{trim
($name)}) {
3712 print "\nERROR: No such fontset.\n";
3714 delete $fontsets{trim
($name)};
3716 } elsif ( $input =~ /^\s*l\s*/ ) {
3718 print "\nConfigured fontsets:\n";
3719 while (($fontset_name, $fontset_string) = each(%fontsets)) {
3720 print " $fontset_name = $fontset_string\n";
3722 print "Default fontset: $default_fontset\n";
3723 } elsif ( $input =~ /^\s*m\s*/ ) {
3724 # set default fontset
3725 print "\nSet default fontset [$default_fontset]: ";
3727 if (trim
($name) ne '' and ! $fontsets{trim
($name)}) {
3728 print "\nERROR: No such fontset.\n";
3730 $default_fontset = trim
($name);
3733 # print available commands on any other input
3734 print "\nAvailable commands:\n";
3735 print " a - Adds new fontset.\n";
3736 print " d - Deletes existing fontset.\n";
3737 print " e - Edits existing fontset.\n";
3738 print " h or ? - Shows this help screen.\n";
3739 print " l - Lists available fontsets.\n";
3740 print " m - Sets default fontset.\n";
3741 print " x - Exits fontset editor mode.\n";
3743 print "\nCommand [fontsets] (a,d,e,h,?=help,l,m,x)> ";
3745 $input =~ s/[\r\n]//g;
3750 print "You can now define different LDAP servers.\n";
3751 print "Please ensure proper permissions for config.php when including\n";
3752 print "sensitive passwords.\n\n";
3753 print "[ldap] command (?=help) > ";
3755 $input =~ s/[\r\n]//g;
3756 while ( $input ne "d" ) {
3757 if ( $input =~ /^\s*l\s*/i ) {
3759 while ( $count <= $#ldap_host ) {
3760 print "$count. $ldap_host[$count]\n";
3761 print " base: $ldap_base[$count]\n";
3762 if ( $ldap_charset[$count] ) {
3763 print " charset: $ldap_charset[$count]\n";
3765 if ( $ldap_port[$count] ) {
3766 print " port: $ldap_port[$count]\n";
3768 if ( $ldap_name[$count] ) {
3769 print " name: $ldap_name[$count]\n";
3771 if ( $ldap_maxrows[$count] ) {
3772 print " maxrows: $ldap_maxrows[$count]\n";
3774 if ( $ldap_filter[$count] ) {
3775 print " filter: $ldap_filter[$count]\n";
3777 if ( $ldap_binddn[$count] ) {
3778 print " binddn: $ldap_binddn[$count]\n";
3779 if ( $ldap_bindpw[$count] ) {
3780 print " bindpw: $ldap_bindpw[$count]\n";
3783 if ( $ldap_protocol[$count] ) {
3784 print " protocol: $ldap_protocol[$count]\n";
3786 if ( $ldap_limit_scope[$count] ) {
3787 print " limit_scope: $ldap_limit_scope[$count]\n";
3789 if ( $ldap_listing[$count] ) {
3790 print " listing: $ldap_listing[$count]\n";
3792 if ( $ldap_writeable[$count] ) {
3793 print " writeable: $ldap_writeable[$count]\n";
3795 if ( $ldap_search_tree[$count] ) {
3796 print " search_tree: $ldap_search_tree[$count]\n";
3798 if ( $ldap_starttls[$count] ) {
3799 print " starttls: $ldap_starttls[$count]\n";
3805 } elsif ( $input =~ /^\s*\+/ ) {
3806 $sub = $#ldap_host + 1;
3808 print "First, we need to have the hostname or the IP address where\n";
3809 print "this LDAP server resides. Example: ldap.bigfoot.com\n";
3811 print "You can use any URI compatible with your LDAP library. Please\n";
3812 print "note that StartTLS option is not compatible with ldaps and\n";
3813 print "ldapi URIs.\n";
3816 $name =~ s/[\r\n]//g;
3817 $ldap_host[$sub] = $name;
3821 print "Next, we need the server root (base dn). For this, an empty\n";
3822 print "string is allowed.\n";
3823 print "Example: ou=member_directory,o=netcenter.com\n";
3826 $name =~ s/[\r\n]//g;
3827 $ldap_base[$sub] = $name;
3831 print "This is the TCP/IP port number for the LDAP server. Default\n";
3832 print "port is 389. This is optional. Press ENTER for default.\n";
3835 $name =~ s/[\r\n]//g;
3836 $ldap_port[$sub] = $name;
3840 print "This is the charset for the server. Default is utf-8. This\n";
3841 print "is also optional. Press ENTER for default.\n";
3844 $name =~ s/[\r\n]//g;
3845 $ldap_charset[$sub] = $name;
3849 print "This is the name for the server, used to tag the results of\n";
3850 print "the search. Default it \"LDAP: hostname\". Press ENTER for default\n";
3853 $name =~ s/[\r\n]//g;
3854 $ldap_name[$sub] = $name;
3858 print "You can specify the maximum number of rows in the search result.\n";
3859 print "Default value is equal to 250 rows. Press ENTER for default.\n";
3862 $name =~ s/[\r\n]//g;
3863 $ldap_maxrows[$sub] = $name;
3868 print "If your LDAP server does not like anonymous logins, you can specify bind DN.\n";
3869 print "Default is none, anonymous bind. Press ENTER for default.\n";
3872 $name =~ s/[\r\n]//g;
3873 $ldap_binddn[$sub] = $name;
3877 if ( $ldap_binddn[$sub] ne '' ) {
3879 print "Now, please specify password for that DN.\n";
3882 $name =~ s/[\r\n]//g;
3883 $ldap_bindpw[$sub] = $name;
3888 print "You can specify bind protocol version here.\n";
3889 print "Default protocol version depends on your php ldap settings.\n";
3890 print "Press ENTER for default.\n";
3893 $name =~ s/[\r\n]//g;
3894 $ldap_protocol[$sub] = $name;
3898 print "This configuration section allows to set some rarely used\n";
3899 print "options and options specific to some LDAP implementations.\n";
3901 print "Do you want to set advanced LDAP directory settings? (y/N):";
3902 $ldap_advanced_settings = <STDIN
>;
3903 if ( $ldap_advanced_settings =~ /^y\n/i ) {
3904 $ldap_advanced_settings = 'true';
3906 $ldap_advanced_settings = 'false';
3909 if ($ldap_advanced_settings eq 'true') {
3912 print "You can control LDAP directory listing here. This option can\n";
3913 print "be useful if you run small LDAP server and want to provide listing\n";
3914 print "of all addresses stored in LDAP to users of webmail interface.\n";
3915 print "Number of displayed entries is limited by maxrows setting.\n";
3917 print "Don't enable this option for public LDAP directories.\n";
3919 print "Allow listing of LDAP directory? (y/N):";
3921 if ( $name =~ /^y\n/i ) {
3926 $ldap_listing[$sub] = $name;
3930 print "You can control write access to LDAP address book here. This option can\n";
3931 print "be useful if you run small LDAP server and want to provide writable\n";
3932 print "shared address book stored in LDAP to users of webmail interface.\n";
3934 print "Don't enable this option for public LDAP directories.\n";
3936 print "Allow writing to LDAP directory? (y/N):";
3938 if ( $name =~ /^y\n/i ) {
3943 $ldap_writeable[$sub] = $name;
3947 print "You can specify an additional search filter.\n";
3948 print "This could be something like \"(objectclass=posixAccount)\".\n";
3949 print "No filtering is performed by default. Press ENTER for default.\n";
3952 $name =~ s/[\r|\n]//g;
3953 $ldap_filter[$sub] = $name;
3957 print "You can control search scope here.\n";
3958 print "This option is specific to Microsoft ADS implementation.\n";
3959 print "It requires use of v3 or newer LDAP protocol.\n";
3960 print "Don't enable it, if you use other LDAP server.\n";
3962 print "Limit ldap scope? (y/N):";
3964 if ( $name =~ /^y\n/i ) {
3969 $ldap_limit_scope[$sub] = $name;
3973 print "You can control ldap search type here.\n";
3974 print "Addresses can be searched in entire LDAP subtree (default)\n";
3975 print "or only first level entries are returned.\n";
3977 print "Search entire LDAP subtree? (Y/n):";
3979 if ( $name =~ /^n\n/i ) {
3984 $ldap_search_tree[$sub] = $name;
3988 print "You can control use of StartTLS on LDAP connection here.\n";
3989 print "This option requires use of v3 or newer LDAP protocol and php 4.2+.\n";
3991 print "Use StartTLS? (y/N):";
3993 if ( $name =~ /^y\n/i ) {
3998 $ldap_starttls[$sub] = $name;
4002 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
4003 if ( $input =~ /[0-9]+\s*$/ ) {
4005 $rem_num =~ s/^\s*-\s*//g;
4006 $rem_num =~ s/\s*$//;
4008 $rem_num = $#ldap_host;
4011 @new_ldap_host = ();
4012 @new_ldap_base = ();
4013 @new_ldap_port = ();
4014 @new_ldap_name = ();
4015 @new_ldap_charset = ();
4016 @new_ldap_maxrows = ();
4017 @new_ldap_filter = ();
4018 @new_ldap_bindpw = ();
4019 @new_ldap_binddn = ();
4020 @new_ldap_protocol = ();
4021 @new_ldap_limit_scope = ();
4022 @new_ldap_listing = ();
4023 @new_ldap_writeable = ();
4024 @new_ldap_search_tree = ();
4025 @new_ldap_starttls = ();
4027 while ( $count <= $#ldap_host ) {
4028 if ( $count != $rem_num ) {
4029 @new_ldap_host = ( @new_ldap_host, $ldap_host[$count] );
4030 @new_ldap_base = ( @new_ldap_base, $ldap_base[$count] );
4031 @new_ldap_port = ( @new_ldap_port, $ldap_port[$count] );
4032 @new_ldap_name = ( @new_ldap_name, $ldap_name[$count] );
4033 @new_ldap_charset = ( @new_ldap_charset, $ldap_charset[$count] );
4034 @new_ldap_maxrows = ( @new_ldap_maxrows, $ldap_maxrows[$count] );
4035 @new_ldap_filter = ( @new_ldap_filter, $ldap_filter[$count] );
4036 @new_ldap_binddn = ( @new_ldap_binddn, $ldap_binddn[$count] );
4037 @new_ldap_bindpw = ( @new_ldap_bindpw, $ldap_bindpw[$count] );
4038 @new_ldap_protocol = ( @new_ldap_protocol, $ldap_protocol[$count] );
4039 @new_ldap_limit_scope = ( @new_ldap_limit_scope, $ldap_limit_scope[$count] );
4040 @new_ldap_listing = ( @new_ldap_listing, $ldap_listing[$count] );
4041 @new_ldap_writeable = ( @new_ldap_writeable, $ldap_writeable[$count] );
4042 @new_ldap_search_tree = ( @new_ldap_search_tree, $ldap_search_tree[$count] );
4043 @new_ldap_starttls = ( @new_ldap_starttls, $ldap_starttls[$count] );
4047 @ldap_host = @new_ldap_host;
4048 @ldap_base = @new_ldap_base;
4049 @ldap_port = @new_ldap_port;
4050 @ldap_name = @new_ldap_name;
4051 @ldap_charset = @new_ldap_charset;
4052 @ldap_maxrows = @new_ldap_maxrows;
4053 @ldap_filter = @new_ldap_filter;
4054 @ldap_binddn = @new_ldap_binddn;
4055 @ldap_bindpw = @new_ldap_bindpw;
4056 @ldap_protocol = @new_ldap_protocol;
4057 @ldap_limit_scope = @new_ldap_limit_scope;
4058 @ldap_listing = @new_ldap_listing;
4059 @ldap_writeable = @new_ldap_writeable;
4060 @ldap_search_tree = @new_ldap_search_tree;
4061 @ldap_starttls = @new_ldap_starttls;
4063 } elsif ( $input =~ /^\s*\?\s*/ ) {
4064 print ".-------------------------.\n";
4065 print "| + (add host) |\n";
4066 print "| - N (remove host) |\n";
4067 print "| l (list hosts) |\n";
4068 print "| d (done) |\n";
4069 print "`-------------------------'\n";
4071 print "[ldap] command (?=help) > ";
4073 $input =~ s/[\r\n]//g;
4078 print "Some of our developers have come up with very good javascript interface\n";
4079 print "for searching through address books, however, our original goals said\n";
4080 print "that we would be 100% HTML. In order to make it possible to use their\n";
4081 print "interface, and yet stick with our goals, we have also written a plain\n";
4082 print "HTML version of the search. Here, you can choose which version to use.\n";
4084 print "This is just the default value. It is also a user option that each\n";
4085 print "user can configure individually\n";
4088 if ( lc($default_use_javascript_addr_book) eq 'true' ) {
4089 $default_value = "y";
4091 $default_use_javascript_addr_book = 'false';
4092 $default_value = "n";
4094 print "Use javascript version by default (y/n) [$WHT$default_value$NRM]: $WHT";
4095 $new_show = <STDIN
>;
4096 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4097 $default_use_javascript_addr_book = 'true';
4099 $default_use_javascript_addr_book = 'false';
4101 return $default_use_javascript_addr_book;
4104 # global filebased address book
4106 print "If you want to use global file address book, then you\n";
4107 print "must set this option to a valid value. If option does\n";
4108 print "not have path elements, system assumes that file is\n";
4109 print "stored in data directory. If relative path is set, it is\n";
4110 print "relative to main SquirrelMail directory. If value is empty,\n";
4111 print "address book is not enabled.\n";
4114 print "[$WHT$abook_global_file$NRM]: $WHT";
4115 $new_abook_global_file = <STDIN
>;
4116 if ( $new_abook_global_file eq "\n" ) {
4117 $new_abook_global_file = $abook_global_file;
4119 $new_abook_global_file =~ s/[\r\n]//g;
4121 return $new_abook_global_file;
4124 # writing into global filebased abook control
4126 print "This setting controls writing into global file address\n";
4127 print "book options. Address book file must be writeable by\n";
4128 print "webserver's user, if you want to enable this option.\n";
4131 if ( lc($abook_global_file_writeable) eq 'true' ) {
4132 $default_value = "y";
4134 $abook_global_file_writeable = 'false';
4135 $default_value = "n";
4137 print "Allow writing into global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
4138 $new_show = <STDIN
>;
4139 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4140 $abook_global_file_writeable = 'true';
4142 $abook_global_file_writeable = 'false';
4144 return $abook_global_file_writeable;
4147 # listing of global filebased abook control
4149 print "This setting controls listing of global file address\n";
4150 print "book in addresses page.\n";
4153 if ( lc($abook_global_file_listing) eq 'true' ) {
4154 $default_value = "y";
4156 $abook_global_file_listing = 'false';
4157 $default_value = "n";
4159 print "Allow listing of global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
4160 $new_show = <STDIN
>;
4161 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4162 $abook_global_file_listing = 'true';
4164 $abook_global_file_listing = 'false';
4166 return $abook_global_file_listing;
4169 # controls $abook_file_line_length setting
4170 sub command_abook_file_line_length
{
4171 print "This setting controls space allocated to file based address book records.\n";
4172 print "End users will be unable to save address book entry, if total entry size \n";
4173 print "(quoted address book fields + 4 delimiters + linefeed) exceeds allowed \n";
4174 print "address book length size.\n";
4176 print "Same setting is applied to personal and global file based address books.\n";
4178 print "It is strongly recommended to keep default setting value. Change it only\n";
4179 print "if you really want to store address book entries that are bigger than two\n";
4180 print "kilobytes (2048).\n";
4183 print "Enter allowed address book line length [$abook_file_line_length]: ";
4186 # value is not modified, if user hits Enter or enters space
4188 # make sure that input is numeric
4189 if ($tmp =~ /^\d+$/) {
4190 $abook_file_line_length = $tmp;
4192 print "If you want to change this setting, you must enter number.\n";
4193 print "If you want to keep original setting - enter space.\n\n";
4194 print "Press Enter to continue...";
4201 print "If you want to store your users address book details in a database then\n";
4202 print "you need to set this DSN to a valid value. The format for this is:\n";
4203 print "mysql://user:pass\@hostname/dbname\n";
4204 print "Where mysql can be one of the databases PHP supports, the most common\n";
4205 print "of these are mysql, msql and pgsql.\n";
4206 print "Please ensure proper permissions for config.php when including\n";
4207 print "sensitive passwords.\n\n";
4208 print "If the DSN is left empty (hit space and then return) the database\n";
4209 print "related code for address books will not be used.\n";
4212 if ( $addrbook_dsn eq "" ) {
4213 $default_value = "Disabled";
4215 $default_value = $addrbook_dsn;
4217 print "[$WHT$addrbook_dsn$NRM]: $WHT";
4219 if ( $new_dsn eq "\n" ) {
4220 $new_dsn = $addrbook_dsn;
4222 $new_dsn =~ s/[\r\n]//g;
4223 $new_dsn =~ s/^\s+$//g;
4229 print "This is the name of the table you want to store the address book\n";
4230 print "data in, it defaults to 'address'\n";
4232 print "[$WHT$addrbook_table$NRM]: $WHT";
4233 $new_table = <STDIN
>;
4234 if ( $new_table eq "\n" ) {
4235 $new_table = $addrbook_table;
4237 $new_table =~ s/[\r\n]//g;
4243 print "If you want to store your users preferences in a database then\n";
4244 print "you need to set this DSN to a valid value. The format for this is:\n";
4245 print "mysql://user:pass\@hostname/dbname\n";
4246 print "Where mysql can be one of the databases PHP supports, the most common\n";
4247 print "of these are mysql, msql and pgsql.\n";
4248 print "Please ensure proper permissions for config.php when including\n";
4249 print "sensitive passwords.\n\n";
4250 print "If the DSN is left empty (hit space and then return) the database\n";
4251 print "related code for address books will not be used.\n";
4254 if ( $prefs_dsn eq "" ) {
4255 $default_value = "Disabled";
4257 $default_value = $prefs_dsn;
4259 print "[$WHT$prefs_dsn$NRM]: $WHT";
4261 if ( $new_dsn eq "\n" ) {
4262 $new_dsn = $prefs_dsn;
4264 $new_dsn =~ s/[\r\n]//g;
4265 $new_dsn =~ s/^\s+$//g;
4271 print "This is the name of the table you want to store the preferences\n";
4272 print "data in, it defaults to 'userprefs'\n";
4274 print "[$WHT$prefs_table$NRM]: $WHT";
4275 $new_table = <STDIN
>;
4276 if ( $new_table eq "\n" ) {
4277 $new_table = $prefs_table;
4279 $new_table =~ s/[\r\n]//g;
4285 print "This is the name of the field in which you want to store the\n";
4286 print "username of the person the prefs are for. It defaults to 'user'\n";
4288 print "[$WHT$prefs_user_field$NRM]: $WHT";
4289 $new_field = <STDIN
>;
4290 if ( $new_field eq "\n" ) {
4291 $new_field = $prefs_user_field;
4293 $new_field =~ s/[\r\n]//g;
4295 $prefs_user_size = db_pref_size
($prefs_user_size);
4300 print "This is the name of the field in which you want to store the\n";
4301 print "preferences keyword. It defaults to 'prefkey'\n";
4303 print "[$WHT$prefs_key_field$NRM]: $WHT";
4304 $new_field = <STDIN
>;
4305 if ( $new_field eq "\n" ) {
4306 $new_field = $prefs_key_field;
4308 $new_field =~ s/[\r\n]//g;
4310 $prefs_key_size = db_pref_size
($prefs_key_size);
4315 print "This is the name of the field in which you want to store the\n";
4316 print "preferences value. It defaults to 'prefval'\n";
4318 print "[$WHT$prefs_val_field$NRM]: $WHT";
4319 $new_field = <STDIN
>;
4320 if ( $new_field eq "\n" ) {
4321 $new_field = $prefs_val_field;
4323 $new_field =~ s/[\r\n]//g;
4325 $prefs_val_size = db_pref_size
($prefs_val_size);
4329 # routine is used to set database field limits
4330 # it needs one argument
4331 sub db_pref_size
() {
4333 print "\nDatabase fields have size limits.\n";
4335 print "What limit is set for this field? [$WHT$size$NRM]: $WHT";
4336 $new_size = <STDIN
>;
4337 if ( $new_size eq "\n" ) {
4340 $new_size =~ s/[\r\n]//g;
4346 print "If you want to store your global address book in a database then\n";
4347 print "you need to set this DSN to a valid value. The format for this is:\n";
4348 print "mysql://user:pass\@hostname/dbname\n";
4349 print "Where mysql can be one of the databases PHP supports, the most common\n";
4350 print "of these are mysql, msql and pgsql.\n";
4351 print "Please ensure proper permissions for config.php when including\n";
4352 print "sensitive passwords.\n\n";
4353 print "If the DSN is left empty (hit space and then return) the database\n";
4354 print "related code for global SQL address book will not be used.\n";
4357 if ( $addrbook_global_dsn eq "" ) {
4358 $default_value = "Disabled";
4360 $default_value = $addrbook_global_dsn;
4362 print "[$WHT$addrbook_global_dsn$NRM]: $WHT";
4364 if ( $new_dsn eq "\n" ) {
4365 $new_dsn = $addrbook_global_dsn;
4367 $new_dsn =~ s/[\r\n]//g;
4368 $new_dsn =~ s/^\s+$//g;
4374 print "This is the name of the table you want to store the global address book\n";
4375 print "data in. Default table name is 'global_abook'. Address book uses same\n";
4376 print "database format as personal address book.\n";
4378 print "[$WHT$addrbook_global_table$NRM]: $WHT";
4379 $new_table = <STDIN
>;
4380 if ( $new_table eq "\n" ) {
4381 $new_table = $addrbook_global_table;
4383 $new_table =~ s/[\r\n]//g;
4389 print "This option controls users\' ability to add or modify records stored \n";
4390 print "in global address book\n";
4392 if ( lc($addrbook_global_writeable) eq 'true' ) {
4393 $default_value = "y";
4395 $default_value = "n";
4397 print "Allow writing into global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
4398 $addrbook_global_writeable = <STDIN
>;
4399 if ( ( $addrbook_global_writeable =~ /^y\n/i ) || ( ( $addrbook_global_writeable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4400 $addrbook_global_writeable = 'true';
4402 $addrbook_global_writeable = 'false';
4404 return $addrbook_global_writeable;
4408 print "Enable this option if you want to see listing of addresses stored \n";
4409 print "in global address book\n";
4411 if ( lc($addrbook_global_listing) eq 'true' ) {
4412 $default_value = "y";
4414 $default_value = "n";
4416 print "Allow listing of global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
4417 $addrbook_global_listing = <STDIN
>;
4418 if ( ( $addrbook_global_listing =~ /^y\n/i ) || ( ( $addrbook_global_listing =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4419 $addrbook_global_listing = 'true';
4421 $addrbook_global_listing = 'false';
4423 return $addrbook_global_listing;
4429 print "SquirrelMail attempts to set the language in many ways. If it\n";
4430 print "can not figure it out in another way, it will default to this\n";
4431 print "language. Please use the code for the desired language.\n";
4433 print "[$WHT$squirrelmail_default_language$NRM]: $WHT";
4434 $new_squirrelmail_default_language = <STDIN
>;
4435 if ( $new_squirrelmail_default_language eq "\n" ) {
4436 $new_squirrelmail_default_language = $squirrelmail_default_language;
4438 $new_squirrelmail_default_language =~ s/[\r\n]//g;
4439 $new_squirrelmail_default_language =~ s/^\s+$//g;
4441 return $new_squirrelmail_default_language;
4445 print "This option controls what character set is used when sending\n";
4446 print "mail and when sending HTML to the browser. Option works only\n";
4447 print "with US English (en_US) translation. Other translations use\n";
4448 print "charsets that are set in translation settings.\n";
4451 print "[$WHT$default_charset$NRM]: $WHT";
4452 $new_default_charset = <STDIN
>;
4453 if ( $new_default_charset eq "\n" ) {
4454 $new_default_charset = $default_charset;
4456 $new_default_charset =~ s/[\r\n]//g;
4458 return $new_default_charset;
4460 # Alternative language names
4462 print "Enable this option if you want to see localized language names in\n";
4463 print "language selection box. Note, that this option can trigger\n";
4464 print "installation of foreign language support modules in some browsers.\n";
4467 if ( lc($show_alternative_names) eq 'true' ) {
4468 $default_value = "y";
4470 $default_value = "n";
4472 print "Show alternative language names? (y/n) [$WHT$default_value$NRM]: $WHT";
4473 $show_alternative_names = <STDIN
>;
4474 if ( ( $show_alternative_names =~ /^y\n/i ) || ( ( $show_alternative_names =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4475 $show_alternative_names = 'true';
4477 $show_alternative_names = 'false';
4479 return $show_alternative_names;
4482 # Aggressive decoding
4484 print "Enable this option if you want to use CPU and memory intensive decoding\n";
4485 print "functions. This option allows reading multibyte charset, that are used\n";
4486 print "in Eastern Asia. SquirrelMail will try to use recode functions here,\n";
4487 print "even when you have disabled use of recode in Tweaks section.\n";
4490 if ( lc($aggressive_decoding) eq 'true' ) {
4491 $default_value = "y";
4493 $default_value = "n";
4495 print "Enable aggressive decoding? (y/n) [$WHT$default_value$NRM]: $WHT";
4496 $aggressive_decoding = <STDIN
>;
4497 if ( ( $aggressive_decoding =~ /^y\n/i ) || ( ( $aggressive_decoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4498 $aggressive_decoding = 'true';
4500 $aggressive_decoding = 'false';
4502 return $aggressive_decoding;
4507 print "Enable this option if you want to allow lossy charset encoding in message\n";
4508 print "composition pages. This option allows charset conversions when output\n";
4509 print "charset does not support all symbols used in original charset. Symbols\n";
4510 print "unsupported by output charset will be replaced with question marks.\n";
4513 if ( lc($lossy_encoding) eq 'true' ) {
4514 $default_value = "y";
4516 $default_value = "n";
4518 print "Enable lossy encoding? (y/n) [$WHT$default_value$NRM]: $WHT";
4519 $lossy_encoding = <STDIN
>;
4520 if ( ( $lossy_encoding =~ /^y\n/i ) || ( ( $lossy_encoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4521 $lossy_encoding = 'true';
4523 $lossy_encoding = 'false';
4525 return $lossy_encoding;
4528 # display html emails in iframe
4530 print "This option can enable html email rendering inside iframe.\n";
4531 print "Inline frames are used in order to provide sandbox environment";
4532 print "for html code included in html formated emails.";
4533 print "Option is experimental and might have glitches in some parts of code.";
4536 if ( lc($use_iframe) eq 'true' ) {
4537 $default_value = "y";
4539 $default_value = "n";
4541 print "Display html emails in iframe? (y/n) [$WHT$default_value$NRM]: $WHT";
4542 $use_iframe = <STDIN
>;
4543 if ( ( $use_iframe =~ /^y\n/i ) || ( ( $use_iframe =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4544 $use_iframe = 'true';
4546 $use_iframe = 'false';
4552 sub command_ask_user_info
{
4553 print "New users need to supply their real name and email address to\n";
4554 print "send out proper mails. When this option is enabled, a user that\n";
4555 print "logs in for the first time will be redirected to the Personal\n";
4556 print "Options screen and asked to supply their personal data.\n";
4559 if ( lc($ask_user_info) eq 'true' ) {
4560 $default_value = "y";
4562 $default_value = "n";
4564 print "Ask user info? (y/n) [$WHT$default_value$NRM]: $WHT";
4565 $ask_user_info = <STDIN
>;
4566 if ( ( $ask_user_info =~ /^y\n/i ) || ( ( $ask_user_info =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4567 $ask_user_info = 'true';
4569 $ask_user_info = 'false';
4571 return $ask_user_info;
4576 print "Enabling this option will cause icons to be used instead of text\n";
4577 print "markers next to each message in mailbox lists that represent\n";
4578 print "new, read, flagged, and deleted messages, as well as those that\n";
4579 print "have been replied to and forwarded. Icons are also used next to\n";
4580 print "(un)expanded folders in the folder list (Oldway = false). These\n";
4581 print "icons are quite small, but will obviously be more of a resource\n";
4582 print "drain than text markers.\n";
4585 if ( lc($use_icons) eq 'true' ) {
4586 $default_value = "y";
4588 $default_value = "n";
4590 print "Use icons? (y/n) [$WHT$default_value$NRM]: $WHT";
4591 $use_icons = <STDIN
>;
4592 if ( ( $use_icons =~ /^y\n/i ) || ( ( $use_icons =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4593 $use_icons = 'true';
4595 $use_icons = 'false';
4601 print "Enable this option if you want to use php recode functions to read\n";
4602 print "emails written in charset that differs from the one that is set in\n";
4603 print "translation selected by user. Code is experimental, it might cause\n";
4604 print "errors, if email contains charset unsupported by recode or if your\n";
4605 print "php does not have recode support.\n";
4608 if ( lc($use_php_recode) eq 'true' ) {
4609 $default_value = "y";
4611 $default_value = "n";
4613 print "Use php recode functions? (y/n) [$WHT$default_value$NRM]: $WHT";
4614 $use_php_recode = <STDIN
>;
4615 if ( ( $use_php_recode =~ /^y\n/i ) || ( ( $use_php_recode =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4616 $use_php_recode = 'true';
4618 $use_php_recode = 'false';
4620 return $use_php_recode;
4624 print "Enable this option if you want to use php iconv functions to read\n";
4625 print "emails written in charset that differs from the one that is set in\n";
4626 print "translation selected by user. Code is experimental, it works only\n";
4627 print "with translations that use utf-8 charset. Code might cause errors,\n";
4628 print "if email contains charset unsupported by iconv or if your php does\n";
4629 print "not have iconv support.\n";
4632 if ( lc($use_php_iconv) eq 'true' ) {
4633 $default_value = "y";
4635 $default_value = "n";
4637 print "Use php iconv functions? (y/n) [$WHT$default_value$NRM]: $WHT";
4638 $use_php_iconv = <STDIN
>;
4639 if ( ( $use_php_iconv =~ /^y\n/i ) || ( ( $use_php_iconv =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4640 $use_php_iconv = 'true';
4642 $use_php_iconv = 'false';
4644 return $use_php_iconv;
4649 print "In some cases, buffering all output (holding it on the server until\n";
4650 print "the full page is ready to send to the browser) allows more complex\n";
4651 print "functionality, especially for plugins that want to add headers on hooks\n";
4652 print "that are beyond the point of output having been sent to the browser\n";
4653 print "otherwise. Most plugins that need this functionality will enable it\n";
4654 print "automatically on their own, but you can turn it on manually here. You'd\n";
4655 print "usually want to do this if you want to specify a custom output handler\n";
4656 print "for parsing the output - you can do that by specifying a value for\n";
4657 print "\$buffered_output_handler in config_local.php. Don't forget to define\n";
4658 print "a function of the same name as what \$buffered_output_handler is set to.\n";
4661 if ( lc($buffer_output) eq 'true' ) {
4662 $default_value = "y";
4664 $default_value = "n";
4666 print "Buffer all output? (y/n) [$WHT$default_value$NRM]: $WHT";
4667 $buffer_output = <STDIN
>;
4668 if ( ( $buffer_output =~ /^y\n/i ) || ( ( $buffer_output =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4669 $buffer_output = 'true';
4671 $buffer_output = 'false';
4673 return $buffer_output;
4678 print "Enable this option if you want to check SquirrelMail configuration\n";
4679 print "remotely with configtest.php script.\n";
4682 if ( lc($allow_remote_configtest) eq 'true' ) {
4683 $default_value = "y";
4685 $default_value = "n";
4687 print "Allow remote configuration tests? (y/n) [$WHT$default_value$NRM]: $WHT";
4688 $allow_remote_configtest = <STDIN
>;
4689 if ( ( $allow_remote_configtest =~ /^y\n/i ) || ( ( $allow_remote_configtest =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4690 $allow_remote_configtest = 'true';
4692 $allow_remote_configtest = 'false';
4694 return $allow_remote_configtest;
4697 # Default Icon theme
4699 print "You may change the path to the default icon theme to be used, if icons\n";
4700 print "have been enabled. This theme will be used when an icon cannot be\n";
4701 print "found in the current theme, or when no icon theme is specified. If\n";
4702 print "left blank, and icons are enabled, the default theme will be used\n";
4703 print "from images/themes/default/.\n";
4705 print "To clear out an existing value, just type a space for the input.\n";
4707 print "Please be aware of the following: \n";
4708 print " - Relative URLs are relative to the config dir\n";
4709 print " to use the icon themes directory, use ../images/themes/newtheme/\n";
4710 print " - The icon theme may be outside the SquirrelMail directory, but\n";
4711 print " it must be web accessible.\n";
4712 print "[$WHT$icon_theme_def$NRM]: $WHT";
4713 $new_icon_theme_def = <STDIN
>;
4715 if ( $new_icon_theme_def eq "\n" ) {
4716 $new_icon_theme_def = $icon_theme_def;
4718 $new_icon_theme_def =~ s/[\r\n]//g;
4720 $new_icon_theme_def =~ s/^\s*//;
4721 return $new_icon_theme_def;
4724 # SquirrelMail debug mode (since 1.5.2)
4726 print "When debugging or developing SquirrelMail, you may want to increase\n";
4727 print "the verbosity of certain kinds of errors, notices, and/or diagnostics.\n";
4728 print "You may enable one or more of the debugging modes here. Please make\n";
4729 print "sure that you have turned off debugging if you are using SquirrelMail\n";
4730 print "in a production environment.\n\n";
4733 while ( $input ne "d\n" ) {
4734 $sm_debug_mode = convert_debug_constants_to_binary_integer
($sm_debug_mode);
4736 # per include/constants.php, here are the debug mode values:
4738 # 0 SM_DEBUG_MODE_OFF
4739 # 1 SM_DEBUG_MODE_SIMPLE
4740 # 512 SM_DEBUG_MODE_MODERATE
4741 # 524288 SM_DEBUG_MODE_ADVANCED
4742 # 536870912 SM_DEBUG_MODE_STRICT
4744 print "\n# Enabled? Description\n";
4745 print "---------------------------------------------------------------------\n";
4746 print "0 " . ($sm_debug_mode == 0 ?
"y" : " ")
4747 . " No debugging (recommended in production environments)\n";
4748 print "1 " . ($sm_debug_mode & 1 ?
"y" : " ")
4749 . " Simple debugging (PHP E_ERROR)\n";
4750 print "2 " . ($sm_debug_mode & 512 ?
"y" : " ")
4751 . " Moderate debugging (PHP E_ALL without E_STRICT)\n";
4752 print "3 " . ($sm_debug_mode & 524288 ?
"y" : " ")
4753 . " Advanced debugging (PHP E_ALL (without E_STRICT) plus\n";
4754 print " log errors intentionally suppressed)\n";
4755 print "4 " . ($sm_debug_mode & 536870912 ?
"y" : " ")
4756 . " Strict debugging (PHP E_ALL and E_STRICT)\n";
4759 print "SquirrelMail debug mode (0,1,2,3,4) or d when done? : $WHT";
4761 if ( $input eq "d\n" ) {
4763 } elsif ($input !~ /^[0-9]+\n$/) {
4764 print "\nInvalid configuration value.\n";
4765 print "\nPress enter to continue...";
4767 } elsif ( $input == "0\n" ) {
4769 } elsif ( $input == "1\n" ) {
4770 if ($sm_debug_mode & 1) {
4771 $sm_debug_mode ^= 1;
4773 $sm_debug_mode |= 1;
4775 } elsif ( $input == "2\n" ) {
4776 if ($sm_debug_mode & 512) {
4777 $sm_debug_mode ^= 512;
4779 $sm_debug_mode |= 512;
4781 } elsif ( $input == "3\n" ) {
4782 if ($sm_debug_mode & 524288) {
4783 $sm_debug_mode ^= 524288;
4785 $sm_debug_mode |= 524288;
4787 } elsif ( $input == "4\n" ) {
4788 if ($sm_debug_mode & 536870912) {
4789 $sm_debug_mode ^= 536870912;
4791 $sm_debug_mode |= 536870912;
4794 print "\nInvalid configuration value.\n";
4795 print "\nPress enter to continue...";
4800 $sm_debug_mode = convert_debug_binary_integer_to_constants
($sm_debug_mode);
4801 return $sm_debug_mode;
4804 # Secured configuration mode (since 1.5.2)
4806 print "This option allows you to enable \"Secured Configuration\" mode,\n";
4807 print "which will guarantee that certain settings made herein will be\n";
4808 print "made immutable and will not be subject to override by either friendly\n";
4809 print "or unfriendly code/plugins. Only a small number of settings herein\n";
4810 print "will be used in this manner - just those that are deemed to be a\n";
4811 print "potential security threat when rouge plugin or other code may be\n";
4812 print "executed inside SquirrelMail.\n";
4815 if ( lc($secured_config) eq 'true' ) {
4816 $default_value = "y";
4818 $default_value = "n";
4820 print "Enable secured configuration mode? (y/n) [$WHT$default_value$NRM]: $WHT";
4821 $secured_config = <STDIN
>;
4822 if ( ( $secured_config =~ /^y\n/i ) || ( ( $secured_config =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4823 $secured_config = 'true';
4825 $secured_config = 'false';
4827 return $secured_config;
4830 # Set a (non-standard) HTTPS port
4832 print "If you run HTTPS (SSL-secured HTTP) on a non-standard port, you should\n";
4833 print "indicate that port here. Even if you do not, SquirrelMail may still\n";
4834 print "auto-detect secure connections, but it is safer and also very useful\n";
4835 print "for third party plugins if you specify the port number here.\n";
4837 print "Most SquirrelMail administrators will not need to use this setting\n";
4838 print "because most all web servers use port 443 for HTTPS connections, and\n";
4839 print "SquirrelMail assumes 443 unless something else is given here.\n";
4842 print "Enter your HTTPS port [$sq_https_port]: ";
4845 # value is not modified, if user hits Enter or enters space
4847 # make sure that input is numeric
4848 if ($tmp =~ /^\d+$/) {
4849 $sq_https_port = $tmp;
4852 print "--- INPUT ERROR ---\n";
4854 print "If you want to change this setting, you must enter a number.\n";
4855 print "If you want to keep the original value, just press Enter.\n\n";
4856 print "Press Enter to continue...";
4860 return $sq_https_port;
4863 # Ignore HTTP_X_FORWARDED_* headers?
4866 if ( lc($sq_ignore_http_x_forwarded_headers) eq 'true' ) {
4867 $default_value = "y";
4869 $default_value = "n";
4872 print "Because HTTP_X_FORWARDED_* headers can be sent by the client and\n";
4873 print "therefore possibly exploited by an outsider, SquirrelMail ignores\n";
4874 print "them by default. If a proxy server or other machine sits between\n";
4875 print "clients and your SquirrelMail server, you can turn this off to\n";
4876 print "tell SquirrelMail to use such headers.\n";
4879 print "Ignore HTTP_X_FORWARDED headers? (y/n) [$WHT$default_value$NRM]: $WHT";
4880 $sq_ignore_http_x_forwarded_headers = <STDIN
>;
4881 if ( ( $sq_ignore_http_x_forwarded_headers =~ /^y\n/i ) || ( ( $sq_ignore_http_x_forwarded_headers =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4882 $sq_ignore_http_x_forwarded_headers = 'true';
4884 $sq_ignore_http_x_forwarded_headers = 'false';
4886 return $sq_ignore_http_x_forwarded_headers;
4891 if ( open( CF
, ">config.php" ) ) {
4896 print CF
" * SquirrelMail Configuration File\n";
4897 print CF
" * Created using the configure script, conf.pl\n";
4901 if ($print_config_version) {
4902 print CF
"\$config_version = '$print_config_version';\n";
4905 print CF
"\$config_use_color = $config_use_color;\n";
4909 print CF
"\$org_name = \"$org_name\";\n";
4911 print CF
"\$org_logo = " . &change_to_SM_path
($org_logo) . ";\n";
4912 $org_logo_width |= 0;
4913 $org_logo_height |= 0;
4915 print CF
"\$org_logo_width = '$org_logo_width';\n";
4917 print CF
"\$org_logo_height = '$org_logo_height';\n";
4918 # string that can contain variables.
4919 print CF
"\$org_title = \"$org_title\";\n";
4921 print CF
"\$signout_page = " . &change_to_SM_path
($signout_page) . ";\n";
4923 print CF
"\$frame_top = '$frame_top';\n";
4926 print CF
"\$provider_uri = '$provider_uri';\n";
4929 print CF
"\$provider_name = '$provider_name';\n";
4932 # string that can contain variables
4933 print CF
"\$motd = \"$motd\";\n";
4937 print CF
"\$squirrelmail_default_language = '$squirrelmail_default_language';\n";
4939 print CF
"\$default_charset = '$default_charset';\n";
4941 print CF
"\$show_alternative_names = $show_alternative_names;\n";
4943 print CF
"\$aggressive_decoding = $aggressive_decoding;\n";
4945 print CF
"\$lossy_encoding = $lossy_encoding;\n";
4949 print CF
"\$domain = '$domain';\n";
4951 print CF
"\$imapServerAddress = '$imapServerAddress';\n";
4953 print CF
"\$imapPort = $imapPort;\n";
4955 print CF
"\$useSendmail = $useSendmail;\n";
4957 print CF
"\$smtpServerAddress = '$smtpServerAddress';\n";
4959 print CF
"\$smtpPort = $smtpPort;\n";
4961 print CF
"\$sendmail_path = '$sendmail_path';\n";
4963 print CF
"\$sendmail_args = '$sendmail_args';\n";
4965 # print CF "\$use_authenticated_smtp = $use_authenticated_smtp;\n";
4967 print CF
"\$pop_before_smtp = $pop_before_smtp;\n";
4969 print CF
"\$pop_before_smtp_host = '$pop_before_smtp_host';\n";
4971 print CF
"\$imap_server_type = '$imap_server_type';\n";
4973 print CF
"\$invert_time = $invert_time;\n";
4975 print CF
"\$optional_delimiter = '$optional_delimiter';\n";
4977 print CF
"\$encode_header_key = '$encode_header_key';\n";
4981 print CF
"\$default_folder_prefix = '$default_folder_prefix';\n";
4983 print CF
"\$trash_folder = '$trash_folder';\n";
4985 print CF
"\$sent_folder = '$sent_folder';\n";
4987 print CF
"\$draft_folder = '$draft_folder';\n";
4989 print CF
"\$default_move_to_trash = $default_move_to_trash;\n";
4991 print CF
"\$default_move_to_sent = $default_move_to_sent;\n";
4993 print CF
"\$default_save_as_draft = $default_save_as_draft;\n";
4995 print CF
"\$show_prefix_option = $show_prefix_option;\n";
4997 print CF
"\$list_special_folders_first = $list_special_folders_first;\n";
4999 print CF
"\$use_special_folder_color = $use_special_folder_color;\n";
5001 print CF
"\$auto_expunge = $auto_expunge;\n";
5003 print CF
"\$default_sub_of_inbox = $default_sub_of_inbox;\n";
5005 print CF
"\$show_contain_subfolders_option = $show_contain_subfolders_option;\n";
5007 print CF
"\$default_unseen_notify = $default_unseen_notify;\n";
5009 print CF
"\$default_unseen_type = $default_unseen_type;\n";
5011 print CF
"\$auto_create_special = $auto_create_special;\n";
5013 print CF
"\$delete_folder = $delete_folder;\n";
5015 print CF
"\$noselect_fix_enable = $noselect_fix_enable;\n";
5020 print CF
"\$data_dir = " . &change_to_SM_path
($data_dir) . ";\n";
5021 # string that can contain a variable
5022 print CF
"\$attachment_dir = " . &change_to_SM_path
($attachment_dir) . ";\n";
5024 print CF
"\$dir_hash_level = $dir_hash_level;\n";
5026 print CF
"\$default_left_size = '$default_left_size';\n";
5028 print CF
"\$force_username_lowercase = $force_username_lowercase;\n";
5030 print CF
"\$default_use_priority = $default_use_priority;\n";
5032 print CF
"\$hide_sm_attributions = $hide_sm_attributions;\n";
5034 print CF
"\$default_use_mdn = $default_use_mdn;\n";
5036 print CF
"\$edit_identity = $edit_identity;\n";
5038 print CF
"\$edit_name = $edit_name;\n";
5040 print CF
"\$edit_reply_to = $edit_reply_to;\n";
5042 print CF
"\$hide_auth_header = $hide_auth_header;\n";
5044 print CF
"\$disable_thread_sort = $disable_thread_sort;\n";
5046 print CF
"\$disable_server_sort = $disable_server_sort;\n";
5048 print CF
"\$allow_charset_search = $allow_charset_search;\n";
5050 print CF
"\$allow_advanced_search = $allow_advanced_search;\n";
5053 print CF
"\$time_zone_type = $time_zone_type;\n";
5056 print CF
"\$config_location_base = '$config_location_base';\n";
5059 print CF
"\$disable_plugins = $disable_plugins;\n";
5061 print CF
"\$disable_plugins_user = '$disable_plugins_user';\n";
5064 # all plugins are strings
5065 for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
5066 print CF
"\$plugins[] = '$plugins[$ct]';\n";
5071 if ( $user_theme_default eq '' ) { $user_theme_default = '0'; }
5072 print CF
"\$user_theme_default = $user_theme_default;\n";
5074 for ( $count = 0 ; $count <= $#user_theme_name ; $count++ ) {
5075 if ($user_theme_path[$count] eq 'none') {
5078 $path = &change_to_SM_path
($user_theme_path[$count]);
5080 print CF
"\$user_themes[$count]['PATH'] = " . $path . ";\n";
5081 # escape theme name so it can contain single quotes.
5082 $esc_name = $user_theme_name[$count];
5083 $esc_name =~ s/\\/\\\\/g;
5084 $esc_name =~ s/'/\\'/g;
5085 print CF
"\$user_themes[$count]['NAME'] = '$esc_name';\n";
5089 if ( $icon_theme_def eq '' ) { $icon_theme_def = '0'; }
5090 print CF
"\$icon_theme_def = $icon_theme_def;\n";
5091 if ( $icon_theme_fallback eq '' ) { $icon_theme_fallback = '0'; }
5092 print CF
"\$icon_theme_fallback = $icon_theme_fallback;\n";
5094 for ( $count = 0 ; $count <= $#icon_theme_name ; $count++ ) {
5095 $path = $icon_theme_path[$count];
5096 if ($path eq 'none' || $path eq 'template') {
5097 $path = "'".$path."'";
5099 $path = &change_to_SM_path
($icon_theme_path[$count]);
5101 print CF
"\$icon_themes[$count]['PATH'] = " . $path . ";\n";
5102 # escape theme name so it can contain single quotes.
5103 $esc_name = $icon_theme_name[$count];
5104 $esc_name =~ s/\\/\\\\/g;
5105 $esc_name =~ s/'/\\'/g;
5106 print CF
"\$icon_themes[$count]['NAME'] = '$esc_name';\n";
5110 if ( $templateset_default eq '' ) { $templateset_default = 'default'; }
5111 print CF
"\$templateset_default = '$templateset_default';\n";
5113 if ( $templateset_fallback eq '' ) { $templateset_fallback = 'default'; }
5114 print CF
"\$templateset_fallback = '$templateset_fallback';\n";
5116 if ( $rpc_templateset eq '' ) { $rpc_templateset = 'default_rpc'; }
5117 print CF
"\$rpc_templateset = '$rpc_templateset';\n";
5119 for ( $count = 0 ; $count <= $#templateset_name ; $count++ ) {
5121 # don't include RPC template sets
5123 if ( $templateset_id[$count] =~ /_rpc$/ ) { next; }
5125 print CF
"\$aTemplateSet[$count]['ID'] = '" . $templateset_id[$count] . "';\n";
5126 # escape theme name so it can contain single quotes.
5127 $esc_name = $templateset_name[$count];
5128 $esc_name =~ s/\\/\\\\/g;
5129 $esc_name =~ s/'/\\'/g;
5130 print CF
"\$aTemplateSet[$count]['NAME'] = '$esc_name';\n";
5136 print CF
"\$default_fontsize = '$default_fontsize';\n";
5138 print CF
"\$default_fontset = '$default_fontset';\n";
5140 # assoc. array (maybe initial value should be set somewhere else)
5141 print CF
'$fontsets = array();'."\n";
5142 while (($fontset_name, $fontset_value) = each(%fontsets)) {
5143 print CF
"\$fontsets\['$fontset_name'\] = '$fontset_value';\n";
5149 print CF
"\$default_use_javascript_addr_book = $default_use_javascript_addr_book;\n";
5150 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
5151 print CF
"\$ldap_server[$count] = array(\n";
5153 print CF
" 'host' => '$ldap_host[$count]',\n";
5155 print CF
" 'base' => '$ldap_base[$count]'";
5156 if ( $ldap_name[$count] ) {
5159 print CF
" 'name' => '$ldap_name[$count]'";
5161 if ( $ldap_port[$count] ) {
5164 print CF
" 'port' => $ldap_port[$count]";
5166 if ( $ldap_charset[$count] ) {
5169 print CF
" 'charset' => '$ldap_charset[$count]'";
5171 if ( $ldap_maxrows[$count] ) {
5174 print CF
" 'maxrows' => $ldap_maxrows[$count]";
5177 if ( $ldap_filter[$count] ) {
5179 print CF
" 'filter' => '$ldap_filter[$count]'";
5181 if ( $ldap_binddn[$count] ) {
5184 print CF
" 'binddn' => '$ldap_binddn[$count]'";
5185 if ( $ldap_bindpw[$count] ) {
5188 print CF
" 'bindpw' => '$ldap_bindpw[$count]'";
5191 if ( $ldap_protocol[$count] ) {
5194 print CF
" 'protocol' => $ldap_protocol[$count]";
5196 if ( $ldap_limit_scope[$count] ) {
5199 print CF
" 'limit_scope' => $ldap_limit_scope[$count]";
5201 if ( $ldap_listing[$count] ) {
5204 print CF
" 'listing' => $ldap_listing[$count]";
5206 if ( $ldap_writeable[$count] ) {
5209 print CF
" 'writeable' => $ldap_writeable[$count]";
5211 if ( $ldap_search_tree[$count] ) {
5214 print CF
" 'search_tree' => $ldap_search_tree[$count]";
5216 if ( $ldap_starttls[$count] ) {
5219 print CF
" 'starttls' => $ldap_starttls[$count]";
5227 print CF
"\$addrbook_dsn = '$addrbook_dsn';\n";
5229 print CF
"\$addrbook_table = '$addrbook_table';\n\n";
5231 print CF
"\$prefs_dsn = '$prefs_dsn';\n";
5233 print CF
"\$prefs_table = '$prefs_table';\n";
5235 print CF
"\$prefs_user_field = '$prefs_user_field';\n";
5237 print CF
"\$prefs_user_size = $prefs_user_size;\n";
5239 print CF
"\$prefs_key_field = '$prefs_key_field';\n";
5241 print CF
"\$prefs_key_size = $prefs_key_size;\n";
5243 print CF
"\$prefs_val_field = '$prefs_val_field';\n";
5245 print CF
"\$prefs_val_size = $prefs_val_size;\n\n";
5247 print CF
"\$addrbook_global_dsn = '$addrbook_global_dsn';\n";
5249 print CF
"\$addrbook_global_table = '$addrbook_global_table';\n";
5251 print CF
"\$addrbook_global_writeable = $addrbook_global_writeable;\n";
5253 print CF
"\$addrbook_global_listing = $addrbook_global_listing;\n\n";
5255 print CF
"\$abook_global_file = '$abook_global_file';\n";
5257 print CF
"\$abook_global_file_writeable = $abook_global_file_writeable;\n\n";
5259 print CF
"\$abook_global_file_listing = $abook_global_file_listing;\n\n";
5261 print CF
"\$abook_file_line_length = $abook_file_line_length;\n\n";
5263 print CF
"\$no_list_for_subscribe = $no_list_for_subscribe;\n";
5266 print CF
"\$smtp_auth_mech = '$smtp_auth_mech';\n";
5267 print CF
"\$smtp_sitewide_user = '". quote_single
($smtp_sitewide_user) ."';\n";
5268 print CF
"\$smtp_sitewide_pass = '". quote_single
($smtp_sitewide_pass) ."';\n";
5270 print CF
"\$imap_auth_mech = '$imap_auth_mech';\n";
5272 print CF
"\$use_imap_tls = $use_imap_tls;\n";
5274 print CF
"\$use_smtp_tls = $use_smtp_tls;\n";
5276 print CF
"\$display_imap_login_error = $display_imap_login_error;\n";
5278 print CF
"\$session_name = '$session_name';\n";
5280 print CF
"\$only_secure_cookies = $only_secure_cookies;\n";
5281 print CF
"\$disable_security_tokens = $disable_security_tokens;\n";
5284 print CF
"\$check_referrer = '$check_referrer';\n";
5287 print CF
"\$use_transparent_security_image = $use_transparent_security_image;\n";
5292 print CF
"\$use_iframe = $use_iframe;\n";
5294 print CF
"\$ask_user_info = $ask_user_info;\n";
5296 print CF
"\$use_icons = $use_icons;\n";
5299 print CF
"\$use_php_recode = $use_php_recode;\n";
5301 print CF
"\$use_php_iconv = $use_php_iconv;\n";
5304 print CF
"\$buffer_output = $buffer_output;\n";
5307 print CF
"\$allow_remote_configtest = $allow_remote_configtest;\n";
5308 print CF
"\$secured_config = $secured_config;\n";
5310 print CF
"\$sq_https_port = $sq_https_port;\n";
5312 print CF
"\$sq_ignore_http_x_forwarded_headers = $sq_ignore_http_x_forwarded_headers;\n";
5313 # (binary) integer or constant - convert integer
5314 # values to constants before output
5315 $sm_debug_mode = convert_debug_binary_integer_to_constants
($sm_debug_mode);
5316 print CF
"\$sm_debug_mode = $sm_debug_mode;\n";
5321 print "Data saved in config.php\n";
5323 build_plugin_hook_array
();
5326 print "Error saving config.php: $!\n";
5332 print $WHT. "SquirrelMail Configuration : " . $NRM;
5333 if ( $config == 1 ) { print "Read: config.php"; }
5334 elsif ( $config == 2 ) { print "Read: config_default.php"; }
5336 print "---------------------------------------------------------\n";
5338 print "While we have been building SquirrelMail, we have discovered some\n";
5339 print "preferences that work better with some servers that don't work so\n";
5340 print "well with others. If you select your IMAP server, this option will\n";
5341 print "set some pre-defined settings for that server.\n";
5343 print "Please note that you will still need to go through and make sure\n";
5344 print "everything is correct. This does not change everything. There are\n";
5345 print "only a few settings that this will change.\n";
5349 while ( $continue != 1 ) {
5350 print "Please select your IMAP server:\n";
5351 print $list_supported_imap_servers;
5353 print " quit = Do not change anything\n";
5355 print "Command >> ";
5357 $server =~ s/[\r\n]//g;
5359 # variable is used to display additional messages.
5363 if ( $server eq "cyrus" ) {
5364 $imap_server_type = "cyrus";
5365 $default_folder_prefix = "";
5366 $trash_folder = "INBOX.Trash";
5367 $sent_folder = "INBOX.Sent";
5368 $draft_folder = "INBOX.Drafts";
5369 $show_prefix_option = false
;
5370 $default_sub_of_inbox = true
;
5371 $show_contain_subfolders_option = false
;
5372 $optional_delimiter = ".";
5373 $disp_default_folder_prefix = "<none>";
5374 $force_username_lowercase = false
;
5376 # Delimiter might differ if unixhierarchysep is set to yes.
5377 $message = "\nIf you have enabled unixhierarchysep, you must change delimiter and special folder names.\n";
5380 } elsif ( $server eq "uw" ) {
5381 $imap_server_type = "uw";
5382 $default_folder_prefix = "mail/";
5383 $trash_folder = "Trash";
5384 $sent_folder = "Sent";
5385 $draft_folder = "Drafts";
5386 $show_prefix_option = true
;
5387 $default_sub_of_inbox = false
;
5388 $show_contain_subfolders_option = true
;
5389 $optional_delimiter = "/";
5390 $disp_default_folder_prefix = $default_folder_prefix;
5391 $delete_folder = true
;
5392 $force_username_lowercase = true
;
5395 } elsif ( $server eq "exchange" ) {
5396 $imap_server_type = "exchange";
5397 $default_folder_prefix = "";
5398 $default_sub_of_inbox = true
;
5399 $trash_folder = "INBOX/Deleted Items";
5400 $sent_folder = "INBOX/Sent Items";
5401 $drafts_folder = "INBOX/Drafts";
5402 $show_prefix_option = false
;
5403 $show_contain_subfolders_option = false
;
5404 $optional_delimiter = "detect";
5405 $disp_default_folder_prefix = "<none>";
5406 $force_username_lowercase = true
;
5409 } elsif ( $server eq "courier" ) {
5410 $imap_server_type = "courier";
5411 $default_folder_prefix = "INBOX.";
5412 $trash_folder = "Trash";
5413 $sent_folder = "Sent";
5414 $draft_folder = "Drafts";
5415 $show_prefix_option = false
;
5416 $default_sub_of_inbox = false
;
5417 $show_contain_subfolders_option = false
;
5418 $optional_delimiter = ".";
5419 $disp_default_folder_prefix = $default_folder_prefix;
5420 $delete_folder = true
;
5421 $force_username_lowercase = false
;
5424 } elsif ( $server eq "macosx" ) {
5425 $imap_server_type = "macosx";
5426 $default_folder_prefix = "INBOX/";
5427 $trash_folder = "Trash";
5428 $sent_folder = "Sent";
5429 $draft_folder = "Drafts";
5430 $show_prefix_option = false
;
5431 $default_sub_of_inbox = true
;
5432 $show_contain_subfolders_option = false
;
5433 $optional_delimiter = "detect";
5434 $allow_charset_search = false
;
5435 $disp_default_folder_prefix = $default_folder_prefix;
5438 } elsif ( $server eq "hmailserver" ) {
5439 $imap_server_type = "hmailserver";
5440 $default_folder_prefix = "";
5441 $trash_folder = "INBOX.Trash";
5442 $sent_folder = "INBOX.Sent";
5443 $draft_folder = "INBOX.Drafts";
5444 $show_prefix_option = false
;
5445 $default_sub_of_inbox = true
;
5446 $show_contain_subfolders_option = false
;
5447 $optional_delimiter = "detect";
5448 $allow_charset_search = false
;
5449 $disp_default_folder_prefix = $default_folder_prefix;
5450 $delete_folder = false
;
5451 $force_username_lowercase = false
;
5454 } elsif ( $server eq "mercury32" ) {
5455 $imap_server_type = "mercury32";
5456 $default_folder_prefix = "";
5457 $trash_folder = "Trash";
5458 $sent_folder = "Sent";
5459 $draft_folder = "Drafts";
5460 $show_prefix_option = false
;
5461 $default_sub_of_inbox = true
;
5462 $show_contain_subfolders_option = true
;
5463 $optional_delimiter = "detect";
5464 $delete_folder = true
;
5465 $force_username_lowercase = true
;
5468 } elsif ( $server eq "dovecot" ) {
5469 $imap_server_type = "dovecot";
5470 $default_folder_prefix = "";
5471 $trash_folder = "Trash";
5472 $sent_folder = "Sent";
5473 $draft_folder = "Drafts";
5474 $show_prefix_option = false
;
5475 $default_sub_of_inbox = false
;
5476 $show_contain_subfolders_option = false
;
5477 $delete_folder = false
;
5478 $force_username_lowercase = true
;
5479 $optional_delimiter = "detect";
5480 $disp_default_folder_prefix = "<none>";
5483 } elsif ( $server eq "bincimap" ) {
5484 $imap_server_type = "bincimap";
5485 $default_folder_prefix = "INBOX/";
5486 $trash_folder = "Trash";
5487 $sent_folder = "Sent";
5488 $draft_folder = "Drafts";
5489 $show_prefix_option = false
;
5490 $default_sub_of_inbox = false
;
5491 $show_contain_subfolders_option = false
;
5492 $delete_folder = true
;
5493 $force_username_lowercase = false
;
5494 $optional_delimiter = "detect";
5495 $disp_default_folder_prefix = $default_folder_prefix;
5497 # Default folder prefix depends on used depot.
5498 $message = "\nIf you use IMAPdir depot, you must set default folder prefix to empty string.\n";
5501 } elsif ( $server eq "gmail" ) {
5502 $imap_server_type = "gmail";
5503 $default_folder_prefix = "";
5504 $trash_folder = "[Gmail]/Trash";
5505 $default_move_to_trash = true
;
5506 $sent_folder = "[Gmail]/Sent Mail";
5507 $draft_folder = "[Gmail]/Drafts";
5508 $auto_create_special = false
;
5509 $show_prefix_option = false
;
5510 $default_sub_of_inbox = false
;
5511 $show_contain_subfolders_option = false
;
5512 $delete_folder = true
;
5513 $force_username_lowercase = false
;
5514 $optional_delimiter = "/";
5515 $disp_default_folder_prefix = "<none>";
5516 $domain = "gmail.com";
5517 $imapServerAddress = "imap.gmail.com";
5519 $use_imap_tls = true
;
5520 $imap_auth_mech = "login";
5521 $smtpServerAddress = "smtp.gmail.com";
5523 $pop_before_smtp = false
;
5524 $useSendmail = false
;
5525 $use_smtp_tls = true
;
5526 $smtp_auth_mech = "login";
5529 # Gmail changes system folder names (Drafts, Sent, Trash) out
5530 # from under you when the user changes language settings
5531 $message = "\nNOTE! When a user changes languages in Gmail's interface, the\n"
5532 . "Drafts, Sent and Trash folder names are changed to localized\n"
5533 . "versions thereof. To see those folders correctly in SquirrelMail,\n"
5534 . "the user should change the SquirrelMail language to match.\n"
5535 . "Moreover, SquirrelMail then needs to be told what folders to use\n"
5536 . "for Drafts, Sent and Trash in Options --> Folder Preferences.\n"
5537 . "These default settings will only correctly find the Sent, Trash\n"
5538 . "and Drafts folders if both Gmail and SquirrelMail languages are\n"
5539 . "set to English.\n\n"
5540 . "Also note that in some regions (Europe?), the default folder\n"
5541 . "names (see main menu selection 3. Folder Defaults) are different\n"
5542 . "(they may need to have the prefix \"[Google Mail]\" instead of\n"
5543 . "\"[Gmail]\") and \"Trash\" may be called \"Bin\" instead.\n";
5545 } elsif ( $server eq "quit" ) {
5548 $disp_default_folder_prefix = $default_folder_prefix;
5549 print "Unrecognized server: $server\n";
5553 print " imap_server_type = $imap_server_type\n";
5554 print " default_folder_prefix = $disp_default_folder_prefix\n";
5555 print " trash_folder = $trash_folder\n";
5556 print " sent_folder = $sent_folder\n";
5557 print " draft_folder = $draft_folder\n";
5558 print " show_prefix_option = $show_prefix_option\n";
5559 print " default_sub_of_inbox = $default_sub_of_inbox\n";
5560 print "show_contain_subfolders_option = $show_contain_subfolders_option\n";
5561 print " optional_delimiter = $optional_delimiter\n";
5562 print " delete_folder = $delete_folder\n";
5563 print " force_username_lowercase = $force_username_lowercase\n";
5567 print "\nPress enter to continue...";
5571 # This subroutine corrects relative paths to ensure they
5572 # will work within the SM space. If the path falls within
5573 # the SM directory tree, the SM_PATH variable will be
5574 # prepended to the path, if not, then the path will be
5575 # converted to an absolute path, e.g.
5576 # '../images/logo.gif' --> SM_PATH . 'images/logo.gif'
5577 # '../../someplace/data' --> '/absolute/path/someplace/data'
5578 # 'images/logo.gif' --> SM_PATH . 'config/images/logo.gif'
5579 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
5580 # 'C:\absolute\path\logo.gif' --> 'C:\absolute\path\logo.gif'
5581 # 'http://whatever/' --> 'http://whatever'
5582 # $some_var/path --> "$some_var/path"
5583 sub change_to_SM_path
() {
5584 my ($old_path) = @_;
5590 # If the path is absolute, don't bother.
5591 return "\'" . $old_path . "\'" if ( $old_path eq '');
5592 return "\'" . $old_path . "\'" if ( $old_path =~ /^(\/|http
)/ );
5593 return "\'" . $old_path . "\'" if ( $old_path =~ /^\w:(\\|\/)/ );
5594 return $old_path if ( $old_path =~ /^\'(\/|http
)/ );
5595 return $old_path if ( $old_path =~ /^\'\w:\// );
5596 return $old_path if ( $old_path =~ /^SM_PATH/);
5598 if ( $old_path =~ /^\$/ ) {
5599 # check if it's a single var, or a $var/path combination
5600 # if it's $var/path, enclose in ""
5601 if ( $old_path =~ /\// ) {
5602 return '"'.$old_path.'"';
5607 # Remove remaining '
5608 $old_path =~ s/\'//g;
5610 # For relative paths, split on '../'
5611 @rel_path = split(/\.\.\//, $old_path);
5613 if ( $#rel_path > 1 ) {
5614 # more than two levels away. Make it absolute.
5615 @abs_path = split(/\//, $dir);
5617 # Lop off the relative pieces of the absolute path..
5618 for ( $i = 0; $i <= $#rel_path; $i++ ) {
5622 push @abs_path, @rel_path;
5623 $new_path = "\'" . join('/', @abs_path) . "\'";
5624 } elsif ( $#rel_path > 0 ) {
5625 # it's within the SM tree, prepend SM_PATH
5626 $new_path = $old_path;
5627 $new_path =~ s/^\.\.\//SM_PATH
. \'/;
5630 # Last, it's a relative path without any leading '.'
5631 # Prepend SM_PATH and config, since the paths are
5632 # relative to the config directory
5633 $new_path = "SM_PATH . \'config/" . $old_path . "\'";
5639 # Change SM_PATH to admin-friendly version, e.g.:
5640 # SM_PATH . 'images/logo.gif' --> '../images/logo.gif'
5641 # SM_PATH . 'config/some.php' --> 'some.php'
5642 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
5643 # 'http://whatever/' --> 'http://whatever'
5644 sub change_to_rel_path
() {
5645 my ($old_path) = @_;
5646 my $new_path = $old_path;
5648 if ( $old_path =~ /^SM_PATH/ ) {
5649 # FIXME: the following replacement loses the opening quote mark!
5650 $new_path =~ s/^SM_PATH . \'/\.\.\//;
5651 $new_path =~ s/\.\.\/config\///;
5657 # Attempts to auto-detect if a specific auth mechanism is supported.
5658 # Called by 'command112a' and 'command112b'
5659 # ARGS: service-name (IMAP or SMTP), host:port, mech-name (ie. CRAM-MD5)
5660 sub detect_auth_support
{
5661 # Try loading IO::Socket
5662 unless (eval("use IO::Socket; 1")) {
5663 print "Perl IO::Socket module is not available.";
5667 my $service = shift;
5671 if ((!defined($service)) or (!defined($host)) or (!defined($mech))) {
5672 # Error - wrong # of args
5673 print "BAD ARGS!\n";
5677 if ($service eq 'SMTP') {
5678 $cmd = "AUTH $mech\r\n";
5679 $logout = "QUIT\r\n";
5680 } elsif ($service eq 'IMAP') {
5681 $cmd = "A01 AUTHENTICATE $mech\n";
5682 $logout = "C01 LOGOUT\n";
5684 # unknown service - whoops.
5688 # Get this show on the road
5689 my $sock=IO
::Socket
::INET
->new($host);
5690 if (!defined($sock)) {
5694 my $discard = <$sock>; # Server greeting/banner - who cares..
5696 if ($service eq 'SMTP') {
5698 print $sock "HELO $domain\r\n";
5699 $discard = <$sock>; # Yeah yeah, you're happy to see me..
5703 my $response = <$sock>;
5705 if (!defined($response)) {
5709 # So at this point, we have a response, and it is (hopefully) valid.
5710 if ($service eq 'SMTP') {
5711 if (!($response =~ /^334/)) {
5713 print $sock $logout;
5717 } elsif ($service eq 'IMAP') {
5718 if ($response =~ /^A01/) {
5720 print $sock $logout;
5725 # Unknown service - this shouldn't be able to happen.
5730 # If it gets here, the mech is supported
5731 print $sock "*\n"; # Attempt to cancel authentication
5732 print $sock $logout; # Try to log out, but we don't really care if this fails
5738 # Example code from O'Reilly Perl Cookbook
5745 return wantarray ?
@out : $out[0];
5748 sub clear_screen
() {
5749 if ( $^O
=~ /^mswin/i) {
5756 # checks IMAP mailbox name. Refuses to accept 8bit folders
5757 # returns 0 (folder name is not correct) or 1 (folder name is correct)
5758 sub check_imap_folder
($) {
5759 my $folder_name = shift(@_);
5761 if ($folder_name =~ /[\x80-\xFFFF]/) {
5762 print "Folder name contains 8bit characters. Configuration utility requires\n";
5763 print "UTF7-IMAP encoded folder names.\n";
5764 print "Press enter to continue...";
5767 } elsif ($folder_name =~ /[&\*\%]/) {
5768 # check for ampersand and list-wildcards
5769 print "Folder name contains special UTF7-IMAP characters.\n";
5770 print "Are you sure that folder name is correct? (y/N): ";
5772 $tmp = lc(trim
($tmp));
5773 if ($tmp =~ /^y$/) {
5783 # quotes string written in single quotes
5784 sub quote_single
($) {
5785 my $string = shift(@_);
5786 $string =~ s/\'/\\'/g;
5790 # determine a plugin's version number
5792 # parses the setup.php file, looking for the
5793 # version string in the <plugin>_info() or the
5794 # <plugin>_version functions.
5796 sub get_plugin_version
() {
5798 my $plugin_name = shift(@_);
5800 $setup_file = '../plugins/' . $plugin_name . '/setup.php';
5801 if ( -e
"$setup_file" ) {
5802 # Make sure that file is readable
5803 if (! -r
"$setup_file") {
5806 print "The file \"$setup_file\" was found, but you don't\n";
5807 print "have rights to read it. The plugin \"";
5808 print $plugin_name . "\" may not work correctly until you fix this.\n";
5809 print "\nPress enter to continue";
5816 # FIXME: grep the file instead of reading it into memory?
5818 open( FILE
, "$setup_file" );
5819 while ( $line = <FILE
> ) {
5820 $whole_file .= $line;
5824 # ideally, there is a version in the <plugin>_info function...
5826 if ($whole_file =~ /('version'\s*=>\s*['"](.*?)['"])/) {
5829 # this assumes there is only one function that returns
5830 # a static string in the setup file
5832 } elsif ($whole_file =~ /(return\s*['"](.*?)['"])/) {
5841 print "The file \"$setup_file\" was not found.\n";
5842 print "The plugin \"" . $plugin_name;
5843 print "\" may not work correctly until you fix this.\n";
5844 print "\nPress enter to continue";
5852 # determine a plugin's English name
5854 # parses the setup.php file, looking for the
5855 # English name in the <plugin>_info() function.
5857 sub get_plugin_english_name
() {
5859 my $plugin_name = shift(@_);
5861 $setup_file = '../plugins/' . $plugin_name . '/setup.php';
5862 if ( -e
"$setup_file" ) {
5863 # Make sure that file is readable
5864 if (! -r
"$setup_file") {
5867 print "The file \"$setup_file\" was found, but you don't\n";
5868 print "have rights to read it. The plugin \"";
5869 print $plugin_name . "\" may not work correctly until you fix this.\n";
5870 print "\nPress enter to continue";
5877 # FIXME: grep the file instead of reading it into memory?
5879 open( FILE
, "$setup_file" );
5880 while ( $line = <FILE
> ) {
5881 $whole_file .= $line;
5885 # the English name is in the <plugin>_info function or nothing...
5887 if ($whole_file =~ /('english_name'\s*=>\s*['"](.*?)['"])/) {
5888 $english_name .= $2;
5891 return $english_name;
5896 print "The file \"$setup_file\" was not found.\n";
5897 print "The plugin \"" . $plugin_name;
5898 print "\" may not work correctly until you fix this.\n";
5899 print "\nPress enter to continue";
5907 # parses the setup.php files for all activated plugins and
5908 # builds static plugin hooks array so we don't have to load
5909 # ALL plugins are runtime and build the hook array on every
5912 # hook array is saved in config/plugin_hooks.php
5914 # Note the $verbose variable at the top of this routine
5915 # can be set to zero to quiet it down.
5917 # NOTE/FIXME: we aren't necessarily interested in writing
5918 # a full-blown PHP parsing engine, so plenty
5919 # of assumptions are included herein about the
5920 # coding of the plugin setup files, and things
5921 # like commented out curly braces or other
5922 # such oddities can break this in a bad way.
5924 sub build_plugin_hook_array
() {
5932 if ( open( HOOKFILE
, ">plugin_hooks.php" ) ) {
5933 print HOOKFILE
"<?php\n";
5934 print HOOKFILE
"\n";
5936 print HOOKFILE
"/**\n";
5937 print HOOKFILE
" * SquirrelMail Plugin Hook Registration File\n";
5938 print HOOKFILE
" * Auto-generated using the configure script, conf.pl\n";
5939 print HOOKFILE
" */\n";
5940 print HOOKFILE
"\n";
5941 print HOOKFILE
"global \$squirrelmail_plugin_hooks;\n";
5942 print HOOKFILE
"\n";
5944 PLUGIN
: for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
5947 print "Activating plugin \"" . $plugins[$ct] . "\"...\n";
5950 $setup_file = '../plugins/' . $plugins[$ct] . '/setup.php';
5951 if ( -e
"$setup_file" ) {
5952 # Make sure that file is readable
5953 if (! -r
"$setup_file") {
5956 print "The file \"$setup_file\" was found, but you don't\n";
5957 print "have rights to read it. The plugin \"";
5958 print $plugins[$ct] . "\" will not be activated until you fix this.\n";
5959 print "\nPress enter to continue";
5964 open( FILE
, "$setup_file" );
5965 $inside_init_fxn = 0;
5967 while ( $line = <FILE
> ) {
5969 # throw away lines until we get to target function
5971 if (!$inside_init_fxn
5972 && $line !~ /^\s*function\s*squirrelmail_plugin_init_/i) {
5975 $inside_init_fxn = 1;
5985 # count close braces
5990 # leaving <plugin>_init() function...
5991 if ($brace_count == 0) {
5999 # throw away lines that are not exactly one "brace set" deep
6001 if ($brace_count > 1) {
6006 # also not interested in lines that are not
6007 # hook registration points
6009 if ($line !~ /^\s*\$squirrelmail_plugin_hooks/i) {
6014 # if $line does not have an ending semicolon,
6015 # we need to recursively read in subsequent
6016 # lines until we find one
6017 while ( $line !~ /;\s*$/ ) {
6018 $line =~ s/[\n\r]\s*$//;
6027 $var =~ s/=/EQUALS/;
6028 if ( $var =~ /^([a-z])/i ) {
6029 @options = split ( /\s*EQUALS\s*/, $var );
6030 $options[1] =~ s/[\n\r]//g;
6031 $options[1] =~ s/[\'\"];\s*$//;
6032 $options[1] =~ s/;$//;
6033 $options[1] =~ s/^[\'\"]//;
6034 # de-escape escaped strings
6035 $options[1] =~ s/\\'/'/g;
6036 $options[1] =~ s/\\\\/\\/g;
6038 if ( $options[0] =~ /^squirrelmail_plugin_hooks\s*\[\s*['"]([a-z0-9 \/._
*-]+)['"]\s*\]\s*\[\s*['"]([0-9a-z._-]+)['"]\s
*\
]/i
) {
6040 $hooked_plugin_name = $2;
6041 # Note: if we wanted to stop plugins from registering
6042 # a *different* plugin on a hook, we could catch
6043 # it here, however this has actually proven to be
6044 # a useful *feature*
6045 #if ($hooked_plugin_name ne $plugins[$ct]) {
6046 # print "...plugin is tring to hook in under different name...\n";
6049 #FIXME: do we want to count the number of hook registrations for each plugin and warn if a plugin doesn't have any?
6050 # hook registration has been found!
6052 if ($hooked_plugin_name ne $plugins[$ct]) {
6053 print " registering on hook \"" . $hook_name . "\" (as \"$hooked_plugin_name\" plugin)\n";
6055 print " registering on hook \"" . $hook_name . "\"\n";
6058 $line =~ s/ {2,}/ /g;
6060 print HOOKFILE
"\$$line";
6072 print "The file \"$setup_file\" was not found.\n";
6073 print "The plugin \"" . $plugins[$ct];
6074 print "\" will not be activated until you fix this.\n";
6075 print "\nPress enter to continue";
6083 print HOOKFILE
"\n\n";
6086 print "\nDone activating plugins; registration data saved in plugin_hooks.php\n\n";
6093 print "The file \"plugin_hooks.php\" was not able to be written to.\n";
6094 print "No plugins will be activated until you fix this.\n";
6095 print "\nPress enter to continue";
6103 # converts (binary) integer values that correspond
6104 # to the SquirrelMail debug mode constants (see
6105 # include/constants.php) into those constant strings
6106 # (bitwise or'd if more than one is enabled)
6108 # if the value passed in is not an integer, it is
6109 # returned unmolested
6111 sub convert_debug_binary_integer_to_constants
() {
6113 my ($debug_mode) = @_;
6114 if ($debug_mode =~ /^[^0-9]/) {
6117 $debug_mode = int($debug_mode);
6118 $new_debug_mode = '';
6120 # per include/constants.php, here are their values:
6122 # 0 SM_DEBUG_MODE_OFF
6123 # 1 SM_DEBUG_MODE_SIMPLE
6124 # 512 SM_DEBUG_MODE_MODERATE
6125 # 524288 SM_DEBUG_MODE_ADVANCED
6126 # 536870912 SM_DEBUG_MODE_STRICT
6128 if ($debug_mode & 1) {
6129 $new_debug_mode .= ' | SM_DEBUG_MODE_SIMPLE';
6131 if ($debug_mode & 512) {
6132 $new_debug_mode .= ' | SM_DEBUG_MODE_MODERATE';
6134 if ($debug_mode & 524288) {
6135 $new_debug_mode .= ' | SM_DEBUG_MODE_ADVANCED';
6137 if ($debug_mode & 536870912) {
6138 $new_debug_mode .= ' | SM_DEBUG_MODE_STRICT';
6141 $new_debug_mode =~ s/^ \| //;
6142 if (!$new_debug_mode) {
6143 $new_debug_mode = 'SM_DEBUG_MODE_OFF';
6146 return $new_debug_mode;
6149 # converts SquirrelMail debug mode constants (see
6150 # include/constants.php) into their corresponding
6151 # (binary) integer values
6153 # if the value passed in is an integer already, it
6154 # is returned unmolested
6156 sub convert_debug_constants_to_binary_integer
() {
6158 my ($debug_mode) = @_;
6159 if ($debug_mode =~ /^[0-9]/) {
6162 $new_debug_mode = 0;
6164 # per include/constants.php, here are their values:
6166 # 0 SM_DEBUG_MODE_OFF
6167 # 1 SM_DEBUG_MODE_SIMPLE
6168 # 512 SM_DEBUG_MODE_MODERATE
6169 # 524288 SM_DEBUG_MODE_ADVANCED
6170 # 536870912 SM_DEBUG_MODE_STRICT
6172 if ($debug_mode =~ /\bSM_DEBUG_MODE_OFF\b/) {
6173 $new_debug_mode = 0;
6175 if ($debug_mode =~ /\bSM_DEBUG_MODE_SIMPLE\b/) {
6176 $new_debug_mode |= 1;
6178 if ($debug_mode =~ /\bSM_DEBUG_MODE_MODERATE\b/) {
6179 $new_debug_mode |= 512;
6181 if ($debug_mode =~ /\bSM_DEBUG_MODE_ADVANCED\b/) {
6182 $new_debug_mode |= 524288;
6184 if ($debug_mode =~ /\bSM_DEBUG_MODE_STRICT\b/) {
6185 $new_debug_mode |= 536870912;
6188 return $new_debug_mode;
6191 # Function to print n column numbered lists
6193 # WARNING: the names in the list will be truncated
6194 # to fit in their respective columns based on the
6195 # screen width and number of columns.
6197 # Expected arguments (in this order):
6199 # * The start number to use for the list
6200 # * The number of columns to use
6201 # * The screen width
6202 # * Boolean (zero/one), indicating
6203 # whether or not to show item numbers
6204 # * The list of strings to be shown
6206 # Returns: The number printed on screen of the last item in the list
6208 sub print_multi_col_list
{
6209 my ($num, $cols, $screen_width, $show_numbering, @list) = @_;
6219 $rows = int(@list / $cols);
6220 if (@list % $cols) { $rows++; }
6221 if ($show_numbering) { $col_width = int(($screen_width - 2) / $cols) - 5; }
6222 else { $col_width = int(($screen_width - 2) / $cols) - 2; }
6224 # build the layout array so numbers run down each column
6226 for ( $x = 0; $x < @list; $x++ ) {
6228 $layout[$row_cnt][$col_cnt] = $list[$x];
6229 $numbers[$row_cnt][$col_cnt] = $num++;
6231 # move to next column
6233 if ($row_cnt == $rows - 1) {
6237 else { $row_cnt++; }
6241 # if we filled up fewer rows than needed, recalc column width
6243 if ($rows * $col_cnt == @list) { $col_cnt--; } # loop above ended right after increment
6244 if ($col_cnt + 1 < $cols) {
6245 if ($show_numbering) { $col_width = int(($screen_width - 2) / ($col_cnt + 1)) - 5; }
6246 else { $col_width = int(($screen_width - 2) / ($col_cnt + 1)) - 2; }
6252 for ( $row_cnt = 0; $row_cnt <= $rows; $row_cnt++ ) {
6258 # iterate columns for this row
6260 for ( $col_cnt = 0; $col_cnt <= $cols; $col_cnt++ ) {
6261 if ($layout[$row_cnt][$col_cnt]) {
6263 if ($show_numbering) { printf "$WHT% 2u.$NRM", $numbers[$row_cnt][$col_cnt]; }
6264 printf " %-$col_width." . $col_width . "s", $layout[$row_cnt][$col_cnt];