0ea3ec1316b6c982795a385002fc7b25b6e0c475
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 # FIXME: unknown introduction date
325 $useSendmail = 'false' if ( lc($useSendmail) ne 'true' );
326 $sendmail_path = "/usr/sbin/sendmail" if ( !$sendmail_path );
327 $pop_before_smtp = 'false' if ( !$pop_before_smtp );
328 $default_unseen_notify = 2 if ( !$default_unseen_notify );
329 $default_unseen_type = 1 if ( !$default_unseen_type );
330 $config_use_color = 0 if ( !$config_use_color );
331 $invert_time = 'false' if ( !$invert_time );
332 $force_username_lowercase = 'false' if ( !$force_username_lowercase );
333 $optional_delimiter = "detect" if ( !$optional_delimiter );
334 $auto_create_special = 'false' if ( !$auto_create_special );
335 $default_use_priority = 'true' if ( !$default_use_priority );
336 $hide_sm_attributions = 'false' if ( !$hide_sm_attributions );
337 $default_use_mdn = 'true' if ( !$default_use_mdn );
338 $delete_folder = 'false' if ( !$delete_folder );
339 $noselect_fix_enable = 'false' if ( !$noselect_fix_enable );
340 $frame_top = "_top" if ( !$frame_top );
341 $provider_uri = '' if ( !$provider_uri );
342 $provider_name = '' if ( !$provider_name );
343 $edit_identity = 'true' if ( !$edit_identity );
344 $edit_name = 'true' if ( !$edit_name );
345 $no_list_for_subscribe = 'false' if ( !$no_list_for_subscribe );
346 $allow_charset_search = 'true' if ( !$allow_charset_search );
347 $allow_advanced_search = 0 if ( !$allow_advanced_search) ;
348 $prefs_user_field = 'user' if ( !$prefs_user_field );
349 $prefs_key_field = 'prefkey' if ( !$prefs_key_field );
350 $prefs_val_field = 'prefval' if ( !$prefs_val_field );
351 $session_name = 'SQMSESSID' if ( !$session_name );
352 $skip_SM_header = 'false' if ( !$skip_SM_header );
353 $default_use_javascript_addr_book = 'false' if (! $default_use_javascript_addr_book);
356 $use_smtp_tls= 'false' if ( !$use_smtp_tls);
357 $smtp_auth_mech = 'none' if ( !$smtp_auth_mech );
358 $use_imap_tls = 'false' if ( !$use_imap_tls );
359 $imap_auth_mech = 'login' if ( !$imap_auth_mech );
362 $show_alternative_names = 'false' if ( !$show_alternative_names );
363 # $available_languages option available only in 1.5.0. removed due to $languages
364 # implementation changes. options are provided by limit_languages plugin
365 # $available_languages = 'all' if ( !$available_languages );
366 $aggressive_decoding = 'false' if ( !$aggressive_decoding );
367 $advanced_tree = 'false' if ( !$advanced_tree );
368 $use_php_recode = 'false' if ( !$use_php_recode );
369 $use_php_iconv = 'false' if ( !$use_php_iconv );
372 $use_icons = 'false' if ( !$use_icons );
373 $use_iframe = 'false' if ( !$use_iframe );
374 $lossy_encoding = 'false' if ( !$lossy_encoding );
375 $allow_remote_configtest = 'false' if ( !$allow_remote_configtest );
376 $addrbook_global_table = 'global_abook' if ( !$addrbook_global_table );
377 $addrbook_global_writeable = 'false' if ( !$addrbook_global_writeable );
378 $addrbook_global_listing = 'false' if ( !$addrbook_global_listing );
379 $abook_global_file = '' if ( !$abook_global_file);
380 $abook_global_file_writeable = 'false' if ( !$abook_global_file_writeable);
381 $abook_global_file_listing = 'true' if ( !$abook_global_file_listing );
382 $encode_header_key = '' if ( !$encode_header_key );
383 $hide_auth_header = 'false' if ( !$hide_auth_header );
384 $time_zone_type = '0' if ( !$time_zone_type );
385 $prefs_user_size = 128 if ( !$prefs_user_size );
386 $prefs_key_size = 64 if ( !$prefs_key_size );
387 $prefs_val_size = 65536 if ( !$prefs_val_size );
389 # add qmail-inject test here for backwards compatibility
390 if ( !$sendmail_args && $sendmail_path =~ /qmail-inject/ ) {
392 } elsif ( !$sendmail_args ) {
393 $sendmail_args = '-i -t';
396 $default_fontsize = '' if ( !$default_fontsize);
397 $default_fontset = '' if ( !$default_fontset);
399 %fontsets = ('serif', 'serif',
400 'sans', 'helvetica,arial,sans-serif',
401 'comicsans', 'comic sans ms,sans-serif',
402 'tahoma', 'tahoma,sans-serif',
403 'verasans', 'bitstream vera sans,verdana,sans-serif');
406 # $use_imap_tls and $use_smtp_tls are switched to integer since 1.5.1
407 $use_imap_tls = 0 if ( $use_imap_tls eq 'false');
408 $use_imap_tls = 1 if ( $use_imap_tls eq 'true');
409 $use_smtp_tls = 0 if ( $use_smtp_tls eq 'false');
410 $use_smtp_tls = 1 if ( $use_smtp_tls eq 'true');
411 # sorting options changed names and reversed values in 1.5.1
412 $disable_thread_sort = 'false' if ( !$disable_thread_sort );
413 $disable_server_sort = 'false' if ( !$disable_server_sort );
415 if ( $ARGV[0] eq '--install-plugin' ) {
416 print "Activating plugin " . $ARGV[1] . "\n";
417 push @plugins, $ARGV[1];
420 } elsif ( $ARGV[0] eq '--remove-plugin' ) {
421 print "Removing plugin " . $ARGV[1] . "\n";
422 foreach $plugin (@plugins) {
423 if ( $plugin ne $ARGV[1] ) {
424 push @newplugins, $plugin;
427 @plugins = @newplugins;
432 #####################################################################################
433 if ( $config_use_color == 1 ) {
439 $config_use_color = 2;
442 while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
444 print $WHT. "SquirrelMail Configuration : " . $NRM;
445 if ( $config == 1 ) { print "Read: config.php"; }
446 elsif ( $config == 2 ) { print "Read: config_default.php"; }
447 print " ($print_config_version)\n";
448 print "---------------------------------------------------------\n";
451 print $WHT. "Main Menu --\n" . $NRM;
452 print "1. Organization Preferences\n";
453 print "2. Server Settings\n";
454 print "3. Folder Defaults\n";
455 print "4. General Options\n";
456 print "5. Templates\n";
457 print "6. Address Books\n";
458 print "7. Message of the Day (MOTD)\n";
459 print "8. Plugins\n";
460 print "9. Database\n";
461 print "10. Language settings\n";
462 print "11. Tweaks\n";
464 print "D. Set pre-defined settings for specific IMAP servers\n";
466 } elsif ( $menu == 1 ) {
467 print $WHT. "Organization Preferences\n" . $NRM;
468 print "1. Organization Name : $WHT$org_name$NRM\n";
469 print "2. Organization Logo : $WHT$org_logo$NRM\n";
470 print "3. Org. Logo Width/Height : $WHT($org_logo_width/$org_logo_height)$NRM\n";
471 print "4. Organization Title : $WHT$org_title$NRM\n";
472 print "5. Signout Page : $WHT$signout_page$NRM\n";
473 print "6. Top Frame : $WHT$frame_top$NRM\n";
474 print "7. Provider link : $WHT$provider_uri$NRM\n";
475 print "8. Provider name : $WHT$provider_name$NRM\n";
478 print "R Return to Main Menu\n";
479 } elsif ( $menu == 2 ) {
480 print $WHT. "Server Settings\n\n" . $NRM;
481 print $WHT . "General" . $NRM . "\n";
483 print "1. Domain : $WHT$domain$NRM\n";
484 print "2. Invert Time : $WHT$invert_time$NRM\n";
485 print "3. Sendmail or SMTP : $WHT";
486 if ( lc($useSendmail) eq 'true' ) {
494 if ( $show_imap_settings ) {
495 print $WHT . "IMAP Settings". $NRM . "\n--------------\n";
496 print "4. IMAP Server : $WHT$imapServerAddress$NRM\n";
497 print "5. IMAP Port : $WHT$imapPort$NRM\n";
498 print "6. Authentication type : $WHT$imap_auth_mech$NRM\n";
499 print "7. Secure IMAP (TLS) : $WHT$use_imap_tls$NRM\n";
500 print "8. Server software : $WHT$imap_server_type$NRM\n";
501 print "9. Delimiter : $WHT$optional_delimiter$NRM\n";
503 } elsif ( $show_smtp_settings ) {
504 if ( lc($useSendmail) eq 'true' ) {
505 print $WHT . "Sendmail" . $NRM . "\n--------\n";
506 print "4. Sendmail Path : $WHT$sendmail_path$NRM\n";
507 print "5. Sendmail arguments : $WHT$sendmail_args$NRM\n";
508 print "6. Header encryption key : $WHT$encode_header_key$NRM\n";
511 print $WHT . "SMTP Settings" . $NRM . "\n-------------\n";
512 print "4. SMTP Server : $WHT$smtpServerAddress$NRM\n";
513 print "5. SMTP Port : $WHT$smtpPort$NRM\n";
514 print "6. POP before SMTP : $WHT$pop_before_smtp$NRM\n";
515 print "7. SMTP Authentication : $WHT$smtp_auth_mech$NRM\n";
516 print "8. Secure SMTP (TLS) : $WHT$use_smtp_tls$NRM\n";
517 print "9. Header encryption key : $WHT$encode_header_key$NRM\n";
522 if ($show_imap_settings == 0) {
523 print "A. Update IMAP Settings : ";
524 print "$WHT$imapServerAddress$NRM:";
525 print "$WHT$imapPort$NRM ";
526 print "($WHT$imap_server_type$NRM)\n";
528 if ($show_smtp_settings == 0) {
529 if ( lc($useSendmail) eq 'true' ) {
530 print "B. Change Sendmail Config : $WHT$sendmail_path$NRM\n";
532 print "B. Update SMTP Settings : ";
533 print "$WHT$smtpServerAddress$NRM:";
534 print "$WHT$smtpPort$NRM\n";
537 if ( $show_smtp_settings || $show_imap_settings )
540 ($show_imap_settings ?
"IMAP Server" :
541 (lc($useSendmail) eq 'true') ?
"Sendmail" : "SMTP") . " Settings\n";
545 print "R Return to Main Menu\n";
546 } elsif ( $menu == 3 ) {
547 print $WHT. "Folder Defaults\n" . $NRM;
548 print "1. Default Folder Prefix : $WHT$default_folder_prefix$NRM\n";
549 print "2. Show Folder Prefix Option : $WHT$show_prefix_option$NRM\n";
550 print "3. Trash Folder : $WHT$trash_folder$NRM\n";
551 print "4. Sent Folder : $WHT$sent_folder$NRM\n";
552 print "5. Drafts Folder : $WHT$draft_folder$NRM\n";
553 print "6. By default, move to trash : $WHT$default_move_to_trash$NRM\n";
554 print "7. By default, move to sent : $WHT$default_move_to_sent$NRM\n";
555 print "8. By default, save as draft : $WHT$default_save_as_draft$NRM\n";
556 print "9. List Special Folders First : $WHT$list_special_folders_first$NRM\n";
557 print "10. Show Special Folders Color : $WHT$use_special_folder_color$NRM\n";
558 print "11. Auto Expunge : $WHT$auto_expunge$NRM\n";
559 print "12. Default Sub. of INBOX : $WHT$default_sub_of_inbox$NRM\n";
560 print "13. Show 'Contain Sub.' Option : $WHT$show_contain_subfolders_option$NRM\n";
561 print "14. Default Unseen Notify : $WHT$default_unseen_notify$NRM\n";
562 print "15. Default Unseen Type : $WHT$default_unseen_type$NRM\n";
563 print "16. Auto Create Special Folders : $WHT$auto_create_special$NRM\n";
564 print "17. Folder Delete Bypasses Trash : $WHT$delete_folder$NRM\n";
565 print "18. Enable /NoSelect folder fix : $WHT$noselect_fix_enable$NRM\n";
567 print "R Return to Main Menu\n";
568 } elsif ( $menu == 4 ) {
569 print $WHT. "General Options\n" . $NRM;
570 print "1. Data Directory : $WHT$data_dir$NRM\n";
571 print "2. Attachment Directory : $WHT$attachment_dir$NRM\n";
572 print "3. Directory Hash Level : $WHT$dir_hash_level$NRM\n";
573 print "4. Default Left Size : $WHT$default_left_size$NRM\n";
574 print "5. Usernames in Lowercase : $WHT$force_username_lowercase$NRM\n";
575 print "6. Allow use of priority : $WHT$default_use_priority$NRM\n";
576 print "7. Hide SM attributions : $WHT$hide_sm_attributions$NRM\n";
577 print "8. Allow use of receipts : $WHT$default_use_mdn$NRM\n";
578 print "9. Allow editing of identity : $WHT$edit_identity$NRM\n";
579 print " Allow editing of name : $WHT$edit_name$NRM\n";
580 print " Remove username from header : $WHT$hide_auth_header$NRM\n";
581 print "10. Disable server thread sort : $WHT$disable_thread_sort$NRM\n";
582 print "11. Disable server-side sorting : $WHT$disable_server_sort$NRM\n";
583 print "12. Allow server charset search : $WHT$allow_charset_search$NRM\n";
584 print "13. Allow advanced search : $WHT$allow_advanced_search$NRM\n";
585 print "14. PHP session name : $WHT$session_name$NRM\n";
586 print "15. Time zone configuration : $WHT$time_zone_type$NRM\n";
588 print "R Return to Main Menu\n";
589 } elsif ( $menu == 5 ) {
590 print $WHT. "Themes\n" . $NRM;
591 print "1. Change Template set\n";
592 # for ( $count = 0 ; $count <= $#theme_name/2 ; $count++ ) {
593 # $temp_name = $theme_name[$count*2];
594 # printf " %s%*s %s\n", $temp_name,
595 # 40 - length($temp_name), " ",
596 # $theme_name[($count*2)+1];
598 print "2. CSS File : $WHT$theme_css$NRM\n";
599 print "3. Default font size: $WHT$default_fontsize$NRM\n";
600 print "4. Change available font sets\n";
601 print "5. Change Themes\n";
604 print "R Return to Main Menu\n";
605 } elsif ( $menu == 6 ) {
606 print $WHT. "Address Books\n" . $NRM;
607 print "1. Change LDAP Servers\n";
608 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
609 print " > $ldap_host[$count]\n";
611 print "2. Use Javascript address book search : $WHT$default_use_javascript_addr_book$NRM\n";
612 print "3. Global address book file : $WHT$abook_global_file$NRM\n";
613 print "4. Allow writing into global file address book : $WHT$abook_global_file_writeable$NRM\n";
614 print "5. Allow listing of global file address book : $WHT$abook_global_file_listing$NRM\n";
616 print "R Return to Main Menu\n";
617 } elsif ( $menu == 7 ) {
618 print $WHT. "Message of the Day (MOTD)\n" . $NRM;
621 print "1 Edit the MOTD\n";
623 print "R Return to Main Menu\n";
624 } elsif ( $menu == 8 ) {
625 print $WHT. "Plugins\n" . $NRM;
626 print " Installed Plugins\n";
628 for ( $count = 0 ; $count <= $#plugins ; $count++ ) {
630 print " $num. $plugins[$count]\n";
632 print "\n Available Plugins:\n";
633 opendir( DIR
, "../plugins" );
634 @files = readdir(DIR
);
636 @unused_plugins = ();
637 for ( $i = 0 ; $i <= $#files ; $i++ ) {
638 if ( -d
"../plugins/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
640 for ( $k = 0 ; $k <= $#plugins ; $k++ ) {
641 if ( $plugins[$k] eq $files[$i] ) {
646 $unused_plugins[$pos] = $files[$i];
652 for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
654 print " $num. $unused_plugins[$i]\n";
659 print "R Return to Main Menu\n";
660 } elsif ( $menu == 9 ) {
661 print $WHT. "Database\n" . $NRM;
662 print "1. DSN for Address Book : $WHT$addrbook_dsn$NRM\n";
663 print "2. Table for Address Book : $WHT$addrbook_table$NRM\n";
665 print "3. DSN for Preferences : $WHT$prefs_dsn$NRM\n";
666 print "4. Table for Preferences : $WHT$prefs_table$NRM\n";
667 print "5. Field for username : $WHT$prefs_user_field$NRM ($prefs_user_size)\n";
668 print "6. Field for prefs key : $WHT$prefs_key_field$NRM ($prefs_key_size)\n";
669 print "7. Field for prefs value : $WHT$prefs_val_field$NRM ($prefs_val_size)\n";
671 print "8. DSN for Global Address Book : $WHT$addrbook_global_dsn$NRM\n";
672 print "9. Table for Global Address Book : $WHT$addrbook_global_table$NRM\n";
673 print "10. Allow writing into Global Address Book : $WHT$addrbook_global_writeable$NRM\n";
674 print "11. Allow listing of Global Address Book : $WHT$addrbook_global_listing$NRM\n";
676 print "R Return to Main Menu\n";
677 } elsif ( $menu == 10 ) {
678 print $WHT. "Language settings\n" . $NRM;
679 print "1. Default Language : $WHT$squirrelmail_default_language$NRM\n";
680 print "2. Default Charset : $WHT$default_charset$NRM\n";
681 print "3. Show alternative language names : $WHT$show_alternative_names$NRM\n";
682 print "4. Enable aggressive decoding : $WHT$aggressive_decoding$NRM\n";
683 print "5. Enable lossy encoding : $WHT$lossy_encoding$NRM\n";
685 print "R Return to Main Menu\n";
686 } elsif ( $menu == 11 ) {
687 print $WHT. "Interface tweaks\n" . $NRM;
688 print "1. Advanced tree : $WHT$advanced_tree$NRM\n";
689 print "2. Display html mails in iframe : $WHT$use_iframe$NRM\n";
690 print "3. Use Icons : $WHT$use_icons$NRM\n";
692 print $WHT. "PHP tweaks\n" . $NRM;
693 print "4. Use php recode functions : $WHT$use_php_recode$NRM\n";
694 print "5. Use php iconv functions : $WHT$use_php_iconv$NRM\n";
696 print $WHT. "Configuration tweaks\n" . $NRM;
697 print "6. Allow remote configtest : $WHT$allow_remote_configtest$NRM\n";
699 print "R Return to Main Menu\n";
701 if ( $config_use_color == 1 ) {
702 print "C Turn color off\n";
704 print "C Turn color on\n";
706 print "S Save data\n";
710 print "Command >> " . $WHT;
712 $command =~ s/[\n\r]//g;
713 $command =~ tr/A-Z/a-z/;
716 # Read the commands they entered.
717 if ( $command eq "r" ) {
719 } elsif ( $command eq "s" ) {
721 print "Press enter to continue...";
724 } elsif ( ( $command eq "q" ) && ( $saved == 0 ) ) {
725 print "You have not saved your data.\n";
726 print "Save? [" . $WHT . "Y" . $NRM . "/n]: ";
728 if ( ( $save =~ /^y/i ) || ( $save =~ /^\s*$/ ) ) {
731 } elsif ( $command eq "c" ) {
732 if ( $config_use_color == 1 ) {
733 $config_use_color = 2;
737 $config_use_color = 1;
741 } elsif ( $command eq "d" && $menu == 0 ) {
746 if ( ( $command > 0 ) && ( $command < 12 ) ) {
749 } elsif ( $menu == 1 ) {
750 if ( $command == 1 ) { $org_name = command1
(); }
751 elsif ( $command == 2 ) { $org_logo = command2
(); }
752 elsif ( $command == 3 ) { ($org_logo_width,$org_logo_height) = command2a
(); }
753 elsif ( $command == 4 ) { $org_title = command3
(); }
754 elsif ( $command == 5 ) { $signout_page = command4
(); }
755 elsif ( $command == 6 ) { $frame_top = command6
(); }
756 elsif ( $command == 7 ) { $provider_uri = command7
(); }
757 elsif ( $command == 8 ) { $provider_name = command8
(); }
759 } elsif ( $menu == 2 ) {
760 if ( $command eq "a" ) { $show_imap_settings = 1; $show_smtp_settings = 0; }
761 elsif ( $command eq "b" ) { $show_imap_settings = 0; $show_smtp_settings = 1; }
762 elsif ( $command eq "h" ) { $show_imap_settings = 0; $show_smtp_settings = 0; }
763 elsif ( $command <= 3 ) {
764 if ( $command == 1 ) { $domain = command11
(); }
765 elsif ( $command == 2 ) { $invert_time = command110
(); }
766 elsif ( $command == 3 ) { $useSendmail = command14
(); }
767 $show_imap_settings = 0; $show_smtp_settings = 0;
768 } elsif ( $show_imap_settings ) {
769 if ( $command == 4 ) { $imapServerAddress = command12
(); }
770 elsif ( $command == 5 ) { $imapPort = command13
(); }
771 elsif ( $command == 6 ) { $imap_auth_mech = command112a
(); }
772 elsif ( $command == 7 ) { $use_imap_tls = command_use_tls
("IMAP",$use_imap_tls); }
773 elsif ( $command == 8 ) { $imap_server_type = command19
(); }
774 elsif ( $command == 9 ) { $optional_delimiter = command111
(); }
775 } elsif ( $show_smtp_settings && lc($useSendmail) eq 'true' ) {
776 if ( $command == 4 ) { $sendmail_path = command15
(); }
777 elsif ( $command == 5 ) { $sendmail_args = command_sendmail_args
(); }
778 elsif ( $command == 6 ) { $encode_header_key = command114
(); }
779 } elsif ( $show_smtp_settings ) {
780 if ( $command == 4 ) { $smtpServerAddress = command16
(); }
781 elsif ( $command == 5 ) { $smtpPort = command17
(); }
782 elsif ( $command == 6 ) { $pop_before_smtp = command18a
(); }
783 elsif ( $command == 7 ) { $smtp_auth_mech = command112b
(); }
784 elsif ( $command == 8 ) { $use_smtp_tls = command_use_tls
("SMTP",$use_smtp_tls); }
785 elsif ( $command == 9 ) { $encode_header_key = command114
(); }
787 } elsif ( $menu == 3 ) {
788 if ( $command == 1 ) { $default_folder_prefix = command21
(); }
789 elsif ( $command == 2 ) { $show_prefix_option = command22
(); }
790 elsif ( $command == 3 ) { $trash_folder = command23a
(); }
791 elsif ( $command == 4 ) { $sent_folder = command23b
(); }
792 elsif ( $command == 5 ) { $draft_folder = command23c
(); }
793 elsif ( $command == 6 ) { $default_move_to_trash = command24a
(); }
794 elsif ( $command == 7 ) { $default_move_to_sent = command24b
(); }
795 elsif ( $command == 8 ) { $default_save_as_draft = command24c
(); }
796 elsif ( $command == 9 ) { $list_special_folders_first = command27
(); }
797 elsif ( $command == 10 ) { $use_special_folder_color = command28
(); }
798 elsif ( $command == 11 ) { $auto_expunge = command29
(); }
799 elsif ( $command == 12 ) { $default_sub_of_inbox = command210
(); }
800 elsif ( $command == 13 ) { $show_contain_subfolders_option = command211
(); }
801 elsif ( $command == 14 ) { $default_unseen_notify = command212
(); }
802 elsif ( $command == 15 ) { $default_unseen_type = command213
(); }
803 elsif ( $command == 16 ) { $auto_create_special = command214
(); }
804 elsif ( $command == 17 ) { $delete_folder = command215
(); }
805 elsif ( $command == 18 ) { $noselect_fix_enable = command216
(); }
806 } elsif ( $menu == 4 ) {
807 if ( $command == 1 ) { $data_dir = command33a
(); }
808 elsif ( $command == 2 ) { $attachment_dir = command33b
(); }
809 elsif ( $command == 3 ) { $dir_hash_level = command33c
(); }
810 elsif ( $command == 4 ) { $default_left_size = command35
(); }
811 elsif ( $command == 5 ) { $force_username_lowercase = command36
(); }
812 elsif ( $command == 6 ) { $default_use_priority = command37
(); }
813 elsif ( $command == 7 ) { $hide_sm_attributions = command38
(); }
814 elsif ( $command == 8 ) { $default_use_mdn = command39
(); }
815 elsif ( $command == 9 ) { $edit_identity = command310
(); }
816 elsif ( $command == 10 ) { $disable_thread_sort = command312
(); }
817 elsif ( $command == 11 ) { $disable_server_sort = command313
(); }
818 elsif ( $command == 12 ) { $allow_charset_search = command314
(); }
819 elsif ( $command == 13 ) { $allow_advanced_search = command316
(); }
820 elsif ( $command == 14 ) { $session_name = command317
(); }
821 elsif ( $command == 15 ) { $time_zone_type = command318
(); }
822 } elsif ( $menu == 5 ) {
823 if ( $command == 1 ) { $templateset_default = command_templates
(); }
824 elsif ( $command == 2 ) { $theme_css = command42
(); }
825 elsif ( $command == 3 ) { $default_fontsize = command_default_fontsize
(); }
826 elsif ( $command == 4 ) { command_fontsets
(); }
827 elsif ( $command == 5 ) { command41
(); }
828 } elsif ( $menu == 6 ) {
829 if ( $command == 1 ) { command61
(); }
830 elsif ( $command == 2 ) { command62
(); }
831 elsif ( $command == 3 ) { $abook_global_file=command63
(); }
832 elsif ( $command == 4 ) { command64
(); }
833 elsif ( $command == 5 ) { command65
(); }
834 } elsif ( $menu == 7 ) {
835 if ( $command == 1 ) { $motd = command71
(); }
836 } elsif ( $menu == 8 ) {
837 if ( $command =~ /^[0-9]+/ ) { @plugins = command81
(); }
838 } elsif ( $menu == 9 ) {
839 if ( $command == 1 ) { $addrbook_dsn = command91
(); }
840 elsif ( $command == 2 ) { $addrbook_table = command92
(); }
841 elsif ( $command == 3 ) { $prefs_dsn = command93
(); }
842 elsif ( $command == 4 ) { $prefs_table = command94
(); }
843 elsif ( $command == 5 ) { $prefs_user_field = command95
(); }
844 elsif ( $command == 6 ) { $prefs_key_field = command96
(); }
845 elsif ( $command == 7 ) { $prefs_val_field = command97
(); }
846 elsif ( $command == 8 ) { $addrbook_global_dsn = command98
(); }
847 elsif ( $command == 9 ) { $addrbook_global_table = command99
(); }
848 elsif ( $command == 10 ) { $addrbook_global_writeable = command910
(); }
849 elsif ( $command == 11 ) { $addrbook_global_listing = command911
(); }
850 } elsif ( $menu == 10 ) {
851 if ( $command == 1 ) { $squirrelmail_default_language = commandA1
(); }
852 elsif ( $command == 2 ) { $default_charset = commandA2
(); }
853 elsif ( $command == 3 ) { $show_alternative_names = commandA3
(); }
854 elsif ( $command == 4 ) { $aggressive_decoding = commandA4
(); }
855 elsif ( $command == 5 ) { $lossy_encoding = commandA5
(); }
856 } elsif ( $menu == 11 ) {
857 if ( $command == 1 ) { $advanced_tree = commandB1
(); }
858 if ( $command == 2 ) { $use_iframe = commandB2
(); }
859 elsif ( $command == 3 ) { $use_icons = commandB3
(); }
860 elsif ( $command == 4 ) { $use_php_recode = commandB4
(); }
861 elsif ( $command == 5 ) { $use_php_iconv = commandB5
(); }
862 elsif ( $command == 6 ) { $allow_remote_configtest = commandB6
(); }
868 print "\nExiting conf.pl.\n".
869 "You might want to test your configuration by browsing to\n".
870 "http://your-squirrelmail-location/src/configtest.php\n".
871 "Happy SquirrelMailing!\n\n";
874 ####################################################################################
878 print "We have tried to make the name SquirrelMail as transparent as\n";
879 print "possible. If you set up an organization name, most places where\n";
880 print "SquirrelMail would take credit will be credited to your organization.\n";
882 print "If your Organization Name includes a '\$', please precede it with a \\. \n";
883 print "Other '\$' will be considered the beginning of a variable that\n";
884 print "must be defined before the \$org_name is printed.\n";
886 print "[$WHT$org_name$NRM]: $WHT";
887 $new_org_name = <STDIN
>;
888 if ( $new_org_name eq "\n" ) {
889 $new_org_name = $org_name;
891 $new_org_name =~ s/[\r\n]//g;
892 $new_org_name =~ s/\"/"/g;
894 return $new_org_name;
899 print "Your organization's logo is an image that will be displayed at\n";
900 print "different times throughout SquirrelMail. ";
902 print "Please be aware of the following: \n";
903 print " - Relative URLs are relative to the config dir\n";
904 print " to use the default logo, use ../images/sm_logo.png\n";
905 print " - To specify a logo defined outside the SquirrelMail source tree\n";
906 print " use the absolute URL the webserver would use to include the file\n";
907 print " e.g. http://www.example.com/images/mylogo.gif or /images/mylogo.jpg\n";
909 print "[$WHT$org_logo$NRM]: $WHT";
910 $new_org_logo = <STDIN
>;
911 if ( $new_org_logo eq "\n" ) {
912 $new_org_logo = $org_logo;
914 $new_org_logo =~ s/[\r\n]//g;
916 return $new_org_logo;
921 print "Your organization's logo is an image that will be displayed at\n";
922 print "different times throughout SquirrelMail. Width\n";
923 print "and Height of your logo image. Use '0' to disable.\n";
925 print "Width: [$WHT$org_logo_width$NRM]: $WHT";
926 $new_org_logo_width = <STDIN
>;
927 $new_org_logo_width =~ tr/0-9//cd; # only want digits!
928 if ( $new_org_logo_width eq '' ) {
929 $new_org_logo_width = $org_logo_width;
931 if ( $new_org_logo_width > 0 ) {
932 print "Height: [$WHT$org_logo_height$NRM]: $WHT";
933 $new_org_logo_height = <STDIN
>;
934 $new_org_logo_height =~ tr/0-9//cd; # only want digits!
935 if( $new_org_logo_height eq '' ) {
936 $new_org_logo_height = $org_logo_height;
939 $new_org_logo_height = 0;
941 return ($new_org_logo_width, $new_org_logo_height);
946 print "A title is what is displayed at the top of the browser window in\n";
947 print "the titlebar. Usually this will end up looking something like:\n";
948 print "\"Netscape: $org_title\"\n";
950 print "If your Organization Title includes a '\$', please precede it with a \\. \n";
951 print "Other '\$' will be considered the beginning of a variable that\n";
952 print "must be defined before the \$org_title is printed.\n";
953 print "\$version, for example can be used, and will print the\n";
954 print "string representing the current SquirrelMail version.\n";
956 print "[$WHT$org_title$NRM]: $WHT";
957 $new_org_title = <STDIN
>;
958 if ( $new_org_title eq "\n" ) {
959 $new_org_title = $org_title;
961 $new_org_title =~ s/[\r\n]//g;
962 $new_org_title =~ s/\"/\'/g;
964 return $new_org_title;
969 print "When users click the Sign Out button they will be logged out and\n";
970 print "then sent to signout_page. If signout_page is left empty,\n";
971 print "(hit space and then return) they will be taken, as normal,\n";
972 print "to the default and rather sparse SquirrelMail signout page.\n";
974 print "[$WHT$signout_page$NRM]: $WHT";
975 $new_signout_page = <STDIN
>;
976 if ( $new_signout_page eq "\n" ) {
977 $new_signout_page = $signout_page;
979 $new_signout_page =~ s/[\r\n]//g;
980 $new_signout_page =~ s/^\s+$//g;
982 return $new_signout_page;
987 print "SquirrelMail defaults to using the whole of the browser window.\n";
988 print "This allows you to keep it within a specified frame. The default\n";
991 print "[$WHT$frame_top$NRM]: $WHT";
992 $new_frame_top = <STDIN
>;
993 if ( $new_frame_top eq "\n" ) {
994 $new_frame_top = '_top';
996 $new_frame_top =~ s/[\r\n]//g;
997 $new_frame_top =~ s/^\s+$//g;
999 return $new_frame_top;
1002 # Default link to provider
1004 print "Here you can set the link on the right of the page.\n";
1005 print "If empty, it will link to the SquirrelMail About page.\n";
1007 print "[$WHT$provider_uri$NRM]: $WHT";
1008 $new_provider_uri = <STDIN
>;
1009 if ( $new_provider_uri eq "\n" ) {
1010 $new_provider_uri = '';
1012 $new_provider_uri =~ s/[\r\n]//g;
1013 $new_provider_uri =~ s/^\s+$//g;
1015 return $new_provider_uri;
1019 print "Here you can set the name of the link on the right of the page.\n";
1020 print "The default is 'SquirrelMail/'\n";
1022 print "[$WHT$provider_name$NRM]: $WHT";
1023 $new_provider_name = <STDIN
>;
1024 if ( $new_provider_name eq "\n" ) {
1025 $new_provider_name = 'SquirrelMail';
1027 $new_provider_name =~ s/[\r\n]//g;
1028 $new_provider_name =~ s/^\s+$//g;
1030 return $new_provider_name;
1033 ####################################################################################
1037 print "The domain name is the suffix at the end of all email addresses. If\n";
1038 print "for example, your email address is jdoe\@example.com, then your domain\n";
1039 print "would be example.com.\n";
1041 print "[$WHT$domain$NRM]: $WHT";
1042 $new_domain = <STDIN
>;
1043 if ( $new_domain eq "\n" ) {
1044 $new_domain = $domain;
1046 $new_domain =~ s/[\r\n]//g;
1053 print "This is the hostname where your IMAP server can be contacted.\n";
1054 print "[$WHT$imapServerAddress$NRM]: $WHT";
1055 $new_imapServerAddress = <STDIN
>;
1056 if ( $new_imapServerAddress eq "\n" ) {
1057 $new_imapServerAddress = $imapServerAddress;
1059 $new_imapServerAddress =~ s/[\r\n]//g;
1061 return $new_imapServerAddress;
1066 print "This is the port that your IMAP server is on. Usually this is 143.\n";
1067 print "[$WHT$imapPort$NRM]: $WHT";
1068 $new_imapPort = <STDIN
>;
1069 if ( $new_imapPort eq "\n" ) {
1070 $new_imapPort = $imapPort;
1072 $new_imapPort =~ s/[\r\n]//g;
1074 return $new_imapPort;
1079 print "You now need to choose the method that you will use for sending\n";
1080 print "messages in SquirrelMail. You can either connect to an SMTP server\n";
1081 print "or use sendmail directly.\n";
1082 if ( lc($useSendmail) eq 'true' ) {
1083 $default_value = "1";
1085 $default_value = "2";
1088 print " 1. Sendmail\n";
1090 print "Your choice [1/2] [$WHT$default_value$NRM]: $WHT";
1091 $use_sendmail = <STDIN
>;
1092 if ( ( $use_sendmail =~ /^1\n/i )
1093 || ( ( $use_sendmail =~ /^\n/ ) && ( $default_value eq "1" ) ) ) {
1094 $useSendmail = 'true';
1096 $useSendmail = 'false';
1098 return $useSendmail;
1103 print "Specify where the sendmail executable is located. Usually /usr/sbin/sendmail\n";
1104 print "[$WHT$sendmail_path$NRM]: $WHT";
1105 $new_sendmail_path = <STDIN
>;
1106 if ( $new_sendmail_path eq "\n" ) {
1107 $new_sendmail_path = $sendmail_path;
1109 $new_sendmail_path =~ s/[\r\n]//g;
1111 return $new_sendmail_path;
1114 # Extra sendmail arguments
1115 sub command_sendmail_args
{
1116 print "Specify additional sendmail program arguments.\n";
1118 print "Make sure that arguments are supported by your sendmail program. -f argument \n";
1119 print "is added automatically by SquirrelMail scripts. Variable defaults to standard\n";
1120 print "/usr/sbin/sendmail arguments. If you use qmail-inject, nbsmtp or any other \n";
1121 print "sendmail wrapper, which does not support -i and -t arguments, set variable to\n";
1122 print "empty string or use arguments suitable for your mailer.\n";
1124 print "[$WHT$sendmail_args$NRM]: $WHT";
1125 $new_sendmail_args = <STDIN
>;
1126 if ( $new_sendmail_args eq "\n" ) {
1127 $new_sendmail_args = $sendmail_args;
1129 # strip linefeeds and crs.
1130 $new_sendmail_args =~ s/[\r\n]//g;
1132 return trim
($new_sendmail_args);
1137 print "This is the hostname of your SMTP server.\n";
1138 print "[$WHT$smtpServerAddress$NRM]: $WHT";
1139 $new_smtpServerAddress = <STDIN
>;
1140 if ( $new_smtpServerAddress eq "\n" ) {
1141 $new_smtpServerAddress = $smtpServerAddress;
1143 $new_smtpServerAddress =~ s/[\r\n]//g;
1145 return $new_smtpServerAddress;
1150 print "This is the port to connect to for SMTP. Usually 25.\n";
1151 print "[$WHT$smtpPort$NRM]: $WHT";
1152 $new_smtpPort = <STDIN
>;
1153 if ( $new_smtpPort eq "\n" ) {
1154 $new_smtpPort = $smtpPort;
1156 $new_smtpPort =~ s/[\r\n]//g;
1158 return $new_smtpPort;
1161 # authenticated server
1164 # This sub disabled by tassium - it has been replaced with smtp_auth_mech
1165 print "Do you wish to use an authenticated SMTP server? Your server must\n";
1166 print "support this in order for SquirrelMail to work with it. We implemented\n";
1167 print "it according to RFC 2554.\n";
1170 $YesNo = 'y' if ( lc($use_authenticated_smtp) eq 'true' );
1172 print "Use authenticated SMTP server (y/n) [$WHT$YesNo$NRM]: $WHT";
1174 $new_use_authenticated_smtp = <STDIN
>;
1175 $new_use_authenticated_smtp =~ tr/yn//cd;
1176 return 'true' if ( $new_use_authenticated_smtp eq "y" );
1177 return 'false' if ( $new_use_authenticated_smtp eq "n" );
1178 return $use_authenticated_smtp;
1183 print "Do you wish to use POP3 before SMTP? Your server must\n";
1184 print "support this in order for SquirrelMail to work with it.\n";
1187 $YesNo = 'y' if ( lc($pop_before_smtp) eq 'true' );
1189 print "Use pop before SMTP (y/n) [$WHT$YesNo$NRM]: $WHT";
1191 $new_pop_before_smtp = <STDIN
>;
1192 $new_pop_before_smtp =~ tr/yn//cd;
1193 return 'true' if ( $new_pop_before_smtp eq "y" );
1194 return 'false' if ( $new_pop_before_smtp eq "n" );
1195 return $pop_before_smtp;
1200 print "Each IMAP server has its own quirks. As much as we tried to stick\n";
1201 print "to standards, it doesn't help much if the IMAP server doesn't follow\n";
1202 print "the same principles. We have made some work-arounds for some of\n";
1203 print "these servers. If you would like to use them, please select your\n";
1204 print "IMAP server. If you do not wish to use these work-arounds, you can\n";
1205 print "set this to \"other\", and none will be used.\n";
1206 print " courier = Courier IMAP server\n";
1207 print " cyrus = Cyrus IMAP server\n";
1208 print " dovecot = Dovecot Secure IMAP server\n";
1209 print " exchange = Microsoft Exchange IMAP server\n";
1210 print " hmailserver = hMailServer\n";
1211 print " macosx = Mac OS X Mailserver\n";
1212 print " mercury32 = Mercury Mail Transport System\n";
1213 print " uw = University of Washington's IMAP server\n";
1215 print " other = Not one of the above servers\n";
1217 print "[$WHT$imap_server_type$NRM]: $WHT";
1218 $new_imap_server_type = <STDIN
>;
1220 if ( $new_imap_server_type eq "\n" ) {
1221 $new_imap_server_type = $imap_server_type;
1223 $new_imap_server_type =~ s/[\r\n]//g;
1225 return $new_imap_server_type;
1230 print "Sometimes the date of messages sent is messed up (off by a few hours\n";
1231 print "on some machines). Typically this happens if the system doesn't support\n";
1232 print "tm_gmtoff. It will happen only if your time zone is \"negative\".\n";
1233 print "This most often occurs on Solaris 7 machines in the United States.\n";
1234 print "By default, this is off. It should be kept off unless problems surface\n";
1235 print "about the time that messages are sent.\n";
1236 print " no = Do NOT fix time -- almost always correct\n";
1237 print " yes = Fix the time for this system\n";
1240 $YesNo = 'y' if ( lc($invert_time) eq 'true' );
1242 print "Fix the time for this system (y/n) [$WHT$YesNo$NRM]: $WHT";
1244 $new_invert_time = <STDIN
>;
1245 $new_invert_time =~ tr/yn//cd;
1246 return 'true' if ( $new_invert_time eq "y" );
1247 return 'false' if ( $new_invert_time eq "n" );
1248 return $invert_time;
1252 print "This is the delimiter that your IMAP server uses to distinguish between\n";
1253 print "folders. For example, Cyrus uses '.' as the delimiter and a complete\n";
1254 print "folder would look like 'INBOX.Friends.Bob', while UW uses '/' and would\n";
1255 print "look like 'INBOX/Friends/Bob'. Normally this should be left at 'detect'\n";
1256 print "but if you are sure you know what delimiter your server uses, you can\n";
1257 print "specify it here.\n";
1258 print "\nTo have it autodetect the delimiter, set it to 'detect'.\n\n";
1259 print "[$WHT$optional_delimiter$NRM]: $WHT";
1260 $new_optional_delimiter = <STDIN
>;
1262 if ( $new_optional_delimiter eq "\n" ) {
1263 $new_optional_delimiter = $optional_delimiter;
1265 $new_optional_delimiter =~ s/[\r\n]//g;
1267 return $new_optional_delimiter;
1269 # IMAP authentication type
1270 # Possible values: login, plain, cram-md5, digest-md5
1271 # Now offers to detect supported mechs, assuming server & port are set correctly
1274 if ($use_imap_tls =~ /^true\b/i) {
1275 print "Auto-detection of login methods is unavailable when using TLS.\n";
1277 print "If you have already set the hostname and port number, I can try to\n";
1278 print "detect the mechanisms your IMAP server supports.\n";
1279 print "I will try to detect CRAM-MD5 and DIGEST-MD5 support. I can't test\n";
1280 print "for \"login\" or \"plain\" without knowing a username and password.\n";
1281 print "Auto-detecting is optional - you can safely say \"n\" here.\n";
1282 print "\nTry to detect supported mechanisms? [y/N]: ";
1285 if ($inval =~ /^y\b/i) {
1286 # Yes, let's try to detect.
1287 print "Trying to detect IMAP capabilities...\n";
1288 my $host = $imapServerAddress . ':'. $imapPort;
1289 print "CRAM-MD5:\t";
1290 my $tmp = detect_auth_support
('IMAP',$host,'CRAM-MD5');
1291 if (defined($tmp)) {
1292 if ($tmp eq 'YES') {
1293 print "$WHT SUPPORTED$NRM\n";
1295 print "$WHT NOT SUPPORTED$NRM\n";
1298 print $WHT . " ERROR DETECTING$NRM\n";
1301 print "DIGEST-MD5:\t";
1302 $tmp = detect_auth_support
('IMAP',$host,'DIGEST-MD5');
1303 if (defined($tmp)) {
1304 if ($tmp eq 'YES') {
1305 print "$WHT SUPPORTED$NRM\n";
1307 print "$WHT NOT SUPPORTED$NRM\n";
1310 print $WHT . " ERROR DETECTING$NRM\n";
1315 print "\nWhat authentication mechanism do you want to use for IMAP connections?\n\n";
1316 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1317 print $WHT . "plain" . $NRM . " - SASL PLAIN. If you need this, you already know it.\n";
1318 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext methods.\n";
1319 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1320 print "\n*** YOUR IMAP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n";
1321 print "If you don't understand or are unsure, you probably want \"login\"\n\n";
1322 print "login, plain, cram-md5, or digest-md5 [$WHT$imap_auth_mech$NRM]: $WHT";
1325 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || ($inval =~ /^login\b/i) || ($inval =~ /^plain\b/i)) {
1328 # user entered garbage or default value so nothing needs to be set
1329 return $imap_auth_mech;
1334 # SMTP authentication type
1335 # Possible choices: none, plain, cram-md5, digest-md5
1337 if ($use_smtp_tls =~ /^true\b/i) {
1338 print "Auto-detection of login methods is unavailable when using TLS.\n";
1340 print "If you have already set the hostname and port number, I can try to\n";
1341 print "automatically detect some of the mechanisms your SMTP server supports.\n";
1342 print "Auto-detection is *optional* - you can safely say \"n\" here.\n";
1343 print "\nTry to detect auth mechanisms? [y/N]: ";
1346 if ($inval =~ /^y\b/i) {
1347 # Yes, let's try to detect.
1348 print "Trying to detect supported methods (SMTP)...\n";
1351 # Check none by trying to relay to junk@microsoft.com
1352 $host = $smtpServerAddress . ':' . $smtpPort;
1354 my $sock = IO
::Socket
::INET
->new($host);
1355 print "Testing none:\t\t$WHT";
1356 if (!defined($sock)) {
1357 print " ERROR TESTING\n";
1360 print $sock "HELO $domain\r\n";
1361 $got = <$sock>; # Discard
1362 print $sock "MAIL FROM:<tester\@squirrelmail.org>\r\n";
1363 $got = <$sock>; # Discard
1364 print $sock "RCPT TO:<junk\@microsoft.com\r\n";
1365 $got = <$sock>; # This is the important line
1366 if ($got =~ /^250\b/) { # SMTP will relay without auth
1367 print "SUPPORTED$NRM\n";
1369 print "NOT SUPPORTED$NRM\n";
1371 print $sock "RSET\r\n";
1372 print $sock "QUIT\r\n";
1375 # Try login (SquirrelMail default)
1376 print "Testing login:\t\t";
1377 $tmp=detect_auth_support
('SMTP',$host,'LOGIN');
1378 if (defined($tmp)) {
1379 if ($tmp eq 'YES') {
1380 print $WHT . "SUPPORTED$NRM\n";
1382 print $WHT . "NOT SUPPORTED$NRM\n";
1385 print $WHT . "ERROR DETECTING$NRM\n";
1389 print "Testing CRAM-MD5:\t";
1390 $tmp=detect_auth_support
('SMTP',$host,'CRAM-MD5');
1391 if (defined($tmp)) {
1392 if ($tmp eq 'YES') {
1393 print $WHT . "SUPPORTED$NRM\n";
1395 print $WHT . "NOT SUPPORTED$NRM\n";
1398 print $WHT . "ERROR DETECTING$NRM\n";
1402 print "Testing DIGEST-MD5:\t";
1403 $tmp=detect_auth_support
('SMTP',$host,'DIGEST-MD5');
1404 if (defined($tmp)) {
1405 if ($tmp eq 'YES') {
1406 print $WHT . "SUPPORTED$NRM\n";
1408 print $WHT . "NOT SUPPORTED$NRM\n";
1411 print $WHT . "ERROR DETECTING$NRM\n";
1415 print "\nWhat authentication mechanism do you want to use for SMTP connections?\n";
1416 print $WHT . "none" . $NRM . " - Your SMTP server does not require authorization.\n";
1417 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1418 print $WHT . "plain" . $NRM . " - SASL PLAIN. You already know it if you need this.\n";
1419 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext.\n";
1420 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1421 print $WHT . "\n*** YOUR SMTP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n" . $NRM;
1422 print "If you don't understand or are unsure, you probably want \"none\"\n\n";
1423 print "none, login, cram-md5, or digest-md5 [$WHT$smtp_auth_mech$NRM]: $WHT";
1426 if ($inval =~ /^none\b/i) {
1427 # SMTP doesn't necessarily require logins
1430 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) ||
1431 ($inval =~ /^login\b/i) || ($inval =~/^plain\b/i)) {
1434 # user entered garbage, or default value so nothing needs to be set
1435 return $smtp_auth_mech;
1440 # This sub is reused for IMAP and SMTP
1441 # Args: service name, default value
1442 sub command_use_tls
{
1443 my($default_val,$service,$inval);
1446 print "TLS (Transport Layer Security) encrypts the traffic between server and client.\n";
1447 print "STARTTLS extensions allow to start encryption on existing plain text connection.\n";
1448 print "These options add specific PHP and IMAP server configuration requirements.\n";
1449 print "See SquirrelMail documentation about connection security.\n";
1451 print "If your " . $service . " server is localhost, you can safely disable this.\n";
1452 print "If it is remote, you may wish to seriously consider enabling this.\n";
1454 while ($valid_input eq 0) {
1455 print "\nSelect connection security model:\n";
1456 print " 0 - Use plain text connection\n";
1457 print " 1 - Use TLS connection\n";
1458 print " 2 - Use STARTTLS extension\n";
1459 print "Select [$default_val]: ";
1461 $inval=trim
($inval);
1462 if ($inval =~ /^[012]$/ || $inval eq '') {
1466 if ($inval ne '') {$default_val = $inval};
1467 return $default_val;
1470 # $encode_header_key
1472 print "Encryption key allows to hide SquirrelMail Received: headers\n";
1473 print "in outbound messages. Interface uses encryption key to encode\n";
1474 print "username, remote address and proxied address, then stores encoded\n";
1475 print "information in X-Squirrel-* headers.\n";
1477 print "Warning: used encryption function is not bulletproof. When used\n";
1478 print "with static encryption keys, it provides only minimal security\n";
1479 print "measures and information can be decoded quickly.\n";
1481 print "Encoded information can be decoded with decrypt_headers.php script\n";
1482 print "from SquirrelMail contrib/ directory.\n";
1484 print "Enter encryption key: ";
1485 $new_encode_header_key = <STDIN
>;
1486 if ( $new_encode_header_key eq "\n" ) {
1487 $new_encode_header_key = $encode_header_key;
1489 $new_encode_header_key =~ s/[\r\n]//g;
1491 return $new_encode_header_key;
1496 print "\nYou can now create the welcome message that is displayed\n";
1497 print "every time a user logs on. You can use HTML or just plain\n";
1499 "text. If you do not wish to have one, just make it blank.\n\n(Type @ on a blank line to exit)\n";
1505 $line =~ s/[\r\n]//g;
1506 if ( $line ne "@" ) {
1507 $line =~ s/ /\ \ /g;
1508 $line =~ s/\t/\ \ \ \ /g;
1510 $line =~ s/\"/\\\"/g;
1512 $new_motd = $new_motd . $line;
1514 } while ( $line ne "@" );
1518 ################# PLUGINS ###################
1521 $command =~ s/[\s\n\r]*//g;
1522 if ( $command > 0 ) {
1523 $command = $command - 1;
1524 if ( $command <= $#plugins ) {
1527 while ( $ct <= $#plugins ) {
1528 if ( $ct != $command ) {
1529 @newplugins = ( @newplugins, $plugins[$ct] );
1533 @plugins = @newplugins;
1534 } elsif ( $command <= $#plugins + $#unused_plugins + 1 ) {
1535 $num = $command - $#plugins - 1;
1536 @newplugins = @plugins;
1538 while ( $ct <= $#unused_plugins ) {
1539 if ( $ct == $num ) {
1540 @newplugins = ( @newplugins, $unused_plugins[$ct] );
1544 @plugins = @newplugins;
1550 ################# FOLDERS ###################
1552 # default_folder_prefix
1554 print "Some IMAP servers (UW, for example) store mail and folders in\n";
1555 print "your user space in a separate subdirectory. This is where you\n";
1556 print "specify what that directory is.\n";
1558 print "EXAMPLE: mail/";
1560 print "NOTE: If you use Cyrus, or some server that would not use this\n";
1561 print " option, you must set this to 'none'.\n";
1563 print "[$WHT$default_folder_prefix$NRM]: $WHT";
1564 $new_default_folder_prefix = <STDIN
>;
1566 if ( $new_default_folder_prefix eq "\n" ) {
1567 $new_default_folder_prefix = $default_folder_prefix;
1569 $new_default_folder_prefix =~ s/[\r\n]//g;
1571 if ( ( $new_default_folder_prefix =~ /^\s*$/ ) || ( $new_default_folder_prefix =~ m/^none$/i ) ) {
1572 $new_default_folder_prefix = "";
1574 # add the trailing delimiter only if we know what the server is.
1575 if (($imap_server_type eq 'cyrus' and
1576 $optional_delimiter eq 'detect') or
1577 ($imap_server_type eq 'courier' and
1578 $optional_delimiter eq 'detect')) {
1579 $new_default_folder_prefix =~ s/\.*$/\./;
1580 } elsif ($imap_server_type eq 'uw' and
1581 $optional_delimiter eq 'detect') {
1582 $new_default_folder_prefix =~ s/\/*$/\
//;
1585 return $new_default_folder_prefix;
1588 # Show Folder Prefix
1590 print "It is possible to set up the default folder prefix as a user\n";
1591 print "specific option, where each user can specify what their mail\n";
1592 print "folder is. If you set this to false, they will never see the\n";
1593 print "option, but if it is true, this option will appear in the\n";
1594 print "'options' section.\n";
1596 print "NOTE: You set the default folder prefix in option '1' of this\n";
1597 print " section. That will be the default if the user doesn't\n";
1598 print " specify anything different.\n";
1601 if ( lc($show_prefix_option) eq 'true' ) {
1602 $default_value = "y";
1604 $default_value = "n";
1607 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1608 $new_show = <STDIN
>;
1609 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1610 $show_prefix_option = 'true';
1612 $show_prefix_option = 'false';
1614 return $show_prefix_option;
1619 print "You can now specify where the default trash folder is located.\n";
1620 print "On servers where you do not want this, you can set it to anything\n";
1621 print "and set option 6 to false.\n";
1623 print "This is relative to where the rest of your email is kept. You do\n";
1624 print "not need to worry about their mail directory. If this folder\n";
1625 print "would be ~/mail/trash on the filesystem, you only need to specify\n";
1626 print "that this is 'trash', and be sure to put 'mail/' in option 1.\n";
1629 print "[$WHT$trash_folder$NRM]: $WHT";
1630 $new_trash_folder = <STDIN
>;
1631 if ( $new_trash_folder eq "\n" ) {
1632 $new_trash_folder = $trash_folder;
1634 $new_trash_folder =~ s/[\r\n]//g;
1636 return $new_trash_folder;
1641 print "This is where messages that are sent will be stored. SquirrelMail\n";
1642 print "by default puts a copy of all outgoing messages in this folder.\n";
1644 print "This is relative to where the rest of your email is kept. You do\n";
1645 print "not need to worry about their mail directory. If this folder\n";
1646 print "would be ~/mail/sent on the filesystem, you only need to specify\n";
1647 print "that this is 'sent', and be sure to put 'mail/' in option 1.\n";
1650 print "[$WHT$sent_folder$NRM]: $WHT";
1651 $new_sent_folder = <STDIN
>;
1652 if ( $new_sent_folder eq "\n" ) {
1653 $new_sent_folder = $sent_folder;
1655 $new_sent_folder =~ s/[\r\n]//g;
1657 return $new_sent_folder;
1662 print "You can now specify where the default draft folder is located.\n";
1663 print "On servers where you do not want this, you can set it to anything\n";
1664 print "and set option 9 to false.\n";
1666 print "This is relative to where the rest of your email is kept. You do\n";
1667 print "not need to worry about their mail directory. If this folder\n";
1668 print "would be ~/mail/drafts on the filesystem, you only need to specify\n";
1669 print "that this is 'drafts', and be sure to put 'mail/' in option 1.\n";
1672 print "[$WHT$draft_folder$NRM]: $WHT";
1673 $new_draft_folder = <STDIN
>;
1674 if ( $new_draft_folder eq "\n" ) {
1675 $new_draft_folder = $draft_folder;
1677 $new_draft_folder =~ s/[\r\n]//g;
1679 return $new_draft_folder;
1682 # default move to trash
1684 print "By default, should messages get moved to the trash folder? You\n";
1685 print "can specify the default trash folder in option 3. If this is set\n";
1686 print "to false, messages will get deleted immediately without moving\n";
1687 print "to the trash folder.\n";
1689 print "Trash folder is currently: $trash_folder\n";
1692 if ( lc($default_move_to_trash) eq 'true' ) {
1693 $default_value = "y";
1695 $default_value = "n";
1697 print "By default, move to trash (y/n) [$WHT$default_value$NRM]: $WHT";
1698 $new_show = <STDIN
>;
1699 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1700 $default_move_to_trash = 'true';
1702 $default_move_to_trash = 'false';
1704 return $default_move_to_trash;
1707 # default move to sent
1709 print "By default, should messages get moved to the sent folder? You\n";
1710 print "can specify the default sent folder in option 4. If this is set\n";
1711 print "to false, messages will get sent and no copy will be made.\n";
1713 print "Sent folder is currently: $sent_folder\n";
1716 if ( lc($default_move_to_sent) eq 'true' ) {
1717 $default_value = "y";
1719 $default_value = "n";
1721 print "By default, move to sent (y/n) [$WHT$default_value$NRM]: $WHT";
1722 $new_show = <STDIN
>;
1723 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1724 $default_move_to_sent = 'true';
1726 $default_move_to_sent = 'false';
1728 return $default_move_to_sent;
1731 # default save as draft
1733 print "By default, should the save to draft option be shown? You can\n";
1734 print "specify the default drafts folder in option 5. If this is set\n";
1735 print "to false, users will not be shown the save to draft option.\n";
1737 print "Drafts folder is currently: $draft_folder\n";
1740 if ( lc($default_move_to_draft) eq 'true' ) {
1741 $default_value = "y";
1743 $default_value = "n";
1745 print "By default, save as draft (y/n) [$WHT$default_value$NRM]: $WHT";
1746 $new_show = <STDIN
>;
1747 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1748 $default_save_as_draft = 'true';
1750 $default_save_as_draft = 'false';
1752 return $default_save_as_draft;
1755 # List special folders first
1757 print "SquirrelMail has what we call 'special folders' that are not\n";
1758 print "manipulated and viewed like normal folders. Some examples of\n";
1759 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
1760 print "Simply asks if you want these folders listed first in the folder\n";
1764 if ( lc($list_special_folders_first) eq 'true' ) {
1765 $default_value = "y";
1767 $default_value = "n";
1770 print "List first (y/n) [$WHT$default_value$NRM]: $WHT";
1771 $new_show = <STDIN
>;
1772 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1773 $list_special_folders_first = 'true';
1775 $list_special_folders_first = 'false';
1777 return $list_special_folders_first;
1780 # Show special folders color
1782 print "SquirrelMail has what we call 'special folders' that are not\n";
1783 print "manipulated and viewed like normal folders. Some examples of\n";
1784 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
1785 print "wants to know if we should display special folders in a\n";
1786 print "color than the other folders.\n";
1789 if ( lc($use_special_folder_color) eq 'true' ) {
1790 $default_value = "y";
1792 $default_value = "n";
1795 print "Show color (y/n) [$WHT$default_value$NRM]: $WHT";
1796 $new_show = <STDIN
>;
1797 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1798 $use_special_folder_color = 'true';
1800 $use_special_folder_color = 'false';
1802 return $use_special_folder_color;
1807 print "The way that IMAP handles deleting messages is as follows. You\n";
1808 print "mark the message as deleted, and then to 'really' delete it, you\n";
1809 print "expunge it. This option asks if you want to just have messages\n";
1810 print "marked as deleted, or if you want SquirrelMail to expunge the \n";
1811 print "messages too.\n";
1814 if ( lc($auto_expunge) eq 'true' ) {
1815 $default_value = "y";
1817 $default_value = "n";
1819 print "Auto expunge (y/n) [$WHT$default_value$NRM]: $WHT";
1820 $new_show = <STDIN
>;
1821 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1822 $auto_expunge = 'true';
1824 $auto_expunge = 'false';
1826 return $auto_expunge;
1829 # Default sub of inbox
1831 print "Some IMAP servers (Cyrus) have all folders as subfolders of INBOX.\n";
1832 print "This can cause some confusion in folder creation for users when\n";
1833 print "they try to create folders and don't put it as a subfolder of INBOX\n";
1834 print "and get permission errors. This option asks if you want folders\n";
1835 print "to be subfolders of INBOX by default.\n";
1838 if ( lc($default_sub_of_inbox) eq 'true' ) {
1839 $default_value = "y";
1841 $default_value = "n";
1843 print "Default sub of INBOX (y/n) [$WHT$default_value$NRM]: $WHT";
1844 $new_show = <STDIN
>;
1845 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1846 $default_sub_of_inbox = 'true';
1848 $default_sub_of_inbox = 'false';
1850 return $default_sub_of_inbox;
1853 # Show contain subfolder option
1855 print "Some IMAP servers (UW) make it so that there are two types of\n";
1856 print "folders. Those that contain messages, and those that contain\n";
1857 print "subfolders. If this is the case for your server, set this to\n";
1858 print "true, and it will ask the user whether the folder they are\n";
1859 print "creating contains subfolders or messages.\n";
1862 if ( lc($show_contain_subfolders_option) eq 'true' ) {
1863 $default_value = "y";
1865 $default_value = "n";
1867 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1868 $new_show = <STDIN
>;
1869 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1870 $show_contain_subfolders_option = 'true';
1872 $show_contain_subfolders_option = 'false';
1874 return $show_contain_subfolders_option;
1877 # Default Unseen Notify
1879 print "This option specifies where the users will receive notification\n";
1880 print "about unseen messages by default. This is of course an option that\n";
1881 print "can be changed on a user level.\n";
1882 print " 1 = No notification\n";
1883 print " 2 = Only on the INBOX\n";
1884 print " 3 = On all folders\n";
1887 print "Which one should be default (1,2,3)? [$WHT$default_unseen_notify$NRM]: $WHT";
1888 $new_show = <STDIN
>;
1889 if ( $new_show =~ /^[123]\n/i ) {
1890 $default_unseen_notify = $new_show;
1892 $default_unseen_notify =~ s/[\r\n]//g;
1893 return $default_unseen_notify;
1896 # Default Unseen Type
1898 print "Here you can define the default way that unseen messages will be displayed\n";
1899 print "to the user in the folder listing on the left side.\n";
1900 print " 1 = Only unseen messages (4)\n";
1901 print " 2 = Unseen and Total messages (4/27)\n";
1904 print "Which one should be default (1,2)? [$WHT$default_unseen_type$NRM]: $WHT";
1905 $new_show = <STDIN
>;
1906 if ( $new_show =~ /^[12]\n/i ) {
1907 $default_unseen_type = $new_show;
1909 $default_unseen_type =~ s/[\r\n]//g;
1910 return $default_unseen_type;
1913 # Auto create special folders
1915 print "Would you like the Sent, Trash, and Drafts folders to be created\n";
1916 print "automatically print for you when a user logs in? If the user\n";
1917 print "accidentally deletes their special folders, this option will\n";
1918 print "automatically create it again for them.\n";
1921 if ( lc($auto_create_special) eq 'true' ) {
1922 $default_value = "y";
1924 $default_value = "n";
1926 print "Auto create special folders? (y/n) [$WHT$default_value$NRM]: $WHT";
1927 $new_show = <STDIN
>;
1928 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1929 $auto_create_special = 'true';
1931 $auto_create_special = 'false';
1933 return $auto_create_special;
1936 # Automatically delete folders
1938 if ( $imap_server_type eq "uw" ) {
1939 print "UW IMAP servers will not allow folders containing mail to also contain folders.\n";
1940 print "Deleting folders will bypass the trash folder and be immediately deleted\n\n";
1941 print "If this is not the correct value for your server,\n";
1942 print "please use option D on the Main Menu to configure your server correctly.\n\n";
1943 print "Press any key to continue...\n";
1944 $new_delete = <STDIN
>;
1945 $delete_folder = 'true';
1947 if ( $imap_server_type eq "courier" ) {
1948 print "Courier (or Courier-IMAP) IMAP servers may not support ";
1949 print "subfolders of Trash. \n";
1950 print "Specifically, if Courier is set to always move messages to Trash, \n";
1951 print "Trash will be treated by Courier as a special folder that does not \n";
1952 print "allow subfolders. \n\n";
1953 print "Please verify your Courier configuration, and test folder deletion \n";
1954 print "when changing this setting.\n\n";
1957 print "Are subfolders of the Trash supported by your IMAP server?\n";
1958 print "If so, should deleted folders be sent to Trash?\n";
1959 print "If not, say no (deleted folders should not be sent to Trash)\n\n";
1960 # reversal of logic.
1961 # question was: Should folders be automatically deleted instead of sent to trash..
1962 # we've changed the question to make it more clear,
1963 # and are here handling that to avoid changing the answers..
1964 if ( lc($delete_folder) eq 'true' ) {
1965 $default_value = "n";
1967 $default_value = "y";
1969 print "Send deleted folders to Trash? (y/n) [$WHT$default_value$NRM]: $WHT";
1970 $new_delete = <STDIN
>;
1971 if ( ( $new_delete =~ /^y\n/i ) || ( ( $new_delete =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1972 $delete_folder = 'false';
1974 $delete_folder = 'true';
1977 return $delete_folder;
1982 print "Some IMAP server allow subfolders to exist even if the parent\n";
1983 print "folders do not. This fixes some problems with the folder list\n";
1984 print "when this is the case, causing the /NoSelect folders to be displayed\n";
1987 if ( lc($noselect_fix_enable) eq 'true' ) {
1988 $default_value = "y";
1990 $default_value = "n";
1992 print "enable noselect fix? (y/n) [$WHT$noselect_fix_enable$NRM]: $WHT";
1993 $noselect_fix_enable = <STDIN
>;
1994 if ( ( $noselect_fix_enable =~ /^y\n/i ) || ( ( $noselect_fix_enable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1995 $noselect_fix_enable = 'true';
1997 $noselect_fix_enable = 'false';
1999 return $noselect_fix_enable;
2001 ############# GENERAL OPTIONS #####################
2005 print "Specify the location for your data directory.\n";
2006 print "You need to create this directory yourself.\n";
2007 print "The path name can be absolute or relative (to the config directory).\n";
2008 print "Here are two examples:\n";
2009 print " Absolute: /var/local/squirrelmail/data/\n";
2010 print " Relative: ../data/\n";
2011 print "Relative paths to directories outside of the SquirrelMail distribution\n";
2012 print "will be converted to their absolute path equivalents in config.php.\n\n";
2013 print "Note: There are potential security risks with having a writeable directory\n";
2014 print "under the web server's root directory (ex: /home/httpd/html).\n";
2015 print "For this reason, it is recommended to put the data directory\n";
2016 print "in an alternate location of your choice. \n";
2019 print "[$WHT$data_dir$NRM]: $WHT";
2020 $new_data_dir = <STDIN
>;
2021 if ( $new_data_dir eq "\n" ) {
2022 $new_data_dir = $data_dir;
2024 $new_data_dir =~ s/[\r\n]//g;
2026 if ( $new_data_dir =~ /^\s*$/ ) {
2029 $new_data_dir =~ s/\/*$//g
;
2030 $new_data_dir =~ s/$/\//g
;
2032 return $new_data_dir;
2035 # Attachment directory
2037 print "Path to directory used for storing attachments while a mail is\n";
2038 print "being composed. The path name can be absolute or relative (to the\n";
2039 print "config directory). Here are two examples:\n";
2040 print " Absolute: /var/local/squirrelmail/attach/\n";
2041 print " Relative: ../attach/\n";
2042 print "Relative paths to directories outside of the SquirrelMail distribution\n";
2043 print "will be converted to their absolute path equivalents in config.php.\n\n";
2044 print "Note: There are a few security considerations regarding this\n";
2045 print "directory:\n";
2046 print " 1. It should have the permission 733 (rwx-wx-wx) to make it\n";
2047 print " impossible for a random person with access to the webserver\n";
2048 print " to list files in this directory. Confidential data might\n";
2049 print " be laying around in there.\n";
2050 print " Depending on your user:group assignments, 730 (rwx-wx---)\n";
2051 print " may be possible, and more secure (e.g. root:apache)\n";
2052 print " 2. Since the webserver is not able to list the files in the\n";
2053 print " content is also impossible for the webserver to delete files\n";
2054 print " lying around there for too long.\n";
2055 print " 3. It should probably be another directory than the data\n";
2056 print " directory specified in option 3.\n";
2059 print "[$WHT$attachment_dir$NRM]: $WHT";
2060 $new_attachment_dir = <STDIN
>;
2061 if ( $new_attachment_dir eq "\n" ) {
2062 $new_attachment_dir = $attachment_dir;
2064 $new_attachment_dir =~ s/[\r\n]//g;
2066 if ( $new_attachment_dir =~ /^\s*$/ ) {
2067 $new_attachment_dir = "";
2069 $new_attachment_dir =~ s/\/*$//g
;
2070 $new_attachment_dir =~ s/$/\//g
;
2072 return $new_attachment_dir;
2076 print "The directory hash level setting allows you to configure the level\n";
2077 print "of hashing that SquirrelMail employs in your data and attachment\n";
2078 print "directories. This value must be an integer ranging from 0 to 4.\n";
2079 print "When this value is set to 0, SquirrelMail will simply store all\n";
2080 print "files as normal in the data and attachment directories. However,\n";
2081 print "when set to a value from 1 to 4, a simple hashing scheme will be\n";
2082 print "used to organize the files in this directory. In short, the crc32\n";
2083 print "value for a username will be computed. Then, up to the first 4\n";
2084 print "digits of the hash, as set by this configuration value, will be\n";
2085 print "used to directory hash the files for that user in the data and\n";
2086 print "attachment directory. This allows for better performance on\n";
2087 print "servers with larger numbers of users.\n";
2090 print "[$WHT$dir_hash_level$NRM]: $WHT";
2091 $new_dir_hash_level = <STDIN
>;
2092 if ( $new_dir_hash_level eq "\n" ) {
2093 $new_dir_hash_level = $dir_hash_level;
2095 $new_dir_hash_level =~ s/[\r\n]//g;
2097 if ( ( int($new_dir_hash_level) < 0 )
2098 || ( int($new_dir_hash_level) > 4 )
2099 || !( int($new_dir_hash_level) eq $new_dir_hash_level ) ) {
2100 print "Invalid Directory Hash Level.\n";
2101 print "Value must be an integer ranging from 0 to 4\n";
2102 print "Hit enter to continue.\n";
2103 $enter_key = <STDIN
>;
2105 $new_dir_hash_level = $dir_hash_level;
2108 return $new_dir_hash_level;
2112 print "This is the default size (in pixels) of the left folder list.\n";
2113 print "Default is 200, but you can set it to whatever you wish. This\n";
2114 print "is a user preference, so this will only show up as their default.\n";
2116 print "[$WHT$default_left_size$NRM]: $WHT";
2117 $new_default_left_size = <STDIN
>;
2118 if ( $new_default_left_size eq "\n" ) {
2119 $new_default_left_size = $default_left_size;
2121 $new_default_left_size =~ s/[\r\n]//g;
2123 return $new_default_left_size;
2127 print "Some IMAP servers only have lowercase letters in the usernames\n";
2128 print "but they still allow people with uppercase to log in. This\n";
2129 print "causes a problem with the user's preference files. This option\n";
2130 print "transparently changes all usernames to lowercase.";
2133 if ( lc($force_username_lowercase) eq 'true' ) {
2134 $default_value = "y";
2136 $default_value = "n";
2138 print "Convert usernames to lowercase (y/n) [$WHT$default_value$NRM]: $WHT";
2139 $new_show = <STDIN
>;
2140 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2150 if ( lc($default_use_priority) eq 'true' ) {
2151 $default_value = "y";
2153 $default_value = "n";
2156 print "Allow users to specify priority of outgoing mail (y/n) [$WHT$default_value$NRM]: $WHT";
2157 $new_show = <STDIN
>;
2158 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2168 if ( lc($default_hide_attribution) eq 'true' ) {
2169 $default_value = "y";
2171 $default_value = "n";
2174 print "Hide SM attributions (y/n) [$WHT$default_value$NRM]: $WHT";
2175 $new_show = <STDIN
>;
2176 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2186 if ( lc($default_use_mdn) eq 'true' ) {
2187 $default_value = "y";
2189 $default_value = "n";
2192 print "Enable support for read/delivery receipt support (y/n) [$WHT$default_value$NRM]: $WHT";
2193 $new_show = <STDIN
>;
2194 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2202 print " In loosely managed environments, you may want to allow users
2203 to edit their full name and email address. In strictly managed
2204 environments, you may want to force users to use the name
2205 and email address assigned to them.
2207 'y' - allow a user to edit their full name and email address,
2208 'n' - users must use the assigned values.
2212 if ( lc($edit_identity) eq 'true' ) {
2213 $default_value = "y";
2215 $default_value = "n";
2217 print "Allow editing of user's identity? (y/n) [$WHT$default_value$NRM]: $WHT";
2218 $new_edit = <STDIN
>;
2219 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2220 $edit_identity = 'true';
2221 $edit_name = 'true';
2222 $hide_auth_header = command311b
();
2224 $edit_identity = 'false';
2225 $edit_name = command311
();
2226 $hide_auth_header = command311b
();
2228 return $edit_identity;
2232 print " Given that users are not allowed to modify their
2233 email address, can they edit their full name?
2237 if ( lc($edit_name) eq 'true' ) {
2238 $default_value = "y";
2240 $default_value = "n";
2242 print "Allow the user to edit their full name? (y/n) [$WHT$default_value$NRM]: $WHT";
2243 $new_edit = <STDIN
>;
2244 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2245 $edit_name = 'true';
2247 $edit_name = 'false';
2253 print " SquirrelMail adds username information to every sent email
2254 in order to prevent possible sender forging when users are allowed
2255 to change their email and/or full name.
2257 You can remove user information from this header (y), if you think that
2258 it violates privacy or security.
2260 Note: If users are allowed to change their email addresses,
2261 this setting will make it difficult to determine who sent what where.
2262 Use at your own risk.
2266 if ( lc($hide_auth_header) eq "true" ) {
2267 $default_value = "y";
2269 $default_value = "n";
2271 print "Remove username from email headers? (y/n) [$WHT$default_value$NRM]: $WHT";
2272 $new_header = <STDIN
>;
2273 if ( ( $new_header =~ /^y\n/i ) || ( ( $new_header =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2274 $hide_auth_header = "true";
2276 $hide_auth_header = "false";
2278 return $hide_auth_header;
2282 print "This option allows to disable server side thread sorting if your server \n";
2283 print "declares THREAD support, but you don't want to provide threading options \n";
2284 print "to end users or THREAD extension is broken or extension does not work with \n";
2285 print "options used by SquirrelMail. Option is not used, if THREAD extension is \n";
2286 print "not declared in IMAP CAPABILITY.\n";
2289 if ( lc($disable_thread_sort) eq 'true' ) {
2290 $default_value = "y";
2292 $default_value = "n";
2294 print "Disable server side thread sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2295 $disable_thread_sort = <STDIN
>;
2296 if ( ( $disable_thread_sort =~ /^y\n/i ) || ( ( $disable_thread_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2297 $disable_thread_sort = 'true';
2299 $disable_thread_sort = 'false';
2301 return $disable_thread_sort;
2305 print "This option allows to disable server side sorting if your server declares \n";
2306 print "SORT support, but SORT extension is broken or does not work with options \n";
2307 print "used by SquirrelMail. Option is not used, if SORT extension is not declared \n";
2308 print "in IMAP CAPABILITY.\n";
2310 print "It is strongly recommended to keep server side sorting enabled, if your ";
2311 print "IMAP server supports it.";
2314 if ( lc($disable_server_sort) eq 'true' ) {
2315 $default_value = "y";
2317 $default_value = "n";
2319 print "Disable server-side sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2320 $disable_server_sort = <STDIN
>;
2321 if ( ( $disable_server_sort =~ /^y\n/i ) || ( ( $disable_server_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2322 $disable_server_sort = 'true';
2324 $disable_server_sort = 'false';
2326 return $disable_server_sort;
2330 print "This option allows you to choose if SM uses charset search\n";
2331 print "Your IMAP server must support the SEARCH CHARSET command for this to work\n";
2334 if ( lc($allow_charset_search) eq 'true' ) {
2335 $default_value = "y";
2337 $default_value = "n";
2339 print "Allow charset searching? (y/n) [$WHT$default_value$NRM]: $WHT";
2340 $allow_charset_search = <STDIN
>;
2341 if ( ( $allow_charset_search =~ /^y\n/i ) || ( ( $allow_charset_search =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2342 $allow_charset_search = 'true';
2344 $allow_charset_search = 'false';
2346 return $allow_charset_search;
2349 # command315 (UID support) obsoleted.
2351 # advanced search option
2353 print "This option allows you to control the use of advanced search form.\n";
2354 print " 0 = enable basic search only\n";
2355 print " 1 = enable advanced search only\n";
2356 print " 2 = enable both\n";
2359 print "Allowed search (0,1,2)? [$WHT$allow_advanced_search$NRM]: $WHT";
2360 $new_allow_advanced_search = <STDIN
>;
2361 if ( $new_allow_advanced_search =~ /^[012]\n/i ) {
2362 $allow_advanced_search = $new_allow_advanced_search;
2364 $allow_advanced_search =~ s/[\r\n]//g;
2365 return $allow_advanced_search;
2370 print "This option allows you to change the name of the PHP session used\n";
2371 print "by SquirrelMail. Unless you know what you are doing, you probably\n";
2372 print "don't need or want to change this from the default of SQMSESSID.\n";
2373 print "[$WHT$session_name$NRM]: $WHT";
2374 $new_session_name = <STDIN
>;
2375 chomp($new_session_name);
2376 if ( $new_session_name eq "" ) {
2377 $new_session_name = $session_name;
2379 return $new_session_name;
2382 # time zone config (since 1.5.1)
2384 print "This option allows you to control the use of time zones.\n";
2385 print " 0 = (default) standard, GNU C time zone names\n";
2386 print " 1 = strict, generic time zone codes with offsets\n";
2387 print " 2 = custom, GNU C time zones loaded from config/timezones.php\n";
2388 print " 3 = custom strict, generic time zone codes with offsets loaded \n";
2389 print " from config/timezones.php\n";
2390 print "See SquirrelMail documentation about format of config/timezones.php file.\n";
2393 print "Used time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT";
2394 $new_time_zone_type = <STDIN
>;
2395 if ( $new_time_zone_type =~ /^[0123]\n/i ) {
2396 $time_zone_type = $new_time_zone_type;
2398 print "\nInvalid configuration value.\n";
2399 print "\nPress enter to continue...";
2402 $time_zone_type =~ s/[\r\n]//g;
2403 return $time_zone_type;
2408 print "\nDefine the themes that you wish to use. If you have added ";
2409 print "a theme of your own, just follow the instructions (?) about how to add ";
2410 print "them. You can also change the default theme.\n";
2411 print "[theme] command (?=help) > ";
2413 $input =~ s/[\r\n]//g;
2414 while ( $input ne "d" ) {
2415 if ( $input =~ /^\s*l\s*/i ) {
2417 while ( $count <= $#theme_name ) {
2418 if ( $count == $theme_default ) {
2423 if ( $count < 10 ) {
2426 $name = $theme_name[$count];
2427 $num_spaces = 35 - length($name);
2428 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2429 $name = $name . " ";
2432 print " $count. $name";
2433 print "($theme_path[$count])\n";
2437 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
2438 $old_def = $theme_default;
2439 $theme_default = $input;
2440 $theme_default =~ s/^\s*m\s*//;
2441 if ( ( $theme_default > $#theme_name ) || ( $theme_default < 0 ) ) {
2442 print "Cannot set default theme to $theme_default. That theme does not exist.\n";
2443 $theme_default = $old_def;
2445 } elsif ( $input =~ /^\s*\+/ ) {
2446 print "What is the name of this theme: ";
2448 $name =~ s/[\r\n]//g;
2449 $theme_name[ $#theme_name + 1 ] = $name;
2450 print "Be sure to put ../themes/ before the filename.\n";
2451 print "What file is this stored in (ex: ../themes/default_theme.php): ";
2453 $name =~ s/[\r\n]//g;
2454 $theme_path[ $#theme_path + 1 ] = $name;
2455 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
2456 if ( $input =~ /[0-9]+\s*$/ ) {
2458 $rem_num =~ s/^\s*-\s*//g;
2459 $rem_num =~ s/\s*$//;
2461 $rem_num = $#theme_name;
2463 if ( $rem_num == $theme_default ) {
2464 print "You cannot remove the default theme!\n";
2467 @new_theme_name = ();
2468 @new_theme_path = ();
2469 while ( $count <= $#theme_name ) {
2470 if ( $count != $rem_num ) {
2471 @new_theme_name = ( @new_theme_name, $theme_name[$count] );
2472 @new_theme_path = ( @new_theme_path, $theme_path[$count] );
2476 @theme_name = @new_theme_name;
2477 @theme_path = @new_theme_path;
2478 if ( $theme_default > $rem_num ) {
2482 } elsif ( $input =~ /^\s*t\s*/i ) {
2483 print "\nStarting detection...\n\n";
2485 opendir( DIR
, "../themes" );
2486 @files = grep { /\.php$/i } readdir(DIR
);
2488 while ( $cnt <= $#files ) {
2489 $filename = "../themes/" . $files[$cnt];
2490 if ( $filename ne "../themes/index.php" ) {
2492 for ( $x = 0 ; $x <= $#theme_path ; $x++ ) {
2493 if ( $theme_path[$x] eq $filename ) {
2497 if ( $found != 1 ) {
2498 print "** Found theme: $filename\n";
2499 print " What is its name? ";
2502 $theme_name[ $#theme_name + 1 ] = $nm;
2503 $theme_path[ $#theme_path + 1 ] = $filename;
2509 for ( $cnt = 0 ; $cnt <= $#theme_path ; $cnt++ ) {
2510 $filename = $theme_path[$cnt];
2511 if ( !( -e
$filename ) ) {
2512 print " Removing $filename (file not found)\n";
2514 @new_theme_name = ();
2515 @new_theme_path = ();
2516 for ( $x = 0 ; $x < $#theme_path ; $x++ ) {
2517 if ( $theme_path[$x] eq $filename ) {
2520 if ( $offset == 1 ) {
2521 $new_theme_name[$x] = $theme_name[ $x + 1 ];
2522 $new_theme_path[$x] = $theme_path[ $x + 1 ];
2524 $new_theme_name[$x] = $theme_name[$x];
2525 $new_theme_path[$x] = $theme_path[$x];
2528 @theme_name = @new_theme_name;
2529 @theme_path = @new_theme_path;
2532 print "\nDetection complete!\n\n";
2535 } elsif ( $input =~ /^\s*\?\s*/ ) {
2536 print ".-------------------------.\n";
2537 print "| t (detect themes) |\n";
2538 print "| + (add theme) |\n";
2539 print "| - N (remove theme) |\n";
2540 print "| m N (mark default) |\n";
2541 print "| l (list themes) |\n";
2542 print "| d (done) |\n";
2543 print "`-------------------------'\n";
2545 print "[theme] command (?=help) > ";
2547 $input =~ s/[\r\n]//g;
2551 sub command_templates
{
2552 print "\nDefine the template sets that you wish to use. If you have added ";
2553 print "a template set of your own, just follow the instructions (?) about how to add ";
2554 print "them. You can also change the default template.\n";
2556 print "\n Available Templates:\n";
2559 while ( $count <= $#templateset_name ) {
2560 if ( $count == $templateset_default ) {
2565 if ( $count < 10 ) {
2568 $name = $templateset_name[$count];
2569 $num_spaces = 35 - length($name);
2570 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2571 $name = $name . " ";
2574 print " $count. $name";
2575 print "($templateset_path[$count])\n";
2580 # opendir( DIR, "../templates" );
2581 # @files = readdir(DIR);
2584 # while ( $cnt <= $#files ) {
2585 # if ( -d "../templates/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
2586 # $filename = "../templates/" . $files[$cnt];
2588 # for ( $x = 0 ; $x <= $#templateset_path ; $x++ ) {
2589 # if ( $theme_path[$x] eq $filename ) {
2596 # for ( $i = 0 ; $i <= $#files ; $i++ ) {
2597 # if ( -d "../templates/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
2599 # for ( $k = 0 ; $k <= $#aTemplateSets ; $k++ ) {
2600 # if ( $aTemplateSets[$chosen] eq $files[$i] ) {
2604 # if ( $match == 0 ) {
2605 # $unused_plugins[$pos] = $files[$i];
2611 # for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
2613 # print " $num. $unused_plugins[$i]\n";
2618 print ".--------------------------------.\n";
2619 print "| t (detect templates set) |\n";
2620 print "| + (add template set) |\n";
2621 print "| - N (remove template set) |\n";
2622 print "| m N (mark template set) |\n";
2623 print "| l (list template set) |\n";
2624 print "| d (done) |\n";
2625 print "`--------------------------------'\n";
2626 print "\n[template set] command (?=help) > ";
2629 $input =~ s/[\r\n]//g;
2630 while ( $input ne "d" ) {
2631 if ( $input =~ /^\s*l\s*/i ) {
2633 while ( $count <= $#templateset_name ) {
2634 if ( $count == $templateset_default ) {
2639 if ( $count < 10 ) {
2642 $name = $templateset_name[$count];
2643 $num_spaces = 35 - length($name);
2644 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2645 $name = $name . " ";
2648 print " $count. $name";
2649 print "($templateset_path[$count])\n";
2653 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
2654 $old_def = $templateset_default;
2655 $templateset_default = $input;
2656 $templateset_default =~ s/^\s*m\s*//;
2657 if ( ( $templateset_default > $#templateset_name ) || ( $templateset_default < 0 ) ) {
2658 print "Cannot set default template set to $templateset_default. That template set does not exist.\n";
2659 $templateset_default = $old_def;
2661 } elsif ( $input =~ /^\s*\+/ ) {
2662 print "What is the name of this template: ";
2664 $name =~ s/[\r\n]//g;
2665 $templateset_name[ $#templateset_name + 1 ] = $name;
2666 print "Be sure to put ../templates/ before the dirname.\n";
2667 print "What file is this stored in (ex: ../templates/default/): ";
2669 $name =~ s/[\r\n]//g;
2670 $templateset_path[ $#templateset_path + 1 ] = $name;
2671 } elsif ( $input =~ /^\s*t\s*/i ) {
2672 print "\nStarting detection...\n\n";
2673 opendir( DIR
, "../templates" );
2674 @files = readdir(DIR
);
2677 while ( $cnt <= $#files ) {
2678 if ( -d
"../templates/" . $files[$cnt] && $files[$cnt] !~ /^\./ && $files[$cnt] ne "CVS" ) {
2679 $filename = "../templates/" . $files[$cnt]. "/";
2681 for ( $x = 0 ; $x <= $#templateset_path ; $x++ ) {
2682 if ( $templateset_path[$x] eq $filename ) {
2686 if ( $found != 1 && $detected == 0) {
2687 $templateset_path[ $#templateset_path + 1 ] = $filename;
2688 $templateset_name[ $#templateset_name + 1 ] = "Default template";
2689 $aTemplateSet[ $#templateset_name + 1 ] = "Default template";
2690 $aTemplateSet[ $#templateset_path + 1 ] = $filename;
2691 } elsif ( $found != 1) {
2692 print "** Found template set: $filename\n";
2693 print " What is it's name? ";
2696 $templateset_path[ $#templateset_path + 1 ] = $filename;
2697 $templateset_name[ $#templateset_name + 1 ] = $nm;
2699 $aTemplateSet[ $#templateset_name + 1 ] = $nm;
2700 $aTemplateSet[ $#templateset_path + 1 ] = $filename;
2707 for ( $cnt = 0 ; $cnt <= $#templateset_path ; $cnt++ ) {
2708 $filename = $templateset_path[$cnt];
2709 if ( !(-d
$filename) ) {
2710 print " Removing $filename (file not found)\n";
2712 @new_templateset_name = ();
2713 @new_templateset_path = ();
2714 for ( $x = 0 ; $x < $#templateset_path ; $x++ ) {
2715 if ( $templateset_path[$x] eq $filename ) {
2718 if ( $offset == 1 ) {
2719 $new_templateset_name[$x] = $templateset_name[ $x + 1 ];
2720 $new_theme_path[$x] = $templateset_path[ $x + 1 ];
2722 $new_templateset_name[$x] = $templateset_name[$x];
2723 $new_templateset_path[$x] = $templateset_path[$x];
2726 @templateset_name = @new_templateset_name;
2727 @templateset_path = @new_templateset_path;
2730 print "\nDetection complete!\n\n";
2733 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
2734 if ( $input =~ /[0-9]+\s*$/ ) {
2736 $rem_num =~ s/^\s*-\s*//g;
2737 $rem_num =~ s/\s*$//;
2739 $rem_num = $#templateset_name;
2741 if ( $rem_num == $templateset_default ) {
2742 print "You cannot remove the default template set!\n";
2745 @new_templateset_name = ();
2746 @new_templateset_path = ();
2747 while ( $count <= $#templateset_name ) {
2748 if ( $count != $rem_num ) {
2749 @new_templateset_name = ( @new_templateset_name, $templateset_name[$count] );
2750 @new_templateset_path = ( @new_templateset_path, $templateset_path[$count] );
2754 @templateset_name = @new_templateset_name;
2755 @templateset_path = @new_templateset_path;
2756 if ( $templateset_default > $rem_num ) {
2757 $templateset_default--;
2760 } elsif ( $input =~ /^\s*\?\s*/ ) {
2761 print ".--------------------------------.\n";
2762 print "| t (detect templates set) |\n";
2763 print "| + (add template set) |\n";
2764 print "| - N (remove template set) |\n";
2765 print "| m N (mark template set) |\n";
2766 print "| l (list template set) |\n";
2767 print "| d (done) |\n";
2768 print "`--------------------------------'\n";
2770 print "[template set] command (?=help) > ";
2772 $input =~ s/[\r\n]//g;
2774 return $templateset_default;
2780 print "You may specify a cascading style-sheet (CSS) file to be included\n";
2781 print "on each html page generated by SquirrelMail. The CSS file is useful\n";
2782 print "for specifying a site-wide font. If you're not familiar with CSS\n";
2783 print "files, leave this blank.\n";
2785 print "To clear out an existing value, just type a space for the input.\n";
2787 print "Please be aware of the following: \n";
2788 print " - Relative URLs are relative to the config dir\n";
2789 print " to use the themes directory, use ../themes/css/newdefault.css\n";
2790 print " - To specify a css file defined outside the SquirrelMail source tree\n";
2791 print " use the absolute URL the webserver would use to include the file\n";
2792 print " e.g. http://some.host.com/css/mystyle.css or /css/mystyle.css\n";
2794 print "[$WHT$theme_css$NRM]: $WHT";
2795 $new_theme_css = <STDIN
>;
2797 if ( $new_theme_css eq "\n" ) {
2798 $new_theme_css = $theme_css;
2800 $new_theme_css =~ s/[\r\n]//g;
2802 $new_theme_css =~ s/^\s*//;
2803 return $new_theme_css;
2806 # sets default font size option
2807 sub command_default_fontsize
{
2808 print "Enter default font size [$WHT$$default_fontsize$NRM]: $WHT";
2809 $new_size = <STDIN
>;
2810 if ( $new_size eq "\n" ) {
2813 $new_size =~ s/[\r\n]//g;
2818 # controls available fontsets
2819 sub command_fontsets
{
2821 print "You can control fontsets available to end users here.\n";
2822 # set initial $input value
2824 while ( $input ne "x" ) {
2825 if ( $input =~ /^\s*a\s*/i ) {
2827 print "\nFontset name: ";
2829 if (! $fontsets{trim
($name)}) {
2830 print "Fontset string: ";
2832 $fontsets{trim
($name)} = trim
($value);
2834 print "\nERROR: Such fontset already exists.\n";
2836 } elsif ( $input =~ /^\s*e\s*/i ) {
2837 # edit existing fontset
2838 print "\nFontset name: ";
2840 if (! $fontsets{trim
($name)}) {
2841 print "\nERROR: No such fontset.\n";
2843 print "Fontset string [$fontsets{trim($name)}]: ";
2845 $fontsets{trim
($name)} = trim
($value);
2847 } elsif ( $input =~ /^\s*d\s*/ ) {
2848 # delete existing fontset
2849 print "\nFontset name: ";
2851 if (! $fontsets{trim
($name)}) {
2852 print "\nERROR: No such fontset.\n";
2854 delete $fontsets{trim
($name)};
2856 } elsif ( $input =~ /^\s*l\s*/ ) {
2858 print "\nConfigured fontsets:\n";
2859 while (($fontset_name, $fontset_string) = each(%fontsets)) {
2860 print " $fontset_name = $fontset_string\n";
2862 print "Default fontset: $default_fontset\n";
2863 } elsif ( $input =~ /^\s*m\s*/ ) {
2864 # set default fontset
2865 print "\nSet default fontset [$default_fontset]: ";
2867 if (trim
($name) ne '' and ! $fontsets{trim
($name)}) {
2868 print "\nERROR: No such fontset.\n";
2870 $default_fontset = trim
($name);
2873 # print available commands on any other input
2874 print "\nAvailable commands:\n";
2875 print " a - Adds new fontset.\n";
2876 print " d - Deletes existing fontset.\n";
2877 print " e - Edits existing fontset.\n";
2878 print " h or ? - Shows this help screen.\n";
2879 print " l - Lists available fontsets.\n";
2880 print " m - Sets default fontset.\n";
2881 print " x - Exits fontset editor mode.\n";
2883 print "\nCommand [fontsets] (a,d,e,h,?=help,l,m,x)> ";
2885 $input =~ s/[\r\n]//g;
2890 print "You can now define different LDAP servers.\n";
2891 print "[ldap] command (?=help) > ";
2893 $input =~ s/[\r\n]//g;
2894 while ( $input ne "d" ) {
2895 if ( $input =~ /^\s*l\s*/i ) {
2897 while ( $count <= $#ldap_host ) {
2898 print "$count. $ldap_host[$count]\n";
2899 print " base: $ldap_base[$count]\n";
2900 if ( $ldap_charset[$count] ) {
2901 print " charset: $ldap_charset[$count]\n";
2903 if ( $ldap_port[$count] ) {
2904 print " port: $ldap_port[$count]\n";
2906 if ( $ldap_name[$count] ) {
2907 print " name: $ldap_name[$count]\n";
2909 if ( $ldap_maxrows[$count] ) {
2910 print " maxrows: $ldap_maxrows[$count]\n";
2912 if ( $ldap_filter[$count] ) {
2913 print " filter: $ldap_filter[$count]\n";
2915 if ( $ldap_binddn[$count] ) {
2916 print " binddn: $ldap_binddn[$count]\n";
2917 if ( $ldap_bindpw[$count] ) {
2918 print " bindpw: $ldap_bindpw[$count]\n";
2921 if ( $ldap_protocol[$count] ) {
2922 print " protocol: $ldap_protocol[$count]\n";
2924 if ( $ldap_limit_scope[$count] ) {
2925 print " limit_scope: $ldap_limit_scope[$count]\n";
2927 if ( $ldap_listing[$count] ) {
2928 print " listing: $ldap_listing[$count]\n";
2930 if ( $ldap_search_tree[$count] ) {
2931 print " search_tree: $ldap_search_tree[$count]\n";
2933 if ( $ldap_starttls[$count] ) {
2934 print " starttls: $ldap_starttls[$count]\n";
2940 } elsif ( $input =~ /^\s*\+/ ) {
2941 $sub = $#ldap_host + 1;
2943 print "First, we need to have the hostname or the IP address where\n";
2944 print "this LDAP server resides. Example: ldap.bigfoot.com\n";
2947 $name =~ s/[\r\n]//g;
2948 $ldap_host[$sub] = $name;
2952 print "Next, we need the server root (base dn). For this, an empty\n";
2953 print "string is allowed.\n";
2954 print "Example: ou=member_directory,o=netcenter.com\n";
2957 $name =~ s/[\r\n]//g;
2958 $ldap_base[$sub] = $name;
2962 print "This is the TCP/IP port number for the LDAP server. Default\n";
2963 print "port is 389. This is optional. Press ENTER for default.\n";
2966 $name =~ s/[\r\n]//g;
2967 $ldap_port[$sub] = $name;
2971 print "This is the charset for the server. Default is utf-8. This\n";
2972 print "is also optional. Press ENTER for default.\n";
2975 $name =~ s/[\r\n]//g;
2976 $ldap_charset[$sub] = $name;
2980 print "This is the name for the server, used to tag the results of\n";
2981 print "the search. Default it \"LDAP: hostname\". Press ENTER for default\n";
2984 $name =~ s/[\r\n]//g;
2985 $ldap_name[$sub] = $name;
2989 print "You can specify the maximum number of rows in the search result.\n";
2990 print "Default value is equal to 250 rows. Press ENTER for default.\n";
2993 $name =~ s/[\r\n]//g;
2994 $ldap_maxrows[$sub] = $name;
2999 print "If your LDAP server does not like anonymous logins, you can specify bind DN.\n";
3000 print "Default is none, anonymous bind. Press ENTER for default.\n";
3003 $name =~ s/[\r\n]//g;
3004 $ldap_binddn[$sub] = $name;
3008 if ( $ldap_binddn[$sub] ne '' ) {
3010 print "Now, please specify password for that DN.\n";
3013 $name =~ s/[\r\n]//g;
3014 $ldap_bindpw[$sub] = $name;
3019 print "You can specify bind protocol version here.\n";
3020 print "Default protocol version depends on your php ldap settings.\n";
3021 print "Press ENTER for default.\n";
3024 $name =~ s/[\r\n]//g;
3025 $ldap_protocol[$sub] = $name;
3029 print "This configuration section allows to set some rarely used\n";
3030 print "options and options specific to some LDAP implementations.\n";
3032 print "Do you want to set advanced LDAP directory settings? (y/N):";
3033 $ldap_advanced_settings = <STDIN
>;
3034 if ( $ldap_advanced_settings =~ /^y\n/i ) {
3035 $ldap_advanced_settings = 'true';
3037 $ldap_advanced_settings = 'false';
3040 if ($ldap_advanced_settings eq 'true') {
3043 print "You can control LDAP directory listing here. This option can\n";
3044 print "be useful if you run small LDAP server and want to provide listing\n";
3045 print "of all addresses stored in LDAP to users of webmail interface.\n";
3046 print "Number of displayed entries is limited by maxrows setting.\n";
3048 print "Don't enable this option for public LDAP directories.\n";
3049 print "This feature is experimental.\n";
3051 print "Allow listing of LDAP directory? (y/N):";
3053 if ( $name =~ /^y\n/i ) {
3058 $ldap_listing[$sub] = $name;
3062 print "You can specify an additional search filter.\n";
3063 print "This could be something like \"(objectclass=posixAccount)\".\n";
3064 print "No filtering is performed by default. Press ENTER for default.\n";
3067 $name =~ s/[\r|\n]//g;
3068 $ldap_filter[$sub] = $name;
3072 print "You can control search scope here.\n";
3073 print "This option is specific to Microsoft ADS implementation.\n";
3074 print "It requires use of v3 or newer LDAP protocol.\n";
3075 print "Don't enable it, if you use other LDAP server.\n";
3077 print "Limit ldap scope? (y/N):";
3079 if ( $name =~ /^y\n/i ) {
3084 $ldap_limit_scope[$sub] = $name;
3088 print "You can control ldap search type here.\n";
3089 print "Addresses can be searched in entire LDAP subtree (default)\n";
3090 print "or only first level entries are returned.\n";
3092 print "Search entire LDAP subtree? (Y/n):";
3094 if ( $name =~ /^n\n/i ) {
3099 $ldap_search_tree[$sub] = $name;
3103 print "You can control use of StartTLS on LDAP connection here.\n";
3104 print "This option requires use of v3 or newer LDAP protocol and php 4.2+.\n";
3106 print "Use StartTLS? (y/N):";
3108 if ( $name =~ /^y\n/i ) {
3113 $ldap_starttls[$sub] = $name;
3117 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
3118 if ( $input =~ /[0-9]+\s*$/ ) {
3120 $rem_num =~ s/^\s*-\s*//g;
3121 $rem_num =~ s/\s*$//;
3123 $rem_num = $#ldap_host;
3126 @new_ldap_host = ();
3127 @new_ldap_base = ();
3128 @new_ldap_port = ();
3129 @new_ldap_name = ();
3130 @new_ldap_charset = ();
3131 @new_ldap_maxrows = ();
3132 @new_ldap_filter = ();
3133 @new_ldap_bindpw = ();
3134 @new_ldap_binddn = ();
3135 @new_ldap_protocol = ();
3136 @new_ldap_limit_scope = ();
3137 @new_ldap_listing = ();
3138 @new_ldap_search_tree = ();
3139 @new_ldap_starttls = ();
3141 while ( $count <= $#ldap_host ) {
3142 if ( $count != $rem_num ) {
3143 @new_ldap_host = ( @new_ldap_host, $ldap_host[$count] );
3144 @new_ldap_base = ( @new_ldap_base, $ldap_base[$count] );
3145 @new_ldap_port = ( @new_ldap_port, $ldap_port[$count] );
3146 @new_ldap_name = ( @new_ldap_name, $ldap_name[$count] );
3147 @new_ldap_charset = ( @new_ldap_charset, $ldap_charset[$count] );
3148 @new_ldap_maxrows = ( @new_ldap_maxrows, $ldap_maxrows[$count] );
3149 @new_ldap_filter = ( @new_ldap_filter, $ldap_filter[$count] );
3150 @new_ldap_binddn = ( @new_ldap_binddn, $ldap_binddn[$count] );
3151 @new_ldap_bindpw = ( @new_ldap_bindpw, $ldap_bindpw[$count] );
3152 @new_ldap_protocol = ( @new_ldap_protocol, $ldap_protocol[$count] );
3153 @new_ldap_limit_scope = ( @new_ldap_limit_scope, $ldap_limit_scope[$count] );
3154 @new_ldap_listing = ( @new_ldap_listing, $ldap_listing[$count] );
3155 @new_ldap_search_tree = ( @new_ldap_search_tree, $ldap_search_tree[$count] );
3156 @new_ldap_starttls = ( @new_ldap_starttls, $ldap_starttls[$count] );
3160 @ldap_host = @new_ldap_host;
3161 @ldap_base = @new_ldap_base;
3162 @ldap_port = @new_ldap_port;
3163 @ldap_name = @new_ldap_name;
3164 @ldap_charset = @new_ldap_charset;
3165 @ldap_maxrows = @new_ldap_maxrows;
3166 @ldap_filter = @new_ldap_filter;
3167 @ldap_binddn = @new_ldap_binddn;
3168 @ldap_bindpw = @new_ldap_bindpw;
3169 @ldap_protocol = @new_ldap_protocol;
3170 @ldap_limit_scope = @new_ldap_limit_scope;
3171 @ldap_listing = @new_ldap_listing;
3172 @ldap_search_tree = @new_ldap_search_tree;
3173 @ldap_starttls = @new_ldap_starttls;
3175 } elsif ( $input =~ /^\s*\?\s*/ ) {
3176 print ".-------------------------.\n";
3177 print "| + (add host) |\n";
3178 print "| - N (remove host) |\n";
3179 print "| l (list hosts) |\n";
3180 print "| d (done) |\n";
3181 print "`-------------------------'\n";
3183 print "[ldap] command (?=help) > ";
3185 $input =~ s/[\r\n]//g;
3190 print "Some of our developers have come up with very good javascript interface\n";
3191 print "for searching through address books, however, our original goals said\n";
3192 print "that we would be 100% HTML. In order to make it possible to use their\n";
3193 print "interface, and yet stick with our goals, we have also written a plain\n";
3194 print "HTML version of the search. Here, you can choose which version to use.\n";
3196 print "This is just the default value. It is also a user option that each\n";
3197 print "user can configure individually\n";
3200 if ( lc($default_use_javascript_addr_book) eq 'true' ) {
3201 $default_value = "y";
3203 $default_use_javascript_addr_book = 'false';
3204 $default_value = "n";
3206 print "Use javascript version by default (y/n) [$WHT$default_value$NRM]: $WHT";
3207 $new_show = <STDIN
>;
3208 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3209 $default_use_javascript_addr_book = 'true';
3211 $default_use_javascript_addr_book = 'false';
3213 return $default_use_javascript_addr_book;
3216 # global filebased address book
3218 print "If you want to use global file address book, then you\n";
3219 print "must set this option to a valid value. If option does\n";
3220 print "not have path elements, system assumes that file is\n";
3221 print "stored in data directory. If relative path is set, it is\n";
3222 print "relative to main SquirrelMail directory. If value is empty,\n";
3223 print "address book is not enabled.\n";
3226 print "[$WHT$abook_global_file$NRM]: $WHT";
3227 $new_abook_global_file = <STDIN
>;
3228 if ( $new_abook_global_file eq "\n" ) {
3229 $new_abook_global_file = $abook_global_file;
3231 $new_abook_global_file =~ s/[\r\n]//g;
3233 return $new_abook_global_file;
3236 # writing into global filebased abook control
3238 print "This setting controls writing into global file address\n";
3239 print "book options. Address book file must be writeable by\n";
3240 print "webserver's user, if you want to enable this option.\n";
3243 if ( lc($abook_global_file_writeable) eq 'true' ) {
3244 $default_value = "y";
3246 $abook_global_file_writeable = 'false';
3247 $default_value = "n";
3249 print "Allow writing into global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
3250 $new_show = <STDIN
>;
3251 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3252 $abook_global_file_writeable = 'true';
3254 $abook_global_file_writeable = 'false';
3256 return $abook_global_file_writeable;
3259 # listing of global filebased abook control
3261 print "This setting controls listing of global file address\n";
3262 print "book in addresses page.\n";
3265 if ( lc($abook_global_file_listing) eq 'true' ) {
3266 $default_value = "y";
3268 $abook_global_file_listing = 'false';
3269 $default_value = "n";
3271 print "Allow listing of global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
3272 $new_show = <STDIN
>;
3273 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3274 $abook_global_file_listing = 'true';
3276 $abook_global_file_listing = 'false';
3278 return $abook_global_file_listing;
3282 print "If you want to store your users address book details in a database then\n";
3283 print "you need to set this DSN to a valid value. The format for this is:\n";
3284 print "mysql://user:pass\@hostname/dbname\n";
3285 print "Where mysql can be one of the databases PHP supports, the most common\n";
3286 print "of these are mysql, msql and pgsql\n";
3287 print "If the DSN is left empty (hit space and then return) the database\n";
3288 print "related code for address books will not be used\n";
3291 if ( $addrbook_dsn eq "" ) {
3292 $default_value = "Disabled";
3294 $default_value = $addrbook_dsn;
3296 print "[$WHT$addrbook_dsn$NRM]: $WHT";
3298 if ( $new_dsn eq "\n" ) {
3301 $new_dsn =~ s/[\r\n]//g;
3302 $new_dsn =~ s/^\s+$//g;
3308 print "This is the name of the table you want to store the address book\n";
3309 print "data in, it defaults to 'address'\n";
3311 print "[$WHT$addrbook_table$NRM]: $WHT";
3312 $new_table = <STDIN
>;
3313 if ( $new_table eq "\n" ) {
3314 $new_table = $addrbook_table;
3316 $new_table =~ s/[\r\n]//g;
3322 print "If you want to store your users preferences in a database then\n";
3323 print "you need to set this DSN to a valid value. The format for this is:\n";
3324 print "mysql://user:pass\@hostname/dbname\n";
3325 print "Where mysql can be one of the databases PHP supports, the most common\n";
3326 print "of these are mysql, msql and pgsql\n";
3327 print "If the DSN is left empty (hit space and then return) the database\n";
3328 print "related code for address books will not be used\n";
3331 if ( $prefs_dsn eq "" ) {
3332 $default_value = "Disabled";
3334 $default_value = $prefs_dsn;
3336 print "[$WHT$prefs_dsn$NRM]: $WHT";
3338 if ( $new_dsn eq "\n" ) {
3341 $new_dsn =~ s/[\r\n]//g;
3342 $new_dsn =~ s/^\s+$//g;
3348 print "This is the name of the table you want to store the preferences\n";
3349 print "data in, it defaults to 'userprefs'\n";
3351 print "[$WHT$prefs_table$NRM]: $WHT";
3352 $new_table = <STDIN
>;
3353 if ( $new_table eq "\n" ) {
3354 $new_table = $prefs_table;
3356 $new_table =~ s/[\r\n]//g;
3362 print "This is the name of the field in which you want to store the\n";
3363 print "username of the person the prefs are for. It default to 'user'\n";
3364 print "which clashes with a reserved keyword in PostgreSQL so this\n";
3365 print "will need to be changed for that database at least\n";
3367 print "[$WHT$prefs_user_field$NRM]: $WHT";
3368 $new_field = <STDIN
>;
3369 if ( $new_field eq "\n" ) {
3370 $new_field = $prefs_user_field;
3372 $new_field =~ s/[\r\n]//g;
3374 $prefs_user_size = db_pref_size
($prefs_user_size);
3379 print "This is the name of the field in which you want to store the\n";
3380 print "preferences keyword. It defaults to 'prefkey'\n";
3382 print "[$WHT$prefs_key_field$NRM]: $WHT";
3383 $new_field = <STDIN
>;
3384 if ( $new_field eq "\n" ) {
3385 $new_field = $prefs_key_field;
3387 $new_field =~ s/[\r\n]//g;
3389 $prefs_key_size = db_pref_size
($prefs_key_size);
3394 print "This is the name of the field in which you want to store the\n";
3395 print "preferences value. It defaults to 'prefval'\n";
3397 print "[$WHT$prefs_val_field$NRM]: $WHT";
3398 $new_field = <STDIN
>;
3399 if ( $new_field eq "\n" ) {
3400 $new_field = $prefs_val_field;
3402 $new_field =~ s/[\r\n]//g;
3404 $prefs_val_size = db_pref_size
($prefs_val_size);
3408 # routine is used to set database field limits
3409 # it needs one argument
3410 sub db_pref_size
() {
3412 print "\nDatabase fields have size limits.\n";
3414 print "What limit is set for this field? [$WHT$size$NRM]: $WHT";
3415 $new_size = <STDIN
>;
3416 if ( $new_size eq "\n" ) {
3419 $new_size =~ s/[\r\n]//g;
3425 print "If you want to store your global address book in a database then\n";
3426 print "you need to set this DSN to a valid value. The format for this is:\n";
3427 print "mysql://user:pass\@hostname/dbname\n";
3428 print "Where mysql can be one of the databases PHP supports, the most common\n";
3429 print "of these are mysql, msql and pgsql\n";
3430 print "If the DSN is left empty (hit space and then return) the database\n";
3431 print "related code for global SQL address book will not be used\n";
3434 if ( $addrbook_global_dsn eq "" ) {
3435 $default_value = "Disabled";
3437 $default_value = $addrbook_global_dsn;
3439 print "[$WHT$addrbook_global_dsn$NRM]: $WHT";
3441 if ( $new_dsn eq "\n" ) {
3444 $new_dsn =~ s/[\r\n]//g;
3445 $new_dsn =~ s/^\s+$//g;
3451 print "This is the name of the table you want to store the global address book\n";
3452 print "data in. Default table name is 'global_abook'. Address book uses same\n";
3453 print "database format as personal address book.\n";
3455 print "[$WHT$addrbook_global_table$NRM]: $WHT";
3456 $new_table = <STDIN
>;
3457 if ( $new_table eq "\n" ) {
3458 $new_table = $addrbook_global_table;
3460 $new_table =~ s/[\r\n]//g;
3466 print "This option controls users\' ability to add or modify records stored \n";
3467 print "in global address book\n";
3469 if ( lc($addrbook_global_writeable) eq 'true' ) {
3470 $default_value = "y";
3472 $default_value = "n";
3474 print "Allow writing into global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
3475 $addrbook_global_writeable = <STDIN
>;
3476 if ( ( $addrbook_global_writeable =~ /^y\n/i ) || ( ( $addrbook_global_writeable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3477 $addrbook_global_writeable = 'true';
3479 $addrbook_global_writeable = 'false';
3481 return $addrbook_global_writeable;
3485 print "Enable this option if you want to see listing of addresses stored \n";
3486 print "in global address book\n";
3488 if ( lc($addrbook_global_listing) eq 'true' ) {
3489 $default_value = "y";
3491 $default_value = "n";
3493 print "Allow listing of global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
3494 $addrbook_global_listing = <STDIN
>;
3495 if ( ( $addrbook_global_listing =~ /^y\n/i ) || ( ( $addrbook_global_listing =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3496 $addrbook_global_listing = 'true';
3498 $addrbook_global_listing = 'false';
3500 return $addrbook_global_listing;
3506 print "SquirrelMail attempts to set the language in many ways. If it\n";
3507 print "can not figure it out in another way, it will default to this\n";
3508 print "language. Please use the code for the desired language.\n";
3510 print "[$WHT$squirrelmail_default_language$NRM]: $WHT";
3511 $new_squirrelmail_default_language = <STDIN
>;
3512 if ( $new_squirrelmail_default_language eq "\n" ) {
3513 $new_squirrelmail_default_language = $squirrelmail_default_language;
3515 $new_squirrelmail_default_language =~ s/[\r\n]//g;
3516 $new_squirrelmail_default_language =~ s/^\s+$//g;
3518 return $new_squirrelmail_default_language;
3522 print "This option controls what character set is used when sending\n";
3523 print "mail and when sending HTML to the browser. Option works only\n";
3524 print "with US English (en_US) translation. Other translations use\n";
3525 print "charsets that are set in functions/i18n.php.\n";
3528 print "[$WHT$default_charset$NRM]: $WHT";
3529 $new_default_charset = <STDIN
>;
3530 if ( $new_default_charset eq "\n" ) {
3531 $new_default_charset = $default_charset;
3533 $new_default_charset =~ s/[\r\n]//g;
3535 return $new_default_charset;
3537 # Alternative language names
3539 print "Enable this option if you want to see localized language names in\n";
3540 print "language selection box. Note, that this option can trigger\n";
3541 print "installation of foreign language support modules in some browsers.\n";
3544 if ( lc($show_alternative_names) eq 'true' ) {
3545 $default_value = "y";
3547 $default_value = "n";
3549 print "Show alternative language names? (y/n) [$WHT$default_value$NRM]: $WHT";
3550 $show_alternative_names = <STDIN
>;
3551 if ( ( $show_alternative_names =~ /^y\n/i ) || ( ( $show_alternative_names =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3552 $show_alternative_names = 'true';
3554 $show_alternative_names = 'false';
3556 return $show_alternative_names;
3559 # Aggressive decoding
3561 print "Enable this option if you want to use CPU and memory intensive decoding\n";
3562 print "functions. This option allows reading multibyte charset, that are used\n";
3563 print "in Eastern Asia. SquirrelMail will try to use recode functions here,\n";
3564 print "even when you have disabled use of recode in Tweaks section.\n";
3567 if ( lc($aggressive_decoding) eq 'true' ) {
3568 $default_value = "y";
3570 $default_value = "n";
3572 print "Enable aggressive decoding? (y/n) [$WHT$default_value$NRM]: $WHT";
3573 $aggressive_decoding = <STDIN
>;
3574 if ( ( $aggressive_decoding =~ /^y\n/i ) || ( ( $aggressive_decoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3575 $aggressive_decoding = 'true';
3577 $aggressive_decoding = 'false';
3579 return $aggressive_decoding;
3584 print "Enable this option if you want to allow lossy charset encoding in message\n";
3585 print "composition pages. This option allows charset conversions when output\n";
3586 print "charset does not support all symbols used in original charset. Symbols\n";
3587 print "unsupported by output charset will be replaced with question marks.\n";
3590 if ( lc($lossy_encoding) eq 'true' ) {
3591 $default_value = "y";
3593 $default_value = "n";
3595 print "Enable lossy encoding? (y/n) [$WHT$default_value$NRM]: $WHT";
3596 $lossy_encoding = <STDIN
>;
3597 if ( ( $lossy_encoding =~ /^y\n/i ) || ( ( $lossy_encoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3598 $lossy_encoding = 'true';
3600 $lossy_encoding = 'false';
3602 return $lossy_encoding;
3608 print "Enable this option if you want to use DHTML based folder listing.\n";
3609 print "Code is experimental, works only with some browsers and there might\n";
3610 print "be some glitches.\n";
3613 if ( lc($advanced_tree) eq 'true' ) {
3614 $default_value = "y";
3616 $default_value = "n";
3618 print "Use advanced tree in folder listing? (y/n) [$WHT$default_value$NRM]: $WHT";
3619 $advanced_tree = <STDIN
>;
3620 if ( ( $advanced_tree =~ /^y\n/i ) || ( ( $advanced_tree =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3621 $advanced_tree = 'true';
3623 $advanced_tree = 'false';
3625 return $advanced_tree;
3627 # display html emails in iframe
3629 print "This option can enable html email rendering inside iframe.\n";
3630 print "Inline frames are used in order to provide sandbox environment";
3631 print "for html code included in html formated emails.";
3632 print "Option is experimental and might have glitches in some parts of code.";
3635 if ( lc($use_iframe) eq 'true' ) {
3636 $default_value = "y";
3638 $default_value = "n";
3640 print "Display html emails in iframe? (y/n) [$WHT$default_value$NRM]: $WHT";
3641 $use_iframe = <STDIN
>;
3642 if ( ( $use_iframe =~ /^y\n/i ) || ( ( $use_iframe =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3643 $use_iframe = 'true';
3645 $use_iframe = 'false';
3651 print "Enabling this option will cause icons to be used instead of text\n";
3652 print "markers next to each message in mailbox lists that represent\n";
3653 print "new, read, flagged, and deleted messages, as well as those that\n";
3654 print "have been replied to and forwarded. Icons are also used next to\n";
3655 print "(un)expanded folders in the folder list (Oldway = false). These\n";
3656 print "icons are quite small, but will obviously be more of a resource\n";
3657 print "drain than text markers.\n";
3660 if ( lc($use_icons) eq 'true' ) {
3661 $default_value = "y";
3663 $default_value = "n";
3665 print "Use icons? (y/n) [$WHT$default_value$NRM]: $WHT";
3666 $use_icons = <STDIN
>;
3667 if ( ( $use_icons =~ /^y\n/i ) || ( ( $use_icons =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3668 $use_icons = 'true';
3670 $use_icons = 'false';
3676 print "Enable this option if you want to use php recode functions to read\n";
3677 print "emails written in charset that differs from the one that is set in\n";
3678 print "translation selected by user. Code is experimental, it might cause\n";
3679 print "errors, if email contains charset unsupported by recode or if your\n";
3680 print "php does not have recode support.\n";
3683 if ( lc($use_php_recode) eq 'true' ) {
3684 $default_value = "y";
3686 $default_value = "n";
3688 print "Use php recode functions? (y/n) [$WHT$default_value$NRM]: $WHT";
3689 $use_php_recode = <STDIN
>;
3690 if ( ( $use_php_recode =~ /^y\n/i ) || ( ( $use_php_recode =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3691 $use_php_recode = 'true';
3693 $use_php_recode = 'false';
3695 return $use_php_recode;
3699 print "Enable this option if you want to use php iconv functions to read\n";
3700 print "emails written in charset that differs from the one that is set in\n";
3701 print "translation selected by user. Code is experimental, it works only\n";
3702 print "with translations that use utf-8 charset. Code might cause errors,\n";
3703 print "if email contains charset unsupported by iconv or if your php does\n";
3704 print "not have iconv support.\n";
3707 if ( lc($use_php_iconv) eq 'true' ) {
3708 $default_value = "y";
3710 $default_value = "n";
3712 print "Use php iconv functions? (y/n) [$WHT$default_value$NRM]: $WHT";
3713 $use_php_iconv = <STDIN
>;
3714 if ( ( $use_php_iconv =~ /^y\n/i ) || ( ( $use_php_iconv =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3715 $use_php_iconv = 'true';
3717 $use_php_iconv = 'false';
3719 return $use_php_iconv;
3724 print "Enable this option if you want to check SquirrelMail configuration\n";
3725 print "remotely with configtest.php script.\n";
3728 if ( lc($allow_remote_configtest) eq 'true' ) {
3729 $default_value = "y";
3731 $default_value = "n";
3733 print "Allow remote configuration tests? (y/n) [$WHT$default_value$NRM]: $WHT";
3734 $allow_remote_configtest = <STDIN
>;
3735 if ( ( $allow_remote_configtest =~ /^y\n/i ) || ( ( $allow_remote_configtest =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3736 $allow_remote_configtest = 'true';
3738 $allow_remote_configtest = 'false';
3740 return $allow_remote_configtest;
3747 if ( open( CF
, ">config.php" ) ) {
3752 print CF
" * SquirrelMail Configuration File\n";
3753 print CF
" * Created using the configure script, conf.pl\n";
3756 print CF
"global \$version;\n";
3758 if ($print_config_version) {
3759 print CF
"\$config_version = '$print_config_version';\n";
3762 print CF
"\$config_use_color = $config_use_color;\n";
3766 print CF
"\$org_name = \"$org_name\";\n";
3768 print CF
"\$org_logo = " . &change_to_SM_path
($org_logo) . ";\n";
3769 $org_logo_width |= 0;
3770 $org_logo_height |= 0;
3772 print CF
"\$org_logo_width = '$org_logo_width';\n";
3774 print CF
"\$org_logo_height = '$org_logo_height';\n";
3775 # string that can contain variables.
3776 print CF
"\$org_title = \"$org_title\";\n";
3778 print CF
"\$signout_page = " . &change_to_SM_path
($signout_page) . ";\n";
3780 print CF
"\$frame_top = '$frame_top';\n";
3783 print CF
"\$provider_uri = '$provider_uri';\n";
3786 print CF
"\$provider_name = '$provider_name';\n";
3789 # string that can contain variables
3790 print CF
"\$motd = \"$motd\";\n";
3794 print CF
"\$squirrelmail_default_language = '$squirrelmail_default_language';\n";
3796 print CF
"\$default_charset = '$default_charset';\n";
3798 print CF
"\$show_alternative_names = $show_alternative_names;\n";
3800 print CF
"\$aggressive_decoding = $aggressive_decoding;\n";
3802 print CF
"\$lossy_encoding = $lossy_encoding;\n";
3806 print CF
"\$domain = '$domain';\n";
3808 print CF
"\$imapServerAddress = '$imapServerAddress';\n";
3810 print CF
"\$imapPort = $imapPort;\n";
3812 print CF
"\$useSendmail = $useSendmail;\n";
3814 print CF
"\$smtpServerAddress = '$smtpServerAddress';\n";
3816 print CF
"\$smtpPort = $smtpPort;\n";
3818 print CF
"\$sendmail_path = '$sendmail_path';\n";
3820 print CF
"\$sendmail_args = '$sendmail_args';\n";
3822 # print CF "\$use_authenticated_smtp = $use_authenticated_smtp;\n";
3824 print CF
"\$pop_before_smtp = $pop_before_smtp;\n";
3826 print CF
"\$imap_server_type = '$imap_server_type';\n";
3828 print CF
"\$invert_time = $invert_time;\n";
3830 print CF
"\$optional_delimiter = '$optional_delimiter';\n";
3832 print CF
"\$encode_header_key = '$encode_header_key';\n";
3836 print CF
"\$default_folder_prefix = '$default_folder_prefix';\n";
3838 print CF
"\$trash_folder = '$trash_folder';\n";
3840 print CF
"\$sent_folder = '$sent_folder';\n";
3842 print CF
"\$draft_folder = '$draft_folder';\n";
3844 print CF
"\$default_move_to_trash = $default_move_to_trash;\n";
3846 print CF
"\$default_move_to_sent = $default_move_to_sent;\n";
3848 print CF
"\$default_save_as_draft = $default_save_as_draft;\n";
3850 print CF
"\$show_prefix_option = $show_prefix_option;\n";
3852 print CF
"\$list_special_folders_first = $list_special_folders_first;\n";
3854 print CF
"\$use_special_folder_color = $use_special_folder_color;\n";
3856 print CF
"\$auto_expunge = $auto_expunge;\n";
3858 print CF
"\$default_sub_of_inbox = $default_sub_of_inbox;\n";
3860 print CF
"\$show_contain_subfolders_option = $show_contain_subfolders_option;\n";
3862 print CF
"\$default_unseen_notify = $default_unseen_notify;\n";
3864 print CF
"\$default_unseen_type = $default_unseen_type;\n";
3866 print CF
"\$auto_create_special = $auto_create_special;\n";
3868 print CF
"\$delete_folder = $delete_folder;\n";
3870 print CF
"\$noselect_fix_enable = $noselect_fix_enable;\n";
3875 print CF
"\$data_dir = " . &change_to_SM_path
($data_dir) . ";\n";
3876 # string that can contain a variable
3877 print CF
"\$attachment_dir = " . &change_to_SM_path
($attachment_dir) . ";\n";
3879 print CF
"\$dir_hash_level = $dir_hash_level;\n";
3881 print CF
"\$default_left_size = '$default_left_size';\n";
3883 print CF
"\$force_username_lowercase = $force_username_lowercase;\n";
3885 print CF
"\$default_use_priority = $default_use_priority;\n";
3887 print CF
"\$hide_sm_attributions = $hide_sm_attributions;\n";
3889 print CF
"\$default_use_mdn = $default_use_mdn;\n";
3891 print CF
"\$edit_identity = $edit_identity;\n";
3893 print CF
"\$edit_name = $edit_name;\n";
3895 print CF
"\$hide_auth_header = $hide_auth_header;\n";
3897 print CF
"\$disable_thread_sort = $disable_thread_sort;\n";
3899 print CF
"\$disable_server_sort = $disable_server_sort;\n";
3901 print CF
"\$allow_charset_search = $allow_charset_search;\n";
3903 print CF
"\$allow_advanced_search = $allow_advanced_search;\n";
3906 print CF
"\$time_zone_type = $time_zone_type;\n";
3909 # all plugins are strings
3910 for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
3911 print CF
"\$plugins[] = '$plugins[$ct]';\n";
3916 print CF
"\$theme_css = " . &change_to_SM_path
($theme_css) . ";\n";
3917 if ( $theme_default eq '' ) { $theme_default = '0'; }
3918 print CF
"\$theme_default = $theme_default;\n";
3920 for ( $count = 0 ; $count <= $#theme_name ; $count++ ) {
3921 print CF
"\$theme[$count]['PATH'] = " . &change_to_SM_path
($theme_path[$count]) . ";\n";
3922 # escape theme name so it can contain single quotes.
3923 $esc_name = $theme_name[$count];
3924 $esc_name =~ s/\\/\\\\/g;
3925 $esc_name =~ s/'/\\'/g;
3926 print CF
"\$theme[$count]['NAME'] = '$esc_name';\n";
3930 if ( $templateset_default eq '' ) { $templateset_default = '0'; }
3931 print CF
"\$templateset_default = $templateset_default;\n";
3933 for ( $count = 0 ; $count <= $#templateset_name ; $count++ ) {
3934 print CF
"\$aTemplateSet[$count]['PATH'] = " . &change_to_SM_path
($templateset_path[$count]) . ";\n";
3935 # escape theme name so it can contain single quotes.
3936 $esc_name = $templateset_name[$count];
3937 $esc_name =~ s/\\/\\\\/g;
3938 $esc_name =~ s/'/\\'/g;
3939 print CF
"\$aTemplateSet[$count]['NAME'] = '$esc_name';\n";
3945 print CF
"\$default_fontsize = '$default_fontsize';\n";
3947 print CF
"\$default_fontset = '$default_fontset';\n";
3949 # assoc. array (maybe initial value should be set somewhere else)
3950 print CF
'$fontsets = array();'."\n";
3951 while (($fontset_name, $fontset_value) = each(%fontsets)) {
3952 print CF
"\$fontsets\['$fontset_name'\] = '$fontset_value';\n";
3958 print CF
"\$default_use_javascript_addr_book = $default_use_javascript_addr_book;\n";
3959 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
3960 print CF
"\$ldap_server[$count] = array(\n";
3962 print CF
" 'host' => '$ldap_host[$count]',\n";
3964 print CF
" 'base' => '$ldap_base[$count]'";
3965 if ( $ldap_name[$count] ) {
3968 print CF
" 'name' => '$ldap_name[$count]'";
3970 if ( $ldap_port[$count] ) {
3973 print CF
" 'port' => $ldap_port[$count]";
3975 if ( $ldap_charset[$count] ) {
3978 print CF
" 'charset' => '$ldap_charset[$count]'";
3980 if ( $ldap_maxrows[$count] ) {
3983 print CF
" 'maxrows' => $ldap_maxrows[$count]";
3986 if ( $ldap_filter[$count] ) {
3988 print CF
" 'filter' => '$ldap_filter[$count]'";
3990 if ( $ldap_binddn[$count] ) {
3993 print CF
" 'binddn' => '$ldap_binddn[$count]'";
3994 if ( $ldap_bindpw[$count] ) {
3997 print CF
" 'bindpw' => '$ldap_bindpw[$count]'";
4000 if ( $ldap_protocol[$count] ) {
4003 print CF
" 'protocol' => $ldap_protocol[$count]";
4005 if ( $ldap_limit_scope[$count] ) {
4008 print CF
" 'limit_scope' => $ldap_limit_scope[$count]";
4010 if ( $ldap_listing[$count] ) {
4013 print CF
" 'listing' => $ldap_listing[$count]";
4015 if ( $ldap_search_tree[$count] ) {
4018 print CF
" 'search_tree' => $ldap_search_tree[$count]";
4020 if ( $ldap_listing[$count] ) {
4023 print CF
" 'starttls' => $ldap_starttls[$count]";
4031 print CF
"\$addrbook_dsn = '$addrbook_dsn';\n";
4033 print CF
"\$addrbook_table = '$addrbook_table';\n\n";
4035 print CF
"\$prefs_dsn = '$prefs_dsn';\n";
4037 print CF
"\$prefs_table = '$prefs_table';\n";
4039 print CF
"\$prefs_user_field = '$prefs_user_field';\n";
4041 print CF
"\$prefs_user_size = $prefs_user_size;\n";
4043 print CF
"\$prefs_key_field = '$prefs_key_field';\n";
4045 print CF
"\$prefs_key_size = $prefs_key_size;\n";
4047 print CF
"\$prefs_val_field = '$prefs_val_field';\n";
4049 print CF
"\$prefs_val_size = $prefs_val_size;\n\n";
4051 print CF
"\$addrbook_global_dsn = '$addrbook_global_dsn';\n";
4053 print CF
"\$addrbook_global_table = '$addrbook_global_table';\n";
4055 print CF
"\$addrbook_global_writeable = $addrbook_global_writeable;\n";
4057 print CF
"\$addrbook_global_listing = $addrbook_global_listing;\n\n";
4059 print CF
"\$abook_global_file = '$abook_global_file';\n";
4061 print CF
"\$abook_global_file_writeable = $abook_global_file_writeable;\n\n";
4063 print CF
"\$abook_global_file_listing = $abook_global_file_listing;\n\n";
4065 print CF
"\$no_list_for_subscribe = $no_list_for_subscribe;\n";
4068 print CF
"\$smtp_auth_mech = '$smtp_auth_mech';\n";
4070 print CF
"\$imap_auth_mech = '$imap_auth_mech';\n";
4072 print CF
"\$use_imap_tls = $use_imap_tls;\n";
4074 print CF
"\$use_smtp_tls = $use_smtp_tls;\n";
4076 print CF
"\$session_name = '$session_name';\n";
4081 print CF
"\$advanced_tree = $advanced_tree;\n";
4084 print CF
"\$use_iframe = $use_iframe;\n";
4087 print CF
"\$use_icons = $use_icons;\n";
4090 print CF
"\$use_php_recode = $use_php_recode;\n";
4093 print CF
"\$use_php_iconv = $use_php_iconv;\n";
4096 print CF
"\$allow_remote_configtest = $allow_remote_configtest;\n";
4099 print CF
"\@include SM_PATH . 'config/config_local.php';\n";
4102 print CF
" * Make sure there are no characters after the PHP closing\n";
4103 print CF
" * tag below (including newline characters and whitespace).\n";
4104 print CF
" * Otherwise, that character will cause the headers to be\n";
4105 print CF
" * sent and regular output to begin, which will majorly screw\n";
4106 print CF
" * things up when we try to send more headers later.\n";
4112 print "Data saved in config.php\n";
4114 print "Error saving config.php: $!\n";
4120 print $WHT. "SquirrelMail Configuration : " . $NRM;
4121 if ( $config == 1 ) { print "Read: config.php"; }
4122 elsif ( $config == 2 ) { print "Read: config_default.php"; }
4124 print "---------------------------------------------------------\n";
4126 print "While we have been building SquirrelMail, we have discovered some\n";
4127 print "preferences that work better with some servers that don't work so\n";
4128 print "well with others. If you select your IMAP server, this option will\n";
4129 print "set some pre-defined settings for that server.\n";
4131 print "Please note that you will still need to go through and make sure\n";
4132 print "everything is correct. This does not change everything. There are\n";
4133 print "only a few settings that this will change.\n";
4137 while ( $continue != 1 ) {
4138 print "Please select your IMAP server:\n";
4139 print " bincimap = Binc IMAP server\n";
4140 print " courier = Courier IMAP server\n";
4141 print " cyrus = Cyrus IMAP server\n";
4142 print " dovecot = Dovecot Secure IMAP server\n";
4143 print " exchange = Microsoft Exchange IMAP server\n";
4144 print " hmailserver = hMailServer\n";
4145 print " macosx = Mac OS X Mailserver\n";
4146 print " mercury32 = Mercury/32\n";
4147 print " uw = University of Washington's IMAP server\n";
4149 print " quit = Do not change anything\n";
4151 print "Command >> ";
4153 $server =~ s/[\r\n]//g;
4155 # variable is used to display additional messages.
4159 if ( $server eq "cyrus" ) {
4160 $imap_server_type = "cyrus";
4161 $default_folder_prefix = "";
4162 $trash_folder = "INBOX.Trash";
4163 $sent_folder = "INBOX.Sent";
4164 $draft_folder = "INBOX.Drafts";
4165 $show_prefix_option = false
;
4166 $default_sub_of_inbox = true
;
4167 $show_contain_subfolders_option = false
;
4168 $optional_delimiter = ".";
4169 $disp_default_folder_prefix = "<none>";
4170 $force_username_lowercase = false
;
4173 } elsif ( $server eq "uw" ) {
4174 $imap_server_type = "uw";
4175 $default_folder_prefix = "mail/";
4176 $trash_folder = "Trash";
4177 $sent_folder = "Sent";
4178 $draft_folder = "Drafts";
4179 $show_prefix_option = true
;
4180 $default_sub_of_inbox = false
;
4181 $show_contain_subfolders_option = true
;
4182 $optional_delimiter = "/";
4183 $disp_default_folder_prefix = $default_folder_prefix;
4184 $delete_folder = true
;
4185 $force_username_lowercase = true
;
4188 } elsif ( $server eq "exchange" ) {
4189 $imap_server_type = "exchange";
4190 $default_folder_prefix = "";
4191 $default_sub_of_inbox = true
;
4192 $trash_folder = "INBOX/Deleted Items";
4193 $sent_folder = "INBOX/Sent Items";
4194 $drafts_folder = "INBOX/Drafts";
4195 $show_prefix_option = false
;
4196 $show_contain_subfolders_option = false
;
4197 $optional_delimiter = "detect";
4198 $disp_default_folder_prefix = "<none>";
4199 $force_username_lowercase = true
;
4202 } elsif ( $server eq "courier" ) {
4203 $imap_server_type = "courier";
4204 $default_folder_prefix = "INBOX.";
4205 $trash_folder = "Trash";
4206 $sent_folder = "Sent";
4207 $draft_folder = "Drafts";
4208 $show_prefix_option = false
;
4209 $default_sub_of_inbox = false
;
4210 $show_contain_subfolders_option = false
;
4211 $optional_delimiter = ".";
4212 $disp_default_folder_prefix = $default_folder_prefix;
4213 $delete_folder = true
;
4214 $force_username_lowercase = false
;
4217 } elsif ( $server eq "macosx" ) {
4218 $imap_server_type = "macosx";
4219 $default_folder_prefix = "INBOX/";
4220 $trash_folder = "Trash";
4221 $sent_folder = "Sent";
4222 $draft_folder = "Drafts";
4223 $show_prefix_option = false
;
4224 $default_sub_of_inbox = true
;
4225 $show_contain_subfolders_option = false
;
4226 $optional_delimiter = "detect";
4227 $allow_charset_search = false
;
4228 $disp_default_folder_prefix = $default_folder_prefix;
4231 } elsif ( $server eq "hmailserver" ) {
4232 $imap_server_type = "hmailserver";
4233 $default_folder_prefix = "";
4234 $trash_folder = "INBOX.Trash";
4235 $sent_folder = "INBOX.Sent";
4236 $draft_folder = "INBOX.Drafts";
4237 $show_prefix_option = false
;
4238 $default_sub_of_inbox = true
;
4239 $show_contain_subfolders_option = false
;
4240 $optional_delimiter = "detect";
4241 $allow_charset_search = false
;
4242 $disp_default_folder_prefix = $default_folder_prefix;
4243 $delete_folder = false
;
4244 $force_username_lowercase = false
;
4247 } elsif ( $server eq "mercury32" ) {
4248 $imap_server_type = "mercury32";
4249 $default_folder_prefix = "";
4250 $trash_folder = "Trash";
4251 $sent_folder = "Sent";
4252 $draft_folder = "Drafts";
4253 $show_prefix_option = false
;
4254 $default_sub_of_inbox = true
;
4255 $show_contain_subfolders_option = true
;
4256 $optional_delimiter = "detect";
4257 $delete_folder = true
;
4258 $force_username_lowercase = true
;
4261 } elsif ( $server eq "dovecot" ) {
4262 $imap_server_type = "dovecot";
4263 $default_folder_prefix = "";
4264 $trash_folder = "Trash";
4265 $sent_folder = "Sent";
4266 $draft_folder = "Drafts";
4267 $show_prefix_option = false
;
4268 $default_sub_of_inbox = false
;
4269 $show_contain_subfolders_option = false
;
4270 $delete_folder = false
;
4271 $force_username_lowercase = true
;
4272 $optional_delimiter = "detect";
4273 $disp_default_folder_prefix = "<none>";
4276 } elsif ( $server eq "bincimap" ) {
4277 $imap_server_type = "bincimap";
4278 $default_folder_prefix = "INBOX/";
4279 $trash_folder = "Trash";
4280 $sent_folder = "Sent";
4281 $draft_folder = "Drafts";
4282 $show_prefix_option = false
;
4283 $default_sub_of_inbox = false
;
4284 $show_contain_subfolders_option = false
;
4285 $delete_folder = true
;
4286 $force_username_lowercase = false
;
4287 $optional_delimiter = "detect";
4288 $disp_default_folder_prefix = $default_folder_prefix;
4290 # Default folder prefix depends on used depot.
4291 $message = "\nIf you use IMAPdir depot, you must set default folder prefix to empty string.\n";
4294 } elsif ( $server eq "quit" ) {
4297 $disp_default_folder_prefix = $default_folder_prefix;
4298 print "Unrecognized server: $server\n";
4302 print " imap_server_type = $imap_server_type\n";
4303 print " default_folder_prefix = $disp_default_folder_prefix\n";
4304 print " trash_folder = $trash_folder\n";
4305 print " sent_folder = $sent_folder\n";
4306 print " draft_folder = $draft_folder\n";
4307 print " show_prefix_option = $show_prefix_option\n";
4308 print " default_sub_of_inbox = $default_sub_of_inbox\n";
4309 print "show_contain_subfolders_option = $show_contain_subfolders_option\n";
4310 print " optional_delimiter = $optional_delimiter\n";
4311 print " delete_folder = $delete_folder\n";
4312 print " force_username_lowercase = $force_username_lowercase\n";
4316 print "\nPress enter to continue...";
4320 # This subroutine corrects relative paths to ensure they
4321 # will work within the SM space. If the path falls within
4322 # the SM directory tree, the SM_PATH variable will be
4323 # prepended to the path, if not, then the path will be
4324 # converted to an absolute path, e.g.
4325 # '../images/logo.gif' --> SM_PATH . 'images/logo.gif'
4326 # '../../someplace/data' --> '/absolute/path/someplace/data'
4327 # 'images/logo.gif' --> SM_PATH . 'config/images/logo.gif'
4328 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
4329 # 'http://whatever/' --> 'http://whatever'
4330 # $some_var/path --> "$some_var/path"
4331 sub change_to_SM_path
() {
4332 my ($old_path) = @_;
4338 # If the path is absolute, don't bother.
4339 return "\'" . $old_path . "\'" if ( $old_path eq '');
4340 return "\'" . $old_path . "\'" if ( $old_path =~ /^(\/|http
)/ );
4341 return "\'" . $old_path . "\'" if ( $old_path =~ /^\w:\// );
4342 return $old_path if ( $old_path =~ /^\'(\/|http
)/ );
4343 return $old_path if ( $old_path =~ /^\'\w:\// );
4344 return $old_path if ( $old_path =~ /^SM_PATH/);
4346 if ( $old_path =~ /^\$/ ) {
4347 # check if it's a single var, or a $var/path combination
4348 # if it's $var/path, enclose in ""
4349 if ( $old_path =~ /\// ) {
4350 return '"'.$old_path.'"';
4355 # Remove remaining '
4356 $old_path =~ s/\'//g;
4358 # For relative paths, split on '../'
4359 @rel_path = split(/\.\.\//, $old_path);
4361 if ( $#rel_path > 1 ) {
4362 # more than two levels away. Make it absolute.
4363 @abs_path = split(/\//, $dir);
4365 # Lop off the relative pieces of the absolute path..
4366 for ( $i = 0; $i <= $#rel_path; $i++ ) {
4370 push @abs_path, @rel_path;
4371 $new_path = "\'" . join('/', @abs_path) . "\'";
4372 } elsif ( $#rel_path > 0 ) {
4373 # it's within the SM tree, prepend SM_PATH
4374 $new_path = $old_path;
4375 $new_path =~ s/^\.\.\//SM_PATH
. \'/;
4378 # Last, it's a relative path without any leading '.'
4379 # Prepend SM_PATH and config, since the paths are
4380 # relative to the config directory
4381 $new_path = "SM_PATH . \'config/" . $old_path . "\'";
4387 # Change SM_PATH to admin-friendly version, e.g.:
4388 # SM_PATH . 'images/logo.gif' --> '../images/logo.gif'
4389 # SM_PATH . 'config/some.php' --> 'some.php'
4390 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
4391 # 'http://whatever/' --> 'http://whatever'
4392 sub change_to_rel_path
() {
4393 my ($old_path) = @_;
4394 my $new_path = $old_path;
4396 if ( $old_path =~ /^SM_PATH/ ) {
4397 $new_path =~ s/^SM_PATH . \'/\.\.\//;
4398 $new_path =~ s/\.\.\/config\///;
4404 sub detect_auth_support
{
4405 # Attempts to auto-detect if a specific auth mechanism is supported.
4406 # Called by 'command112a' and 'command112b'
4407 # ARGS: service-name (IMAP or SMTP), host:port, mech-name (ie. CRAM-MD5)
4411 my $service = shift;
4415 if ((!defined($service)) or (!defined($host)) or (!defined($mech))) {
4416 # Error - wrong # of args
4417 print "BAD ARGS!\n";
4421 if ($service eq 'SMTP') {
4422 $cmd = "AUTH $mech\r\n";
4423 $logout = "QUIT\r\n";
4424 } elsif ($service eq 'IMAP') {
4425 $cmd = "A01 AUTHENTICATE $mech\n";
4426 $logout = "C01 LOGOUT\n";
4428 # unknown service - whoops.
4432 # Get this show on the road
4433 my $sock=IO
::Socket
::INET
->new($host);
4434 if (!defined($sock)) {
4438 my $discard = <$sock>; # Server greeting/banner - who cares..
4440 if ($service eq 'SMTP') {
4442 print $sock "HELO $domain\r\n";
4443 $discard = <$sock>; # Yeah yeah, you're happy to see me..
4447 my $response = <$sock>;
4449 if (!defined($response)) {
4453 # So at this point, we have a response, and it is (hopefully) valid.
4454 if ($service eq 'SMTP') {
4455 if (($response =~ /^535/) or ($response =~/^502/)) {
4457 print $sock $logout;
4460 } elsif ($response =~ /^503/) {
4461 #Something went wrong
4464 } elsif ($service eq 'IMAP') {
4465 if ($response =~ /^A01/) {
4467 print $sock $logout;
4472 # Unknown service - this shouldn't be able to happen.
4477 # If it gets here, the mech is supported
4478 print $sock "*\n"; # Attempt to cancel authentication
4479 print $sock $logout; # Try to log out, but we don't really care if this fails
4485 # Example code from O'Reilly Perl Cookbook
4492 return wantarray ?
@out : $out[0];
4495 sub clear_screen
() {
4496 if ( $^O
=~ /^mswin/i) {