4 # Copyright (c) 1999-2005 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.4.0";
13 ############################################################
14 # Check what directory we're supposed to be running in, and
15 # change there if necessary. File::Basename has been in
16 # Perl since at least 5.003_7, and nobody sane runs anything
17 # before that, but just in case.
18 ############################################################
20 if ( eval q{require "File/Basename.pm"} ) {
21 $dir = File
::Basename
::dirname
($0);
25 ############################################################
26 # Some people try to run this as a CGI. That's wrong!
27 ############################################################
28 if ( defined( $ENV{'PATH_INFO'} )
29 || defined( $ENV{'QUERY_STRING'} )
30 || defined( $ENV{'REQUEST_METHOD'} ) ) {
31 print "Content-Type: text/html\n\n";
32 print "You must run this script from the command line.";
36 ############################################################
37 # If we got here, use Cwd to get the full directory path
38 # (the Basename stuff above will sometimes return '.' as
39 # the base directory, which is not helpful here).
40 ############################################################
45 ############################################################
46 # First, lets read in the data already in there...
47 ############################################################
48 if ( -e
"config.php" ) {
49 open( FILE
, "config.php" );
50 while ( $line = <FILE
> ) {
56 if ( $var =~ /^([a-z])/i ) {
57 @o = split ( /\s*EQUALS\s*/, $var );
58 if ( $o[0] eq "config_version" ) {
60 $o[1] =~ s/[\'\"];\s*$//;
64 $config_version = $o[1];
71 if ( $config_version ne $conf_pl_version ) {
73 print $WHT. "WARNING:\n" . $NRM;
74 print " The file \"config/config.php\" was found, but it is for\n";
75 print " an older version of SquirrelMail. It is possible to still\n";
76 print " read the defaults from this file but be warned that many\n";
77 print " preferences change between versions. It is recommended that\n";
78 print " you start with a clean config.php for each upgrade that you\n";
79 print " do. To do this, just move config/config.php out of the way.\n";
81 print "Continue loading with the old config.php [y/N]? ";
84 if ( ( $ctu !~ /^y\n/i ) || ( $ctu =~ /^\n/ ) ) {
88 print "\nDo you want me to stop warning you [y/N]? ";
90 if ( $ctu =~ /^y\n/i ) {
91 $print_config_version = $conf_pl_version;
93 $print_config_version = $config_version;
96 $print_config_version = $config_version;
100 open( FILE
, "config.php" );
101 } elsif ( -e
"config_default.php" ) {
102 open( FILE
, "config_default.php" );
103 while ( $line = <FILE
> ) {
109 if ( $var =~ /^([a-z])/i ) {
110 @o = split ( /\s*EQUALS\s*/, $var );
111 if ( $o[0] eq "config_version" ) {
112 $o[1] =~ s/[\n\r]//g;
113 $o[1] =~ s/[\'\"];\s*$//;
115 $o[1] =~ s/^[\'\"]//;
117 $config_version = $o[1];
124 if ( $config_version ne $conf_pl_version ) {
126 print $WHT. "WARNING:\n" . $NRM;
127 print " You are trying to use a 'config_default.php' from an older\n";
128 print " version of SquirrelMail. This is HIGHLY unrecommended. You\n";
129 print " should get the 'config_default.php' that matches the version\n";
130 print " of SquirrelMail that you are running. You can get this from\n";
131 print " the SquirrelMail web page by going to the following URL:\n";
132 print " http://www.squirrelmail.org.\n";
134 print "Continue loading with old config_default.php (a bad idea) [y/N]? ";
137 if ( ( $ctu !~ /^y\n/i ) || ( $ctu =~ /^\n/ ) ) {
141 print "\nDo you want me to stop warning you [y/N]? ";
143 if ( $ctu =~ /^y\n/i ) {
144 $print_config_version = $conf_pl_version;
146 $print_config_version = $config_version;
149 $print_config_version = $config_version;
152 open( FILE
, "config_default.php" );
154 print "No configuration file found. Please get config_default.php\n";
155 print "or config.php before running this again. This program needs\n";
156 print "a default config file to get default values.\n";
160 # Read and parse the current configuration file
161 # (either config.php or config_default.php).
162 while ( $line = <FILE
> ) {
168 if ( $var =~ /^([a-z])/i ) {
169 @options = split ( /\s*EQUALS\s*/, $var );
170 $options[1] =~ s/[\n\r]//g;
171 $options[1] =~ s/[\'\"];\s*$//;
172 $options[1] =~ s/;$//;
173 $options[1] =~ s/^[\'\"]//;
174 # de-escape escaped strings
175 $options[1] =~ s/\\'/'/g;
176 $options[1] =~ s/\\\\/\\/g;
178 if ( $options[0] =~ /^theme\[[0-9]+\]\[['"]PATH['"]\]/ ) {
180 $sub =~ s/\]\[['"]PATH['"]\]//;
182 if ( -e
"../themes" ) {
183 $options[1] =~ s/^\.\.\/config/\
.\
.\
/themes/;
185 $theme_path[$sub] = &change_to_rel_path
($options[1]);
186 } elsif ( $options[0] =~ /^theme\[[0-9]+\]\[['"]NAME['"]\]/ ) {
188 $sub =~ s/\]\[['"]NAME['"]\]//;
190 $theme_name[$sub] = $options[1];
191 } elsif ( $options[0] =~ /^plugins\[[0-9]*\]/ ) {
194 $sub =~ s/^plugins\[//;
196 push @plugins, $options[1];
198 $plugins[$sub] = $options[1];
200 } elsif ( $options[0] =~ /^ldap_server\[[0-9]+\]/ ) {
203 $sub =~ s/^ldap_server\[//;
205 while ( ( $tmp = <FILE
> ) && ( $continue != 1 ) ) {
206 if ( $tmp =~ /\);\s*$/ ) {
210 if ( $tmp =~ /^\s*[\'\"]host[\'\"]/i ) {
211 $tmp =~ s/^\s*[\'\"]host[\'\"]\s*=>\s*[\'\"]//i;
212 $tmp =~ s/[\'\"],?\s*$//;
213 $tmp =~ s/[\'\"]\);\s*$//;
215 } elsif ( $tmp =~ /^\s*[\'\"]base[\'\"]/i ) {
216 $tmp =~ s/^\s*[\'\"]base[\'\"]\s*=>\s*[\'\"]//i;
217 $tmp =~ s/[\'\"],?\s*$//;
218 $tmp =~ s/[\'\"]\);\s*$//;
220 } elsif ( $tmp =~ /^\s*[\'\"]charset[\'\"]/i ) {
221 $tmp =~ s/^\s*[\'\"]charset[\'\"]\s*=>\s*[\'\"]//i;
222 $tmp =~ s/[\'\"],?\s*$//;
223 $tmp =~ s/[\'\"]\);\s*$//;
225 } elsif ( $tmp =~ /^\s*[\'\"]port[\'\"]/i ) {
226 $tmp =~ s/^\s*[\'\"]port[\'\"]\s*=>\s*[\'\"]?//i;
227 $tmp =~ s/[\'\"]?,?\s*$//;
228 $tmp =~ s/[\'\"]?\);\s*$//;
230 } elsif ( $tmp =~ /^\s*[\'\"]maxrows[\'\"]/i ) {
231 $tmp =~ s/^\s*[\'\"]maxrows[\'\"]\s*=>\s*[\'\"]?//i;
232 $tmp =~ s/[\'\"]?,?\s*$//;
233 $tmp =~ s/[\'\"]?\);\s*$//;
235 } elsif ( $tmp =~ /^\s*[\'\"]filter[\'\"]/i ) {
236 $tmp =~ s/^\s*[\'\"]filter[\'\"]\s*=>\s*[\'\"]?//i;
237 $tmp =~ s/[\'\"]?,?\s*$//;
238 $tmp =~ s/[\'\"]?\);\s*$//;
240 } elsif ( $tmp =~ /^\s*[\'\"]name[\'\"]/i ) {
241 $tmp =~ s/^\s*[\'\"]name[\'\"]\s*=>\s*[\'\"]//i;
242 $tmp =~ s/[\'\"],?\s*$//;
243 $tmp =~ s/[\'\"]\);\s*$//;
245 } elsif ( $tmp =~ /^\s*[\'\"]binddn[\'\"]/i ) {
246 $tmp =~ s/^\s*[\'\"]binddn[\'\"]\s*=>\s*[\'\"]//i;
247 $tmp =~ s/[\'\"],?\s*$//;
248 $tmp =~ s/[\'\"]\);\s*$//;
250 } elsif ( $tmp =~ /^\s*[\'\"]bindpw[\'\"]/i ) {
251 $tmp =~ s/^\s*[\'\"]bindpw[\'\"]\s*=>\s*[\'\"]//i;
252 $tmp =~ s/[\'\"],?\s*$//;
253 $tmp =~ s/[\'\"]\);\s*$//;
255 } elsif ( $tmp =~ /^\s*[\'\"]protocol[\'\"]/i ) {
256 $tmp =~ s/^\s*[\'\"]protocol[\'\"]\s*=>\s*[\'\"]?//i;
257 $tmp =~ s/[\'\"]?,?\s*$//;
258 $tmp =~ s/[\'\"]?\);\s*$//;
260 } elsif ( $tmp =~ /^\s*[\'\"]limit_scope[\'\"]/i ) {
261 $tmp =~ s/^\s*[\'\"]limit_scope[\'\"]\s*=>\s*[\'\"]?//i;
262 $tmp =~ s/[\'\"]?,?\s*$//;
263 $tmp =~ s/[\'\"]?\);\s*$//;
265 } elsif ( $tmp =~ /^\s*[\'\"]listing[\'\"]/i ) {
266 $tmp =~ s/^\s*[\'\"]listing[\'\"]\s*=>\s*[\'\"]?//i;
267 $tmp =~ s/[\'\"]?,?\s*$//;
268 $tmp =~ s/[\'\"]?\);\s*$//;
270 } elsif ( $tmp =~ /^\s*[\'\"]search_tree[\'\"]/i ) {
271 $tmp =~ s/^\s*[\'\"]search_tree[\'\"]\s*=>\s*[\'\"]?//i;
272 $tmp =~ s/[\'\"]?,?\s*$//;
273 $tmp =~ s/[\'\"]?\);\s*$//;
275 } elsif ( $tmp =~ /^\s*[\'\"]starttls[\'\"]/i ) {
276 $tmp =~ s/^\s*[\'\"]starttls[\'\"]\s*=>\s*[\'\"]?//i;
277 $tmp =~ s/[\'\"]?,?\s*$//;
278 $tmp =~ s/[\'\"]?\);\s*$//;
282 $ldap_host[$sub] = $host;
283 $ldap_base[$sub] = $base;
284 $ldap_name[$sub] = $name;
285 $ldap_port[$sub] = $port;
286 $ldap_maxrows[$sub] = $maxrows;
287 $ldap_filter[$sub] = $filter;
288 $ldap_charset[$sub] = $charset;
289 $ldap_binddn[$sub] = $binddn;
290 $ldap_bindpw[$sub] = $bindpw;
291 $ldap_protocol[$sub] = $protocol;
292 $ldap_limit_scope[$sub] = $limit_scope;
293 $ldap_listing[$sub] = $listing;
294 $ldap_search_tree[$sub] = $search_tree;
295 $ldap_starttls[$sub] = $starttls;
296 } elsif ( $options[0] =~ /^(data_dir|attachment_dir|theme_css|org_logo|signout_page)$/ ) {
297 ${ $options[0] } = &change_to_rel_path
($options[1]);
299 ${ $options[0] } = $options[1];
305 $useSendmail = 'false' if ( lc($useSendmail) ne 'true' );
306 $sendmail_path = "/usr/sbin/sendmail" if ( !$sendmail_path );
307 $pop_before_smtp = 'false' if ( !$pop_before_smtp );
308 $default_unseen_notify = 2 if ( !$default_unseen_notify );
309 $default_unseen_type = 1 if ( !$default_unseen_type );
310 $config_use_color = 0 if ( !$config_use_color );
311 $invert_time = 'false' if ( !$invert_time );
312 $force_username_lowercase = 'false' if ( !$force_username_lowercase );
313 $optional_delimiter = "detect" if ( !$optional_delimiter );
314 $auto_create_special = 'false' if ( !$auto_create_special );
315 $default_use_priority = 'true' if ( !$default_use_priority );
316 $hide_sm_attributions = 'false' if ( !$hide_sm_attributions );
317 $default_use_mdn = 'true' if ( !$default_use_mdn );
318 $delete_folder = 'false' if ( !$delete_folder );
319 $noselect_fix_enable = 'false' if ( !$noselect_fix_enable );
320 $frame_top = "_top" if ( !$frame_top );
321 $provider_uri = '' if ( !$provider_uri );
322 $provider_name = '' if ( !$provider_name );
323 $edit_identity = 'true' if ( !$edit_identity );
324 $edit_name = 'true' if ( !$edit_name );
325 $allow_thread_sort = 'false' if ( !$allow_thread_sort );
326 $allow_server_sort = 'false' if ( !$allow_server_sort );
327 $no_list_for_subscribe = 'false' if ( !$no_list_for_subscribe );
328 $allow_charset_search = 'true' if ( !$allow_charset_search );
329 $allow_advanced_search = 0 if ( !$allow_advanced_search) ;
330 $prefs_user_field = 'user' if ( !$prefs_user_field );
331 $prefs_key_field = 'prefkey' if ( !$prefs_key_field );
332 $prefs_val_field = 'prefval' if ( !$prefs_val_field );
333 $use_smtp_tls= 'false' if ( !$use_smtp_tls);
334 $smtp_auth_mech = 'none' if ( !$smtp_auth_mech );
335 $use_imap_tls = 'false' if ( !$use_imap_tls );
336 $imap_auth_mech = 'login' if ( !$imap_auth_mech );
337 $session_name = 'SQMSESSID' if ( !$session_name );
338 $skip_SM_header = 'false' if ( !$skip_SM_header );
339 $default_use_javascript_addr_book = 'false' if (! $default_use_javascript_addr_book);
341 $show_alternative_names = 'false' if ( !$show_alternative_names );
342 # $available_languages option available only in 1.5.0. removed due to $languages
343 # implementation changes. options are provided by limit_languages plugin
344 # $available_languages = 'all' if ( !$available_languages );
345 $aggressive_decoding = 'false' if ( !$aggressive_decoding );
346 $advanced_tree = 'false' if ( !$advanced_tree );
347 $use_php_recode = 'false' if ( !$use_php_recode );
348 $use_php_iconv = 'false' if ( !$use_php_iconv );
350 $use_icons = 'false' if ( !$use_icons );
351 $use_iframe = 'false' if ( !$use_iframe );
352 $lossy_encoding = 'false' if ( !$lossy_encoding );
353 $allow_remote_configtest = 'false' if ( !$allow_remote_configtest );
354 $addrbook_global_table = 'global_abook' if ( !$addrbook_global_table );
355 $addrbook_global_writeable = 'false' if ( !$addrbook_global_writeable );
356 $addrbook_global_listing = 'false' if ( !$addrbook_global_listing );
357 $abook_global_file = '' if ( !$abook_global_file);
358 $abook_global_file_writeable = 'false' if ( !$abook_global_file_writeable);
359 $abook_global_file_listing = 'true' if ( !$abook_global_file_listing );
360 $encode_header_key = '' if ( !$encode_header_key );
361 $hide_auth_header = 'false' if ( !$hide_auth_header );
362 $time_zone_type = '0' if ( !$time_zone_type );
363 $prefs_user_size = 128 if ( !$prefs_user_size );
364 $prefs_key_size = 64 if ( !$prefs_key_size );
365 $prefs_val_size = 65536 if ( !$prefs_val_size );
367 if ( $ARGV[0] eq '--install-plugin' ) {
368 print "Activating plugin " . $ARGV[1] . "\n";
369 push @plugins, $ARGV[1];
372 } elsif ( $ARGV[0] eq '--remove-plugin' ) {
373 print "Removing plugin " . $ARGV[1] . "\n";
374 foreach $plugin (@plugins) {
375 if ( $plugin ne $ARGV[1] ) {
376 push @newplugins, $plugin;
379 @plugins = @newplugins;
384 #####################################################################################
385 if ( $config_use_color == 1 ) {
391 $config_use_color = 2;
394 while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
396 print $WHT. "SquirrelMail Configuration : " . $NRM;
397 if ( $config == 1 ) { print "Read: config.php"; }
398 elsif ( $config == 2 ) { print "Read: config_default.php"; }
399 print " ($print_config_version)\n";
400 print "---------------------------------------------------------\n";
403 print $WHT. "Main Menu --\n" . $NRM;
404 print "1. Organization Preferences\n";
405 print "2. Server Settings\n";
406 print "3. Folder Defaults\n";
407 print "4. General Options\n";
409 print "6. Address Books\n";
410 print "7. Message of the Day (MOTD)\n";
411 print "8. Plugins\n";
412 print "9. Database\n";
413 print "10. Language settings\n";
414 print "11. Tweaks\n";
416 print "D. Set pre-defined settings for specific IMAP servers\n";
418 } elsif ( $menu == 1 ) {
419 print $WHT. "Organization Preferences\n" . $NRM;
420 print "1. Organization Name : $WHT$org_name$NRM\n";
421 print "2. Organization Logo : $WHT$org_logo$NRM\n";
422 print "3. Org. Logo Width/Height : $WHT($org_logo_width/$org_logo_height)$NRM\n";
423 print "4. Organization Title : $WHT$org_title$NRM\n";
424 print "5. Signout Page : $WHT$signout_page$NRM\n";
425 print "6. Top Frame : $WHT$frame_top$NRM\n";
426 print "7. Provider link : $WHT$provider_uri$NRM\n";
427 print "8. Provider name : $WHT$provider_name$NRM\n";
430 print "R Return to Main Menu\n";
431 } elsif ( $menu == 2 ) {
432 print $WHT. "Server Settings\n\n" . $NRM;
433 print $WHT . "General" . $NRM . "\n";
435 print "1. Domain : $WHT$domain$NRM\n";
436 print "2. Invert Time : $WHT$invert_time$NRM\n";
437 print "3. Sendmail or SMTP : $WHT";
438 if ( lc($useSendmail) eq 'true' ) {
446 if ( $show_imap_settings ) {
447 print $WHT . "IMAP Settings". $NRM . "\n--------------\n";
448 print "4. IMAP Server : $WHT$imapServerAddress$NRM\n";
449 print "5. IMAP Port : $WHT$imapPort$NRM\n";
450 print "6. Authentication type : $WHT$imap_auth_mech$NRM\n";
451 print "7. Secure IMAP (TLS) : $WHT$use_imap_tls$NRM\n";
452 print "8. Server software : $WHT$imap_server_type$NRM\n";
453 print "9. Delimiter : $WHT$optional_delimiter$NRM\n";
455 } elsif ( $show_smtp_settings ) {
456 if ( lc($useSendmail) eq 'true' ) {
457 print $WHT . "Sendmail" . $NRM . "\n--------\n";
458 print "4. Sendmail Path : $WHT$sendmail_path$NRM\n";
459 print "5. Header encryption key : $WHT$encode_header_key$NRM\n";
462 print $WHT . "SMTP Settings" . $NRM . "\n-------------\n";
463 print "4. SMTP Server : $WHT$smtpServerAddress$NRM\n";
464 print "5. SMTP Port : $WHT$smtpPort$NRM\n";
465 print "6. POP before SMTP : $WHT$pop_before_smtp$NRM\n";
466 print "7. SMTP Authentication : $WHT$smtp_auth_mech$NRM\n";
467 print "8. Secure SMTP (TLS) : $WHT$use_smtp_tls$NRM\n";
468 print "9. Header encryption key : $WHT$encode_header_key$NRM\n";
473 if ($show_imap_settings == 0) {
474 print "A. Update IMAP Settings : ";
475 print "$WHT$imapServerAddress$NRM:";
476 print "$WHT$imapPort$NRM ";
477 print "($WHT$imap_server_type$NRM)\n";
479 if ($show_smtp_settings == 0) {
480 if ( lc($useSendmail) eq 'true' ) {
481 print "B. Change Sendmail Config : $WHT$sendmail_path$NRM\n";
483 print "B. Update SMTP Settings : ";
484 print "$WHT$smtpServerAddress$NRM:";
485 print "$WHT$smtpPort$NRM\n";
488 if ( $show_smtp_settings || $show_imap_settings )
491 ($show_imap_settings ?
"IMAP Server" :
492 (lc($useSendmail) eq 'true') ?
"Sendmail" : "SMTP") . " Settings\n";
496 print "R Return to Main Menu\n";
497 } elsif ( $menu == 3 ) {
498 print $WHT. "Folder Defaults\n" . $NRM;
499 print "1. Default Folder Prefix : $WHT$default_folder_prefix$NRM\n";
500 print "2. Show Folder Prefix Option : $WHT$show_prefix_option$NRM\n";
501 print "3. Trash Folder : $WHT$trash_folder$NRM\n";
502 print "4. Sent Folder : $WHT$sent_folder$NRM\n";
503 print "5. Drafts Folder : $WHT$draft_folder$NRM\n";
504 print "6. By default, move to trash : $WHT$default_move_to_trash$NRM\n";
505 print "7. By default, move to sent : $WHT$default_move_to_sent$NRM\n";
506 print "8. By default, save as draft : $WHT$default_save_as_draft$NRM\n";
507 print "9. List Special Folders First : $WHT$list_special_folders_first$NRM\n";
508 print "10. Show Special Folders Color : $WHT$use_special_folder_color$NRM\n";
509 print "11. Auto Expunge : $WHT$auto_expunge$NRM\n";
510 print "12. Default Sub. of INBOX : $WHT$default_sub_of_inbox$NRM\n";
511 print "13. Show 'Contain Sub.' Option : $WHT$show_contain_subfolders_option$NRM\n";
512 print "14. Default Unseen Notify : $WHT$default_unseen_notify$NRM\n";
513 print "15. Default Unseen Type : $WHT$default_unseen_type$NRM\n";
514 print "16. Auto Create Special Folders : $WHT$auto_create_special$NRM\n";
515 print "17. Folder Delete Bypasses Trash : $WHT$delete_folder$NRM\n";
516 print "18. Enable /NoSelect folder fix : $WHT$noselect_fix_enable$NRM\n";
518 print "R Return to Main Menu\n";
519 } elsif ( $menu == 4 ) {
520 print $WHT. "General Options\n" . $NRM;
521 print "1. Data Directory : $WHT$data_dir$NRM\n";
522 print "2. Attachment Directory : $WHT$attachment_dir$NRM\n";
523 print "3. Directory Hash Level : $WHT$dir_hash_level$NRM\n";
524 print "4. Default Left Size : $WHT$default_left_size$NRM\n";
525 print "5. Usernames in Lowercase : $WHT$force_username_lowercase$NRM\n";
526 print "6. Allow use of priority : $WHT$default_use_priority$NRM\n";
527 print "7. Hide SM attributions : $WHT$hide_sm_attributions$NRM\n";
528 print "8. Allow use of receipts : $WHT$default_use_mdn$NRM\n";
529 print "9. Allow editing of identity : $WHT$edit_identity$NRM\n";
530 print " Allow editing of name : $WHT$edit_name$NRM\n";
531 print " Remove username from header : $WHT$hide_auth_header$NRM\n";
532 print "10. Allow server thread sort : $WHT$allow_thread_sort$NRM\n";
533 print "11. Allow server-side sorting : $WHT$allow_server_sort$NRM\n";
534 print "12. Allow server charset search : $WHT$allow_charset_search$NRM\n";
535 print "13. Allow advanced search : $WHT$allow_advanced_search$NRM\n";
536 print "14. PHP session name : $WHT$session_name$NRM\n";
537 print "15. Time zone configuration : $WHT$time_zone_type$NRM\n";
539 print "R Return to Main Menu\n";
540 } elsif ( $menu == 5 ) {
541 print $WHT. "Themes\n" . $NRM;
542 print "1. Change Themes\n";
543 for ( $count = 0 ; $count <= $#theme_name/2 ; $count++ ) {
544 $temp_name = $theme_name[$count*2];
545 printf " %s%*s %s\n", $temp_name,
546 40 - length($temp_name), " ",
547 $theme_name[($count*2)+1];
549 print "2. CSS File : $WHT$theme_css$NRM\n";
551 print "R Return to Main Menu\n";
552 } elsif ( $menu == 6 ) {
553 print $WHT. "Address Books\n" . $NRM;
554 print "1. Change LDAP Servers\n";
555 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
556 print " > $ldap_host[$count]\n";
558 print "2. Use Javascript address book search : $WHT$default_use_javascript_addr_book$NRM\n";
559 print "3. Global address book file : $WHT$abook_global_file$NRM\n";
560 print "4. Allow writing into global file address book : $WHT$abook_global_file_writeable$NRM\n";
561 print "5. Allow listing of global file address book : $WHT$abook_global_file_listing$NRM\n";
563 print "R Return to Main Menu\n";
564 } elsif ( $menu == 7 ) {
565 print $WHT. "Message of the Day (MOTD)\n" . $NRM;
568 print "1 Edit the MOTD\n";
570 print "R Return to Main Menu\n";
571 } elsif ( $menu == 8 ) {
572 print $WHT. "Plugins\n" . $NRM;
573 print " Installed Plugins\n";
575 for ( $count = 0 ; $count <= $#plugins ; $count++ ) {
577 print " $num. $plugins[$count]\n";
579 print "\n Available Plugins:\n";
580 opendir( DIR
, "../plugins" );
581 @files = readdir(DIR
);
583 @unused_plugins = ();
584 for ( $i = 0 ; $i <= $#files ; $i++ ) {
585 if ( -d
"../plugins/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
587 for ( $k = 0 ; $k <= $#plugins ; $k++ ) {
588 if ( $plugins[$k] eq $files[$i] ) {
593 $unused_plugins[$pos] = $files[$i];
599 for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
601 print " $num. $unused_plugins[$i]\n";
606 print "R Return to Main Menu\n";
607 } elsif ( $menu == 9 ) {
608 print $WHT. "Database\n" . $NRM;
609 print "1. DSN for Address Book : $WHT$addrbook_dsn$NRM\n";
610 print "2. Table for Address Book : $WHT$addrbook_table$NRM\n";
612 print "3. DSN for Preferences : $WHT$prefs_dsn$NRM\n";
613 print "4. Table for Preferences : $WHT$prefs_table$NRM\n";
614 print "5. Field for username : $WHT$prefs_user_field$NRM ($prefs_user_size)\n";
615 print "6. Field for prefs key : $WHT$prefs_key_field$NRM ($prefs_key_size)\n";
616 print "7. Field for prefs value : $WHT$prefs_val_field$NRM ($prefs_val_size)\n";
618 print "8. DSN for Global Address Book : $WHT$addrbook_global_dsn$NRM\n";
619 print "9. Table for Global Address Book : $WHT$addrbook_global_table$NRM\n";
620 print "10. Allow writing into Global Address Book : $WHT$addrbook_global_writeable$NRM\n";
621 print "11. Allow listing of Global Address Book : $WHT$addrbook_global_listing$NRM\n";
623 print "R Return to Main Menu\n";
624 } elsif ( $menu == 10 ) {
625 print $WHT. "Language settings\n" . $NRM;
626 print "1. Default Language : $WHT$squirrelmail_default_language$NRM\n";
627 print "2. Default Charset : $WHT$default_charset$NRM\n";
628 print "3. Show alternative language names : $WHT$show_alternative_names$NRM\n";
629 print "4. Enable aggressive decoding : $WHT$aggressive_decoding$NRM\n";
630 print "5. Enable lossy encoding : $WHT$lossy_encoding$NRM\n";
632 print "R Return to Main Menu\n";
633 } elsif ( $menu == 11 ) {
634 print $WHT. "Interface tweaks\n" . $NRM;
635 print "1. Advanced tree : $WHT$advanced_tree$NRM\n";
636 print "2. Display html mails in iframe : $WHT$use_iframe$NRM\n";
637 print "3. Use Icons : $WHT$use_icons$NRM\n";
639 print $WHT. "PHP tweaks\n" . $NRM;
640 print "4. Use php recode functions : $WHT$use_php_recode$NRM\n";
641 print "5. Use php iconv functions : $WHT$use_php_iconv$NRM\n";
643 print $WHT. "Configuration tweaks\n" . $NRM;
644 print "6. Allow remote configtest : $WHT$allow_remote_configtest$NRM\n";
646 print "R Return to Main Menu\n";
648 if ( $config_use_color == 1 ) {
649 print "C Turn color off\n";
651 print "C Turn color on\n";
653 print "S Save data\n";
657 print "Command >> " . $WHT;
659 $command =~ s/[\n\r]//g;
660 $command =~ tr/A-Z/a-z/;
663 # Read the commands they entered.
664 if ( $command eq "r" ) {
666 } elsif ( $command eq "s" ) {
668 print "Press enter to continue...";
671 } elsif ( ( $command eq "q" ) && ( $saved == 0 ) ) {
672 print "You have not saved your data.\n";
673 print "Save? [" . $WHT . "Y" . $NRM . "/n]: ";
675 if ( ( $save =~ /^y/i ) || ( $save =~ /^\s*$/ ) ) {
678 } elsif ( $command eq "c" ) {
679 if ( $config_use_color == 1 ) {
680 $config_use_color = 2;
684 $config_use_color = 1;
688 } elsif ( $command eq "d" && $menu == 0 ) {
693 if ( ( $command > 0 ) && ( $command < 12 ) ) {
696 } elsif ( $menu == 1 ) {
697 if ( $command == 1 ) { $org_name = command1
(); }
698 elsif ( $command == 2 ) { $org_logo = command2
(); }
699 elsif ( $command == 3 ) { ($org_logo_width,$org_logo_height) = command2a
(); }
700 elsif ( $command == 4 ) { $org_title = command3
(); }
701 elsif ( $command == 5 ) { $signout_page = command4
(); }
702 elsif ( $command == 6 ) { $frame_top = command6
(); }
703 elsif ( $command == 7 ) { $provider_uri = command7
(); }
704 elsif ( $command == 8 ) { $provider_name = command8
(); }
706 } elsif ( $menu == 2 ) {
707 if ( $command eq "a" ) { $show_imap_settings = 1; $show_smtp_settings = 0; }
708 elsif ( $command eq "b" ) { $show_imap_settings = 0; $show_smtp_settings = 1; }
709 elsif ( $command eq "h" ) { $show_imap_settings = 0; $show_smtp_settings = 0; }
710 elsif ( $command <= 3 ) {
711 if ( $command == 1 ) { $domain = command11
(); }
712 elsif ( $command == 2 ) { $invert_time = command110
(); }
713 elsif ( $command == 3 ) { $useSendmail = command14
(); }
714 $show_imap_settings = 0; $show_smtp_settings = 0;
715 } elsif ( $show_imap_settings ) {
716 if ( $command == 4 ) { $imapServerAddress = command12
(); }
717 elsif ( $command == 5 ) { $imapPort = command13
(); }
718 elsif ( $command == 6 ) { $imap_auth_mech = command112a
(); }
719 elsif ( $command == 7 ) { $use_imap_tls = command113
("IMAP",$use_imap_tls); }
720 elsif ( $command == 8 ) { $imap_server_type = command19
(); }
721 elsif ( $command == 9 ) { $optional_delimiter = command111
(); }
722 } elsif ( $show_smtp_settings && lc($useSendmail) eq 'true' ) {
723 if ( $command == 4 ) { $sendmail_path = command15
(); }
724 elsif ( $command == 5 ) { $encode_header_key = command114
(); }
725 } elsif ( $show_smtp_settings ) {
726 if ( $command == 4 ) { $smtpServerAddress = command16
(); }
727 elsif ( $command == 5 ) { $smtpPort = command17
(); }
728 elsif ( $command == 6 ) { $pop_before_smtp = command18a
(); }
729 elsif ( $command == 7 ) { $smtp_auth_mech = command112b
(); }
730 elsif ( $command == 8 ) { $use_smtp_tls = command113
("SMTP",$use_smtp_tls); }
731 elsif ( $command == 9 ) { $encode_header_key = command114
(); }
733 } elsif ( $menu == 3 ) {
734 if ( $command == 1 ) { $default_folder_prefix = command21
(); }
735 elsif ( $command == 2 ) { $show_prefix_option = command22
(); }
736 elsif ( $command == 3 ) { $trash_folder = command23a
(); }
737 elsif ( $command == 4 ) { $sent_folder = command23b
(); }
738 elsif ( $command == 5 ) { $draft_folder = command23c
(); }
739 elsif ( $command == 6 ) { $default_move_to_trash = command24a
(); }
740 elsif ( $command == 7 ) { $default_move_to_sent = command24b
(); }
741 elsif ( $command == 8 ) { $default_save_as_draft = command24c
(); }
742 elsif ( $command == 9 ) { $list_special_folders_first = command27
(); }
743 elsif ( $command == 10 ) { $use_special_folder_color = command28
(); }
744 elsif ( $command == 11 ) { $auto_expunge = command29
(); }
745 elsif ( $command == 12 ) { $default_sub_of_inbox = command210
(); }
746 elsif ( $command == 13 ) { $show_contain_subfolders_option = command211
(); }
747 elsif ( $command == 14 ) { $default_unseen_notify = command212
(); }
748 elsif ( $command == 15 ) { $default_unseen_type = command213
(); }
749 elsif ( $command == 16 ) { $auto_create_special = command214
(); }
750 elsif ( $command == 17 ) { $delete_folder = command215
(); }
751 elsif ( $command == 18 ) { $noselect_fix_enable = command216
(); }
752 } elsif ( $menu == 4 ) {
753 if ( $command == 1 ) { $data_dir = command33a
(); }
754 elsif ( $command == 2 ) { $attachment_dir = command33b
(); }
755 elsif ( $command == 3 ) { $dir_hash_level = command33c
(); }
756 elsif ( $command == 4 ) { $default_left_size = command35
(); }
757 elsif ( $command == 5 ) { $force_username_lowercase = command36
(); }
758 elsif ( $command == 6 ) { $default_use_priority = command37
(); }
759 elsif ( $command == 7 ) { $hide_sm_attributions = command38
(); }
760 elsif ( $command == 8 ) { $default_use_mdn = command39
(); }
761 elsif ( $command == 9 ) { $edit_identity = command310
(); }
762 elsif ( $command == 10 ) { $allow_thread_sort = command312
(); }
763 elsif ( $command == 11 ) { $allow_server_sort = command313
(); }
764 elsif ( $command == 12 ) { $allow_charset_search = command314
(); }
765 elsif ( $command == 13 ) { $allow_advanced_search = command316
(); }
766 elsif ( $command == 14 ) { $session_name = command317
(); }
767 elsif ( $command == 15 ) { $time_zone_type = command318
(); }
768 } elsif ( $menu == 5 ) {
769 if ( $command == 1 ) { command41
(); }
770 elsif ( $command == 2 ) { $theme_css = command42
(); }
771 } elsif ( $menu == 6 ) {
772 if ( $command == 1 ) { command61
(); }
773 elsif ( $command == 2 ) { command62
(); }
774 elsif ( $command == 3 ) { $abook_global_file=command63
(); }
775 elsif ( $command == 4 ) { command64
(); }
776 elsif ( $command == 5 ) { command65
(); }
777 } elsif ( $menu == 7 ) {
778 if ( $command == 1 ) { $motd = command71
(); }
779 } elsif ( $menu == 8 ) {
780 if ( $command =~ /^[0-9]+/ ) { @plugins = command81
(); }
781 } elsif ( $menu == 9 ) {
782 if ( $command == 1 ) { $addrbook_dsn = command91
(); }
783 elsif ( $command == 2 ) { $addrbook_table = command92
(); }
784 elsif ( $command == 3 ) { $prefs_dsn = command93
(); }
785 elsif ( $command == 4 ) { $prefs_table = command94
(); }
786 elsif ( $command == 5 ) { $prefs_user_field = command95
(); }
787 elsif ( $command == 6 ) { $prefs_key_field = command96
(); }
788 elsif ( $command == 7 ) { $prefs_val_field = command97
(); }
789 elsif ( $command == 8 ) { $addrbook_global_dsn = command98
(); }
790 elsif ( $command == 9 ) { $addrbook_global_table = command99
(); }
791 elsif ( $command == 10 ) { $addrbook_global_writeable = command910
(); }
792 elsif ( $command == 11 ) { $addrbook_global_listing = command911
(); }
793 } elsif ( $menu == 10 ) {
794 if ( $command == 1 ) { $squirrelmail_default_language = commandA1
(); }
795 elsif ( $command == 2 ) { $default_charset = commandA2
(); }
796 elsif ( $command == 3 ) { $show_alternative_names = commandA3
(); }
797 elsif ( $command == 4 ) { $aggressive_decoding = commandA4
(); }
798 elsif ( $command == 5 ) { $lossy_encoding = commandA5
(); }
799 } elsif ( $menu == 11 ) {
800 if ( $command == 1 ) { $advanced_tree = commandB1
(); }
801 if ( $command == 2 ) { $use_iframe = commandB2
(); }
802 elsif ( $command == 3 ) { $use_icons = commandB3
(); }
803 elsif ( $command == 4 ) { $use_php_recode = commandB4
(); }
804 elsif ( $command == 5 ) { $use_php_iconv = commandB5
(); }
805 elsif ( $command == 6 ) { $allow_remote_configtest = commandB6
(); }
811 print "\nExiting conf.pl.\n".
812 "You might want to test your configuration by browsing to\n".
813 "http://your-squirrelmail-location/src/configtest.php\n".
814 "Happy SquirrelMailing!\n\n";
817 ####################################################################################
821 print "We have tried to make the name SquirrelMail as transparent as\n";
822 print "possible. If you set up an organization name, most places where\n";
823 print "SquirrelMail would take credit will be credited to your organization.\n";
825 print "If your Organization Name includes a '\$', please precede it with a \\. \n";
826 print "Other '\$' will be considered the beginning of a variable that\n";
827 print "must be defined before the \$org_name is printed.\n";
829 print "[$WHT$org_name$NRM]: $WHT";
830 $new_org_name = <STDIN
>;
831 if ( $new_org_name eq "\n" ) {
832 $new_org_name = $org_name;
834 $new_org_name =~ s/[\r\n]//g;
835 $new_org_name =~ s/\"/"/g;
837 return $new_org_name;
842 print "Your organization's logo is an image that will be displayed at\n";
843 print "different times throughout SquirrelMail. ";
845 print "Please be aware of the following: \n";
846 print " - Relative URLs are relative to the config dir\n";
847 print " to use the default logo, use ../images/sm_logo.png\n";
848 print " - To specify a logo defined outside the SquirrelMail source tree\n";
849 print " use the absolute URL the webserver would use to include the file\n";
850 print " e.g. http://www.example.com/images/mylogo.gif or /images/mylogo.jpg\n";
852 print "[$WHT$org_logo$NRM]: $WHT";
853 $new_org_logo = <STDIN
>;
854 if ( $new_org_logo eq "\n" ) {
855 $new_org_logo = $org_logo;
857 $new_org_logo =~ s/[\r\n]//g;
859 return $new_org_logo;
864 print "Your organization's logo is an image that will be displayed at\n";
865 print "different times throughout SquirrelMail. Width\n";
866 print "and Height of your logo image. Use '0' to disable.\n";
868 print "Width: [$WHT$org_logo_width$NRM]: $WHT";
869 $new_org_logo_width = <STDIN
>;
870 $new_org_logo_width =~ tr/0-9//cd; # only want digits!
871 if ( $new_org_logo_width eq '' ) {
872 $new_org_logo_width = $org_logo_width;
874 if ( $new_org_logo_width > 0 ) {
875 print "Height: [$WHT$org_logo_height$NRM]: $WHT";
876 $new_org_logo_height = <STDIN
>;
877 $new_org_logo_height =~ tr/0-9//cd; # only want digits!
878 if( $new_org_logo_height eq '' ) {
879 $new_org_logo_height = $org_logo_height;
882 $new_org_logo_height = 0;
884 return ($new_org_logo_width, $new_org_logo_height);
889 print "A title is what is displayed at the top of the browser window in\n";
890 print "the titlebar. Usually this will end up looking something like:\n";
891 print "\"Netscape: $org_title\"\n";
893 print "If your Organization Title includes a '\$', please precede it with a \\. \n";
894 print "Other '\$' will be considered the beginning of a variable that\n";
895 print "must be defined before the \$org_title is printed.\n";
896 print "\$version, for example can be used, and will print the\n";
897 print "string representing the current SquirrelMail version.\n";
899 print "[$WHT$org_title$NRM]: $WHT";
900 $new_org_title = <STDIN
>;
901 if ( $new_org_title eq "\n" ) {
902 $new_org_title = $org_title;
904 $new_org_title =~ s/[\r\n]//g;
905 $new_org_title =~ s/\"/\'/g;
907 return $new_org_title;
912 print "When users click the Sign Out button they will be logged out and\n";
913 print "then sent to signout_page. If signout_page is left empty,\n";
914 print "(hit space and then return) they will be taken, as normal,\n";
915 print "to the default and rather sparse SquirrelMail signout page.\n";
917 print "[$WHT$signout_page$NRM]: $WHT";
918 $new_signout_page = <STDIN
>;
919 if ( $new_signout_page eq "\n" ) {
920 $new_signout_page = $signout_page;
922 $new_signout_page =~ s/[\r\n]//g;
923 $new_signout_page =~ s/^\s+$//g;
925 return $new_signout_page;
930 print "SquirrelMail defaults to using the whole of the browser window.\n";
931 print "This allows you to keep it within a specified frame. The default\n";
934 print "[$WHT$frame_top$NRM]: $WHT";
935 $new_frame_top = <STDIN
>;
936 if ( $new_frame_top eq "\n" ) {
937 $new_frame_top = '_top';
939 $new_frame_top =~ s/[\r\n]//g;
940 $new_frame_top =~ s/^\s+$//g;
942 return $new_frame_top;
945 # Default link to provider
947 print "Here you can set the link on the right of the page.\n";
948 print "If empty, it will link to the SquirrelMail About page.\n";
950 print "[$WHT$provider_uri$NRM]: $WHT";
951 $new_provider_uri = <STDIN
>;
952 if ( $new_provider_uri eq "\n" ) {
953 $new_provider_uri = '';
955 $new_provider_uri =~ s/[\r\n]//g;
956 $new_provider_uri =~ s/^\s+$//g;
958 return $new_provider_uri;
962 print "Here you can set the name of the link on the right of the page.\n";
963 print "The default is 'SquirrelMail/'\n";
965 print "[$WHT$provider_name$NRM]: $WHT";
966 $new_provider_name = <STDIN
>;
967 if ( $new_provider_name eq "\n" ) {
968 $new_provider_name = 'SquirrelMail';
970 $new_provider_name =~ s/[\r\n]//g;
971 $new_provider_name =~ s/^\s+$//g;
973 return $new_provider_name;
976 ####################################################################################
980 print "The domain name is the suffix at the end of all email addresses. If\n";
981 print "for example, your email address is jdoe\@example.com, then your domain\n";
982 print "would be example.com.\n";
984 print "[$WHT$domain$NRM]: $WHT";
985 $new_domain = <STDIN
>;
986 if ( $new_domain eq "\n" ) {
987 $new_domain = $domain;
989 $new_domain =~ s/[\r\n]//g;
996 print "This is the hostname where your IMAP server can be contacted.\n";
997 print "[$WHT$imapServerAddress$NRM]: $WHT";
998 $new_imapServerAddress = <STDIN
>;
999 if ( $new_imapServerAddress eq "\n" ) {
1000 $new_imapServerAddress = $imapServerAddress;
1002 $new_imapServerAddress =~ s/[\r\n]//g;
1004 return $new_imapServerAddress;
1009 print "This is the port that your IMAP server is on. Usually this is 143.\n";
1010 print "[$WHT$imapPort$NRM]: $WHT";
1011 $new_imapPort = <STDIN
>;
1012 if ( $new_imapPort eq "\n" ) {
1013 $new_imapPort = $imapPort;
1015 $new_imapPort =~ s/[\r\n]//g;
1017 return $new_imapPort;
1022 print "You now need to choose the method that you will use for sending\n";
1023 print "messages in SquirrelMail. You can either connect to an SMTP server\n";
1024 print "or use sendmail directly.\n";
1025 if ( lc($useSendmail) eq 'true' ) {
1026 $default_value = "1";
1028 $default_value = "2";
1031 print " 1. Sendmail\n";
1033 print "Your choice [1/2] [$WHT$default_value$NRM]: $WHT";
1034 $use_sendmail = <STDIN
>;
1035 if ( ( $use_sendmail =~ /^1\n/i )
1036 || ( ( $use_sendmail =~ /^\n/ ) && ( $default_value eq "1" ) ) ) {
1037 $useSendmail = 'true';
1039 $useSendmail = 'false';
1041 return $useSendmail;
1046 if ( $sendmail_path[0] !~ /./ ) {
1047 $sendmail_path = "/usr/sbin/sendmail";
1049 print "Specify where the sendmail executable is located. Usually /usr/sbin/sendmail\n";
1050 print "[$WHT$sendmail_path$NRM]: $WHT";
1051 $new_sendmail_path = <STDIN
>;
1052 if ( $new_sendmail_path eq "\n" ) {
1053 $new_sendmail_path = $sendmail_path;
1055 $new_sendmail_path =~ s/[\r\n]//g;
1057 return $new_sendmail_path;
1062 print "This is the hostname of your SMTP server.\n";
1063 print "[$WHT$smtpServerAddress$NRM]: $WHT";
1064 $new_smtpServerAddress = <STDIN
>;
1065 if ( $new_smtpServerAddress eq "\n" ) {
1066 $new_smtpServerAddress = $smtpServerAddress;
1068 $new_smtpServerAddress =~ s/[\r\n]//g;
1070 return $new_smtpServerAddress;
1075 print "This is the port to connect to for SMTP. Usually 25.\n";
1076 print "[$WHT$smtpPort$NRM]: $WHT";
1077 $new_smtpPort = <STDIN
>;
1078 if ( $new_smtpPort eq "\n" ) {
1079 $new_smtpPort = $smtpPort;
1081 $new_smtpPort =~ s/[\r\n]//g;
1083 return $new_smtpPort;
1086 # authenticated server
1089 # This sub disabled by tassium - it has been replaced with smtp_auth_mech
1090 print "Do you wish to use an authenticated SMTP server? Your server must\n";
1091 print "support this in order for SquirrelMail to work with it. We implemented\n";
1092 print "it according to RFC 2554.\n";
1095 $YesNo = 'y' if ( lc($use_authenticated_smtp) eq 'true' );
1097 print "Use authenticated SMTP server (y/n) [$WHT$YesNo$NRM]: $WHT";
1099 $new_use_authenticated_smtp = <STDIN
>;
1100 $new_use_authenticated_smtp =~ tr/yn//cd;
1101 return 'true' if ( $new_use_authenticated_smtp eq "y" );
1102 return 'false' if ( $new_use_authenticated_smtp eq "n" );
1103 return $use_authenticated_smtp;
1108 print "Do you wish to use POP3 before SMTP? Your server must\n";
1109 print "support this in order for SquirrelMail to work with it.\n";
1112 $YesNo = 'y' if ( lc($pop_before_smtp) eq 'true' );
1114 print "Use pop before SMTP (y/n) [$WHT$YesNo$NRM]: $WHT";
1116 $new_pop_before_smtp = <STDIN
>;
1117 $new_pop_before_smtp =~ tr/yn//cd;
1118 return 'true' if ( $new_pop_before_smtp eq "y" );
1119 return 'false' if ( $new_pop_before_smtp eq "n" );
1120 return $pop_before_smtp;
1125 print "Each IMAP server has its own quirks. As much as we tried to stick\n";
1126 print "to standards, it doesn't help much if the IMAP server doesn't follow\n";
1127 print "the same principles. We have made some work-arounds for some of\n";
1128 print "these servers. If you would like to use them, please select your\n";
1129 print "IMAP server. If you do not wish to use these work-arounds, you can\n";
1130 print "set this to \"other\", and none will be used.\n";
1131 print " courier = Courier IMAP server\n";
1132 print " cyrus = Cyrus IMAP server\n";
1133 print " dovecot = Dovecot Secure IMAP server\n";
1134 print " exchange = Microsoft Exchange IMAP server\n";
1135 print " hmailserver = hMailServer\n";
1136 print " macosx = Mac OS X Mailserver\n";
1137 print " mercury32 = Mercury Mail Transport System\n";
1138 print " uw = University of Washington's IMAP server\n";
1140 print " other = Not one of the above servers\n";
1142 print "[$WHT$imap_server_type$NRM]: $WHT";
1143 $new_imap_server_type = <STDIN
>;
1145 if ( $new_imap_server_type eq "\n" ) {
1146 $new_imap_server_type = $imap_server_type;
1148 $new_imap_server_type =~ s/[\r\n]//g;
1150 return $new_imap_server_type;
1155 print "Sometimes the date of messages sent is messed up (off by a few hours\n";
1156 print "on some machines). Typically this happens if the system doesn't support\n";
1157 print "tm_gmtoff. It will happen only if your time zone is \"negative\".\n";
1158 print "This most often occurs on Solaris 7 machines in the United States.\n";
1159 print "By default, this is off. It should be kept off unless problems surface\n";
1160 print "about the time that messages are sent.\n";
1161 print " no = Do NOT fix time -- almost always correct\n";
1162 print " yes = Fix the time for this system\n";
1165 $YesNo = 'y' if ( lc($invert_time) eq 'true' );
1167 print "Fix the time for this system (y/n) [$WHT$YesNo$NRM]: $WHT";
1169 $new_invert_time = <STDIN
>;
1170 $new_invert_time =~ tr/yn//cd;
1171 return 'true' if ( $new_invert_time eq "y" );
1172 return 'false' if ( $new_invert_time eq "n" );
1173 return $invert_time;
1177 print "This is the delimiter that your IMAP server uses to distinguish between\n";
1178 print "folders. For example, Cyrus uses '.' as the delimiter and a complete\n";
1179 print "folder would look like 'INBOX.Friends.Bob', while UW uses '/' and would\n";
1180 print "look like 'INBOX/Friends/Bob'. Normally this should be left at 'detect'\n";
1181 print "but if you are sure you know what delimiter your server uses, you can\n";
1182 print "specify it here.\n";
1183 print "\nTo have it autodetect the delimiter, set it to 'detect'.\n\n";
1184 print "[$WHT$optional_delimiter$NRM]: $WHT";
1185 $new_optional_delimiter = <STDIN
>;
1187 if ( $new_optional_delimiter eq "\n" ) {
1188 $new_optional_delimiter = $optional_delimiter;
1190 $new_optional_delimiter =~ s/[\r\n]//g;
1192 return $new_optional_delimiter;
1194 # IMAP authentication type
1195 # Possible values: login, plain, cram-md5, digest-md5
1196 # Now offers to detect supported mechs, assuming server & port are set correctly
1199 if ($use_imap_tls =~ /^true\b/i) {
1200 print "Auto-detection of login methods is unavailable when using TLS.\n";
1202 print "If you have already set the hostname and port number, I can try to\n";
1203 print "detect the mechanisms your IMAP server supports.\n";
1204 print "I will try to detect CRAM-MD5 and DIGEST-MD5 support. I can't test\n";
1205 print "for \"login\" or \"plain\" without knowing a username and password.\n";
1206 print "Auto-detecting is optional - you can safely say \"n\" here.\n";
1207 print "\nTry to detect supported mechanisms? [y/N]: ";
1210 if ($inval =~ /^y\b/i) {
1211 # Yes, let's try to detect.
1212 print "Trying to detect IMAP capabilities...\n";
1213 my $host = $imapServerAddress . ':'. $imapPort;
1214 print "CRAM-MD5:\t";
1215 my $tmp = detect_auth_support
('IMAP',$host,'CRAM-MD5');
1216 if (defined($tmp)) {
1217 if ($tmp eq 'YES') {
1218 print "$WHT SUPPORTED$NRM\n";
1220 print "$WHT NOT SUPPORTED$NRM\n";
1223 print $WHT . " ERROR DETECTING$NRM\n";
1226 print "DIGEST-MD5:\t";
1227 $tmp = detect_auth_support
('IMAP',$host,'DIGEST-MD5');
1228 if (defined($tmp)) {
1229 if ($tmp eq 'YES') {
1230 print "$WHT SUPPORTED$NRM\n";
1232 print "$WHT NOT SUPPORTED$NRM\n";
1235 print $WHT . " ERROR DETECTING$NRM\n";
1240 print "\nWhat authentication mechanism do you want to use for IMAP connections?\n\n";
1241 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1242 print $WHT . "plain" . $NRM . " - SASL PLAIN. If you need this, you already know it.\n";
1243 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext methods.\n";
1244 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1245 print "\n*** YOUR IMAP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n";
1246 print "If you don't understand or are unsure, you probably want \"login\"\n\n";
1247 print "login, plain, cram-md5, or digest-md5 [$WHT$imap_auth_mech$NRM]: $WHT";
1250 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || ($inval =~ /^login\b/i) || ($inval =~ /^plain\b/i)) {
1253 # user entered garbage or default value so nothing needs to be set
1254 return $imap_auth_mech;
1259 # SMTP authentication type
1260 # Possible choices: none, plain, cram-md5, digest-md5
1262 if ($use_smtp_tls =~ /^true\b/i) {
1263 print "Auto-detection of login methods is unavailable when using TLS.\n";
1265 print "If you have already set the hostname and port number, I can try to\n";
1266 print "automatically detect some of the mechanisms your SMTP server supports.\n";
1267 print "Auto-detection is *optional* - you can safely say \"n\" here.\n";
1268 print "\nTry to detect auth mechanisms? [y/N]: ";
1271 if ($inval =~ /^y\b/i) {
1272 # Yes, let's try to detect.
1273 print "Trying to detect supported methods (SMTP)...\n";
1276 # Check none by trying to relay to junk@microsoft.com
1277 $host = $smtpServerAddress . ':' . $smtpPort;
1279 my $sock = IO
::Socket
::INET
->new($host);
1280 print "Testing none:\t\t$WHT";
1281 if (!defined($sock)) {
1282 print " ERROR TESTING\n";
1285 print $sock "HELO $domain\r\n";
1286 $got = <$sock>; # Discard
1287 print $sock "MAIL FROM:<tester\@squirrelmail.org>\r\n";
1288 $got = <$sock>; # Discard
1289 print $sock "RCPT TO:<junk\@microsoft.com\r\n";
1290 $got = <$sock>; # This is the important line
1291 if ($got =~ /^250\b/) { # SMTP will relay without auth
1292 print "SUPPORTED$NRM\n";
1294 print "NOT SUPPORTED$NRM\n";
1296 print $sock "RSET\r\n";
1297 print $sock "QUIT\r\n";
1300 # Try login (SquirrelMail default)
1301 print "Testing login:\t\t";
1302 $tmp=detect_auth_support
('SMTP',$host,'LOGIN');
1303 if (defined($tmp)) {
1304 if ($tmp eq 'YES') {
1305 print $WHT . "SUPPORTED$NRM\n";
1307 print $WHT . "NOT SUPPORTED$NRM\n";
1310 print $WHT . "ERROR DETECTING$NRM\n";
1314 print "Testing CRAM-MD5:\t";
1315 $tmp=detect_auth_support
('SMTP',$host,'CRAM-MD5');
1316 if (defined($tmp)) {
1317 if ($tmp eq 'YES') {
1318 print $WHT . "SUPPORTED$NRM\n";
1320 print $WHT . "NOT SUPPORTED$NRM\n";
1323 print $WHT . "ERROR DETECTING$NRM\n";
1327 print "Testing DIGEST-MD5:\t";
1328 $tmp=detect_auth_support
('SMTP',$host,'DIGEST-MD5');
1329 if (defined($tmp)) {
1330 if ($tmp eq 'YES') {
1331 print $WHT . "SUPPORTED$NRM\n";
1333 print $WHT . "NOT SUPPORTED$NRM\n";
1336 print $WHT . "ERROR DETECTING$NRM\n";
1340 print "\nWhat authentication mechanism do you want to use for SMTP connections?\n";
1341 print $WHT . "none" . $NRM . " - Your SMTP server does not require authorization.\n";
1342 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1343 print $WHT . "plain" . $NRM . " - SASL PLAIN. You already know it if you need this.\n";
1344 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext.\n";
1345 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1346 print $WHT . "\n*** YOUR SMTP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n" . $NRM;
1347 print "If you don't understand or are unsure, you probably want \"none\"\n\n";
1348 print "none, login, cram-md5, or digest-md5 [$WHT$smtp_auth_mech$NRM]: $WHT";
1351 if ($inval =~ /^none\b/i) {
1352 # SMTP doesn't necessarily require logins
1355 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) ||
1356 ($inval =~ /^login\b/i) || ($inval =~/^plain\b/i)) {
1359 # user entered garbage, or default value so nothing needs to be set
1360 return $smtp_auth_mech;
1365 # This sub is reused for IMAP and SMTP
1366 # Args: service name, default value
1368 my($default_val,$service,$inval);
1371 print "TLS (Transport Layer Security) encrypts the traffic between server and client.\n";
1372 print "If you're familiar with SSL, you get the idea.\n";
1373 print "To use this feature, your " . $service . " server must offer TLS\n";
1374 print "capability, plus PHP 4.3.x with OpenSSL support.\n";
1375 print "\nIf your " . $service . " server is localhost, you can safely disable this.\n";
1376 print "If it is remote, you may wish to seriously consider enabling this.\n";
1377 print "Enable TLS (y/n) [$WHT";
1378 if ($default_val eq 'true') {
1383 print "$NRM]: $WHT";
1385 $inval =~ tr/yn//cd;
1386 return 'true' if ( $inval eq "y" );
1387 return 'false' if ( $inval eq "n" );
1388 return $default_val;
1391 # $encode_header_key
1393 print "Encryption key allows to hide SquirrelMail Received: headers\n";
1394 print "in outbound messages. Interface uses encryption key to encode\n";
1395 print "username, remote address and proxied address, then stores encoded\n";
1396 print "information in X-Squirrel-* headers.\n";
1398 print "Warning: used encryption function is not bulletproof. When used\n";
1399 print "with static encryption keys, it provides only minimal security\n";
1400 print "measures and information can be decoded quickly.\n";
1402 print "Encoded information can be decoded with decrypt_headers.php script\n";
1403 print "from SquirrelMail contrib/ directory.\n";
1405 print "Enter encryption key: ";
1406 $new_encode_header_key = <STDIN
>;
1407 if ( $new_encode_header_key eq "\n" ) {
1408 $new_encode_header_key = $encode_header_key;
1410 $new_encode_header_key =~ s/[\r\n]//g;
1412 return $new_encode_header_key;
1417 print "\nYou can now create the welcome message that is displayed\n";
1418 print "every time a user logs on. You can use HTML or just plain\n";
1420 "text. If you do not wish to have one, just make it blank.\n\n(Type @ on a blank line to exit)\n";
1426 $line =~ s/[\r\n]//g;
1427 if ( $line ne "@" ) {
1428 $line =~ s/ /\ \ /g;
1429 $line =~ s/\t/\ \ \ \ /g;
1431 $line =~ s/\"/\\\"/g;
1433 $new_motd = $new_motd . $line;
1435 } while ( $line ne "@" );
1439 ################# PLUGINS ###################
1442 $command =~ s/[\s\n\r]*//g;
1443 if ( $command > 0 ) {
1444 $command = $command - 1;
1445 if ( $command <= $#plugins ) {
1448 while ( $ct <= $#plugins ) {
1449 if ( $ct != $command ) {
1450 @newplugins = ( @newplugins, $plugins[$ct] );
1454 @plugins = @newplugins;
1455 } elsif ( $command <= $#plugins + $#unused_plugins + 1 ) {
1456 $num = $command - $#plugins - 1;
1457 @newplugins = @plugins;
1459 while ( $ct <= $#unused_plugins ) {
1460 if ( $ct == $num ) {
1461 @newplugins = ( @newplugins, $unused_plugins[$ct] );
1465 @plugins = @newplugins;
1471 ################# FOLDERS ###################
1473 # default_folder_prefix
1475 print "Some IMAP servers (UW, for example) store mail and folders in\n";
1476 print "your user space in a separate subdirectory. This is where you\n";
1477 print "specify what that directory is.\n";
1479 print "EXAMPLE: mail/";
1481 print "NOTE: If you use Cyrus, or some server that would not use this\n";
1482 print " option, you must set this to 'none'.\n";
1484 print "[$WHT$default_folder_prefix$NRM]: $WHT";
1485 $new_default_folder_prefix = <STDIN
>;
1487 if ( $new_default_folder_prefix eq "\n" ) {
1488 $new_default_folder_prefix = $default_folder_prefix;
1490 $new_default_folder_prefix =~ s/[\r\n]//g;
1492 if ( ( $new_default_folder_prefix =~ /^\s*$/ ) || ( $new_default_folder_prefix =~ m/^none$/i ) ) {
1493 $new_default_folder_prefix = "";
1495 # add the trailing delimiter only if we know what the server is.
1496 if (($imap_server_type eq 'cyrus' and
1497 $optional_delimiter eq 'detect') or
1498 ($imap_server_type eq 'courier' and
1499 $optional_delimiter eq 'detect')) {
1500 $new_default_folder_prefix =~ s/\.*$/\./;
1501 } elsif ($imap_server_type eq 'uw' and
1502 $optional_delimiter eq 'detect') {
1503 $new_default_folder_prefix =~ s/\/*$/\
//;
1506 return $new_default_folder_prefix;
1509 # Show Folder Prefix
1511 print "It is possible to set up the default folder prefix as a user\n";
1512 print "specific option, where each user can specify what their mail\n";
1513 print "folder is. If you set this to false, they will never see the\n";
1514 print "option, but if it is true, this option will appear in the\n";
1515 print "'options' section.\n";
1517 print "NOTE: You set the default folder prefix in option '1' of this\n";
1518 print " section. That will be the default if the user doesn't\n";
1519 print " specify anything different.\n";
1522 if ( lc($show_prefix_option) eq 'true' ) {
1523 $default_value = "y";
1525 $default_value = "n";
1528 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1529 $new_show = <STDIN
>;
1530 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1531 $show_prefix_option = 'true';
1533 $show_prefix_option = 'false';
1535 return $show_prefix_option;
1540 print "You can now specify where the default trash folder is located.\n";
1541 print "On servers where you do not want this, you can set it to anything\n";
1542 print "and set option 6 to false.\n";
1544 print "This is relative to where the rest of your email is kept. You do\n";
1545 print "not need to worry about their mail directory. If this folder\n";
1546 print "would be ~/mail/trash on the filesystem, you only need to specify\n";
1547 print "that this is 'trash', and be sure to put 'mail/' in option 1.\n";
1550 print "[$WHT$trash_folder$NRM]: $WHT";
1551 $new_trash_folder = <STDIN
>;
1552 if ( $new_trash_folder eq "\n" ) {
1553 $new_trash_folder = $trash_folder;
1555 $new_trash_folder =~ s/[\r\n]//g;
1557 return $new_trash_folder;
1562 print "This is where messages that are sent will be stored. SquirrelMail\n";
1563 print "by default puts a copy of all outgoing messages in this folder.\n";
1565 print "This is relative to where the rest of your email is kept. You do\n";
1566 print "not need to worry about their mail directory. If this folder\n";
1567 print "would be ~/mail/sent on the filesystem, you only need to specify\n";
1568 print "that this is 'sent', and be sure to put 'mail/' in option 1.\n";
1571 print "[$WHT$sent_folder$NRM]: $WHT";
1572 $new_sent_folder = <STDIN
>;
1573 if ( $new_sent_folder eq "\n" ) {
1574 $new_sent_folder = $sent_folder;
1576 $new_sent_folder =~ s/[\r\n]//g;
1578 return $new_sent_folder;
1583 print "You can now specify where the default draft folder is located.\n";
1584 print "On servers where you do not want this, you can set it to anything\n";
1585 print "and set option 9 to false.\n";
1587 print "This is relative to where the rest of your email is kept. You do\n";
1588 print "not need to worry about their mail directory. If this folder\n";
1589 print "would be ~/mail/drafts on the filesystem, you only need to specify\n";
1590 print "that this is 'drafts', and be sure to put 'mail/' in option 1.\n";
1593 print "[$WHT$draft_folder$NRM]: $WHT";
1594 $new_draft_folder = <STDIN
>;
1595 if ( $new_draft_folder eq "\n" ) {
1596 $new_draft_folder = $draft_folder;
1598 $new_draft_folder =~ s/[\r\n]//g;
1600 return $new_draft_folder;
1603 # default move to trash
1605 print "By default, should messages get moved to the trash folder? You\n";
1606 print "can specify the default trash folder in option 3. If this is set\n";
1607 print "to false, messages will get deleted immediately without moving\n";
1608 print "to the trash folder.\n";
1610 print "Trash folder is currently: $trash_folder\n";
1613 if ( lc($default_move_to_trash) eq 'true' ) {
1614 $default_value = "y";
1616 $default_value = "n";
1618 print "By default, move to trash (y/n) [$WHT$default_value$NRM]: $WHT";
1619 $new_show = <STDIN
>;
1620 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1621 $default_move_to_trash = 'true';
1623 $default_move_to_trash = 'false';
1625 return $default_move_to_trash;
1628 # default move to sent
1630 print "By default, should messages get moved to the sent folder? You\n";
1631 print "can specify the default sent folder in option 4. If this is set\n";
1632 print "to false, messages will get sent and no copy will be made.\n";
1634 print "Sent folder is currently: $sent_folder\n";
1637 if ( lc($default_move_to_sent) eq 'true' ) {
1638 $default_value = "y";
1640 $default_value = "n";
1642 print "By default, move to sent (y/n) [$WHT$default_value$NRM]: $WHT";
1643 $new_show = <STDIN
>;
1644 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1645 $default_move_to_sent = 'true';
1647 $default_move_to_sent = 'false';
1649 return $default_move_to_sent;
1652 # default save as draft
1654 print "By default, should the save to draft option be shown? You can\n";
1655 print "specify the default drafts folder in option 5. If this is set\n";
1656 print "to false, users will not be shown the save to draft option.\n";
1658 print "Drafts folder is currently: $draft_folder\n";
1661 if ( lc($default_move_to_draft) eq 'true' ) {
1662 $default_value = "y";
1664 $default_value = "n";
1666 print "By default, save as draft (y/n) [$WHT$default_value$NRM]: $WHT";
1667 $new_show = <STDIN
>;
1668 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1669 $default_save_as_draft = 'true';
1671 $default_save_as_draft = 'false';
1673 return $default_save_as_draft;
1676 # List special folders first
1678 print "SquirrelMail has what we call 'special folders' that are not\n";
1679 print "manipulated and viewed like normal folders. Some examples of\n";
1680 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
1681 print "Simply asks if you want these folders listed first in the folder\n";
1685 if ( lc($list_special_folders_first) eq 'true' ) {
1686 $default_value = "y";
1688 $default_value = "n";
1691 print "List first (y/n) [$WHT$default_value$NRM]: $WHT";
1692 $new_show = <STDIN
>;
1693 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1694 $list_special_folders_first = 'true';
1696 $list_special_folders_first = 'false';
1698 return $list_special_folders_first;
1701 # Show special folders color
1703 print "SquirrelMail has what we call 'special folders' that are not\n";
1704 print "manipulated and viewed like normal folders. Some examples of\n";
1705 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
1706 print "wants to know if we should display special folders in a\n";
1707 print "color than the other folders.\n";
1710 if ( lc($use_special_folder_color) eq 'true' ) {
1711 $default_value = "y";
1713 $default_value = "n";
1716 print "Show color (y/n) [$WHT$default_value$NRM]: $WHT";
1717 $new_show = <STDIN
>;
1718 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1719 $use_special_folder_color = 'true';
1721 $use_special_folder_color = 'false';
1723 return $use_special_folder_color;
1728 print "The way that IMAP handles deleting messages is as follows. You\n";
1729 print "mark the message as deleted, and then to 'really' delete it, you\n";
1730 print "expunge it. This option asks if you want to just have messages\n";
1731 print "marked as deleted, or if you want SquirrelMail to expunge the \n";
1732 print "messages too.\n";
1735 if ( lc($auto_expunge) eq 'true' ) {
1736 $default_value = "y";
1738 $default_value = "n";
1740 print "Auto expunge (y/n) [$WHT$default_value$NRM]: $WHT";
1741 $new_show = <STDIN
>;
1742 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1743 $auto_expunge = 'true';
1745 $auto_expunge = 'false';
1747 return $auto_expunge;
1750 # Default sub of inbox
1752 print "Some IMAP servers (Cyrus) have all folders as subfolders of INBOX.\n";
1753 print "This can cause some confusion in folder creation for users when\n";
1754 print "they try to create folders and don't put it as a subfolder of INBOX\n";
1755 print "and get permission errors. This option asks if you want folders\n";
1756 print "to be subfolders of INBOX by default.\n";
1759 if ( lc($default_sub_of_inbox) eq 'true' ) {
1760 $default_value = "y";
1762 $default_value = "n";
1764 print "Default sub of INBOX (y/n) [$WHT$default_value$NRM]: $WHT";
1765 $new_show = <STDIN
>;
1766 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1767 $default_sub_of_inbox = 'true';
1769 $default_sub_of_inbox = 'false';
1771 return $default_sub_of_inbox;
1774 # Show contain subfolder option
1776 print "Some IMAP servers (UW) make it so that there are two types of\n";
1777 print "folders. Those that contain messages, and those that contain\n";
1778 print "subfolders. If this is the case for your server, set this to\n";
1779 print "true, and it will ask the user whether the folder they are\n";
1780 print "creating contains subfolders or messages.\n";
1783 if ( lc($show_contain_subfolders_option) eq 'true' ) {
1784 $default_value = "y";
1786 $default_value = "n";
1788 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1789 $new_show = <STDIN
>;
1790 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1791 $show_contain_subfolders_option = 'true';
1793 $show_contain_subfolders_option = 'false';
1795 return $show_contain_subfolders_option;
1798 # Default Unseen Notify
1800 print "This option specifies where the users will receive notification\n";
1801 print "about unseen messages by default. This is of course an option that\n";
1802 print "can be changed on a user level.\n";
1803 print " 1 = No notification\n";
1804 print " 2 = Only on the INBOX\n";
1805 print " 3 = On all folders\n";
1808 print "Which one should be default (1,2,3)? [$WHT$default_unseen_notify$NRM]: $WHT";
1809 $new_show = <STDIN
>;
1810 if ( $new_show =~ /^[123]\n/i ) {
1811 $default_unseen_notify = $new_show;
1813 $default_unseen_notify =~ s/[\r\n]//g;
1814 return $default_unseen_notify;
1817 # Default Unseen Type
1819 print "Here you can define the default way that unseen messages will be displayed\n";
1820 print "to the user in the folder listing on the left side.\n";
1821 print " 1 = Only unseen messages (4)\n";
1822 print " 2 = Unseen and Total messages (4/27)\n";
1825 print "Which one should be default (1,2)? [$WHT$default_unseen_type$NRM]: $WHT";
1826 $new_show = <STDIN
>;
1827 if ( $new_show =~ /^[12]\n/i ) {
1828 $default_unseen_type = $new_show;
1830 $default_unseen_type =~ s/[\r\n]//g;
1831 return $default_unseen_type;
1834 # Auto create special folders
1836 print "Would you like the Sent, Trash, and Drafts folders to be created\n";
1837 print "automatically print for you when a user logs in? If the user\n";
1838 print "accidentally deletes their special folders, this option will\n";
1839 print "automatically create it again for them.\n";
1842 if ( lc($auto_create_special) eq 'true' ) {
1843 $default_value = "y";
1845 $default_value = "n";
1847 print "Auto create special folders? (y/n) [$WHT$default_value$NRM]: $WHT";
1848 $new_show = <STDIN
>;
1849 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1850 $auto_create_special = 'true';
1852 $auto_create_special = 'false';
1854 return $auto_create_special;
1857 # Automatically delete folders
1859 if ( $imap_server_type eq "uw" ) {
1860 print "UW IMAP servers will not allow folders containing mail to also contain folders.\n";
1861 print "Deleting folders will bypass the trash folder and be immediately deleted\n\n";
1862 print "If this is not the correct value for your server,\n";
1863 print "please use option D on the Main Menu to configure your server correctly.\n\n";
1864 print "Press any key to continue...\n";
1865 $new_delete = <STDIN
>;
1866 $delete_folder = 'true';
1868 if ( $imap_server_type eq "courier" ) {
1869 print "Courier (or Courier-IMAP) IMAP servers may not support ";
1870 print "subfolders of Trash. \n";
1871 print "Specifically, if Courier is set to always move messages to Trash, \n";
1872 print "Trash will be treated by Courier as a special folder that does not \n";
1873 print "allow subfolders. \n\n";
1874 print "Please verify your Courier configuration, and test folder deletion \n";
1875 print "when changing this setting.\n\n";
1878 print "Are subfolders of the Trash supported by your IMAP server?\n";
1879 print "If so, should deleted folders be sent to Trash?\n";
1880 print "If not, say no (deleted folders should not be sent to Trash)\n\n";
1881 # reversal of logic.
1882 # question was: Should folders be automatically deleted instead of sent to trash..
1883 # we've changed the question to make it more clear,
1884 # and are here handling that to avoid changing the answers..
1885 if ( lc($delete_folder) eq 'true' ) {
1886 $default_value = "n";
1888 $default_value = "y";
1890 print "Send deleted folders to Trash? (y/n) [$WHT$default_value$NRM]: $WHT";
1891 $new_delete = <STDIN
>;
1892 if ( ( $new_delete =~ /^y\n/i ) || ( ( $new_delete =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1893 $delete_folder = 'false';
1895 $delete_folder = 'true';
1898 return $delete_folder;
1903 print "Some IMAP server allow subfolders to exist even if the parent\n";
1904 print "folders do not. This fixes some problems with the folder list\n";
1905 print "when this is the case, causing the /NoSelect folders to be displayed\n";
1908 if ( lc($noselect_fix_enable) eq 'true' ) {
1909 $default_value = "y";
1911 $default_value = "n";
1913 print "enable noselect fix? (y/n) [$WHT$noselect_fix_enable$NRM]: $WHT";
1914 $noselect_fix_enable = <STDIN
>;
1915 if ( ( $noselect_fix_enable =~ /^y\n/i ) || ( ( $noselect_fix_enable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1916 $noselect_fix_enable = 'true';
1918 $noselect_fix_enable = 'false';
1920 return $noselect_fix_enable;
1922 ############# GENERAL OPTIONS #####################
1926 print "Specify the location for your data directory.\n";
1927 print "You need to create this directory yourself.\n";
1928 print "The path name can be absolute or relative (to the config directory).\n";
1929 print "Here are two examples:\n";
1930 print " Absolute: /var/local/squirrelmail/data/\n";
1931 print " Relative: ../data/\n";
1932 print "Relative paths to directories outside of the SquirrelMail distribution\n";
1933 print "will be converted to their absolute path equivalents in config.php.\n\n";
1934 print "Note: There are potential security risks with having a writeable directory\n";
1935 print "under the web server's root directory (ex: /home/httpd/html).\n";
1936 print "For this reason, it is recommended to put the data directory\n";
1937 print "in an alternate location of your choice. \n";
1940 print "[$WHT$data_dir$NRM]: $WHT";
1941 $new_data_dir = <STDIN
>;
1942 if ( $new_data_dir eq "\n" ) {
1943 $new_data_dir = $data_dir;
1945 $new_data_dir =~ s/[\r\n]//g;
1947 if ( $new_data_dir =~ /^\s*$/ ) {
1950 $new_data_dir =~ s/\/*$//g
;
1951 $new_data_dir =~ s/$/\//g
;
1953 return $new_data_dir;
1956 # Attachment directory
1958 print "Path to directory used for storing attachments while a mail is\n";
1959 print "being composed. The path name can be absolute or relative (to the\n";
1960 print "config directory). Here are two examples:\n";
1961 print " Absolute: /var/local/squirrelmail/attach/\n";
1962 print " Relative: ../attach/\n";
1963 print "Relative paths to directories outside of the SquirrelMail distribution\n";
1964 print "will be converted to their absolute path equivalents in config.php.\n\n";
1965 print "Note: There are a few security considerations regarding this\n";
1966 print "directory:\n";
1967 print " 1. It should have the permission 733 (rwx-wx-wx) to make it\n";
1968 print " impossible for a random person with access to the webserver\n";
1969 print " to list files in this directory. Confidential data might\n";
1970 print " be laying around in there.\n";
1971 print " Depending on your user:group assignments, 730 (rwx-wx---)\n";
1972 print " may be possible, and more secure (e.g. root:apache)\n";
1973 print " 2. Since the webserver is not able to list the files in the\n";
1974 print " content is also impossible for the webserver to delete files\n";
1975 print " lying around there for too long.\n";
1976 print " 3. It should probably be another directory than the data\n";
1977 print " directory specified in option 3.\n";
1980 print "[$WHT$attachment_dir$NRM]: $WHT";
1981 $new_attachment_dir = <STDIN
>;
1982 if ( $new_attachment_dir eq "\n" ) {
1983 $new_attachment_dir = $attachment_dir;
1985 $new_attachment_dir =~ s/[\r\n]//g;
1987 if ( $new_attachment_dir =~ /^\s*$/ ) {
1988 $new_attachment_dir = "";
1990 $new_attachment_dir =~ s/\/*$//g
;
1991 $new_attachment_dir =~ s/$/\//g
;
1993 return $new_attachment_dir;
1997 print "The directory hash level setting allows you to configure the level\n";
1998 print "of hashing that SquirrelMail employs in your data and attachment\n";
1999 print "directories. This value must be an integer ranging from 0 to 4.\n";
2000 print "When this value is set to 0, SquirrelMail will simply store all\n";
2001 print "files as normal in the data and attachment directories. However,\n";
2002 print "when set to a value from 1 to 4, a simple hashing scheme will be\n";
2003 print "used to organize the files in this directory. In short, the crc32\n";
2004 print "value for a username will be computed. Then, up to the first 4\n";
2005 print "digits of the hash, as set by this configuration value, will be\n";
2006 print "used to directory hash the files for that user in the data and\n";
2007 print "attachment directory. This allows for better performance on\n";
2008 print "servers with larger numbers of users.\n";
2011 print "[$WHT$dir_hash_level$NRM]: $WHT";
2012 $new_dir_hash_level = <STDIN
>;
2013 if ( $new_dir_hash_level eq "\n" ) {
2014 $new_dir_hash_level = $dir_hash_level;
2016 $new_dir_hash_level =~ s/[\r\n]//g;
2018 if ( ( int($new_dir_hash_level) < 0 )
2019 || ( int($new_dir_hash_level) > 4 )
2020 || !( int($new_dir_hash_level) eq $new_dir_hash_level ) ) {
2021 print "Invalid Directory Hash Level.\n";
2022 print "Value must be an integer ranging from 0 to 4\n";
2023 print "Hit enter to continue.\n";
2024 $enter_key = <STDIN
>;
2026 $new_dir_hash_level = $dir_hash_level;
2029 return $new_dir_hash_level;
2033 print "This is the default size (in pixels) of the left folder list.\n";
2034 print "Default is 200, but you can set it to whatever you wish. This\n";
2035 print "is a user preference, so this will only show up as their default.\n";
2037 print "[$WHT$default_left_size$NRM]: $WHT";
2038 $new_default_left_size = <STDIN
>;
2039 if ( $new_default_left_size eq "\n" ) {
2040 $new_default_left_size = $default_left_size;
2042 $new_default_left_size =~ s/[\r\n]//g;
2044 return $new_default_left_size;
2048 print "Some IMAP servers only have lowercase letters in the usernames\n";
2049 print "but they still allow people with uppercase to log in. This\n";
2050 print "causes a problem with the user's preference files. This option\n";
2051 print "transparently changes all usernames to lowercase.";
2054 if ( lc($force_username_lowercase) eq 'true' ) {
2055 $default_value = "y";
2057 $default_value = "n";
2059 print "Convert usernames to lowercase (y/n) [$WHT$default_value$NRM]: $WHT";
2060 $new_show = <STDIN
>;
2061 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2071 if ( lc($default_use_priority) eq 'true' ) {
2072 $default_value = "y";
2074 $default_value = "n";
2077 print "Allow users to specify priority of outgoing mail (y/n) [$WHT$default_value$NRM]: $WHT";
2078 $new_show = <STDIN
>;
2079 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2089 if ( lc($default_hide_attribution) eq 'true' ) {
2090 $default_value = "y";
2092 $default_value = "n";
2095 print "Hide SM attributions (y/n) [$WHT$default_value$NRM]: $WHT";
2096 $new_show = <STDIN
>;
2097 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2107 if ( lc($default_use_mdn) eq 'true' ) {
2108 $default_value = "y";
2110 $default_value = "n";
2113 print "Enable support for read/delivery receipt support (y/n) [$WHT$default_value$NRM]: $WHT";
2114 $new_show = <STDIN
>;
2115 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2123 print " In loosely managed environments, you may want to allow users
2124 to edit their full name and email address. In strictly managed
2125 environments, you may want to force users to use the name
2126 and email address assigned to them.
2128 'y' - allow a user to edit their full name and email address,
2129 'n' - users must use the assigned values.
2133 if ( lc($edit_identity) eq 'true' ) {
2134 $default_value = "y";
2136 $default_value = "n";
2138 print "Allow editing of user's identity? (y/n) [$WHT$default_value$NRM]: $WHT";
2139 $new_edit = <STDIN
>;
2140 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2141 $edit_identity = 'true';
2142 $edit_name = 'true';
2143 $hide_auth_header = command311b
();
2145 $edit_identity = 'false';
2146 $edit_name = command311
();
2147 $hide_auth_header = command311b
();
2149 return $edit_identity;
2153 print " Given that users are not allowed to modify their
2154 email address, can they edit their full name?
2158 if ( lc($edit_name) eq 'true' ) {
2159 $default_value = "y";
2161 $default_value = "n";
2163 print "Allow the user to edit their full name? (y/n) [$WHT$default_value$NRM]: $WHT";
2164 $new_edit = <STDIN
>;
2165 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2166 $edit_name = 'true';
2168 $edit_name = 'false';
2174 print " SquirrelMail adds username information to every sent email
2175 in order to prevent possible sender forging when users are allowed
2176 to change their email and/or full name.
2178 You can remove user information from this header (y), if you think that
2179 it violates privacy or security.
2181 Note: If users are allowed to change their email addresses,
2182 this setting will make it difficult to determine who sent what where.
2183 Use at your own risk.
2187 if ( lc($hide_auth_header) eq "true" ) {
2188 $default_value = "y";
2190 $default_value = "n";
2192 print "Remove username from email headers? (y/n) [$WHT$default_value$NRM]: $WHT";
2193 $new_header = <STDIN
>;
2194 if ( ( $new_header =~ /^y\n/i ) || ( ( $new_header =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2195 $hide_auth_header = "true";
2197 $hide_auth_header = "false";
2199 return $hide_auth_header;
2203 print "This option allows you to choose if users can use thread sorting\n";
2204 print "Your IMAP server must support the THREAD command for this to work\n";
2205 print "PHP versions later than 4.0.3 recommended\n";
2208 if ( lc($allow_thread_sort) eq 'true' ) {
2209 $default_value = "y";
2211 $default_value = "n";
2213 print "Allow server side thread sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2214 $allow_thread_sort = <STDIN
>;
2215 if ( ( $allow_thread_sort =~ /^y\n/i ) || ( ( $allow_thread_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2216 $allow_thread_sort = 'true';
2218 $allow_thread_sort = 'false';
2220 return $allow_thread_sort;
2224 print "This option allows you to choose if SM uses server-side sorting\n";
2225 print "Your IMAP server must support the SORT command for this to work\n";
2228 if ( lc($allow_server_sort) eq 'true' ) {
2229 $default_value = "y";
2231 $default_value = "n";
2233 print "Allow server-side sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2234 $allow_server_sort = <STDIN
>;
2235 if ( ( $allow_server_sort =~ /^y\n/i ) || ( ( $allow_server_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2236 $allow_server_sort = 'true';
2238 $allow_server_sort = 'false';
2240 return $allow_server_sort;
2244 print "This option allows you to choose if SM uses charset search\n";
2245 print "Your IMAP server must support the SEARCH CHARSET command for this to work\n";
2248 if ( lc($allow_charset_search) eq 'true' ) {
2249 $default_value = "y";
2251 $default_value = "n";
2253 print "Allow charset searching? (y/n) [$WHT$default_value$NRM]: $WHT";
2254 $allow_charset_search = <STDIN
>;
2255 if ( ( $allow_charset_search =~ /^y\n/i ) || ( ( $allow_charset_search =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2256 $allow_charset_search = 'true';
2258 $allow_charset_search = 'false';
2260 return $allow_charset_search;
2263 # command315 (UID support) obsoleted.
2265 # advanced search option
2267 print "This option allows you to control the use of advanced search form.\n";
2268 print " 0 = enable basic search only\n";
2269 print " 1 = enable advanced search only\n";
2270 print " 2 = enable both\n";
2273 print "Allowed search (0,1,2)? [$WHT$allow_advanced_search$NRM]: $WHT";
2274 $new_allow_advanced_search = <STDIN
>;
2275 if ( $new_allow_advanced_search =~ /^[012]\n/i ) {
2276 $allow_advanced_search = $new_allow_advanced_search;
2278 $allow_advanced_search =~ s/[\r\n]//g;
2279 return $allow_advanced_search;
2284 print "This option allows you to change the name of the PHP session used\n";
2285 print "by SquirrelMail. Unless you know what you are doing, you probably\n";
2286 print "don't need or want to change this from the default of SQMSESSID.\n";
2287 print "[$WHT$session_name$NRM]: $WHT";
2288 $new_session_name = <STDIN
>;
2289 chomp($new_session_name);
2290 if ( $new_session_name eq "" ) {
2291 $new_session_name = $session_name;
2293 return $new_session_name;
2296 # time zone config (since 1.5.1)
2298 print "This option allows you to control the use of time zones.\n";
2299 print " 0 = (default) standard, GNU C time zone names\n";
2300 print " 1 = strict, generic time zone codes with offsets\n";
2301 print " 2 = custom, GNU C time zones loaded from config/timezones.php\n";
2302 print " 3 = custom strict, generic time zone codes with offsets loaded \n";
2303 print " from config/timezones.php\n";
2304 print "See SquirrelMail documentation about format of config/timezones.php file.\n";
2307 print "Used time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT";
2308 $new_time_zone_type = <STDIN
>;
2309 if ( $new_time_zone_type =~ /^[0123]\n/i ) {
2310 $time_zone_type = $new_time_zone_type;
2312 print "\nInvalid configuration value.\n";
2313 print "\nPress enter to continue...";
2316 $time_zone_type =~ s/[\r\n]//g;
2317 return $time_zone_type;
2322 print "\nDefine the themes that you wish to use. If you have added ";
2323 print "a theme of your own, just follow the instructions (?) about how to add ";
2324 print "them. You can also change the default theme.\n";
2325 print "[theme] command (?=help) > ";
2327 $input =~ s/[\r\n]//g;
2328 while ( $input ne "d" ) {
2329 if ( $input =~ /^\s*l\s*/i ) {
2331 while ( $count <= $#theme_name ) {
2332 if ( $count == $theme_default ) {
2337 if ( $count < 10 ) {
2340 $name = $theme_name[$count];
2341 $num_spaces = 35 - length($name);
2342 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2343 $name = $name . " ";
2346 print " $count. $name";
2347 print "($theme_path[$count])\n";
2351 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
2352 $old_def = $theme_default;
2353 $theme_default = $input;
2354 $theme_default =~ s/^\s*m\s*//;
2355 if ( ( $theme_default > $#theme_name ) || ( $theme_default < 0 ) ) {
2356 print "Cannot set default theme to $theme_default. That theme does not exist.\n";
2357 $theme_default = $old_def;
2359 } elsif ( $input =~ /^\s*\+/ ) {
2360 print "What is the name of this theme: ";
2362 $name =~ s/[\r\n]//g;
2363 $theme_name[ $#theme_name + 1 ] = $name;
2364 print "Be sure to put ../themes/ before the filename.\n";
2365 print "What file is this stored in (ex: ../themes/default_theme.php): ";
2367 $name =~ s/[\r\n]//g;
2368 $theme_path[ $#theme_path + 1 ] = $name;
2369 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
2370 if ( $input =~ /[0-9]+\s*$/ ) {
2372 $rem_num =~ s/^\s*-\s*//g;
2373 $rem_num =~ s/\s*$//;
2375 $rem_num = $#theme_name;
2377 if ( $rem_num == $theme_default ) {
2378 print "You cannot remove the default theme!\n";
2381 @new_theme_name = ();
2382 @new_theme_path = ();
2383 while ( $count <= $#theme_name ) {
2384 if ( $count != $rem_num ) {
2385 @new_theme_name = ( @new_theme_name, $theme_name[$count] );
2386 @new_theme_path = ( @new_theme_path, $theme_path[$count] );
2390 @theme_name = @new_theme_name;
2391 @theme_path = @new_theme_path;
2392 if ( $theme_default > $rem_num ) {
2396 } elsif ( $input =~ /^\s*t\s*/i ) {
2397 print "\nStarting detection...\n\n";
2399 opendir( DIR
, "../themes" );
2400 @files = grep { /\.php$/i } readdir(DIR
);
2402 while ( $cnt <= $#files ) {
2403 $filename = "../themes/" . $files[$cnt];
2404 if ( $filename ne "../themes/index.php" ) {
2406 for ( $x = 0 ; $x <= $#theme_path ; $x++ ) {
2407 if ( $theme_path[$x] eq $filename ) {
2411 if ( $found != 1 ) {
2412 print "** Found theme: $filename\n";
2413 print " What is its name? ";
2416 $theme_name[ $#theme_name + 1 ] = $nm;
2417 $theme_path[ $#theme_path + 1 ] = $filename;
2423 for ( $cnt = 0 ; $cnt <= $#theme_path ; $cnt++ ) {
2424 $filename = $theme_path[$cnt];
2425 if ( !( -e
$filename ) ) {
2426 print " Removing $filename (file not found)\n";
2428 @new_theme_name = ();
2429 @new_theme_path = ();
2430 for ( $x = 0 ; $x < $#theme_path ; $x++ ) {
2431 if ( $theme_path[$x] eq $filename ) {
2434 if ( $offset == 1 ) {
2435 $new_theme_name[$x] = $theme_name[ $x + 1 ];
2436 $new_theme_path[$x] = $theme_path[ $x + 1 ];
2438 $new_theme_name[$x] = $theme_name[$x];
2439 $new_theme_path[$x] = $theme_path[$x];
2442 @theme_name = @new_theme_name;
2443 @theme_path = @new_theme_path;
2446 print "\nDetection complete!\n\n";
2449 } elsif ( $input =~ /^\s*\?\s*/ ) {
2450 print ".-------------------------.\n";
2451 print "| t (detect themes) |\n";
2452 print "| + (add theme) |\n";
2453 print "| - N (remove theme) |\n";
2454 print "| m N (mark default) |\n";
2455 print "| l (list themes) |\n";
2456 print "| d (done) |\n";
2457 print "`-------------------------'\n";
2459 print "[theme] command (?=help) > ";
2461 $input =~ s/[\r\n]//g;
2467 print "You may specify a cascading style-sheet (CSS) file to be included\n";
2468 print "on each html page generated by SquirrelMail. The CSS file is useful\n";
2469 print "for specifying a site-wide font. If you're not familiar with CSS\n";
2470 print "files, leave this blank.\n";
2472 print "To clear out an existing value, just type a space for the input.\n";
2474 print "Please be aware of the following: \n";
2475 print " - Relative URLs are relative to the config dir\n";
2476 print " to use the themes directory, use ../themes/css/newdefault.css\n";
2477 print " - To specify a css file defined outside the SquirrelMail source tree\n";
2478 print " use the absolute URL the webserver would use to include the file\n";
2479 print " e.g. http://some.host.com/css/mystyle.css or /css/mystyle.css\n";
2481 print "[$WHT$theme_css$NRM]: $WHT";
2482 $new_theme_css = <STDIN
>;
2484 if ( $new_theme_css eq "\n" ) {
2485 $new_theme_css = $theme_css;
2487 $new_theme_css =~ s/[\r\n]//g;
2489 $new_theme_css =~ s/^\s*//;
2490 return $new_theme_css;
2494 print "You can now define different LDAP servers.\n";
2495 print "[ldap] command (?=help) > ";
2497 $input =~ s/[\r\n]//g;
2498 while ( $input ne "d" ) {
2499 if ( $input =~ /^\s*l\s*/i ) {
2501 while ( $count <= $#ldap_host ) {
2502 print "$count. $ldap_host[$count]\n";
2503 print " base: $ldap_base[$count]\n";
2504 if ( $ldap_charset[$count] ) {
2505 print " charset: $ldap_charset[$count]\n";
2507 if ( $ldap_port[$count] ) {
2508 print " port: $ldap_port[$count]\n";
2510 if ( $ldap_name[$count] ) {
2511 print " name: $ldap_name[$count]\n";
2513 if ( $ldap_maxrows[$count] ) {
2514 print " maxrows: $ldap_maxrows[$count]\n";
2516 if ( $ldap_filter[$count] ) {
2517 print " filter: $ldap_filter[$count]\n";
2519 if ( $ldap_binddn[$count] ) {
2520 print " binddn: $ldap_binddn[$count]\n";
2521 if ( $ldap_bindpw[$count] ) {
2522 print " bindpw: $ldap_bindpw[$count]\n";
2525 if ( $ldap_protocol[$count] ) {
2526 print " protocol: $ldap_protocol[$count]\n";
2528 if ( $ldap_limit_scope[$count] ) {
2529 print " limit_scope: $ldap_limit_scope[$count]\n";
2531 if ( $ldap_listing[$count] ) {
2532 print " listing: $ldap_listing[$count]\n";
2534 if ( $ldap_search_tree[$count] ) {
2535 print " search_tree: $ldap_search_tree[$count]\n";
2537 if ( $ldap_starttls[$count] ) {
2538 print " starttls: $ldap_starttls[$count]\n";
2544 } elsif ( $input =~ /^\s*\+/ ) {
2545 $sub = $#ldap_host + 1;
2547 print "First, we need to have the hostname or the IP address where\n";
2548 print "this LDAP server resides. Example: ldap.bigfoot.com\n";
2551 $name =~ s/[\r\n]//g;
2552 $ldap_host[$sub] = $name;
2556 print "Next, we need the server root (base dn). For this, an empty\n";
2557 print "string is allowed.\n";
2558 print "Example: ou=member_directory,o=netcenter.com\n";
2561 $name =~ s/[\r\n]//g;
2562 $ldap_base[$sub] = $name;
2566 print "This is the TCP/IP port number for the LDAP server. Default\n";
2567 print "port is 389. This is optional. Press ENTER for default.\n";
2570 $name =~ s/[\r\n]//g;
2571 $ldap_port[$sub] = $name;
2575 print "This is the charset for the server. Default is utf-8. This\n";
2576 print "is also optional. Press ENTER for default.\n";
2579 $name =~ s/[\r\n]//g;
2580 $ldap_charset[$sub] = $name;
2584 print "This is the name for the server, used to tag the results of\n";
2585 print "the search. Default it \"LDAP: hostname\". Press ENTER for default\n";
2588 $name =~ s/[\r\n]//g;
2589 $ldap_name[$sub] = $name;
2593 print "You can specify the maximum number of rows in the search result.\n";
2594 print "Default value is equal to 250 rows. Press ENTER for default.\n";
2597 $name =~ s/[\r\n]//g;
2598 $ldap_maxrows[$sub] = $name;
2603 print "If your LDAP server does not like anonymous logins, you can specify bind DN.\n";
2604 print "Default is none, anonymous bind. Press ENTER for default.\n";
2607 $name =~ s/[\r\n]//g;
2608 $ldap_binddn[$sub] = $name;
2612 if ( $ldap_binddn[$sub] ne '' ) {
2614 print "Now, please specify password for that DN.\n";
2617 $name =~ s/[\r\n]//g;
2618 $ldap_bindpw[$sub] = $name;
2623 print "You can specify bind protocol version here.\n";
2624 print "Default protocol version depends on your php ldap settings.\n";
2625 print "Press ENTER for default.\n";
2628 $name =~ s/[\r\n]//g;
2629 $ldap_protocol[$sub] = $name;
2633 print "This configuration section allows to set some rarely used\n";
2634 print "options and options specific to some LDAP implementations.\n";
2636 print "Do you want to set advanced LDAP directory settings? (y/N):";
2637 $ldap_advanced_settings = <STDIN
>;
2638 if ( $ldap_advanced_settings =~ /^y\n/i ) {
2639 $ldap_advanced_settings = 'true';
2641 $ldap_advanced_settings = 'false';
2644 if ($ldap_advanced_settings eq 'true') {
2647 print "You can control LDAP directory listing here. This option can\n";
2648 print "be useful if you run small LDAP server and want to provide listing\n";
2649 print "of all addresses stored in LDAP to users of webmail interface.\n";
2650 print "Number of displayed entries is limited by maxrows setting.\n";
2652 print "Don't enable this option for public LDAP directories.\n";
2653 print "This feature is experimental.\n";
2655 print "Allow listing of LDAP directory? (y/N):";
2657 if ( $name =~ /^y\n/i ) {
2662 $ldap_listing[$sub] = $name;
2666 print "You can specify an additional search filter.\n";
2667 print "This could be something like \"(objectclass=posixAccount)\".\n";
2668 print "No filtering is performed by default. Press ENTER for default.\n";
2671 $name =~ s/[\r|\n]//g;
2672 $ldap_filter[$sub] = $name;
2676 print "You can control search scope here.\n";
2677 print "This option is specific to Microsoft ADS implementation.\n";
2678 print "It requires use of v3 or newer LDAP protocol.\n";
2679 print "Don't enable it, if you use other LDAP server.\n";
2681 print "Limit ldap scope? (y/N):";
2683 if ( $name =~ /^y\n/i ) {
2688 $ldap_limit_scope[$sub] = $name;
2692 print "You can control ldap search type here.\n";
2693 print "Addresses can be searched in entire LDAP subtree (default)\n";
2694 print "or only first level entries are returned.\n";
2696 print "Search entire LDAP subtree? (Y/n):";
2698 if ( $name =~ /^n\n/i ) {
2703 $ldap_search_tree[$sub] = $name;
2707 print "You can control use of StartTLS on LDAP connection here.\n";
2708 print "This option requires use of v3 or newer LDAP protocol and php 4.2+.\n";
2710 print "Use StartTLS? (y/N):";
2712 if ( $name =~ /^y\n/i ) {
2717 $ldap_starttls[$sub] = $name;
2721 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
2722 if ( $input =~ /[0-9]+\s*$/ ) {
2724 $rem_num =~ s/^\s*-\s*//g;
2725 $rem_num =~ s/\s*$//;
2727 $rem_num = $#ldap_host;
2730 @new_ldap_host = ();
2731 @new_ldap_base = ();
2732 @new_ldap_port = ();
2733 @new_ldap_name = ();
2734 @new_ldap_charset = ();
2735 @new_ldap_maxrows = ();
2736 @new_ldap_filter = ();
2737 @new_ldap_bindpw = ();
2738 @new_ldap_binddn = ();
2739 @new_ldap_protocol = ();
2740 @new_ldap_limit_scope = ();
2741 @new_ldap_listing = ();
2742 @new_ldap_search_tree = ();
2743 @new_ldap_starttls = ();
2745 while ( $count <= $#ldap_host ) {
2746 if ( $count != $rem_num ) {
2747 @new_ldap_host = ( @new_ldap_host, $ldap_host[$count] );
2748 @new_ldap_base = ( @new_ldap_base, $ldap_base[$count] );
2749 @new_ldap_port = ( @new_ldap_port, $ldap_port[$count] );
2750 @new_ldap_name = ( @new_ldap_name, $ldap_name[$count] );
2751 @new_ldap_charset = ( @new_ldap_charset, $ldap_charset[$count] );
2752 @new_ldap_maxrows = ( @new_ldap_maxrows, $ldap_maxrows[$count] );
2753 @new_ldap_filter = ( @new_ldap_filter, $ldap_filter[$count] );
2754 @new_ldap_binddn = ( @new_ldap_binddn, $ldap_binddn[$count] );
2755 @new_ldap_bindpw = ( @new_ldap_bindpw, $ldap_bindpw[$count] );
2756 @new_ldap_protocol = ( @new_ldap_protocol, $ldap_protocol[$count] );
2757 @new_ldap_limit_scope = ( @new_ldap_limit_scope, $ldap_limit_scope[$count] );
2758 @new_ldap_listing = ( @new_ldap_listing, $ldap_listing[$count] );
2759 @new_ldap_search_tree = ( @new_ldap_search_tree, $ldap_search_tree[$count] );
2760 @new_ldap_starttls = ( @new_ldap_starttls, $ldap_starttls[$count] );
2764 @ldap_host = @new_ldap_host;
2765 @ldap_base = @new_ldap_base;
2766 @ldap_port = @new_ldap_port;
2767 @ldap_name = @new_ldap_name;
2768 @ldap_charset = @new_ldap_charset;
2769 @ldap_maxrows = @new_ldap_maxrows;
2770 @ldap_filter = @new_ldap_filter;
2771 @ldap_binddn = @new_ldap_binddn;
2772 @ldap_bindpw = @new_ldap_bindpw;
2773 @ldap_protocol = @new_ldap_protocol;
2774 @ldap_limit_scope = @new_ldap_limit_scope;
2775 @ldap_listing = @new_ldap_listing;
2776 @ldap_search_tree = @new_ldap_search_tree;
2777 @ldap_starttls = @new_ldap_starttls;
2779 } elsif ( $input =~ /^\s*\?\s*/ ) {
2780 print ".-------------------------.\n";
2781 print "| + (add host) |\n";
2782 print "| - N (remove host) |\n";
2783 print "| l (list hosts) |\n";
2784 print "| d (done) |\n";
2785 print "`-------------------------'\n";
2787 print "[ldap] command (?=help) > ";
2789 $input =~ s/[\r\n]//g;
2794 print "Some of our developers have come up with very good javascript interface\n";
2795 print "for searching through address books, however, our original goals said\n";
2796 print "that we would be 100% HTML. In order to make it possible to use their\n";
2797 print "interface, and yet stick with our goals, we have also written a plain\n";
2798 print "HTML version of the search. Here, you can choose which version to use.\n";
2800 print "This is just the default value. It is also a user option that each\n";
2801 print "user can configure individually\n";
2804 if ( lc($default_use_javascript_addr_book) eq 'true' ) {
2805 $default_value = "y";
2807 $default_use_javascript_addr_book = 'false';
2808 $default_value = "n";
2810 print "Use javascript version by default (y/n) [$WHT$default_value$NRM]: $WHT";
2811 $new_show = <STDIN
>;
2812 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2813 $default_use_javascript_addr_book = 'true';
2815 $default_use_javascript_addr_book = 'false';
2817 return $default_use_javascript_addr_book;
2820 # global filebased address book
2822 print "If you want to use global file address book, then you\n";
2823 print "must set this option to a valid value. If option does\n";
2824 print "not have path elements, system assumes that file is\n";
2825 print "stored in data directory. If relative path is set, it is\n";
2826 print "relative to main SquirrelMail directory. If value is empty,\n";
2827 print "address book is not enabled.\n";
2830 print "[$WHT$abook_global_file$NRM]: $WHT";
2831 $new_abook_global_file = <STDIN
>;
2832 if ( $new_abook_global_file eq "\n" ) {
2833 $new_abook_global_file = $abook_global_file;
2835 $new_abook_global_file =~ s/[\r\n]//g;
2837 return $new_abook_global_file;
2840 # writing into global filebased abook control
2842 print "This setting controls writing into global file address\n";
2843 print "book options. Address book file must be writeable by\n";
2844 print "webserver's user, if you want to enable this option.\n";
2847 if ( lc($abook_global_file_writeable) eq 'true' ) {
2848 $default_value = "y";
2850 $abook_global_file_writeable = 'false';
2851 $default_value = "n";
2853 print "Allow writing into global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
2854 $new_show = <STDIN
>;
2855 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2856 $abook_global_file_writeable = 'true';
2858 $abook_global_file_writeable = 'false';
2860 return $abook_global_file_writeable;
2863 # listing of global filebased abook control
2865 print "This setting controls listing of global file address\n";
2866 print "book in addresses page.\n";
2869 if ( lc($abook_global_file_listing) eq 'true' ) {
2870 $default_value = "y";
2872 $abook_global_file_listing = 'false';
2873 $default_value = "n";
2875 print "Allow listing of global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
2876 $new_show = <STDIN
>;
2877 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2878 $abook_global_file_listing = 'true';
2880 $abook_global_file_listing = 'false';
2882 return $abook_global_file_listing;
2886 print "If you want to store your users address book details in a database then\n";
2887 print "you need to set this DSN to a valid value. The format for this is:\n";
2888 print "mysql://user:pass\@hostname/dbname\n";
2889 print "Where mysql can be one of the databases PHP supports, the most common\n";
2890 print "of these are mysql, msql and pgsql\n";
2891 print "If the DSN is left empty (hit space and then return) the database\n";
2892 print "related code for address books will not be used\n";
2895 if ( $addrbook_dsn eq "" ) {
2896 $default_value = "Disabled";
2898 $default_value = $addrbook_dsn;
2900 print "[$WHT$addrbook_dsn$NRM]: $WHT";
2902 if ( $new_dsn eq "\n" ) {
2905 $new_dsn =~ s/[\r\n]//g;
2906 $new_dsn =~ s/^\s+$//g;
2912 print "This is the name of the table you want to store the address book\n";
2913 print "data in, it defaults to 'address'\n";
2915 print "[$WHT$addrbook_table$NRM]: $WHT";
2916 $new_table = <STDIN
>;
2917 if ( $new_table eq "\n" ) {
2918 $new_table = $addrbook_table;
2920 $new_table =~ s/[\r\n]//g;
2926 print "If you want to store your users preferences in a database then\n";
2927 print "you need to set this DSN to a valid value. The format for this is:\n";
2928 print "mysql://user:pass\@hostname/dbname\n";
2929 print "Where mysql can be one of the databases PHP supports, the most common\n";
2930 print "of these are mysql, msql and pgsql\n";
2931 print "If the DSN is left empty (hit space and then return) the database\n";
2932 print "related code for address books will not be used\n";
2935 if ( $prefs_dsn eq "" ) {
2936 $default_value = "Disabled";
2938 $default_value = $prefs_dsn;
2940 print "[$WHT$prefs_dsn$NRM]: $WHT";
2942 if ( $new_dsn eq "\n" ) {
2945 $new_dsn =~ s/[\r\n]//g;
2946 $new_dsn =~ s/^\s+$//g;
2952 print "This is the name of the table you want to store the preferences\n";
2953 print "data in, it defaults to 'userprefs'\n";
2955 print "[$WHT$prefs_table$NRM]: $WHT";
2956 $new_table = <STDIN
>;
2957 if ( $new_table eq "\n" ) {
2958 $new_table = $prefs_table;
2960 $new_table =~ s/[\r\n]//g;
2966 print "This is the name of the field in which you want to store the\n";
2967 print "username of the person the prefs are for. It default to 'user'\n";
2968 print "which clashes with a reserved keyword in PostgreSQL so this\n";
2969 print "will need to be changed for that database at least\n";
2971 print "[$WHT$prefs_user_field$NRM]: $WHT";
2972 $new_field = <STDIN
>;
2973 if ( $new_field eq "\n" ) {
2974 $new_field = $prefs_user_field;
2976 $new_field =~ s/[\r\n]//g;
2978 $prefs_user_size = db_pref_size
($prefs_user_size);
2983 print "This is the name of the field in which you want to store the\n";
2984 print "preferences keyword. It defaults to 'prefkey'\n";
2986 print "[$WHT$prefs_key_field$NRM]: $WHT";
2987 $new_field = <STDIN
>;
2988 if ( $new_field eq "\n" ) {
2989 $new_field = $prefs_key_field;
2991 $new_field =~ s/[\r\n]//g;
2993 $prefs_key_size = db_pref_size
($prefs_key_size);
2998 print "This is the name of the field in which you want to store the\n";
2999 print "preferences value. It defaults to 'prefval'\n";
3001 print "[$WHT$prefs_val_field$NRM]: $WHT";
3002 $new_field = <STDIN
>;
3003 if ( $new_field eq "\n" ) {
3004 $new_field = $prefs_val_field;
3006 $new_field =~ s/[\r\n]//g;
3008 $prefs_val_size = db_pref_size
($prefs_val_size);
3012 # routine is used to set database field limits
3013 # it needs one argument
3014 sub db_pref_size
() {
3016 print "\nDatabase fields have size limits.\n";
3018 print "What limit is set for this field? [$WHT$size$NRM]: $WHT";
3019 $new_size = <STDIN
>;
3020 if ( $new_size eq "\n" ) {
3023 $new_size =~ s/[\r\n]//g;
3029 print "If you want to store your global address book in a database then\n";
3030 print "you need to set this DSN to a valid value. The format for this is:\n";
3031 print "mysql://user:pass\@hostname/dbname\n";
3032 print "Where mysql can be one of the databases PHP supports, the most common\n";
3033 print "of these are mysql, msql and pgsql\n";
3034 print "If the DSN is left empty (hit space and then return) the database\n";
3035 print "related code for global SQL address book will not be used\n";
3038 if ( $addrbook_global_dsn eq "" ) {
3039 $default_value = "Disabled";
3041 $default_value = $addrbook_global_dsn;
3043 print "[$WHT$addrbook_global_dsn$NRM]: $WHT";
3045 if ( $new_dsn eq "\n" ) {
3048 $new_dsn =~ s/[\r\n]//g;
3049 $new_dsn =~ s/^\s+$//g;
3055 print "This is the name of the table you want to store the global address book\n";
3056 print "data in. Default table name is 'global_abook'. Address book uses same\n";
3057 print "database format as personal address book.\n";
3059 print "[$WHT$addrbook_global_table$NRM]: $WHT";
3060 $new_table = <STDIN
>;
3061 if ( $new_table eq "\n" ) {
3062 $new_table = $addrbook_global_table;
3064 $new_table =~ s/[\r\n]//g;
3070 print "This option controls users\' ability to add or modify records stored \n";
3071 print "in global address book\n";
3073 if ( lc($addrbook_global_writeable) eq 'true' ) {
3074 $default_value = "y";
3076 $default_value = "n";
3078 print "Allow writing into global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
3079 $addrbook_global_writeable = <STDIN
>;
3080 if ( ( $addrbook_global_writeable =~ /^y\n/i ) || ( ( $addrbook_global_writeable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3081 $addrbook_global_writeable = 'true';
3083 $addrbook_global_writeable = 'false';
3085 return $addrbook_global_writeable;
3089 print "Enable this option if you want to see listing of addresses stored \n";
3090 print "in global address book\n";
3092 if ( lc($addrbook_global_listing) eq 'true' ) {
3093 $default_value = "y";
3095 $default_value = "n";
3097 print "Allow listing of global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
3098 $addrbook_global_listing = <STDIN
>;
3099 if ( ( $addrbook_global_listing =~ /^y\n/i ) || ( ( $addrbook_global_listing =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3100 $addrbook_global_listing = 'true';
3102 $addrbook_global_listing = 'false';
3104 return $addrbook_global_listing;
3110 print "SquirrelMail attempts to set the language in many ways. If it\n";
3111 print "can not figure it out in another way, it will default to this\n";
3112 print "language. Please use the code for the desired language.\n";
3114 print "[$WHT$squirrelmail_default_language$NRM]: $WHT";
3115 $new_squirrelmail_default_language = <STDIN
>;
3116 if ( $new_squirrelmail_default_language eq "\n" ) {
3117 $new_squirrelmail_default_language = $squirrelmail_default_language;
3119 $new_squirrelmail_default_language =~ s/[\r\n]//g;
3120 $new_squirrelmail_default_language =~ s/^\s+$//g;
3122 return $new_squirrelmail_default_language;
3126 print "This option controls what character set is used when sending\n";
3127 print "mail and when sending HTML to the browser. Option works only\n";
3128 print "with US English (en_US) translation. Other translations use\n";
3129 print "charsets that are set in functions/i18n.php.\n";
3132 print "[$WHT$default_charset$NRM]: $WHT";
3133 $new_default_charset = <STDIN
>;
3134 if ( $new_default_charset eq "\n" ) {
3135 $new_default_charset = $default_charset;
3137 $new_default_charset =~ s/[\r\n]//g;
3139 return $new_default_charset;
3141 # Alternative language names
3143 print "Enable this option if you want to see localized language names in\n";
3144 print "language selection box. Note, that this option can trigger\n";
3145 print "installation of foreign language support modules in some browsers.\n";
3148 if ( lc($show_alternative_names) eq 'true' ) {
3149 $default_value = "y";
3151 $default_value = "n";
3153 print "Show alternative language names? (y/n) [$WHT$default_value$NRM]: $WHT";
3154 $show_alternative_names = <STDIN
>;
3155 if ( ( $show_alternative_names =~ /^y\n/i ) || ( ( $show_alternative_names =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3156 $show_alternative_names = 'true';
3158 $show_alternative_names = 'false';
3160 return $show_alternative_names;
3163 # Aggressive decoding
3165 print "Enable this option if you want to use CPU and memory intensive decoding\n";
3166 print "functions. This option allows reading multibyte charset, that are used\n";
3167 print "in Eastern Asia. SquirrelMail will try to use recode functions here,\n";
3168 print "even when you have disabled use of recode in Tweaks section.\n";
3171 if ( lc($aggressive_decoding) eq 'true' ) {
3172 $default_value = "y";
3174 $default_value = "n";
3176 print "Enable aggressive decoding? (y/n) [$WHT$default_value$NRM]: $WHT";
3177 $aggressive_decoding = <STDIN
>;
3178 if ( ( $aggressive_decoding =~ /^y\n/i ) || ( ( $aggressive_decoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3179 $aggressive_decoding = 'true';
3181 $aggressive_decoding = 'false';
3183 return $aggressive_decoding;
3188 print "Enable this option if you want to allow lossy charset encoding in message\n";
3189 print "composition pages. This option allows charset conversions when output\n";
3190 print "charset does not support all symbols used in original charset. Symbols\n";
3191 print "unsupported by output charset will be replaced with question marks.\n";
3194 if ( lc($lossy_encoding) eq 'true' ) {
3195 $default_value = "y";
3197 $default_value = "n";
3199 print "Enable lossy encoding? (y/n) [$WHT$default_value$NRM]: $WHT";
3200 $lossy_encoding = <STDIN
>;
3201 if ( ( $lossy_encoding =~ /^y\n/i ) || ( ( $lossy_encoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3202 $lossy_encoding = 'true';
3204 $lossy_encoding = 'false';
3206 return $lossy_encoding;
3212 print "Enable this option if you want to use DHTML based folder listing.\n";
3213 print "Code is experimental, works only with some browsers and there might\n";
3214 print "be some glitches.\n";
3217 if ( lc($advanced_tree) eq 'true' ) {
3218 $default_value = "y";
3220 $default_value = "n";
3222 print "Use advanced tree in folder listing? (y/n) [$WHT$default_value$NRM]: $WHT";
3223 $advanced_tree = <STDIN
>;
3224 if ( ( $advanced_tree =~ /^y\n/i ) || ( ( $advanced_tree =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3225 $advanced_tree = 'true';
3227 $advanced_tree = 'false';
3229 return $advanced_tree;
3231 # display html emails in iframe
3233 print "This option can enable html email rendering inside iframe.\n";
3234 print "Inline frames are used in order to provide sandbox environment";
3235 print "for html code included in html formated emails.";
3236 print "Option is experimental and might have glitches in some parts of code.";
3239 if ( lc($use_iframe) eq 'true' ) {
3240 $default_value = "y";
3242 $default_value = "n";
3244 print "Display html emails in iframe? (y/n) [$WHT$default_value$NRM]: $WHT";
3245 $use_iframe = <STDIN
>;
3246 if ( ( $use_iframe =~ /^y\n/i ) || ( ( $use_iframe =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3247 $use_iframe = 'true';
3249 $use_iframe = 'false';
3255 print "Enabling this option will cause icons to be used instead of text\n";
3256 print "markers next to each message in mailbox lists that represent\n";
3257 print "new, read, flagged, and deleted messages, as well as those that\n";
3258 print "have been replied to and forwarded. Icons are also used next to\n";
3259 print "(un)expanded folders in the folder list (Oldway = false). These\n";
3260 print "icons are quite small, but will obviously be more of a resource\n";
3261 print "drain than text markers.\n";
3264 if ( lc($use_icons) eq 'true' ) {
3265 $default_value = "y";
3267 $default_value = "n";
3269 print "Use icons? (y/n) [$WHT$default_value$NRM]: $WHT";
3270 $use_icons = <STDIN
>;
3271 if ( ( $use_icons =~ /^y\n/i ) || ( ( $use_icons =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3272 $use_icons = 'true';
3274 $use_icons = 'false';
3280 print "Enable this option if you want to use php recode functions to read\n";
3281 print "emails written in charset that differs from the one that is set in\n";
3282 print "translation selected by user. Code is experimental, it might cause\n";
3283 print "errors, if email contains charset unsupported by recode or if your\n";
3284 print "php does not have recode support.\n";
3287 if ( lc($use_php_recode) eq 'true' ) {
3288 $default_value = "y";
3290 $default_value = "n";
3292 print "Use php recode functions? (y/n) [$WHT$default_value$NRM]: $WHT";
3293 $use_php_recode = <STDIN
>;
3294 if ( ( $use_php_recode =~ /^y\n/i ) || ( ( $use_php_recode =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3295 $use_php_recode = 'true';
3297 $use_php_recode = 'false';
3299 return $use_php_recode;
3303 print "Enable this option if you want to use php iconv functions to read\n";
3304 print "emails written in charset that differs from the one that is set in\n";
3305 print "translation selected by user. Code is experimental, it works only\n";
3306 print "with translations that use utf-8 charset. Code might cause errors,\n";
3307 print "if email contains charset unsupported by iconv or if your php does\n";
3308 print "not have iconv support.\n";
3311 if ( lc($use_php_iconv) eq 'true' ) {
3312 $default_value = "y";
3314 $default_value = "n";
3316 print "Use php iconv functions? (y/n) [$WHT$default_value$NRM]: $WHT";
3317 $use_php_iconv = <STDIN
>;
3318 if ( ( $use_php_iconv =~ /^y\n/i ) || ( ( $use_php_iconv =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3319 $use_php_iconv = 'true';
3321 $use_php_iconv = 'false';
3323 return $use_php_iconv;
3328 print "Enable this option if you want to check SquirrelMail configuration\n";
3329 print "remotely with configtest.php script.\n";
3332 if ( lc($allow_remote_configtest) eq 'true' ) {
3333 $default_value = "y";
3335 $default_value = "n";
3337 print "Allow remote configuration tests? (y/n) [$WHT$default_value$NRM]: $WHT";
3338 $allow_remote_configtest = <STDIN
>;
3339 if ( ( $allow_remote_configtest =~ /^y\n/i ) || ( ( $allow_remote_configtest =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3340 $allow_remote_configtest = 'true';
3342 $allow_remote_configtest = 'false';
3344 return $allow_remote_configtest;
3351 if ( open( CF
, ">config.php" ) ) {
3356 print CF
" * SquirrelMail Configuration File\n";
3357 print CF
" * Created using the configure script, conf.pl\n";
3360 print CF
"global \$version;\n";
3362 if ($print_config_version) {
3363 print CF
"\$config_version = '$print_config_version';\n";
3366 print CF
"\$config_use_color = $config_use_color;\n";
3370 print CF
"\$org_name = \"$org_name\";\n";
3372 print CF
"\$org_logo = " . &change_to_SM_path
($org_logo) . ";\n";
3373 $org_logo_width |= 0;
3374 $org_logo_height |= 0;
3376 print CF
"\$org_logo_width = '$org_logo_width';\n";
3378 print CF
"\$org_logo_height = '$org_logo_height';\n";
3379 # string that can contain variables.
3380 print CF
"\$org_title = \"$org_title\";\n";
3382 print CF
"\$signout_page = " . &change_to_SM_path
($signout_page) . ";\n";
3384 print CF
"\$frame_top = '$frame_top';\n";
3387 print CF
"\$provider_uri = '$provider_uri';\n";
3390 print CF
"\$provider_name = '$provider_name';\n";
3393 # string that can contain variables
3394 print CF
"\$motd = \"$motd\";\n";
3398 print CF
"\$squirrelmail_default_language = '$squirrelmail_default_language';\n";
3400 print CF
"\$default_charset = '$default_charset';\n";
3402 print CF
"\$show_alternative_names = $show_alternative_names;\n";
3404 print CF
"\$aggressive_decoding = $aggressive_decoding;\n";
3406 print CF
"\$lossy_encoding = $lossy_encoding;\n";
3410 print CF
"\$domain = '$domain';\n";
3412 print CF
"\$imapServerAddress = '$imapServerAddress';\n";
3414 print CF
"\$imapPort = $imapPort;\n";
3416 print CF
"\$useSendmail = $useSendmail;\n";
3418 print CF
"\$smtpServerAddress = '$smtpServerAddress';\n";
3420 print CF
"\$smtpPort = $smtpPort;\n";
3422 print CF
"\$sendmail_path = '$sendmail_path';\n";
3424 # print CF "\$use_authenticated_smtp = $use_authenticated_smtp;\n";
3426 print CF
"\$pop_before_smtp = $pop_before_smtp;\n";
3428 print CF
"\$imap_server_type = '$imap_server_type';\n";
3430 print CF
"\$invert_time = $invert_time;\n";
3432 print CF
"\$optional_delimiter = '$optional_delimiter';\n";
3434 print CF
"\$encode_header_key = '$encode_header_key';\n";
3438 print CF
"\$default_folder_prefix = '$default_folder_prefix';\n";
3440 print CF
"\$trash_folder = '$trash_folder';\n";
3442 print CF
"\$sent_folder = '$sent_folder';\n";
3444 print CF
"\$draft_folder = '$draft_folder';\n";
3446 print CF
"\$default_move_to_trash = $default_move_to_trash;\n";
3448 print CF
"\$default_move_to_sent = $default_move_to_sent;\n";
3450 print CF
"\$default_save_as_draft = $default_save_as_draft;\n";
3452 print CF
"\$show_prefix_option = $show_prefix_option;\n";
3454 print CF
"\$list_special_folders_first = $list_special_folders_first;\n";
3456 print CF
"\$use_special_folder_color = $use_special_folder_color;\n";
3458 print CF
"\$auto_expunge = $auto_expunge;\n";
3460 print CF
"\$default_sub_of_inbox = $default_sub_of_inbox;\n";
3462 print CF
"\$show_contain_subfolders_option = $show_contain_subfolders_option;\n";
3464 print CF
"\$default_unseen_notify = $default_unseen_notify;\n";
3466 print CF
"\$default_unseen_type = $default_unseen_type;\n";
3468 print CF
"\$auto_create_special = $auto_create_special;\n";
3470 print CF
"\$delete_folder = $delete_folder;\n";
3472 print CF
"\$noselect_fix_enable = $noselect_fix_enable;\n";
3477 print CF
"\$data_dir = " . &change_to_SM_path
($data_dir) . ";\n";
3478 # string that can contain a variable
3479 print CF
"\$attachment_dir = " . &change_to_SM_path
($attachment_dir) . ";\n";
3481 print CF
"\$dir_hash_level = $dir_hash_level;\n";
3483 print CF
"\$default_left_size = '$default_left_size';\n";
3485 print CF
"\$force_username_lowercase = $force_username_lowercase;\n";
3487 print CF
"\$default_use_priority = $default_use_priority;\n";
3489 print CF
"\$hide_sm_attributions = $hide_sm_attributions;\n";
3491 print CF
"\$default_use_mdn = $default_use_mdn;\n";
3493 print CF
"\$edit_identity = $edit_identity;\n";
3495 print CF
"\$edit_name = $edit_name;\n";
3497 print CF
"\$hide_auth_header = $hide_auth_header;\n";
3499 print CF
"\$allow_thread_sort = $allow_thread_sort;\n";
3501 print CF
"\$allow_server_sort = $allow_server_sort;\n";
3503 print CF
"\$allow_charset_search = $allow_charset_search;\n";
3505 print CF
"\$allow_advanced_search = $allow_advanced_search;\n";
3508 print CF
"\$time_zone_type = $time_zone_type;\n";
3511 # all plugins are strings
3512 for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
3513 print CF
"\$plugins[] = '$plugins[$ct]';\n";
3518 print CF
"\$theme_css = " . &change_to_SM_path
($theme_css) . ";\n";
3519 if ( $theme_default eq '' ) { $theme_default = '0'; }
3520 print CF
"\$theme_default = $theme_default;\n";
3522 for ( $count = 0 ; $count <= $#theme_name ; $count++ ) {
3523 print CF
"\$theme[$count]['PATH'] = " . &change_to_SM_path
($theme_path[$count]) . ";\n";
3524 # escape theme name so it can contain single quotes.
3525 $esc_name = $theme_name[$count];
3526 $esc_name =~ s/\\/\\\\/g;
3527 $esc_name =~ s/'/\\'/g;
3528 print CF
"\$theme[$count]['NAME'] = '$esc_name';\n";
3534 print CF
"\$default_use_javascript_addr_book = $default_use_javascript_addr_book;\n";
3535 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
3536 print CF
"\$ldap_server[$count] = array(\n";
3538 print CF
" 'host' => '$ldap_host[$count]',\n";
3540 print CF
" 'base' => '$ldap_base[$count]'";
3541 if ( $ldap_name[$count] ) {
3544 print CF
" 'name' => '$ldap_name[$count]'";
3546 if ( $ldap_port[$count] ) {
3549 print CF
" 'port' => $ldap_port[$count]";
3551 if ( $ldap_charset[$count] ) {
3554 print CF
" 'charset' => '$ldap_charset[$count]'";
3556 if ( $ldap_maxrows[$count] ) {
3559 print CF
" 'maxrows' => $ldap_maxrows[$count]";
3562 if ( $ldap_filter[$count] ) {
3564 print CF
" 'filter' => '$ldap_filter[$count]'";
3566 if ( $ldap_binddn[$count] ) {
3569 print CF
" 'binddn' => '$ldap_binddn[$count]'";
3570 if ( $ldap_bindpw[$count] ) {
3573 print CF
" 'bindpw' => '$ldap_bindpw[$count]'";
3576 if ( $ldap_protocol[$count] ) {
3579 print CF
" 'protocol' => $ldap_protocol[$count]";
3581 if ( $ldap_limit_scope[$count] ) {
3584 print CF
" 'limit_scope' => $ldap_limit_scope[$count]";
3586 if ( $ldap_listing[$count] ) {
3589 print CF
" 'listing' => $ldap_listing[$count]";
3591 if ( $ldap_search_tree[$count] ) {
3594 print CF
" 'search_tree' => $ldap_search_tree[$count]";
3596 if ( $ldap_listing[$count] ) {
3599 print CF
" 'starttls' => $ldap_starttls[$count]";
3607 print CF
"\$addrbook_dsn = '$addrbook_dsn';\n";
3609 print CF
"\$addrbook_table = '$addrbook_table';\n\n";
3611 print CF
"\$prefs_dsn = '$prefs_dsn';\n";
3613 print CF
"\$prefs_table = '$prefs_table';\n";
3615 print CF
"\$prefs_user_field = '$prefs_user_field';\n";
3617 print CF
"\$prefs_user_size = $prefs_user_size;\n";
3619 print CF
"\$prefs_key_field = '$prefs_key_field';\n";
3621 print CF
"\$prefs_key_size = $prefs_key_size;\n";
3623 print CF
"\$prefs_val_field = '$prefs_val_field';\n";
3625 print CF
"\$prefs_val_size = $prefs_val_size;\n\n";
3627 print CF
"\$addrbook_global_dsn = '$addrbook_global_dsn';\n";
3629 print CF
"\$addrbook_global_table = '$addrbook_global_table';\n";
3631 print CF
"\$addrbook_global_writeable = $addrbook_global_writeable;\n";
3633 print CF
"\$addrbook_global_listing = $addrbook_global_listing;\n\n";
3635 print CF
"\$abook_global_file = '$abook_global_file';\n";
3637 print CF
"\$abook_global_file_writeable = $abook_global_file_writeable;\n\n";
3639 print CF
"\$abook_global_file_listing = $abook_global_file_listing;\n\n";
3641 print CF
"\$no_list_for_subscribe = $no_list_for_subscribe;\n";
3644 print CF
"\$smtp_auth_mech = '$smtp_auth_mech';\n";
3646 print CF
"\$imap_auth_mech = '$imap_auth_mech';\n";
3648 print CF
"\$use_imap_tls = $use_imap_tls;\n";
3650 print CF
"\$use_smtp_tls = $use_smtp_tls;\n";
3652 print CF
"\$session_name = '$session_name';\n";
3657 print CF
"\$advanced_tree = $advanced_tree;\n";
3660 print CF
"\$use_iframe = $use_iframe;\n";
3663 print CF
"\$use_icons = $use_icons;\n";
3666 print CF
"\$use_php_recode = $use_php_recode;\n";
3669 print CF
"\$use_php_iconv = $use_php_iconv;\n";
3672 print CF
"\$allow_remote_configtest = $allow_remote_configtest;\n";
3675 print CF
"\@include SM_PATH . 'config/config_local.php';\n";
3678 print CF
" * Make sure there are no characters after the PHP closing\n";
3679 print CF
" * tag below (including newline characters and whitespace).\n";
3680 print CF
" * Otherwise, that character will cause the headers to be\n";
3681 print CF
" * sent and regular output to begin, which will majorly screw\n";
3682 print CF
" * things up when we try to send more headers later.\n";
3688 print "Data saved in config.php\n";
3690 print "Error saving config.php: $!\n";
3696 print $WHT. "SquirrelMail Configuration : " . $NRM;
3697 if ( $config == 1 ) { print "Read: config.php"; }
3698 elsif ( $config == 2 ) { print "Read: config_default.php"; }
3700 print "---------------------------------------------------------\n";
3702 print "While we have been building SquirrelMail, we have discovered some\n";
3703 print "preferences that work better with some servers that don't work so\n";
3704 print "well with others. If you select your IMAP server, this option will\n";
3705 print "set some pre-defined settings for that server.\n";
3707 print "Please note that you will still need to go through and make sure\n";
3708 print "everything is correct. This does not change everything. There are\n";
3709 print "only a few settings that this will change.\n";
3713 while ( $continue != 1 ) {
3714 print "Please select your IMAP server:\n";
3715 print " bincimap = Binc IMAP server\n";
3716 print " courier = Courier IMAP server\n";
3717 print " cyrus = Cyrus IMAP server\n";
3718 print " dovecot = Dovecot Secure IMAP server\n";
3719 print " exchange = Microsoft Exchange IMAP server\n";
3720 print " hmailserver = hMailServer\n";
3721 print " macosx = Mac OS X Mailserver\n";
3722 print " mercury32 = Mercury/32\n";
3723 print " uw = University of Washington's IMAP server\n";
3725 print " quit = Do not change anything\n";
3727 print "Command >> ";
3729 $server =~ s/[\r\n]//g;
3731 # variable is used to display additional messages.
3735 if ( $server eq "cyrus" ) {
3736 $imap_server_type = "cyrus";
3737 $default_folder_prefix = "";
3738 $trash_folder = "INBOX.Trash";
3739 $sent_folder = "INBOX.Sent";
3740 $draft_folder = "INBOX.Drafts";
3741 $show_prefix_option = false
;
3742 $default_sub_of_inbox = true
;
3743 $show_contain_subfolders_option = false
;
3744 $optional_delimiter = ".";
3745 $disp_default_folder_prefix = "<none>";
3746 $force_username_lowercase = false
;
3749 } elsif ( $server eq "uw" ) {
3750 $imap_server_type = "uw";
3751 $default_folder_prefix = "mail/";
3752 $trash_folder = "Trash";
3753 $sent_folder = "Sent";
3754 $draft_folder = "Drafts";
3755 $show_prefix_option = true
;
3756 $default_sub_of_inbox = false
;
3757 $show_contain_subfolders_option = true
;
3758 $optional_delimiter = "/";
3759 $disp_default_folder_prefix = $default_folder_prefix;
3760 $delete_folder = true
;
3761 $force_username_lowercase = true
;
3764 } elsif ( $server eq "exchange" ) {
3765 $imap_server_type = "exchange";
3766 $default_folder_prefix = "";
3767 $default_sub_of_inbox = true
;
3768 $trash_folder = "INBOX/Deleted Items";
3769 $sent_folder = "INBOX/Sent Items";
3770 $drafts_folder = "INBOX/Drafts";
3771 $show_prefix_option = false
;
3772 $show_contain_subfolders_option = false
;
3773 $optional_delimiter = "detect";
3774 $disp_default_folder_prefix = "<none>";
3775 $force_username_lowercase = true
;
3778 } elsif ( $server eq "courier" ) {
3779 $imap_server_type = "courier";
3780 $default_folder_prefix = "INBOX.";
3781 $trash_folder = "Trash";
3782 $sent_folder = "Sent";
3783 $draft_folder = "Drafts";
3784 $show_prefix_option = false
;
3785 $default_sub_of_inbox = false
;
3786 $show_contain_subfolders_option = false
;
3787 $optional_delimiter = ".";
3788 $disp_default_folder_prefix = $default_folder_prefix;
3789 $delete_folder = true
;
3790 $force_username_lowercase = false
;
3793 } elsif ( $server eq "macosx" ) {
3794 $imap_server_type = "macosx";
3795 $default_folder_prefix = "INBOX/";
3796 $trash_folder = "Trash";
3797 $sent_folder = "Sent";
3798 $draft_folder = "Drafts";
3799 $show_prefix_option = false
;
3800 $default_sub_of_inbox = true
;
3801 $show_contain_subfolders_option = false
;
3802 $optional_delimiter = "detect";
3803 $allow_charset_search = false
;
3804 $disp_default_folder_prefix = $default_folder_prefix;
3807 } elsif ( $server eq "hmailserver" ) {
3808 $imap_server_type = "hmailserver";
3809 $default_folder_prefix = "";
3810 $trash_folder = "INBOX.Trash";
3811 $sent_folder = "INBOX.Sent";
3812 $draft_folder = "INBOX.Drafts";
3813 $show_prefix_option = false
;
3814 $default_sub_of_inbox = true
;
3815 $show_contain_subfolders_option = false
;
3816 $optional_delimiter = "detect";
3817 $allow_charset_search = false
;
3818 $disp_default_folder_prefix = $default_folder_prefix;
3819 $delete_folder = false
;
3820 $force_username_lowercase = false
;
3823 } elsif ( $server eq "mercury32" ) {
3824 $imap_server_type = "mercury32";
3825 $default_folder_prefix = "";
3826 $trash_folder = "Trash";
3827 $sent_folder = "Sent";
3828 $draft_folder = "Drafts";
3829 $show_prefix_option = false
;
3830 $default_sub_of_inbox = true
;
3831 $show_contain_subfolders_option = true
;
3832 $optional_delimiter = "detect";
3833 $delete_folder = true
;
3834 $force_username_lowercase = true
;
3837 } elsif ( $server eq "dovecot" ) {
3838 $imap_server_type = "dovecot";
3839 $default_folder_prefix = "";
3840 $trash_folder = "Trash";
3841 $sent_folder = "Sent";
3842 $draft_folder = "Drafts";
3843 $show_prefix_option = false
;
3844 $default_sub_of_inbox = false
;
3845 $show_contain_subfolders_option = false
;
3846 $delete_folder = false
;
3847 $force_username_lowercase = true
;
3848 $optional_delimiter = "detect";
3849 $disp_default_folder_prefix = "<none>";
3852 } elsif ( $server eq "bincimap" ) {
3853 $imap_server_type = "bincimap";
3854 $default_folder_prefix = "INBOX/";
3855 $trash_folder = "Trash";
3856 $sent_folder = "Sent";
3857 $draft_folder = "Drafts";
3858 $show_prefix_option = false
;
3859 $default_sub_of_inbox = false
;
3860 $show_contain_subfolders_option = false
;
3861 $delete_folder = true
;
3862 $force_username_lowercase = false
;
3863 $optional_delimiter = "detect";
3864 $disp_default_folder_prefix = $default_folder_prefix;
3866 # Default folder prefix depends on used depot.
3867 $message = "\nIf you use IMAPdir depot, you must set default folder prefix to empty string.\n";
3870 } elsif ( $server eq "quit" ) {
3873 $disp_default_folder_prefix = $default_folder_prefix;
3874 print "Unrecognized server: $server\n";
3878 print " imap_server_type = $imap_server_type\n";
3879 print " default_folder_prefix = $disp_default_folder_prefix\n";
3880 print " trash_folder = $trash_folder\n";
3881 print " sent_folder = $sent_folder\n";
3882 print " draft_folder = $draft_folder\n";
3883 print " show_prefix_option = $show_prefix_option\n";
3884 print " default_sub_of_inbox = $default_sub_of_inbox\n";
3885 print "show_contain_subfolders_option = $show_contain_subfolders_option\n";
3886 print " optional_delimiter = $optional_delimiter\n";
3887 print " delete_folder = $delete_folder\n";
3888 print " force_username_lowercase = $force_username_lowercase\n";
3892 print "\nPress enter to continue...";
3896 # This subroutine corrects relative paths to ensure they
3897 # will work within the SM space. If the path falls within
3898 # the SM directory tree, the SM_PATH variable will be
3899 # prepended to the path, if not, then the path will be
3900 # converted to an absolute path, e.g.
3901 # '../images/logo.gif' --> SM_PATH . 'images/logo.gif'
3902 # '../../someplace/data' --> '/absolute/path/someplace/data'
3903 # 'images/logo.gif' --> SM_PATH . 'config/images/logo.gif'
3904 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
3905 # 'http://whatever/' --> 'http://whatever'
3906 # $some_var/path --> "$some_var/path"
3907 sub change_to_SM_path
() {
3908 my ($old_path) = @_;
3914 # If the path is absolute, don't bother.
3915 return "\'" . $old_path . "\'" if ( $old_path eq '');
3916 return "\'" . $old_path . "\'" if ( $old_path =~ /^(\/|http
)/ );
3917 return "\'" . $old_path . "\'" if ( $old_path =~ /^\w:\// );
3918 return $old_path if ( $old_path =~ /^\'(\/|http
)/ );
3919 return $old_path if ( $old_path =~ /^\'\w:\// );
3920 return $old_path if ( $old_path =~ /^SM_PATH/);
3922 if ( $old_path =~ /^\$/ ) {
3923 # check if it's a single var, or a $var/path combination
3924 # if it's $var/path, enclose in ""
3925 if ( $old_path =~ /\// ) {
3926 return '"'.$old_path.'"';
3931 # Remove remaining '
3932 $old_path =~ s/\'//g;
3934 # For relative paths, split on '../'
3935 @rel_path = split(/\.\.\//, $old_path);
3937 if ( $#rel_path > 1 ) {
3938 # more than two levels away. Make it absolute.
3939 @abs_path = split(/\//, $dir);
3941 # Lop off the relative pieces of the absolute path..
3942 for ( $i = 0; $i <= $#rel_path; $i++ ) {
3946 push @abs_path, @rel_path;
3947 $new_path = "\'" . join('/', @abs_path) . "\'";
3948 } elsif ( $#rel_path > 0 ) {
3949 # it's within the SM tree, prepend SM_PATH
3950 $new_path = $old_path;
3951 $new_path =~ s/^\.\.\//SM_PATH
. \'/;
3954 # Last, it's a relative path without any leading '.'
3955 # Prepend SM_PATH and config, since the paths are
3956 # relative to the config directory
3957 $new_path = "SM_PATH . \'config/" . $old_path . "\'";
3963 # Change SM_PATH to admin-friendly version, e.g.:
3964 # SM_PATH . 'images/logo.gif' --> '../images/logo.gif'
3965 # SM_PATH . 'config/some.php' --> 'some.php'
3966 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
3967 # 'http://whatever/' --> 'http://whatever'
3968 sub change_to_rel_path
() {
3969 my ($old_path) = @_;
3970 my $new_path = $old_path;
3972 if ( $old_path =~ /^SM_PATH/ ) {
3973 $new_path =~ s/^SM_PATH . \'/\.\.\//;
3974 $new_path =~ s/\.\.\/config\///;
3980 sub detect_auth_support
{
3981 # Attempts to auto-detect if a specific auth mechanism is supported.
3982 # Called by 'command112a' and 'command112b'
3983 # ARGS: service-name (IMAP or SMTP), host:port, mech-name (ie. CRAM-MD5)
3987 my $service = shift;
3991 if ((!defined($service)) or (!defined($host)) or (!defined($mech))) {
3992 # Error - wrong # of args
3993 print "BAD ARGS!\n";
3997 if ($service eq 'SMTP') {
3998 $cmd = "AUTH $mech\r\n";
3999 $logout = "QUIT\r\n";
4000 } elsif ($service eq 'IMAP') {
4001 $cmd = "A01 AUTHENTICATE $mech\n";
4002 $logout = "C01 LOGOUT\n";
4004 # unknown service - whoops.
4008 # Get this show on the road
4009 my $sock=IO
::Socket
::INET
->new($host);
4010 if (!defined($sock)) {
4014 my $discard = <$sock>; # Server greeting/banner - who cares..
4016 if ($service eq 'SMTP') {
4018 print $sock "HELO $domain\r\n";
4019 $discard = <$sock>; # Yeah yeah, you're happy to see me..
4023 my $response = <$sock>;
4025 if (!defined($response)) {
4029 # So at this point, we have a response, and it is (hopefully) valid.
4030 if ($service eq 'SMTP') {
4031 if (($response =~ /^535/) or ($response =~/^502/)) {
4033 print $sock $logout;
4036 } elsif ($response =~ /^503/) {
4037 #Something went wrong
4040 } elsif ($service eq 'IMAP') {
4041 if ($response =~ /^A01/) {
4043 print $sock $logout;
4048 # Unknown service - this shouldn't be able to happen.
4053 # If it gets here, the mech is supported
4054 print $sock "*\n"; # Attempt to cancel authentication
4055 print $sock $logout; # Try to log out, but we don't really care if this fails
4060 sub clear_screen
() {
4061 if ( $^O
=~ /^mswin/i) {