4 # Copyright (c) 1999-2006 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] =~ /^aTemplateSet\[[0-9]+\]\[['"]PATH['"]\]/ ) {
193 $sub =~ s/\]\[['"]PATH['"]\]//;
195 if ( -e
"../templates" ) {
196 $options[1] =~ s/^\.\.\/config/\
.\
.\
/templates/;
198 $templateset_path[$sub] = &change_to_rel_path
($options[1]);
199 } elsif ( $options[0] =~ /^aTemplateSet\[[0-9]+\]\[['"]NAME['"]\]/ ) {
201 $sub =~ s/\]\[['"]NAME['"]\]//;
203 $templateset_name[$sub] = $options[1];
204 } elsif ( $options[0] =~ /^plugins\[[0-9]*\]/ ) {
207 $sub =~ s/^plugins\[//;
209 push @plugins, $options[1];
211 $plugins[$sub] = $options[1];
213 } elsif ($options[0] =~ /^fontsets\[\'[a-z]*\'\]/) {
214 # parse associative $fontsets array
217 $sub =~ s/^fontsets\[\'//;
218 $fontsets{$sub} = $options[1];
219 } elsif ( $options[0] =~ /^ldap_server\[[0-9]+\]/ ) {
222 $sub =~ s/^ldap_server\[//;
224 while ( ( $tmp = <FILE
> ) && ( $continue != 1 ) ) {
225 if ( $tmp =~ /\);\s*$/ ) {
229 if ( $tmp =~ /^\s*[\'\"]host[\'\"]/i ) {
230 $tmp =~ s/^\s*[\'\"]host[\'\"]\s*=>\s*[\'\"]//i;
231 $tmp =~ s/[\'\"],?\s*$//;
232 $tmp =~ s/[\'\"]\);\s*$//;
234 } elsif ( $tmp =~ /^\s*[\'\"]base[\'\"]/i ) {
235 $tmp =~ s/^\s*[\'\"]base[\'\"]\s*=>\s*[\'\"]//i;
236 $tmp =~ s/[\'\"],?\s*$//;
237 $tmp =~ s/[\'\"]\);\s*$//;
239 } elsif ( $tmp =~ /^\s*[\'\"]charset[\'\"]/i ) {
240 $tmp =~ s/^\s*[\'\"]charset[\'\"]\s*=>\s*[\'\"]//i;
241 $tmp =~ s/[\'\"],?\s*$//;
242 $tmp =~ s/[\'\"]\);\s*$//;
244 } elsif ( $tmp =~ /^\s*[\'\"]port[\'\"]/i ) {
245 $tmp =~ s/^\s*[\'\"]port[\'\"]\s*=>\s*[\'\"]?//i;
246 $tmp =~ s/[\'\"]?,?\s*$//;
247 $tmp =~ s/[\'\"]?\);\s*$//;
249 } elsif ( $tmp =~ /^\s*[\'\"]maxrows[\'\"]/i ) {
250 $tmp =~ s/^\s*[\'\"]maxrows[\'\"]\s*=>\s*[\'\"]?//i;
251 $tmp =~ s/[\'\"]?,?\s*$//;
252 $tmp =~ s/[\'\"]?\);\s*$//;
254 } elsif ( $tmp =~ /^\s*[\'\"]filter[\'\"]/i ) {
255 $tmp =~ s/^\s*[\'\"]filter[\'\"]\s*=>\s*[\'\"]?//i;
256 $tmp =~ s/[\'\"]?,?\s*$//;
257 $tmp =~ s/[\'\"]?\);\s*$//;
259 } elsif ( $tmp =~ /^\s*[\'\"]name[\'\"]/i ) {
260 $tmp =~ s/^\s*[\'\"]name[\'\"]\s*=>\s*[\'\"]//i;
261 $tmp =~ s/[\'\"],?\s*$//;
262 $tmp =~ s/[\'\"]\);\s*$//;
264 } elsif ( $tmp =~ /^\s*[\'\"]binddn[\'\"]/i ) {
265 $tmp =~ s/^\s*[\'\"]binddn[\'\"]\s*=>\s*[\'\"]//i;
266 $tmp =~ s/[\'\"],?\s*$//;
267 $tmp =~ s/[\'\"]\);\s*$//;
269 } elsif ( $tmp =~ /^\s*[\'\"]bindpw[\'\"]/i ) {
270 $tmp =~ s/^\s*[\'\"]bindpw[\'\"]\s*=>\s*[\'\"]//i;
271 $tmp =~ s/[\'\"],?\s*$//;
272 $tmp =~ s/[\'\"]\);\s*$//;
274 } elsif ( $tmp =~ /^\s*[\'\"]protocol[\'\"]/i ) {
275 $tmp =~ s/^\s*[\'\"]protocol[\'\"]\s*=>\s*[\'\"]?//i;
276 $tmp =~ s/[\'\"]?,?\s*$//;
277 $tmp =~ s/[\'\"]?\);\s*$//;
279 } elsif ( $tmp =~ /^\s*[\'\"]limit_scope[\'\"]/i ) {
280 $tmp =~ s/^\s*[\'\"]limit_scope[\'\"]\s*=>\s*[\'\"]?//i;
281 $tmp =~ s/[\'\"]?,?\s*$//;
282 $tmp =~ s/[\'\"]?\);\s*$//;
284 } elsif ( $tmp =~ /^\s*[\'\"]listing[\'\"]/i ) {
285 $tmp =~ s/^\s*[\'\"]listing[\'\"]\s*=>\s*[\'\"]?//i;
286 $tmp =~ s/[\'\"]?,?\s*$//;
287 $tmp =~ s/[\'\"]?\);\s*$//;
289 } elsif ( $tmp =~ /^\s*[\'\"]search_tree[\'\"]/i ) {
290 $tmp =~ s/^\s*[\'\"]search_tree[\'\"]\s*=>\s*[\'\"]?//i;
291 $tmp =~ s/[\'\"]?,?\s*$//;
292 $tmp =~ s/[\'\"]?\);\s*$//;
294 } elsif ( $tmp =~ /^\s*[\'\"]starttls[\'\"]/i ) {
295 $tmp =~ s/^\s*[\'\"]starttls[\'\"]\s*=>\s*[\'\"]?//i;
296 $tmp =~ s/[\'\"]?,?\s*$//;
297 $tmp =~ s/[\'\"]?\);\s*$//;
301 $ldap_host[$sub] = $host;
302 $ldap_base[$sub] = $base;
303 $ldap_name[$sub] = $name;
304 $ldap_port[$sub] = $port;
305 $ldap_maxrows[$sub] = $maxrows;
306 $ldap_filter[$sub] = $filter;
307 $ldap_charset[$sub] = $charset;
308 $ldap_binddn[$sub] = $binddn;
309 $ldap_bindpw[$sub] = $bindpw;
310 $ldap_protocol[$sub] = $protocol;
311 $ldap_limit_scope[$sub] = $limit_scope;
312 $ldap_listing[$sub] = $listing;
313 $ldap_search_tree[$sub] = $search_tree;
314 $ldap_starttls[$sub] = $starttls;
315 } elsif ( $options[0] =~ /^(data_dir|attachment_dir|theme_css|org_logo|signout_page)$/ ) {
316 ${ $options[0] } = &change_to_rel_path
($options[1]);
318 ${ $options[0] } = $options[1];
324 $useSendmail = 'false' if ( lc($useSendmail) ne 'true' );
325 $sendmail_path = "/usr/sbin/sendmail" if ( !$sendmail_path );
326 $pop_before_smtp = 'false' if ( !$pop_before_smtp );
327 $default_unseen_notify = 2 if ( !$default_unseen_notify );
328 $default_unseen_type = 1 if ( !$default_unseen_type );
329 $config_use_color = 0 if ( !$config_use_color );
330 $invert_time = 'false' if ( !$invert_time );
331 $force_username_lowercase = 'false' if ( !$force_username_lowercase );
332 $optional_delimiter = "detect" if ( !$optional_delimiter );
333 $auto_create_special = 'false' if ( !$auto_create_special );
334 $default_use_priority = 'true' if ( !$default_use_priority );
335 $hide_sm_attributions = 'false' if ( !$hide_sm_attributions );
336 $default_use_mdn = 'true' if ( !$default_use_mdn );
337 $delete_folder = 'false' if ( !$delete_folder );
338 $noselect_fix_enable = 'false' if ( !$noselect_fix_enable );
339 $frame_top = "_top" if ( !$frame_top );
340 $provider_uri = '' if ( !$provider_uri );
341 $provider_name = '' if ( !$provider_name );
342 $edit_identity = 'true' if ( !$edit_identity );
343 $edit_name = 'true' if ( !$edit_name );
344 $allow_thread_sort = 'false' if ( !$allow_thread_sort );
345 $allow_server_sort = 'false' if ( !$allow_server_sort );
346 $no_list_for_subscribe = 'false' if ( !$no_list_for_subscribe );
347 $allow_charset_search = 'true' if ( !$allow_charset_search );
348 $allow_advanced_search = 0 if ( !$allow_advanced_search) ;
349 $prefs_user_field = 'user' if ( !$prefs_user_field );
350 $prefs_key_field = 'prefkey' if ( !$prefs_key_field );
351 $prefs_val_field = 'prefval' if ( !$prefs_val_field );
352 $use_smtp_tls= 'false' if ( !$use_smtp_tls);
353 $smtp_auth_mech = 'none' if ( !$smtp_auth_mech );
354 $use_imap_tls = 'false' if ( !$use_imap_tls );
355 $imap_auth_mech = 'login' if ( !$imap_auth_mech );
356 $session_name = 'SQMSESSID' if ( !$session_name );
357 $skip_SM_header = 'false' if ( !$skip_SM_header );
358 $default_use_javascript_addr_book = 'false' if (! $default_use_javascript_addr_book);
361 $show_alternative_names = 'false' if ( !$show_alternative_names );
362 # $available_languages option available only in 1.5.0. removed due to $languages
363 # implementation changes. options are provided by limit_languages plugin
364 # $available_languages = 'all' if ( !$available_languages );
365 $aggressive_decoding = 'false' if ( !$aggressive_decoding );
366 $advanced_tree = 'false' if ( !$advanced_tree );
367 $use_php_recode = 'false' if ( !$use_php_recode );
368 $use_php_iconv = 'false' if ( !$use_php_iconv );
371 $use_icons = 'false' if ( !$use_icons );
372 $use_iframe = 'false' if ( !$use_iframe );
373 $lossy_encoding = 'false' if ( !$lossy_encoding );
374 $allow_remote_configtest = 'false' if ( !$allow_remote_configtest );
375 $addrbook_global_table = 'global_abook' if ( !$addrbook_global_table );
376 $addrbook_global_writeable = 'false' if ( !$addrbook_global_writeable );
377 $addrbook_global_listing = 'false' if ( !$addrbook_global_listing );
378 $abook_global_file = '' if ( !$abook_global_file);
379 $abook_global_file_writeable = 'false' if ( !$abook_global_file_writeable);
380 $abook_global_file_listing = 'true' if ( !$abook_global_file_listing );
381 $encode_header_key = '' if ( !$encode_header_key );
382 $hide_auth_header = 'false' if ( !$hide_auth_header );
383 $time_zone_type = '0' if ( !$time_zone_type );
384 $prefs_user_size = 128 if ( !$prefs_user_size );
385 $prefs_key_size = 64 if ( !$prefs_key_size );
386 $prefs_val_size = 65536 if ( !$prefs_val_size );
388 # add qmail-inject test here for backwards compatibility
389 if ( !$sendmail_args && $sendmail_path =~ /qmail-inject/ ) {
391 } elsif ( !$sendmail_args ) {
392 $sendmail_args = '-i -t';
395 $default_fontsize = '' if ( !$default_fontsize);
396 $default_fontset = '' if ( !$default_fontset);
398 %fontsets = ('serif', 'serif',
399 'sans', 'helvetica,arial,sans-serif',
400 'comicsans', 'comic sans ms,sans-serif',
401 'tahoma', 'tahoma,sans-serif',
402 'verasans', 'bitstream vera sans,verdana,sans-serif');
406 if ( $ARGV[0] eq '--install-plugin' ) {
407 print "Activating plugin " . $ARGV[1] . "\n";
408 push @plugins, $ARGV[1];
411 } elsif ( $ARGV[0] eq '--remove-plugin' ) {
412 print "Removing plugin " . $ARGV[1] . "\n";
413 foreach $plugin (@plugins) {
414 if ( $plugin ne $ARGV[1] ) {
415 push @newplugins, $plugin;
418 @plugins = @newplugins;
423 #####################################################################################
424 if ( $config_use_color == 1 ) {
430 $config_use_color = 2;
433 while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
435 print $WHT. "SquirrelMail Configuration : " . $NRM;
436 if ( $config == 1 ) { print "Read: config.php"; }
437 elsif ( $config == 2 ) { print "Read: config_default.php"; }
438 print " ($print_config_version)\n";
439 print "---------------------------------------------------------\n";
442 print $WHT. "Main Menu --\n" . $NRM;
443 print "1. Organization Preferences\n";
444 print "2. Server Settings\n";
445 print "3. Folder Defaults\n";
446 print "4. General Options\n";
447 print "5. Templates\n";
448 print "6. Address Books\n";
449 print "7. Message of the Day (MOTD)\n";
450 print "8. Plugins\n";
451 print "9. Database\n";
452 print "10. Language settings\n";
453 print "11. Tweaks\n";
455 print "D. Set pre-defined settings for specific IMAP servers\n";
457 } elsif ( $menu == 1 ) {
458 print $WHT. "Organization Preferences\n" . $NRM;
459 print "1. Organization Name : $WHT$org_name$NRM\n";
460 print "2. Organization Logo : $WHT$org_logo$NRM\n";
461 print "3. Org. Logo Width/Height : $WHT($org_logo_width/$org_logo_height)$NRM\n";
462 print "4. Organization Title : $WHT$org_title$NRM\n";
463 print "5. Signout Page : $WHT$signout_page$NRM\n";
464 print "6. Top Frame : $WHT$frame_top$NRM\n";
465 print "7. Provider link : $WHT$provider_uri$NRM\n";
466 print "8. Provider name : $WHT$provider_name$NRM\n";
469 print "R Return to Main Menu\n";
470 } elsif ( $menu == 2 ) {
471 print $WHT. "Server Settings\n\n" . $NRM;
472 print $WHT . "General" . $NRM . "\n";
474 print "1. Domain : $WHT$domain$NRM\n";
475 print "2. Invert Time : $WHT$invert_time$NRM\n";
476 print "3. Sendmail or SMTP : $WHT";
477 if ( lc($useSendmail) eq 'true' ) {
485 if ( $show_imap_settings ) {
486 print $WHT . "IMAP Settings". $NRM . "\n--------------\n";
487 print "4. IMAP Server : $WHT$imapServerAddress$NRM\n";
488 print "5. IMAP Port : $WHT$imapPort$NRM\n";
489 print "6. Authentication type : $WHT$imap_auth_mech$NRM\n";
490 print "7. Secure IMAP (TLS) : $WHT$use_imap_tls$NRM\n";
491 print "8. Server software : $WHT$imap_server_type$NRM\n";
492 print "9. Delimiter : $WHT$optional_delimiter$NRM\n";
494 } elsif ( $show_smtp_settings ) {
495 if ( lc($useSendmail) eq 'true' ) {
496 print $WHT . "Sendmail" . $NRM . "\n--------\n";
497 print "4. Sendmail Path : $WHT$sendmail_path$NRM\n";
498 print "5. Sendmail arguments : $WHT$sendmail_args$NRM\n";
499 print "6. Header encryption key : $WHT$encode_header_key$NRM\n";
502 print $WHT . "SMTP Settings" . $NRM . "\n-------------\n";
503 print "4. SMTP Server : $WHT$smtpServerAddress$NRM\n";
504 print "5. SMTP Port : $WHT$smtpPort$NRM\n";
505 print "6. POP before SMTP : $WHT$pop_before_smtp$NRM\n";
506 print "7. SMTP Authentication : $WHT$smtp_auth_mech$NRM\n";
507 print "8. Secure SMTP (TLS) : $WHT$use_smtp_tls$NRM\n";
508 print "9. Header encryption key : $WHT$encode_header_key$NRM\n";
513 if ($show_imap_settings == 0) {
514 print "A. Update IMAP Settings : ";
515 print "$WHT$imapServerAddress$NRM:";
516 print "$WHT$imapPort$NRM ";
517 print "($WHT$imap_server_type$NRM)\n";
519 if ($show_smtp_settings == 0) {
520 if ( lc($useSendmail) eq 'true' ) {
521 print "B. Change Sendmail Config : $WHT$sendmail_path$NRM\n";
523 print "B. Update SMTP Settings : ";
524 print "$WHT$smtpServerAddress$NRM:";
525 print "$WHT$smtpPort$NRM\n";
528 if ( $show_smtp_settings || $show_imap_settings )
531 ($show_imap_settings ?
"IMAP Server" :
532 (lc($useSendmail) eq 'true') ?
"Sendmail" : "SMTP") . " Settings\n";
536 print "R Return to Main Menu\n";
537 } elsif ( $menu == 3 ) {
538 print $WHT. "Folder Defaults\n" . $NRM;
539 print "1. Default Folder Prefix : $WHT$default_folder_prefix$NRM\n";
540 print "2. Show Folder Prefix Option : $WHT$show_prefix_option$NRM\n";
541 print "3. Trash Folder : $WHT$trash_folder$NRM\n";
542 print "4. Sent Folder : $WHT$sent_folder$NRM\n";
543 print "5. Drafts Folder : $WHT$draft_folder$NRM\n";
544 print "6. By default, move to trash : $WHT$default_move_to_trash$NRM\n";
545 print "7. By default, move to sent : $WHT$default_move_to_sent$NRM\n";
546 print "8. By default, save as draft : $WHT$default_save_as_draft$NRM\n";
547 print "9. List Special Folders First : $WHT$list_special_folders_first$NRM\n";
548 print "10. Show Special Folders Color : $WHT$use_special_folder_color$NRM\n";
549 print "11. Auto Expunge : $WHT$auto_expunge$NRM\n";
550 print "12. Default Sub. of INBOX : $WHT$default_sub_of_inbox$NRM\n";
551 print "13. Show 'Contain Sub.' Option : $WHT$show_contain_subfolders_option$NRM\n";
552 print "14. Default Unseen Notify : $WHT$default_unseen_notify$NRM\n";
553 print "15. Default Unseen Type : $WHT$default_unseen_type$NRM\n";
554 print "16. Auto Create Special Folders : $WHT$auto_create_special$NRM\n";
555 print "17. Folder Delete Bypasses Trash : $WHT$delete_folder$NRM\n";
556 print "18. Enable /NoSelect folder fix : $WHT$noselect_fix_enable$NRM\n";
558 print "R Return to Main Menu\n";
559 } elsif ( $menu == 4 ) {
560 print $WHT. "General Options\n" . $NRM;
561 print "1. Data Directory : $WHT$data_dir$NRM\n";
562 print "2. Attachment Directory : $WHT$attachment_dir$NRM\n";
563 print "3. Directory Hash Level : $WHT$dir_hash_level$NRM\n";
564 print "4. Default Left Size : $WHT$default_left_size$NRM\n";
565 print "5. Usernames in Lowercase : $WHT$force_username_lowercase$NRM\n";
566 print "6. Allow use of priority : $WHT$default_use_priority$NRM\n";
567 print "7. Hide SM attributions : $WHT$hide_sm_attributions$NRM\n";
568 print "8. Allow use of receipts : $WHT$default_use_mdn$NRM\n";
569 print "9. Allow editing of identity : $WHT$edit_identity$NRM\n";
570 print " Allow editing of name : $WHT$edit_name$NRM\n";
571 print " Remove username from header : $WHT$hide_auth_header$NRM\n";
572 print "10. Allow server thread sort : $WHT$allow_thread_sort$NRM\n";
573 print "11. Allow server-side sorting : $WHT$allow_server_sort$NRM\n";
574 print "12. Allow server charset search : $WHT$allow_charset_search$NRM\n";
575 print "13. Allow advanced search : $WHT$allow_advanced_search$NRM\n";
576 print "14. PHP session name : $WHT$session_name$NRM\n";
577 print "15. Time zone configuration : $WHT$time_zone_type$NRM\n";
579 print "R Return to Main Menu\n";
580 } elsif ( $menu == 5 ) {
581 print $WHT. "Themes\n" . $NRM;
582 print "1. Change Template set\n";
583 # for ( $count = 0 ; $count <= $#theme_name/2 ; $count++ ) {
584 # $temp_name = $theme_name[$count*2];
585 # printf " %s%*s %s\n", $temp_name,
586 # 40 - length($temp_name), " ",
587 # $theme_name[($count*2)+1];
589 print "2. CSS File : $WHT$theme_css$NRM\n";
590 print "3. Default font size: $WHT$default_fontsize$NRM\n";
591 print "4. Change available font sets\n";
592 print "5. Change Themes\n";
595 print "R Return to Main Menu\n";
596 } elsif ( $menu == 6 ) {
597 print $WHT. "Address Books\n" . $NRM;
598 print "1. Change LDAP Servers\n";
599 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
600 print " > $ldap_host[$count]\n";
602 print "2. Use Javascript address book search : $WHT$default_use_javascript_addr_book$NRM\n";
603 print "3. Global address book file : $WHT$abook_global_file$NRM\n";
604 print "4. Allow writing into global file address book : $WHT$abook_global_file_writeable$NRM\n";
605 print "5. Allow listing of global file address book : $WHT$abook_global_file_listing$NRM\n";
607 print "R Return to Main Menu\n";
608 } elsif ( $menu == 7 ) {
609 print $WHT. "Message of the Day (MOTD)\n" . $NRM;
612 print "1 Edit the MOTD\n";
614 print "R Return to Main Menu\n";
615 } elsif ( $menu == 8 ) {
616 print $WHT. "Plugins\n" . $NRM;
617 print " Installed Plugins\n";
619 for ( $count = 0 ; $count <= $#plugins ; $count++ ) {
621 print " $num. $plugins[$count]\n";
623 print "\n Available Plugins:\n";
624 opendir( DIR
, "../plugins" );
625 @files = readdir(DIR
);
627 @unused_plugins = ();
628 for ( $i = 0 ; $i <= $#files ; $i++ ) {
629 if ( -d
"../plugins/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
631 for ( $k = 0 ; $k <= $#plugins ; $k++ ) {
632 if ( $plugins[$k] eq $files[$i] ) {
637 $unused_plugins[$pos] = $files[$i];
643 for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
645 print " $num. $unused_plugins[$i]\n";
650 print "R Return to Main Menu\n";
651 } elsif ( $menu == 9 ) {
652 print $WHT. "Database\n" . $NRM;
653 print "1. DSN for Address Book : $WHT$addrbook_dsn$NRM\n";
654 print "2. Table for Address Book : $WHT$addrbook_table$NRM\n";
656 print "3. DSN for Preferences : $WHT$prefs_dsn$NRM\n";
657 print "4. Table for Preferences : $WHT$prefs_table$NRM\n";
658 print "5. Field for username : $WHT$prefs_user_field$NRM ($prefs_user_size)\n";
659 print "6. Field for prefs key : $WHT$prefs_key_field$NRM ($prefs_key_size)\n";
660 print "7. Field for prefs value : $WHT$prefs_val_field$NRM ($prefs_val_size)\n";
662 print "8. DSN for Global Address Book : $WHT$addrbook_global_dsn$NRM\n";
663 print "9. Table for Global Address Book : $WHT$addrbook_global_table$NRM\n";
664 print "10. Allow writing into Global Address Book : $WHT$addrbook_global_writeable$NRM\n";
665 print "11. Allow listing of Global Address Book : $WHT$addrbook_global_listing$NRM\n";
667 print "R Return to Main Menu\n";
668 } elsif ( $menu == 10 ) {
669 print $WHT. "Language settings\n" . $NRM;
670 print "1. Default Language : $WHT$squirrelmail_default_language$NRM\n";
671 print "2. Default Charset : $WHT$default_charset$NRM\n";
672 print "3. Show alternative language names : $WHT$show_alternative_names$NRM\n";
673 print "4. Enable aggressive decoding : $WHT$aggressive_decoding$NRM\n";
674 print "5. Enable lossy encoding : $WHT$lossy_encoding$NRM\n";
676 print "R Return to Main Menu\n";
677 } elsif ( $menu == 11 ) {
678 print $WHT. "Interface tweaks\n" . $NRM;
679 print "1. Advanced tree : $WHT$advanced_tree$NRM\n";
680 print "2. Display html mails in iframe : $WHT$use_iframe$NRM\n";
681 print "3. Use Icons : $WHT$use_icons$NRM\n";
683 print $WHT. "PHP tweaks\n" . $NRM;
684 print "4. Use php recode functions : $WHT$use_php_recode$NRM\n";
685 print "5. Use php iconv functions : $WHT$use_php_iconv$NRM\n";
687 print $WHT. "Configuration tweaks\n" . $NRM;
688 print "6. Allow remote configtest : $WHT$allow_remote_configtest$NRM\n";
690 print "R Return to Main Menu\n";
692 if ( $config_use_color == 1 ) {
693 print "C Turn color off\n";
695 print "C Turn color on\n";
697 print "S Save data\n";
701 print "Command >> " . $WHT;
703 $command =~ s/[\n\r]//g;
704 $command =~ tr/A-Z/a-z/;
707 # Read the commands they entered.
708 if ( $command eq "r" ) {
710 } elsif ( $command eq "s" ) {
712 print "Press enter to continue...";
715 } elsif ( ( $command eq "q" ) && ( $saved == 0 ) ) {
716 print "You have not saved your data.\n";
717 print "Save? [" . $WHT . "Y" . $NRM . "/n]: ";
719 if ( ( $save =~ /^y/i ) || ( $save =~ /^\s*$/ ) ) {
722 } elsif ( $command eq "c" ) {
723 if ( $config_use_color == 1 ) {
724 $config_use_color = 2;
728 $config_use_color = 1;
732 } elsif ( $command eq "d" && $menu == 0 ) {
737 if ( ( $command > 0 ) && ( $command < 12 ) ) {
740 } elsif ( $menu == 1 ) {
741 if ( $command == 1 ) { $org_name = command1
(); }
742 elsif ( $command == 2 ) { $org_logo = command2
(); }
743 elsif ( $command == 3 ) { ($org_logo_width,$org_logo_height) = command2a
(); }
744 elsif ( $command == 4 ) { $org_title = command3
(); }
745 elsif ( $command == 5 ) { $signout_page = command4
(); }
746 elsif ( $command == 6 ) { $frame_top = command6
(); }
747 elsif ( $command == 7 ) { $provider_uri = command7
(); }
748 elsif ( $command == 8 ) { $provider_name = command8
(); }
750 } elsif ( $menu == 2 ) {
751 if ( $command eq "a" ) { $show_imap_settings = 1; $show_smtp_settings = 0; }
752 elsif ( $command eq "b" ) { $show_imap_settings = 0; $show_smtp_settings = 1; }
753 elsif ( $command eq "h" ) { $show_imap_settings = 0; $show_smtp_settings = 0; }
754 elsif ( $command <= 3 ) {
755 if ( $command == 1 ) { $domain = command11
(); }
756 elsif ( $command == 2 ) { $invert_time = command110
(); }
757 elsif ( $command == 3 ) { $useSendmail = command14
(); }
758 $show_imap_settings = 0; $show_smtp_settings = 0;
759 } elsif ( $show_imap_settings ) {
760 if ( $command == 4 ) { $imapServerAddress = command12
(); }
761 elsif ( $command == 5 ) { $imapPort = command13
(); }
762 elsif ( $command == 6 ) { $imap_auth_mech = command112a
(); }
763 elsif ( $command == 7 ) { $use_imap_tls = command113
("IMAP",$use_imap_tls); }
764 elsif ( $command == 8 ) { $imap_server_type = command19
(); }
765 elsif ( $command == 9 ) { $optional_delimiter = command111
(); }
766 } elsif ( $show_smtp_settings && lc($useSendmail) eq 'true' ) {
767 if ( $command == 4 ) { $sendmail_path = command15
(); }
768 elsif ( $command == 5 ) { $sendmail_args = command_sendmail_args
(); }
769 elsif ( $command == 6 ) { $encode_header_key = command114
(); }
770 } elsif ( $show_smtp_settings ) {
771 if ( $command == 4 ) { $smtpServerAddress = command16
(); }
772 elsif ( $command == 5 ) { $smtpPort = command17
(); }
773 elsif ( $command == 6 ) { $pop_before_smtp = command18a
(); }
774 elsif ( $command == 7 ) { $smtp_auth_mech = command112b
(); }
775 elsif ( $command == 8 ) { $use_smtp_tls = command113
("SMTP",$use_smtp_tls); }
776 elsif ( $command == 9 ) { $encode_header_key = command114
(); }
778 } elsif ( $menu == 3 ) {
779 if ( $command == 1 ) { $default_folder_prefix = command21
(); }
780 elsif ( $command == 2 ) { $show_prefix_option = command22
(); }
781 elsif ( $command == 3 ) { $trash_folder = command23a
(); }
782 elsif ( $command == 4 ) { $sent_folder = command23b
(); }
783 elsif ( $command == 5 ) { $draft_folder = command23c
(); }
784 elsif ( $command == 6 ) { $default_move_to_trash = command24a
(); }
785 elsif ( $command == 7 ) { $default_move_to_sent = command24b
(); }
786 elsif ( $command == 8 ) { $default_save_as_draft = command24c
(); }
787 elsif ( $command == 9 ) { $list_special_folders_first = command27
(); }
788 elsif ( $command == 10 ) { $use_special_folder_color = command28
(); }
789 elsif ( $command == 11 ) { $auto_expunge = command29
(); }
790 elsif ( $command == 12 ) { $default_sub_of_inbox = command210
(); }
791 elsif ( $command == 13 ) { $show_contain_subfolders_option = command211
(); }
792 elsif ( $command == 14 ) { $default_unseen_notify = command212
(); }
793 elsif ( $command == 15 ) { $default_unseen_type = command213
(); }
794 elsif ( $command == 16 ) { $auto_create_special = command214
(); }
795 elsif ( $command == 17 ) { $delete_folder = command215
(); }
796 elsif ( $command == 18 ) { $noselect_fix_enable = command216
(); }
797 } elsif ( $menu == 4 ) {
798 if ( $command == 1 ) { $data_dir = command33a
(); }
799 elsif ( $command == 2 ) { $attachment_dir = command33b
(); }
800 elsif ( $command == 3 ) { $dir_hash_level = command33c
(); }
801 elsif ( $command == 4 ) { $default_left_size = command35
(); }
802 elsif ( $command == 5 ) { $force_username_lowercase = command36
(); }
803 elsif ( $command == 6 ) { $default_use_priority = command37
(); }
804 elsif ( $command == 7 ) { $hide_sm_attributions = command38
(); }
805 elsif ( $command == 8 ) { $default_use_mdn = command39
(); }
806 elsif ( $command == 9 ) { $edit_identity = command310
(); }
807 elsif ( $command == 10 ) { $allow_thread_sort = command312
(); }
808 elsif ( $command == 11 ) { $allow_server_sort = command313
(); }
809 elsif ( $command == 12 ) { $allow_charset_search = command314
(); }
810 elsif ( $command == 13 ) { $allow_advanced_search = command316
(); }
811 elsif ( $command == 14 ) { $session_name = command317
(); }
812 elsif ( $command == 15 ) { $time_zone_type = command318
(); }
813 } elsif ( $menu == 5 ) {
814 if ( $command == 1 ) { $templateset_default = command_templates
(); }
815 elsif ( $command == 2 ) { $theme_css = command42
(); }
816 elsif ( $command == 3 ) { $default_fontsize = command_default_fontsize
(); }
817 elsif ( $command == 4 ) { command_fontsets
(); }
818 elsif ( $command == 5 ) { command41
(); }
819 } elsif ( $menu == 6 ) {
820 if ( $command == 1 ) { command61
(); }
821 elsif ( $command == 2 ) { command62
(); }
822 elsif ( $command == 3 ) { $abook_global_file=command63
(); }
823 elsif ( $command == 4 ) { command64
(); }
824 elsif ( $command == 5 ) { command65
(); }
825 } elsif ( $menu == 7 ) {
826 if ( $command == 1 ) { $motd = command71
(); }
827 } elsif ( $menu == 8 ) {
828 if ( $command =~ /^[0-9]+/ ) { @plugins = command81
(); }
829 } elsif ( $menu == 9 ) {
830 if ( $command == 1 ) { $addrbook_dsn = command91
(); }
831 elsif ( $command == 2 ) { $addrbook_table = command92
(); }
832 elsif ( $command == 3 ) { $prefs_dsn = command93
(); }
833 elsif ( $command == 4 ) { $prefs_table = command94
(); }
834 elsif ( $command == 5 ) { $prefs_user_field = command95
(); }
835 elsif ( $command == 6 ) { $prefs_key_field = command96
(); }
836 elsif ( $command == 7 ) { $prefs_val_field = command97
(); }
837 elsif ( $command == 8 ) { $addrbook_global_dsn = command98
(); }
838 elsif ( $command == 9 ) { $addrbook_global_table = command99
(); }
839 elsif ( $command == 10 ) { $addrbook_global_writeable = command910
(); }
840 elsif ( $command == 11 ) { $addrbook_global_listing = command911
(); }
841 } elsif ( $menu == 10 ) {
842 if ( $command == 1 ) { $squirrelmail_default_language = commandA1
(); }
843 elsif ( $command == 2 ) { $default_charset = commandA2
(); }
844 elsif ( $command == 3 ) { $show_alternative_names = commandA3
(); }
845 elsif ( $command == 4 ) { $aggressive_decoding = commandA4
(); }
846 elsif ( $command == 5 ) { $lossy_encoding = commandA5
(); }
847 } elsif ( $menu == 11 ) {
848 if ( $command == 1 ) { $advanced_tree = commandB1
(); }
849 if ( $command == 2 ) { $use_iframe = commandB2
(); }
850 elsif ( $command == 3 ) { $use_icons = commandB3
(); }
851 elsif ( $command == 4 ) { $use_php_recode = commandB4
(); }
852 elsif ( $command == 5 ) { $use_php_iconv = commandB5
(); }
853 elsif ( $command == 6 ) { $allow_remote_configtest = commandB6
(); }
859 print "\nExiting conf.pl.\n".
860 "You might want to test your configuration by browsing to\n".
861 "http://your-squirrelmail-location/src/configtest.php\n".
862 "Happy SquirrelMailing!\n\n";
865 ####################################################################################
869 print "We have tried to make the name SquirrelMail as transparent as\n";
870 print "possible. If you set up an organization name, most places where\n";
871 print "SquirrelMail would take credit will be credited to your organization.\n";
873 print "If your Organization Name includes a '\$', please precede it with a \\. \n";
874 print "Other '\$' will be considered the beginning of a variable that\n";
875 print "must be defined before the \$org_name is printed.\n";
877 print "[$WHT$org_name$NRM]: $WHT";
878 $new_org_name = <STDIN
>;
879 if ( $new_org_name eq "\n" ) {
880 $new_org_name = $org_name;
882 $new_org_name =~ s/[\r\n]//g;
883 $new_org_name =~ s/\"/"/g;
885 return $new_org_name;
890 print "Your organization's logo is an image that will be displayed at\n";
891 print "different times throughout SquirrelMail. ";
893 print "Please be aware of the following: \n";
894 print " - Relative URLs are relative to the config dir\n";
895 print " to use the default logo, use ../images/sm_logo.png\n";
896 print " - To specify a logo defined outside the SquirrelMail source tree\n";
897 print " use the absolute URL the webserver would use to include the file\n";
898 print " e.g. http://www.example.com/images/mylogo.gif or /images/mylogo.jpg\n";
900 print "[$WHT$org_logo$NRM]: $WHT";
901 $new_org_logo = <STDIN
>;
902 if ( $new_org_logo eq "\n" ) {
903 $new_org_logo = $org_logo;
905 $new_org_logo =~ s/[\r\n]//g;
907 return $new_org_logo;
912 print "Your organization's logo is an image that will be displayed at\n";
913 print "different times throughout SquirrelMail. Width\n";
914 print "and Height of your logo image. Use '0' to disable.\n";
916 print "Width: [$WHT$org_logo_width$NRM]: $WHT";
917 $new_org_logo_width = <STDIN
>;
918 $new_org_logo_width =~ tr/0-9//cd; # only want digits!
919 if ( $new_org_logo_width eq '' ) {
920 $new_org_logo_width = $org_logo_width;
922 if ( $new_org_logo_width > 0 ) {
923 print "Height: [$WHT$org_logo_height$NRM]: $WHT";
924 $new_org_logo_height = <STDIN
>;
925 $new_org_logo_height =~ tr/0-9//cd; # only want digits!
926 if( $new_org_logo_height eq '' ) {
927 $new_org_logo_height = $org_logo_height;
930 $new_org_logo_height = 0;
932 return ($new_org_logo_width, $new_org_logo_height);
937 print "A title is what is displayed at the top of the browser window in\n";
938 print "the titlebar. Usually this will end up looking something like:\n";
939 print "\"Netscape: $org_title\"\n";
941 print "If your Organization Title includes a '\$', please precede it with a \\. \n";
942 print "Other '\$' will be considered the beginning of a variable that\n";
943 print "must be defined before the \$org_title is printed.\n";
944 print "\$version, for example can be used, and will print the\n";
945 print "string representing the current SquirrelMail version.\n";
947 print "[$WHT$org_title$NRM]: $WHT";
948 $new_org_title = <STDIN
>;
949 if ( $new_org_title eq "\n" ) {
950 $new_org_title = $org_title;
952 $new_org_title =~ s/[\r\n]//g;
953 $new_org_title =~ s/\"/\'/g;
955 return $new_org_title;
960 print "When users click the Sign Out button they will be logged out and\n";
961 print "then sent to signout_page. If signout_page is left empty,\n";
962 print "(hit space and then return) they will be taken, as normal,\n";
963 print "to the default and rather sparse SquirrelMail signout page.\n";
965 print "[$WHT$signout_page$NRM]: $WHT";
966 $new_signout_page = <STDIN
>;
967 if ( $new_signout_page eq "\n" ) {
968 $new_signout_page = $signout_page;
970 $new_signout_page =~ s/[\r\n]//g;
971 $new_signout_page =~ s/^\s+$//g;
973 return $new_signout_page;
978 print "SquirrelMail defaults to using the whole of the browser window.\n";
979 print "This allows you to keep it within a specified frame. The default\n";
982 print "[$WHT$frame_top$NRM]: $WHT";
983 $new_frame_top = <STDIN
>;
984 if ( $new_frame_top eq "\n" ) {
985 $new_frame_top = '_top';
987 $new_frame_top =~ s/[\r\n]//g;
988 $new_frame_top =~ s/^\s+$//g;
990 return $new_frame_top;
993 # Default link to provider
995 print "Here you can set the link on the right of the page.\n";
996 print "If empty, it will link to the SquirrelMail About page.\n";
998 print "[$WHT$provider_uri$NRM]: $WHT";
999 $new_provider_uri = <STDIN
>;
1000 if ( $new_provider_uri eq "\n" ) {
1001 $new_provider_uri = '';
1003 $new_provider_uri =~ s/[\r\n]//g;
1004 $new_provider_uri =~ s/^\s+$//g;
1006 return $new_provider_uri;
1010 print "Here you can set the name of the link on the right of the page.\n";
1011 print "The default is 'SquirrelMail/'\n";
1013 print "[$WHT$provider_name$NRM]: $WHT";
1014 $new_provider_name = <STDIN
>;
1015 if ( $new_provider_name eq "\n" ) {
1016 $new_provider_name = 'SquirrelMail';
1018 $new_provider_name =~ s/[\r\n]//g;
1019 $new_provider_name =~ s/^\s+$//g;
1021 return $new_provider_name;
1024 ####################################################################################
1028 print "The domain name is the suffix at the end of all email addresses. If\n";
1029 print "for example, your email address is jdoe\@example.com, then your domain\n";
1030 print "would be example.com.\n";
1032 print "[$WHT$domain$NRM]: $WHT";
1033 $new_domain = <STDIN
>;
1034 if ( $new_domain eq "\n" ) {
1035 $new_domain = $domain;
1037 $new_domain =~ s/[\r\n]//g;
1044 print "This is the hostname where your IMAP server can be contacted.\n";
1045 print "[$WHT$imapServerAddress$NRM]: $WHT";
1046 $new_imapServerAddress = <STDIN
>;
1047 if ( $new_imapServerAddress eq "\n" ) {
1048 $new_imapServerAddress = $imapServerAddress;
1050 $new_imapServerAddress =~ s/[\r\n]//g;
1052 return $new_imapServerAddress;
1057 print "This is the port that your IMAP server is on. Usually this is 143.\n";
1058 print "[$WHT$imapPort$NRM]: $WHT";
1059 $new_imapPort = <STDIN
>;
1060 if ( $new_imapPort eq "\n" ) {
1061 $new_imapPort = $imapPort;
1063 $new_imapPort =~ s/[\r\n]//g;
1065 return $new_imapPort;
1070 print "You now need to choose the method that you will use for sending\n";
1071 print "messages in SquirrelMail. You can either connect to an SMTP server\n";
1072 print "or use sendmail directly.\n";
1073 if ( lc($useSendmail) eq 'true' ) {
1074 $default_value = "1";
1076 $default_value = "2";
1079 print " 1. Sendmail\n";
1081 print "Your choice [1/2] [$WHT$default_value$NRM]: $WHT";
1082 $use_sendmail = <STDIN
>;
1083 if ( ( $use_sendmail =~ /^1\n/i )
1084 || ( ( $use_sendmail =~ /^\n/ ) && ( $default_value eq "1" ) ) ) {
1085 $useSendmail = 'true';
1087 $useSendmail = 'false';
1089 return $useSendmail;
1094 print "Specify where the sendmail executable is located. Usually /usr/sbin/sendmail\n";
1095 print "[$WHT$sendmail_path$NRM]: $WHT";
1096 $new_sendmail_path = <STDIN
>;
1097 if ( $new_sendmail_path eq "\n" ) {
1098 $new_sendmail_path = $sendmail_path;
1100 $new_sendmail_path =~ s/[\r\n]//g;
1102 return $new_sendmail_path;
1105 # Extra sendmail arguments
1106 sub command_sendmail_args
{
1107 print "Specify additional sendmail program arguments.\n";
1109 print "Make sure that arguments are supported by your sendmail program. -f argument \n";
1110 print "is added automatically by SquirrelMail scripts. Variable defaults to standard\n";
1111 print "/usr/sbin/sendmail arguments. If you use qmail-inject, nbsmtp or any other \n";
1112 print "sendmail wrapper, which does not support -i and -t arguments, set variable to\n";
1113 print "empty string or use arguments suitable for your mailer.\n";
1115 print "[$WHT$sendmail_args$NRM]: $WHT";
1116 $new_sendmail_args = <STDIN
>;
1117 if ( $new_sendmail_args eq "\n" ) {
1118 $new_sendmail_args = $sendmail_args;
1120 # strip linefeeds and crs.
1121 $new_sendmail_args =~ s/[\r\n]//g;
1123 return trim
($new_sendmail_args);
1128 print "This is the hostname of your SMTP server.\n";
1129 print "[$WHT$smtpServerAddress$NRM]: $WHT";
1130 $new_smtpServerAddress = <STDIN
>;
1131 if ( $new_smtpServerAddress eq "\n" ) {
1132 $new_smtpServerAddress = $smtpServerAddress;
1134 $new_smtpServerAddress =~ s/[\r\n]//g;
1136 return $new_smtpServerAddress;
1141 print "This is the port to connect to for SMTP. Usually 25.\n";
1142 print "[$WHT$smtpPort$NRM]: $WHT";
1143 $new_smtpPort = <STDIN
>;
1144 if ( $new_smtpPort eq "\n" ) {
1145 $new_smtpPort = $smtpPort;
1147 $new_smtpPort =~ s/[\r\n]//g;
1149 return $new_smtpPort;
1152 # authenticated server
1155 # This sub disabled by tassium - it has been replaced with smtp_auth_mech
1156 print "Do you wish to use an authenticated SMTP server? Your server must\n";
1157 print "support this in order for SquirrelMail to work with it. We implemented\n";
1158 print "it according to RFC 2554.\n";
1161 $YesNo = 'y' if ( lc($use_authenticated_smtp) eq 'true' );
1163 print "Use authenticated SMTP server (y/n) [$WHT$YesNo$NRM]: $WHT";
1165 $new_use_authenticated_smtp = <STDIN
>;
1166 $new_use_authenticated_smtp =~ tr/yn//cd;
1167 return 'true' if ( $new_use_authenticated_smtp eq "y" );
1168 return 'false' if ( $new_use_authenticated_smtp eq "n" );
1169 return $use_authenticated_smtp;
1174 print "Do you wish to use POP3 before SMTP? Your server must\n";
1175 print "support this in order for SquirrelMail to work with it.\n";
1178 $YesNo = 'y' if ( lc($pop_before_smtp) eq 'true' );
1180 print "Use pop before SMTP (y/n) [$WHT$YesNo$NRM]: $WHT";
1182 $new_pop_before_smtp = <STDIN
>;
1183 $new_pop_before_smtp =~ tr/yn//cd;
1184 return 'true' if ( $new_pop_before_smtp eq "y" );
1185 return 'false' if ( $new_pop_before_smtp eq "n" );
1186 return $pop_before_smtp;
1191 print "Each IMAP server has its own quirks. As much as we tried to stick\n";
1192 print "to standards, it doesn't help much if the IMAP server doesn't follow\n";
1193 print "the same principles. We have made some work-arounds for some of\n";
1194 print "these servers. If you would like to use them, please select your\n";
1195 print "IMAP server. If you do not wish to use these work-arounds, you can\n";
1196 print "set this to \"other\", and none will be used.\n";
1197 print " courier = Courier IMAP server\n";
1198 print " cyrus = Cyrus IMAP server\n";
1199 print " dovecot = Dovecot Secure IMAP server\n";
1200 print " exchange = Microsoft Exchange IMAP server\n";
1201 print " hmailserver = hMailServer\n";
1202 print " macosx = Mac OS X Mailserver\n";
1203 print " mercury32 = Mercury Mail Transport System\n";
1204 print " uw = University of Washington's IMAP server\n";
1206 print " other = Not one of the above servers\n";
1208 print "[$WHT$imap_server_type$NRM]: $WHT";
1209 $new_imap_server_type = <STDIN
>;
1211 if ( $new_imap_server_type eq "\n" ) {
1212 $new_imap_server_type = $imap_server_type;
1214 $new_imap_server_type =~ s/[\r\n]//g;
1216 return $new_imap_server_type;
1221 print "Sometimes the date of messages sent is messed up (off by a few hours\n";
1222 print "on some machines). Typically this happens if the system doesn't support\n";
1223 print "tm_gmtoff. It will happen only if your time zone is \"negative\".\n";
1224 print "This most often occurs on Solaris 7 machines in the United States.\n";
1225 print "By default, this is off. It should be kept off unless problems surface\n";
1226 print "about the time that messages are sent.\n";
1227 print " no = Do NOT fix time -- almost always correct\n";
1228 print " yes = Fix the time for this system\n";
1231 $YesNo = 'y' if ( lc($invert_time) eq 'true' );
1233 print "Fix the time for this system (y/n) [$WHT$YesNo$NRM]: $WHT";
1235 $new_invert_time = <STDIN
>;
1236 $new_invert_time =~ tr/yn//cd;
1237 return 'true' if ( $new_invert_time eq "y" );
1238 return 'false' if ( $new_invert_time eq "n" );
1239 return $invert_time;
1243 print "This is the delimiter that your IMAP server uses to distinguish between\n";
1244 print "folders. For example, Cyrus uses '.' as the delimiter and a complete\n";
1245 print "folder would look like 'INBOX.Friends.Bob', while UW uses '/' and would\n";
1246 print "look like 'INBOX/Friends/Bob'. Normally this should be left at 'detect'\n";
1247 print "but if you are sure you know what delimiter your server uses, you can\n";
1248 print "specify it here.\n";
1249 print "\nTo have it autodetect the delimiter, set it to 'detect'.\n\n";
1250 print "[$WHT$optional_delimiter$NRM]: $WHT";
1251 $new_optional_delimiter = <STDIN
>;
1253 if ( $new_optional_delimiter eq "\n" ) {
1254 $new_optional_delimiter = $optional_delimiter;
1256 $new_optional_delimiter =~ s/[\r\n]//g;
1258 return $new_optional_delimiter;
1260 # IMAP authentication type
1261 # Possible values: login, plain, cram-md5, digest-md5
1262 # Now offers to detect supported mechs, assuming server & port are set correctly
1265 if ($use_imap_tls =~ /^true\b/i) {
1266 print "Auto-detection of login methods is unavailable when using TLS.\n";
1268 print "If you have already set the hostname and port number, I can try to\n";
1269 print "detect the mechanisms your IMAP server supports.\n";
1270 print "I will try to detect CRAM-MD5 and DIGEST-MD5 support. I can't test\n";
1271 print "for \"login\" or \"plain\" without knowing a username and password.\n";
1272 print "Auto-detecting is optional - you can safely say \"n\" here.\n";
1273 print "\nTry to detect supported mechanisms? [y/N]: ";
1276 if ($inval =~ /^y\b/i) {
1277 # Yes, let's try to detect.
1278 print "Trying to detect IMAP capabilities...\n";
1279 my $host = $imapServerAddress . ':'. $imapPort;
1280 print "CRAM-MD5:\t";
1281 my $tmp = detect_auth_support
('IMAP',$host,'CRAM-MD5');
1282 if (defined($tmp)) {
1283 if ($tmp eq 'YES') {
1284 print "$WHT SUPPORTED$NRM\n";
1286 print "$WHT NOT SUPPORTED$NRM\n";
1289 print $WHT . " ERROR DETECTING$NRM\n";
1292 print "DIGEST-MD5:\t";
1293 $tmp = detect_auth_support
('IMAP',$host,'DIGEST-MD5');
1294 if (defined($tmp)) {
1295 if ($tmp eq 'YES') {
1296 print "$WHT SUPPORTED$NRM\n";
1298 print "$WHT NOT SUPPORTED$NRM\n";
1301 print $WHT . " ERROR DETECTING$NRM\n";
1306 print "\nWhat authentication mechanism do you want to use for IMAP connections?\n\n";
1307 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1308 print $WHT . "plain" . $NRM . " - SASL PLAIN. If you need this, you already know it.\n";
1309 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext methods.\n";
1310 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1311 print "\n*** YOUR IMAP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n";
1312 print "If you don't understand or are unsure, you probably want \"login\"\n\n";
1313 print "login, plain, cram-md5, or digest-md5 [$WHT$imap_auth_mech$NRM]: $WHT";
1316 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || ($inval =~ /^login\b/i) || ($inval =~ /^plain\b/i)) {
1319 # user entered garbage or default value so nothing needs to be set
1320 return $imap_auth_mech;
1325 # SMTP authentication type
1326 # Possible choices: none, plain, cram-md5, digest-md5
1328 if ($use_smtp_tls =~ /^true\b/i) {
1329 print "Auto-detection of login methods is unavailable when using TLS.\n";
1331 print "If you have already set the hostname and port number, I can try to\n";
1332 print "automatically detect some of the mechanisms your SMTP server supports.\n";
1333 print "Auto-detection is *optional* - you can safely say \"n\" here.\n";
1334 print "\nTry to detect auth mechanisms? [y/N]: ";
1337 if ($inval =~ /^y\b/i) {
1338 # Yes, let's try to detect.
1339 print "Trying to detect supported methods (SMTP)...\n";
1342 # Check none by trying to relay to junk@microsoft.com
1343 $host = $smtpServerAddress . ':' . $smtpPort;
1345 my $sock = IO
::Socket
::INET
->new($host);
1346 print "Testing none:\t\t$WHT";
1347 if (!defined($sock)) {
1348 print " ERROR TESTING\n";
1351 print $sock "HELO $domain\r\n";
1352 $got = <$sock>; # Discard
1353 print $sock "MAIL FROM:<tester\@squirrelmail.org>\r\n";
1354 $got = <$sock>; # Discard
1355 print $sock "RCPT TO:<junk\@microsoft.com\r\n";
1356 $got = <$sock>; # This is the important line
1357 if ($got =~ /^250\b/) { # SMTP will relay without auth
1358 print "SUPPORTED$NRM\n";
1360 print "NOT SUPPORTED$NRM\n";
1362 print $sock "RSET\r\n";
1363 print $sock "QUIT\r\n";
1366 # Try login (SquirrelMail default)
1367 print "Testing login:\t\t";
1368 $tmp=detect_auth_support
('SMTP',$host,'LOGIN');
1369 if (defined($tmp)) {
1370 if ($tmp eq 'YES') {
1371 print $WHT . "SUPPORTED$NRM\n";
1373 print $WHT . "NOT SUPPORTED$NRM\n";
1376 print $WHT . "ERROR DETECTING$NRM\n";
1380 print "Testing CRAM-MD5:\t";
1381 $tmp=detect_auth_support
('SMTP',$host,'CRAM-MD5');
1382 if (defined($tmp)) {
1383 if ($tmp eq 'YES') {
1384 print $WHT . "SUPPORTED$NRM\n";
1386 print $WHT . "NOT SUPPORTED$NRM\n";
1389 print $WHT . "ERROR DETECTING$NRM\n";
1393 print "Testing DIGEST-MD5:\t";
1394 $tmp=detect_auth_support
('SMTP',$host,'DIGEST-MD5');
1395 if (defined($tmp)) {
1396 if ($tmp eq 'YES') {
1397 print $WHT . "SUPPORTED$NRM\n";
1399 print $WHT . "NOT SUPPORTED$NRM\n";
1402 print $WHT . "ERROR DETECTING$NRM\n";
1406 print "\nWhat authentication mechanism do you want to use for SMTP connections?\n";
1407 print $WHT . "none" . $NRM . " - Your SMTP server does not require authorization.\n";
1408 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1409 print $WHT . "plain" . $NRM . " - SASL PLAIN. You already know it if you need this.\n";
1410 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext.\n";
1411 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1412 print $WHT . "\n*** YOUR SMTP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n" . $NRM;
1413 print "If you don't understand or are unsure, you probably want \"none\"\n\n";
1414 print "none, login, cram-md5, or digest-md5 [$WHT$smtp_auth_mech$NRM]: $WHT";
1417 if ($inval =~ /^none\b/i) {
1418 # SMTP doesn't necessarily require logins
1421 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) ||
1422 ($inval =~ /^login\b/i) || ($inval =~/^plain\b/i)) {
1425 # user entered garbage, or default value so nothing needs to be set
1426 return $smtp_auth_mech;
1431 # This sub is reused for IMAP and SMTP
1432 # Args: service name, default value
1434 my($default_val,$service,$inval);
1437 print "TLS (Transport Layer Security) encrypts the traffic between server and client.\n";
1438 print "If you're familiar with SSL, you get the idea.\n";
1439 print "To use this feature, your " . $service . " server must offer TLS\n";
1440 print "capability, plus PHP 4.3.x with OpenSSL support.\n";
1441 print "\nIf your " . $service . " server is localhost, you can safely disable this.\n";
1442 print "If it is remote, you may wish to seriously consider enabling this.\n";
1443 print "Enable TLS (y/n) [$WHT";
1444 if ($default_val eq 'true') {
1449 print "$NRM]: $WHT";
1451 $inval =~ tr/yn//cd;
1452 return 'true' if ( $inval eq "y" );
1453 return 'false' if ( $inval eq "n" );
1454 return $default_val;
1457 # $encode_header_key
1459 print "Encryption key allows to hide SquirrelMail Received: headers\n";
1460 print "in outbound messages. Interface uses encryption key to encode\n";
1461 print "username, remote address and proxied address, then stores encoded\n";
1462 print "information in X-Squirrel-* headers.\n";
1464 print "Warning: used encryption function is not bulletproof. When used\n";
1465 print "with static encryption keys, it provides only minimal security\n";
1466 print "measures and information can be decoded quickly.\n";
1468 print "Encoded information can be decoded with decrypt_headers.php script\n";
1469 print "from SquirrelMail contrib/ directory.\n";
1471 print "Enter encryption key: ";
1472 $new_encode_header_key = <STDIN
>;
1473 if ( $new_encode_header_key eq "\n" ) {
1474 $new_encode_header_key = $encode_header_key;
1476 $new_encode_header_key =~ s/[\r\n]//g;
1478 return $new_encode_header_key;
1483 print "\nYou can now create the welcome message that is displayed\n";
1484 print "every time a user logs on. You can use HTML or just plain\n";
1486 "text. If you do not wish to have one, just make it blank.\n\n(Type @ on a blank line to exit)\n";
1492 $line =~ s/[\r\n]//g;
1493 if ( $line ne "@" ) {
1494 $line =~ s/ /\ \ /g;
1495 $line =~ s/\t/\ \ \ \ /g;
1497 $line =~ s/\"/\\\"/g;
1499 $new_motd = $new_motd . $line;
1501 } while ( $line ne "@" );
1505 ################# PLUGINS ###################
1508 $command =~ s/[\s\n\r]*//g;
1509 if ( $command > 0 ) {
1510 $command = $command - 1;
1511 if ( $command <= $#plugins ) {
1514 while ( $ct <= $#plugins ) {
1515 if ( $ct != $command ) {
1516 @newplugins = ( @newplugins, $plugins[$ct] );
1520 @plugins = @newplugins;
1521 } elsif ( $command <= $#plugins + $#unused_plugins + 1 ) {
1522 $num = $command - $#plugins - 1;
1523 @newplugins = @plugins;
1525 while ( $ct <= $#unused_plugins ) {
1526 if ( $ct == $num ) {
1527 @newplugins = ( @newplugins, $unused_plugins[$ct] );
1531 @plugins = @newplugins;
1537 ################# FOLDERS ###################
1539 # default_folder_prefix
1541 print "Some IMAP servers (UW, for example) store mail and folders in\n";
1542 print "your user space in a separate subdirectory. This is where you\n";
1543 print "specify what that directory is.\n";
1545 print "EXAMPLE: mail/";
1547 print "NOTE: If you use Cyrus, or some server that would not use this\n";
1548 print " option, you must set this to 'none'.\n";
1550 print "[$WHT$default_folder_prefix$NRM]: $WHT";
1551 $new_default_folder_prefix = <STDIN
>;
1553 if ( $new_default_folder_prefix eq "\n" ) {
1554 $new_default_folder_prefix = $default_folder_prefix;
1556 $new_default_folder_prefix =~ s/[\r\n]//g;
1558 if ( ( $new_default_folder_prefix =~ /^\s*$/ ) || ( $new_default_folder_prefix =~ m/^none$/i ) ) {
1559 $new_default_folder_prefix = "";
1561 # add the trailing delimiter only if we know what the server is.
1562 if (($imap_server_type eq 'cyrus' and
1563 $optional_delimiter eq 'detect') or
1564 ($imap_server_type eq 'courier' and
1565 $optional_delimiter eq 'detect')) {
1566 $new_default_folder_prefix =~ s/\.*$/\./;
1567 } elsif ($imap_server_type eq 'uw' and
1568 $optional_delimiter eq 'detect') {
1569 $new_default_folder_prefix =~ s/\/*$/\
//;
1572 return $new_default_folder_prefix;
1575 # Show Folder Prefix
1577 print "It is possible to set up the default folder prefix as a user\n";
1578 print "specific option, where each user can specify what their mail\n";
1579 print "folder is. If you set this to false, they will never see the\n";
1580 print "option, but if it is true, this option will appear in the\n";
1581 print "'options' section.\n";
1583 print "NOTE: You set the default folder prefix in option '1' of this\n";
1584 print " section. That will be the default if the user doesn't\n";
1585 print " specify anything different.\n";
1588 if ( lc($show_prefix_option) eq 'true' ) {
1589 $default_value = "y";
1591 $default_value = "n";
1594 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1595 $new_show = <STDIN
>;
1596 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1597 $show_prefix_option = 'true';
1599 $show_prefix_option = 'false';
1601 return $show_prefix_option;
1606 print "You can now specify where the default trash folder is located.\n";
1607 print "On servers where you do not want this, you can set it to anything\n";
1608 print "and set option 6 to false.\n";
1610 print "This is relative to where the rest of your email is kept. You do\n";
1611 print "not need to worry about their mail directory. If this folder\n";
1612 print "would be ~/mail/trash on the filesystem, you only need to specify\n";
1613 print "that this is 'trash', and be sure to put 'mail/' in option 1.\n";
1616 print "[$WHT$trash_folder$NRM]: $WHT";
1617 $new_trash_folder = <STDIN
>;
1618 if ( $new_trash_folder eq "\n" ) {
1619 $new_trash_folder = $trash_folder;
1621 $new_trash_folder =~ s/[\r\n]//g;
1623 return $new_trash_folder;
1628 print "This is where messages that are sent will be stored. SquirrelMail\n";
1629 print "by default puts a copy of all outgoing messages in this folder.\n";
1631 print "This is relative to where the rest of your email is kept. You do\n";
1632 print "not need to worry about their mail directory. If this folder\n";
1633 print "would be ~/mail/sent on the filesystem, you only need to specify\n";
1634 print "that this is 'sent', and be sure to put 'mail/' in option 1.\n";
1637 print "[$WHT$sent_folder$NRM]: $WHT";
1638 $new_sent_folder = <STDIN
>;
1639 if ( $new_sent_folder eq "\n" ) {
1640 $new_sent_folder = $sent_folder;
1642 $new_sent_folder =~ s/[\r\n]//g;
1644 return $new_sent_folder;
1649 print "You can now specify where the default draft folder is located.\n";
1650 print "On servers where you do not want this, you can set it to anything\n";
1651 print "and set option 9 to false.\n";
1653 print "This is relative to where the rest of your email is kept. You do\n";
1654 print "not need to worry about their mail directory. If this folder\n";
1655 print "would be ~/mail/drafts on the filesystem, you only need to specify\n";
1656 print "that this is 'drafts', and be sure to put 'mail/' in option 1.\n";
1659 print "[$WHT$draft_folder$NRM]: $WHT";
1660 $new_draft_folder = <STDIN
>;
1661 if ( $new_draft_folder eq "\n" ) {
1662 $new_draft_folder = $draft_folder;
1664 $new_draft_folder =~ s/[\r\n]//g;
1666 return $new_draft_folder;
1669 # default move to trash
1671 print "By default, should messages get moved to the trash folder? You\n";
1672 print "can specify the default trash folder in option 3. If this is set\n";
1673 print "to false, messages will get deleted immediately without moving\n";
1674 print "to the trash folder.\n";
1676 print "Trash folder is currently: $trash_folder\n";
1679 if ( lc($default_move_to_trash) eq 'true' ) {
1680 $default_value = "y";
1682 $default_value = "n";
1684 print "By default, move to trash (y/n) [$WHT$default_value$NRM]: $WHT";
1685 $new_show = <STDIN
>;
1686 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1687 $default_move_to_trash = 'true';
1689 $default_move_to_trash = 'false';
1691 return $default_move_to_trash;
1694 # default move to sent
1696 print "By default, should messages get moved to the sent folder? You\n";
1697 print "can specify the default sent folder in option 4. If this is set\n";
1698 print "to false, messages will get sent and no copy will be made.\n";
1700 print "Sent folder is currently: $sent_folder\n";
1703 if ( lc($default_move_to_sent) eq 'true' ) {
1704 $default_value = "y";
1706 $default_value = "n";
1708 print "By default, move to sent (y/n) [$WHT$default_value$NRM]: $WHT";
1709 $new_show = <STDIN
>;
1710 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1711 $default_move_to_sent = 'true';
1713 $default_move_to_sent = 'false';
1715 return $default_move_to_sent;
1718 # default save as draft
1720 print "By default, should the save to draft option be shown? You can\n";
1721 print "specify the default drafts folder in option 5. If this is set\n";
1722 print "to false, users will not be shown the save to draft option.\n";
1724 print "Drafts folder is currently: $draft_folder\n";
1727 if ( lc($default_move_to_draft) eq 'true' ) {
1728 $default_value = "y";
1730 $default_value = "n";
1732 print "By default, save as draft (y/n) [$WHT$default_value$NRM]: $WHT";
1733 $new_show = <STDIN
>;
1734 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1735 $default_save_as_draft = 'true';
1737 $default_save_as_draft = 'false';
1739 return $default_save_as_draft;
1742 # List special folders first
1744 print "SquirrelMail has what we call 'special folders' that are not\n";
1745 print "manipulated and viewed like normal folders. Some examples of\n";
1746 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
1747 print "Simply asks if you want these folders listed first in the folder\n";
1751 if ( lc($list_special_folders_first) eq 'true' ) {
1752 $default_value = "y";
1754 $default_value = "n";
1757 print "List first (y/n) [$WHT$default_value$NRM]: $WHT";
1758 $new_show = <STDIN
>;
1759 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1760 $list_special_folders_first = 'true';
1762 $list_special_folders_first = 'false';
1764 return $list_special_folders_first;
1767 # Show special folders color
1769 print "SquirrelMail has what we call 'special folders' that are not\n";
1770 print "manipulated and viewed like normal folders. Some examples of\n";
1771 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
1772 print "wants to know if we should display special folders in a\n";
1773 print "color than the other folders.\n";
1776 if ( lc($use_special_folder_color) eq 'true' ) {
1777 $default_value = "y";
1779 $default_value = "n";
1782 print "Show color (y/n) [$WHT$default_value$NRM]: $WHT";
1783 $new_show = <STDIN
>;
1784 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1785 $use_special_folder_color = 'true';
1787 $use_special_folder_color = 'false';
1789 return $use_special_folder_color;
1794 print "The way that IMAP handles deleting messages is as follows. You\n";
1795 print "mark the message as deleted, and then to 'really' delete it, you\n";
1796 print "expunge it. This option asks if you want to just have messages\n";
1797 print "marked as deleted, or if you want SquirrelMail to expunge the \n";
1798 print "messages too.\n";
1801 if ( lc($auto_expunge) eq 'true' ) {
1802 $default_value = "y";
1804 $default_value = "n";
1806 print "Auto expunge (y/n) [$WHT$default_value$NRM]: $WHT";
1807 $new_show = <STDIN
>;
1808 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1809 $auto_expunge = 'true';
1811 $auto_expunge = 'false';
1813 return $auto_expunge;
1816 # Default sub of inbox
1818 print "Some IMAP servers (Cyrus) have all folders as subfolders of INBOX.\n";
1819 print "This can cause some confusion in folder creation for users when\n";
1820 print "they try to create folders and don't put it as a subfolder of INBOX\n";
1821 print "and get permission errors. This option asks if you want folders\n";
1822 print "to be subfolders of INBOX by default.\n";
1825 if ( lc($default_sub_of_inbox) eq 'true' ) {
1826 $default_value = "y";
1828 $default_value = "n";
1830 print "Default sub of INBOX (y/n) [$WHT$default_value$NRM]: $WHT";
1831 $new_show = <STDIN
>;
1832 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1833 $default_sub_of_inbox = 'true';
1835 $default_sub_of_inbox = 'false';
1837 return $default_sub_of_inbox;
1840 # Show contain subfolder option
1842 print "Some IMAP servers (UW) make it so that there are two types of\n";
1843 print "folders. Those that contain messages, and those that contain\n";
1844 print "subfolders. If this is the case for your server, set this to\n";
1845 print "true, and it will ask the user whether the folder they are\n";
1846 print "creating contains subfolders or messages.\n";
1849 if ( lc($show_contain_subfolders_option) eq 'true' ) {
1850 $default_value = "y";
1852 $default_value = "n";
1854 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1855 $new_show = <STDIN
>;
1856 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1857 $show_contain_subfolders_option = 'true';
1859 $show_contain_subfolders_option = 'false';
1861 return $show_contain_subfolders_option;
1864 # Default Unseen Notify
1866 print "This option specifies where the users will receive notification\n";
1867 print "about unseen messages by default. This is of course an option that\n";
1868 print "can be changed on a user level.\n";
1869 print " 1 = No notification\n";
1870 print " 2 = Only on the INBOX\n";
1871 print " 3 = On all folders\n";
1874 print "Which one should be default (1,2,3)? [$WHT$default_unseen_notify$NRM]: $WHT";
1875 $new_show = <STDIN
>;
1876 if ( $new_show =~ /^[123]\n/i ) {
1877 $default_unseen_notify = $new_show;
1879 $default_unseen_notify =~ s/[\r\n]//g;
1880 return $default_unseen_notify;
1883 # Default Unseen Type
1885 print "Here you can define the default way that unseen messages will be displayed\n";
1886 print "to the user in the folder listing on the left side.\n";
1887 print " 1 = Only unseen messages (4)\n";
1888 print " 2 = Unseen and Total messages (4/27)\n";
1891 print "Which one should be default (1,2)? [$WHT$default_unseen_type$NRM]: $WHT";
1892 $new_show = <STDIN
>;
1893 if ( $new_show =~ /^[12]\n/i ) {
1894 $default_unseen_type = $new_show;
1896 $default_unseen_type =~ s/[\r\n]//g;
1897 return $default_unseen_type;
1900 # Auto create special folders
1902 print "Would you like the Sent, Trash, and Drafts folders to be created\n";
1903 print "automatically print for you when a user logs in? If the user\n";
1904 print "accidentally deletes their special folders, this option will\n";
1905 print "automatically create it again for them.\n";
1908 if ( lc($auto_create_special) eq 'true' ) {
1909 $default_value = "y";
1911 $default_value = "n";
1913 print "Auto create special folders? (y/n) [$WHT$default_value$NRM]: $WHT";
1914 $new_show = <STDIN
>;
1915 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1916 $auto_create_special = 'true';
1918 $auto_create_special = 'false';
1920 return $auto_create_special;
1923 # Automatically delete folders
1925 if ( $imap_server_type eq "uw" ) {
1926 print "UW IMAP servers will not allow folders containing mail to also contain folders.\n";
1927 print "Deleting folders will bypass the trash folder and be immediately deleted\n\n";
1928 print "If this is not the correct value for your server,\n";
1929 print "please use option D on the Main Menu to configure your server correctly.\n\n";
1930 print "Press any key to continue...\n";
1931 $new_delete = <STDIN
>;
1932 $delete_folder = 'true';
1934 if ( $imap_server_type eq "courier" ) {
1935 print "Courier (or Courier-IMAP) IMAP servers may not support ";
1936 print "subfolders of Trash. \n";
1937 print "Specifically, if Courier is set to always move messages to Trash, \n";
1938 print "Trash will be treated by Courier as a special folder that does not \n";
1939 print "allow subfolders. \n\n";
1940 print "Please verify your Courier configuration, and test folder deletion \n";
1941 print "when changing this setting.\n\n";
1944 print "Are subfolders of the Trash supported by your IMAP server?\n";
1945 print "If so, should deleted folders be sent to Trash?\n";
1946 print "If not, say no (deleted folders should not be sent to Trash)\n\n";
1947 # reversal of logic.
1948 # question was: Should folders be automatically deleted instead of sent to trash..
1949 # we've changed the question to make it more clear,
1950 # and are here handling that to avoid changing the answers..
1951 if ( lc($delete_folder) eq 'true' ) {
1952 $default_value = "n";
1954 $default_value = "y";
1956 print "Send deleted folders to Trash? (y/n) [$WHT$default_value$NRM]: $WHT";
1957 $new_delete = <STDIN
>;
1958 if ( ( $new_delete =~ /^y\n/i ) || ( ( $new_delete =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1959 $delete_folder = 'false';
1961 $delete_folder = 'true';
1964 return $delete_folder;
1969 print "Some IMAP server allow subfolders to exist even if the parent\n";
1970 print "folders do not. This fixes some problems with the folder list\n";
1971 print "when this is the case, causing the /NoSelect folders to be displayed\n";
1974 if ( lc($noselect_fix_enable) eq 'true' ) {
1975 $default_value = "y";
1977 $default_value = "n";
1979 print "enable noselect fix? (y/n) [$WHT$noselect_fix_enable$NRM]: $WHT";
1980 $noselect_fix_enable = <STDIN
>;
1981 if ( ( $noselect_fix_enable =~ /^y\n/i ) || ( ( $noselect_fix_enable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1982 $noselect_fix_enable = 'true';
1984 $noselect_fix_enable = 'false';
1986 return $noselect_fix_enable;
1988 ############# GENERAL OPTIONS #####################
1992 print "Specify the location for your data directory.\n";
1993 print "You need to create this directory yourself.\n";
1994 print "The path name can be absolute or relative (to the config directory).\n";
1995 print "Here are two examples:\n";
1996 print " Absolute: /var/local/squirrelmail/data/\n";
1997 print " Relative: ../data/\n";
1998 print "Relative paths to directories outside of the SquirrelMail distribution\n";
1999 print "will be converted to their absolute path equivalents in config.php.\n\n";
2000 print "Note: There are potential security risks with having a writeable directory\n";
2001 print "under the web server's root directory (ex: /home/httpd/html).\n";
2002 print "For this reason, it is recommended to put the data directory\n";
2003 print "in an alternate location of your choice. \n";
2006 print "[$WHT$data_dir$NRM]: $WHT";
2007 $new_data_dir = <STDIN
>;
2008 if ( $new_data_dir eq "\n" ) {
2009 $new_data_dir = $data_dir;
2011 $new_data_dir =~ s/[\r\n]//g;
2013 if ( $new_data_dir =~ /^\s*$/ ) {
2016 $new_data_dir =~ s/\/*$//g
;
2017 $new_data_dir =~ s/$/\//g
;
2019 return $new_data_dir;
2022 # Attachment directory
2024 print "Path to directory used for storing attachments while a mail is\n";
2025 print "being composed. The path name can be absolute or relative (to the\n";
2026 print "config directory). Here are two examples:\n";
2027 print " Absolute: /var/local/squirrelmail/attach/\n";
2028 print " Relative: ../attach/\n";
2029 print "Relative paths to directories outside of the SquirrelMail distribution\n";
2030 print "will be converted to their absolute path equivalents in config.php.\n\n";
2031 print "Note: There are a few security considerations regarding this\n";
2032 print "directory:\n";
2033 print " 1. It should have the permission 733 (rwx-wx-wx) to make it\n";
2034 print " impossible for a random person with access to the webserver\n";
2035 print " to list files in this directory. Confidential data might\n";
2036 print " be laying around in there.\n";
2037 print " Depending on your user:group assignments, 730 (rwx-wx---)\n";
2038 print " may be possible, and more secure (e.g. root:apache)\n";
2039 print " 2. Since the webserver is not able to list the files in the\n";
2040 print " content is also impossible for the webserver to delete files\n";
2041 print " lying around there for too long.\n";
2042 print " 3. It should probably be another directory than the data\n";
2043 print " directory specified in option 3.\n";
2046 print "[$WHT$attachment_dir$NRM]: $WHT";
2047 $new_attachment_dir = <STDIN
>;
2048 if ( $new_attachment_dir eq "\n" ) {
2049 $new_attachment_dir = $attachment_dir;
2051 $new_attachment_dir =~ s/[\r\n]//g;
2053 if ( $new_attachment_dir =~ /^\s*$/ ) {
2054 $new_attachment_dir = "";
2056 $new_attachment_dir =~ s/\/*$//g
;
2057 $new_attachment_dir =~ s/$/\//g
;
2059 return $new_attachment_dir;
2063 print "The directory hash level setting allows you to configure the level\n";
2064 print "of hashing that SquirrelMail employs in your data and attachment\n";
2065 print "directories. This value must be an integer ranging from 0 to 4.\n";
2066 print "When this value is set to 0, SquirrelMail will simply store all\n";
2067 print "files as normal in the data and attachment directories. However,\n";
2068 print "when set to a value from 1 to 4, a simple hashing scheme will be\n";
2069 print "used to organize the files in this directory. In short, the crc32\n";
2070 print "value for a username will be computed. Then, up to the first 4\n";
2071 print "digits of the hash, as set by this configuration value, will be\n";
2072 print "used to directory hash the files for that user in the data and\n";
2073 print "attachment directory. This allows for better performance on\n";
2074 print "servers with larger numbers of users.\n";
2077 print "[$WHT$dir_hash_level$NRM]: $WHT";
2078 $new_dir_hash_level = <STDIN
>;
2079 if ( $new_dir_hash_level eq "\n" ) {
2080 $new_dir_hash_level = $dir_hash_level;
2082 $new_dir_hash_level =~ s/[\r\n]//g;
2084 if ( ( int($new_dir_hash_level) < 0 )
2085 || ( int($new_dir_hash_level) > 4 )
2086 || !( int($new_dir_hash_level) eq $new_dir_hash_level ) ) {
2087 print "Invalid Directory Hash Level.\n";
2088 print "Value must be an integer ranging from 0 to 4\n";
2089 print "Hit enter to continue.\n";
2090 $enter_key = <STDIN
>;
2092 $new_dir_hash_level = $dir_hash_level;
2095 return $new_dir_hash_level;
2099 print "This is the default size (in pixels) of the left folder list.\n";
2100 print "Default is 200, but you can set it to whatever you wish. This\n";
2101 print "is a user preference, so this will only show up as their default.\n";
2103 print "[$WHT$default_left_size$NRM]: $WHT";
2104 $new_default_left_size = <STDIN
>;
2105 if ( $new_default_left_size eq "\n" ) {
2106 $new_default_left_size = $default_left_size;
2108 $new_default_left_size =~ s/[\r\n]//g;
2110 return $new_default_left_size;
2114 print "Some IMAP servers only have lowercase letters in the usernames\n";
2115 print "but they still allow people with uppercase to log in. This\n";
2116 print "causes a problem with the user's preference files. This option\n";
2117 print "transparently changes all usernames to lowercase.";
2120 if ( lc($force_username_lowercase) eq 'true' ) {
2121 $default_value = "y";
2123 $default_value = "n";
2125 print "Convert usernames to lowercase (y/n) [$WHT$default_value$NRM]: $WHT";
2126 $new_show = <STDIN
>;
2127 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2137 if ( lc($default_use_priority) eq 'true' ) {
2138 $default_value = "y";
2140 $default_value = "n";
2143 print "Allow users to specify priority of outgoing mail (y/n) [$WHT$default_value$NRM]: $WHT";
2144 $new_show = <STDIN
>;
2145 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2155 if ( lc($default_hide_attribution) eq 'true' ) {
2156 $default_value = "y";
2158 $default_value = "n";
2161 print "Hide SM attributions (y/n) [$WHT$default_value$NRM]: $WHT";
2162 $new_show = <STDIN
>;
2163 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2173 if ( lc($default_use_mdn) eq 'true' ) {
2174 $default_value = "y";
2176 $default_value = "n";
2179 print "Enable support for read/delivery receipt support (y/n) [$WHT$default_value$NRM]: $WHT";
2180 $new_show = <STDIN
>;
2181 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2189 print " In loosely managed environments, you may want to allow users
2190 to edit their full name and email address. In strictly managed
2191 environments, you may want to force users to use the name
2192 and email address assigned to them.
2194 'y' - allow a user to edit their full name and email address,
2195 'n' - users must use the assigned values.
2199 if ( lc($edit_identity) eq 'true' ) {
2200 $default_value = "y";
2202 $default_value = "n";
2204 print "Allow editing of user's identity? (y/n) [$WHT$default_value$NRM]: $WHT";
2205 $new_edit = <STDIN
>;
2206 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2207 $edit_identity = 'true';
2208 $edit_name = 'true';
2209 $hide_auth_header = command311b
();
2211 $edit_identity = 'false';
2212 $edit_name = command311
();
2213 $hide_auth_header = command311b
();
2215 return $edit_identity;
2219 print " Given that users are not allowed to modify their
2220 email address, can they edit their full name?
2224 if ( lc($edit_name) eq 'true' ) {
2225 $default_value = "y";
2227 $default_value = "n";
2229 print "Allow the user to edit their full name? (y/n) [$WHT$default_value$NRM]: $WHT";
2230 $new_edit = <STDIN
>;
2231 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2232 $edit_name = 'true';
2234 $edit_name = 'false';
2240 print " SquirrelMail adds username information to every sent email
2241 in order to prevent possible sender forging when users are allowed
2242 to change their email and/or full name.
2244 You can remove user information from this header (y), if you think that
2245 it violates privacy or security.
2247 Note: If users are allowed to change their email addresses,
2248 this setting will make it difficult to determine who sent what where.
2249 Use at your own risk.
2253 if ( lc($hide_auth_header) eq "true" ) {
2254 $default_value = "y";
2256 $default_value = "n";
2258 print "Remove username from email headers? (y/n) [$WHT$default_value$NRM]: $WHT";
2259 $new_header = <STDIN
>;
2260 if ( ( $new_header =~ /^y\n/i ) || ( ( $new_header =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2261 $hide_auth_header = "true";
2263 $hide_auth_header = "false";
2265 return $hide_auth_header;
2269 print "This option allows you to choose if users can use thread sorting\n";
2270 print "Your IMAP server must support the THREAD command for this to work\n";
2271 print "PHP versions later than 4.0.3 recommended\n";
2274 if ( lc($allow_thread_sort) eq 'true' ) {
2275 $default_value = "y";
2277 $default_value = "n";
2279 print "Allow server side thread sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2280 $allow_thread_sort = <STDIN
>;
2281 if ( ( $allow_thread_sort =~ /^y\n/i ) || ( ( $allow_thread_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2282 $allow_thread_sort = 'true';
2284 $allow_thread_sort = 'false';
2286 return $allow_thread_sort;
2290 print "This option allows you to choose if SM uses server-side sorting\n";
2291 print "Your IMAP server must support the SORT command for this to work\n";
2294 if ( lc($allow_server_sort) eq 'true' ) {
2295 $default_value = "y";
2297 $default_value = "n";
2299 print "Allow server-side sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2300 $allow_server_sort = <STDIN
>;
2301 if ( ( $allow_server_sort =~ /^y\n/i ) || ( ( $allow_server_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2302 $allow_server_sort = 'true';
2304 $allow_server_sort = 'false';
2306 return $allow_server_sort;
2310 print "This option allows you to choose if SM uses charset search\n";
2311 print "Your IMAP server must support the SEARCH CHARSET command for this to work\n";
2314 if ( lc($allow_charset_search) eq 'true' ) {
2315 $default_value = "y";
2317 $default_value = "n";
2319 print "Allow charset searching? (y/n) [$WHT$default_value$NRM]: $WHT";
2320 $allow_charset_search = <STDIN
>;
2321 if ( ( $allow_charset_search =~ /^y\n/i ) || ( ( $allow_charset_search =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2322 $allow_charset_search = 'true';
2324 $allow_charset_search = 'false';
2326 return $allow_charset_search;
2329 # command315 (UID support) obsoleted.
2331 # advanced search option
2333 print "This option allows you to control the use of advanced search form.\n";
2334 print " 0 = enable basic search only\n";
2335 print " 1 = enable advanced search only\n";
2336 print " 2 = enable both\n";
2339 print "Allowed search (0,1,2)? [$WHT$allow_advanced_search$NRM]: $WHT";
2340 $new_allow_advanced_search = <STDIN
>;
2341 if ( $new_allow_advanced_search =~ /^[012]\n/i ) {
2342 $allow_advanced_search = $new_allow_advanced_search;
2344 $allow_advanced_search =~ s/[\r\n]//g;
2345 return $allow_advanced_search;
2350 print "This option allows you to change the name of the PHP session used\n";
2351 print "by SquirrelMail. Unless you know what you are doing, you probably\n";
2352 print "don't need or want to change this from the default of SQMSESSID.\n";
2353 print "[$WHT$session_name$NRM]: $WHT";
2354 $new_session_name = <STDIN
>;
2355 chomp($new_session_name);
2356 if ( $new_session_name eq "" ) {
2357 $new_session_name = $session_name;
2359 return $new_session_name;
2362 # time zone config (since 1.5.1)
2364 print "This option allows you to control the use of time zones.\n";
2365 print " 0 = (default) standard, GNU C time zone names\n";
2366 print " 1 = strict, generic time zone codes with offsets\n";
2367 print " 2 = custom, GNU C time zones loaded from config/timezones.php\n";
2368 print " 3 = custom strict, generic time zone codes with offsets loaded \n";
2369 print " from config/timezones.php\n";
2370 print "See SquirrelMail documentation about format of config/timezones.php file.\n";
2373 print "Used time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT";
2374 $new_time_zone_type = <STDIN
>;
2375 if ( $new_time_zone_type =~ /^[0123]\n/i ) {
2376 $time_zone_type = $new_time_zone_type;
2378 print "\nInvalid configuration value.\n";
2379 print "\nPress enter to continue...";
2382 $time_zone_type =~ s/[\r\n]//g;
2383 return $time_zone_type;
2388 print "\nDefine the themes that you wish to use. If you have added ";
2389 print "a theme of your own, just follow the instructions (?) about how to add ";
2390 print "them. You can also change the default theme.\n";
2391 print "[theme] command (?=help) > ";
2393 $input =~ s/[\r\n]//g;
2394 while ( $input ne "d" ) {
2395 if ( $input =~ /^\s*l\s*/i ) {
2397 while ( $count <= $#theme_name ) {
2398 if ( $count == $theme_default ) {
2403 if ( $count < 10 ) {
2406 $name = $theme_name[$count];
2407 $num_spaces = 35 - length($name);
2408 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2409 $name = $name . " ";
2412 print " $count. $name";
2413 print "($theme_path[$count])\n";
2417 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
2418 $old_def = $theme_default;
2419 $theme_default = $input;
2420 $theme_default =~ s/^\s*m\s*//;
2421 if ( ( $theme_default > $#theme_name ) || ( $theme_default < 0 ) ) {
2422 print "Cannot set default theme to $theme_default. That theme does not exist.\n";
2423 $theme_default = $old_def;
2425 } elsif ( $input =~ /^\s*\+/ ) {
2426 print "What is the name of this theme: ";
2428 $name =~ s/[\r\n]//g;
2429 $theme_name[ $#theme_name + 1 ] = $name;
2430 print "Be sure to put ../themes/ before the filename.\n";
2431 print "What file is this stored in (ex: ../themes/default_theme.php): ";
2433 $name =~ s/[\r\n]//g;
2434 $theme_path[ $#theme_path + 1 ] = $name;
2435 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
2436 if ( $input =~ /[0-9]+\s*$/ ) {
2438 $rem_num =~ s/^\s*-\s*//g;
2439 $rem_num =~ s/\s*$//;
2441 $rem_num = $#theme_name;
2443 if ( $rem_num == $theme_default ) {
2444 print "You cannot remove the default theme!\n";
2447 @new_theme_name = ();
2448 @new_theme_path = ();
2449 while ( $count <= $#theme_name ) {
2450 if ( $count != $rem_num ) {
2451 @new_theme_name = ( @new_theme_name, $theme_name[$count] );
2452 @new_theme_path = ( @new_theme_path, $theme_path[$count] );
2456 @theme_name = @new_theme_name;
2457 @theme_path = @new_theme_path;
2458 if ( $theme_default > $rem_num ) {
2462 } elsif ( $input =~ /^\s*t\s*/i ) {
2463 print "\nStarting detection...\n\n";
2465 opendir( DIR
, "../themes" );
2466 @files = grep { /\.php$/i } readdir(DIR
);
2468 while ( $cnt <= $#files ) {
2469 $filename = "../themes/" . $files[$cnt];
2470 if ( $filename ne "../themes/index.php" ) {
2472 for ( $x = 0 ; $x <= $#theme_path ; $x++ ) {
2473 if ( $theme_path[$x] eq $filename ) {
2477 if ( $found != 1 ) {
2478 print "** Found theme: $filename\n";
2479 print " What is its name? ";
2482 $theme_name[ $#theme_name + 1 ] = $nm;
2483 $theme_path[ $#theme_path + 1 ] = $filename;
2489 for ( $cnt = 0 ; $cnt <= $#theme_path ; $cnt++ ) {
2490 $filename = $theme_path[$cnt];
2491 if ( !( -e
$filename ) ) {
2492 print " Removing $filename (file not found)\n";
2494 @new_theme_name = ();
2495 @new_theme_path = ();
2496 for ( $x = 0 ; $x < $#theme_path ; $x++ ) {
2497 if ( $theme_path[$x] eq $filename ) {
2500 if ( $offset == 1 ) {
2501 $new_theme_name[$x] = $theme_name[ $x + 1 ];
2502 $new_theme_path[$x] = $theme_path[ $x + 1 ];
2504 $new_theme_name[$x] = $theme_name[$x];
2505 $new_theme_path[$x] = $theme_path[$x];
2508 @theme_name = @new_theme_name;
2509 @theme_path = @new_theme_path;
2512 print "\nDetection complete!\n\n";
2515 } elsif ( $input =~ /^\s*\?\s*/ ) {
2516 print ".-------------------------.\n";
2517 print "| t (detect themes) |\n";
2518 print "| + (add theme) |\n";
2519 print "| - N (remove theme) |\n";
2520 print "| m N (mark default) |\n";
2521 print "| l (list themes) |\n";
2522 print "| d (done) |\n";
2523 print "`-------------------------'\n";
2525 print "[theme] command (?=help) > ";
2527 $input =~ s/[\r\n]//g;
2531 sub command_templates
{
2532 print "\nDefine the template sets that you wish to use. If you have added ";
2533 print "a template set of your own, just follow the instructions (?) about how to add ";
2534 print "them. You can also change the default template.\n";
2536 print "\n Available Templates:\n";
2539 while ( $count <= $#templateset_name ) {
2540 if ( $count == $templateset_default ) {
2545 if ( $count < 10 ) {
2548 $name = $templateset_name[$count];
2549 $num_spaces = 35 - length($name);
2550 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2551 $name = $name . " ";
2554 print " $count. $name";
2555 print "($templateset_path[$count])\n";
2560 # opendir( DIR, "../templates" );
2561 # @files = readdir(DIR);
2564 # while ( $cnt <= $#files ) {
2565 # if ( -d "../templates/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
2566 # $filename = "../templates/" . $files[$cnt];
2568 # for ( $x = 0 ; $x <= $#templateset_path ; $x++ ) {
2569 # if ( $theme_path[$x] eq $filename ) {
2576 # for ( $i = 0 ; $i <= $#files ; $i++ ) {
2577 # if ( -d "../templates/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
2579 # for ( $k = 0 ; $k <= $#aTemplateSets ; $k++ ) {
2580 # if ( $aTemplateSets[$chosen] eq $files[$i] ) {
2584 # if ( $match == 0 ) {
2585 # $unused_plugins[$pos] = $files[$i];
2591 # for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
2593 # print " $num. $unused_plugins[$i]\n";
2598 print ".--------------------------------.\n";
2599 print "| t (detect templates set) |\n";
2600 print "| + (add template set) |\n";
2601 print "| - N (remove template set) |\n";
2602 print "| m N (mark template set) |\n";
2603 print "| l (list template set) |\n";
2604 print "| d (done) |\n";
2605 print "`--------------------------------'\n";
2606 print "\n[template set] command (?=help) > ";
2609 $input =~ s/[\r\n]//g;
2610 while ( $input ne "d" ) {
2611 if ( $input =~ /^\s*l\s*/i ) {
2613 while ( $count <= $#templateset_name ) {
2614 if ( $count == $templateset_default ) {
2619 if ( $count < 10 ) {
2622 $name = $templateset_name[$count];
2623 $num_spaces = 35 - length($name);
2624 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2625 $name = $name . " ";
2628 print " $count. $name";
2629 print "($templateset_path[$count])\n";
2633 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
2634 $old_def = $templateset_default;
2635 $templateset_default = $input;
2636 $templateset_default =~ s/^\s*m\s*//;
2637 if ( ( $templateset_default > $#templateset_name ) || ( $templateset_default < 0 ) ) {
2638 print "Cannot set default template set to $templateset_default. That template set does not exist.\n";
2639 $templateset_default = $old_def;
2641 } elsif ( $input =~ /^\s*\+/ ) {
2642 print "What is the name of this template: ";
2644 $name =~ s/[\r\n]//g;
2645 $templateset_name[ $#templateset_name + 1 ] = $name;
2646 print "Be sure to put ../templates/ before the dirname.\n";
2647 print "What file is this stored in (ex: ../templates/default/): ";
2649 $name =~ s/[\r\n]//g;
2650 $templateset_path[ $#templateset_path + 1 ] = $name;
2651 } elsif ( $input =~ /^\s*t\s*/i ) {
2652 print "\nStarting detection...\n\n";
2653 opendir( DIR
, "../templates" );
2654 @files = readdir(DIR
);
2657 while ( $cnt <= $#files ) {
2658 if ( -d
"../templates/" . $files[$cnt] && $files[$cnt] !~ /^\./ && $files[$cnt] ne "CVS" ) {
2659 $filename = "../templates/" . $files[$cnt]. "/";
2661 for ( $x = 0 ; $x <= $#templateset_path ; $x++ ) {
2662 if ( $templateset_path[$x] eq $filename ) {
2666 if ( $found != 1 && $detected == 0) {
2667 $templateset_path[ $#templateset_path + 1 ] = $filename;
2668 $templateset_name[ $#templateset_name + 1 ] = "Default template";
2669 $aTemplateSet[ $#templateset_name + 1 ] = "Default template";
2670 $aTemplateSet[ $#templateset_path + 1 ] = $filename;
2671 } elsif ( $found != 1) {
2672 print "** Found template set: $filename\n";
2673 print " What is it's name? ";
2676 $templateset_path[ $#templateset_path + 1 ] = $filename;
2677 $templateset_name[ $#templateset_name + 1 ] = $nm;
2679 $aTemplateSet[ $#templateset_name + 1 ] = $nm;
2680 $aTemplateSet[ $#templateset_path + 1 ] = $filename;
2687 for ( $cnt = 0 ; $cnt <= $#templateset_path ; $cnt++ ) {
2688 $filename = $templateset_path[$cnt];
2689 if ( !(-d
$filename) ) {
2690 print " Removing $filename (file not found)\n";
2692 @new_templateset_name = ();
2693 @new_templateset_path = ();
2694 for ( $x = 0 ; $x < $#templateset_path ; $x++ ) {
2695 if ( $templateset_path[$x] eq $filename ) {
2698 if ( $offset == 1 ) {
2699 $new_templateset_name[$x] = $templateset_name[ $x + 1 ];
2700 $new_theme_path[$x] = $templateset_path[ $x + 1 ];
2702 $new_templateset_name[$x] = $templateset_name[$x];
2703 $new_templateset_path[$x] = $templateset_path[$x];
2706 @templateset_name = @new_templateset_name;
2707 @templateset_path = @new_templateset_path;
2710 print "\nDetection complete!\n\n";
2713 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
2714 if ( $input =~ /[0-9]+\s*$/ ) {
2716 $rem_num =~ s/^\s*-\s*//g;
2717 $rem_num =~ s/\s*$//;
2719 $rem_num = $#templateset_name;
2721 if ( $rem_num == $templateset_default ) {
2722 print "You cannot remove the default template set!\n";
2725 @new_templateset_name = ();
2726 @new_templateset_path = ();
2727 while ( $count <= $#templateset_name ) {
2728 if ( $count != $rem_num ) {
2729 @new_templateset_name = ( @new_templateset_name, $templateset_name[$count] );
2730 @new_templateset_path = ( @new_templateset_path, $templateset_path[$count] );
2734 @templateset_name = @new_templateset_name;
2735 @templateset_path = @new_templateset_path;
2736 if ( $templateset_default > $rem_num ) {
2737 $templateset_default--;
2740 } elsif ( $input =~ /^\s*\?\s*/ ) {
2741 print ".--------------------------------.\n";
2742 print "| t (detect templates set) |\n";
2743 print "| + (add template set) |\n";
2744 print "| - N (remove template set) |\n";
2745 print "| m N (mark template set) |\n";
2746 print "| l (list template set) |\n";
2747 print "| d (done) |\n";
2748 print "`--------------------------------'\n";
2750 print "[template set] command (?=help) > ";
2752 $input =~ s/[\r\n]//g;
2754 return $templateset_default;
2760 print "You may specify a cascading style-sheet (CSS) file to be included\n";
2761 print "on each html page generated by SquirrelMail. The CSS file is useful\n";
2762 print "for specifying a site-wide font. If you're not familiar with CSS\n";
2763 print "files, leave this blank.\n";
2765 print "To clear out an existing value, just type a space for the input.\n";
2767 print "Please be aware of the following: \n";
2768 print " - Relative URLs are relative to the config dir\n";
2769 print " to use the themes directory, use ../themes/css/newdefault.css\n";
2770 print " - To specify a css file defined outside the SquirrelMail source tree\n";
2771 print " use the absolute URL the webserver would use to include the file\n";
2772 print " e.g. http://some.host.com/css/mystyle.css or /css/mystyle.css\n";
2774 print "[$WHT$theme_css$NRM]: $WHT";
2775 $new_theme_css = <STDIN
>;
2777 if ( $new_theme_css eq "\n" ) {
2778 $new_theme_css = $theme_css;
2780 $new_theme_css =~ s/[\r\n]//g;
2782 $new_theme_css =~ s/^\s*//;
2783 return $new_theme_css;
2786 # sets default font size option
2787 sub command_default_fontsize
{
2788 print "Enter default font size [$WHT$$default_fontsize$NRM]: $WHT";
2789 $new_size = <STDIN
>;
2790 if ( $new_size eq "\n" ) {
2793 $new_size =~ s/[\r\n]//g;
2798 # controls available fontsets
2799 sub command_fontsets
{
2801 print "You can control fontsets available to end users here.\n";
2802 # set initial $input value
2804 while ( $input ne "x" ) {
2805 if ( $input =~ /^\s*a\s*/i ) {
2807 print "\nFontset name: ";
2809 if (! $fontsets{trim
($name)}) {
2810 print "Fontset string: ";
2812 $fontsets{trim
($name)} = trim
($value);
2814 print "\nERROR: Such fontset already exists.\n";
2816 } elsif ( $input =~ /^\s*e\s*/i ) {
2817 # edit existing fontset
2818 print "\nFontset name: ";
2820 if (! $fontsets{trim
($name)}) {
2821 print "\nERROR: No such fontset.\n";
2823 print "Fontset string [$fontsets{trim($name)}]: ";
2825 $fontsets{trim
($name)} = trim
($value);
2827 } elsif ( $input =~ /^\s*d\s*/ ) {
2828 # delete existing fontset
2829 print "\nFontset name: ";
2831 if (! $fontsets{trim
($name)}) {
2832 print "\nERROR: No such fontset.\n";
2834 delete $fontsets{trim
($name)};
2836 } elsif ( $input =~ /^\s*l\s*/ ) {
2838 print "\nConfigured fontsets:\n";
2839 while (($fontset_name, $fontset_string) = each(%fontsets)) {
2840 print " $fontset_name = $fontset_string\n";
2842 print "Default fontset: $default_fontset\n";
2843 } elsif ( $input =~ /^\s*m\s*/ ) {
2844 # set default fontset
2845 print "\nSet default fontset [$default_fontset]: ";
2847 if (trim
($name) ne '' and ! $fontsets{trim
($name)}) {
2848 print "\nERROR: No such fontset.\n";
2850 $default_fontset = trim
($name);
2853 # print available commands on any other input
2854 print "\nAvailable commands:\n";
2855 print " a - Adds new fontset.\n";
2856 print " d - Deletes existing fontset.\n";
2857 print " e - Edits existing fontset.\n";
2858 print " h or ? - Shows this help screen.\n";
2859 print " l - Lists available fontsets.\n";
2860 print " m - Sets default fontset.\n";
2861 print " x - Exits fontset editor mode.\n";
2863 print "\nCommand [fontsets] (a,d,e,h,?=help,l,m,x)> ";
2865 $input =~ s/[\r\n]//g;
2870 print "You can now define different LDAP servers.\n";
2871 print "[ldap] command (?=help) > ";
2873 $input =~ s/[\r\n]//g;
2874 while ( $input ne "d" ) {
2875 if ( $input =~ /^\s*l\s*/i ) {
2877 while ( $count <= $#ldap_host ) {
2878 print "$count. $ldap_host[$count]\n";
2879 print " base: $ldap_base[$count]\n";
2880 if ( $ldap_charset[$count] ) {
2881 print " charset: $ldap_charset[$count]\n";
2883 if ( $ldap_port[$count] ) {
2884 print " port: $ldap_port[$count]\n";
2886 if ( $ldap_name[$count] ) {
2887 print " name: $ldap_name[$count]\n";
2889 if ( $ldap_maxrows[$count] ) {
2890 print " maxrows: $ldap_maxrows[$count]\n";
2892 if ( $ldap_filter[$count] ) {
2893 print " filter: $ldap_filter[$count]\n";
2895 if ( $ldap_binddn[$count] ) {
2896 print " binddn: $ldap_binddn[$count]\n";
2897 if ( $ldap_bindpw[$count] ) {
2898 print " bindpw: $ldap_bindpw[$count]\n";
2901 if ( $ldap_protocol[$count] ) {
2902 print " protocol: $ldap_protocol[$count]\n";
2904 if ( $ldap_limit_scope[$count] ) {
2905 print " limit_scope: $ldap_limit_scope[$count]\n";
2907 if ( $ldap_listing[$count] ) {
2908 print " listing: $ldap_listing[$count]\n";
2910 if ( $ldap_search_tree[$count] ) {
2911 print " search_tree: $ldap_search_tree[$count]\n";
2913 if ( $ldap_starttls[$count] ) {
2914 print " starttls: $ldap_starttls[$count]\n";
2920 } elsif ( $input =~ /^\s*\+/ ) {
2921 $sub = $#ldap_host + 1;
2923 print "First, we need to have the hostname or the IP address where\n";
2924 print "this LDAP server resides. Example: ldap.bigfoot.com\n";
2927 $name =~ s/[\r\n]//g;
2928 $ldap_host[$sub] = $name;
2932 print "Next, we need the server root (base dn). For this, an empty\n";
2933 print "string is allowed.\n";
2934 print "Example: ou=member_directory,o=netcenter.com\n";
2937 $name =~ s/[\r\n]//g;
2938 $ldap_base[$sub] = $name;
2942 print "This is the TCP/IP port number for the LDAP server. Default\n";
2943 print "port is 389. This is optional. Press ENTER for default.\n";
2946 $name =~ s/[\r\n]//g;
2947 $ldap_port[$sub] = $name;
2951 print "This is the charset for the server. Default is utf-8. This\n";
2952 print "is also optional. Press ENTER for default.\n";
2955 $name =~ s/[\r\n]//g;
2956 $ldap_charset[$sub] = $name;
2960 print "This is the name for the server, used to tag the results of\n";
2961 print "the search. Default it \"LDAP: hostname\". Press ENTER for default\n";
2964 $name =~ s/[\r\n]//g;
2965 $ldap_name[$sub] = $name;
2969 print "You can specify the maximum number of rows in the search result.\n";
2970 print "Default value is equal to 250 rows. Press ENTER for default.\n";
2973 $name =~ s/[\r\n]//g;
2974 $ldap_maxrows[$sub] = $name;
2979 print "If your LDAP server does not like anonymous logins, you can specify bind DN.\n";
2980 print "Default is none, anonymous bind. Press ENTER for default.\n";
2983 $name =~ s/[\r\n]//g;
2984 $ldap_binddn[$sub] = $name;
2988 if ( $ldap_binddn[$sub] ne '' ) {
2990 print "Now, please specify password for that DN.\n";
2993 $name =~ s/[\r\n]//g;
2994 $ldap_bindpw[$sub] = $name;
2999 print "You can specify bind protocol version here.\n";
3000 print "Default protocol version depends on your php ldap settings.\n";
3001 print "Press ENTER for default.\n";
3004 $name =~ s/[\r\n]//g;
3005 $ldap_protocol[$sub] = $name;
3009 print "This configuration section allows to set some rarely used\n";
3010 print "options and options specific to some LDAP implementations.\n";
3012 print "Do you want to set advanced LDAP directory settings? (y/N):";
3013 $ldap_advanced_settings = <STDIN
>;
3014 if ( $ldap_advanced_settings =~ /^y\n/i ) {
3015 $ldap_advanced_settings = 'true';
3017 $ldap_advanced_settings = 'false';
3020 if ($ldap_advanced_settings eq 'true') {
3023 print "You can control LDAP directory listing here. This option can\n";
3024 print "be useful if you run small LDAP server and want to provide listing\n";
3025 print "of all addresses stored in LDAP to users of webmail interface.\n";
3026 print "Number of displayed entries is limited by maxrows setting.\n";
3028 print "Don't enable this option for public LDAP directories.\n";
3029 print "This feature is experimental.\n";
3031 print "Allow listing of LDAP directory? (y/N):";
3033 if ( $name =~ /^y\n/i ) {
3038 $ldap_listing[$sub] = $name;
3042 print "You can specify an additional search filter.\n";
3043 print "This could be something like \"(objectclass=posixAccount)\".\n";
3044 print "No filtering is performed by default. Press ENTER for default.\n";
3047 $name =~ s/[\r|\n]//g;
3048 $ldap_filter[$sub] = $name;
3052 print "You can control search scope here.\n";
3053 print "This option is specific to Microsoft ADS implementation.\n";
3054 print "It requires use of v3 or newer LDAP protocol.\n";
3055 print "Don't enable it, if you use other LDAP server.\n";
3057 print "Limit ldap scope? (y/N):";
3059 if ( $name =~ /^y\n/i ) {
3064 $ldap_limit_scope[$sub] = $name;
3068 print "You can control ldap search type here.\n";
3069 print "Addresses can be searched in entire LDAP subtree (default)\n";
3070 print "or only first level entries are returned.\n";
3072 print "Search entire LDAP subtree? (Y/n):";
3074 if ( $name =~ /^n\n/i ) {
3079 $ldap_search_tree[$sub] = $name;
3083 print "You can control use of StartTLS on LDAP connection here.\n";
3084 print "This option requires use of v3 or newer LDAP protocol and php 4.2+.\n";
3086 print "Use StartTLS? (y/N):";
3088 if ( $name =~ /^y\n/i ) {
3093 $ldap_starttls[$sub] = $name;
3097 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
3098 if ( $input =~ /[0-9]+\s*$/ ) {
3100 $rem_num =~ s/^\s*-\s*//g;
3101 $rem_num =~ s/\s*$//;
3103 $rem_num = $#ldap_host;
3106 @new_ldap_host = ();
3107 @new_ldap_base = ();
3108 @new_ldap_port = ();
3109 @new_ldap_name = ();
3110 @new_ldap_charset = ();
3111 @new_ldap_maxrows = ();
3112 @new_ldap_filter = ();
3113 @new_ldap_bindpw = ();
3114 @new_ldap_binddn = ();
3115 @new_ldap_protocol = ();
3116 @new_ldap_limit_scope = ();
3117 @new_ldap_listing = ();
3118 @new_ldap_search_tree = ();
3119 @new_ldap_starttls = ();
3121 while ( $count <= $#ldap_host ) {
3122 if ( $count != $rem_num ) {
3123 @new_ldap_host = ( @new_ldap_host, $ldap_host[$count] );
3124 @new_ldap_base = ( @new_ldap_base, $ldap_base[$count] );
3125 @new_ldap_port = ( @new_ldap_port, $ldap_port[$count] );
3126 @new_ldap_name = ( @new_ldap_name, $ldap_name[$count] );
3127 @new_ldap_charset = ( @new_ldap_charset, $ldap_charset[$count] );
3128 @new_ldap_maxrows = ( @new_ldap_maxrows, $ldap_maxrows[$count] );
3129 @new_ldap_filter = ( @new_ldap_filter, $ldap_filter[$count] );
3130 @new_ldap_binddn = ( @new_ldap_binddn, $ldap_binddn[$count] );
3131 @new_ldap_bindpw = ( @new_ldap_bindpw, $ldap_bindpw[$count] );
3132 @new_ldap_protocol = ( @new_ldap_protocol, $ldap_protocol[$count] );
3133 @new_ldap_limit_scope = ( @new_ldap_limit_scope, $ldap_limit_scope[$count] );
3134 @new_ldap_listing = ( @new_ldap_listing, $ldap_listing[$count] );
3135 @new_ldap_search_tree = ( @new_ldap_search_tree, $ldap_search_tree[$count] );
3136 @new_ldap_starttls = ( @new_ldap_starttls, $ldap_starttls[$count] );
3140 @ldap_host = @new_ldap_host;
3141 @ldap_base = @new_ldap_base;
3142 @ldap_port = @new_ldap_port;
3143 @ldap_name = @new_ldap_name;
3144 @ldap_charset = @new_ldap_charset;
3145 @ldap_maxrows = @new_ldap_maxrows;
3146 @ldap_filter = @new_ldap_filter;
3147 @ldap_binddn = @new_ldap_binddn;
3148 @ldap_bindpw = @new_ldap_bindpw;
3149 @ldap_protocol = @new_ldap_protocol;
3150 @ldap_limit_scope = @new_ldap_limit_scope;
3151 @ldap_listing = @new_ldap_listing;
3152 @ldap_search_tree = @new_ldap_search_tree;
3153 @ldap_starttls = @new_ldap_starttls;
3155 } elsif ( $input =~ /^\s*\?\s*/ ) {
3156 print ".-------------------------.\n";
3157 print "| + (add host) |\n";
3158 print "| - N (remove host) |\n";
3159 print "| l (list hosts) |\n";
3160 print "| d (done) |\n";
3161 print "`-------------------------'\n";
3163 print "[ldap] command (?=help) > ";
3165 $input =~ s/[\r\n]//g;
3170 print "Some of our developers have come up with very good javascript interface\n";
3171 print "for searching through address books, however, our original goals said\n";
3172 print "that we would be 100% HTML. In order to make it possible to use their\n";
3173 print "interface, and yet stick with our goals, we have also written a plain\n";
3174 print "HTML version of the search. Here, you can choose which version to use.\n";
3176 print "This is just the default value. It is also a user option that each\n";
3177 print "user can configure individually\n";
3180 if ( lc($default_use_javascript_addr_book) eq 'true' ) {
3181 $default_value = "y";
3183 $default_use_javascript_addr_book = 'false';
3184 $default_value = "n";
3186 print "Use javascript version by default (y/n) [$WHT$default_value$NRM]: $WHT";
3187 $new_show = <STDIN
>;
3188 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3189 $default_use_javascript_addr_book = 'true';
3191 $default_use_javascript_addr_book = 'false';
3193 return $default_use_javascript_addr_book;
3196 # global filebased address book
3198 print "If you want to use global file address book, then you\n";
3199 print "must set this option to a valid value. If option does\n";
3200 print "not have path elements, system assumes that file is\n";
3201 print "stored in data directory. If relative path is set, it is\n";
3202 print "relative to main SquirrelMail directory. If value is empty,\n";
3203 print "address book is not enabled.\n";
3206 print "[$WHT$abook_global_file$NRM]: $WHT";
3207 $new_abook_global_file = <STDIN
>;
3208 if ( $new_abook_global_file eq "\n" ) {
3209 $new_abook_global_file = $abook_global_file;
3211 $new_abook_global_file =~ s/[\r\n]//g;
3213 return $new_abook_global_file;
3216 # writing into global filebased abook control
3218 print "This setting controls writing into global file address\n";
3219 print "book options. Address book file must be writeable by\n";
3220 print "webserver's user, if you want to enable this option.\n";
3223 if ( lc($abook_global_file_writeable) eq 'true' ) {
3224 $default_value = "y";
3226 $abook_global_file_writeable = 'false';
3227 $default_value = "n";
3229 print "Allow writing into global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
3230 $new_show = <STDIN
>;
3231 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3232 $abook_global_file_writeable = 'true';
3234 $abook_global_file_writeable = 'false';
3236 return $abook_global_file_writeable;
3239 # listing of global filebased abook control
3241 print "This setting controls listing of global file address\n";
3242 print "book in addresses page.\n";
3245 if ( lc($abook_global_file_listing) eq 'true' ) {
3246 $default_value = "y";
3248 $abook_global_file_listing = 'false';
3249 $default_value = "n";
3251 print "Allow listing of global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
3252 $new_show = <STDIN
>;
3253 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3254 $abook_global_file_listing = 'true';
3256 $abook_global_file_listing = 'false';
3258 return $abook_global_file_listing;
3262 print "If you want to store your users address book details in a database then\n";
3263 print "you need to set this DSN to a valid value. The format for this is:\n";
3264 print "mysql://user:pass\@hostname/dbname\n";
3265 print "Where mysql can be one of the databases PHP supports, the most common\n";
3266 print "of these are mysql, msql and pgsql\n";
3267 print "If the DSN is left empty (hit space and then return) the database\n";
3268 print "related code for address books will not be used\n";
3271 if ( $addrbook_dsn eq "" ) {
3272 $default_value = "Disabled";
3274 $default_value = $addrbook_dsn;
3276 print "[$WHT$addrbook_dsn$NRM]: $WHT";
3278 if ( $new_dsn eq "\n" ) {
3281 $new_dsn =~ s/[\r\n]//g;
3282 $new_dsn =~ s/^\s+$//g;
3288 print "This is the name of the table you want to store the address book\n";
3289 print "data in, it defaults to 'address'\n";
3291 print "[$WHT$addrbook_table$NRM]: $WHT";
3292 $new_table = <STDIN
>;
3293 if ( $new_table eq "\n" ) {
3294 $new_table = $addrbook_table;
3296 $new_table =~ s/[\r\n]//g;
3302 print "If you want to store your users preferences in a database then\n";
3303 print "you need to set this DSN to a valid value. The format for this is:\n";
3304 print "mysql://user:pass\@hostname/dbname\n";
3305 print "Where mysql can be one of the databases PHP supports, the most common\n";
3306 print "of these are mysql, msql and pgsql\n";
3307 print "If the DSN is left empty (hit space and then return) the database\n";
3308 print "related code for address books will not be used\n";
3311 if ( $prefs_dsn eq "" ) {
3312 $default_value = "Disabled";
3314 $default_value = $prefs_dsn;
3316 print "[$WHT$prefs_dsn$NRM]: $WHT";
3318 if ( $new_dsn eq "\n" ) {
3321 $new_dsn =~ s/[\r\n]//g;
3322 $new_dsn =~ s/^\s+$//g;
3328 print "This is the name of the table you want to store the preferences\n";
3329 print "data in, it defaults to 'userprefs'\n";
3331 print "[$WHT$prefs_table$NRM]: $WHT";
3332 $new_table = <STDIN
>;
3333 if ( $new_table eq "\n" ) {
3334 $new_table = $prefs_table;
3336 $new_table =~ s/[\r\n]//g;
3342 print "This is the name of the field in which you want to store the\n";
3343 print "username of the person the prefs are for. It default to 'user'\n";
3344 print "which clashes with a reserved keyword in PostgreSQL so this\n";
3345 print "will need to be changed for that database at least\n";
3347 print "[$WHT$prefs_user_field$NRM]: $WHT";
3348 $new_field = <STDIN
>;
3349 if ( $new_field eq "\n" ) {
3350 $new_field = $prefs_user_field;
3352 $new_field =~ s/[\r\n]//g;
3354 $prefs_user_size = db_pref_size
($prefs_user_size);
3359 print "This is the name of the field in which you want to store the\n";
3360 print "preferences keyword. It defaults to 'prefkey'\n";
3362 print "[$WHT$prefs_key_field$NRM]: $WHT";
3363 $new_field = <STDIN
>;
3364 if ( $new_field eq "\n" ) {
3365 $new_field = $prefs_key_field;
3367 $new_field =~ s/[\r\n]//g;
3369 $prefs_key_size = db_pref_size
($prefs_key_size);
3374 print "This is the name of the field in which you want to store the\n";
3375 print "preferences value. It defaults to 'prefval'\n";
3377 print "[$WHT$prefs_val_field$NRM]: $WHT";
3378 $new_field = <STDIN
>;
3379 if ( $new_field eq "\n" ) {
3380 $new_field = $prefs_val_field;
3382 $new_field =~ s/[\r\n]//g;
3384 $prefs_val_size = db_pref_size
($prefs_val_size);
3388 # routine is used to set database field limits
3389 # it needs one argument
3390 sub db_pref_size
() {
3392 print "\nDatabase fields have size limits.\n";
3394 print "What limit is set for this field? [$WHT$size$NRM]: $WHT";
3395 $new_size = <STDIN
>;
3396 if ( $new_size eq "\n" ) {
3399 $new_size =~ s/[\r\n]//g;
3405 print "If you want to store your global address book in a database then\n";
3406 print "you need to set this DSN to a valid value. The format for this is:\n";
3407 print "mysql://user:pass\@hostname/dbname\n";
3408 print "Where mysql can be one of the databases PHP supports, the most common\n";
3409 print "of these are mysql, msql and pgsql\n";
3410 print "If the DSN is left empty (hit space and then return) the database\n";
3411 print "related code for global SQL address book will not be used\n";
3414 if ( $addrbook_global_dsn eq "" ) {
3415 $default_value = "Disabled";
3417 $default_value = $addrbook_global_dsn;
3419 print "[$WHT$addrbook_global_dsn$NRM]: $WHT";
3421 if ( $new_dsn eq "\n" ) {
3424 $new_dsn =~ s/[\r\n]//g;
3425 $new_dsn =~ s/^\s+$//g;
3431 print "This is the name of the table you want to store the global address book\n";
3432 print "data in. Default table name is 'global_abook'. Address book uses same\n";
3433 print "database format as personal address book.\n";
3435 print "[$WHT$addrbook_global_table$NRM]: $WHT";
3436 $new_table = <STDIN
>;
3437 if ( $new_table eq "\n" ) {
3438 $new_table = $addrbook_global_table;
3440 $new_table =~ s/[\r\n]//g;
3446 print "This option controls users\' ability to add or modify records stored \n";
3447 print "in global address book\n";
3449 if ( lc($addrbook_global_writeable) eq 'true' ) {
3450 $default_value = "y";
3452 $default_value = "n";
3454 print "Allow writing into global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
3455 $addrbook_global_writeable = <STDIN
>;
3456 if ( ( $addrbook_global_writeable =~ /^y\n/i ) || ( ( $addrbook_global_writeable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3457 $addrbook_global_writeable = 'true';
3459 $addrbook_global_writeable = 'false';
3461 return $addrbook_global_writeable;
3465 print "Enable this option if you want to see listing of addresses stored \n";
3466 print "in global address book\n";
3468 if ( lc($addrbook_global_listing) eq 'true' ) {
3469 $default_value = "y";
3471 $default_value = "n";
3473 print "Allow listing of global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
3474 $addrbook_global_listing = <STDIN
>;
3475 if ( ( $addrbook_global_listing =~ /^y\n/i ) || ( ( $addrbook_global_listing =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3476 $addrbook_global_listing = 'true';
3478 $addrbook_global_listing = 'false';
3480 return $addrbook_global_listing;
3486 print "SquirrelMail attempts to set the language in many ways. If it\n";
3487 print "can not figure it out in another way, it will default to this\n";
3488 print "language. Please use the code for the desired language.\n";
3490 print "[$WHT$squirrelmail_default_language$NRM]: $WHT";
3491 $new_squirrelmail_default_language = <STDIN
>;
3492 if ( $new_squirrelmail_default_language eq "\n" ) {
3493 $new_squirrelmail_default_language = $squirrelmail_default_language;
3495 $new_squirrelmail_default_language =~ s/[\r\n]//g;
3496 $new_squirrelmail_default_language =~ s/^\s+$//g;
3498 return $new_squirrelmail_default_language;
3502 print "This option controls what character set is used when sending\n";
3503 print "mail and when sending HTML to the browser. Option works only\n";
3504 print "with US English (en_US) translation. Other translations use\n";
3505 print "charsets that are set in functions/i18n.php.\n";
3508 print "[$WHT$default_charset$NRM]: $WHT";
3509 $new_default_charset = <STDIN
>;
3510 if ( $new_default_charset eq "\n" ) {
3511 $new_default_charset = $default_charset;
3513 $new_default_charset =~ s/[\r\n]//g;
3515 return $new_default_charset;
3517 # Alternative language names
3519 print "Enable this option if you want to see localized language names in\n";
3520 print "language selection box. Note, that this option can trigger\n";
3521 print "installation of foreign language support modules in some browsers.\n";
3524 if ( lc($show_alternative_names) eq 'true' ) {
3525 $default_value = "y";
3527 $default_value = "n";
3529 print "Show alternative language names? (y/n) [$WHT$default_value$NRM]: $WHT";
3530 $show_alternative_names = <STDIN
>;
3531 if ( ( $show_alternative_names =~ /^y\n/i ) || ( ( $show_alternative_names =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3532 $show_alternative_names = 'true';
3534 $show_alternative_names = 'false';
3536 return $show_alternative_names;
3539 # Aggressive decoding
3541 print "Enable this option if you want to use CPU and memory intensive decoding\n";
3542 print "functions. This option allows reading multibyte charset, that are used\n";
3543 print "in Eastern Asia. SquirrelMail will try to use recode functions here,\n";
3544 print "even when you have disabled use of recode in Tweaks section.\n";
3547 if ( lc($aggressive_decoding) eq 'true' ) {
3548 $default_value = "y";
3550 $default_value = "n";
3552 print "Enable aggressive decoding? (y/n) [$WHT$default_value$NRM]: $WHT";
3553 $aggressive_decoding = <STDIN
>;
3554 if ( ( $aggressive_decoding =~ /^y\n/i ) || ( ( $aggressive_decoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3555 $aggressive_decoding = 'true';
3557 $aggressive_decoding = 'false';
3559 return $aggressive_decoding;
3564 print "Enable this option if you want to allow lossy charset encoding in message\n";
3565 print "composition pages. This option allows charset conversions when output\n";
3566 print "charset does not support all symbols used in original charset. Symbols\n";
3567 print "unsupported by output charset will be replaced with question marks.\n";
3570 if ( lc($lossy_encoding) eq 'true' ) {
3571 $default_value = "y";
3573 $default_value = "n";
3575 print "Enable lossy encoding? (y/n) [$WHT$default_value$NRM]: $WHT";
3576 $lossy_encoding = <STDIN
>;
3577 if ( ( $lossy_encoding =~ /^y\n/i ) || ( ( $lossy_encoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3578 $lossy_encoding = 'true';
3580 $lossy_encoding = 'false';
3582 return $lossy_encoding;
3588 print "Enable this option if you want to use DHTML based folder listing.\n";
3589 print "Code is experimental, works only with some browsers and there might\n";
3590 print "be some glitches.\n";
3593 if ( lc($advanced_tree) eq 'true' ) {
3594 $default_value = "y";
3596 $default_value = "n";
3598 print "Use advanced tree in folder listing? (y/n) [$WHT$default_value$NRM]: $WHT";
3599 $advanced_tree = <STDIN
>;
3600 if ( ( $advanced_tree =~ /^y\n/i ) || ( ( $advanced_tree =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3601 $advanced_tree = 'true';
3603 $advanced_tree = 'false';
3605 return $advanced_tree;
3607 # display html emails in iframe
3609 print "This option can enable html email rendering inside iframe.\n";
3610 print "Inline frames are used in order to provide sandbox environment";
3611 print "for html code included in html formated emails.";
3612 print "Option is experimental and might have glitches in some parts of code.";
3615 if ( lc($use_iframe) eq 'true' ) {
3616 $default_value = "y";
3618 $default_value = "n";
3620 print "Display html emails in iframe? (y/n) [$WHT$default_value$NRM]: $WHT";
3621 $use_iframe = <STDIN
>;
3622 if ( ( $use_iframe =~ /^y\n/i ) || ( ( $use_iframe =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3623 $use_iframe = 'true';
3625 $use_iframe = 'false';
3631 print "Enabling this option will cause icons to be used instead of text\n";
3632 print "markers next to each message in mailbox lists that represent\n";
3633 print "new, read, flagged, and deleted messages, as well as those that\n";
3634 print "have been replied to and forwarded. Icons are also used next to\n";
3635 print "(un)expanded folders in the folder list (Oldway = false). These\n";
3636 print "icons are quite small, but will obviously be more of a resource\n";
3637 print "drain than text markers.\n";
3640 if ( lc($use_icons) eq 'true' ) {
3641 $default_value = "y";
3643 $default_value = "n";
3645 print "Use icons? (y/n) [$WHT$default_value$NRM]: $WHT";
3646 $use_icons = <STDIN
>;
3647 if ( ( $use_icons =~ /^y\n/i ) || ( ( $use_icons =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3648 $use_icons = 'true';
3650 $use_icons = 'false';
3656 print "Enable this option if you want to use php recode functions to read\n";
3657 print "emails written in charset that differs from the one that is set in\n";
3658 print "translation selected by user. Code is experimental, it might cause\n";
3659 print "errors, if email contains charset unsupported by recode or if your\n";
3660 print "php does not have recode support.\n";
3663 if ( lc($use_php_recode) eq 'true' ) {
3664 $default_value = "y";
3666 $default_value = "n";
3668 print "Use php recode functions? (y/n) [$WHT$default_value$NRM]: $WHT";
3669 $use_php_recode = <STDIN
>;
3670 if ( ( $use_php_recode =~ /^y\n/i ) || ( ( $use_php_recode =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3671 $use_php_recode = 'true';
3673 $use_php_recode = 'false';
3675 return $use_php_recode;
3679 print "Enable this option if you want to use php iconv functions to read\n";
3680 print "emails written in charset that differs from the one that is set in\n";
3681 print "translation selected by user. Code is experimental, it works only\n";
3682 print "with translations that use utf-8 charset. Code might cause errors,\n";
3683 print "if email contains charset unsupported by iconv or if your php does\n";
3684 print "not have iconv support.\n";
3687 if ( lc($use_php_iconv) eq 'true' ) {
3688 $default_value = "y";
3690 $default_value = "n";
3692 print "Use php iconv functions? (y/n) [$WHT$default_value$NRM]: $WHT";
3693 $use_php_iconv = <STDIN
>;
3694 if ( ( $use_php_iconv =~ /^y\n/i ) || ( ( $use_php_iconv =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3695 $use_php_iconv = 'true';
3697 $use_php_iconv = 'false';
3699 return $use_php_iconv;
3704 print "Enable this option if you want to check SquirrelMail configuration\n";
3705 print "remotely with configtest.php script.\n";
3708 if ( lc($allow_remote_configtest) eq 'true' ) {
3709 $default_value = "y";
3711 $default_value = "n";
3713 print "Allow remote configuration tests? (y/n) [$WHT$default_value$NRM]: $WHT";
3714 $allow_remote_configtest = <STDIN
>;
3715 if ( ( $allow_remote_configtest =~ /^y\n/i ) || ( ( $allow_remote_configtest =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3716 $allow_remote_configtest = 'true';
3718 $allow_remote_configtest = 'false';
3720 return $allow_remote_configtest;
3727 if ( open( CF
, ">config.php" ) ) {
3732 print CF
" * SquirrelMail Configuration File\n";
3733 print CF
" * Created using the configure script, conf.pl\n";
3736 print CF
"global \$version;\n";
3738 if ($print_config_version) {
3739 print CF
"\$config_version = '$print_config_version';\n";
3742 print CF
"\$config_use_color = $config_use_color;\n";
3746 print CF
"\$org_name = \"$org_name\";\n";
3748 print CF
"\$org_logo = " . &change_to_SM_path
($org_logo) . ";\n";
3749 $org_logo_width |= 0;
3750 $org_logo_height |= 0;
3752 print CF
"\$org_logo_width = '$org_logo_width';\n";
3754 print CF
"\$org_logo_height = '$org_logo_height';\n";
3755 # string that can contain variables.
3756 print CF
"\$org_title = \"$org_title\";\n";
3758 print CF
"\$signout_page = " . &change_to_SM_path
($signout_page) . ";\n";
3760 print CF
"\$frame_top = '$frame_top';\n";
3763 print CF
"\$provider_uri = '$provider_uri';\n";
3766 print CF
"\$provider_name = '$provider_name';\n";
3769 # string that can contain variables
3770 print CF
"\$motd = \"$motd\";\n";
3774 print CF
"\$squirrelmail_default_language = '$squirrelmail_default_language';\n";
3776 print CF
"\$default_charset = '$default_charset';\n";
3778 print CF
"\$show_alternative_names = $show_alternative_names;\n";
3780 print CF
"\$aggressive_decoding = $aggressive_decoding;\n";
3782 print CF
"\$lossy_encoding = $lossy_encoding;\n";
3786 print CF
"\$domain = '$domain';\n";
3788 print CF
"\$imapServerAddress = '$imapServerAddress';\n";
3790 print CF
"\$imapPort = $imapPort;\n";
3792 print CF
"\$useSendmail = $useSendmail;\n";
3794 print CF
"\$smtpServerAddress = '$smtpServerAddress';\n";
3796 print CF
"\$smtpPort = $smtpPort;\n";
3798 print CF
"\$sendmail_path = '$sendmail_path';\n";
3800 print CF
"\$sendmail_args = '$sendmail_args';\n";
3802 # print CF "\$use_authenticated_smtp = $use_authenticated_smtp;\n";
3804 print CF
"\$pop_before_smtp = $pop_before_smtp;\n";
3806 print CF
"\$imap_server_type = '$imap_server_type';\n";
3808 print CF
"\$invert_time = $invert_time;\n";
3810 print CF
"\$optional_delimiter = '$optional_delimiter';\n";
3812 print CF
"\$encode_header_key = '$encode_header_key';\n";
3816 print CF
"\$default_folder_prefix = '$default_folder_prefix';\n";
3818 print CF
"\$trash_folder = '$trash_folder';\n";
3820 print CF
"\$sent_folder = '$sent_folder';\n";
3822 print CF
"\$draft_folder = '$draft_folder';\n";
3824 print CF
"\$default_move_to_trash = $default_move_to_trash;\n";
3826 print CF
"\$default_move_to_sent = $default_move_to_sent;\n";
3828 print CF
"\$default_save_as_draft = $default_save_as_draft;\n";
3830 print CF
"\$show_prefix_option = $show_prefix_option;\n";
3832 print CF
"\$list_special_folders_first = $list_special_folders_first;\n";
3834 print CF
"\$use_special_folder_color = $use_special_folder_color;\n";
3836 print CF
"\$auto_expunge = $auto_expunge;\n";
3838 print CF
"\$default_sub_of_inbox = $default_sub_of_inbox;\n";
3840 print CF
"\$show_contain_subfolders_option = $show_contain_subfolders_option;\n";
3842 print CF
"\$default_unseen_notify = $default_unseen_notify;\n";
3844 print CF
"\$default_unseen_type = $default_unseen_type;\n";
3846 print CF
"\$auto_create_special = $auto_create_special;\n";
3848 print CF
"\$delete_folder = $delete_folder;\n";
3850 print CF
"\$noselect_fix_enable = $noselect_fix_enable;\n";
3855 print CF
"\$data_dir = " . &change_to_SM_path
($data_dir) . ";\n";
3856 # string that can contain a variable
3857 print CF
"\$attachment_dir = " . &change_to_SM_path
($attachment_dir) . ";\n";
3859 print CF
"\$dir_hash_level = $dir_hash_level;\n";
3861 print CF
"\$default_left_size = '$default_left_size';\n";
3863 print CF
"\$force_username_lowercase = $force_username_lowercase;\n";
3865 print CF
"\$default_use_priority = $default_use_priority;\n";
3867 print CF
"\$hide_sm_attributions = $hide_sm_attributions;\n";
3869 print CF
"\$default_use_mdn = $default_use_mdn;\n";
3871 print CF
"\$edit_identity = $edit_identity;\n";
3873 print CF
"\$edit_name = $edit_name;\n";
3875 print CF
"\$hide_auth_header = $hide_auth_header;\n";
3877 print CF
"\$allow_thread_sort = $allow_thread_sort;\n";
3879 print CF
"\$allow_server_sort = $allow_server_sort;\n";
3881 print CF
"\$allow_charset_search = $allow_charset_search;\n";
3883 print CF
"\$allow_advanced_search = $allow_advanced_search;\n";
3886 print CF
"\$time_zone_type = $time_zone_type;\n";
3889 # all plugins are strings
3890 for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
3891 print CF
"\$plugins[] = '$plugins[$ct]';\n";
3896 print CF
"\$theme_css = " . &change_to_SM_path
($theme_css) . ";\n";
3897 if ( $theme_default eq '' ) { $theme_default = '0'; }
3898 print CF
"\$theme_default = $theme_default;\n";
3900 for ( $count = 0 ; $count <= $#theme_name ; $count++ ) {
3901 print CF
"\$theme[$count]['PATH'] = " . &change_to_SM_path
($theme_path[$count]) . ";\n";
3902 # escape theme name so it can contain single quotes.
3903 $esc_name = $theme_name[$count];
3904 $esc_name =~ s/\\/\\\\/g;
3905 $esc_name =~ s/'/\\'/g;
3906 print CF
"\$theme[$count]['NAME'] = '$esc_name';\n";
3910 if ( $templateset_default eq '' ) { $templateset_default = '0'; }
3911 print CF
"\$templateset_default = $templateset_default;\n";
3913 for ( $count = 0 ; $count <= $#templateset_name ; $count++ ) {
3914 print CF
"\$aTemplateSet[$count]['PATH'] = " . &change_to_SM_path
($templateset_path[$count]) . ";\n";
3915 # escape theme name so it can contain single quotes.
3916 $esc_name = $templateset_name[$count];
3917 $esc_name =~ s/\\/\\\\/g;
3918 $esc_name =~ s/'/\\'/g;
3919 print CF
"\$aTemplateSet[$count]['NAME'] = '$esc_name';\n";
3925 print CF
"\$default_fontsize = '$default_fontsize';\n";
3927 print CF
"\$default_fontset = '$default_fontset';\n";
3929 # assoc. array (maybe initial value should be set somewhere else)
3930 print CF
'$fontsets = array();'."\n";
3931 while (($fontset_name, $fontset_value) = each(%fontsets)) {
3932 print CF
"\$fontsets\['$fontset_name'\] = '$fontset_value';\n";
3938 print CF
"\$default_use_javascript_addr_book = $default_use_javascript_addr_book;\n";
3939 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
3940 print CF
"\$ldap_server[$count] = array(\n";
3942 print CF
" 'host' => '$ldap_host[$count]',\n";
3944 print CF
" 'base' => '$ldap_base[$count]'";
3945 if ( $ldap_name[$count] ) {
3948 print CF
" 'name' => '$ldap_name[$count]'";
3950 if ( $ldap_port[$count] ) {
3953 print CF
" 'port' => $ldap_port[$count]";
3955 if ( $ldap_charset[$count] ) {
3958 print CF
" 'charset' => '$ldap_charset[$count]'";
3960 if ( $ldap_maxrows[$count] ) {
3963 print CF
" 'maxrows' => $ldap_maxrows[$count]";
3966 if ( $ldap_filter[$count] ) {
3968 print CF
" 'filter' => '$ldap_filter[$count]'";
3970 if ( $ldap_binddn[$count] ) {
3973 print CF
" 'binddn' => '$ldap_binddn[$count]'";
3974 if ( $ldap_bindpw[$count] ) {
3977 print CF
" 'bindpw' => '$ldap_bindpw[$count]'";
3980 if ( $ldap_protocol[$count] ) {
3983 print CF
" 'protocol' => $ldap_protocol[$count]";
3985 if ( $ldap_limit_scope[$count] ) {
3988 print CF
" 'limit_scope' => $ldap_limit_scope[$count]";
3990 if ( $ldap_listing[$count] ) {
3993 print CF
" 'listing' => $ldap_listing[$count]";
3995 if ( $ldap_search_tree[$count] ) {
3998 print CF
" 'search_tree' => $ldap_search_tree[$count]";
4000 if ( $ldap_listing[$count] ) {
4003 print CF
" 'starttls' => $ldap_starttls[$count]";
4011 print CF
"\$addrbook_dsn = '$addrbook_dsn';\n";
4013 print CF
"\$addrbook_table = '$addrbook_table';\n\n";
4015 print CF
"\$prefs_dsn = '$prefs_dsn';\n";
4017 print CF
"\$prefs_table = '$prefs_table';\n";
4019 print CF
"\$prefs_user_field = '$prefs_user_field';\n";
4021 print CF
"\$prefs_user_size = $prefs_user_size;\n";
4023 print CF
"\$prefs_key_field = '$prefs_key_field';\n";
4025 print CF
"\$prefs_key_size = $prefs_key_size;\n";
4027 print CF
"\$prefs_val_field = '$prefs_val_field';\n";
4029 print CF
"\$prefs_val_size = $prefs_val_size;\n\n";
4031 print CF
"\$addrbook_global_dsn = '$addrbook_global_dsn';\n";
4033 print CF
"\$addrbook_global_table = '$addrbook_global_table';\n";
4035 print CF
"\$addrbook_global_writeable = $addrbook_global_writeable;\n";
4037 print CF
"\$addrbook_global_listing = $addrbook_global_listing;\n\n";
4039 print CF
"\$abook_global_file = '$abook_global_file';\n";
4041 print CF
"\$abook_global_file_writeable = $abook_global_file_writeable;\n\n";
4043 print CF
"\$abook_global_file_listing = $abook_global_file_listing;\n\n";
4045 print CF
"\$no_list_for_subscribe = $no_list_for_subscribe;\n";
4048 print CF
"\$smtp_auth_mech = '$smtp_auth_mech';\n";
4050 print CF
"\$imap_auth_mech = '$imap_auth_mech';\n";
4052 print CF
"\$use_imap_tls = $use_imap_tls;\n";
4054 print CF
"\$use_smtp_tls = $use_smtp_tls;\n";
4056 print CF
"\$session_name = '$session_name';\n";
4061 print CF
"\$advanced_tree = $advanced_tree;\n";
4064 print CF
"\$use_iframe = $use_iframe;\n";
4067 print CF
"\$use_icons = $use_icons;\n";
4070 print CF
"\$use_php_recode = $use_php_recode;\n";
4073 print CF
"\$use_php_iconv = $use_php_iconv;\n";
4076 print CF
"\$allow_remote_configtest = $allow_remote_configtest;\n";
4079 print CF
"\@include SM_PATH . 'config/config_local.php';\n";
4082 print CF
" * Make sure there are no characters after the PHP closing\n";
4083 print CF
" * tag below (including newline characters and whitespace).\n";
4084 print CF
" * Otherwise, that character will cause the headers to be\n";
4085 print CF
" * sent and regular output to begin, which will majorly screw\n";
4086 print CF
" * things up when we try to send more headers later.\n";
4092 print "Data saved in config.php\n";
4094 print "Error saving config.php: $!\n";
4100 print $WHT. "SquirrelMail Configuration : " . $NRM;
4101 if ( $config == 1 ) { print "Read: config.php"; }
4102 elsif ( $config == 2 ) { print "Read: config_default.php"; }
4104 print "---------------------------------------------------------\n";
4106 print "While we have been building SquirrelMail, we have discovered some\n";
4107 print "preferences that work better with some servers that don't work so\n";
4108 print "well with others. If you select your IMAP server, this option will\n";
4109 print "set some pre-defined settings for that server.\n";
4111 print "Please note that you will still need to go through and make sure\n";
4112 print "everything is correct. This does not change everything. There are\n";
4113 print "only a few settings that this will change.\n";
4117 while ( $continue != 1 ) {
4118 print "Please select your IMAP server:\n";
4119 print " bincimap = Binc IMAP server\n";
4120 print " courier = Courier IMAP server\n";
4121 print " cyrus = Cyrus IMAP server\n";
4122 print " dovecot = Dovecot Secure IMAP server\n";
4123 print " exchange = Microsoft Exchange IMAP server\n";
4124 print " hmailserver = hMailServer\n";
4125 print " macosx = Mac OS X Mailserver\n";
4126 print " mercury32 = Mercury/32\n";
4127 print " uw = University of Washington's IMAP server\n";
4129 print " quit = Do not change anything\n";
4131 print "Command >> ";
4133 $server =~ s/[\r\n]//g;
4135 # variable is used to display additional messages.
4139 if ( $server eq "cyrus" ) {
4140 $imap_server_type = "cyrus";
4141 $default_folder_prefix = "";
4142 $trash_folder = "INBOX.Trash";
4143 $sent_folder = "INBOX.Sent";
4144 $draft_folder = "INBOX.Drafts";
4145 $show_prefix_option = false
;
4146 $default_sub_of_inbox = true
;
4147 $show_contain_subfolders_option = false
;
4148 $optional_delimiter = ".";
4149 $disp_default_folder_prefix = "<none>";
4150 $force_username_lowercase = false
;
4153 } elsif ( $server eq "uw" ) {
4154 $imap_server_type = "uw";
4155 $default_folder_prefix = "mail/";
4156 $trash_folder = "Trash";
4157 $sent_folder = "Sent";
4158 $draft_folder = "Drafts";
4159 $show_prefix_option = true
;
4160 $default_sub_of_inbox = false
;
4161 $show_contain_subfolders_option = true
;
4162 $optional_delimiter = "/";
4163 $disp_default_folder_prefix = $default_folder_prefix;
4164 $delete_folder = true
;
4165 $force_username_lowercase = true
;
4168 } elsif ( $server eq "exchange" ) {
4169 $imap_server_type = "exchange";
4170 $default_folder_prefix = "";
4171 $default_sub_of_inbox = true
;
4172 $trash_folder = "INBOX/Deleted Items";
4173 $sent_folder = "INBOX/Sent Items";
4174 $drafts_folder = "INBOX/Drafts";
4175 $show_prefix_option = false
;
4176 $show_contain_subfolders_option = false
;
4177 $optional_delimiter = "detect";
4178 $disp_default_folder_prefix = "<none>";
4179 $force_username_lowercase = true
;
4182 } elsif ( $server eq "courier" ) {
4183 $imap_server_type = "courier";
4184 $default_folder_prefix = "INBOX.";
4185 $trash_folder = "Trash";
4186 $sent_folder = "Sent";
4187 $draft_folder = "Drafts";
4188 $show_prefix_option = false
;
4189 $default_sub_of_inbox = false
;
4190 $show_contain_subfolders_option = false
;
4191 $optional_delimiter = ".";
4192 $disp_default_folder_prefix = $default_folder_prefix;
4193 $delete_folder = true
;
4194 $force_username_lowercase = false
;
4197 } elsif ( $server eq "macosx" ) {
4198 $imap_server_type = "macosx";
4199 $default_folder_prefix = "INBOX/";
4200 $trash_folder = "Trash";
4201 $sent_folder = "Sent";
4202 $draft_folder = "Drafts";
4203 $show_prefix_option = false
;
4204 $default_sub_of_inbox = true
;
4205 $show_contain_subfolders_option = false
;
4206 $optional_delimiter = "detect";
4207 $allow_charset_search = false
;
4208 $disp_default_folder_prefix = $default_folder_prefix;
4211 } elsif ( $server eq "hmailserver" ) {
4212 $imap_server_type = "hmailserver";
4213 $default_folder_prefix = "";
4214 $trash_folder = "INBOX.Trash";
4215 $sent_folder = "INBOX.Sent";
4216 $draft_folder = "INBOX.Drafts";
4217 $show_prefix_option = false
;
4218 $default_sub_of_inbox = true
;
4219 $show_contain_subfolders_option = false
;
4220 $optional_delimiter = "detect";
4221 $allow_charset_search = false
;
4222 $disp_default_folder_prefix = $default_folder_prefix;
4223 $delete_folder = false
;
4224 $force_username_lowercase = false
;
4227 } elsif ( $server eq "mercury32" ) {
4228 $imap_server_type = "mercury32";
4229 $default_folder_prefix = "";
4230 $trash_folder = "Trash";
4231 $sent_folder = "Sent";
4232 $draft_folder = "Drafts";
4233 $show_prefix_option = false
;
4234 $default_sub_of_inbox = true
;
4235 $show_contain_subfolders_option = true
;
4236 $optional_delimiter = "detect";
4237 $delete_folder = true
;
4238 $force_username_lowercase = true
;
4241 } elsif ( $server eq "dovecot" ) {
4242 $imap_server_type = "dovecot";
4243 $default_folder_prefix = "";
4244 $trash_folder = "Trash";
4245 $sent_folder = "Sent";
4246 $draft_folder = "Drafts";
4247 $show_prefix_option = false
;
4248 $default_sub_of_inbox = false
;
4249 $show_contain_subfolders_option = false
;
4250 $delete_folder = false
;
4251 $force_username_lowercase = true
;
4252 $optional_delimiter = "detect";
4253 $disp_default_folder_prefix = "<none>";
4256 } elsif ( $server eq "bincimap" ) {
4257 $imap_server_type = "bincimap";
4258 $default_folder_prefix = "INBOX/";
4259 $trash_folder = "Trash";
4260 $sent_folder = "Sent";
4261 $draft_folder = "Drafts";
4262 $show_prefix_option = false
;
4263 $default_sub_of_inbox = false
;
4264 $show_contain_subfolders_option = false
;
4265 $delete_folder = true
;
4266 $force_username_lowercase = false
;
4267 $optional_delimiter = "detect";
4268 $disp_default_folder_prefix = $default_folder_prefix;
4270 # Default folder prefix depends on used depot.
4271 $message = "\nIf you use IMAPdir depot, you must set default folder prefix to empty string.\n";
4274 } elsif ( $server eq "quit" ) {
4277 $disp_default_folder_prefix = $default_folder_prefix;
4278 print "Unrecognized server: $server\n";
4282 print " imap_server_type = $imap_server_type\n";
4283 print " default_folder_prefix = $disp_default_folder_prefix\n";
4284 print " trash_folder = $trash_folder\n";
4285 print " sent_folder = $sent_folder\n";
4286 print " draft_folder = $draft_folder\n";
4287 print " show_prefix_option = $show_prefix_option\n";
4288 print " default_sub_of_inbox = $default_sub_of_inbox\n";
4289 print "show_contain_subfolders_option = $show_contain_subfolders_option\n";
4290 print " optional_delimiter = $optional_delimiter\n";
4291 print " delete_folder = $delete_folder\n";
4292 print " force_username_lowercase = $force_username_lowercase\n";
4296 print "\nPress enter to continue...";
4300 # This subroutine corrects relative paths to ensure they
4301 # will work within the SM space. If the path falls within
4302 # the SM directory tree, the SM_PATH variable will be
4303 # prepended to the path, if not, then the path will be
4304 # converted to an absolute path, e.g.
4305 # '../images/logo.gif' --> SM_PATH . 'images/logo.gif'
4306 # '../../someplace/data' --> '/absolute/path/someplace/data'
4307 # 'images/logo.gif' --> SM_PATH . 'config/images/logo.gif'
4308 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
4309 # 'http://whatever/' --> 'http://whatever'
4310 # $some_var/path --> "$some_var/path"
4311 sub change_to_SM_path
() {
4312 my ($old_path) = @_;
4318 # If the path is absolute, don't bother.
4319 return "\'" . $old_path . "\'" if ( $old_path eq '');
4320 return "\'" . $old_path . "\'" if ( $old_path =~ /^(\/|http
)/ );
4321 return "\'" . $old_path . "\'" if ( $old_path =~ /^\w:\// );
4322 return $old_path if ( $old_path =~ /^\'(\/|http
)/ );
4323 return $old_path if ( $old_path =~ /^\'\w:\// );
4324 return $old_path if ( $old_path =~ /^SM_PATH/);
4326 if ( $old_path =~ /^\$/ ) {
4327 # check if it's a single var, or a $var/path combination
4328 # if it's $var/path, enclose in ""
4329 if ( $old_path =~ /\// ) {
4330 return '"'.$old_path.'"';
4335 # Remove remaining '
4336 $old_path =~ s/\'//g;
4338 # For relative paths, split on '../'
4339 @rel_path = split(/\.\.\//, $old_path);
4341 if ( $#rel_path > 1 ) {
4342 # more than two levels away. Make it absolute.
4343 @abs_path = split(/\//, $dir);
4345 # Lop off the relative pieces of the absolute path..
4346 for ( $i = 0; $i <= $#rel_path; $i++ ) {
4350 push @abs_path, @rel_path;
4351 $new_path = "\'" . join('/', @abs_path) . "\'";
4352 } elsif ( $#rel_path > 0 ) {
4353 # it's within the SM tree, prepend SM_PATH
4354 $new_path = $old_path;
4355 $new_path =~ s/^\.\.\//SM_PATH
. \'/;
4358 # Last, it's a relative path without any leading '.'
4359 # Prepend SM_PATH and config, since the paths are
4360 # relative to the config directory
4361 $new_path = "SM_PATH . \'config/" . $old_path . "\'";
4367 # Change SM_PATH to admin-friendly version, e.g.:
4368 # SM_PATH . 'images/logo.gif' --> '../images/logo.gif'
4369 # SM_PATH . 'config/some.php' --> 'some.php'
4370 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
4371 # 'http://whatever/' --> 'http://whatever'
4372 sub change_to_rel_path
() {
4373 my ($old_path) = @_;
4374 my $new_path = $old_path;
4376 if ( $old_path =~ /^SM_PATH/ ) {
4377 $new_path =~ s/^SM_PATH . \'/\.\.\//;
4378 $new_path =~ s/\.\.\/config\///;
4384 sub detect_auth_support
{
4385 # Attempts to auto-detect if a specific auth mechanism is supported.
4386 # Called by 'command112a' and 'command112b'
4387 # ARGS: service-name (IMAP or SMTP), host:port, mech-name (ie. CRAM-MD5)
4391 my $service = shift;
4395 if ((!defined($service)) or (!defined($host)) or (!defined($mech))) {
4396 # Error - wrong # of args
4397 print "BAD ARGS!\n";
4401 if ($service eq 'SMTP') {
4402 $cmd = "AUTH $mech\r\n";
4403 $logout = "QUIT\r\n";
4404 } elsif ($service eq 'IMAP') {
4405 $cmd = "A01 AUTHENTICATE $mech\n";
4406 $logout = "C01 LOGOUT\n";
4408 # unknown service - whoops.
4412 # Get this show on the road
4413 my $sock=IO
::Socket
::INET
->new($host);
4414 if (!defined($sock)) {
4418 my $discard = <$sock>; # Server greeting/banner - who cares..
4420 if ($service eq 'SMTP') {
4422 print $sock "HELO $domain\r\n";
4423 $discard = <$sock>; # Yeah yeah, you're happy to see me..
4427 my $response = <$sock>;
4429 if (!defined($response)) {
4433 # So at this point, we have a response, and it is (hopefully) valid.
4434 if ($service eq 'SMTP') {
4435 if (($response =~ /^535/) or ($response =~/^502/)) {
4437 print $sock $logout;
4440 } elsif ($response =~ /^503/) {
4441 #Something went wrong
4444 } elsif ($service eq 'IMAP') {
4445 if ($response =~ /^A01/) {
4447 print $sock $logout;
4452 # Unknown service - this shouldn't be able to happen.
4457 # If it gets here, the mech is supported
4458 print $sock "*\n"; # Attempt to cancel authentication
4459 print $sock $logout; # Try to log out, but we don't really care if this fails
4465 # Example code from O'Reilly Perl Cookbook
4472 return wantarray ?
@out : $out[0];
4475 sub clear_screen
() {
4476 if ( $^O
=~ /^mswin/i) {