4 # Copyright (c) 1999-2019 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 );
518 $allow_svg_display = 'false' if ( !$allow_svg_display );
519 $block_svg_download = 'false' if ( !$block_svg_download );
520 $fix_broken_base64_encoded_messages = 'false' if ( !$fix_broken_base64_encoded_messages );
522 if ( $ARGV[0] eq '--install-plugin' ) {
523 print "Activating plugin " . $ARGV[1] . "\n";
524 if ( -d
"../plugins/" . $ARGV[1]) {
525 push @plugins, $ARGV[1];
529 print "No such plugin.\n";
532 } elsif ( $ARGV[0] eq '--remove-plugin' ) {
533 print "Removing plugin " . $ARGV[1] . "\n";
534 foreach $plugin (@plugins) {
535 if ( $plugin ne $ARGV[1] ) {
536 push @newplugins, $plugin;
539 @plugins = @newplugins;
542 } elsif ( $ARGV[0] eq '--update-plugins' or $ARGV[0] eq '-u') {
543 build_plugin_hook_array
();
545 } elsif ( $ARGV[0] eq '--help' or $ARGV[0] eq '-h') {
546 print "SquirrelMail Configuration Script\n";
548 print " * No arguments: initiates the configuration dialog\n";
549 print " * --install-plugin <plugin> : activates the specified plugin\n";
550 print " * --remove-plugin <plugin> : deactivates the specified plugin\n";
551 print " * --update-plugins , -u : rebuilds plugin_hooks.php according\n";
552 print " to plugins activated in config.php\n";
553 print " * --help , -h : Displays this help\n";
560 ####################################################################################
562 # used in multiple places, define once
563 $list_supported_imap_servers =
564 " bincimap = Binc IMAP server\n" .
565 " courier = Courier IMAP server\n" .
566 " cyrus = Cyrus IMAP server\n" .
567 " dovecot = Dovecot Secure IMAP server\n" .
568 " exchange = Microsoft Exchange IMAP server\n" .
569 " hmailserver = hMailServer\n" .
570 " macosx = Mac OS X Mailserver\n" .
571 " mercury32 = Mercury/32\n" .
572 " uw = University of Washington's IMAP server\n" .
573 " gmail = IMAP access to Google mail (Gmail) accounts\n";
575 #####################################################################################
576 if ( $config_use_color == 1 ) {
582 $config_use_color = 2;
585 # lists can be printed in more than one column; default is just one
589 # try to get screen width dynamically if possible; default to 80
590 # (user can override with "w#" command)
592 eval { require "sys/ioctl.ph" };
594 || !defined &TIOCGWINSZ
595 || !open(TTY
, "+</dev/tty")
596 || !ioctl(TTY
, &TIOCGWINSZ
, $winsize='')) {
599 ($row, $col, $xpixel, $ypixel) = unpack('S4', $winsize);
600 $screen_width = $col;
603 while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
605 print $WHT. "SquirrelMail Configuration : " . $NRM;
606 if ( $config == 1 ) { print "Read: config.php"; }
607 elsif ( $config == 2 ) { print "Read: config_default.php"; }
608 print "\nConfig version $print_config_version; SquirrelMail version $sm_version\n";
609 print "---------------------------------------------------------\n";
612 print $WHT. "Main Menu --\n" . $NRM;
613 print "1. Organization Preferences\n";
614 print "2. Server Settings\n";
615 print "3. Folder Defaults\n";
616 print "4. General Options\n";
617 print "5. User Interface\n";
618 print "6. Address Books\n";
619 print "7. Message of the Day (MOTD)\n";
620 print "8. Plugins\n";
621 print "9. Database\n";
622 print "10. Language settings\n";
623 print "11. Tweaks\n";
625 print "D. Set pre-defined settings for specific IMAP servers\n";
627 } elsif ( $menu == 1 ) {
628 print $WHT. "Organization Preferences\n" . $NRM;
629 print "1. Organization Name : $WHT$org_name$NRM\n";
630 print "2. Organization Logo : $WHT$org_logo$NRM\n";
631 print "3. Org. Logo Width/Height : $WHT($org_logo_width/$org_logo_height)$NRM\n";
632 print "4. Organization Title : $WHT$org_title$NRM\n";
633 print "5. Signout Page : $WHT$signout_page$NRM\n";
634 print "6. Top Frame : $WHT$frame_top$NRM\n";
635 print "7. Provider link : $WHT$provider_uri$NRM\n";
636 print "8. Provider link text : $WHT$provider_name$NRM\n";
639 print "R Return to Main Menu\n";
640 } elsif ( $menu == 2 ) {
641 print $WHT. "Server Settings\n\n" . $NRM;
642 print $WHT . "General" . $NRM . "\n";
644 print "1. Domain : $WHT$domain$NRM\n";
645 print "2. Invert Time : $WHT$invert_time$NRM\n";
646 print "3. Sendmail or SMTP : $WHT";
647 if ( lc($useSendmail) eq 'true' ) {
655 if ( $show_imap_settings ) {
656 print $WHT . "IMAP Settings". $NRM . "\n--------------\n";
657 print "4. IMAP Server : $WHT$imapServerAddress$NRM\n";
658 print "5. IMAP Port : $WHT$imapPort$NRM\n";
659 print "6. Authentication type : $WHT$imap_auth_mech$NRM\n";
660 print "7. Secure IMAP (TLS) : $WHT" . display_use_tls
($use_imap_tls) . "$NRM\n";
661 print "8. Server software : $WHT$imap_server_type$NRM\n";
662 print "9. Delimiter : $WHT$optional_delimiter$NRM\n";
664 } elsif ( $show_smtp_settings ) {
665 if ( lc($useSendmail) eq 'true' ) {
666 print $WHT . "Sendmail" . $NRM . "\n--------\n";
667 print "4. Sendmail Path : $WHT$sendmail_path$NRM\n";
668 print "5. Sendmail arguments : $WHT$sendmail_args$NRM\n";
669 print "6. Header encryption key : $WHT$encode_header_key$NRM\n";
672 print $WHT . "SMTP Settings" . $NRM . "\n-------------\n";
673 print "4. SMTP Server : $WHT$smtpServerAddress$NRM\n";
674 print "5. SMTP Port : $WHT$smtpPort$NRM\n";
675 print "6. POP before SMTP : $WHT$pop_before_smtp$NRM\n";
676 print "7. SMTP Authentication : $WHT$smtp_auth_mech" . display_smtp_sitewide_userpass
() ."$NRM\n";
677 print "8. Secure SMTP (TLS) : $WHT" . display_use_tls
($use_smtp_tls) . "$NRM\n";
678 print "9. Header encryption key : $WHT$encode_header_key$NRM\n";
683 if ($show_imap_settings == 0) {
684 print "A. Update IMAP Settings : ";
685 print "$WHT$imapServerAddress$NRM:";
686 print "$WHT$imapPort$NRM ";
687 print "($WHT$imap_server_type$NRM)\n";
689 if ($show_smtp_settings == 0) {
690 if ( lc($useSendmail) eq 'true' ) {
691 print "B. Change Sendmail Config : $WHT$sendmail_path$NRM\n";
693 print "B. Update SMTP Settings : ";
694 print "$WHT$smtpServerAddress$NRM:";
695 print "$WHT$smtpPort$NRM\n";
698 if ( $show_smtp_settings || $show_imap_settings )
701 ($show_imap_settings ?
"IMAP Server" :
702 (lc($useSendmail) eq 'true') ?
"Sendmail" : "SMTP") . " Settings\n";
706 print "R Return to Main Menu\n";
707 } elsif ( $menu == 3 ) {
708 print $WHT. "Folder Defaults\n" . $NRM;
709 print "1. Default Folder Prefix : $WHT$default_folder_prefix$NRM\n";
710 print "2. Show Folder Prefix Option : $WHT$show_prefix_option$NRM\n";
711 print "3. Trash Folder : $WHT$trash_folder$NRM\n";
712 print "4. Sent Folder : $WHT$sent_folder$NRM\n";
713 print "5. Drafts Folder : $WHT$draft_folder$NRM\n";
714 print "6. By default, move to trash : $WHT$default_move_to_trash$NRM\n";
715 print "7. By default, save sent messages : $WHT$default_move_to_sent$NRM\n";
716 print "8. By default, save as draft : $WHT$default_save_as_draft$NRM\n";
717 print "9. List Special Folders First : $WHT$list_special_folders_first$NRM\n";
718 print "10. Show Special Folders Color : $WHT$use_special_folder_color$NRM\n";
719 print "11. Auto Expunge : $WHT$auto_expunge$NRM\n";
720 print "12. Default Sub. of INBOX : $WHT$default_sub_of_inbox$NRM\n";
721 print "13. Show 'Contain Sub.' Option : $WHT$show_contain_subfolders_option$NRM\n";
722 print "14. Default Unseen Notify : $WHT$default_unseen_notify$NRM\n";
723 print "15. Default Unseen Type : $WHT$default_unseen_type$NRM\n";
724 print "16. Auto Create Special Folders : $WHT$auto_create_special$NRM\n";
725 print "17. Folder Delete Bypasses Trash : $WHT$delete_folder$NRM\n";
726 print "18. Enable /NoSelect folder fix : $WHT$noselect_fix_enable$NRM\n";
728 print "R Return to Main Menu\n";
729 } elsif ( $menu == 4 ) {
730 print $WHT. "General Options\n" . $NRM;
731 print "1. Data Directory : $WHT$data_dir$NRM\n";
732 print "2. Attachment Directory : $WHT$attachment_dir$NRM\n";
733 print "3. Directory Hash Level : $WHT$dir_hash_level$NRM\n";
734 print "4. Default Left Size : $WHT$default_left_size$NRM\n";
735 print "5. Usernames in Lowercase : $WHT$force_username_lowercase$NRM\n";
736 print "6. Allow use of priority : $WHT$default_use_priority$NRM\n";
737 print "7. Hide SM attributions : $WHT$hide_sm_attributions$NRM\n";
738 print "8. Allow use of receipts : $WHT$default_use_mdn$NRM\n";
739 print "9. Allow editing of identity : $WHT$edit_identity$NRM\n";
740 print " Allow editing of name : $WHT$edit_name$NRM\n";
741 print " Allow editing of reply-to : $WHT$edit_reply_to$NRM\n";
742 print " Remove username from header : $WHT$hide_auth_header$NRM\n";
743 print "10. Disable server thread sort : $WHT$disable_thread_sort$NRM\n";
744 print "11. Disable server-side sorting : $WHT$disable_server_sort$NRM\n";
745 print "12. Allow server charset search : $WHT$allow_charset_search$NRM\n";
746 print "13. Allow advanced search : $WHT$allow_advanced_search$NRM\n";
747 print "14. PHP session name : $WHT$session_name$NRM\n";
748 print "15. Time zone configuration : $WHT$time_zone_type$NRM\n";
749 print "16. Location base : $WHT$config_location_base$NRM\n";
750 print "17. Only secure cookies if poss. : $WHT$only_secure_cookies$NRM\n";
751 print "18. Disable secure forms : $WHT$disable_security_tokens$NRM\n";
752 print "19. Page referal requirement : $WHT$check_referrer$NRM\n";
753 print "20. Security image : $WHT" . (lc($use_transparent_security_image) eq 'true' ?
'Transparent' : 'Textual') . "$NRM\n";
754 print "21. Display login error from IMAP: $WHT$display_imap_login_error$NRM\n";
755 print "22. Show inline SVG objects : $WHT$allow_svg_display$NRM\n";
756 print "23. Block downloading SVG objects: $WHT$block_svg_download$NRM\n";
757 print "24. Fix broken base64 messages : $WHT$fix_broken_base64_encoded_messages$NRM\n";
759 print "R Return to Main Menu\n";
760 } elsif ( $menu == 5 ) {
761 print $WHT. "User Interface\n" . $NRM;
762 print "1. Use Icons? : $WHT$use_icons$NRM\n";
763 # print "3. Default Icon Set : $WHT$icon_theme_def$NRM\n";
764 print "2. Default font size : $WHT$default_fontsize$NRM\n";
765 print "3. Manage template sets (skins)\n";
766 print "4. Manage user themes\n";
767 print "5. Manage font sets\n";
768 print "6. Manage icon themes\n";
771 print "R Return to Main Menu\n";
772 } elsif ( $menu == 6 ) {
773 print $WHT. "Address Books\n" . $NRM;
774 print "1. Change LDAP Servers\n";
775 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
776 print " > $ldap_host[$count]\n";
778 print "2. Use Javascript address book search : $WHT$default_use_javascript_addr_book$NRM\n";
779 print "3. Global address book file : $WHT$abook_global_file$NRM\n";
780 print "4. Allow writing into global file address book : $WHT$abook_global_file_writeable$NRM\n";
781 print "5. Allow listing of global file address book : $WHT$abook_global_file_listing$NRM\n";
782 print "6. Allowed address book line length : $WHT$abook_file_line_length$NRM\n";
784 print "R Return to Main Menu\n";
785 } elsif ( $menu == 7 ) {
786 print $WHT. "Message of the Day (MOTD)\n" . $NRM;
789 print "1 Edit the MOTD\n";
791 print "R Return to Main Menu\n";
792 } elsif ( $menu == 8 ) {
793 if (lc($disable_plugins) eq 'true' && $disable_plugins_user ne '') {
794 print $WHT. "Plugins (WARNING: All plugins are currently disabled\n for the user \"$disable_plugins_user\"!)\n" . $NRM;
795 } elsif (lc($disable_plugins) eq 'true') {
796 print $WHT. "Plugins (WARNING: All plugins are currently disabled!)\n" . $NRM;
798 print $WHT. "Plugins\n" . $NRM;
800 print " Installed Plugins\n";
802 $num = print_multi_col_list
(1, $columns, $screen_width, 1, @plugins);
805 for ( $count = 0 ; $count <= $#plugins ; $count++ ) {
807 $english_name = get_plugin_english_name
($plugins[$count]);
808 if ( $english_name eq "" ) {
809 print " $WHT$num.$NRM $plugins[$count]" . get_plugin_version
($plugins[$count]) . "\n";
811 print " $WHT$num.$NRM $english_name ($plugins[$count])" . get_plugin_version
($plugins[$count]) . "\n";
815 print "\n Available Plugins:\n";
816 opendir( DIR
, "../plugins" );
817 @files = sort(readdir(DIR
));
819 @unused_plugins = ();
820 for ( $i = 0 ; $i <= $#files ; $i++ ) {
821 if ( -d
"../plugins/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne ".svn" ) {
823 for ( $k = 0 ; $k <= $#plugins ; $k++ ) {
824 if ( $plugins[$k] eq $files[$i] ) {
829 $unused_plugins[$pos] = $files[$i];
836 $num = print_multi_col_list
($num + 1, $columns, $screen_width, 1, @unused_plugins);
838 for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
840 $english_name = get_plugin_english_name
($unused_plugins[$i]);
841 if ( $english_name eq "" ) {
842 print " $WHT$num.$NRM $unused_plugins[$i]" . get_plugin_version
($unused_plugins[$i]) . "\n";
844 print " $WHT$num.$NRM $english_name ($unused_plugins[$i])" . get_plugin_version
($unused_plugins[$i]) . "\n";
851 if (lc($disable_plugins) eq 'true' && $disable_plugins_user ne '') {
852 print "E Enable active plugins (all plugins currently\n disabled for the user \"$disable_plugins_user\")\n";
853 } elsif (lc($disable_plugins) eq 'true') {
854 print "E Enable active plugins (all plugins currently\n disabled)\n";
856 print "D Disable all plugins\n";
858 print "U Set the user for whom plugins can be disabled\n";
859 print "R Return to Main Menu\n";
860 print "C# List plugins in <#> number of columns\n";
861 print "W# Change screen width to <#> (currently $screen_width)\n";
862 } elsif ( $menu == 9 ) {
863 print $WHT. "Database\n" . $NRM;
864 print "1. DSN for Address Book : $WHT$addrbook_dsn$NRM\n";
865 print "2. Table for Address Book : $WHT$addrbook_table$NRM\n";
867 print "3. DSN for Preferences : $WHT$prefs_dsn$NRM\n";
868 print "4. Table for Preferences : $WHT$prefs_table$NRM\n";
869 print "5. Field for username : $WHT$prefs_user_field$NRM ($prefs_user_size)\n";
870 print "6. Field for prefs key : $WHT$prefs_key_field$NRM ($prefs_key_size)\n";
871 print "7. Field for prefs value : $WHT$prefs_val_field$NRM ($prefs_val_size)\n";
873 print "8. DSN for Global Address Book : $WHT$addrbook_global_dsn$NRM\n";
874 print "9. Table for Global Address Book : $WHT$addrbook_global_table$NRM\n";
875 print "10. Allow writing into Global Address Book : $WHT$addrbook_global_writeable$NRM\n";
876 print "11. Allow listing of Global Address Book : $WHT$addrbook_global_listing$NRM\n";
878 print "R Return to Main Menu\n";
879 } elsif ( $menu == 10 ) {
880 print $WHT. "Language settings\n" . $NRM;
881 print "1. Default Language : $WHT$squirrelmail_default_language$NRM\n";
882 print "2. Default Charset : $WHT$default_charset$NRM\n";
883 print "3. Show alternative language names : $WHT$show_alternative_names$NRM\n";
884 print "4. Enable aggressive decoding : $WHT$aggressive_decoding$NRM\n";
885 print "5. Enable lossy encoding : $WHT$lossy_encoding$NRM\n";
887 print "R Return to Main Menu\n";
888 } elsif ( $menu == 11 ) {
889 print $WHT. "Interface tweaks\n" . $NRM;
890 print "1. Display html mails in iframe : $WHT$use_iframe$NRM\n";
891 print "2. Ask user info on first login : $WHT$ask_user_info$NRM\n";
893 print $WHT. "PHP tweaks\n" . $NRM;
894 print "4. Use php recode functions : $WHT$use_php_recode$NRM\n";
895 print "5. Use php iconv functions : $WHT$use_php_iconv$NRM\n";
896 print "6. Buffer all output : $WHT$buffer_output$NRM\n";
898 print $WHT. "Configuration tweaks\n" . $NRM;
899 print "7. Allow remote configtest : $WHT$allow_remote_configtest$NRM\n";
900 print "8. Debug mode : $WHT$sm_debug_mode$NRM\n";
901 print "9. Secured configuration mode : $WHT$secured_config$NRM\n";
902 print "10. HTTPS port : $WHT$sq_https_port$NRM\n";
903 print "11. Ignore HTTP_X_FORWARDED headers: $WHT$sq_ignore_http_x_forwarded_headers$NRM\n";
905 print "R Return to Main Menu\n";
907 if ( $config_use_color == 1 ) {
908 print "C Turn color off\n";
910 print "C Turn color on\n";
912 print "S Save data\n";
916 print "Command >> " . $WHT;
918 $command =~ s/[\n\r]//g;
919 $command =~ tr/A-Z/a-z/;
922 # Read the commands they entered.
923 if ( $command eq "r" ) {
925 } elsif ( $command eq "s" ) {
927 print "Press enter to continue...";
930 } elsif ( ( $command eq "q" ) && ( $saved == 0 ) ) {
931 print "You have not saved your data.\n";
932 print "Save? [" . $WHT . "Y" . $NRM . "/n]: ";
934 if ( ( $save =~ /^y/i ) || ( $save =~ /^\s*$/ ) ) {
937 } elsif ( $command eq "c" ) {
938 if ( $config_use_color == 1 ) {
939 $config_use_color = 2;
943 $config_use_color = 1;
947 } elsif ( $command =~ /^w([0-9]+)/ ) {
949 } elsif ( $command eq "d" && $menu == 0 ) {
954 if ( ( $command > 0 ) && ( $command < 12 ) ) {
957 } elsif ( $menu == 1 ) {
958 if ( $command == 1 ) { $org_name = command1
(); }
959 elsif ( $command == 2 ) { $org_logo = command2
(); }
960 elsif ( $command == 3 ) { ($org_logo_width,$org_logo_height) = command2a
(); }
961 elsif ( $command == 4 ) { $org_title = command3
(); }
962 elsif ( $command == 5 ) { $signout_page = command4
(); }
963 elsif ( $command == 6 ) { $frame_top = command6
(); }
964 elsif ( $command == 7 ) { $provider_uri = command7
(); }
965 elsif ( $command == 8 ) { $provider_name = command8
(); }
967 } elsif ( $menu == 2 ) {
968 if ( $command eq "a" ) { $show_imap_settings = 1; $show_smtp_settings = 0; }
969 elsif ( $command eq "b" ) { $show_imap_settings = 0; $show_smtp_settings = 1; }
970 elsif ( $command eq "h" ) { $show_imap_settings = 0; $show_smtp_settings = 0; }
971 elsif ( $command <= 3 ) {
972 if ( $command == 1 ) { $domain = command11
(); }
973 elsif ( $command == 2 ) { $invert_time = command110
(); }
974 elsif ( $command == 3 ) { $useSendmail = command14
(); }
975 $show_imap_settings = 0; $show_smtp_settings = 0;
976 } elsif ( $show_imap_settings ) {
977 if ( $command == 4 ) { $imapServerAddress = command12
(); }
978 elsif ( $command == 5 ) { $imapPort = command13
(); }
979 elsif ( $command == 6 ) { $imap_auth_mech = command112a
(); }
980 elsif ( $command == 7 ) { $use_imap_tls = command_use_tls
("IMAP",$use_imap_tls); }
981 elsif ( $command == 8 ) { $imap_server_type = command19
(); }
982 elsif ( $command == 9 ) { $optional_delimiter = command111
(); }
983 } elsif ( $show_smtp_settings && lc($useSendmail) eq 'true' ) {
984 if ( $command == 4 ) { $sendmail_path = command15
(); }
985 elsif ( $command == 5 ) { $sendmail_args = command_sendmail_args
(); }
986 elsif ( $command == 6 ) { $encode_header_key = command114
(); }
987 } elsif ( $show_smtp_settings ) {
988 if ( $command == 4 ) { $smtpServerAddress = command16
(); }
989 elsif ( $command == 5 ) { $smtpPort = command17
(); }
990 elsif ( $command == 6 ) { $pop_before_smtp = command18a
(); }
991 elsif ( $command == 7 ) { $smtp_auth_mech = command112b
(); }
992 elsif ( $command == 8 ) { $use_smtp_tls = command_use_tls
("SMTP",$use_smtp_tls); }
993 elsif ( $command == 9 ) { $encode_header_key = command114
(); }
995 } elsif ( $menu == 3 ) {
996 if ( $command == 1 ) { $default_folder_prefix = command21
(); }
997 elsif ( $command == 2 ) { $show_prefix_option = command22
(); }
998 elsif ( $command == 3 ) { $trash_folder = command23a
(); }
999 elsif ( $command == 4 ) { $sent_folder = command23b
(); }
1000 elsif ( $command == 5 ) { $draft_folder = command23c
(); }
1001 elsif ( $command == 6 ) { $default_move_to_trash = command24a
(); }
1002 elsif ( $command == 7 ) { $default_move_to_sent = command24b
(); }
1003 elsif ( $command == 8 ) { $default_save_as_draft = command24c
(); }
1004 elsif ( $command == 9 ) { $list_special_folders_first = command27
(); }
1005 elsif ( $command == 10 ) { $use_special_folder_color = command28
(); }
1006 elsif ( $command == 11 ) { $auto_expunge = command29
(); }
1007 elsif ( $command == 12 ) { $default_sub_of_inbox = command210
(); }
1008 elsif ( $command == 13 ) { $show_contain_subfolders_option = command211
(); }
1009 elsif ( $command == 14 ) { $default_unseen_notify = command212
(); }
1010 elsif ( $command == 15 ) { $default_unseen_type = command213
(); }
1011 elsif ( $command == 16 ) { $auto_create_special = command214
(); }
1012 elsif ( $command == 17 ) { $delete_folder = command215
(); }
1013 elsif ( $command == 18 ) { $noselect_fix_enable = command216
(); }
1014 } elsif ( $menu == 4 ) {
1015 if ( $command == 1 ) { $data_dir = command33a
(); }
1016 elsif ( $command == 2 ) { $attachment_dir = command33b
(); }
1017 elsif ( $command == 3 ) { $dir_hash_level = command33c
(); }
1018 elsif ( $command == 4 ) { $default_left_size = command35
(); }
1019 elsif ( $command == 5 ) { $force_username_lowercase = command36
(); }
1020 elsif ( $command == 6 ) { $default_use_priority = command37
(); }
1021 elsif ( $command == 7 ) { $hide_sm_attributions = command38
(); }
1022 elsif ( $command == 8 ) { $default_use_mdn = command39
(); }
1023 elsif ( $command == 9 ) { $edit_identity = command310
(); }
1024 elsif ( $command == 10 ) { $disable_thread_sort = command312
(); }
1025 elsif ( $command == 11 ) { $disable_server_sort = command313
(); }
1026 elsif ( $command == 12 ) { $allow_charset_search = command314
(); }
1027 elsif ( $command == 13 ) { $allow_advanced_search = command316
(); }
1028 elsif ( $command == 14 ) { $session_name = command317
(); }
1029 elsif ( $command == 15 ) { $time_zone_type = command318
(); }
1030 elsif ( $command == 16 ) { $config_location_base = command_config_location_base
(); }
1031 elsif ( $command == 17 ) { $only_secure_cookies = command319
(); }
1032 elsif ( $command == 18 ) { $disable_security_tokens = command320
(); }
1033 elsif ( $command == 19 ) { $check_referrer = command321
(); }
1034 elsif ( $command == 20 ) { $use_transparent_security_image = command322
(); }
1035 elsif ( $command == 21 ) { $display_imap_login_error = command323
(); }
1036 elsif ( $command == 22 ) { $allow_svg_display = command324
(); }
1037 elsif ( $command == 23 ) { $block_svg_download = command325
(); }
1038 elsif ( $command == 24 ) { $fix_broken_base64_encoded_messages = command326
(); }
1039 } elsif ( $menu == 5 ) {
1040 if ( $command == 1 ) { $use_icons = commandB3
(); }
1041 # elsif ( $command == 3 ) { $icon_theme_def = command53(); }
1042 elsif ( $command == 2 ) { $default_fontsize = command_default_fontsize
(); }
1043 elsif ( $command == 3 ) { $templateset_default = command_templates
(); }
1044 elsif ( $command == 4 ) { command_userThemes
(); }
1045 elsif ( $command == 5 ) { command_fontsets
(); }
1046 elsif ( $command == 6 ) { command_iconSets
(); }
1047 } elsif ( $menu == 6 ) {
1048 if ( $command == 1 ) { command61
(); }
1049 elsif ( $command == 2 ) { command62
(); }
1050 elsif ( $command == 3 ) { $abook_global_file=command63
(); }
1051 elsif ( $command == 4 ) { command64
(); }
1052 elsif ( $command == 5 ) { command65
(); }
1053 elsif ( $command == 6 ) { command_abook_file_line_length
(); }
1054 } elsif ( $menu == 7 ) {
1055 if ( $command == 1 ) { $motd = command71
(); }
1056 } elsif ( $menu == 8 ) {
1057 if ( $command =~ /^[0-9]+/ ) { @plugins = command81
(); }
1058 elsif ( $command eq "u" ) { $disable_plugins_user = command82
(); }
1059 elsif ( $command eq "d" ) { $disable_plugins = 'true'; }
1060 elsif ( $command eq "e" ) { $disable_plugins = 'false'; }
1061 elsif ( $command =~ /^c([0-9]+)/ ) { $columns = $1; }
1062 } elsif ( $menu == 9 ) {
1063 if ( $command == 1 ) { $addrbook_dsn = command91
(); }
1064 elsif ( $command == 2 ) { $addrbook_table = command92
(); }
1065 elsif ( $command == 3 ) { $prefs_dsn = command93
(); }
1066 elsif ( $command == 4 ) { $prefs_table = command94
(); }
1067 elsif ( $command == 5 ) { $prefs_user_field = command95
(); }
1068 elsif ( $command == 6 ) { $prefs_key_field = command96
(); }
1069 elsif ( $command == 7 ) { $prefs_val_field = command97
(); }
1070 elsif ( $command == 8 ) { $addrbook_global_dsn = command98
(); }
1071 elsif ( $command == 9 ) { $addrbook_global_table = command99
(); }
1072 elsif ( $command == 10 ) { $addrbook_global_writeable = command910
(); }
1073 elsif ( $command == 11 ) { $addrbook_global_listing = command911
(); }
1074 } elsif ( $menu == 10 ) {
1075 if ( $command == 1 ) { $squirrelmail_default_language = commandA1
(); }
1076 elsif ( $command == 2 ) { $default_charset = commandA2
(); }
1077 elsif ( $command == 3 ) { $show_alternative_names = commandA3
(); }
1078 elsif ( $command == 4 ) { $aggressive_decoding = commandA4
(); }
1079 elsif ( $command == 5 ) { $lossy_encoding = commandA5
(); }
1080 } elsif ( $menu == 11 ) {
1081 if ( $command == 1 ) { $use_iframe = commandB2
(); }
1082 elsif ( $command == 2 ) { $ask_user_info = command_ask_user_info
(); }
1083 elsif ( $command == 4 ) { $use_php_recode = commandB4
(); }
1084 elsif ( $command == 5 ) { $use_php_iconv = commandB5
(); }
1085 elsif ( $command == 6 ) { $buffer_output = commandB6
(); }
1086 elsif ( $command == 7 ) { $allow_remote_configtest = commandB7
(); }
1087 elsif ( $command == 8 ) { $sm_debug_mode = commandB8
(); }
1088 elsif ( $command == 9 ) { $secured_config = commandB9
(); }
1089 elsif ( $command == 10 ) { $sq_https_port = commandB10
(); }
1090 elsif ( $command == 11 ) { $sq_ignore_http_x_forwarded_headers = commandB11
(); }
1096 print "\nExiting conf.pl.\n".
1097 "You might want to test your configuration by browsing to\n".
1098 "http://your-squirrelmail-location/src/configtest.php\n".
1099 "Happy SquirrelMailing!\n\n";
1102 ####################################################################################
1106 print "We have tried to make the name SquirrelMail as transparent as\n";
1107 print "possible. If you set up an organization name, most places where\n";
1108 print "SquirrelMail would take credit will be credited to your organization.\n";
1110 print "If your Organization Name includes a '\$', please precede it with a \\. \n";
1111 print "Other '\$' will be considered the beginning of a variable that\n";
1112 print "must be defined before the \$org_name is printed.\n";
1114 print "[$WHT$org_name$NRM]: $WHT";
1115 $new_org_name = <STDIN
>;
1116 if ( $new_org_name eq "\n" ) {
1117 $new_org_name = $org_name;
1119 $new_org_name =~ s/[\r\n]//g;
1120 $new_org_name =~ s/\"/"/g;
1122 return $new_org_name;
1127 print "Your organization's logo is an image that will be displayed at\n";
1128 print "different times throughout SquirrelMail. ";
1130 print "Please be aware of the following: \n";
1131 print " - Relative URLs are relative to the config dir\n";
1132 print " to use the default logo, use ../images/sm_logo.png\n";
1133 print " - To specify a logo defined outside the SquirrelMail source tree\n";
1134 print " use the absolute URL the webserver would use to include the file\n";
1135 print " e.g. http://example.com/images/mylogo.gif or /images/mylogo.jpg\n";
1137 print "[$WHT$org_logo$NRM]: $WHT";
1138 $new_org_logo = <STDIN
>;
1139 if ( $new_org_logo eq "\n" ) {
1140 $new_org_logo = $org_logo;
1142 $new_org_logo =~ s/[\r\n]//g;
1144 return $new_org_logo;
1149 print "Your organization's logo is an image that will be displayed at\n";
1150 print "different times throughout SquirrelMail. Width\n";
1151 print "and Height of your logo image. Use '0' to disable.\n";
1153 print "Width: [$WHT$org_logo_width$NRM]: $WHT";
1154 $new_org_logo_width = <STDIN
>;
1155 $new_org_logo_width =~ tr/0-9//cd; # only want digits!
1156 if ( $new_org_logo_width eq '' ) {
1157 $new_org_logo_width = $org_logo_width;
1159 if ( $new_org_logo_width > 0 ) {
1160 print "Height: [$WHT$org_logo_height$NRM]: $WHT";
1161 $new_org_logo_height = <STDIN
>;
1162 $new_org_logo_height =~ tr/0-9//cd; # only want digits!
1163 if( $new_org_logo_height eq '' ) {
1164 $new_org_logo_height = $org_logo_height;
1167 $new_org_logo_height = 0;
1169 return ($new_org_logo_width, $new_org_logo_height);
1174 print "A title is what is displayed at the top of the browser window in\n";
1175 print "the titlebar. Usually this will end up looking something like:\n";
1176 print "\"Netscape: $org_title\"\n";
1178 print "If your Organization Title includes a '\$', please precede it with a \\. \n";
1179 print "Other '\$' will be considered the beginning of a variable that\n";
1180 print "must be defined before the \$org_title is printed.\n";
1182 print "[$WHT$org_title$NRM]: $WHT";
1183 $new_org_title = <STDIN
>;
1184 if ( $new_org_title eq "\n" ) {
1185 $new_org_title = $org_title;
1187 $new_org_title =~ s/[\r\n]//g;
1188 $new_org_title =~ s/\"/\'/g;
1190 return $new_org_title;
1195 print "When users click the Sign Out button they will be logged out and\n";
1196 print "then sent to signout_page. If signout_page is left empty,\n";
1197 print "(hit space and then return) they will be taken, as normal,\n";
1198 print "to the default and rather sparse SquirrelMail signout page.\n";
1200 print "[$WHT$signout_page$NRM]: $WHT";
1201 $new_signout_page = <STDIN
>;
1202 if ( $new_signout_page eq "\n" ) {
1203 $new_signout_page = $signout_page;
1205 $new_signout_page =~ s/[\r\n]//g;
1206 $new_signout_page =~ s/^\s+$//g;
1208 return $new_signout_page;
1213 print "SquirrelMail defaults to using the whole of the browser window.\n";
1214 print "This allows you to keep it within a specified frame. The default\n";
1215 print "is '_top'\n";
1217 print "[$WHT$frame_top$NRM]: $WHT";
1218 $new_frame_top = <STDIN
>;
1219 if ( $new_frame_top eq "\n" ) {
1220 $new_frame_top = '_top';
1222 $new_frame_top =~ s/[\r\n]//g;
1223 $new_frame_top =~ s/^\s+$//g;
1225 return $new_frame_top;
1228 # Default link to provider
1230 print "Here you can set the link on the top-right of the message list.\n";
1231 print "If empty, it will not be displayed.\n";
1233 print "[$WHT$provider_uri$NRM]: $WHT";
1234 $new_provider_uri = <STDIN
>;
1235 if ( $new_provider_uri eq "\n" ) {
1236 $new_provider_uri = '';
1238 $new_provider_uri =~ s/[\r\n]//g;
1239 $new_provider_uri =~ s/^\s+$//g;
1241 return $new_provider_uri;
1245 print "Here you can set the name of the link on the top-right of the message list.\n";
1246 print "The default is empty (do not display anything).'\n";
1248 print "[$WHT$provider_name$NRM]: $WHT";
1249 $new_provider_name = <STDIN
>;
1250 if ( $new_provider_name eq "\n" ) {
1251 $new_provider_name = '';
1253 $new_provider_name =~ s/[\r\n]//g;
1254 $new_provider_name =~ s/^\s+$//g;
1255 $new_provider_name =~ s/\'/\\'/g;
1257 return $new_provider_name;
1260 ####################################################################################
1264 print "The domain name is the suffix at the end of all email addresses. If\n";
1265 print "for example, your email address is jdoe\@example.com, then your domain\n";
1266 print "would be example.com.\n";
1268 print "[$WHT$domain$NRM]: $WHT";
1269 $new_domain = <STDIN
>;
1270 if ( $new_domain eq "\n" ) {
1271 $new_domain = $domain;
1273 $new_domain =~ s/\s//g;
1280 print "This is the hostname where your IMAP server can be contacted.\n";
1281 print "[$WHT$imapServerAddress$NRM]: $WHT";
1282 $new_imapServerAddress = <STDIN
>;
1283 if ( $new_imapServerAddress eq "\n" ) {
1284 $new_imapServerAddress = $imapServerAddress;
1286 $new_imapServerAddress =~ s/[\r\n]//g;
1288 return $new_imapServerAddress;
1293 print "This is the port that your IMAP server is on. Usually this is 143.\n";
1294 print "[$WHT$imapPort$NRM]: $WHT";
1295 $new_imapPort = <STDIN
>;
1296 if ( $new_imapPort eq "\n" ) {
1297 $new_imapPort = $imapPort;
1299 $new_imapPort =~ s/[\r\n]//g;
1301 return $new_imapPort;
1306 print "You now need to choose the method that you will use for sending\n";
1307 print "messages in SquirrelMail. You can either connect to an SMTP server\n";
1308 print "or use sendmail directly.\n";
1309 if ( lc($useSendmail) eq 'true' ) {
1310 $default_value = "1";
1312 $default_value = "2";
1315 print " 1. Sendmail\n";
1317 print "Your choice [1/2] [$WHT$default_value$NRM]: $WHT";
1318 $use_sendmail = <STDIN
>;
1319 if ( ( $use_sendmail =~ /^1\n/i )
1320 || ( ( $use_sendmail =~ /^\n/ ) && ( $default_value eq "1" ) ) ) {
1321 $useSendmail = 'true';
1323 $useSendmail = 'false';
1325 return $useSendmail;
1330 print "Specify where the sendmail executable is located. Usually /usr/sbin/sendmail\n";
1331 print "[$WHT$sendmail_path$NRM]: $WHT";
1332 $new_sendmail_path = <STDIN
>;
1333 if ( $new_sendmail_path eq "\n" ) {
1334 $new_sendmail_path = $sendmail_path;
1336 $new_sendmail_path =~ s/[\r\n]//g;
1338 return $new_sendmail_path;
1341 # Extra sendmail arguments
1342 sub command_sendmail_args
{
1343 print "Specify additional sendmail program arguments.\n";
1345 print "Make sure that arguments are supported by your sendmail program. -f argument \n";
1346 print "is added automatically by SquirrelMail scripts. Variable defaults to standard\n";
1347 print "/usr/sbin/sendmail arguments. If you use qmail-inject, nbsmtp or any other \n";
1348 print "sendmail wrapper, which does not support -i and -t arguments, set variable to\n";
1349 print "empty string or use arguments suitable for your mailer.\n";
1351 print "[$WHT$sendmail_args$NRM]: $WHT";
1352 $new_sendmail_args = <STDIN
>;
1353 if ( $new_sendmail_args eq "\n" ) {
1354 $new_sendmail_args = $sendmail_args;
1356 # strip linefeeds and crs.
1357 $new_sendmail_args =~ s/[\r\n]//g;
1359 return trim
($new_sendmail_args);
1364 print "This is the hostname of your SMTP server.\n";
1365 print "[$WHT$smtpServerAddress$NRM]: $WHT";
1366 $new_smtpServerAddress = <STDIN
>;
1367 if ( $new_smtpServerAddress eq "\n" ) {
1368 $new_smtpServerAddress = $smtpServerAddress;
1370 $new_smtpServerAddress =~ s/[\r\n]//g;
1372 return $new_smtpServerAddress;
1377 print "This is the port to connect to for SMTP. Usually 25.\n";
1378 print "[$WHT$smtpPort$NRM]: $WHT";
1379 $new_smtpPort = <STDIN
>;
1380 if ( $new_smtpPort eq "\n" ) {
1381 $new_smtpPort = $smtpPort;
1383 $new_smtpPort =~ s/[\r\n]//g;
1385 return $new_smtpPort;
1390 print "Do you wish to use POP3 before SMTP? Your server must\n";
1391 print "support this in order for SquirrelMail to work with it.\n";
1394 $YesNo = 'y' if ( lc($pop_before_smtp) eq 'true' );
1396 print "Use POP before SMTP (y/n) [$WHT$YesNo$NRM]: $WHT";
1398 $new_pop_before_smtp = <STDIN
>;
1399 $new_pop_before_smtp =~ tr/yn//cd;
1400 if ( $new_pop_before_smtp eq "y" ) {
1401 $new_pop_before_smtp = "true";
1402 } elsif ( $new_pop_before_smtp eq "n" ) {
1403 $new_pop_before_smtp = "false";
1405 $new_pop_before_smtp = $pop_before_smtp;
1408 # if using POP before SMTP, allow setting of custom POP server address
1409 if ($new_pop_before_smtp eq "true") {
1410 print "$NRM\nIf the address of the POP server is not the same as\n";
1411 print "your SMTP server, you may specify it here. Leave blank (to\n";
1412 print "clear this, enter only spaces) to use the same address as\n";
1413 print "your SMTP server.\n";
1414 print "POP before SMTP server address [$WHT$pop_before_smtp_host$NRM]: $WHT";
1416 $new_pop_before_smtp_host = <STDIN
>;
1417 if ( $new_pop_before_smtp_host eq "\n" ) {
1418 $new_pop_before_smtp_host = $pop_before_smtp_host;
1419 } elsif ($new_pop_before_smtp_host =~ /^\s+$/) {
1420 $new_pop_before_smtp_host = '';
1422 $new_pop_before_smtp_host =~ s/[\r|\n]//g;
1424 $pop_before_smtp_host = $new_pop_before_smtp_host;
1427 return $new_pop_before_smtp;
1432 print "Each IMAP server has its own quirks. As much as we tried to stick\n";
1433 print "to standards, it doesn't help much if the IMAP server doesn't follow\n";
1434 print "the same principles. We have made some work-arounds for some of\n";
1435 print "these servers. If you would like to use them, please select your\n";
1436 print "IMAP server. If you do not wish to use these work-arounds, you can\n";
1437 print "set this to \"other\", and none will be used.\n";
1438 print $list_supported_imap_servers;
1440 print " other = Not one of the above servers\n";
1442 print "[$WHT$imap_server_type$NRM]: $WHT";
1443 $new_imap_server_type = <STDIN
>;
1445 if ( $new_imap_server_type eq "\n" ) {
1446 $new_imap_server_type = $imap_server_type;
1448 $new_imap_server_type =~ s/[\r\n]//g;
1450 return $new_imap_server_type;
1455 print "Sometimes the date of messages sent is messed up (off by a few hours\n";
1456 print "on some machines). Typically this happens if the system doesn't support\n";
1457 print "tm_gmtoff. It will happen only if your time zone is \"negative\".\n";
1458 print "This most often occurs on Solaris 7 machines in the United States.\n";
1459 print "By default, this is off. It should be kept off unless problems surface\n";
1460 print "about the time that messages are sent.\n";
1461 print " no = Do NOT fix time -- almost always correct\n";
1462 print " yes = Fix the time for this system\n";
1465 $YesNo = 'y' if ( lc($invert_time) eq 'true' );
1467 print "Fix the time for this system (y/n) [$WHT$YesNo$NRM]: $WHT";
1469 $new_invert_time = <STDIN
>;
1470 $new_invert_time =~ tr/yn//cd;
1471 return 'true' if ( $new_invert_time eq "y" );
1472 return 'false' if ( $new_invert_time eq "n" );
1473 return $invert_time;
1477 print "This is the delimiter that your IMAP server uses to distinguish between\n";
1478 print "folders. For example, Cyrus uses '.' as the delimiter and a complete\n";
1479 print "folder would look like 'INBOX.Friends.Bob', while UW uses '/' and would\n";
1480 print "look like 'INBOX/Friends/Bob'. Normally this should be left at 'detect'\n";
1481 print "but if you are sure you know what delimiter your server uses, you can\n";
1482 print "specify it here.\n";
1483 print "\nTo have it autodetect the delimiter, set it to 'detect'.\n\n";
1484 print "[$WHT$optional_delimiter$NRM]: $WHT";
1485 $new_optional_delimiter = <STDIN
>;
1487 if ( $new_optional_delimiter eq "\n" ) {
1488 $new_optional_delimiter = $optional_delimiter;
1490 $new_optional_delimiter =~ s/[\r\n]//g;
1492 return $new_optional_delimiter;
1494 # IMAP authentication type
1495 # Possible values: login, plain, cram-md5, digest-md5
1496 # Now offers to detect supported mechs, assuming server & port are set correctly
1499 if ($use_imap_tls ne "0") {
1500 # 1. Script does not handle TLS.
1501 # 2. Server does not have to declare all supported authentication mechs when
1502 # STARTTLS is used. Supported mechs are declared only after STARTTLS.
1503 print "Auto-detection of login methods is unavailable when using TLS or STARTTLS.\n";
1505 print "If you have already set the hostname and port number, I can try to\n";
1506 print "detect the mechanisms your IMAP server supports.\n";
1507 print "I will try to detect CRAM-MD5 and DIGEST-MD5 support. I can't test\n";
1508 print "for \"login\" or \"plain\" without knowing a username and password.\n";
1509 print "Auto-detecting is optional - you can safely say \"n\" here.\n";
1510 print "\nTry to detect supported mechanisms? [y/N]: ";
1513 if ($inval =~ /^y\b/i) {
1514 # Yes, let's try to detect.
1515 print "Trying to detect IMAP capabilities...\n";
1516 my $host = $imapServerAddress . ':'. $imapPort;
1517 print "CRAM-MD5:\t";
1518 my $tmp = detect_auth_support
('IMAP',$host,'CRAM-MD5');
1519 if (defined($tmp)) {
1520 if ($tmp eq 'YES') {
1521 print "$WHT SUPPORTED$NRM\n";
1523 print "$WHT NOT SUPPORTED$NRM\n";
1526 print $WHT . " ERROR DETECTING$NRM\n";
1529 print "DIGEST-MD5:\t";
1530 $tmp = detect_auth_support
('IMAP',$host,'DIGEST-MD5');
1531 if (defined($tmp)) {
1532 if ($tmp eq 'YES') {
1533 print "$WHT SUPPORTED$NRM\n";
1535 print "$WHT NOT SUPPORTED$NRM\n";
1538 print $WHT . " ERROR DETECTING$NRM\n";
1543 print "\nWhat authentication mechanism do you want to use for IMAP connections?\n\n";
1544 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1545 print $WHT . "plain" . $NRM . " - SASL PLAIN. If you need this, you already know it.\n";
1546 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext methods.\n";
1547 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1548 print "\n*** YOUR IMAP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n";
1549 print "If you don't understand or are unsure, you probably want \"login\"\n\n";
1550 print "login, plain, cram-md5, or digest-md5 [$WHT$imap_auth_mech$NRM]: $WHT";
1553 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || ($inval =~ /^login\b/i) || ($inval =~ /^plain\b/i)) {
1556 # user entered garbage or default value so nothing needs to be set
1557 return $imap_auth_mech;
1562 # SMTP authentication type
1563 # Possible choices: none, login, plain, cram-md5, digest-md5
1565 if ($use_smtp_tls ne "0") {
1566 print "Auto-detection of login methods is unavailable when using TLS or STARTTLS.\n";
1567 } elsif (eval ("use IO::Socket; 1")) {
1568 # try loading IO::Socket module
1569 print "If you have already set the hostname and port number, I can try to\n";
1570 print "automatically detect some of the mechanisms your SMTP server supports.\n";
1571 print "Auto-detection is *optional* - you can safely say \"n\" here.\n";
1572 print "\nTry to detect auth mechanisms? [y/N]: ";
1575 if ($inval =~ /^y\b/i) {
1576 # Yes, let's try to detect.
1577 print "Trying to detect supported methods (SMTP)...\n";
1580 # Check none by trying to relay to junk@microsoft.com
1581 $host = $smtpServerAddress . ':' . $smtpPort;
1582 my $sock = IO
::Socket
::INET
->new($host);
1583 print "Testing none:\t\t$WHT";
1584 if (!defined($sock)) {
1585 print " ERROR TESTING\n";
1588 $got = <$sock>; # Discard greeting
1589 print $sock "HELO $domain\r\n";
1590 $got = <$sock>; # Discard
1591 print $sock "MAIL FROM:<tester\@squirrelmail.org>\r\n";
1592 $got = <$sock>; # Discard
1593 print $sock "RCPT TO:<junk\@microsoft.com\r\n";
1594 $got = <$sock>; # This is the important line
1595 if ($got =~ /^250\b/) { # SMTP will relay without auth
1596 print "SUPPORTED$NRM\n";
1598 print "NOT SUPPORTED$NRM\n";
1600 print $sock "RSET\r\n";
1601 print $sock "QUIT\r\n";
1605 # Try login (SquirrelMail default)
1606 print "Testing login:\t\t";
1607 $tmp=detect_auth_support
('SMTP',$host,'LOGIN');
1608 if (defined($tmp)) {
1609 if ($tmp eq 'YES') {
1610 print $WHT . "SUPPORTED$NRM\n";
1612 print $WHT . "NOT SUPPORTED$NRM\n";
1615 print $WHT . "ERROR DETECTING$NRM\n";
1619 print "Testing plain:\t\t";
1620 $tmp=detect_auth_support
('SMTP',$host,'PLAIN');
1621 if (defined($tmp)) {
1622 if ($tmp eq 'YES') {
1623 print $WHT . "SUPPORTED$NRM\n";
1625 print $WHT . "NOT SUPPORTED$NRM\n";
1628 print $WHT . "ERROR DETECTING$NRM\n";
1632 print "Testing CRAM-MD5:\t";
1633 $tmp=detect_auth_support
('SMTP',$host,'CRAM-MD5');
1634 if (defined($tmp)) {
1635 if ($tmp eq 'YES') {
1636 print $WHT . "SUPPORTED$NRM\n";
1638 print $WHT . "NOT SUPPORTED$NRM\n";
1641 print $WHT . "ERROR DETECTING$NRM\n";
1645 print "Testing DIGEST-MD5:\t";
1646 $tmp=detect_auth_support
('SMTP',$host,'DIGEST-MD5');
1647 if (defined($tmp)) {
1648 if ($tmp eq 'YES') {
1649 print $WHT . "SUPPORTED$NRM\n";
1651 print $WHT . "NOT SUPPORTED$NRM\n";
1654 print $WHT . "ERROR DETECTING$NRM\n";
1658 print "\nWhat authentication mechanism do you want to use for SMTP connections?\n";
1659 print $WHT . "none" . $NRM . " - Your SMTP server does not require authorization.\n";
1660 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1661 print $WHT . "plain" . $NRM . " - SASL PLAIN. Plaintext. If you can do better, you probably should.\n";
1662 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext.\n";
1663 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1664 print $WHT . "\n*** YOUR SMTP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n" . $NRM;
1665 print "If you don't understand or are unsure, you probably want \"none\"\n\n";
1666 print "none, login, plain, cram-md5, or digest-md5 [$WHT$smtp_auth_mech$NRM]: $WHT";
1669 if ($inval =~ /^none\b/i) {
1670 # remove sitewide smtp authentication information
1671 $smtp_sitewide_user = '';
1672 $smtp_sitewide_pass = '';
1673 # SMTP doesn't necessarily require logins
1675 } elsif ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) ||
1676 ($inval =~ /^login\b/i) || ($inval =~/^plain\b/i)) {
1677 command_smtp_sitewide_userpass
($inval);
1679 } elsif (trim
($inval) eq '') {
1680 # user selected default value
1681 command_smtp_sitewide_userpass
($smtp_auth_mech);
1682 return $smtp_auth_mech;
1684 # user entered garbage
1685 return $smtp_auth_mech;
1689 sub command_smtp_sitewide_userpass
($) {
1690 # get first function argument
1691 my $auth_mech = shift(@_);
1693 $auth_mech = lc(trim
($auth_mech));
1694 if ($auth_mech eq 'none') {
1697 print "SMTP authentication uses IMAP username and password by default.\n";
1699 print "Would you like to use other login and password for all SquirrelMail \n";
1700 print "SMTP connections?";
1701 if ($smtp_sitewide_user ne '') {
1718 $smtp_sitewide_user = '';
1719 $smtp_sitewide_pass = '';
1720 } elsif ($tmp eq 'y') {
1721 print "Enter username [$smtp_sitewide_user]:";
1722 my $new_user = <STDIN
>;
1723 $new_user = trim
($new_user);
1724 if ($new_user ne '') {
1725 $smtp_sitewide_user = $new_user;
1727 if ($smtp_sitewide_user ne '') {
1728 print "If you don't enter any password, current sitewide password will be used.\n";
1729 print "If you enter space, password will be set to empty string.\n";
1730 print "Enter password:";
1731 my $new_pass = <STDIN
>;
1732 if ($new_pass ne "\n") {
1733 $smtp_sitewide_pass = trim
($new_pass);
1736 print "Invalid input. You must set username used for SMTP authentication.\n";
1737 print "Click enter to continue\n";
1741 print "Invalid input\n";
1742 print "Click enter to continue\n";
1747 # Sub adds information about SMTP authentication type to menu
1748 sub display_smtp_sitewide_userpass
() {
1750 if ($smtp_auth_mech ne 'none') {
1751 if ($smtp_sitewide_user ne '') {
1752 $ret = ' (with custom username and password)';
1754 $ret = ' (with IMAP username and password)';
1761 # This sub is reused for IMAP and SMTP
1762 # Args: service name, default value
1763 sub command_use_tls
{
1764 my($default_val,$service,$inval);
1767 print "TLS (Transport Layer Security) encrypts the traffic between server and client.\n";
1768 print "STARTTLS extensions allow to start encryption on existing plain text connection.\n";
1769 print "These options add specific PHP and IMAP server configuration requirements.\n";
1770 print "See SquirrelMail documentation about connection security.\n";
1772 print "If your " . $service . " server is localhost, you can safely disable this.\n";
1773 print "If it is remote, you may wish to seriously consider enabling this.\n";
1775 while ($valid_input eq 0) {
1776 print "\nSelect connection security model:\n";
1777 print " 0 - Use plain text connection\n";
1778 print " 1 - Use TLS connection\n";
1779 print " 2 - Use STARTTLS extension\n";
1780 print "Select [$default_val]: ";
1782 $inval=trim
($inval);
1783 if ($inval =~ /^[012]$/ || $inval eq '') {
1787 if ($inval ne '') {$default_val = $inval};
1788 return $default_val;
1791 # This sub is used to display human readable text for
1792 # $use_imap_tls and $use_smtp_tls values in conf.pl menu
1793 sub display_use_tls
($) {
1794 my $val = shift(@_);
1795 my $ret = 'disabled';
1798 } elsif ($val eq '1') {
1804 # $encode_header_key
1806 print "This encryption key allows the hiding of SquirrelMail Received:\n";
1807 print "headers in outbound messages. SquirrelMail uses the encryption\n";
1808 print "key to encode the username, remote address, and proxied address\n";
1809 print "and then stores that encoded information in X-Squirrel-* headers.\n";
1811 print "Warning: the encryption function used to accomplish this is not\n";
1812 print "bulletproof. When used with a static encryption key as it is here,\n";
1813 print "it provides only minimal security and the encoded user information\n";
1814 print "in the X-Squirrel-* headers can be decoded quickly by a skilled\n";
1815 print "attacker.\n";
1817 print "When you need to inspect an email sent from your system with the\n";
1818 print "X-Squirrel-* headers, you can decode the user information therein\n";
1819 print "by using the decrypt_headers.php script found in the SquirrelMail\n";
1820 print "contrib/ directory. You'll need the encryption key that you\n";
1821 print "defined here when doing so.\n";
1823 print "Enter encryption key: ";
1824 $new_encode_header_key = <STDIN
>;
1825 if ( $new_encode_header_key eq "\n" ) {
1826 $new_encode_header_key = $encode_header_key;
1828 $new_encode_header_key =~ s/[\r\n]//g;
1830 return $new_encode_header_key;
1835 print "\nYou can now create the welcome message that is displayed\n";
1836 print "every time a user logs on. You can use HTML or just plain\n";
1838 "text. If you do not wish to have one, just make it blank.\n\n(Type @ on a blank line to exit)\n";
1844 $line =~ s/[\r\n]//g;
1845 if ( $line ne "@" ) {
1846 $line =~ s/ /\ \ /g;
1847 $line =~ s/\t/\ \ \ \ /g;
1849 $line =~ s/\"/\\\"/g;
1851 $new_motd = $new_motd . $line;
1853 } while ( $line ne "@" );
1857 ################# PLUGINS ###################
1860 $command =~ s/[\s\n\r]*//g;
1861 if ( $command > 0 ) {
1862 $command = $command - 1;
1863 if ( $command <= $#plugins ) {
1866 while ( $ct <= $#plugins ) {
1867 if ( $ct != $command ) {
1868 @newplugins = ( @newplugins, $plugins[$ct] );
1872 @plugins = @newplugins;
1873 } elsif ( $command <= $#plugins + $#unused_plugins + 1 ) {
1874 $num = $command - $#plugins - 1;
1875 @newplugins = @plugins;
1877 while ( $ct <= $#unused_plugins ) {
1878 if ( $ct == $num ) {
1879 @newplugins = ( @newplugins, $unused_plugins[$ct] );
1883 @plugins = @newplugins;
1889 # disable_plugins_user
1891 print "When all active plugins are disabled, they can be disabled only\n";
1892 print "for the one user named here. If left blank, plugins will be\n";
1893 print "disabled for ALL users. This setting has no effect if plugins\n";
1894 print "are not disabled.\n";
1896 print "This must be the exact IMAP login name for the desired user.\n";
1898 print "[$WHT$disable_plugins_user$NRM]: $WHT";
1899 $new_disable_plugins_user = <STDIN
>;
1900 if ( $new_disable_plugins_user eq "\n" ) {
1901 $new_disable_plugins_user = $disable_plugins_user;
1903 $new_disable_plugins_user =~ s/[\r\n]//g;
1905 return $new_disable_plugins_user;
1908 ################# FOLDERS ###################
1910 # default_folder_prefix
1912 print "Some IMAP servers (UW, for example) store mail and folders in\n";
1913 print "your user space in a separate subdirectory. This is where you\n";
1914 print "specify what that directory is.\n";
1916 print "EXAMPLE: mail/";
1918 print "NOTE: If you use Cyrus, or some server that would not use this\n";
1919 print " option, you must set this to 'none'.\n";
1921 print "[$WHT$default_folder_prefix$NRM]: $WHT";
1922 $new_default_folder_prefix = <STDIN
>;
1924 if ( $new_default_folder_prefix eq "\n" ) {
1925 $new_default_folder_prefix = $default_folder_prefix;
1927 $new_default_folder_prefix =~ s/[\r\n]//g;
1929 if ( ( $new_default_folder_prefix =~ /^\s*$/ ) || ( $new_default_folder_prefix =~ m/^none$/i ) ) {
1930 $new_default_folder_prefix = "";
1932 # add the trailing delimiter only if we know what the server is.
1933 if (($imap_server_type eq 'cyrus' and
1934 $optional_delimiter eq 'detect') or
1935 ($imap_server_type eq 'courier' and
1936 $optional_delimiter eq 'detect')) {
1937 $new_default_folder_prefix =~ s/\.*$/\./;
1938 } elsif ($imap_server_type eq 'uw' and
1939 $optional_delimiter eq 'detect') {
1940 $new_default_folder_prefix =~ s/\/*$/\
//;
1943 return $new_default_folder_prefix;
1946 # Show Folder Prefix
1948 print "It is possible to set up the default folder prefix as a user\n";
1949 print "specific option, where each user can specify what their mail\n";
1950 print "folder is. If you set this to false, they will never see the\n";
1951 print "option, but if it is true, this option will appear in the\n";
1952 print "'options' section.\n";
1954 print "NOTE: You set the default folder prefix in option '1' of this\n";
1955 print " section. That will be the default if the user doesn't\n";
1956 print " specify anything different.\n";
1959 if ( lc($show_prefix_option) eq 'true' ) {
1960 $default_value = "y";
1962 $default_value = "n";
1965 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1966 $new_show = <STDIN
>;
1967 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1968 $show_prefix_option = 'true';
1970 $show_prefix_option = 'false';
1972 return $show_prefix_option;
1977 print "You can now specify where the default trash folder is located.\n";
1978 print "On servers where you do not want this, you can set it to anything\n";
1979 print "and set option 6 to false.\n";
1981 print "This is relative to where the rest of your email is kept. You do\n";
1982 print "not need to worry about their mail directory. If this folder\n";
1983 print "would be ~/mail/trash on the filesystem, you only need to specify\n";
1984 print "that this is 'trash', and be sure to put 'mail/' in option 1.\n";
1987 print "[$WHT$trash_folder$NRM]: $WHT";
1988 $new_trash_folder = <STDIN
>;
1989 if ( $new_trash_folder eq "\n" ) {
1990 $new_trash_folder = $trash_folder;
1992 if (check_imap_folder
($new_trash_folder)) {
1993 $new_trash_folder =~ s/[\r\n]//g;
1995 $new_trash_folder = $trash_folder;
1998 return $new_trash_folder;
2003 print "This is where messages that are sent will be stored. SquirrelMail\n";
2004 print "by default puts a copy of all outgoing messages in this folder.\n";
2006 print "This is relative to where the rest of your email is kept. You do\n";
2007 print "not need to worry about their mail directory. If this folder\n";
2008 print "would be ~/mail/sent on the filesystem, you only need to specify\n";
2009 print "that this is 'sent', and be sure to put 'mail/' in option 1.\n";
2012 print "[$WHT$sent_folder$NRM]: $WHT";
2013 $new_sent_folder = <STDIN
>;
2014 if ( $new_sent_folder eq "\n" ) {
2015 $new_sent_folder = $sent_folder;
2017 if (check_imap_folder
($new_sent_folder)) {
2018 $new_sent_folder =~ s/[\r\n]//g;
2020 $new_sent_folder = $sent_folder;
2023 return $new_sent_folder;
2028 print "You can now specify where the default draft folder is located.\n";
2029 print "On servers where you do not want this, you can set it to anything\n";
2030 print "and set option 9 to false.\n";
2032 print "This is relative to where the rest of your email is kept. You do\n";
2033 print "not need to worry about their mail directory. If this folder\n";
2034 print "would be ~/mail/drafts on the filesystem, you only need to specify\n";
2035 print "that this is 'drafts', and be sure to put 'mail/' in option 1.\n";
2038 print "[$WHT$draft_folder$NRM]: $WHT";
2039 $new_draft_folder = <STDIN
>;
2040 if ( $new_draft_folder eq "\n" ) {
2041 $new_draft_folder = $draft_folder;
2043 if (check_imap_folder
($new_draft_folder)) {
2044 $new_draft_folder =~ s/[\r\n]//g;
2046 $new_draft_folder = $draft_folder;
2049 return $new_draft_folder;
2052 # default move to trash
2054 print "By default, should messages get moved to the trash folder? You\n";
2055 print "can specify the default trash folder in option 3. If this is set\n";
2056 print "to false, messages will get deleted immediately without moving\n";
2057 print "to the trash folder.\n";
2059 print "Trash folder is currently: $trash_folder\n";
2062 if ( lc($default_move_to_trash) eq 'true' ) {
2063 $default_value = "y";
2065 $default_value = "n";
2067 print "By default, move to trash (y/n) [$WHT$default_value$NRM]: $WHT";
2068 $new_show = <STDIN
>;
2069 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2070 $default_move_to_trash = 'true';
2072 $default_move_to_trash = 'false';
2074 return $default_move_to_trash;
2077 # default move to sent (save sent messages)
2079 print "By default, should copies of outgoing messages get saved in the\n";
2080 print "sent folder? You can specify the default sent folder in option 4.\n";
2081 print "If this is set to false, messages will get sent and no copy will\n";
2084 print "Sent folder is currently: $sent_folder\n";
2087 if ( lc($default_move_to_sent) eq 'true' ) {
2088 $default_value = "y";
2090 $default_value = "n";
2092 print "By default, save sent messages (y/n) [$WHT$default_value$NRM]: $WHT";
2093 $new_show = <STDIN
>;
2094 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2095 $default_move_to_sent = 'true';
2097 $default_move_to_sent = 'false';
2099 return $default_move_to_sent;
2102 # default save as draft
2104 print "By default, should the save to draft option be shown? You can\n";
2105 print "specify the default drafts folder in option 5. If this is set\n";
2106 print "to false, users will not be shown the save to draft option.\n";
2108 print "Drafts folder is currently: $draft_folder\n";
2111 if ( lc($default_save_as_draft) eq 'true' ) {
2112 $default_value = "y";
2114 $default_value = "n";
2116 print "By default, save as draft (y/n) [$WHT$default_value$NRM]: $WHT";
2117 $new_show = <STDIN
>;
2118 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2119 $default_save_as_draft = 'true';
2121 $default_save_as_draft = 'false';
2123 return $default_save_as_draft;
2126 # List special folders first
2128 print "SquirrelMail has what we call 'special folders' that are not\n";
2129 print "manipulated and viewed like normal folders. Some examples of\n";
2130 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
2131 print "Simply asks if you want these folders listed first in the folder\n";
2135 if ( lc($list_special_folders_first) eq 'true' ) {
2136 $default_value = "y";
2138 $default_value = "n";
2141 print "List first (y/n) [$WHT$default_value$NRM]: $WHT";
2142 $new_show = <STDIN
>;
2143 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2144 $list_special_folders_first = 'true';
2146 $list_special_folders_first = 'false';
2148 return $list_special_folders_first;
2151 # Show special folders color
2153 print "SquirrelMail has what we call 'special folders' that are not\n";
2154 print "manipulated and viewed like normal folders. Some examples of\n";
2155 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
2156 print "wants to know if we should display special folders in a\n";
2157 print "color than the other folders.\n";
2160 if ( lc($use_special_folder_color) eq 'true' ) {
2161 $default_value = "y";
2163 $default_value = "n";
2166 print "Show color (y/n) [$WHT$default_value$NRM]: $WHT";
2167 $new_show = <STDIN
>;
2168 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2169 $use_special_folder_color = 'true';
2171 $use_special_folder_color = 'false';
2173 return $use_special_folder_color;
2178 print "The way that IMAP handles deleting messages is as follows. You\n";
2179 print "mark the message as deleted, and then to 'really' delete it, you\n";
2180 print "expunge it. This option asks if you want to just have messages\n";
2181 print "marked as deleted, or if you want SquirrelMail to expunge the \n";
2182 print "messages too.\n";
2185 if ( lc($auto_expunge) eq 'true' ) {
2186 $default_value = "y";
2188 $default_value = "n";
2190 print "Auto expunge (y/n) [$WHT$default_value$NRM]: $WHT";
2191 $new_show = <STDIN
>;
2192 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2193 $auto_expunge = 'true';
2195 $auto_expunge = 'false';
2197 return $auto_expunge;
2200 # Default sub of inbox
2202 print "Some IMAP servers (Cyrus) have all folders as subfolders of INBOX.\n";
2203 print "This can cause some confusion in folder creation for users when\n";
2204 print "they try to create folders and don't put it as a subfolder of INBOX\n";
2205 print "and get permission errors. This option asks if you want folders\n";
2206 print "to be subfolders of INBOX by default.\n";
2209 if ( lc($default_sub_of_inbox) eq 'true' ) {
2210 $default_value = "y";
2212 $default_value = "n";
2214 print "Default sub of INBOX (y/n) [$WHT$default_value$NRM]: $WHT";
2215 $new_show = <STDIN
>;
2216 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2217 $default_sub_of_inbox = 'true';
2219 $default_sub_of_inbox = 'false';
2221 return $default_sub_of_inbox;
2224 # Show contain subfolder option
2226 print "Some IMAP servers (UW) make it so that there are two types of\n";
2227 print "folders. Those that contain messages, and those that contain\n";
2228 print "subfolders. If this is the case for your server, set this to\n";
2229 print "true, and it will ask the user whether the folder they are\n";
2230 print "creating contains subfolders or messages.\n";
2233 if ( lc($show_contain_subfolders_option) eq 'true' ) {
2234 $default_value = "y";
2236 $default_value = "n";
2238 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
2239 $new_show = <STDIN
>;
2240 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2241 $show_contain_subfolders_option = 'true';
2243 $show_contain_subfolders_option = 'false';
2245 return $show_contain_subfolders_option;
2248 # Default Unseen Notify
2250 print "This option specifies where the users will receive notification\n";
2251 print "about unseen messages by default. This is of course an option that\n";
2252 print "can be changed on a user level.\n";
2253 print " 1 = No notification\n";
2254 print " 2 = Only on the INBOX\n";
2255 print " 3 = On all folders\n";
2258 print "Which one should be default (1,2,3)? [$WHT$default_unseen_notify$NRM]: $WHT";
2259 $new_show = <STDIN
>;
2260 if ( $new_show =~ /^[123]\n/i ) {
2261 $default_unseen_notify = $new_show;
2263 $default_unseen_notify =~ s/[\r\n]//g;
2264 return $default_unseen_notify;
2267 # Default Unseen Type
2269 print "Here you can define the default way that unseen messages will be displayed\n";
2270 print "to the user in the folder listing on the left side.\n";
2271 print " 1 = Only unseen messages (4)\n";
2272 print " 2 = Unseen and Total messages (4/27)\n";
2275 print "Which one should be default (1,2)? [$WHT$default_unseen_type$NRM]: $WHT";
2276 $new_show = <STDIN
>;
2277 if ( $new_show =~ /^[12]\n/i ) {
2278 $default_unseen_type = $new_show;
2280 $default_unseen_type =~ s/[\r\n]//g;
2281 return $default_unseen_type;
2284 # Auto create special folders
2286 print "Would you like the Sent, Trash, and Drafts folders to be created\n";
2287 print "automatically print for you when a user logs in? If the user\n";
2288 print "accidentally deletes their special folders, this option will\n";
2289 print "automatically create it again for them.\n";
2292 if ( lc($auto_create_special) eq 'true' ) {
2293 $default_value = "y";
2295 $default_value = "n";
2297 print "Auto create special folders? (y/n) [$WHT$default_value$NRM]: $WHT";
2298 $new_show = <STDIN
>;
2299 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2300 $auto_create_special = 'true';
2302 $auto_create_special = 'false';
2304 return $auto_create_special;
2307 # Automatically delete folders
2309 if ( $imap_server_type eq "uw" ) {
2310 print "UW IMAP servers will not allow folders containing mail to also contain folders.\n";
2311 print "Deleting folders will bypass the trash folder and be immediately deleted\n\n";
2312 print "If this is not the correct value for your server,\n";
2313 print "please use option D on the Main Menu to configure your server correctly.\n\n";
2314 print "Press enter to continue...\n";
2315 $new_delete = <STDIN
>;
2316 $delete_folder = 'true';
2318 if ( $imap_server_type eq "courier" ) {
2319 print "Courier (or Courier-IMAP) IMAP servers may not support ";
2320 print "subfolders of Trash. \n";
2321 print "Specifically, if Courier is set to always move messages to Trash, \n";
2322 print "Trash will be treated by Courier as a special folder that does not \n";
2323 print "allow subfolders. \n\n";
2324 print "Please verify your Courier configuration, and test folder deletion \n";
2325 print "when changing this setting.\n\n";
2328 print "Are subfolders of the Trash supported by your IMAP server?\n";
2329 print "If so, should deleted folders be sent to Trash?\n";
2330 print "If not, say no (deleted folders should not be sent to Trash)\n\n";
2331 # reversal of logic.
2332 # question was: Should folders be automatically deleted instead of sent to trash..
2333 # we've changed the question to make it more clear,
2334 # and are here handling that to avoid changing the answers..
2335 if ( lc($delete_folder) eq 'true' ) {
2336 $default_value = "n";
2338 $default_value = "y";
2340 print "Send deleted folders to Trash? (y/n) [$WHT$default_value$NRM]: $WHT";
2341 $new_delete = <STDIN
>;
2342 if ( ( $new_delete =~ /^y\n/i ) || ( ( $new_delete =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2343 $delete_folder = 'false';
2345 $delete_folder = 'true';
2348 return $delete_folder;
2353 print "Some IMAP servers allow subfolders to exist even if the parent\n";
2354 print "folders do not. This fixes some problems with the folder list\n";
2355 print "when this is the case, causing the /NoSelect folders to be displayed\n";
2358 if ( lc($noselect_fix_enable) eq 'true' ) {
2359 $default_value = "y";
2361 $default_value = "n";
2363 print "enable noselect fix? (y/n) [$WHT$noselect_fix_enable$NRM]: $WHT";
2364 $noselect_fix_enable = <STDIN
>;
2365 if ( ( $noselect_fix_enable =~ /^y\n/i ) || ( ( $noselect_fix_enable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2366 $noselect_fix_enable = 'true';
2368 $noselect_fix_enable = 'false';
2370 return $noselect_fix_enable;
2372 ############# GENERAL OPTIONS #####################
2376 print "Specify the location for your data directory.\n";
2377 print "You need to create this directory yourself.\n";
2378 print "The path name can be absolute or relative (to the config directory).\n";
2379 print "Here are two examples:\n";
2380 print " Absolute: /var/local/squirrelmail/data/\n";
2381 print " Relative: ../data/\n";
2382 print "Relative paths to directories outside of the SquirrelMail distribution\n";
2383 print "will be converted to their absolute path equivalents in config.php.\n\n";
2384 print "Note: There are potential security risks with having a writeable directory\n";
2385 print "under the web server's root directory (ex: /home/httpd/html).\n";
2386 print "For this reason, it is recommended to put the data directory\n";
2387 print "in an alternate location of your choice. \n";
2390 print "[$WHT$data_dir$NRM]: $WHT";
2391 $new_data_dir = <STDIN
>;
2392 if ( $new_data_dir eq "\n" ) {
2393 $new_data_dir = $data_dir;
2395 $new_data_dir =~ s/[\r\n]//g;
2397 if ( $new_data_dir =~ /^\s*$/ ) {
2400 $new_data_dir =~ s/\/*$//g
;
2401 $new_data_dir =~ s/$/\//g
;
2403 return $new_data_dir;
2406 # Attachment directory
2408 print "Path to directory used for storing attachments while a mail is\n";
2409 print "being composed. The path name can be absolute or relative (to the\n";
2410 print "config directory). Here are two examples:\n";
2411 print " Absolute: /var/local/squirrelmail/attach/\n";
2412 print " Relative: ../attach/\n";
2413 print "Relative paths to directories outside of the SquirrelMail distribution\n";
2414 print "will be converted to their absolute path equivalents in config.php.\n\n";
2415 print "Note: There are a few security considerations regarding this\n";
2416 print "directory:\n";
2417 print " 1. It should have the permission 733 (rwx-wx-wx) to make it\n";
2418 print " impossible for a random person with access to the webserver\n";
2419 print " to list files in this directory. Confidential data might\n";
2420 print " be laying around in there.\n";
2421 print " Depending on your user:group assignments, 730 (rwx-wx---)\n";
2422 print " may be possible, and more secure (e.g. root:apache)\n";
2423 print " 2. Since the webserver is not able to list the files in the\n";
2424 print " content is also impossible for the webserver to delete files\n";
2425 print " lying around there for too long.\n";
2426 print " 3. It should probably be another directory than the data\n";
2427 print " directory specified in option 3.\n";
2430 print "[$WHT$attachment_dir$NRM]: $WHT";
2431 $new_attachment_dir = <STDIN
>;
2432 if ( $new_attachment_dir eq "\n" ) {
2433 $new_attachment_dir = $attachment_dir;
2435 $new_attachment_dir =~ s/[\r\n]//g;
2437 if ( $new_attachment_dir =~ /^\s*$/ ) {
2438 $new_attachment_dir = "";
2440 $new_attachment_dir =~ s/\/*$//g
;
2441 $new_attachment_dir =~ s/$/\//g
;
2443 return $new_attachment_dir;
2447 print "The directory hash level setting allows you to configure the level\n";
2448 print "of hashing that SquirrelMail employs in your data and attachment\n";
2449 print "directories. This value must be an integer ranging from 0 to 4.\n";
2450 print "When this value is set to 0, SquirrelMail will simply store all\n";
2451 print "files as normal in the data and attachment directories. However,\n";
2452 print "when set to a value from 1 to 4, a simple hashing scheme will be\n";
2453 print "used to organize the files in this directory. In short, the crc32\n";
2454 print "value for a username will be computed. Then, up to the first 4\n";
2455 print "digits of the hash, as set by this configuration value, will be\n";
2456 print "used to directory hash the files for that user in the data and\n";
2457 print "attachment directory. This allows for better performance on\n";
2458 print "servers with larger numbers of users.\n";
2461 print "[$WHT$dir_hash_level$NRM]: $WHT";
2462 $new_dir_hash_level = <STDIN
>;
2463 if ( $new_dir_hash_level eq "\n" ) {
2464 $new_dir_hash_level = $dir_hash_level;
2466 $new_dir_hash_level =~ s/[\r\n]//g;
2468 if ( ( int($new_dir_hash_level) < 0 )
2469 || ( int($new_dir_hash_level) > 4 )
2470 || !( int($new_dir_hash_level) eq $new_dir_hash_level ) ) {
2471 print "Invalid Directory Hash Level.\n";
2472 print "Value must be an integer ranging from 0 to 4\n";
2473 print "Hit enter to continue.\n";
2474 $enter_key = <STDIN
>;
2476 $new_dir_hash_level = $dir_hash_level;
2479 return $new_dir_hash_level;
2483 print "This is the default size (in pixels) of the left folder list.\n";
2484 print "Default is 200, but you can set it to whatever you wish. This\n";
2485 print "is a user preference, so this will only show up as their default.\n";
2487 print "[$WHT$default_left_size$NRM]: $WHT";
2488 $new_default_left_size = <STDIN
>;
2489 if ( $new_default_left_size eq "\n" ) {
2490 $new_default_left_size = $default_left_size;
2492 $new_default_left_size =~ s/[\r\n]//g;
2494 return $new_default_left_size;
2498 print "Some IMAP servers only have lowercase letters in the usernames\n";
2499 print "but they still allow people with uppercase to log in. This\n";
2500 print "causes a problem with the user's preference files. This option\n";
2501 print "transparently changes all usernames to lowercase.";
2504 if ( lc($force_username_lowercase) eq 'true' ) {
2505 $default_value = "y";
2507 $default_value = "n";
2509 print "Convert usernames to lowercase (y/n) [$WHT$default_value$NRM]: $WHT";
2510 $new_show = <STDIN
>;
2511 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2521 if ( lc($default_use_priority) eq 'true' ) {
2522 $default_value = "y";
2524 $default_value = "n";
2527 print "Allow users to specify priority of outgoing mail (y/n) [$WHT$default_value$NRM]: $WHT";
2528 $new_show = <STDIN
>;
2529 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2539 if ( lc($hide_sm_attributions) eq 'true' ) {
2540 $default_value = "y";
2542 $default_value = "n";
2545 print "Hide SM attributions (y/n) [$WHT$default_value$NRM]: $WHT";
2546 $new_show = <STDIN
>;
2547 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2557 if ( lc($default_use_mdn) eq 'true' ) {
2558 $default_value = "y";
2560 $default_value = "n";
2563 print "Enable support for read/delivery receipt support (y/n) [$WHT$default_value$NRM]: $WHT";
2564 $new_show = <STDIN
>;
2565 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2573 print " In loosely managed environments, you may want to allow users
2574 to edit their full name and email address. In strictly managed
2575 environments, you may want to force users to use the name
2576 and email address assigned to them.
2578 'y' - allow a user to edit their full name and email address,
2579 'n' - users must use the assigned values.
2583 if ( lc($edit_identity) eq 'true' ) {
2584 $default_value = "y";
2586 $default_value = "n";
2588 print "Allow editing of user's identity? (y/n) [$WHT$default_value$NRM]: $WHT";
2589 $new_edit = <STDIN
>;
2590 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2591 $edit_identity = 'true';
2592 $edit_name = 'true';
2593 $edit_reply_to = 'true';
2594 $hide_auth_header = command311c
();
2596 $edit_identity = 'false';
2597 $edit_name = command311
();
2598 $edit_reply_to = command311b
();
2599 $hide_auth_header = command311c
();
2601 return $edit_identity;
2606 print "\n Given that users are not allowed to modify their
2607 email address, can they edit their full name?
2611 if ( lc($edit_name) eq 'true' ) {
2612 $default_value = "y";
2614 $default_value = "n";
2616 print "Allow the user to edit their full name? (y/n) [$WHT$default_value$NRM]: $WHT";
2617 $new_edit = <STDIN
>;
2618 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2619 $edit_name = 'true';
2621 $edit_name = 'false';
2628 print "\n Given that users are not allowed to modify their
2629 email address, can they edit their reply-to address?
2633 if ( lc($edit_reply_to) eq 'true' ) {
2634 $default_value = "y";
2636 $default_value = "n";
2638 print "Allow the user to edit their reply-to address? (y/n) [$WHT$default_value$NRM]: $WHT";
2639 $new_edit = <STDIN
>;
2640 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2641 $edit_reply_to = 'true';
2643 $edit_reply_to = 'false';
2645 return $edit_reply_to;
2650 print "\n SquirrelMail adds username information to every outgoing email in
2651 order to prevent possible sender forging by users that are allowed
2652 to change their email and/or full name.
2654 You can remove user information from this header (y) if you think
2655 that it violates privacy or security.
2657 Note: If users are allowed to change their email addresses, this
2658 setting will make it difficult to determine who sent what where.
2659 Use at your own risk.
2661 Note: If you have defined a header encryption key in your SMTP or
2662 Sendmail settings (see the \"Server Settings\" option page), this
2663 setting is ignored because all user information in outgoing messages
2668 if ( lc($hide_auth_header) eq "true" ) {
2669 $default_value = "y";
2671 $default_value = "n";
2673 print "Remove username from email headers? (y/n) [$WHT$default_value$NRM]: $WHT";
2674 $new_header = <STDIN
>;
2675 if ( ( $new_header =~ /^y\n/i ) || ( ( $new_header =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2676 $hide_auth_header = "true";
2678 $hide_auth_header = "false";
2680 return $hide_auth_header;
2684 print "This option allows you to disable server side thread sorting if your server \n";
2685 print "declares THREAD support, but you don't want to provide threading options \n";
2686 print "to end users or THREAD extension is broken or extension does not work with \n";
2687 print "options used by SquirrelMail. Option is not used, if THREAD extension is \n";
2688 print "not declared in IMAP CAPABILITY.\n";
2691 if ( lc($disable_thread_sort) eq 'true' ) {
2692 $default_value = "y";
2694 $default_value = "n";
2696 print "Disable server side thread sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2697 $disable_thread_sort = <STDIN
>;
2698 if ( ( $disable_thread_sort =~ /^y\n/i ) || ( ( $disable_thread_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2699 $disable_thread_sort = 'true';
2701 $disable_thread_sort = 'false';
2703 return $disable_thread_sort;
2707 print "This option allows you to disable server side sorting if your server declares \n";
2708 print "SORT support, but SORT extension is broken or does not work with options \n";
2709 print "used by SquirrelMail. Option is not used, if SORT extension is not declared \n";
2710 print "in IMAP CAPABILITY.\n";
2712 print "It is strongly recommended to keep server side sorting enabled, if your ";
2713 print "IMAP server supports it.";
2716 if ( lc($disable_server_sort) eq 'true' ) {
2717 $default_value = "y";
2719 $default_value = "n";
2721 print "Disable server-side sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2722 $disable_server_sort = <STDIN
>;
2723 if ( ( $disable_server_sort =~ /^y\n/i ) || ( ( $disable_server_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2724 $disable_server_sort = 'true';
2726 $disable_server_sort = 'false';
2728 return $disable_server_sort;
2732 print "This option allows you to choose if SM uses charset search\n";
2733 print "Your IMAP server must support the SEARCH CHARSET command for this to work\n";
2736 if ( lc($allow_charset_search) eq 'true' ) {
2737 $default_value = "y";
2739 $default_value = "n";
2741 print "Allow charset searching? (y/n) [$WHT$default_value$NRM]: $WHT";
2742 $allow_charset_search = <STDIN
>;
2743 if ( ( $allow_charset_search =~ /^y\n/i ) || ( ( $allow_charset_search =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2744 $allow_charset_search = 'true';
2746 $allow_charset_search = 'false';
2748 return $allow_charset_search;
2751 # command315 (UID support) obsoleted.
2753 # advanced search option
2755 print "This option allows you to control the use of advanced search form.\n";
2756 print " 0 = enable basic search only\n";
2757 print " 1 = enable advanced search only\n";
2758 print " 2 = enable both\n";
2761 print "Allowed search (0,1,2)? [$WHT$allow_advanced_search$NRM]: $WHT";
2762 $new_allow_advanced_search = <STDIN
>;
2763 if ( $new_allow_advanced_search =~ /^[012]\n/i ) {
2764 $allow_advanced_search = $new_allow_advanced_search;
2766 $allow_advanced_search =~ s/[\r\n]//g;
2767 return $allow_advanced_search;
2772 print "This option allows you to change the name of the PHP session used\n";
2773 print "by SquirrelMail. Unless you know what you are doing, you probably\n";
2774 print "don't need or want to change this from the default of SQMSESSID.\n";
2775 print "[$WHT$session_name$NRM]: $WHT";
2776 $new_session_name = <STDIN
>;
2777 chomp($new_session_name);
2778 if ( $new_session_name eq "" ) {
2779 $new_session_name = $session_name;
2781 return $new_session_name;
2784 # time zone config (since 1.5.1)
2786 print "This option allows you to control the use of time zones.\n";
2787 print " 0 = (default) standard, GNU C time zone names\n";
2788 print " 1 = strict, generic time zone codes with offsets\n";
2789 print " 2 = custom, GNU C time zones loaded from config/timezones.php\n";
2790 print " 3 = custom strict, generic time zone codes with offsets loaded \n";
2791 print " from config/timezones.php\n";
2792 print "See SquirrelMail documentation about format of config/timezones.php file.\n";
2795 print "Desired time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT";
2796 $new_time_zone_type = <STDIN
>;
2797 if ( $new_time_zone_type =~ /^[0123]\n/i ) {
2798 $time_zone_type = $new_time_zone_type;
2800 print "\nInvalid configuration value.\n";
2801 print "\nPress enter to continue...";
2804 $time_zone_type =~ s/[\r\n]//g;
2805 return $time_zone_type;
2808 # set the location base for redirects (since 1.5.2)
2809 sub command_config_location_base
{
2810 print "Here you can set the base part of the SquirrelMail URL.\n";
2811 print "It is normally autodetected but if that fails, use this\n";
2812 print "option to override.\n";
2813 print "It should contain only the protocol and hostname/port parts\n";
2814 print "of the URL; the full path will be appended automatically.\n\n";
2815 print "Examples:\nhttp://webmail.example.org\nhttp://webmail.example.com:8080\nhttps://webmail.example.com:6691\n\n";
2816 print "Do not add any path elements.\n";
2818 print "URL base? [" .$WHT."autodetect$NRM]: $WHT";
2819 $new_config_location_base = <STDIN
>;
2820 chomp($new_config_location_base);
2821 $config_location_base = $new_config_location_base;
2823 return $config_location_base;
2826 # only_secure_cookies (since 1.5.2)
2828 print "This option allows you to specify that if a user session is initiated\n";
2829 print "under a secure (HTTPS, SSL-encrypted) connection, the cookies given to\n";
2830 print "the browser will ONLY be transmitted via a secure connection henceforth.\n\n";
2831 print "Generally this is a Good Thing, and should NOT be disabled. However,\n";
2832 print "if you intend to use the Secure Login or Show SSL Link plugins to\n";
2833 print "encrypt the user login, but not the rest of the SquirrelMail session,\n";
2834 print "this can be turned off. Think twice before doing so.\n";
2837 if ( lc($only_secure_cookies) eq 'true' ) {
2838 $default_value = "y";
2840 $default_value = "n";
2842 print "Transmit cookies only on secure connection when available? (y/n) [$WHT$default_value$NRM]: $WHT";
2843 $only_secure_cookies = <STDIN
>;
2844 if ( ( $only_secure_cookies =~ /^y\n/i ) || ( ( $only_secure_cookies =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2845 $only_secure_cookies = 'true';
2847 $only_secure_cookies = 'false';
2849 return $only_secure_cookies;
2853 # disable_security_tokens (since 1.5.2)
2855 print "This option allows you to turn off the security checks in the forms\n";
2856 print "that SquirrelMail generates. It is NOT RECOMMENDED that you disable\n";
2857 print "this feature - otherwise, your users may be exposed to phishing and\n";
2858 print "other attacks.\n";
2859 print "Unless you know what you are doing, you should leave this set to \"NO\".\n";
2862 if ( lc($disable_security_tokens) eq 'true' ) {
2863 $default_value = "y";
2865 $default_value = "n";
2867 print "Disable secure forms? (y/n) [$WHT$default_value$NRM]: $WHT";
2868 $disable_security_tokens = <STDIN
>;
2869 if ( ( $disable_security_tokens =~ /^y\n/i ) || ( ( $disable_security_tokens =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2870 $disable_security_tokens = 'true';
2872 $disable_security_tokens = 'false';
2874 return $disable_security_tokens;
2879 # check_referrer (since 1.5.2)
2881 print "This option allows you to enable referal checks for all page requests\n";
2882 print "made to SquirrelMail. This can help ensure that page requests came\n";
2883 print "from the same server and not from an attacker's site (usually the\n";
2884 print "result of a XSS or phishing attack). To enable referal checking,\n";
2885 print "this setting can be set to the domain where your SquirrelMail is\n";
2886 print "being hosted (usually the same as the Domain setting under Server\n";
2887 print "Settings). For example, it could be \"example.com\", or if you\n";
2888 print "use a plugin (such as Login Manager) to host SquirrelMail on more\n";
2889 print "than one domain, you can set this to \"###DOMAIN###\" to tell it\n";
2890 print "to use the current domain.\n";
2892 print "However, in some cases (where proxy servers are in use, etc.), the\n";
2893 print "domain might be different.\n";
2895 print "NOTE that referal checks are not foolproof - they can be spoofed by\n";
2896 print "browsers, and some browsers intentionally don't send referal\n";
2897 print "information (in which case, the check is silently bypassed)\n";
2900 print "Referal requirement? [$WHT$check_referrer$NRM]: $WHT";
2901 $new_check_referrer = <STDIN
>;
2902 chomp($new_check_referrer);
2903 $check_referrer = $new_check_referrer;
2905 return $check_referrer;
2910 # use_transparent_security_image (since 1.5.2)
2912 print "When HTML messages are being displayed, SquirrelMail's default behavior\n";
2913 print "is to remove all remote images and replace them with a local one.\n";
2915 print "This option allows you to specify whether the local image should contain\n";
2916 print "text that indicates to the user that \"this image has been removed for\n";
2917 print "security reasons\" (translated into most languages), or if it should be\n";
2918 print "transparent.\n";
2921 if ( lc($use_transparent_security_image) eq 'true' ) {
2922 $default_value = "y";
2924 $default_value = "n";
2926 print "Use transparent security image? (y/n) [$WHT$default_value$NRM]: $WHT";
2927 $use_transparent_security_image = <STDIN
>;
2928 if ( ( $use_transparent_security_image =~ /^y\n/i ) || ( ( $use_transparent_security_image =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2929 $use_transparent_security_image = 'true';
2931 $use_transparent_security_image = 'false';
2933 return $use_transparent_security_image;
2938 # display_imap_login_error (since 1.5.2)
2940 print "Some IMAP servers return detailed information about why a login is\n";
2941 print "being refused (the username or password could be invalid or there\n";
2942 print "might be an administrative lock on the account).\n";
2944 print "Enabling this option will cause SquirrelMail to display login failure\n";
2945 print "messages directly from the IMAP server. When it is disabled, login\n";
2946 print "failures are always reported to the user with the traditional \"Unknown\n";
2947 print "user or password incorrect.\"\n";
2950 if ( lc($display_imap_login_error) eq 'true' ) {
2951 $default_value = "y";
2953 $default_value = "n";
2955 print "Display login error messages directly from the IMAP server? (y/n) [$WHT$default_value$NRM]: $WHT";
2956 $display_imap_login_error = <STDIN
>;
2957 if ( ( $display_imap_login_error =~ /^y\n/i ) || ( ( $display_imap_login_error =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2958 $display_imap_login_error = 'true';
2960 $display_imap_login_error = 'false';
2962 return $display_imap_login_error;
2967 # allow_svg_display (since 1.5.2)
2969 print "Some email messages might contain SVG images or animations, however\n";
2970 print "the power and dynamic nature of SVG objects may represent security or\n";
2971 print "privacy vulnerabilities.\n";
2973 print "Enabling this option will cause SquirrelMail to display any SVG objects\n";
2974 print "included inline in email messages when they are viewed in HTML format.\n";
2977 if ( lc($allow_svg_display) eq 'true' ) {
2978 $default_value = "y";
2980 $default_value = "n";
2982 print "Show inline SVG objects? (y/n) [$WHT$default_value$NRM]: $WHT";
2983 $allow_svg_display = <STDIN
>;
2984 if ( ( $allow_svg_display =~ /^y\n/i ) || ( ( $allow_svg_display =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2985 $allow_svg_display = 'true';
2987 $allow_svg_display = 'false';
2989 return $allow_svg_display;
2994 # block_svg_download (since 1.5.2)
2996 print "Some email messages might contain SVG image or animation attachments,\n";
2997 print "however even when downloaded, the power and dynamic nature of SVG\n";
2998 print "objects may represent security or privacy vulnerabilities.\n";
3000 print "Enabling this option will cause SquirrelMail to hide download links\n";
3001 print "for any SVG objects attached to email messages, whereas disabling it\n";
3002 print "will allow users to download such attachments as they see fit.\n";
3005 if ( lc($block_svg_download) eq 'true' ) {
3006 $default_value = "y";
3008 $default_value = "n";
3010 print "Hide download links for SVG objects? (y/n) [$WHT$default_value$NRM]: $WHT";
3011 $block_svg_download = <STDIN
>;
3012 if ( ( $block_svg_download =~ /^y\n/i ) || ( ( $block_svg_download =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3013 $block_svg_download = 'true';
3015 $block_svg_download = 'false';
3017 return $block_svg_download;
3022 # fix_broken_base64_encoded_messages (since 1.5.2)
3024 print "Some email messages might contain base64-encoded parts, and a very\n";
3025 print "small number of unknown servers have been seen sending such\n";
3026 print "messages in a malformed but recoverable manner.\n";
3028 print "Enabling this option will cause SquirrelMail to detect and correct\n";
3029 print "such messages at a slight cost in processing power. Chances are\n";
3030 print "somewhat low that your users would ever receive such messages.\n";
3033 if ( lc($fix_broken_base64_encoded_messages) eq 'true' ) {
3034 $default_value = "y";
3036 $default_value = "n";
3038 print "Fix broken base64-encoded messages? (y/n) [$WHT$default_value$NRM]: $WHT";
3039 $fix_broken_base64_encoded_messages = <STDIN
>;
3040 if ( ( $fix_broken_base64_encoded_messages =~ /^y\n/i ) || ( ( $fix_broken_base64_encoded_messages =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3041 $fix_broken_base64_encoded_messages = 'true';
3043 $fix_broken_base64_encoded_messages = 'false';
3045 return $fix_broken_base64_encoded_messages;
3050 ####################################################################################
3052 sub command_userThemes
{
3053 print "\nDefine the user themes that you wish to use. If you have added\n";
3054 print "a theme of your own, just follow the instructions (?) about\n";
3055 print "how to add them. You can also change the default theme.\n\n";
3057 print "Available user themes:\n";
3059 while ( $count <= $#user_theme_name ) {
3060 if ( $count == $user_theme_default ) {
3065 if ( $count < 10 ) {
3068 $name = $user_theme_name[$count];
3069 $num_spaces = 35 - length($name);
3070 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3071 $name = $name . " ";
3074 print " $count. $name";
3075 print "($user_theme_path[$count])\n";
3081 print ".------------------------------------.\n";
3082 print "| t (detect user themes) |\n";
3083 print "| + (add user theme) |\n";
3084 print "| - N (remove user theme) |\n";
3085 print "| m N (mark default user theme) |\n";
3086 print "| l (list user themes) |\n";
3087 print "| d (done) |\n";
3088 print "`------------------------------------'\n";
3090 print "\n[user_themes] command (?=help) > ";
3092 $input =~ s/[\r\n]//g;
3093 while ( $input ne "d" ) {
3094 if ( $input =~ /^\s*l\s*/i ) {
3096 while ( $count <= $#user_theme_name ) {
3097 if ( $count == $user_theme_default ) {
3102 if ( $count < 10 ) {
3105 $name = $user_theme_name[$count];
3106 $num_spaces = 35 - length($name);
3107 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3108 $name = $name . " ";
3111 print " $count. $name";
3112 print "($user_theme_path[$count])\n";
3116 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
3117 $old_def = $user_theme_default;
3118 $user_theme_default = $input;
3119 $user_theme_default =~ s/^\s*m\s*//;
3120 if ( ( $user_theme_default > $#user_theme_name ) || ( $user_theme_default < 0 ) ) {
3121 print "Cannot set default theme to $user_theme_default. That theme does not exist.\n";
3122 $user_theme_default = $old_def;
3124 } elsif ( $input =~ /^\s*\+/ ) {
3125 print "What is the name of this theme? ";
3127 $name =~ s/[\r\n]//g;
3128 $user_theme_name[ $#user_theme_name + 1 ] = $name;
3129 print "Be sure to put ../css/ before the filename.\n";
3130 print "What file is this stored in (ex: ../css/my_theme/): ";
3132 $name =~ s/[\r\n]//g;
3133 $user_theme_path[ $#user_theme_path + 1 ] = $name;
3134 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
3135 if ( $input =~ /[0-9]+\s*$/ ) {
3137 $rem_num =~ s/^\s*-\s*//g;
3138 $rem_num =~ s/\s*$//;
3140 $rem_num = $#user_theme_name;
3142 if ( $rem_num == $user_theme_default ) {
3143 print "You cannot remove the default theme!\n";
3146 @new_theme_name = ();
3147 @new_theme_path = ();
3148 while ( $count <= $#user_theme_name ) {
3149 if ( $count != $rem_num ) {
3150 @new_theme_name = ( @new_theme_name, $user_theme_name[$count] );
3151 @new_theme_path = ( @new_theme_path, $user_theme_path[$count] );
3155 @user_theme_name = @new_theme_name;
3156 @user_theme_path = @new_theme_path;
3157 if ( $user_theme_default > $rem_num ) {
3158 $user_theme_default--;
3161 } elsif ( $input =~ /^\s*t\s*/i ) {
3162 print "\nStarting detection...\n\n";
3164 opendir( DIR
, "../css" );
3165 @files = sort(readdir(DIR
));
3167 while ( $cnt <= $#files ) {
3168 $filename = "../css/" . $files[$cnt] .'/';
3169 if ( $files[$cnt] !~ /^\./ && $filename ne "../css/rtl.css" && -e
$filename . "default.css" ) {
3171 for ( $x = 0 ; $x <= $#user_theme_path ; $x++ ) {
3172 if ( $user_theme_path[$x] eq $filename ) {
3176 if ( $found != 1 ) {
3177 print "** Found user theme: $filename\n";
3178 $def = $files[$cnt];
3181 #$def =~ s/(^\w+)/ucfirst $1/eg;
3182 #$def =~ s/(\s+)(\w+)/$1 . ucfirst $2/eg;
3183 $def =~ s/(^\w+)|(\s+)(\w+)/ucfirst $1 . $2 . ucfirst $3/eg;
3184 print " What is its name? [$def]: ";
3186 $nm =~ s/^\s+|\s+$|[\n\r]//g;
3187 if ( $nm eq '' ) { $nm = $def; }
3188 $user_theme_name[ $#user_theme_name + 1 ] = $nm;
3189 $user_theme_path[ $#user_theme_path + 1 ] = $filename;
3195 for ( $cnt = 0 ; $cnt <= $#user_theme_path ; $cnt++ ) {
3196 $filename = $user_theme_path[$cnt];
3197 if ( $filename != 'none' && !( -e
$filename ."/default.css" ) ) {
3198 print " Removing $filename (file not found)\n";
3200 @new_user_theme_name = ();
3201 @new_user_theme_path = ();
3202 for ( $x = 0 ; $x < $#user_theme_path ; $x++ ) {
3203 if ( $user_theme_path[$x] eq $filename ) {
3206 if ( $offset == 1 ) {
3207 $new_user_theme_name[$x] = $user_theme_name[ $x + 1 ];
3208 $new_user_theme_path[$x] = $user_theme_path[ $x + 1 ];
3210 $new_user_theme_name[$x] = $user_theme_name[$x];
3211 $new_user_theme_path[$x] = $user_theme_path[$x];
3214 @user_theme_name = @new_user_theme_name;
3215 @user_theme_path = @new_user_theme_path;
3218 print "\nDetection complete!\n\n";
3221 } elsif ( $input =~ /^\s*\?\s*/ ) {
3222 print ".------------------------------------.\n";
3223 print "| t (detect user themes) |\n";
3224 print "| + (add user theme) |\n";
3225 print "| - N (remove user theme) |\n";
3226 print "| m N (mark default user theme) |\n";
3227 print "| l (list user themes) |\n";
3228 print "| d (done) |\n";
3229 print "`------------------------------------'\n";
3231 print "[user_themes] command (?=help) > ";
3233 $input =~ s/[\r\n]//g;
3237 sub command_iconSets
{
3238 print "\nDefine the icon themes that you wish to use. If you have added\n";
3239 print "a theme of your own, just follow the instructions (?) about\n";
3240 print "how to add them. You can also change the default and fallback\n";
3241 print "themes. The default theme will be used when no icon theme is\n";
3242 print "set by the user. The fallback theme will be used if an icon\n";
3243 print "cannot be found in the currently selected icon theme.\n\n";
3245 print "Available icon themes:\n\n";
3248 while ( $count <= $#icon_theme_name ) {
3249 if ( $count == $icon_theme_def ) {
3254 if ( $count eq $icon_theme_fallback ) {
3259 if ( $count < 10 ) {
3262 $name = $icon_theme_name[$count];
3263 $num_spaces = 35 - length($name);
3264 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3265 $name = $name . " ";
3268 print " $count. $name";
3269 print "($icon_theme_path[$count])\n";
3274 print "\n d = Default icon theme\n";
3275 print " f = Fallback icon theme\n";
3277 print ".------------------------------------.\n";
3278 print "| t (detect icon themes) |\n";
3279 print "| + (add icon theme) |\n";
3280 print "| - N (remove icon theme) |\n";
3281 print "| m N (mark default icon theme) |\n";
3282 print "| f N (set fallback icon set) |\n";
3283 print "| l (list icon themes) |\n";
3284 print "| d (done) |\n";
3285 print "`------------------------------------'\n";
3287 print "\n[icon_themes] command (?=help) > ";
3289 $input =~ s/[\r\n]//g;
3290 while ( $input ne "d" ) {
3291 if ( $input =~ /^\s*l\s*/i ) {
3294 while ( $count <= $#icon_theme_name ) {
3295 if ( $count == $icon_theme_def ) {
3300 if ( $count eq $icon_theme_fallback ) {
3305 $name = $icon_theme_name[$count];
3306 $num_spaces = 35 - length($name);
3307 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3308 $name = $name . " ";
3311 print " $count. $name";
3312 print "($icon_theme_path[$count])\n";
3316 print "\n d = Default icon theme\n";
3317 print " f = Fallback icon theme\n\n";
3318 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
3319 $old_def = $icon_theme_def;
3320 $icon_theme_def = $input;
3321 $icon_theme_def =~ s/^\s*m\s*//;
3322 if ( ( $icon_theme_default > $#icon_theme_name ) || ( $icon_theme_default < 0 ) ) {
3323 print "Cannot set default icon theme to $icon_theme_default. That theme does not exist.\n";
3324 $icon_theme_def = $old_def;
3326 } elsif ( $input =~ /^\s*f\s*[0-9]+/i ) {
3327 $old_fb = $icon_theme_fallback;
3328 $icon_theme_fallback = $input;
3329 $icon_theme_fallback =~ s/^\s*f\s*//;
3330 if ( ( $icon_theme_fallback > $#icon_theme_name ) || ( $icon_theme_fallback < 0 ) ) {
3331 print "Cannot set fallback icon theme to $icon_theme_fallback. That theme does not exist.\n";
3332 $icon_theme_fallback = $old_fb;
3334 } elsif ( $input =~ /^\s*\+/ ) {
3335 print "What is the name of this icon theme? ";
3337 $name =~ s/[\r\n]//g;
3338 $icon_theme_name[ $#icon_theme_name + 1 ] = $name;
3339 print "Be sure to put ../images/themes/ before the filename.\n";
3340 print "What directory is this icon theme stored in (ex: ../images/themes/my_theme/)? ";
3342 $name =~ s/[\r\n]//g;
3343 $icon_theme_path[ $#icon_theme_path + 1 ] = $name;
3344 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
3345 if ( $input =~ /[0-9]+\s*$/ ) {
3347 $rem_num =~ s/^\s*-\s*//g;
3348 $rem_num =~ s/\s*$//;
3350 $rem_num = $#icon_theme_name;
3352 if ( $rem_num == $icon_theme_def ) {
3353 print "You cannot remove the default icon theme!\n";
3354 } elsif ( $rem_num == $icon_theme_fallback ) {
3355 print "You cannot remove the fallback icon theme!\n";
3358 @new_theme_name = ();
3359 @new_theme_path = ();
3360 while ( $count <= $#icon_theme_name ) {
3361 if ( $count != $rem_num ) {
3362 @new_theme_name = ( @new_theme_name, $icon_theme_name[$count] );
3363 @new_theme_path = ( @new_theme_path, $icon_theme_path[$count] );
3367 @icon_theme_name = @new_theme_name;
3368 @icon_theme_path = @new_theme_path;
3369 if ( $icon_theme_def > $rem_num ) {
3373 } elsif ( $input =~ /^\s*t\s*/i ) {
3374 print "\nStarting detection...\n\n";
3376 opendir( DIR
, "../images/themes/" );
3377 @files = sort(readdir(DIR
));
3379 while ( $cnt <= $#files ) {
3380 $filename = "../images/themes/" . $files[$cnt] .'/';
3381 if ( -d
"../images/themes/" . $files[$cnt] && $files[$cnt] !~ /^\
./ && $files[$cnt] ne ".svn" ) {
3383 for ( $x = 0 ; $x <= $#icon_theme_path ; $x++ ) {
3384 if ( $icon_theme_path[$x] eq $filename ) {
3388 if ( $found != 1 ) {
3389 print "** Found icon theme: $filename\n";
3390 $def = $files[$cnt];
3393 #$def =~ s/(^\w+)/ucfirst $1/eg;
3394 #$def =~ s/(\s+)(\w+)/$1 . ucfirst $2/eg;
3395 $def =~ s/(^\w+)|(\s+)(\w+)/ucfirst $1 . $2 . ucfirst $3/eg;
3396 print " What is its name? [$def]: ";
3398 $nm =~ s/^\s+|\s+$|[\n\r]//g;
3399 if ( $nm eq '' ) { $nm = $def; }
3400 $icon_theme_name[ $#icon_theme_name + 1 ] = $nm;
3401 $icon_theme_path[ $#icon_theme_path + 1 ] = $filename;
3407 for ( $cnt = 0 ; $cnt <= $#icon_theme_path ; $cnt++ ) {
3408 $filename = $icon_theme_path[$cnt];
3409 if ( $filename ne "none" && $filename ne "template" && ! -d
$filename ) {
3410 print " Removing $filename (file not found)\n";
3412 @new_icon_theme_name = ();
3413 @new_icon_theme_path = ();
3414 for ( $x = 0 ; $x < $#icon_theme_path ; $x++ ) {
3415 if ( $icon_theme_path[$x] eq $filename ) {
3418 if ( $offset == 1 ) {
3419 $new_icon_theme_name[$x] = $icon_theme_name[ $x + 1 ];
3420 $new_icon_theme_path[$x] = $icon_theme_path[ $x + 1 ];
3422 $new_icon_theme_name[$x] = $icon_theme_name[$x];
3423 $new_icon_theme_path[$x] = $icon_theme_path[$x];
3426 @icon_theme_name = @new_icon_theme_name;
3427 @icon_theme_path = @new_icon_theme_path;
3430 print "\nDetection complete!\n\n";
3433 } elsif ( $input =~ /^\s*\?\s*/ ) {
3434 print ".------------------------------------.\n";
3435 print "| t (detect icon themes) |\n";
3436 print "| + (add icon theme) |\n";
3437 print "| - N (remove icon theme) |\n";
3438 print "| m N (mark default icon theme) |\n";
3439 print "| f N (set fallback icon set) |\n";
3440 print "| l (list icon themes) |\n";
3441 print "| d (done) |\n";
3442 print "`------------------------------------'\n";
3444 print "[icon_themes] command (?=help) > ";
3446 $input =~ s/[\r\n]//g;
3450 sub command_templates
{
3451 print "\nDefine the template sets (skins) that you wish to use. If you have added\n";
3452 print "a template set of your own, just follow the instructions (?) about\n";
3453 print "how to add them. You can also change the default template.\n";
3455 print "\n Available Templates:\n";
3458 while ( $count <= $#templateset_name ) {
3459 if ( $templateset_id[$count] eq $templateset_default ) {
3464 if ( $templateset_id[$count] eq $templateset_fallback ) {
3469 if ( $templateset_id[$count] eq $rpc_templateset ) {
3474 if ( $count < 10 ) {
3477 if ( $count < 100 ) {
3480 $name = $templateset_name[$count];
3482 # present RPC template sets differently
3484 if ( $templateset_id[$count] =~ /_rpc$/ ) {
3485 $name = $name . " (not shown in user interface; used for RPC interface only)";
3488 $num_spaces = 35 - length($name);
3489 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3490 $name = $name . " ";
3492 $name = $name . "($templateset_id[$count])";
3496 print " $count. $name\n";
3500 print "\n d = default template set\n"
3501 . " f = fallback template set\n"
3502 . " r = RPC template set\n\n";
3504 $menu_text = ".-------------------------------------.\n"
3505 . "| t (detect template set) |\n"
3506 . "| + (add template set) |\n"
3507 . "| - N (remove template set) |\n"
3508 . "| m N (mark default template set) |\n"
3509 . "| f N (set fallback template set) |\n"
3510 . "| r N (set RPC template set) |\n"
3511 . "| l (list template sets/skins) |\n"
3513 . "|-------------------------------------|\n"
3514 . "| where N is a template set number |\n"
3515 . "`-------------------------------------'\n";
3518 print "\n[template set] command (?=help) > ";
3521 $input =~ s/[\r\n]//g;
3522 while ( $input ne "d" ) {
3524 # list template sets
3526 if ( $input =~ /^\s*l\s*/i ) {
3528 while ( $count <= $#templateset_name ) {
3529 if ( $templateset_id[$count] eq $templateset_default ) {
3534 if ( $templateset_id[$count] eq $templateset_fallback ) {
3539 if ( $templateset_id[$count] eq $rpc_templateset ) {
3544 if ( $count < 10 ) {
3547 if ( $count < 100 ) {
3550 $name = $templateset_name[$count];
3552 # present RPC template sets differently
3554 if ( $templateset_id[$count] =~ /_rpc$/ ) {
3555 $name = $name . " (not shown in user interface; used for RPC interface only)";
3558 $num_spaces = 35 - length($name);
3559 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3560 $name = $name . " ";
3562 $name = $name . "($templateset_id[$count])";
3566 print " $count. $name\n";
3570 print "\n d = default template set\n"
3571 . " f = fallback template set\n"
3572 . " r = RPC template set\n\n";
3574 # mark default template set
3576 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
3577 $old_def = $templateset_default;
3578 $input =~ s/^\s*m\s*//;
3579 $templateset_default = $templateset_id[$input];
3580 if ( $templateset_default =~ /^\s*$/ ) {
3581 print "Cannot set default template set to $input. That template set does not exist.\n";
3582 $templateset_default = $old_def;
3584 if ( $templateset_default =~ /_rpc$/ ) {
3585 print "Cannot set default template set to $input. That template set is intended for the RPC interface only.\n";
3586 $templateset_default = $old_def;
3589 # set fallback template set
3591 } elsif ( $input =~ /^\s*f\s*[0-9]+/i ) {
3592 $old_def = $templateset_fallback;
3593 $input =~ s/^\s*f\s*//;
3594 $templateset_fallback = $templateset_id[$input];
3595 if ( $templateset_fallback =~ /^\s*$/ ) {
3596 print "Cannot set fallback template set to $input. That template set does not exist.\n";
3597 $templateset_fallback = $old_def;
3599 if ( $templateset_fallback =~ /_rpc$/ ) {
3600 print "Cannot set fallback template set to $input. That template set is intended for the RPC interface only.\n";
3601 $templateset_fallback = $old_def;
3604 # set RPC template set
3606 } elsif ( $input =~ /^\s*r\s*[0-9]+/i ) {
3607 $old_def = $rpc_templateset;
3608 $input =~ s/^\s*r\s*//;
3609 $rpc_templateset = $templateset_id[$input];
3610 if ( $rpc_templateset =~ /^\s*$/ ) {
3611 print "Cannot set RPC template set to $input. That template set does not exist.\n";
3612 $rpc_templateset = $old_def;
3614 if ( $rpc_templateset !~ /_rpc$/ ) {
3615 print "Cannot set fallback template set to $input. That template set is not intended for the RPC interface.\n";
3616 $rpc_templateset = $old_def;
3621 } elsif ( $input =~ /^\s*\+/ ) {
3622 print "\nWhat is the name of this template (as shown to your users): ";
3624 $name =~ s/[\r\n]//g;
3625 $templateset_name[ $#templateset_name + 1 ] = $name;
3626 print "\n\nThe directory name should not contain any path information\n"
3627 . "or slashes, and should be the name of the directory that the\n"
3628 . "template set is found in within the SquirrelMail templates\n"
3630 print "What directory is this stored in (ex: default_advanced): ";
3632 $name =~ s/[\r\n]//g;
3633 $templateset_id[ $#templateset_id + 1 ] = $name;
3635 # detect template sets
3637 } elsif ( $input =~ /^\s*t\s*/i ) {
3638 print "\nStarting detection...\n\n";
3639 opendir( DIR
, "../templates" );
3640 @files = sort(readdir(DIR
));
3642 while ( $cnt <= $#files ) {
3643 if ( -d
"../templates/" . $files[$cnt] && $files[$cnt] !~ /^\./ && $files[$cnt] ne ".svn" ) {
3644 $filename = $files[$cnt];
3646 for ( $x = 0 ; $x <= $#templateset_id ; $x++ ) {
3647 if ( $templateset_id[$x] eq $filename ) {
3653 print "** Found template set: $filename\n";
3654 $def = $files[$cnt];
3656 # no user-friendly names needed for RPC template sets
3658 if ( $def =~ /_rpc$/ ) {
3663 #$def =~ s/(^\w+)/ucfirst $1/eg;
3664 #$def =~ s/(\s+)(\w+)/$1 . ucfirst $2/eg;
3665 $def =~ s/(^\w+)|(\s+)(\w+)/ucfirst $1 . $2 . ucfirst $3/eg;
3666 print " What is it's name (as shown to your users)? [$def]: ";
3668 $nm =~ s/^\s+|\s+$|[\n\r]//g;
3669 if ( $nm eq '' ) { $nm = $def; }
3671 $templateset_id[ $#templateset_id + 1 ] = $filename;
3672 $templateset_name[ $#templateset_name + 1 ] = $nm;
3678 for ( $cnt= 0 ; $cnt <= $#templateset_id ; ) {
3679 $filename = $templateset_id[$cnt];
3680 if ( !(-d change_to_rel_path
('SM_PATH . \'templates/' . $filename)) ) {
3681 print " Removing \"$filename\" (template set directory not found)\n";
3682 if ( $templateset_default eq $filename ) { $templateset_default = 'default'; }
3683 if ( $templateset_fallback eq $filename ) { $templateset_fallback = 'default'; }
3684 if ( $rpc_templateset eq $filename ) { $rpc_templateset = 'default_rpc'; }
3686 @new_templateset_name = ();
3687 @new_templateset_id = ();
3688 for ( $x = 0 ; $x < $#templateset_id ; $x++ ) {
3689 if ( $templateset_id[$x] eq $filename ) {
3692 if ( $offset == 1 ) {
3693 $new_templateset_name[$x] = $templateset_name[ $x + 1 ];
3694 $new_templateset_id[$x] = $templateset_id[ $x + 1 ];
3696 $new_templateset_name[$x] = $templateset_name[$x];
3697 $new_templateset_id[$x] = $templateset_id[$x];
3700 @templateset_name = @new_templateset_name;
3701 @templateset_id = @new_templateset_id;
3704 print "\nDetection complete!\n\n";
3708 # remove template set
3710 # undocumented functionality of removing last template set isn't that great
3711 #} elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
3712 } elsif ( $input =~ /^\s*-\s*[0-9]+/ ) {
3713 if ( $input =~ /[0-9]+\s*$/ ) {
3715 $rem_num =~ s/^\s*-\s*//g;
3716 $rem_num =~ s/\s*$//;
3718 $rem_num = $#templateset_name;
3720 if ( $templateset_id[$rem_num] eq $templateset_default ) {
3721 print "You cannot remove the default template set!\n";
3722 } elsif ( $templateset_id[$rem_num] eq $templateset_fallback ) {
3723 print "You cannot remove the fallback template set!\n";
3724 } elsif ( $templateset_id[$rem_num] eq $rpc_templateset ) {
3725 print "You cannot remove the RPC template set!\n";
3728 @new_templateset_name = ();
3729 @new_templateset_id = ();
3730 while ( $count <= $#templateset_name ) {
3731 if ( $count != $rem_num ) {
3732 @new_templateset_name = ( @new_templateset_name, $templateset_name[$count] );
3733 @new_templateset_id = ( @new_templateset_id, $templateset_id[$count] );
3737 @templateset_name = @new_templateset_name;
3738 @templateset_id = @new_templateset_id;
3743 } elsif ( $input =~ /^\s*\?\s*/ ) {
3746 # command not understood
3749 print "Command not understood\n";
3752 print "[template set] command (?=help) > ";
3754 $input =~ s/[\r\n]//g;
3756 return $templateset_default;
3760 # sets default font size option
3761 sub command_default_fontsize
{
3762 print "Enter default font size [$WHT$$default_fontsize$NRM]: $WHT";
3763 $new_size = <STDIN
>;
3764 if ( $new_size eq "\n" ) {
3767 $new_size =~ s/[\r\n]//g;
3772 # controls available fontsets
3773 sub command_fontsets
{
3775 print "You can control fontsets available to end users here.\n";
3776 # set initial $input value
3778 while ( $input ne "x" ) {
3779 if ( $input =~ /^\s*a\s*/i ) {
3781 print "\nFontset name: ";
3783 if (! $fontsets{trim
($name)}) {
3784 print "Fontset string: ";
3786 $fontsets{trim
($name)} = trim
($value);
3788 print "\nERROR: Such fontset already exists.\n";
3790 } elsif ( $input =~ /^\s*e\s*/i ) {
3791 # edit existing fontset
3792 print "\nFontset name: ";
3794 if (! $fontsets{trim
($name)}) {
3795 print "\nERROR: No such fontset.\n";
3797 print "Fontset string [$fontsets{trim($name)}]: ";
3799 $fontsets{trim
($name)} = trim
($value);
3801 } elsif ( $input =~ /^\s*d\s*/ ) {
3802 # delete existing fontset
3803 print "\nFontset name: ";
3805 if (! $fontsets{trim
($name)}) {
3806 print "\nERROR: No such fontset.\n";
3808 delete $fontsets{trim
($name)};
3810 } elsif ( $input =~ /^\s*l\s*/ ) {
3812 print "\nConfigured fontsets:\n";
3813 while (($fontset_name, $fontset_string) = each(%fontsets)) {
3814 print " $fontset_name = $fontset_string\n";
3816 print "Default fontset: $default_fontset\n";
3817 } elsif ( $input =~ /^\s*m\s*/ ) {
3818 # set default fontset
3819 print "\nSet default fontset [$default_fontset]: ";
3821 if (trim
($name) ne '' and ! $fontsets{trim
($name)}) {
3822 print "\nERROR: No such fontset.\n";
3824 $default_fontset = trim
($name);
3827 # print available commands on any other input
3828 print "\nAvailable commands:\n";
3829 print " a - Adds new fontset.\n";
3830 print " d - Deletes existing fontset.\n";
3831 print " e - Edits existing fontset.\n";
3832 print " h or ? - Shows this help screen.\n";
3833 print " l - Lists available fontsets.\n";
3834 print " m - Sets default fontset.\n";
3835 print " x - Exits fontset editor mode.\n";
3837 print "\nCommand [fontsets] (a,d,e,h,?=help,l,m,x)> ";
3839 $input =~ s/[\r\n]//g;
3844 print "You can now define different LDAP servers.\n";
3845 print "Please ensure proper permissions for config.php when including\n";
3846 print "sensitive passwords.\n\n";
3847 print "[ldap] command (?=help) > ";
3849 $input =~ s/[\r\n]//g;
3850 while ( $input ne "d" ) {
3851 if ( $input =~ /^\s*l\s*/i ) {
3853 while ( $count <= $#ldap_host ) {
3854 print "$count. $ldap_host[$count]\n";
3855 print " base: $ldap_base[$count]\n";
3856 if ( $ldap_charset[$count] ) {
3857 print " charset: $ldap_charset[$count]\n";
3859 if ( $ldap_port[$count] ) {
3860 print " port: $ldap_port[$count]\n";
3862 if ( $ldap_name[$count] ) {
3863 print " name: $ldap_name[$count]\n";
3865 if ( $ldap_maxrows[$count] ) {
3866 print " maxrows: $ldap_maxrows[$count]\n";
3868 if ( $ldap_filter[$count] ) {
3869 print " filter: $ldap_filter[$count]\n";
3871 if ( $ldap_binddn[$count] ) {
3872 print " binddn: $ldap_binddn[$count]\n";
3873 if ( $ldap_bindpw[$count] ) {
3874 print " bindpw: $ldap_bindpw[$count]\n";
3877 if ( $ldap_protocol[$count] ) {
3878 print " protocol: $ldap_protocol[$count]\n";
3880 if ( $ldap_limit_scope[$count] ) {
3881 print " limit_scope: $ldap_limit_scope[$count]\n";
3883 if ( $ldap_listing[$count] ) {
3884 print " listing: $ldap_listing[$count]\n";
3886 if ( $ldap_writeable[$count] ) {
3887 print " writeable: $ldap_writeable[$count]\n";
3889 if ( $ldap_search_tree[$count] ) {
3890 print " search_tree: $ldap_search_tree[$count]\n";
3892 if ( $ldap_starttls[$count] ) {
3893 print " starttls: $ldap_starttls[$count]\n";
3899 } elsif ( $input =~ /^\s*\+/ ) {
3900 $sub = $#ldap_host + 1;
3902 print "First, we need to have the hostname or the IP address where\n";
3903 print "this LDAP server resides. Example: ldap.bigfoot.com\n";
3905 print "You can use any URI compatible with your LDAP library. Please\n";
3906 print "note that StartTLS option is not compatible with ldaps and\n";
3907 print "ldapi URIs.\n";
3910 $name =~ s/[\r\n]//g;
3911 $ldap_host[$sub] = $name;
3915 print "Next, we need the server root (base dn). For this, an empty\n";
3916 print "string is allowed.\n";
3917 print "Example: ou=member_directory,o=netcenter.com\n";
3920 $name =~ s/[\r\n]//g;
3921 $ldap_base[$sub] = $name;
3925 print "This is the TCP/IP port number for the LDAP server. Default\n";
3926 print "port is 389. This is optional. Press ENTER for default.\n";
3929 $name =~ s/[\r\n]//g;
3930 $ldap_port[$sub] = $name;
3934 print "This is the charset for the server. Default is utf-8. This\n";
3935 print "is also optional. Press ENTER for default.\n";
3938 $name =~ s/[\r\n]//g;
3939 $ldap_charset[$sub] = $name;
3943 print "This is the name for the server, used to tag the results of\n";
3944 print "the search. Default it \"LDAP: hostname\". Press ENTER for default\n";
3947 $name =~ s/[\r\n]//g;
3948 $ldap_name[$sub] = $name;
3952 print "You can specify the maximum number of rows in the search result.\n";
3953 print "Default value is equal to 250 rows. Press ENTER for default.\n";
3956 $name =~ s/[\r\n]//g;
3957 $ldap_maxrows[$sub] = $name;
3962 print "If your LDAP server does not like anonymous logins, you can specify bind DN.\n";
3963 print "Default is none, anonymous bind. Press ENTER for default.\n";
3966 $name =~ s/[\r\n]//g;
3967 $ldap_binddn[$sub] = $name;
3971 if ( $ldap_binddn[$sub] ne '' ) {
3973 print "Now, please specify password for that DN.\n";
3976 $name =~ s/[\r\n]//g;
3977 $ldap_bindpw[$sub] = $name;
3982 print "You can specify bind protocol version here.\n";
3983 print "Default protocol version depends on your php ldap settings.\n";
3984 print "Press ENTER for default.\n";
3987 $name =~ s/[\r\n]//g;
3988 $ldap_protocol[$sub] = $name;
3992 print "This configuration section allows to set some rarely used\n";
3993 print "options and options specific to some LDAP implementations.\n";
3995 print "Do you want to set advanced LDAP directory settings? (y/N):";
3996 $ldap_advanced_settings = <STDIN
>;
3997 if ( $ldap_advanced_settings =~ /^y\n/i ) {
3998 $ldap_advanced_settings = 'true';
4000 $ldap_advanced_settings = 'false';
4003 if ($ldap_advanced_settings eq 'true') {
4006 print "You can control LDAP directory listing here. This option can\n";
4007 print "be useful if you run small LDAP server and want to provide listing\n";
4008 print "of all addresses stored in LDAP to users of webmail interface.\n";
4009 print "Number of displayed entries is limited by maxrows setting.\n";
4011 print "Don't enable this option for public LDAP directories.\n";
4013 print "Allow listing of LDAP directory? (y/N):";
4015 if ( $name =~ /^y\n/i ) {
4020 $ldap_listing[$sub] = $name;
4024 print "You can control write access to LDAP address book here. This option can\n";
4025 print "be useful if you run small LDAP server and want to provide writable\n";
4026 print "shared address book stored in LDAP to users of webmail interface.\n";
4028 print "Don't enable this option for public LDAP directories.\n";
4030 print "Allow writing to LDAP directory? (y/N):";
4032 if ( $name =~ /^y\n/i ) {
4037 $ldap_writeable[$sub] = $name;
4041 print "You can specify an additional search filter.\n";
4042 print "This could be something like \"(objectclass=posixAccount)\".\n";
4043 print "No filtering is performed by default. Press ENTER for default.\n";
4046 $name =~ s/[\r|\n]//g;
4047 $ldap_filter[$sub] = $name;
4051 print "You can control search scope here.\n";
4052 print "This option is specific to Microsoft ADS implementation.\n";
4053 print "It requires use of v3 or newer LDAP protocol.\n";
4054 print "Don't enable it, if you use other LDAP server.\n";
4056 print "Limit ldap scope? (y/N):";
4058 if ( $name =~ /^y\n/i ) {
4063 $ldap_limit_scope[$sub] = $name;
4067 print "You can control ldap search type here.\n";
4068 print "Addresses can be searched in entire LDAP subtree (default)\n";
4069 print "or only first level entries are returned.\n";
4071 print "Search entire LDAP subtree? (Y/n):";
4073 if ( $name =~ /^n\n/i ) {
4078 $ldap_search_tree[$sub] = $name;
4082 print "You can control use of StartTLS on LDAP connection here.\n";
4083 print "This option requires use of v3 or newer LDAP protocol and php 4.2+.\n";
4085 print "Use StartTLS? (y/N):";
4087 if ( $name =~ /^y\n/i ) {
4092 $ldap_starttls[$sub] = $name;
4096 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
4097 if ( $input =~ /[0-9]+\s*$/ ) {
4099 $rem_num =~ s/^\s*-\s*//g;
4100 $rem_num =~ s/\s*$//;
4102 $rem_num = $#ldap_host;
4105 @new_ldap_host = ();
4106 @new_ldap_base = ();
4107 @new_ldap_port = ();
4108 @new_ldap_name = ();
4109 @new_ldap_charset = ();
4110 @new_ldap_maxrows = ();
4111 @new_ldap_filter = ();
4112 @new_ldap_bindpw = ();
4113 @new_ldap_binddn = ();
4114 @new_ldap_protocol = ();
4115 @new_ldap_limit_scope = ();
4116 @new_ldap_listing = ();
4117 @new_ldap_writeable = ();
4118 @new_ldap_search_tree = ();
4119 @new_ldap_starttls = ();
4121 while ( $count <= $#ldap_host ) {
4122 if ( $count != $rem_num ) {
4123 @new_ldap_host = ( @new_ldap_host, $ldap_host[$count] );
4124 @new_ldap_base = ( @new_ldap_base, $ldap_base[$count] );
4125 @new_ldap_port = ( @new_ldap_port, $ldap_port[$count] );
4126 @new_ldap_name = ( @new_ldap_name, $ldap_name[$count] );
4127 @new_ldap_charset = ( @new_ldap_charset, $ldap_charset[$count] );
4128 @new_ldap_maxrows = ( @new_ldap_maxrows, $ldap_maxrows[$count] );
4129 @new_ldap_filter = ( @new_ldap_filter, $ldap_filter[$count] );
4130 @new_ldap_binddn = ( @new_ldap_binddn, $ldap_binddn[$count] );
4131 @new_ldap_bindpw = ( @new_ldap_bindpw, $ldap_bindpw[$count] );
4132 @new_ldap_protocol = ( @new_ldap_protocol, $ldap_protocol[$count] );
4133 @new_ldap_limit_scope = ( @new_ldap_limit_scope, $ldap_limit_scope[$count] );
4134 @new_ldap_listing = ( @new_ldap_listing, $ldap_listing[$count] );
4135 @new_ldap_writeable = ( @new_ldap_writeable, $ldap_writeable[$count] );
4136 @new_ldap_search_tree = ( @new_ldap_search_tree, $ldap_search_tree[$count] );
4137 @new_ldap_starttls = ( @new_ldap_starttls, $ldap_starttls[$count] );
4141 @ldap_host = @new_ldap_host;
4142 @ldap_base = @new_ldap_base;
4143 @ldap_port = @new_ldap_port;
4144 @ldap_name = @new_ldap_name;
4145 @ldap_charset = @new_ldap_charset;
4146 @ldap_maxrows = @new_ldap_maxrows;
4147 @ldap_filter = @new_ldap_filter;
4148 @ldap_binddn = @new_ldap_binddn;
4149 @ldap_bindpw = @new_ldap_bindpw;
4150 @ldap_protocol = @new_ldap_protocol;
4151 @ldap_limit_scope = @new_ldap_limit_scope;
4152 @ldap_listing = @new_ldap_listing;
4153 @ldap_writeable = @new_ldap_writeable;
4154 @ldap_search_tree = @new_ldap_search_tree;
4155 @ldap_starttls = @new_ldap_starttls;
4157 } elsif ( $input =~ /^\s*\?\s*/ ) {
4158 print ".-------------------------.\n";
4159 print "| + (add host) |\n";
4160 print "| - N (remove host) |\n";
4161 print "| l (list hosts) |\n";
4162 print "| d (done) |\n";
4163 print "`-------------------------'\n";
4165 print "[ldap] command (?=help) > ";
4167 $input =~ s/[\r\n]//g;
4172 print "Some of our developers have come up with very good javascript interface\n";
4173 print "for searching through address books, however, our original goals said\n";
4174 print "that we would be 100% HTML. In order to make it possible to use their\n";
4175 print "interface, and yet stick with our goals, we have also written a plain\n";
4176 print "HTML version of the search. Here, you can choose which version to use.\n";
4178 print "This is just the default value. It is also a user option that each\n";
4179 print "user can configure individually\n";
4182 if ( lc($default_use_javascript_addr_book) eq 'true' ) {
4183 $default_value = "y";
4185 $default_use_javascript_addr_book = 'false';
4186 $default_value = "n";
4188 print "Use javascript version by default (y/n) [$WHT$default_value$NRM]: $WHT";
4189 $new_show = <STDIN
>;
4190 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4191 $default_use_javascript_addr_book = 'true';
4193 $default_use_javascript_addr_book = 'false';
4195 return $default_use_javascript_addr_book;
4198 # global filebased address book
4200 print "If you want to use global file address book, then you\n";
4201 print "must set this option to a valid value. If option does\n";
4202 print "not have path elements, system assumes that file is\n";
4203 print "stored in data directory. If relative path is set, it is\n";
4204 print "relative to main SquirrelMail directory. If value is empty,\n";
4205 print "address book is not enabled.\n";
4208 print "[$WHT$abook_global_file$NRM]: $WHT";
4209 $new_abook_global_file = <STDIN
>;
4210 if ( $new_abook_global_file eq "\n" ) {
4211 $new_abook_global_file = $abook_global_file;
4213 $new_abook_global_file =~ s/[\r\n]//g;
4215 return $new_abook_global_file;
4218 # writing into global filebased abook control
4220 print "This setting controls writing into global file address\n";
4221 print "book options. Address book file must be writeable by\n";
4222 print "webserver's user, if you want to enable this option.\n";
4225 if ( lc($abook_global_file_writeable) eq 'true' ) {
4226 $default_value = "y";
4228 $abook_global_file_writeable = 'false';
4229 $default_value = "n";
4231 print "Allow writing into global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
4232 $new_show = <STDIN
>;
4233 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4234 $abook_global_file_writeable = 'true';
4236 $abook_global_file_writeable = 'false';
4238 return $abook_global_file_writeable;
4241 # listing of global filebased abook control
4243 print "This setting controls listing of global file address\n";
4244 print "book in addresses page.\n";
4247 if ( lc($abook_global_file_listing) eq 'true' ) {
4248 $default_value = "y";
4250 $abook_global_file_listing = 'false';
4251 $default_value = "n";
4253 print "Allow listing of global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
4254 $new_show = <STDIN
>;
4255 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4256 $abook_global_file_listing = 'true';
4258 $abook_global_file_listing = 'false';
4260 return $abook_global_file_listing;
4263 # controls $abook_file_line_length setting
4264 sub command_abook_file_line_length
{
4265 print "This setting controls space allocated to file based address book records.\n";
4266 print "End users will be unable to save address book entry, if total entry size \n";
4267 print "(quoted address book fields + 4 delimiters + linefeed) exceeds allowed \n";
4268 print "address book length size.\n";
4270 print "Same setting is applied to personal and global file based address books.\n";
4272 print "It is strongly recommended to keep default setting value. Change it only\n";
4273 print "if you really want to store address book entries that are bigger than two\n";
4274 print "kilobytes (2048).\n";
4277 print "Enter allowed address book line length [$abook_file_line_length]: ";
4280 # value is not modified, if user hits Enter or enters space
4282 # make sure that input is numeric
4283 if ($tmp =~ /^\d+$/) {
4284 $abook_file_line_length = $tmp;
4286 print "If you want to change this setting, you must enter number.\n";
4287 print "If you want to keep original setting - enter space.\n\n";
4288 print "Press Enter to continue...";
4295 print "If you want to store your users address book details in a database then\n";
4296 print "you need to set this DSN to a valid value. The format for this is:\n";
4297 print "mysql://user:pass\@hostname/dbname\n";
4298 print "Where mysql can be one of the databases PHP supports, the most common\n";
4299 print "of these are mysql, msql and pgsql.\n";
4300 print "Please ensure proper permissions for config.php when including\n";
4301 print "sensitive passwords.\n\n";
4302 print "If the DSN is left empty (hit space and then return) the database\n";
4303 print "related code for address books will not be used.\n";
4306 if ( $addrbook_dsn eq "" ) {
4307 $default_value = "Disabled";
4309 $default_value = $addrbook_dsn;
4311 print "[$WHT$addrbook_dsn$NRM]: $WHT";
4313 if ( $new_dsn eq "\n" ) {
4314 $new_dsn = $addrbook_dsn;
4316 $new_dsn =~ s/[\r\n]//g;
4317 $new_dsn =~ s/^\s+$//g;
4323 print "This is the name of the table you want to store the address book\n";
4324 print "data in, it defaults to 'address'\n";
4326 print "[$WHT$addrbook_table$NRM]: $WHT";
4327 $new_table = <STDIN
>;
4328 if ( $new_table eq "\n" ) {
4329 $new_table = $addrbook_table;
4331 $new_table =~ s/[\r\n]//g;
4337 print "If you want to store your users preferences in a database then\n";
4338 print "you need to set this DSN to a valid value. The format for this is:\n";
4339 print "mysql://user:pass\@hostname/dbname\n";
4340 print "Where mysql can be one of the databases PHP supports, the most common\n";
4341 print "of these are mysql, msql and pgsql.\n";
4342 print "Please ensure proper permissions for config.php when including\n";
4343 print "sensitive passwords.\n\n";
4344 print "If the DSN is left empty (hit space and then return) the database\n";
4345 print "related code for address books will not be used.\n";
4348 if ( $prefs_dsn eq "" ) {
4349 $default_value = "Disabled";
4351 $default_value = $prefs_dsn;
4353 print "[$WHT$prefs_dsn$NRM]: $WHT";
4355 if ( $new_dsn eq "\n" ) {
4356 $new_dsn = $prefs_dsn;
4358 $new_dsn =~ s/[\r\n]//g;
4359 $new_dsn =~ s/^\s+$//g;
4365 print "This is the name of the table you want to store the preferences\n";
4366 print "data in, it defaults to 'userprefs'\n";
4368 print "[$WHT$prefs_table$NRM]: $WHT";
4369 $new_table = <STDIN
>;
4370 if ( $new_table eq "\n" ) {
4371 $new_table = $prefs_table;
4373 $new_table =~ s/[\r\n]//g;
4379 print "This is the name of the field in which you want to store the\n";
4380 print "username of the person the prefs are for. It defaults to 'user'\n";
4382 print "[$WHT$prefs_user_field$NRM]: $WHT";
4383 $new_field = <STDIN
>;
4384 if ( $new_field eq "\n" ) {
4385 $new_field = $prefs_user_field;
4387 $new_field =~ s/[\r\n]//g;
4389 $prefs_user_size = db_pref_size
($prefs_user_size);
4394 print "This is the name of the field in which you want to store the\n";
4395 print "preferences keyword. It defaults to 'prefkey'\n";
4397 print "[$WHT$prefs_key_field$NRM]: $WHT";
4398 $new_field = <STDIN
>;
4399 if ( $new_field eq "\n" ) {
4400 $new_field = $prefs_key_field;
4402 $new_field =~ s/[\r\n]//g;
4404 $prefs_key_size = db_pref_size
($prefs_key_size);
4409 print "This is the name of the field in which you want to store the\n";
4410 print "preferences value. It defaults to 'prefval'\n";
4412 print "[$WHT$prefs_val_field$NRM]: $WHT";
4413 $new_field = <STDIN
>;
4414 if ( $new_field eq "\n" ) {
4415 $new_field = $prefs_val_field;
4417 $new_field =~ s/[\r\n]//g;
4419 $prefs_val_size = db_pref_size
($prefs_val_size);
4423 # routine is used to set database field limits
4424 # it needs one argument
4425 sub db_pref_size
() {
4427 print "\nDatabase fields have size limits.\n";
4429 print "What limit is set for this field? [$WHT$size$NRM]: $WHT";
4430 $new_size = <STDIN
>;
4431 if ( $new_size eq "\n" ) {
4434 $new_size =~ s/[\r\n]//g;
4440 print "If you want to store your global address book in a database then\n";
4441 print "you need to set this DSN to a valid value. The format for this is:\n";
4442 print "mysql://user:pass\@hostname/dbname\n";
4443 print "Where mysql can be one of the databases PHP supports, the most common\n";
4444 print "of these are mysql, msql and pgsql.\n";
4445 print "Please ensure proper permissions for config.php when including\n";
4446 print "sensitive passwords.\n\n";
4447 print "If the DSN is left empty (hit space and then return) the database\n";
4448 print "related code for global SQL address book will not be used.\n";
4451 if ( $addrbook_global_dsn eq "" ) {
4452 $default_value = "Disabled";
4454 $default_value = $addrbook_global_dsn;
4456 print "[$WHT$addrbook_global_dsn$NRM]: $WHT";
4458 if ( $new_dsn eq "\n" ) {
4459 $new_dsn = $addrbook_global_dsn;
4461 $new_dsn =~ s/[\r\n]//g;
4462 $new_dsn =~ s/^\s+$//g;
4468 print "This is the name of the table you want to store the global address book\n";
4469 print "data in. Default table name is 'global_abook'. Address book uses same\n";
4470 print "database format as personal address book.\n";
4472 print "[$WHT$addrbook_global_table$NRM]: $WHT";
4473 $new_table = <STDIN
>;
4474 if ( $new_table eq "\n" ) {
4475 $new_table = $addrbook_global_table;
4477 $new_table =~ s/[\r\n]//g;
4483 print "This option controls users\' ability to add or modify records stored \n";
4484 print "in global address book\n";
4486 if ( lc($addrbook_global_writeable) eq 'true' ) {
4487 $default_value = "y";
4489 $default_value = "n";
4491 print "Allow writing into global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
4492 $addrbook_global_writeable = <STDIN
>;
4493 if ( ( $addrbook_global_writeable =~ /^y\n/i ) || ( ( $addrbook_global_writeable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4494 $addrbook_global_writeable = 'true';
4496 $addrbook_global_writeable = 'false';
4498 return $addrbook_global_writeable;
4502 print "Enable this option if you want to see listing of addresses stored \n";
4503 print "in global address book\n";
4505 if ( lc($addrbook_global_listing) eq 'true' ) {
4506 $default_value = "y";
4508 $default_value = "n";
4510 print "Allow listing of global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
4511 $addrbook_global_listing = <STDIN
>;
4512 if ( ( $addrbook_global_listing =~ /^y\n/i ) || ( ( $addrbook_global_listing =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4513 $addrbook_global_listing = 'true';
4515 $addrbook_global_listing = 'false';
4517 return $addrbook_global_listing;
4523 print "SquirrelMail attempts to set the language in many ways. If it\n";
4524 print "can not figure it out in another way, it will default to this\n";
4525 print "language. Please use the code for the desired language.\n";
4527 print "[$WHT$squirrelmail_default_language$NRM]: $WHT";
4528 $new_squirrelmail_default_language = <STDIN
>;
4529 if ( $new_squirrelmail_default_language eq "\n" ) {
4530 $new_squirrelmail_default_language = $squirrelmail_default_language;
4532 $new_squirrelmail_default_language =~ s/[\r\n]//g;
4533 $new_squirrelmail_default_language =~ s/^\s+$//g;
4535 return $new_squirrelmail_default_language;
4539 print "This option controls what character set is used when sending\n";
4540 print "mail and when sending HTML to the browser. Option works only\n";
4541 print "with US English (en_US) translation. Other translations use\n";
4542 print "charsets that are set in translation settings.\n";
4545 print "[$WHT$default_charset$NRM]: $WHT";
4546 $new_default_charset = <STDIN
>;
4547 if ( $new_default_charset eq "\n" ) {
4548 $new_default_charset = $default_charset;
4550 $new_default_charset =~ s/[\r\n]//g;
4552 return $new_default_charset;
4554 # Alternative language names
4556 print "Enable this option if you want to see localized language names in\n";
4557 print "language selection box. Note, that this option can trigger\n";
4558 print "installation of foreign language support modules in some browsers.\n";
4561 if ( lc($show_alternative_names) eq 'true' ) {
4562 $default_value = "y";
4564 $default_value = "n";
4566 print "Show alternative language names? (y/n) [$WHT$default_value$NRM]: $WHT";
4567 $show_alternative_names = <STDIN
>;
4568 if ( ( $show_alternative_names =~ /^y\n/i ) || ( ( $show_alternative_names =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4569 $show_alternative_names = 'true';
4571 $show_alternative_names = 'false';
4573 return $show_alternative_names;
4576 # Aggressive decoding
4578 print "Enable this option if you want to use CPU and memory intensive decoding\n";
4579 print "functions. This option allows reading multibyte charset, that are used\n";
4580 print "in Eastern Asia. SquirrelMail will try to use recode functions here,\n";
4581 print "even when you have disabled use of recode in Tweaks section.\n";
4584 if ( lc($aggressive_decoding) eq 'true' ) {
4585 $default_value = "y";
4587 $default_value = "n";
4589 print "Enable aggressive decoding? (y/n) [$WHT$default_value$NRM]: $WHT";
4590 $aggressive_decoding = <STDIN
>;
4591 if ( ( $aggressive_decoding =~ /^y\n/i ) || ( ( $aggressive_decoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4592 $aggressive_decoding = 'true';
4594 $aggressive_decoding = 'false';
4596 return $aggressive_decoding;
4601 print "Enable this option if you want to allow lossy charset encoding in message\n";
4602 print "composition pages. This option allows charset conversions when output\n";
4603 print "charset does not support all symbols used in original charset. Symbols\n";
4604 print "unsupported by output charset will be replaced with question marks.\n";
4607 if ( lc($lossy_encoding) eq 'true' ) {
4608 $default_value = "y";
4610 $default_value = "n";
4612 print "Enable lossy encoding? (y/n) [$WHT$default_value$NRM]: $WHT";
4613 $lossy_encoding = <STDIN
>;
4614 if ( ( $lossy_encoding =~ /^y\n/i ) || ( ( $lossy_encoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4615 $lossy_encoding = 'true';
4617 $lossy_encoding = 'false';
4619 return $lossy_encoding;
4622 # display html emails in iframe
4624 print "This option can enable html email rendering inside iframe.\n";
4625 print "Inline frames are used in order to provide sandbox environment";
4626 print "for html code included in html formated emails.";
4627 print "Option is experimental and might have glitches in some parts of code.";
4630 if ( lc($use_iframe) eq 'true' ) {
4631 $default_value = "y";
4633 $default_value = "n";
4635 print "Display html emails in iframe? (y/n) [$WHT$default_value$NRM]: $WHT";
4636 $use_iframe = <STDIN
>;
4637 if ( ( $use_iframe =~ /^y\n/i ) || ( ( $use_iframe =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4638 $use_iframe = 'true';
4640 $use_iframe = 'false';
4646 sub command_ask_user_info
{
4647 print "New users need to supply their real name and email address to\n";
4648 print "send out proper mails. When this option is enabled, a user that\n";
4649 print "logs in for the first time will be redirected to the Personal\n";
4650 print "Options screen and asked to supply their personal data.\n";
4653 if ( lc($ask_user_info) eq 'true' ) {
4654 $default_value = "y";
4656 $default_value = "n";
4658 print "Ask user info? (y/n) [$WHT$default_value$NRM]: $WHT";
4659 $ask_user_info = <STDIN
>;
4660 if ( ( $ask_user_info =~ /^y\n/i ) || ( ( $ask_user_info =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4661 $ask_user_info = 'true';
4663 $ask_user_info = 'false';
4665 return $ask_user_info;
4670 print "Enabling this option will cause icons to be used instead of text\n";
4671 print "markers next to each message in mailbox lists that represent\n";
4672 print "new, read, flagged, and deleted messages, as well as those that\n";
4673 print "have been replied to and forwarded. Icons are also used next to\n";
4674 print "(un)expanded folders in the folder list (Oldway = false). These\n";
4675 print "icons are quite small, but will obviously be more of a resource\n";
4676 print "drain than text markers.\n";
4679 if ( lc($use_icons) eq 'true' ) {
4680 $default_value = "y";
4682 $default_value = "n";
4684 print "Use icons? (y/n) [$WHT$default_value$NRM]: $WHT";
4685 $use_icons = <STDIN
>;
4686 if ( ( $use_icons =~ /^y\n/i ) || ( ( $use_icons =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4687 $use_icons = 'true';
4689 $use_icons = 'false';
4695 print "Enable this option if you want to use php recode functions to read\n";
4696 print "emails written in charset that differs from the one that is set in\n";
4697 print "translation selected by user. Code is experimental, it might cause\n";
4698 print "errors, if email contains charset unsupported by recode or if your\n";
4699 print "php does not have recode support.\n";
4702 if ( lc($use_php_recode) eq 'true' ) {
4703 $default_value = "y";
4705 $default_value = "n";
4707 print "Use php recode functions? (y/n) [$WHT$default_value$NRM]: $WHT";
4708 $use_php_recode = <STDIN
>;
4709 if ( ( $use_php_recode =~ /^y\n/i ) || ( ( $use_php_recode =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4710 $use_php_recode = 'true';
4712 $use_php_recode = 'false';
4714 return $use_php_recode;
4718 print "Enable this option if you want to use php iconv functions to read\n";
4719 print "emails written in charset that differs from the one that is set in\n";
4720 print "translation selected by user. Code is experimental, it works only\n";
4721 print "with translations that use utf-8 charset. Code might cause errors,\n";
4722 print "if email contains charset unsupported by iconv or if your php does\n";
4723 print "not have iconv support.\n";
4726 if ( lc($use_php_iconv) eq 'true' ) {
4727 $default_value = "y";
4729 $default_value = "n";
4731 print "Use php iconv functions? (y/n) [$WHT$default_value$NRM]: $WHT";
4732 $use_php_iconv = <STDIN
>;
4733 if ( ( $use_php_iconv =~ /^y\n/i ) || ( ( $use_php_iconv =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4734 $use_php_iconv = 'true';
4736 $use_php_iconv = 'false';
4738 return $use_php_iconv;
4743 print "In some cases, buffering all output (holding it on the server until\n";
4744 print "the full page is ready to send to the browser) allows more complex\n";
4745 print "functionality, especially for plugins that want to add headers on hooks\n";
4746 print "that are beyond the point of output having been sent to the browser\n";
4747 print "otherwise. Most plugins that need this functionality will enable it\n";
4748 print "automatically on their own, but you can turn it on manually here. You'd\n";
4749 print "usually want to do this if you want to specify a custom output handler\n";
4750 print "for parsing the output - you can do that by specifying a value for\n";
4751 print "\$buffered_output_handler in config_local.php. Don't forget to define\n";
4752 print "a function of the same name as what \$buffered_output_handler is set to.\n";
4755 if ( lc($buffer_output) eq 'true' ) {
4756 $default_value = "y";
4758 $default_value = "n";
4760 print "Buffer all output? (y/n) [$WHT$default_value$NRM]: $WHT";
4761 $buffer_output = <STDIN
>;
4762 if ( ( $buffer_output =~ /^y\n/i ) || ( ( $buffer_output =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4763 $buffer_output = 'true';
4765 $buffer_output = 'false';
4767 return $buffer_output;
4772 print "Enable this option if you want to check SquirrelMail configuration\n";
4773 print "remotely with configtest.php script.\n";
4776 if ( lc($allow_remote_configtest) eq 'true' ) {
4777 $default_value = "y";
4779 $default_value = "n";
4781 print "Allow remote configuration tests? (y/n) [$WHT$default_value$NRM]: $WHT";
4782 $allow_remote_configtest = <STDIN
>;
4783 if ( ( $allow_remote_configtest =~ /^y\n/i ) || ( ( $allow_remote_configtest =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4784 $allow_remote_configtest = 'true';
4786 $allow_remote_configtest = 'false';
4788 return $allow_remote_configtest;
4791 # Default Icon theme
4793 print "You may change the path to the default icon theme to be used, if icons\n";
4794 print "have been enabled. This theme will be used when an icon cannot be\n";
4795 print "found in the current theme, or when no icon theme is specified. If\n";
4796 print "left blank, and icons are enabled, the default theme will be used\n";
4797 print "from images/themes/default/.\n";
4799 print "To clear out an existing value, just type a space for the input.\n";
4801 print "Please be aware of the following: \n";
4802 print " - Relative URLs are relative to the config dir\n";
4803 print " to use the icon themes directory, use ../images/themes/newtheme/\n";
4804 print " - The icon theme may be outside the SquirrelMail directory, but\n";
4805 print " it must be web accessible.\n";
4806 print "[$WHT$icon_theme_def$NRM]: $WHT";
4807 $new_icon_theme_def = <STDIN
>;
4809 if ( $new_icon_theme_def eq "\n" ) {
4810 $new_icon_theme_def = $icon_theme_def;
4812 $new_icon_theme_def =~ s/[\r\n]//g;
4814 $new_icon_theme_def =~ s/^\s*//;
4815 return $new_icon_theme_def;
4818 # SquirrelMail debug mode (since 1.5.2)
4820 print "When debugging or developing SquirrelMail, you may want to increase\n";
4821 print "the verbosity of certain kinds of errors, notices, and/or diagnostics.\n";
4822 print "You may enable one or more of the debugging modes here. Please make\n";
4823 print "sure that you have turned off debugging if you are using SquirrelMail\n";
4824 print "in a production environment.\n\n";
4827 while ( $input ne "d\n" ) {
4828 $sm_debug_mode = convert_debug_constants_to_binary_integer
($sm_debug_mode);
4830 # per include/constants.php, here are the debug mode values:
4832 # 0 SM_DEBUG_MODE_OFF
4833 # 1 SM_DEBUG_MODE_SIMPLE
4834 # 512 SM_DEBUG_MODE_MODERATE
4835 # 524288 SM_DEBUG_MODE_ADVANCED
4836 # 536870912 SM_DEBUG_MODE_STRICT
4838 print "\n# Enabled? Description\n";
4839 print "---------------------------------------------------------------------\n";
4840 print "0 " . ($sm_debug_mode == 0 ?
"y" : " ")
4841 . " No debugging (recommended in production environments)\n";
4842 print "1 " . ($sm_debug_mode & 1 ?
"y" : " ")
4843 . " Simple debugging (PHP E_ERROR)\n";
4844 print "2 " . ($sm_debug_mode & 512 ?
"y" : " ")
4845 . " Moderate debugging (PHP E_ALL without E_STRICT)\n";
4846 print "3 " . ($sm_debug_mode & 524288 ?
"y" : " ")
4847 . " Advanced debugging (PHP E_ALL (without E_STRICT) plus\n";
4848 print " log errors intentionally suppressed)\n";
4849 print "4 " . ($sm_debug_mode & 536870912 ?
"y" : " ")
4850 . " Strict debugging (PHP E_ALL and E_STRICT)\n";
4853 print "SquirrelMail debug mode (0,1,2,3,4) or d when done? : $WHT";
4855 if ( $input eq "d\n" ) {
4857 } elsif ($input !~ /^[0-9]+\n$/) {
4858 print "\nInvalid configuration value.\n";
4859 print "\nPress enter to continue...";
4861 } elsif ( $input == "0\n" ) {
4863 } elsif ( $input == "1\n" ) {
4864 if ($sm_debug_mode & 1) {
4865 $sm_debug_mode ^= 1;
4867 $sm_debug_mode |= 1;
4869 } elsif ( $input == "2\n" ) {
4870 if ($sm_debug_mode & 512) {
4871 $sm_debug_mode ^= 512;
4873 $sm_debug_mode |= 512;
4875 } elsif ( $input == "3\n" ) {
4876 if ($sm_debug_mode & 524288) {
4877 $sm_debug_mode ^= 524288;
4879 $sm_debug_mode |= 524288;
4881 } elsif ( $input == "4\n" ) {
4882 if ($sm_debug_mode & 536870912) {
4883 $sm_debug_mode ^= 536870912;
4885 $sm_debug_mode |= 536870912;
4888 print "\nInvalid configuration value.\n";
4889 print "\nPress enter to continue...";
4894 $sm_debug_mode = convert_debug_binary_integer_to_constants
($sm_debug_mode);
4895 return $sm_debug_mode;
4898 # Secured configuration mode (since 1.5.2)
4900 print "This option allows you to enable \"Secured Configuration\" mode,\n";
4901 print "which will guarantee that certain settings made herein will be\n";
4902 print "made immutable and will not be subject to override by either friendly\n";
4903 print "or unfriendly code/plugins. Only a small number of settings herein\n";
4904 print "will be used in this manner - just those that are deemed to be a\n";
4905 print "potential security threat when rouge plugin or other code may be\n";
4906 print "executed inside SquirrelMail.\n";
4909 if ( lc($secured_config) eq 'true' ) {
4910 $default_value = "y";
4912 $default_value = "n";
4914 print "Enable secured configuration mode? (y/n) [$WHT$default_value$NRM]: $WHT";
4915 $secured_config = <STDIN
>;
4916 if ( ( $secured_config =~ /^y\n/i ) || ( ( $secured_config =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4917 $secured_config = 'true';
4919 $secured_config = 'false';
4921 return $secured_config;
4924 # Set a (non-standard) HTTPS port
4926 print "If you run HTTPS (SSL-secured HTTP) on a non-standard port, you should\n";
4927 print "indicate that port here. Even if you do not, SquirrelMail may still\n";
4928 print "auto-detect secure connections, but it is safer and also very useful\n";
4929 print "for third party plugins if you specify the port number here.\n";
4931 print "Most SquirrelMail administrators will not need to use this setting\n";
4932 print "because most all web servers use port 443 for HTTPS connections, and\n";
4933 print "SquirrelMail assumes 443 unless something else is given here.\n";
4936 print "Enter your HTTPS port [$sq_https_port]: ";
4939 # value is not modified, if user hits Enter or enters space
4941 # make sure that input is numeric
4942 if ($tmp =~ /^\d+$/) {
4943 $sq_https_port = $tmp;
4946 print "--- INPUT ERROR ---\n";
4948 print "If you want to change this setting, you must enter a number.\n";
4949 print "If you want to keep the original value, just press Enter.\n\n";
4950 print "Press Enter to continue...";
4954 return $sq_https_port;
4957 # Ignore HTTP_X_FORWARDED_* headers?
4960 if ( lc($sq_ignore_http_x_forwarded_headers) eq 'true' ) {
4961 $default_value = "y";
4963 $default_value = "n";
4966 print "Because HTTP_X_FORWARDED_* headers can be sent by the client and\n";
4967 print "therefore possibly exploited by an outsider, SquirrelMail ignores\n";
4968 print "them by default. If a proxy server or other machine sits between\n";
4969 print "clients and your SquirrelMail server, you can turn this off to\n";
4970 print "tell SquirrelMail to use such headers.\n";
4973 print "Ignore HTTP_X_FORWARDED headers? (y/n) [$WHT$default_value$NRM]: $WHT";
4974 $sq_ignore_http_x_forwarded_headers = <STDIN
>;
4975 if ( ( $sq_ignore_http_x_forwarded_headers =~ /^y\n/i ) || ( ( $sq_ignore_http_x_forwarded_headers =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4976 $sq_ignore_http_x_forwarded_headers = 'true';
4978 $sq_ignore_http_x_forwarded_headers = 'false';
4980 return $sq_ignore_http_x_forwarded_headers;
4985 if ( open( CF
, ">config.php" ) ) {
4990 print CF
" * SquirrelMail Configuration File\n";
4991 print CF
" * Created using the configure script, conf.pl\n";
4995 if ($print_config_version) {
4996 print CF
"\$config_version = '$print_config_version';\n";
4999 print CF
"\$config_use_color = $config_use_color;\n";
5003 print CF
"\$org_name = \"$org_name\";\n";
5005 print CF
"\$org_logo = " . &change_to_SM_path
($org_logo) . ";\n";
5006 $org_logo_width |= 0;
5007 $org_logo_height |= 0;
5009 print CF
"\$org_logo_width = '$org_logo_width';\n";
5011 print CF
"\$org_logo_height = '$org_logo_height';\n";
5012 # string that can contain variables.
5013 print CF
"\$org_title = \"$org_title\";\n";
5015 print CF
"\$signout_page = " . &change_to_SM_path
($signout_page) . ";\n";
5017 print CF
"\$frame_top = '$frame_top';\n";
5020 print CF
"\$provider_uri = '$provider_uri';\n";
5023 print CF
"\$provider_name = '$provider_name';\n";
5026 # string that can contain variables
5027 print CF
"\$motd = \"$motd\";\n";
5031 print CF
"\$squirrelmail_default_language = '$squirrelmail_default_language';\n";
5033 print CF
"\$default_charset = '$default_charset';\n";
5035 print CF
"\$show_alternative_names = $show_alternative_names;\n";
5037 print CF
"\$aggressive_decoding = $aggressive_decoding;\n";
5039 print CF
"\$lossy_encoding = $lossy_encoding;\n";
5043 print CF
"\$domain = '$domain';\n";
5045 print CF
"\$imapServerAddress = '$imapServerAddress';\n";
5047 print CF
"\$imapPort = $imapPort;\n";
5049 print CF
"\$useSendmail = $useSendmail;\n";
5051 print CF
"\$smtpServerAddress = '$smtpServerAddress';\n";
5053 print CF
"\$smtpPort = $smtpPort;\n";
5055 print CF
"\$sendmail_path = '$sendmail_path';\n";
5057 print CF
"\$sendmail_args = '$sendmail_args';\n";
5059 # print CF "\$use_authenticated_smtp = $use_authenticated_smtp;\n";
5061 print CF
"\$pop_before_smtp = $pop_before_smtp;\n";
5063 print CF
"\$pop_before_smtp_host = '$pop_before_smtp_host';\n";
5065 print CF
"\$imap_server_type = '$imap_server_type';\n";
5067 print CF
"\$invert_time = $invert_time;\n";
5069 print CF
"\$optional_delimiter = '$optional_delimiter';\n";
5071 print CF
"\$encode_header_key = '$encode_header_key';\n";
5075 print CF
"\$default_folder_prefix = '$default_folder_prefix';\n";
5077 print CF
"\$trash_folder = '$trash_folder';\n";
5079 print CF
"\$sent_folder = '$sent_folder';\n";
5081 print CF
"\$draft_folder = '$draft_folder';\n";
5083 print CF
"\$default_move_to_trash = $default_move_to_trash;\n";
5085 print CF
"\$default_move_to_sent = $default_move_to_sent;\n";
5087 print CF
"\$default_save_as_draft = $default_save_as_draft;\n";
5089 print CF
"\$show_prefix_option = $show_prefix_option;\n";
5091 print CF
"\$list_special_folders_first = $list_special_folders_first;\n";
5093 print CF
"\$use_special_folder_color = $use_special_folder_color;\n";
5095 print CF
"\$auto_expunge = $auto_expunge;\n";
5097 print CF
"\$default_sub_of_inbox = $default_sub_of_inbox;\n";
5099 print CF
"\$show_contain_subfolders_option = $show_contain_subfolders_option;\n";
5101 print CF
"\$default_unseen_notify = $default_unseen_notify;\n";
5103 print CF
"\$default_unseen_type = $default_unseen_type;\n";
5105 print CF
"\$auto_create_special = $auto_create_special;\n";
5107 print CF
"\$delete_folder = $delete_folder;\n";
5109 print CF
"\$noselect_fix_enable = $noselect_fix_enable;\n";
5114 print CF
"\$data_dir = " . &change_to_SM_path
($data_dir) . ";\n";
5115 # string that can contain a variable
5116 print CF
"\$attachment_dir = " . &change_to_SM_path
($attachment_dir) . ";\n";
5118 print CF
"\$dir_hash_level = $dir_hash_level;\n";
5120 print CF
"\$default_left_size = '$default_left_size';\n";
5122 print CF
"\$force_username_lowercase = $force_username_lowercase;\n";
5124 print CF
"\$default_use_priority = $default_use_priority;\n";
5126 print CF
"\$hide_sm_attributions = $hide_sm_attributions;\n";
5128 print CF
"\$default_use_mdn = $default_use_mdn;\n";
5130 print CF
"\$edit_identity = $edit_identity;\n";
5132 print CF
"\$edit_name = $edit_name;\n";
5134 print CF
"\$edit_reply_to = $edit_reply_to;\n";
5136 print CF
"\$hide_auth_header = $hide_auth_header;\n";
5138 print CF
"\$disable_thread_sort = $disable_thread_sort;\n";
5140 print CF
"\$disable_server_sort = $disable_server_sort;\n";
5142 print CF
"\$allow_charset_search = $allow_charset_search;\n";
5144 print CF
"\$allow_advanced_search = $allow_advanced_search;\n";
5147 print CF
"\$time_zone_type = $time_zone_type;\n";
5150 print CF
"\$config_location_base = '$config_location_base';\n";
5153 print CF
"\$disable_plugins = $disable_plugins;\n";
5155 print CF
"\$disable_plugins_user = '$disable_plugins_user';\n";
5158 # all plugins are strings
5159 for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
5160 print CF
"\$plugins[] = '$plugins[$ct]';\n";
5165 if ( $user_theme_default eq '' ) { $user_theme_default = '0'; }
5166 print CF
"\$user_theme_default = $user_theme_default;\n";
5168 for ( $count = 0 ; $count <= $#user_theme_name ; $count++ ) {
5169 if ($user_theme_path[$count] eq 'none') {
5172 $path = &change_to_SM_path
($user_theme_path[$count]);
5174 print CF
"\$user_themes[$count]['PATH'] = " . $path . ";\n";
5175 # escape theme name so it can contain single quotes.
5176 $esc_name = $user_theme_name[$count];
5177 $esc_name =~ s/\\/\\\\/g;
5178 $esc_name =~ s/'/\\'/g;
5179 print CF
"\$user_themes[$count]['NAME'] = '$esc_name';\n";
5183 if ( $icon_theme_def eq '' ) { $icon_theme_def = '0'; }
5184 print CF
"\$icon_theme_def = $icon_theme_def;\n";
5185 if ( $icon_theme_fallback eq '' ) { $icon_theme_fallback = '0'; }
5186 print CF
"\$icon_theme_fallback = $icon_theme_fallback;\n";
5188 for ( $count = 0 ; $count <= $#icon_theme_name ; $count++ ) {
5189 $path = $icon_theme_path[$count];
5190 if ($path eq 'none' || $path eq 'template') {
5191 $path = "'".$path."'";
5193 $path = &change_to_SM_path
($icon_theme_path[$count]);
5195 print CF
"\$icon_themes[$count]['PATH'] = " . $path . ";\n";
5196 # escape theme name so it can contain single quotes.
5197 $esc_name = $icon_theme_name[$count];
5198 $esc_name =~ s/\\/\\\\/g;
5199 $esc_name =~ s/'/\\'/g;
5200 print CF
"\$icon_themes[$count]['NAME'] = '$esc_name';\n";
5204 if ( $templateset_default eq '' ) { $templateset_default = 'default'; }
5205 print CF
"\$templateset_default = '$templateset_default';\n";
5207 if ( $templateset_fallback eq '' ) { $templateset_fallback = 'default'; }
5208 print CF
"\$templateset_fallback = '$templateset_fallback';\n";
5210 if ( $rpc_templateset eq '' ) { $rpc_templateset = 'default_rpc'; }
5211 print CF
"\$rpc_templateset = '$rpc_templateset';\n";
5213 for ( $count = 0 ; $count <= $#templateset_name ; $count++ ) {
5215 # don't include RPC template sets
5217 if ( $templateset_id[$count] =~ /_rpc$/ ) { next; }
5219 print CF
"\$aTemplateSet[$count]['ID'] = '" . $templateset_id[$count] . "';\n";
5220 # escape theme name so it can contain single quotes.
5221 $esc_name = $templateset_name[$count];
5222 $esc_name =~ s/\\/\\\\/g;
5223 $esc_name =~ s/'/\\'/g;
5224 print CF
"\$aTemplateSet[$count]['NAME'] = '$esc_name';\n";
5230 print CF
"\$default_fontsize = '$default_fontsize';\n";
5232 print CF
"\$default_fontset = '$default_fontset';\n";
5234 # assoc. array (maybe initial value should be set somewhere else)
5235 print CF
'$fontsets = array();'."\n";
5236 while (($fontset_name, $fontset_value) = each(%fontsets)) {
5237 print CF
"\$fontsets\['$fontset_name'\] = '$fontset_value';\n";
5243 print CF
"\$default_use_javascript_addr_book = $default_use_javascript_addr_book;\n";
5244 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
5245 print CF
"\$ldap_server[$count] = array(\n";
5247 print CF
" 'host' => '$ldap_host[$count]',\n";
5249 print CF
" 'base' => '$ldap_base[$count]'";
5250 if ( $ldap_name[$count] ) {
5253 print CF
" 'name' => '$ldap_name[$count]'";
5255 if ( $ldap_port[$count] ) {
5258 print CF
" 'port' => $ldap_port[$count]";
5260 if ( $ldap_charset[$count] ) {
5263 print CF
" 'charset' => '$ldap_charset[$count]'";
5265 if ( $ldap_maxrows[$count] ) {
5268 print CF
" 'maxrows' => $ldap_maxrows[$count]";
5271 if ( $ldap_filter[$count] ) {
5273 print CF
" 'filter' => '$ldap_filter[$count]'";
5275 if ( $ldap_binddn[$count] ) {
5278 print CF
" 'binddn' => '$ldap_binddn[$count]'";
5279 if ( $ldap_bindpw[$count] ) {
5282 print CF
" 'bindpw' => '$ldap_bindpw[$count]'";
5285 if ( $ldap_protocol[$count] ) {
5288 print CF
" 'protocol' => $ldap_protocol[$count]";
5290 if ( $ldap_limit_scope[$count] ) {
5293 print CF
" 'limit_scope' => $ldap_limit_scope[$count]";
5295 if ( $ldap_listing[$count] ) {
5298 print CF
" 'listing' => $ldap_listing[$count]";
5300 if ( $ldap_writeable[$count] ) {
5303 print CF
" 'writeable' => $ldap_writeable[$count]";
5305 if ( $ldap_search_tree[$count] ) {
5308 print CF
" 'search_tree' => $ldap_search_tree[$count]";
5310 if ( $ldap_starttls[$count] ) {
5313 print CF
" 'starttls' => $ldap_starttls[$count]";
5321 print CF
"\$addrbook_dsn = '$addrbook_dsn';\n";
5323 print CF
"\$addrbook_table = '$addrbook_table';\n\n";
5325 print CF
"\$prefs_dsn = '$prefs_dsn';\n";
5327 print CF
"\$prefs_table = '$prefs_table';\n";
5329 print CF
"\$prefs_user_field = '$prefs_user_field';\n";
5331 print CF
"\$prefs_user_size = $prefs_user_size;\n";
5333 print CF
"\$prefs_key_field = '$prefs_key_field';\n";
5335 print CF
"\$prefs_key_size = $prefs_key_size;\n";
5337 print CF
"\$prefs_val_field = '$prefs_val_field';\n";
5339 print CF
"\$prefs_val_size = $prefs_val_size;\n\n";
5341 print CF
"\$addrbook_global_dsn = '$addrbook_global_dsn';\n";
5343 print CF
"\$addrbook_global_table = '$addrbook_global_table';\n";
5345 print CF
"\$addrbook_global_writeable = $addrbook_global_writeable;\n";
5347 print CF
"\$addrbook_global_listing = $addrbook_global_listing;\n\n";
5349 print CF
"\$abook_global_file = '$abook_global_file';\n";
5351 print CF
"\$abook_global_file_writeable = $abook_global_file_writeable;\n\n";
5353 print CF
"\$abook_global_file_listing = $abook_global_file_listing;\n\n";
5355 print CF
"\$abook_file_line_length = $abook_file_line_length;\n\n";
5357 print CF
"\$no_list_for_subscribe = $no_list_for_subscribe;\n";
5360 print CF
"\$smtp_auth_mech = '$smtp_auth_mech';\n";
5361 print CF
"\$smtp_sitewide_user = '". quote_single
($smtp_sitewide_user) ."';\n";
5362 print CF
"\$smtp_sitewide_pass = '". quote_single
($smtp_sitewide_pass) ."';\n";
5364 print CF
"\$imap_auth_mech = '$imap_auth_mech';\n";
5366 print CF
"\$use_imap_tls = $use_imap_tls;\n";
5368 print CF
"\$use_smtp_tls = $use_smtp_tls;\n";
5370 print CF
"\$display_imap_login_error = $display_imap_login_error;\n";
5372 print CF
"\$session_name = '$session_name';\n";
5374 print CF
"\$only_secure_cookies = $only_secure_cookies;\n";
5375 print CF
"\$disable_security_tokens = $disable_security_tokens;\n";
5378 print CF
"\$check_referrer = '$check_referrer';\n";
5381 print CF
"\$use_transparent_security_image = $use_transparent_security_image;\n";
5383 print CF
"\$allow_svg_display = $allow_svg_display;\n";
5384 print CF
"\$block_svg_download = $block_svg_download;\n";
5385 print CF
"\$fix_broken_base64_encoded_messages = $fix_broken_base64_encoded_messages;\n";
5390 print CF
"\$use_iframe = $use_iframe;\n";
5392 print CF
"\$ask_user_info = $ask_user_info;\n";
5394 print CF
"\$use_icons = $use_icons;\n";
5397 print CF
"\$use_php_recode = $use_php_recode;\n";
5399 print CF
"\$use_php_iconv = $use_php_iconv;\n";
5402 print CF
"\$buffer_output = $buffer_output;\n";
5405 print CF
"\$allow_remote_configtest = $allow_remote_configtest;\n";
5406 print CF
"\$secured_config = $secured_config;\n";
5408 print CF
"\$sq_https_port = $sq_https_port;\n";
5410 print CF
"\$sq_ignore_http_x_forwarded_headers = $sq_ignore_http_x_forwarded_headers;\n";
5411 # (binary) integer or constant - convert integer
5412 # values to constants before output
5413 $sm_debug_mode = convert_debug_binary_integer_to_constants
($sm_debug_mode);
5414 print CF
"\$sm_debug_mode = $sm_debug_mode;\n";
5419 print "Data saved in config.php\n";
5421 build_plugin_hook_array
();
5424 print "Error saving config.php: $!\n";
5430 print $WHT. "SquirrelMail Configuration : " . $NRM;
5431 if ( $config == 1 ) { print "Read: config.php"; }
5432 elsif ( $config == 2 ) { print "Read: config_default.php"; }
5434 print "---------------------------------------------------------\n";
5436 print "While we have been building SquirrelMail, we have discovered some\n";
5437 print "preferences that work better with some servers that don't work so\n";
5438 print "well with others. If you select your IMAP server, this option will\n";
5439 print "set some pre-defined settings for that server.\n";
5441 print "Please note that you will still need to go through and make sure\n";
5442 print "everything is correct. This does not change everything. There are\n";
5443 print "only a few settings that this will change.\n";
5447 while ( $continue != 1 ) {
5448 print "Please select your IMAP server:\n";
5449 print $list_supported_imap_servers;
5451 print " quit = Do not change anything\n";
5453 print "Command >> ";
5455 $server =~ s/[\r\n]//g;
5457 # variable is used to display additional messages.
5461 if ( $server eq "cyrus" ) {
5462 $imap_server_type = "cyrus";
5463 $default_folder_prefix = "";
5464 $trash_folder = "INBOX.Trash";
5465 $sent_folder = "INBOX.Sent";
5466 $draft_folder = "INBOX.Drafts";
5467 $show_prefix_option = false
;
5468 $default_sub_of_inbox = true
;
5469 $show_contain_subfolders_option = false
;
5470 $optional_delimiter = ".";
5471 $disp_default_folder_prefix = "<none>";
5472 $force_username_lowercase = false
;
5474 # Delimiter might differ if unixhierarchysep is set to yes.
5475 $message = "\nIf you have enabled unixhierarchysep, you must change delimiter and special folder names.\n";
5478 } elsif ( $server eq "uw" ) {
5479 $imap_server_type = "uw";
5480 $default_folder_prefix = "mail/";
5481 $trash_folder = "Trash";
5482 $sent_folder = "Sent";
5483 $draft_folder = "Drafts";
5484 $show_prefix_option = true
;
5485 $default_sub_of_inbox = false
;
5486 $show_contain_subfolders_option = true
;
5487 $optional_delimiter = "/";
5488 $disp_default_folder_prefix = $default_folder_prefix;
5489 $delete_folder = true
;
5490 $force_username_lowercase = true
;
5493 } elsif ( $server eq "exchange" ) {
5494 $imap_server_type = "exchange";
5495 $default_folder_prefix = "";
5496 $default_sub_of_inbox = true
;
5497 $trash_folder = "INBOX/Deleted Items";
5498 $sent_folder = "INBOX/Sent Items";
5499 $drafts_folder = "INBOX/Drafts";
5500 $show_prefix_option = false
;
5501 $show_contain_subfolders_option = false
;
5502 $optional_delimiter = "detect";
5503 $disp_default_folder_prefix = "<none>";
5504 $force_username_lowercase = true
;
5507 } elsif ( $server eq "courier" ) {
5508 $imap_server_type = "courier";
5509 $default_folder_prefix = "INBOX.";
5510 $trash_folder = "Trash";
5511 $sent_folder = "Sent";
5512 $draft_folder = "Drafts";
5513 $show_prefix_option = false
;
5514 $default_sub_of_inbox = false
;
5515 $show_contain_subfolders_option = false
;
5516 $optional_delimiter = ".";
5517 $disp_default_folder_prefix = $default_folder_prefix;
5518 $delete_folder = true
;
5519 $force_username_lowercase = false
;
5522 } elsif ( $server eq "macosx" ) {
5523 $imap_server_type = "macosx";
5524 $default_folder_prefix = "INBOX/";
5525 $trash_folder = "Trash";
5526 $sent_folder = "Sent";
5527 $draft_folder = "Drafts";
5528 $show_prefix_option = false
;
5529 $default_sub_of_inbox = true
;
5530 $show_contain_subfolders_option = false
;
5531 $optional_delimiter = "detect";
5532 $allow_charset_search = false
;
5533 $disp_default_folder_prefix = $default_folder_prefix;
5536 } elsif ( $server eq "hmailserver" ) {
5537 $imap_server_type = "hmailserver";
5538 $default_folder_prefix = "";
5539 $trash_folder = "INBOX.Trash";
5540 $sent_folder = "INBOX.Sent";
5541 $draft_folder = "INBOX.Drafts";
5542 $show_prefix_option = false
;
5543 $default_sub_of_inbox = true
;
5544 $show_contain_subfolders_option = false
;
5545 $optional_delimiter = "detect";
5546 $allow_charset_search = false
;
5547 $disp_default_folder_prefix = $default_folder_prefix;
5548 $delete_folder = false
;
5549 $force_username_lowercase = false
;
5552 } elsif ( $server eq "mercury32" ) {
5553 $imap_server_type = "mercury32";
5554 $default_folder_prefix = "";
5555 $trash_folder = "Trash";
5556 $sent_folder = "Sent";
5557 $draft_folder = "Drafts";
5558 $show_prefix_option = false
;
5559 $default_sub_of_inbox = true
;
5560 $show_contain_subfolders_option = true
;
5561 $optional_delimiter = "detect";
5562 $delete_folder = true
;
5563 $force_username_lowercase = true
;
5566 } elsif ( $server eq "dovecot" ) {
5567 $imap_server_type = "dovecot";
5568 $default_folder_prefix = "";
5569 $trash_folder = "Trash";
5570 $sent_folder = "Sent";
5571 $draft_folder = "Drafts";
5572 $show_prefix_option = false
;
5573 $default_sub_of_inbox = false
;
5574 $show_contain_subfolders_option = false
;
5575 $delete_folder = false
;
5576 $force_username_lowercase = true
;
5577 $optional_delimiter = "detect";
5578 $disp_default_folder_prefix = "<none>";
5581 } elsif ( $server eq "bincimap" ) {
5582 $imap_server_type = "bincimap";
5583 $default_folder_prefix = "INBOX/";
5584 $trash_folder = "Trash";
5585 $sent_folder = "Sent";
5586 $draft_folder = "Drafts";
5587 $show_prefix_option = false
;
5588 $default_sub_of_inbox = false
;
5589 $show_contain_subfolders_option = false
;
5590 $delete_folder = true
;
5591 $force_username_lowercase = false
;
5592 $optional_delimiter = "detect";
5593 $disp_default_folder_prefix = $default_folder_prefix;
5595 # Default folder prefix depends on used depot.
5596 $message = "\nIf you use IMAPdir depot, you must set default folder prefix to empty string.\n";
5599 } elsif ( $server eq "gmail" ) {
5600 $imap_server_type = "gmail";
5601 $default_folder_prefix = "";
5602 $trash_folder = "[Gmail]/Trash";
5603 $default_move_to_trash = true
;
5604 $sent_folder = "[Gmail]/Sent Mail";
5605 $draft_folder = "[Gmail]/Drafts";
5606 $auto_create_special = false
;
5607 $show_prefix_option = false
;
5608 $default_sub_of_inbox = false
;
5609 $show_contain_subfolders_option = false
;
5610 $delete_folder = true
;
5611 $force_username_lowercase = false
;
5612 $optional_delimiter = "/";
5613 $disp_default_folder_prefix = "<none>";
5614 $domain = "gmail.com";
5615 $imapServerAddress = "imap.gmail.com";
5618 $imap_auth_mech = "login";
5619 $smtpServerAddress = "smtp.gmail.com";
5621 $pop_before_smtp = false
;
5622 $useSendmail = false
;
5624 $smtp_auth_mech = "login";
5627 # Gmail changes system folder names (Drafts, Sent, Trash) out
5628 # from under you when the user changes language settings
5629 $message = "\nNOTE! When a user changes languages in Gmail's interface, the\n"
5630 . "Drafts, Sent and Trash folder names are changed to localized\n"
5631 . "versions thereof. To see those folders correctly in SquirrelMail,\n"
5632 . "the user should change the SquirrelMail language to match.\n"
5633 . "Moreover, SquirrelMail then needs to be told what folders to use\n"
5634 . "for Drafts, Sent and Trash in Options --> Folder Preferences.\n"
5635 . "These default settings will only correctly find the Sent, Trash\n"
5636 . "and Drafts folders if both Gmail and SquirrelMail languages are\n"
5637 . "set to English.\n\n"
5638 . "Also note that in some regions (Europe?), the default folder\n"
5639 . "names (see main menu selection 3. Folder Defaults) are different\n"
5640 . "(they may need to have the prefix \"[Google Mail]\" instead of\n"
5641 . "\"[Gmail]\") and \"Trash\" may be called \"Bin\" instead.\n";
5643 } elsif ( $server eq "quit" ) {
5646 $disp_default_folder_prefix = $default_folder_prefix;
5647 print "Unrecognized server: $server\n";
5651 print " imap_server_type = $imap_server_type\n";
5652 print " default_folder_prefix = $disp_default_folder_prefix\n";
5653 print " trash_folder = $trash_folder\n";
5654 print " sent_folder = $sent_folder\n";
5655 print " draft_folder = $draft_folder\n";
5656 print " show_prefix_option = $show_prefix_option\n";
5657 print " default_sub_of_inbox = $default_sub_of_inbox\n";
5658 print "show_contain_subfolders_option = $show_contain_subfolders_option\n";
5659 print " optional_delimiter = $optional_delimiter\n";
5660 print " delete_folder = $delete_folder\n";
5661 print " force_username_lowercase = $force_username_lowercase\n";
5665 print "\nPress enter to continue...";
5669 # This subroutine corrects relative paths to ensure they
5670 # will work within the SM space. If the path falls within
5671 # the SM directory tree, the SM_PATH variable will be
5672 # prepended to the path, if not, then the path will be
5673 # converted to an absolute path, e.g.
5674 # '../images/logo.gif' --> SM_PATH . 'images/logo.gif'
5675 # '../../someplace/data' --> '/absolute/path/someplace/data'
5676 # 'images/logo.gif' --> SM_PATH . 'config/images/logo.gif'
5677 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
5678 # 'C:\absolute\path\logo.gif' --> 'C:\absolute\path\logo.gif'
5679 # 'http://whatever/' --> 'http://whatever'
5680 # $some_var/path --> "$some_var/path"
5681 sub change_to_SM_path
() {
5682 my ($old_path) = @_;
5688 # If the path is absolute, don't bother.
5689 return "\'" . $old_path . "\'" if ( $old_path eq '');
5690 return "\'" . $old_path . "\'" if ( $old_path =~ /^(\/|http
)/ );
5691 return "\'" . $old_path . "\'" if ( $old_path =~ /^\w:(\\|\/)/ );
5692 return $old_path if ( $old_path =~ /^\'(\/|http
)/ );
5693 return $old_path if ( $old_path =~ /^\'\w:\// );
5694 return $old_path if ( $old_path =~ /^SM_PATH/);
5696 if ( $old_path =~ /^\$/ ) {
5697 # check if it's a single var, or a $var/path combination
5698 # if it's $var/path, enclose in ""
5699 if ( $old_path =~ /\// ) {
5700 return '"'.$old_path.'"';
5705 # Remove remaining '
5706 $old_path =~ s/\'//g;
5708 # For relative paths, split on '../'
5709 @rel_path = split(/\.\.\//, $old_path);
5711 if ( $#rel_path > 1 ) {
5712 # more than two levels away. Make it absolute.
5713 @abs_path = split(/\//, $dir);
5715 # Lop off the relative pieces of the absolute path..
5716 for ( $i = 0; $i <= $#rel_path; $i++ ) {
5720 push @abs_path, @rel_path;
5721 $new_path = "\'" . join('/', @abs_path) . "\'";
5722 } elsif ( $#rel_path > 0 ) {
5723 # it's within the SM tree, prepend SM_PATH
5724 $new_path = $old_path;
5725 $new_path =~ s/^\.\.\//SM_PATH
. \'/;
5728 # Last, it's a relative path without any leading '.'
5729 # Prepend SM_PATH and config, since the paths are
5730 # relative to the config directory
5731 $new_path = "SM_PATH . \'config/" . $old_path . "\'";
5737 # Change SM_PATH to admin-friendly version, e.g.:
5738 # SM_PATH . 'images/logo.gif' --> '../images/logo.gif'
5739 # SM_PATH . 'config/some.php' --> 'some.php'
5740 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
5741 # 'http://whatever/' --> 'http://whatever'
5742 sub change_to_rel_path
() {
5743 my ($old_path) = @_;
5744 my $new_path = $old_path;
5746 if ( $old_path =~ /^SM_PATH/ ) {
5747 # FIXME: the following replacement loses the opening quote mark!
5748 $new_path =~ s/^SM_PATH . \'/\.\.\//;
5749 $new_path =~ s/\.\.\/config\///;
5755 # Attempts to auto-detect if a specific auth mechanism is supported.
5756 # Called by 'command112a' and 'command112b'
5757 # ARGS: service-name (IMAP or SMTP), host:port, mech-name (ie. CRAM-MD5)
5758 sub detect_auth_support
{
5759 # Try loading IO::Socket
5760 unless (eval("use IO::Socket; 1")) {
5761 print "Perl IO::Socket module is not available.";
5765 my $service = shift;
5769 if ((!defined($service)) or (!defined($host)) or (!defined($mech))) {
5770 # Error - wrong # of args
5771 print "BAD ARGS!\n";
5775 if ($service eq 'SMTP') {
5776 $cmd = "AUTH $mech\r\n";
5777 $logout = "QUIT\r\n";
5778 } elsif ($service eq 'IMAP') {
5779 $cmd = "A01 AUTHENTICATE $mech\n";
5780 $logout = "C01 LOGOUT\n";
5782 # unknown service - whoops.
5786 # Get this show on the road
5787 my $sock=IO
::Socket
::INET
->new($host);
5788 if (!defined($sock)) {
5792 my $discard = <$sock>; # Server greeting/banner - who cares..
5794 if ($service eq 'SMTP') {
5796 print $sock "HELO $domain\r\n";
5797 $discard = <$sock>; # Yeah yeah, you're happy to see me..
5801 my $response = <$sock>;
5803 if (!defined($response)) {
5807 # So at this point, we have a response, and it is (hopefully) valid.
5808 if ($service eq 'SMTP') {
5809 if (!($response =~ /^334/)) {
5811 print $sock $logout;
5815 } elsif ($service eq 'IMAP') {
5816 if ($response =~ /^A01/) {
5818 print $sock $logout;
5823 # Unknown service - this shouldn't be able to happen.
5828 # If it gets here, the mech is supported
5829 print $sock "*\n"; # Attempt to cancel authentication
5830 print $sock $logout; # Try to log out, but we don't really care if this fails
5836 # Example code from O'Reilly Perl Cookbook
5843 return wantarray ?
@out : $out[0];
5846 sub clear_screen
() {
5847 if ( $^O
=~ /^mswin/i) {
5854 # checks IMAP mailbox name. Refuses to accept 8bit folders
5855 # returns 0 (folder name is not correct) or 1 (folder name is correct)
5856 sub check_imap_folder
($) {
5857 my $folder_name = shift(@_);
5859 if ($folder_name =~ /[\x80-\xFFFF]/) {
5860 print "Folder name contains 8bit characters. Configuration utility requires\n";
5861 print "UTF7-IMAP encoded folder names.\n";
5862 print "Press enter to continue...";
5865 } elsif ($folder_name =~ /[&\*\%]/) {
5866 # check for ampersand and list-wildcards
5867 print "Folder name contains special UTF7-IMAP characters.\n";
5868 print "Are you sure that folder name is correct? (y/N): ";
5870 $tmp = lc(trim
($tmp));
5871 if ($tmp =~ /^y$/) {
5881 # quotes string written in single quotes
5882 sub quote_single
($) {
5883 my $string = shift(@_);
5884 $string =~ s/\'/\\'/g;
5888 # determine a plugin's version number
5890 # parses the setup.php file, looking for the
5891 # version string in the <plugin>_info() or the
5892 # <plugin>_version functions.
5894 sub get_plugin_version
() {
5896 my $plugin_name = shift(@_);
5898 $setup_file = '../plugins/' . $plugin_name . '/setup.php';
5899 if ( -e
"$setup_file" ) {
5900 # Make sure that file is readable
5901 if (! -r
"$setup_file") {
5904 print "The file \"$setup_file\" was found, but you don't\n";
5905 print "have rights to read it. The plugin \"";
5906 print $plugin_name . "\" may not work correctly until you fix this.\n";
5907 print "\nPress enter to continue";
5914 # FIXME: grep the file instead of reading it into memory?
5916 open( FILE
, "$setup_file" );
5917 while ( $line = <FILE
> ) {
5918 $whole_file .= $line;
5922 # ideally, there is a version in the <plugin>_info function...
5924 if ($whole_file =~ /('version'\s*=>\s*['"](.*?)['"])/) {
5927 # this assumes there is only one function that returns
5928 # a static string in the setup file
5930 } elsif ($whole_file =~ /(return\s*['"](.*?)['"])/) {
5939 print "The file \"$setup_file\" was not found.\n";
5940 print "The plugin \"" . $plugin_name;
5941 print "\" may not work correctly until you fix this.\n";
5942 print "\nPress enter to continue";
5950 # determine a plugin's English name
5952 # parses the setup.php file, looking for the
5953 # English name in the <plugin>_info() function.
5955 sub get_plugin_english_name
() {
5957 my $plugin_name = shift(@_);
5959 $setup_file = '../plugins/' . $plugin_name . '/setup.php';
5960 if ( -e
"$setup_file" ) {
5961 # Make sure that file is readable
5962 if (! -r
"$setup_file") {
5965 print "The file \"$setup_file\" was found, but you don't\n";
5966 print "have rights to read it. The plugin \"";
5967 print $plugin_name . "\" may not work correctly until you fix this.\n";
5968 print "\nPress enter to continue";
5975 # FIXME: grep the file instead of reading it into memory?
5977 open( FILE
, "$setup_file" );
5978 while ( $line = <FILE
> ) {
5979 $whole_file .= $line;
5983 # the English name is in the <plugin>_info function or nothing...
5985 if ($whole_file =~ /('english_name'\s*=>\s*['"](.*?)['"])/) {
5986 $english_name .= $2;
5989 return $english_name;
5994 print "The file \"$setup_file\" was not found.\n";
5995 print "The plugin \"" . $plugin_name;
5996 print "\" may not work correctly until you fix this.\n";
5997 print "\nPress enter to continue";
6005 # parses the setup.php files for all activated plugins and
6006 # builds static plugin hooks array so we don't have to load
6007 # ALL plugins are runtime and build the hook array on every
6010 # hook array is saved in config/plugin_hooks.php
6012 # Note the $verbose variable at the top of this routine
6013 # can be set to zero to quiet it down.
6015 # NOTE/FIXME: we aren't necessarily interested in writing
6016 # a full-blown PHP parsing engine, so plenty
6017 # of assumptions are included herein about the
6018 # coding of the plugin setup files, and things
6019 # like commented out curly braces or other
6020 # such oddities can break this in a bad way.
6022 sub build_plugin_hook_array
() {
6030 if ( open( HOOKFILE
, ">plugin_hooks.php" ) ) {
6031 print HOOKFILE
"<?php\n";
6032 print HOOKFILE
"\n";
6034 print HOOKFILE
"/**\n";
6035 print HOOKFILE
" * SquirrelMail Plugin Hook Registration File\n";
6036 print HOOKFILE
" * Auto-generated using the configure script, conf.pl\n";
6037 print HOOKFILE
" */\n";
6038 print HOOKFILE
"\n";
6039 print HOOKFILE
"global \$squirrelmail_plugin_hooks;\n";
6040 print HOOKFILE
"\n";
6042 PLUGIN
: for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
6045 print "Activating plugin \"" . $plugins[$ct] . "\"...\n";
6048 $setup_file = '../plugins/' . $plugins[$ct] . '/setup.php';
6049 if ( -e
"$setup_file" ) {
6050 # Make sure that file is readable
6051 if (! -r
"$setup_file") {
6054 print "The file \"$setup_file\" was found, but you don't\n";
6055 print "have rights to read it. The plugin \"";
6056 print $plugins[$ct] . "\" will not be activated until you fix this.\n";
6057 print "\nPress enter to continue";
6062 open( FILE
, "$setup_file" );
6063 $inside_init_fxn = 0;
6065 while ( $line = <FILE
> ) {
6067 # throw away lines until we get to target function
6069 if (!$inside_init_fxn
6070 && $line !~ /^\s*function\s*squirrelmail_plugin_init_/i) {
6073 $inside_init_fxn = 1;
6083 # count close braces
6088 # leaving <plugin>_init() function...
6089 if ($brace_count == 0) {
6097 # throw away lines that are not exactly one "brace set" deep
6099 if ($brace_count > 1) {
6104 # also not interested in lines that are not
6105 # hook registration points
6107 if ($line !~ /^\s*\$squirrelmail_plugin_hooks/i) {
6112 # if $line does not have an ending semicolon,
6113 # we need to recursively read in subsequent
6114 # lines until we find one
6115 while ( $line !~ /;\s*$/ ) {
6116 $line =~ s/[\n\r]\s*$//;
6125 $var =~ s/=/EQUALS/;
6126 if ( $var =~ /^([a-z])/i ) {
6127 @options = split ( /\s*EQUALS\s*/, $var );
6128 $options[1] =~ s/[\n\r]//g;
6129 $options[1] =~ s/[\'\"];\s*$//;
6130 $options[1] =~ s/;$//;
6131 $options[1] =~ s/^[\'\"]//;
6132 # de-escape escaped strings
6133 $options[1] =~ s/\\'/'/g;
6134 $options[1] =~ s/\\\\/\\/g;
6136 if ( $options[0] =~ /^squirrelmail_plugin_hooks\s*\[\s*['"]([a-z0-9 \/._
*-]+)['"]\s*\]\s*\[\s*['"]([0-9a-z._-]+)['"]\s
*\
]/i
) {
6138 $hooked_plugin_name = $2;
6139 # Note: if we wanted to stop plugins from registering
6140 # a *different* plugin on a hook, we could catch
6141 # it here, however this has actually proven to be
6142 # a useful *feature*
6143 #if ($hooked_plugin_name ne $plugins[$ct]) {
6144 # print "...plugin is tring to hook in under different name...\n";
6147 #FIXME: do we want to count the number of hook registrations for each plugin and warn if a plugin doesn't have any?
6148 # hook registration has been found!
6150 if ($hooked_plugin_name ne $plugins[$ct]) {
6151 print " registering on hook \"" . $hook_name . "\" (as \"$hooked_plugin_name\" plugin)\n";
6153 print " registering on hook \"" . $hook_name . "\"\n";
6156 $line =~ s/ {2,}/ /g;
6158 print HOOKFILE
"\$$line";
6170 print "The file \"$setup_file\" was not found.\n";
6171 print "The plugin \"" . $plugins[$ct];
6172 print "\" will not be activated until you fix this.\n";
6173 print "\nPress enter to continue";
6181 print HOOKFILE
"\n\n";
6184 print "\nDone activating plugins; registration data saved in plugin_hooks.php\n\n";
6191 print "The file \"plugin_hooks.php\" was not able to be written to.\n";
6192 print "No plugins will be activated until you fix this.\n";
6193 print "\nPress enter to continue";
6201 # converts (binary) integer values that correspond
6202 # to the SquirrelMail debug mode constants (see
6203 # include/constants.php) into those constant strings
6204 # (bitwise or'd if more than one is enabled)
6206 # if the value passed in is not an integer, it is
6207 # returned unmolested
6209 sub convert_debug_binary_integer_to_constants
() {
6211 my ($debug_mode) = @_;
6212 if ($debug_mode =~ /^[^0-9]/) {
6215 $debug_mode = int($debug_mode);
6216 $new_debug_mode = '';
6218 # per include/constants.php, here are their values:
6220 # 0 SM_DEBUG_MODE_OFF
6221 # 1 SM_DEBUG_MODE_SIMPLE
6222 # 512 SM_DEBUG_MODE_MODERATE
6223 # 524288 SM_DEBUG_MODE_ADVANCED
6224 # 536870912 SM_DEBUG_MODE_STRICT
6226 if ($debug_mode & 1) {
6227 $new_debug_mode .= ' | SM_DEBUG_MODE_SIMPLE';
6229 if ($debug_mode & 512) {
6230 $new_debug_mode .= ' | SM_DEBUG_MODE_MODERATE';
6232 if ($debug_mode & 524288) {
6233 $new_debug_mode .= ' | SM_DEBUG_MODE_ADVANCED';
6235 if ($debug_mode & 536870912) {
6236 $new_debug_mode .= ' | SM_DEBUG_MODE_STRICT';
6239 $new_debug_mode =~ s/^ \| //;
6240 if (!$new_debug_mode) {
6241 $new_debug_mode = 'SM_DEBUG_MODE_OFF';
6244 return $new_debug_mode;
6247 # converts SquirrelMail debug mode constants (see
6248 # include/constants.php) into their corresponding
6249 # (binary) integer values
6251 # if the value passed in is an integer already, it
6252 # is returned unmolested
6254 sub convert_debug_constants_to_binary_integer
() {
6256 my ($debug_mode) = @_;
6257 if ($debug_mode =~ /^[0-9]/) {
6260 $new_debug_mode = 0;
6262 # per include/constants.php, here are their values:
6264 # 0 SM_DEBUG_MODE_OFF
6265 # 1 SM_DEBUG_MODE_SIMPLE
6266 # 512 SM_DEBUG_MODE_MODERATE
6267 # 524288 SM_DEBUG_MODE_ADVANCED
6268 # 536870912 SM_DEBUG_MODE_STRICT
6270 if ($debug_mode =~ /\bSM_DEBUG_MODE_OFF\b/) {
6271 $new_debug_mode = 0;
6273 if ($debug_mode =~ /\bSM_DEBUG_MODE_SIMPLE\b/) {
6274 $new_debug_mode |= 1;
6276 if ($debug_mode =~ /\bSM_DEBUG_MODE_MODERATE\b/) {
6277 $new_debug_mode |= 512;
6279 if ($debug_mode =~ /\bSM_DEBUG_MODE_ADVANCED\b/) {
6280 $new_debug_mode |= 524288;
6282 if ($debug_mode =~ /\bSM_DEBUG_MODE_STRICT\b/) {
6283 $new_debug_mode |= 536870912;
6286 return $new_debug_mode;
6289 # Function to print n column numbered lists
6291 # WARNING: the names in the list will be truncated
6292 # to fit in their respective columns based on the
6293 # screen width and number of columns.
6295 # Expected arguments (in this order):
6297 # * The start number to use for the list
6298 # * The number of columns to use
6299 # * The screen width
6300 # * Boolean (zero/one), indicating
6301 # whether or not to show item numbers
6302 # * The list of strings to be shown
6304 # Returns: The number printed on screen of the last item in the list
6306 sub print_multi_col_list
{
6307 my ($num, $cols, $screen_width, $show_numbering, @list) = @_;
6317 $rows = int(@list / $cols);
6318 if (@list % $cols) { $rows++; }
6319 if ($show_numbering) { $col_width = int(($screen_width - 2) / $cols) - 5; }
6320 else { $col_width = int(($screen_width - 2) / $cols) - 2; }
6322 # build the layout array so numbers run down each column
6324 for ( $x = 0; $x < @list; $x++ ) {
6326 $layout[$row_cnt][$col_cnt] = $list[$x];
6327 $numbers[$row_cnt][$col_cnt] = $num++;
6329 # move to next column
6331 if ($row_cnt == $rows - 1) {
6335 else { $row_cnt++; }
6339 # if we filled up fewer rows than needed, recalc column width
6341 if ($rows * $col_cnt == @list) { $col_cnt--; } # loop above ended right after increment
6342 if ($col_cnt + 1 < $cols) {
6343 if ($show_numbering) { $col_width = int(($screen_width - 2) / ($col_cnt + 1)) - 5; }
6344 else { $col_width = int(($screen_width - 2) / ($col_cnt + 1)) - 2; }
6350 for ( $row_cnt = 0; $row_cnt <= $rows; $row_cnt++ ) {
6356 # iterate columns for this row
6358 for ( $col_cnt = 0; $col_cnt <= $cols; $col_cnt++ ) {
6359 if ($layout[$row_cnt][$col_cnt]) {
6361 if ($show_numbering) { printf "$WHT% 2u.$NRM", $numbers[$row_cnt][$col_cnt]; }
6362 printf " %-$col_width." . $col_width . "s", $layout[$row_cnt][$col_cnt];