reword some of the text around email/full name options, and introduce
[squirrelmail.git] / config / conf.pl
1 #!/usr/bin/env perl
2 # conf.pl
3 #
4 # Copyright (c) 1999-2005 The SquirrelMail Project Team
5 # Licensed under the GNU GPL. For full terms see COPYING.
6 #
7 # A simple configure script to configure SquirrelMail
8 #
9 # $Id$
10 ############################################################
11 $conf_pl_version = "1.4.0";
12
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 ############################################################
19 my $dir;
20 if ( eval q{require "File/Basename.pm"} ) {
21 $dir = File::Basename::dirname($0);
22 chdir($dir);
23 }
24
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.";
33 exit;
34 }
35
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 ############################################################
41 use Cwd;
42 $dir = cwd();
43
44
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> ) {
51 $line =~ s/^\s+//;
52 $line =~ s/^\$//;
53 $var = $line;
54
55 $var =~ s/=/EQUALS/;
56 if ( $var =~ /^([a-z])/i ) {
57 @o = split ( /\s*EQUALS\s*/, $var );
58 if ( $o[0] eq "config_version" ) {
59 $o[1] =~ s/[\n\r]//g;
60 $o[1] =~ s/[\'\"];\s*$//;
61 $o[1] =~ s/;$//;
62 $o[1] =~ s/^[\'\"]//;
63
64 $config_version = $o[1];
65 close(FILE);
66 }
67 }
68 }
69 close(FILE);
70
71 if ( $config_version ne $conf_pl_version ) {
72 clear_screen();
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";
80 print "\n";
81 print "Continue loading with the old config.php [y/N]? ";
82 $ctu = <STDIN>;
83
84 if ( ( $ctu !~ /^y\n/i ) || ( $ctu =~ /^\n/ ) ) {
85 exit;
86 }
87
88 print "\nDo you want me to stop warning you [y/N]? ";
89 $ctu = <STDIN>;
90 if ( $ctu =~ /^y\n/i ) {
91 $print_config_version = $conf_pl_version;
92 } else {
93 $print_config_version = $config_version;
94 }
95 } else {
96 $print_config_version = $config_version;
97 }
98
99 $config = 1;
100 open( FILE, "config.php" );
101 } elsif ( -e "config_default.php" ) {
102 open( FILE, "config_default.php" );
103 while ( $line = <FILE> ) {
104 $line =~ s/^\s+//;
105 $line =~ s/^\$//;
106 $var = $line;
107
108 $var =~ s/=/EQUALS/;
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*$//;
114 $o[1] =~ s/;$//;
115 $o[1] =~ s/^[\'\"]//;
116
117 $config_version = $o[1];
118 close(FILE);
119 }
120 }
121 }
122 close(FILE);
123
124 if ( $config_version ne $conf_pl_version ) {
125 clear_screen();
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";
133 print "\n";
134 print "Continue loading with old config_default.php (a bad idea) [y/N]? ";
135 $ctu = <STDIN>;
136
137 if ( ( $ctu !~ /^y\n/i ) || ( $ctu =~ /^\n/ ) ) {
138 exit;
139 }
140
141 print "\nDo you want me to stop warning you [y/N]? ";
142 $ctu = <STDIN>;
143 if ( $ctu =~ /^y\n/i ) {
144 $print_config_version = $conf_pl_version;
145 } else {
146 $print_config_version = $config_version;
147 }
148 } else {
149 $print_config_version = $config_version;
150 }
151 $config = 2;
152 open( FILE, "config_default.php" );
153 } else {
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";
157 exit;
158 }
159
160 # Read and parse the current configuration file
161 # (either config.php or config_default.php).
162 while ( $line = <FILE> ) {
163 $line =~ s/^\s+//;
164 $line =~ s/^\$//;
165 $var = $line;
166
167 $var =~ s/=/EQUALS/;
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;
177
178 if ( $options[0] =~ /^theme\[[0-9]+\]\[['"]PATH['"]\]/ ) {
179 $sub = $options[0];
180 $sub =~ s/\]\[['"]PATH['"]\]//;
181 $sub =~ s/.*\[//;
182 if ( -e "../themes" ) {
183 $options[1] =~ s/^\.\.\/config/\.\.\/themes/;
184 }
185 $theme_path[$sub] = &change_to_rel_path($options[1]);
186 } elsif ( $options[0] =~ /^theme\[[0-9]+\]\[['"]NAME['"]\]/ ) {
187 $sub = $options[0];
188 $sub =~ s/\]\[['"]NAME['"]\]//;
189 $sub =~ s/.*\[//;
190 $theme_name[$sub] = $options[1];
191 } elsif ( $options[0] =~ /^plugins\[[0-9]*\]/ ) {
192 $sub = $options[0];
193 $sub =~ s/\]//;
194 $sub =~ s/^plugins\[//;
195 if ($sub eq '') {
196 push @plugins, $options[1];
197 } else {
198 $plugins[$sub] = $options[1];
199 }
200 } elsif ( $options[0] =~ /^ldap_server\[[0-9]+\]/ ) {
201 $sub = $options[0];
202 $sub =~ s/\]//;
203 $sub =~ s/^ldap_server\[//;
204 $continue = 0;
205 while ( ( $tmp = <FILE> ) && ( $continue != 1 ) ) {
206 if ( $tmp =~ /\);\s*$/ ) {
207 $continue = 1;
208 }
209
210 if ( $tmp =~ /^\s*[\'\"]host[\'\"]/i ) {
211 $tmp =~ s/^\s*[\'\"]host[\'\"]\s*=>\s*[\'\"]//i;
212 $tmp =~ s/[\'\"],?\s*$//;
213 $tmp =~ s/[\'\"]\);\s*$//;
214 $host = $tmp;
215 } elsif ( $tmp =~ /^\s*[\'\"]base[\'\"]/i ) {
216 $tmp =~ s/^\s*[\'\"]base[\'\"]\s*=>\s*[\'\"]//i;
217 $tmp =~ s/[\'\"],?\s*$//;
218 $tmp =~ s/[\'\"]\);\s*$//;
219 $base = $tmp;
220 } elsif ( $tmp =~ /^\s*[\'\"]charset[\'\"]/i ) {
221 $tmp =~ s/^\s*[\'\"]charset[\'\"]\s*=>\s*[\'\"]//i;
222 $tmp =~ s/[\'\"],?\s*$//;
223 $tmp =~ s/[\'\"]\);\s*$//;
224 $charset = $tmp;
225 } elsif ( $tmp =~ /^\s*[\'\"]port[\'\"]/i ) {
226 $tmp =~ s/^\s*[\'\"]port[\'\"]\s*=>\s*[\'\"]?//i;
227 $tmp =~ s/[\'\"]?,?\s*$//;
228 $tmp =~ s/[\'\"]?\);\s*$//;
229 $port = $tmp;
230 } elsif ( $tmp =~ /^\s*[\'\"]maxrows[\'\"]/i ) {
231 $tmp =~ s/^\s*[\'\"]maxrows[\'\"]\s*=>\s*[\'\"]?//i;
232 $tmp =~ s/[\'\"]?,?\s*$//;
233 $tmp =~ s/[\'\"]?\);\s*$//;
234 $maxrows = $tmp;
235 } elsif ( $tmp =~ /^\s*[\'\"]filter[\'\"]/i ) {
236 $tmp =~ s/^\s*[\'\"]filter[\'\"]\s*=>\s*[\'\"]?//i;
237 $tmp =~ s/[\'\"]?,?\s*$//;
238 $tmp =~ s/[\'\"]?\);\s*$//;
239 $filter = $tmp;
240 } elsif ( $tmp =~ /^\s*[\'\"]name[\'\"]/i ) {
241 $tmp =~ s/^\s*[\'\"]name[\'\"]\s*=>\s*[\'\"]//i;
242 $tmp =~ s/[\'\"],?\s*$//;
243 $tmp =~ s/[\'\"]\);\s*$//;
244 $name = $tmp;
245 } elsif ( $tmp =~ /^\s*[\'\"]binddn[\'\"]/i ) {
246 $tmp =~ s/^\s*[\'\"]binddn[\'\"]\s*=>\s*[\'\"]//i;
247 $tmp =~ s/[\'\"],?\s*$//;
248 $tmp =~ s/[\'\"]\);\s*$//;
249 $binddn = $tmp;
250 } elsif ( $tmp =~ /^\s*[\'\"]bindpw[\'\"]/i ) {
251 $tmp =~ s/^\s*[\'\"]bindpw[\'\"]\s*=>\s*[\'\"]//i;
252 $tmp =~ s/[\'\"],?\s*$//;
253 $tmp =~ s/[\'\"]\);\s*$//;
254 $bindpw = $tmp;
255 } elsif ( $tmp =~ /^\s*[\'\"]protocol[\'\"]/i ) {
256 $tmp =~ s/^\s*[\'\"]protocol[\'\"]\s*=>\s*[\'\"]?//i;
257 $tmp =~ s/[\'\"]?,?\s*$//;
258 $tmp =~ s/[\'\"]?\);\s*$//;
259 $protocol = $tmp;
260 } elsif ( $tmp =~ /^\s*[\'\"]limit_scope[\'\"]/i ) {
261 $tmp =~ s/^\s*[\'\"]limit_scope[\'\"]\s*=>\s*[\'\"]?//i;
262 $tmp =~ s/[\'\"]?,?\s*$//;
263 $tmp =~ s/[\'\"]?\);\s*$//;
264 $limit_scope = $tmp;
265 } elsif ( $tmp =~ /^\s*[\'\"]listing[\'\"]/i ) {
266 $tmp =~ s/^\s*[\'\"]listing[\'\"]\s*=>\s*[\'\"]?//i;
267 $tmp =~ s/[\'\"]?,?\s*$//;
268 $tmp =~ s/[\'\"]?\);\s*$//;
269 $listing = $tmp;
270 } elsif ( $tmp =~ /^\s*[\'\"]search_tree[\'\"]/i ) {
271 $tmp =~ s/^\s*[\'\"]search_tree[\'\"]\s*=>\s*[\'\"]?//i;
272 $tmp =~ s/[\'\"]?,?\s*$//;
273 $tmp =~ s/[\'\"]?\);\s*$//;
274 $search_tree = $tmp;
275 } elsif ( $tmp =~ /^\s*[\'\"]starttls[\'\"]/i ) {
276 $tmp =~ s/^\s*[\'\"]starttls[\'\"]\s*=>\s*[\'\"]?//i;
277 $tmp =~ s/[\'\"]?,?\s*$//;
278 $tmp =~ s/[\'\"]?\);\s*$//;
279 $starttls = $tmp;
280 }
281 }
282 $ldap_host[$sub] = $host;
283 $ldap_base[$sub] = $base;
284 $ldap_name[$sub] = $name;
285 $ldap_port[$sub] = $port;
286 $ldap_maxrows[$sub] = $maxrows;
287 $ldap_filter[$sub] = $filter;
288 $ldap_charset[$sub] = $charset;
289 $ldap_binddn[$sub] = $binddn;
290 $ldap_bindpw[$sub] = $bindpw;
291 $ldap_protocol[$sub] = $protocol;
292 $ldap_limit_scope[$sub] = $limit_scope;
293 $ldap_listing[$sub] = $listing;
294 $ldap_search_tree[$sub] = $search_tree;
295 $ldap_starttls[$sub] = $starttls;
296 } elsif ( $options[0] =~ /^(data_dir|attachment_dir|theme_css|org_logo|signout_page)$/ ) {
297 ${ $options[0] } = &change_to_rel_path($options[1]);
298 } else {
299 ${ $options[0] } = $options[1];
300 }
301 }
302 }
303 close FILE;
304
305 $useSendmail = 'false' if ( lc($useSendmail) ne 'true' );
306 $sendmail_path = "/usr/sbin/sendmail" if ( !$sendmail_path );
307 $pop_before_smtp = 'false' if ( !$pop_before_smtp );
308 $default_unseen_notify = 2 if ( !$default_unseen_notify );
309 $default_unseen_type = 1 if ( !$default_unseen_type );
310 $config_use_color = 0 if ( !$config_use_color );
311 $invert_time = 'false' if ( !$invert_time );
312 $force_username_lowercase = 'false' if ( !$force_username_lowercase );
313 $optional_delimiter = "detect" if ( !$optional_delimiter );
314 $auto_create_special = 'false' if ( !$auto_create_special );
315 $default_use_priority = 'true' if ( !$default_use_priority );
316 $hide_sm_attributions = 'false' if ( !$hide_sm_attributions );
317 $default_use_mdn = 'true' if ( !$default_use_mdn );
318 $delete_folder = 'false' if ( !$delete_folder );
319 $noselect_fix_enable = 'false' if ( !$noselect_fix_enable );
320 $frame_top = "_top" if ( !$frame_top );
321 $provider_uri = '' if ( !$provider_uri );
322 $provider_name = '' if ( !$provider_name );
323 $edit_identity = 'true' if ( !$edit_identity );
324 $edit_name = 'true' if ( !$edit_name );
325 $allow_thread_sort = 'false' if ( !$allow_thread_sort );
326 $allow_server_sort = 'false' if ( !$allow_server_sort );
327 $no_list_for_subscribe = 'false' if ( !$no_list_for_subscribe );
328 $allow_charset_search = 'true' if ( !$allow_charset_search );
329 $allow_advanced_search = 0 if ( !$allow_advanced_search) ;
330 $prefs_user_field = 'user' if ( !$prefs_user_field );
331 $prefs_key_field = 'prefkey' if ( !$prefs_key_field );
332 $prefs_val_field = 'prefval' if ( !$prefs_val_field );
333 $use_smtp_tls= 'false' if ( !$use_smtp_tls);
334 $smtp_auth_mech = 'none' if ( !$smtp_auth_mech );
335 $use_imap_tls = 'false' if ( !$use_imap_tls );
336 $imap_auth_mech = 'login' if ( !$imap_auth_mech );
337 $session_name = 'SQMSESSID' if ( !$session_name );
338 $skip_SM_header = 'false' if ( !$skip_SM_header );
339 $default_use_javascript_addr_book = 'false' if (! $default_use_javascript_addr_book);
340 # since 1.5.0
341 $show_alternative_names = 'false' if ( !$show_alternative_names );
342 # $available_languages option available only in 1.5.0. removed due to $languages
343 # implementation changes. options are provided by limit_languages plugin
344 # $available_languages = 'all' if ( !$available_languages );
345 $aggressive_decoding = 'false' if ( !$aggressive_decoding );
346 $advanced_tree = 'false' if ( !$advanced_tree );
347 $use_php_recode = 'false' if ( !$use_php_recode );
348 $use_php_iconv = 'false' if ( !$use_php_iconv );
349 # since 1.5.1
350 $use_icons = 'false' if ( !$use_icons );
351 $use_iframe = 'false' if ( !$use_iframe );
352 $lossy_encoding = 'false' if ( !$lossy_encoding );
353 $allow_remote_configtest = 'false' if ( !$allow_remote_configtest );
354 $addrbook_global_table = 'global_abook' if ( !$addrbook_global_table );
355 $addrbook_global_writeable = 'false' if ( !$addrbook_global_writeable );
356 $addrbook_global_listing = 'false' if ( !$addrbook_global_listing );
357 $abook_global_file = '' if ( !$abook_global_file);
358 $abook_global_file_writeable = 'false' if ( !$abook_global_file_writeable);
359 $abook_global_file_listing = 'true' if ( !$abook_global_file_listing );
360 $encode_header_key = '' if ( !$encode_header_key );
361 $hide_auth_header = 'false' if ( !$hide_auth_header );
362 $time_zone_type = '0' if ( !$time_zone_type );
363 $prefs_user_size = 128 if ( !$prefs_user_size );
364 $prefs_key_size = 64 if ( !$prefs_key_size );
365 $prefs_val_size = 65536 if ( !$prefs_val_size );
366
367 if ( $ARGV[0] eq '--install-plugin' ) {
368 print "Activating plugin " . $ARGV[1] . "\n";
369 push @plugins, $ARGV[1];
370 save_data();
371 exit(0);
372 } elsif ( $ARGV[0] eq '--remove-plugin' ) {
373 print "Removing plugin " . $ARGV[1] . "\n";
374 foreach $plugin (@plugins) {
375 if ( $plugin ne $ARGV[1] ) {
376 push @newplugins, $plugin;
377 }
378 }
379 @plugins = @newplugins;
380 save_data();
381 exit(0);
382 }
383
384 #####################################################################################
385 if ( $config_use_color == 1 ) {
386 $WHT = "\x1B[37;1m";
387 $NRM = "\x1B[0m";
388 } else {
389 $WHT = "";
390 $NRM = "";
391 $config_use_color = 2;
392 }
393
394 while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
395 clear_screen();
396 print $WHT. "SquirrelMail Configuration : " . $NRM;
397 if ( $config == 1 ) { print "Read: config.php"; }
398 elsif ( $config == 2 ) { print "Read: config_default.php"; }
399 print " ($print_config_version)\n";
400 print "---------------------------------------------------------\n";
401
402 if ( $menu == 0 ) {
403 print $WHT. "Main Menu --\n" . $NRM;
404 print "1. Organization Preferences\n";
405 print "2. Server Settings\n";
406 print "3. Folder Defaults\n";
407 print "4. General Options\n";
408 print "5. Themes\n";
409 print "6. Address Books\n";
410 print "7. Message of the Day (MOTD)\n";
411 print "8. Plugins\n";
412 print "9. Database\n";
413 print "10. Language settings\n";
414 print "11. Tweaks\n";
415 print "\n";
416 print "D. Set pre-defined settings for specific IMAP servers\n";
417 print "\n";
418 } elsif ( $menu == 1 ) {
419 print $WHT. "Organization Preferences\n" . $NRM;
420 print "1. Organization Name : $WHT$org_name$NRM\n";
421 print "2. Organization Logo : $WHT$org_logo$NRM\n";
422 print "3. Org. Logo Width/Height : $WHT($org_logo_width/$org_logo_height)$NRM\n";
423 print "4. Organization Title : $WHT$org_title$NRM\n";
424 print "5. Signout Page : $WHT$signout_page$NRM\n";
425 print "6. Top Frame : $WHT$frame_top$NRM\n";
426 print "7. Provider link : $WHT$provider_uri$NRM\n";
427 print "8. Provider name : $WHT$provider_name$NRM\n";
428
429 print "\n";
430 print "R Return to Main Menu\n";
431 } elsif ( $menu == 2 ) {
432 print $WHT. "Server Settings\n\n" . $NRM;
433 print $WHT . "General" . $NRM . "\n";
434 print "-------\n";
435 print "1. Domain : $WHT$domain$NRM\n";
436 print "2. Invert Time : $WHT$invert_time$NRM\n";
437 print "3. Sendmail or SMTP : $WHT";
438 if ( lc($useSendmail) eq 'true' ) {
439 print "Sendmail";
440 } else {
441 print "SMTP";
442 }
443 print "$NRM\n";
444 print "\n";
445
446 if ( $show_imap_settings ) {
447 print $WHT . "IMAP Settings". $NRM . "\n--------------\n";
448 print "4. IMAP Server : $WHT$imapServerAddress$NRM\n";
449 print "5. IMAP Port : $WHT$imapPort$NRM\n";
450 print "6. Authentication type : $WHT$imap_auth_mech$NRM\n";
451 print "7. Secure IMAP (TLS) : $WHT$use_imap_tls$NRM\n";
452 print "8. Server software : $WHT$imap_server_type$NRM\n";
453 print "9. Delimiter : $WHT$optional_delimiter$NRM\n";
454 print "\n";
455 } elsif ( $show_smtp_settings ) {
456 if ( lc($useSendmail) eq 'true' ) {
457 print $WHT . "Sendmail" . $NRM . "\n--------\n";
458 print "4. Sendmail Path : $WHT$sendmail_path$NRM\n";
459 print "5. Header encryption key : $WHT$encode_header_key$NRM\n";
460 print "\n";
461 } else {
462 print $WHT . "SMTP Settings" . $NRM . "\n-------------\n";
463 print "4. SMTP Server : $WHT$smtpServerAddress$NRM\n";
464 print "5. SMTP Port : $WHT$smtpPort$NRM\n";
465 print "6. POP before SMTP : $WHT$pop_before_smtp$NRM\n";
466 print "7. SMTP Authentication : $WHT$smtp_auth_mech$NRM\n";
467 print "8. Secure SMTP (TLS) : $WHT$use_smtp_tls$NRM\n";
468 print "9. Header encryption key : $WHT$encode_header_key$NRM\n";
469 print "\n";
470 }
471 }
472
473 if ($show_imap_settings == 0) {
474 print "A. Update IMAP Settings : ";
475 print "$WHT$imapServerAddress$NRM:";
476 print "$WHT$imapPort$NRM ";
477 print "($WHT$imap_server_type$NRM)\n";
478 }
479 if ($show_smtp_settings == 0) {
480 if ( lc($useSendmail) eq 'true' ) {
481 print "B. Change Sendmail Config : $WHT$sendmail_path$NRM\n";
482 } else {
483 print "B. Update SMTP Settings : ";
484 print "$WHT$smtpServerAddress$NRM:";
485 print "$WHT$smtpPort$NRM\n";
486 }
487 }
488 if ( $show_smtp_settings || $show_imap_settings )
489 {
490 print "H. Hide " .
491 ($show_imap_settings ? "IMAP Server" :
492 (lc($useSendmail) eq 'true') ? "Sendmail" : "SMTP") . " Settings\n";
493 }
494
495 print "\n";
496 print "R Return to Main Menu\n";
497 } elsif ( $menu == 3 ) {
498 print $WHT. "Folder Defaults\n" . $NRM;
499 print "1. Default Folder Prefix : $WHT$default_folder_prefix$NRM\n";
500 print "2. Show Folder Prefix Option : $WHT$show_prefix_option$NRM\n";
501 print "3. Trash Folder : $WHT$trash_folder$NRM\n";
502 print "4. Sent Folder : $WHT$sent_folder$NRM\n";
503 print "5. Drafts Folder : $WHT$draft_folder$NRM\n";
504 print "6. By default, move to trash : $WHT$default_move_to_trash$NRM\n";
505 print "7. By default, move to sent : $WHT$default_move_to_sent$NRM\n";
506 print "8. By default, save as draft : $WHT$default_save_as_draft$NRM\n";
507 print "9. List Special Folders First : $WHT$list_special_folders_first$NRM\n";
508 print "10. Show Special Folders Color : $WHT$use_special_folder_color$NRM\n";
509 print "11. Auto Expunge : $WHT$auto_expunge$NRM\n";
510 print "12. Default Sub. of INBOX : $WHT$default_sub_of_inbox$NRM\n";
511 print "13. Show 'Contain Sub.' Option : $WHT$show_contain_subfolders_option$NRM\n";
512 print "14. Default Unseen Notify : $WHT$default_unseen_notify$NRM\n";
513 print "15. Default Unseen Type : $WHT$default_unseen_type$NRM\n";
514 print "16. Auto Create Special Folders : $WHT$auto_create_special$NRM\n";
515 print "17. Folder Delete Bypasses Trash : $WHT$delete_folder$NRM\n";
516 print "18. Enable /NoSelect folder fix : $WHT$noselect_fix_enable$NRM\n";
517 print "\n";
518 print "R Return to Main Menu\n";
519 } elsif ( $menu == 4 ) {
520 print $WHT. "General Options\n" . $NRM;
521 print "1. Data Directory : $WHT$data_dir$NRM\n";
522 print "2. Attachment Directory : $WHT$attachment_dir$NRM\n";
523 print "3. Directory Hash Level : $WHT$dir_hash_level$NRM\n";
524 print "4. Default Left Size : $WHT$default_left_size$NRM\n";
525 print "5. Usernames in Lowercase : $WHT$force_username_lowercase$NRM\n";
526 print "6. Allow use of priority : $WHT$default_use_priority$NRM\n";
527 print "7. Hide SM attributions : $WHT$hide_sm_attributions$NRM\n";
528 print "8. Allow use of receipts : $WHT$default_use_mdn$NRM\n";
529 print "9. Allow editing of identity : $WHT$edit_identity$NRM\n";
530 print " Allow editing of name : $WHT$edit_name$NRM\n";
531 print " Remove username from header : $WHT$hide_auth_header$NRM\n";
532 print "10. Allow server thread sort : $WHT$allow_thread_sort$NRM\n";
533 print "11. Allow server-side sorting : $WHT$allow_server_sort$NRM\n";
534 print "12. Allow server charset search : $WHT$allow_charset_search$NRM\n";
535 print "13. Allow advanced search : $WHT$allow_advanced_search$NRM\n";
536 print "14. PHP session name : $WHT$session_name$NRM\n";
537 print "15. Time zone configuration : $WHT$time_zone_type$NRM\n";
538 print "\n";
539 print "R Return to Main Menu\n";
540 } elsif ( $menu == 5 ) {
541 print $WHT. "Themes\n" . $NRM;
542 print "1. Change Themes\n";
543 for ( $count = 0 ; $count <= $#theme_name/2 ; $count++ ) {
544 $temp_name = $theme_name[$count*2];
545 printf " %s%*s %s\n", $temp_name,
546 40 - length($temp_name), " ",
547 $theme_name[($count*2)+1];
548 }
549 print "2. CSS File : $WHT$theme_css$NRM\n";
550 print "\n";
551 print "R Return to Main Menu\n";
552 } elsif ( $menu == 6 ) {
553 print $WHT. "Address Books\n" . $NRM;
554 print "1. Change LDAP Servers\n";
555 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
556 print " > $ldap_host[$count]\n";
557 }
558 print "2. Use Javascript address book search : $WHT$default_use_javascript_addr_book$NRM\n";
559 print "3. Global address book file : $WHT$abook_global_file$NRM\n";
560 print "4. Allow writing into global file address book : $WHT$abook_global_file_writeable$NRM\n";
561 print "5. Allow listing of global file address book : $WHT$abook_global_file_listing$NRM\n";
562 print "\n";
563 print "R Return to Main Menu\n";
564 } elsif ( $menu == 7 ) {
565 print $WHT. "Message of the Day (MOTD)\n" . $NRM;
566 print "\n$motd\n";
567 print "\n";
568 print "1 Edit the MOTD\n";
569 print "\n";
570 print "R Return to Main Menu\n";
571 } elsif ( $menu == 8 ) {
572 print $WHT. "Plugins\n" . $NRM;
573 print " Installed Plugins\n";
574 $num = 0;
575 for ( $count = 0 ; $count <= $#plugins ; $count++ ) {
576 $num = $count + 1;
577 print " $num. $plugins[$count]\n";
578 }
579 print "\n Available Plugins:\n";
580 opendir( DIR, "../plugins" );
581 @files = readdir(DIR);
582 $pos = 0;
583 @unused_plugins = ();
584 for ( $i = 0 ; $i <= $#files ; $i++ ) {
585 if ( -d "../plugins/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
586 $match = 0;
587 for ( $k = 0 ; $k <= $#plugins ; $k++ ) {
588 if ( $plugins[$k] eq $files[$i] ) {
589 $match = 1;
590 }
591 }
592 if ( $match == 0 ) {
593 $unused_plugins[$pos] = $files[$i];
594 $pos++;
595 }
596 }
597 }
598
599 for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
600 $num = $num + 1;
601 print " $num. $unused_plugins[$i]\n";
602 }
603 closedir DIR;
604
605 print "\n";
606 print "R Return to Main Menu\n";
607 } elsif ( $menu == 9 ) {
608 print $WHT. "Database\n" . $NRM;
609 print "1. DSN for Address Book : $WHT$addrbook_dsn$NRM\n";
610 print "2. Table for Address Book : $WHT$addrbook_table$NRM\n";
611 print "\n";
612 print "3. DSN for Preferences : $WHT$prefs_dsn$NRM\n";
613 print "4. Table for Preferences : $WHT$prefs_table$NRM\n";
614 print "5. Field for username : $WHT$prefs_user_field$NRM ($prefs_user_size)\n";
615 print "6. Field for prefs key : $WHT$prefs_key_field$NRM ($prefs_key_size)\n";
616 print "7. Field for prefs value : $WHT$prefs_val_field$NRM ($prefs_val_size)\n";
617 print "\n";
618 print "8. DSN for Global Address Book : $WHT$addrbook_global_dsn$NRM\n";
619 print "9. Table for Global Address Book : $WHT$addrbook_global_table$NRM\n";
620 print "10. Allow writing into Global Address Book : $WHT$addrbook_global_writeable$NRM\n";
621 print "11. Allow listing of Global Address Book : $WHT$addrbook_global_listing$NRM\n";
622 print "\n";
623 print "R Return to Main Menu\n";
624 } elsif ( $menu == 10 ) {
625 print $WHT. "Language settings\n" . $NRM;
626 print "1. Default Language : $WHT$squirrelmail_default_language$NRM\n";
627 print "2. Default Charset : $WHT$default_charset$NRM\n";
628 print "3. Show alternative language names : $WHT$show_alternative_names$NRM\n";
629 print "4. Enable aggressive decoding : $WHT$aggressive_decoding$NRM\n";
630 print "5. Enable lossy encoding : $WHT$lossy_encoding$NRM\n";
631 print "\n";
632 print "R Return to Main Menu\n";
633 } elsif ( $menu == 11 ) {
634 print $WHT. "Interface tweaks\n" . $NRM;
635 print "1. Advanced tree : $WHT$advanced_tree$NRM\n";
636 print "2. Display html mails in iframe : $WHT$use_iframe$NRM\n";
637 print "3. Use Icons : $WHT$use_icons$NRM\n";
638 print "\n";
639 print $WHT. "PHP tweaks\n" . $NRM;
640 print "4. Use php recode functions : $WHT$use_php_recode$NRM\n";
641 print "5. Use php iconv functions : $WHT$use_php_iconv$NRM\n";
642 print "\n";
643 print $WHT. "Configuration tweaks\n" . $NRM;
644 print "6. Allow remote configtest : $WHT$allow_remote_configtest$NRM\n";
645 print "\n";
646 print "R Return to Main Menu\n";
647 }
648 if ( $config_use_color == 1 ) {
649 print "C Turn color off\n";
650 } else {
651 print "C Turn color on\n";
652 }
653 print "S Save data\n";
654 print "Q Quit\n";
655
656 print "\n";
657 print "Command >> " . $WHT;
658 $command = <STDIN>;
659 $command =~ s/[\n\r]//g;
660 $command =~ tr/A-Z/a-z/;
661 print "$NRM\n";
662
663 # Read the commands they entered.
664 if ( $command eq "r" ) {
665 $menu = 0;
666 } elsif ( $command eq "s" ) {
667 save_data();
668 print "Press enter to continue...";
669 $tmp = <STDIN>;
670 $saved = 1;
671 } elsif ( ( $command eq "q" ) && ( $saved == 0 ) ) {
672 print "You have not saved your data.\n";
673 print "Save? [" . $WHT . "Y" . $NRM . "/n]: ";
674 $save = <STDIN>;
675 if ( ( $save =~ /^y/i ) || ( $save =~ /^\s*$/ ) ) {
676 save_data();
677 }
678 } elsif ( $command eq "c" ) {
679 if ( $config_use_color == 1 ) {
680 $config_use_color = 2;
681 $WHT = "";
682 $NRM = "";
683 } else {
684 $config_use_color = 1;
685 $WHT = "\x1B[37;1m";
686 $NRM = "\x1B[0m";
687 }
688 } elsif ( $command eq "d" && $menu == 0 ) {
689 set_defaults();
690 } else {
691 $saved = 0;
692 if ( $menu == 0 ) {
693 if ( ( $command > 0 ) && ( $command < 12 ) ) {
694 $menu = $command;
695 }
696 } elsif ( $menu == 1 ) {
697 if ( $command == 1 ) { $org_name = command1(); }
698 elsif ( $command == 2 ) { $org_logo = command2(); }
699 elsif ( $command == 3 ) { ($org_logo_width,$org_logo_height) = command2a(); }
700 elsif ( $command == 4 ) { $org_title = command3(); }
701 elsif ( $command == 5 ) { $signout_page = command4(); }
702 elsif ( $command == 6 ) { $frame_top = command6(); }
703 elsif ( $command == 7 ) { $provider_uri = command7(); }
704 elsif ( $command == 8 ) { $provider_name = command8(); }
705
706 } elsif ( $menu == 2 ) {
707 if ( $command eq "a" ) { $show_imap_settings = 1; $show_smtp_settings = 0; }
708 elsif ( $command eq "b" ) { $show_imap_settings = 0; $show_smtp_settings = 1; }
709 elsif ( $command eq "h" ) { $show_imap_settings = 0; $show_smtp_settings = 0; }
710 elsif ( $command <= 3 ) {
711 if ( $command == 1 ) { $domain = command11(); }
712 elsif ( $command == 2 ) { $invert_time = command110(); }
713 elsif ( $command == 3 ) { $useSendmail = command14(); }
714 $show_imap_settings = 0; $show_smtp_settings = 0;
715 } elsif ( $show_imap_settings ) {
716 if ( $command == 4 ) { $imapServerAddress = command12(); }
717 elsif ( $command == 5 ) { $imapPort = command13(); }
718 elsif ( $command == 6 ) { $imap_auth_mech = command112a(); }
719 elsif ( $command == 7 ) { $use_imap_tls = command113("IMAP",$use_imap_tls); }
720 elsif ( $command == 8 ) { $imap_server_type = command19(); }
721 elsif ( $command == 9 ) { $optional_delimiter = command111(); }
722 } elsif ( $show_smtp_settings && lc($useSendmail) eq 'true' ) {
723 if ( $command == 4 ) { $sendmail_path = command15(); }
724 elsif ( $command == 5 ) { $encode_header_key = command114(); }
725 } elsif ( $show_smtp_settings ) {
726 if ( $command == 4 ) { $smtpServerAddress = command16(); }
727 elsif ( $command == 5 ) { $smtpPort = command17(); }
728 elsif ( $command == 6 ) { $pop_before_smtp = command18a(); }
729 elsif ( $command == 7 ) { $smtp_auth_mech = command112b(); }
730 elsif ( $command == 8 ) { $use_smtp_tls = command113("SMTP",$use_smtp_tls); }
731 elsif ( $command == 9 ) { $encode_header_key = command114(); }
732 }
733 } elsif ( $menu == 3 ) {
734 if ( $command == 1 ) { $default_folder_prefix = command21(); }
735 elsif ( $command == 2 ) { $show_prefix_option = command22(); }
736 elsif ( $command == 3 ) { $trash_folder = command23a(); }
737 elsif ( $command == 4 ) { $sent_folder = command23b(); }
738 elsif ( $command == 5 ) { $draft_folder = command23c(); }
739 elsif ( $command == 6 ) { $default_move_to_trash = command24a(); }
740 elsif ( $command == 7 ) { $default_move_to_sent = command24b(); }
741 elsif ( $command == 8 ) { $default_save_as_draft = command24c(); }
742 elsif ( $command == 9 ) { $list_special_folders_first = command27(); }
743 elsif ( $command == 10 ) { $use_special_folder_color = command28(); }
744 elsif ( $command == 11 ) { $auto_expunge = command29(); }
745 elsif ( $command == 12 ) { $default_sub_of_inbox = command210(); }
746 elsif ( $command == 13 ) { $show_contain_subfolders_option = command211(); }
747 elsif ( $command == 14 ) { $default_unseen_notify = command212(); }
748 elsif ( $command == 15 ) { $default_unseen_type = command213(); }
749 elsif ( $command == 16 ) { $auto_create_special = command214(); }
750 elsif ( $command == 17 ) { $delete_folder = command215(); }
751 elsif ( $command == 18 ) { $noselect_fix_enable = command216(); }
752 } elsif ( $menu == 4 ) {
753 if ( $command == 1 ) { $data_dir = command33a(); }
754 elsif ( $command == 2 ) { $attachment_dir = command33b(); }
755 elsif ( $command == 3 ) { $dir_hash_level = command33c(); }
756 elsif ( $command == 4 ) { $default_left_size = command35(); }
757 elsif ( $command == 5 ) { $force_username_lowercase = command36(); }
758 elsif ( $command == 6 ) { $default_use_priority = command37(); }
759 elsif ( $command == 7 ) { $hide_sm_attributions = command38(); }
760 elsif ( $command == 8 ) { $default_use_mdn = command39(); }
761 elsif ( $command == 9 ) { $edit_identity = command310(); }
762 elsif ( $command == 10 ) { $allow_thread_sort = command312(); }
763 elsif ( $command == 11 ) { $allow_server_sort = command313(); }
764 elsif ( $command == 12 ) { $allow_charset_search = command314(); }
765 elsif ( $command == 13 ) { $allow_advanced_search = command316(); }
766 elsif ( $command == 14 ) { $session_name = command317(); }
767 elsif ( $command == 15 ) { $time_zone_type = command318(); }
768 } elsif ( $menu == 5 ) {
769 if ( $command == 1 ) { command41(); }
770 elsif ( $command == 2 ) { $theme_css = command42(); }
771 } elsif ( $menu == 6 ) {
772 if ( $command == 1 ) { command61(); }
773 elsif ( $command == 2 ) { command62(); }
774 elsif ( $command == 3 ) { $abook_global_file=command63(); }
775 elsif ( $command == 4 ) { command64(); }
776 elsif ( $command == 5 ) { command65(); }
777 } elsif ( $menu == 7 ) {
778 if ( $command == 1 ) { $motd = command71(); }
779 } elsif ( $menu == 8 ) {
780 if ( $command =~ /^[0-9]+/ ) { @plugins = command81(); }
781 } elsif ( $menu == 9 ) {
782 if ( $command == 1 ) { $addrbook_dsn = command91(); }
783 elsif ( $command == 2 ) { $addrbook_table = command92(); }
784 elsif ( $command == 3 ) { $prefs_dsn = command93(); }
785 elsif ( $command == 4 ) { $prefs_table = command94(); }
786 elsif ( $command == 5 ) { $prefs_user_field = command95(); }
787 elsif ( $command == 6 ) { $prefs_key_field = command96(); }
788 elsif ( $command == 7 ) { $prefs_val_field = command97(); }
789 elsif ( $command == 8 ) { $addrbook_global_dsn = command98(); }
790 elsif ( $command == 9 ) { $addrbook_global_table = command99(); }
791 elsif ( $command == 10 ) { $addrbook_global_writeable = command910(); }
792 elsif ( $command == 11 ) { $addrbook_global_listing = command911(); }
793 } elsif ( $menu == 10 ) {
794 if ( $command == 1 ) { $squirrelmail_default_language = commandA1(); }
795 elsif ( $command == 2 ) { $default_charset = commandA2(); }
796 elsif ( $command == 3 ) { $show_alternative_names = commandA3(); }
797 elsif ( $command == 4 ) { $aggressive_decoding = commandA4(); }
798 elsif ( $command == 5 ) { $lossy_encoding = commandA5(); }
799 } elsif ( $menu == 11 ) {
800 if ( $command == 1 ) { $advanced_tree = commandB1(); }
801 if ( $command == 2 ) { $use_iframe = commandB2(); }
802 elsif ( $command == 3 ) { $use_icons = commandB3(); }
803 elsif ( $command == 4 ) { $use_php_recode = commandB4(); }
804 elsif ( $command == 5 ) { $use_php_iconv = commandB5(); }
805 elsif ( $command == 6 ) { $allow_remote_configtest = commandB6(); }
806 }
807 }
808 }
809
810 # we exit here
811 print "\nExiting conf.pl.\n".
812 "You might want to test your configuration by browsing to\n".
813 "http://your-squirrelmail-location/src/configtest.php\n".
814 "Happy SquirrelMailing!\n\n";
815
816
817 ####################################################################################
818
819 # org_name
820 sub command1 {
821 print "We have tried to make the name SquirrelMail as transparent as\n";
822 print "possible. If you set up an organization name, most places where\n";
823 print "SquirrelMail would take credit will be credited to your organization.\n";
824 print "\n";
825 print "If your Organization Name includes a '\$', please precede it with a \\. \n";
826 print "Other '\$' will be considered the beginning of a variable that\n";
827 print "must be defined before the \$org_name is printed.\n";
828 print "\n";
829 print "[$WHT$org_name$NRM]: $WHT";
830 $new_org_name = <STDIN>;
831 if ( $new_org_name eq "\n" ) {
832 $new_org_name = $org_name;
833 } else {
834 $new_org_name =~ s/[\r\n]//g;
835 $new_org_name =~ s/\"/&quot;/g;
836 }
837 return $new_org_name;
838 }
839
840 # org_logo
841 sub command2 {
842 print "Your organization's logo is an image that will be displayed at\n";
843 print "different times throughout SquirrelMail. ";
844 print "\n";
845 print "Please be aware of the following: \n";
846 print " - Relative URLs are relative to the config dir\n";
847 print " to use the default logo, use ../images/sm_logo.png\n";
848 print " - To specify a logo defined outside the SquirrelMail source tree\n";
849 print " use the absolute URL the webserver would use to include the file\n";
850 print " e.g. http://www.example.com/images/mylogo.gif or /images/mylogo.jpg\n";
851 print "\n";
852 print "[$WHT$org_logo$NRM]: $WHT";
853 $new_org_logo = <STDIN>;
854 if ( $new_org_logo eq "\n" ) {
855 $new_org_logo = $org_logo;
856 } else {
857 $new_org_logo =~ s/[\r\n]//g;
858 }
859 return $new_org_logo;
860 }
861
862 # org_logo_width
863 sub command2a {
864 print "Your organization's logo is an image that will be displayed at\n";
865 print "different times throughout SquirrelMail. Width\n";
866 print "and Height of your logo image. Use '0' to disable.\n";
867 print "\n";
868 print "Width: [$WHT$org_logo_width$NRM]: $WHT";
869 $new_org_logo_width = <STDIN>;
870 $new_org_logo_width =~ tr/0-9//cd; # only want digits!
871 if ( $new_org_logo_width eq '' ) {
872 $new_org_logo_width = $org_logo_width;
873 }
874 if ( $new_org_logo_width > 0 ) {
875 print "Height: [$WHT$org_logo_height$NRM]: $WHT";
876 $new_org_logo_height = <STDIN>;
877 $new_org_logo_height =~ tr/0-9//cd; # only want digits!
878 if( $new_org_logo_height eq '' ) {
879 $new_org_logo_height = $org_logo_height;
880 }
881 } else {
882 $new_org_logo_height = 0;
883 }
884 return ($new_org_logo_width, $new_org_logo_height);
885 }
886
887 # org_title
888 sub command3 {
889 print "A title is what is displayed at the top of the browser window in\n";
890 print "the titlebar. Usually this will end up looking something like:\n";
891 print "\"Netscape: $org_title\"\n";
892 print "\n";
893 print "If your Organization Title includes a '\$', please precede it with a \\. \n";
894 print "Other '\$' will be considered the beginning of a variable that\n";
895 print "must be defined before the \$org_title is printed.\n";
896 print "\$version, for example can be used, and will print the\n";
897 print "string representing the current SquirrelMail version.\n";
898 print "\n";
899 print "[$WHT$org_title$NRM]: $WHT";
900 $new_org_title = <STDIN>;
901 if ( $new_org_title eq "\n" ) {
902 $new_org_title = $org_title;
903 } else {
904 $new_org_title =~ s/[\r\n]//g;
905 $new_org_title =~ s/\"/\'/g;
906 }
907 return $new_org_title;
908 }
909
910 # signout_page
911 sub command4 {
912 print "When users click the Sign Out button they will be logged out and\n";
913 print "then sent to signout_page. If signout_page is left empty,\n";
914 print "(hit space and then return) they will be taken, as normal,\n";
915 print "to the default and rather sparse SquirrelMail signout page.\n";
916 print "\n";
917 print "[$WHT$signout_page$NRM]: $WHT";
918 $new_signout_page = <STDIN>;
919 if ( $new_signout_page eq "\n" ) {
920 $new_signout_page = $signout_page;
921 } else {
922 $new_signout_page =~ s/[\r\n]//g;
923 $new_signout_page =~ s/^\s+$//g;
924 }
925 return $new_signout_page;
926 }
927
928 # Default top frame
929 sub command6 {
930 print "SquirrelMail defaults to using the whole of the browser window.\n";
931 print "This allows you to keep it within a specified frame. The default\n";
932 print "is '_top'\n";
933 print "\n";
934 print "[$WHT$frame_top$NRM]: $WHT";
935 $new_frame_top = <STDIN>;
936 if ( $new_frame_top eq "\n" ) {
937 $new_frame_top = '_top';
938 } else {
939 $new_frame_top =~ s/[\r\n]//g;
940 $new_frame_top =~ s/^\s+$//g;
941 }
942 return $new_frame_top;
943 }
944
945 # Default link to provider
946 sub command7 {
947 print "Here you can set the link on the right of the page.\n";
948 print "If empty, it will link to the SquirrelMail About page.\n";
949 print "\n";
950 print "[$WHT$provider_uri$NRM]: $WHT";
951 $new_provider_uri = <STDIN>;
952 if ( $new_provider_uri eq "\n" ) {
953 $new_provider_uri = '';
954 } else {
955 $new_provider_uri =~ s/[\r\n]//g;
956 $new_provider_uri =~ s/^\s+$//g;
957 }
958 return $new_provider_uri;
959 }
960
961 sub command8 {
962 print "Here you can set the name of the link on the right of the page.\n";
963 print "The default is 'SquirrelMail/'\n";
964 print "\n";
965 print "[$WHT$provider_name$NRM]: $WHT";
966 $new_provider_name = <STDIN>;
967 if ( $new_provider_name eq "\n" ) {
968 $new_provider_name = 'SquirrelMail';
969 } else {
970 $new_provider_name =~ s/[\r\n]//g;
971 $new_provider_name =~ s/^\s+$//g;
972 }
973 return $new_provider_name;
974 }
975
976 ####################################################################################
977
978 # domain
979 sub command11 {
980 print "The domain name is the suffix at the end of all email addresses. If\n";
981 print "for example, your email address is jdoe\@example.com, then your domain\n";
982 print "would be example.com.\n";
983 print "\n";
984 print "[$WHT$domain$NRM]: $WHT";
985 $new_domain = <STDIN>;
986 if ( $new_domain eq "\n" ) {
987 $new_domain = $domain;
988 } else {
989 $new_domain =~ s/[\r\n]//g;
990 }
991 return $new_domain;
992 }
993
994 # imapServerAddress
995 sub command12 {
996 print "This is the hostname where your IMAP server can be contacted.\n";
997 print "[$WHT$imapServerAddress$NRM]: $WHT";
998 $new_imapServerAddress = <STDIN>;
999 if ( $new_imapServerAddress eq "\n" ) {
1000 $new_imapServerAddress = $imapServerAddress;
1001 } else {
1002 $new_imapServerAddress =~ s/[\r\n]//g;
1003 }
1004 return $new_imapServerAddress;
1005 }
1006
1007 # imapPort
1008 sub command13 {
1009 print "This is the port that your IMAP server is on. Usually this is 143.\n";
1010 print "[$WHT$imapPort$NRM]: $WHT";
1011 $new_imapPort = <STDIN>;
1012 if ( $new_imapPort eq "\n" ) {
1013 $new_imapPort = $imapPort;
1014 } else {
1015 $new_imapPort =~ s/[\r\n]//g;
1016 }
1017 return $new_imapPort;
1018 }
1019
1020 # useSendmail
1021 sub command14 {
1022 print "You now need to choose the method that you will use for sending\n";
1023 print "messages in SquirrelMail. You can either connect to an SMTP server\n";
1024 print "or use sendmail directly.\n";
1025 if ( lc($useSendmail) eq 'true' ) {
1026 $default_value = "1";
1027 } else {
1028 $default_value = "2";
1029 }
1030 print "\n";
1031 print " 1. Sendmail\n";
1032 print " 2. SMTP\n";
1033 print "Your choice [1/2] [$WHT$default_value$NRM]: $WHT";
1034 $use_sendmail = <STDIN>;
1035 if ( ( $use_sendmail =~ /^1\n/i )
1036 || ( ( $use_sendmail =~ /^\n/ ) && ( $default_value eq "1" ) ) ) {
1037 $useSendmail = 'true';
1038 } else {
1039 $useSendmail = 'false';
1040 }
1041 return $useSendmail;
1042 }
1043
1044 # sendmail_path
1045 sub command15 {
1046 if ( $sendmail_path[0] !~ /./ ) {
1047 $sendmail_path = "/usr/sbin/sendmail";
1048 }
1049 print "Specify where the sendmail executable is located. Usually /usr/sbin/sendmail\n";
1050 print "[$WHT$sendmail_path$NRM]: $WHT";
1051 $new_sendmail_path = <STDIN>;
1052 if ( $new_sendmail_path eq "\n" ) {
1053 $new_sendmail_path = $sendmail_path;
1054 } else {
1055 $new_sendmail_path =~ s/[\r\n]//g;
1056 }
1057 return $new_sendmail_path;
1058 }
1059
1060 # smtpServerAddress
1061 sub command16 {
1062 print "This is the hostname of your SMTP server.\n";
1063 print "[$WHT$smtpServerAddress$NRM]: $WHT";
1064 $new_smtpServerAddress = <STDIN>;
1065 if ( $new_smtpServerAddress eq "\n" ) {
1066 $new_smtpServerAddress = $smtpServerAddress;
1067 } else {
1068 $new_smtpServerAddress =~ s/[\r\n]//g;
1069 }
1070 return $new_smtpServerAddress;
1071 }
1072
1073 # smtpPort
1074 sub command17 {
1075 print "This is the port to connect to for SMTP. Usually 25.\n";
1076 print "[$WHT$smtpPort$NRM]: $WHT";
1077 $new_smtpPort = <STDIN>;
1078 if ( $new_smtpPort eq "\n" ) {
1079 $new_smtpPort = $smtpPort;
1080 } else {
1081 $new_smtpPort =~ s/[\r\n]//g;
1082 }
1083 return $new_smtpPort;
1084 }
1085
1086 # authenticated server
1087 sub command18 {
1088 return;
1089 # This sub disabled by tassium - it has been replaced with smtp_auth_mech
1090 print "Do you wish to use an authenticated SMTP server? Your server must\n";
1091 print "support this in order for SquirrelMail to work with it. We implemented\n";
1092 print "it according to RFC 2554.\n";
1093
1094 $YesNo = 'n';
1095 $YesNo = 'y' if ( lc($use_authenticated_smtp) eq 'true' );
1096
1097 print "Use authenticated SMTP server (y/n) [$WHT$YesNo$NRM]: $WHT";
1098
1099 $new_use_authenticated_smtp = <STDIN>;
1100 $new_use_authenticated_smtp =~ tr/yn//cd;
1101 return 'true' if ( $new_use_authenticated_smtp eq "y" );
1102 return 'false' if ( $new_use_authenticated_smtp eq "n" );
1103 return $use_authenticated_smtp;
1104 }
1105
1106 # pop before SMTP
1107 sub command18a {
1108 print "Do you wish to use POP3 before SMTP? Your server must\n";
1109 print "support this in order for SquirrelMail to work with it.\n";
1110
1111 $YesNo = 'n';
1112 $YesNo = 'y' if ( lc($pop_before_smtp) eq 'true' );
1113
1114 print "Use pop before SMTP (y/n) [$WHT$YesNo$NRM]: $WHT";
1115
1116 $new_pop_before_smtp = <STDIN>;
1117 $new_pop_before_smtp =~ tr/yn//cd;
1118 return 'true' if ( $new_pop_before_smtp eq "y" );
1119 return 'false' if ( $new_pop_before_smtp eq "n" );
1120 return $pop_before_smtp;
1121 }
1122
1123 # imap_server_type
1124 sub command19 {
1125 print "Each IMAP server has its own quirks. As much as we tried to stick\n";
1126 print "to standards, it doesn't help much if the IMAP server doesn't follow\n";
1127 print "the same principles. We have made some work-arounds for some of\n";
1128 print "these servers. If you would like to use them, please select your\n";
1129 print "IMAP server. If you do not wish to use these work-arounds, you can\n";
1130 print "set this to \"other\", and none will be used.\n";
1131 print " courier = Courier IMAP server\n";
1132 print " cyrus = Cyrus IMAP server\n";
1133 print " dovecot = Dovecot Secure IMAP server\n";
1134 print " exchange = Microsoft Exchange IMAP server\n";
1135 print " hmailserver = hMailServer\n";
1136 print " macosx = Mac OS X Mailserver\n";
1137 print " mercury32 = Mercury Mail Transport System\n";
1138 print " uw = University of Washington's IMAP server\n";
1139 print "\n";
1140 print " other = Not one of the above servers\n";
1141 print "\n";
1142 print "[$WHT$imap_server_type$NRM]: $WHT";
1143 $new_imap_server_type = <STDIN>;
1144
1145 if ( $new_imap_server_type eq "\n" ) {
1146 $new_imap_server_type = $imap_server_type;
1147 } else {
1148 $new_imap_server_type =~ s/[\r\n]//g;
1149 }
1150 return $new_imap_server_type;
1151 }
1152
1153 # invert_time
1154 sub command110 {
1155 print "Sometimes the date of messages sent is messed up (off by a few hours\n";
1156 print "on some machines). Typically this happens if the system doesn't support\n";
1157 print "tm_gmtoff. It will happen only if your time zone is \"negative\".\n";
1158 print "This most often occurs on Solaris 7 machines in the United States.\n";
1159 print "By default, this is off. It should be kept off unless problems surface\n";
1160 print "about the time that messages are sent.\n";
1161 print " no = Do NOT fix time -- almost always correct\n";
1162 print " yes = Fix the time for this system\n";
1163
1164 $YesNo = 'n';
1165 $YesNo = 'y' if ( lc($invert_time) eq 'true' );
1166
1167 print "Fix the time for this system (y/n) [$WHT$YesNo$NRM]: $WHT";
1168
1169 $new_invert_time = <STDIN>;
1170 $new_invert_time =~ tr/yn//cd;
1171 return 'true' if ( $new_invert_time eq "y" );
1172 return 'false' if ( $new_invert_time eq "n" );
1173 return $invert_time;
1174 }
1175
1176 sub command111 {
1177 print "This is the delimiter that your IMAP server uses to distinguish between\n";
1178 print "folders. For example, Cyrus uses '.' as the delimiter and a complete\n";
1179 print "folder would look like 'INBOX.Friends.Bob', while UW uses '/' and would\n";
1180 print "look like 'INBOX/Friends/Bob'. Normally this should be left at 'detect'\n";
1181 print "but if you are sure you know what delimiter your server uses, you can\n";
1182 print "specify it here.\n";
1183 print "\nTo have it autodetect the delimiter, set it to 'detect'.\n\n";
1184 print "[$WHT$optional_delimiter$NRM]: $WHT";
1185 $new_optional_delimiter = <STDIN>;
1186
1187 if ( $new_optional_delimiter eq "\n" ) {
1188 $new_optional_delimiter = $optional_delimiter;
1189 } else {
1190 $new_optional_delimiter =~ s/[\r\n]//g;
1191 }
1192 return $new_optional_delimiter;
1193 }
1194 # IMAP authentication type
1195 # Possible values: login, plain, cram-md5, digest-md5
1196 # Now offers to detect supported mechs, assuming server & port are set correctly
1197
1198 sub command112a {
1199 if ($use_imap_tls =~ /^true\b/i) {
1200 print "Auto-detection of login methods is unavailable when using TLS.\n";
1201 } else {
1202 print "If you have already set the hostname and port number, I can try to\n";
1203 print "detect the mechanisms your IMAP server supports.\n";
1204 print "I will try to detect CRAM-MD5 and DIGEST-MD5 support. I can't test\n";
1205 print "for \"login\" or \"plain\" without knowing a username and password.\n";
1206 print "Auto-detecting is optional - you can safely say \"n\" here.\n";
1207 print "\nTry to detect supported mechanisms? [y/N]: ";
1208 $inval=<STDIN>;
1209 chomp($inval);
1210 if ($inval =~ /^y\b/i) {
1211 # Yes, let's try to detect.
1212 print "Trying to detect IMAP capabilities...\n";
1213 my $host = $imapServerAddress . ':'. $imapPort;
1214 print "CRAM-MD5:\t";
1215 my $tmp = detect_auth_support('IMAP',$host,'CRAM-MD5');
1216 if (defined($tmp)) {
1217 if ($tmp eq 'YES') {
1218 print "$WHT SUPPORTED$NRM\n";
1219 } else {
1220 print "$WHT NOT SUPPORTED$NRM\n";
1221 }
1222 } else {
1223 print $WHT . " ERROR DETECTING$NRM\n";
1224 }
1225
1226 print "DIGEST-MD5:\t";
1227 $tmp = detect_auth_support('IMAP',$host,'DIGEST-MD5');
1228 if (defined($tmp)) {
1229 if ($tmp eq 'YES') {
1230 print "$WHT SUPPORTED$NRM\n";
1231 } else {
1232 print "$WHT NOT SUPPORTED$NRM\n";
1233 }
1234 } else {
1235 print $WHT . " ERROR DETECTING$NRM\n";
1236 }
1237
1238 }
1239 }
1240 print "\nWhat authentication mechanism do you want to use for IMAP connections?\n\n";
1241 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1242 print $WHT . "plain" . $NRM . " - SASL PLAIN. If you need this, you already know it.\n";
1243 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext methods.\n";
1244 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1245 print "\n*** YOUR IMAP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n";
1246 print "If you don't understand or are unsure, you probably want \"login\"\n\n";
1247 print "login, plain, cram-md5, or digest-md5 [$WHT$imap_auth_mech$NRM]: $WHT";
1248 $inval=<STDIN>;
1249 chomp($inval);
1250 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || ($inval =~ /^login\b/i) || ($inval =~ /^plain\b/i)) {
1251 return lc($inval);
1252 } else {
1253 # user entered garbage or default value so nothing needs to be set
1254 return $imap_auth_mech;
1255 }
1256 }
1257
1258
1259 # SMTP authentication type
1260 # Possible choices: none, plain, cram-md5, digest-md5
1261 sub command112b {
1262 if ($use_smtp_tls =~ /^true\b/i) {
1263 print "Auto-detection of login methods is unavailable when using TLS.\n";
1264 } else {
1265 print "If you have already set the hostname and port number, I can try to\n";
1266 print "automatically detect some of the mechanisms your SMTP server supports.\n";
1267 print "Auto-detection is *optional* - you can safely say \"n\" here.\n";
1268 print "\nTry to detect auth mechanisms? [y/N]: ";
1269 $inval=<STDIN>;
1270 chomp($inval);
1271 if ($inval =~ /^y\b/i) {
1272 # Yes, let's try to detect.
1273 print "Trying to detect supported methods (SMTP)...\n";
1274
1275 # Special case!
1276 # Check none by trying to relay to junk@microsoft.com
1277 $host = $smtpServerAddress . ':' . $smtpPort;
1278 use IO::Socket;
1279 my $sock = IO::Socket::INET->new($host);
1280 print "Testing none:\t\t$WHT";
1281 if (!defined($sock)) {
1282 print " ERROR TESTING\n";
1283 close $sock;
1284 } else {
1285 print $sock "HELO $domain\r\n";
1286 $got = <$sock>; # Discard
1287 print $sock "MAIL FROM:<tester\@squirrelmail.org>\r\n";
1288 $got = <$sock>; # Discard
1289 print $sock "RCPT TO:<junk\@microsoft.com\r\n";
1290 $got = <$sock>; # This is the important line
1291 if ($got =~ /^250\b/) { # SMTP will relay without auth
1292 print "SUPPORTED$NRM\n";
1293 } else {
1294 print "NOT SUPPORTED$NRM\n";
1295 }
1296 print $sock "RSET\r\n";
1297 print $sock "QUIT\r\n";
1298 close $sock;
1299 }
1300 # Try login (SquirrelMail default)
1301 print "Testing login:\t\t";
1302 $tmp=detect_auth_support('SMTP',$host,'LOGIN');
1303 if (defined($tmp)) {
1304 if ($tmp eq 'YES') {
1305 print $WHT . "SUPPORTED$NRM\n";
1306 } else {
1307 print $WHT . "NOT SUPPORTED$NRM\n";
1308 }
1309 } else {
1310 print $WHT . "ERROR DETECTING$NRM\n";
1311 }
1312
1313 # Try CRAM-MD5
1314 print "Testing CRAM-MD5:\t";
1315 $tmp=detect_auth_support('SMTP',$host,'CRAM-MD5');
1316 if (defined($tmp)) {
1317 if ($tmp eq 'YES') {
1318 print $WHT . "SUPPORTED$NRM\n";
1319 } else {
1320 print $WHT . "NOT SUPPORTED$NRM\n";
1321 }
1322 } else {
1323 print $WHT . "ERROR DETECTING$NRM\n";
1324 }
1325
1326
1327 print "Testing DIGEST-MD5:\t";
1328 $tmp=detect_auth_support('SMTP',$host,'DIGEST-MD5');
1329 if (defined($tmp)) {
1330 if ($tmp eq 'YES') {
1331 print $WHT . "SUPPORTED$NRM\n";
1332 } else {
1333 print $WHT . "NOT SUPPORTED$NRM\n";
1334 }
1335 } else {
1336 print $WHT . "ERROR DETECTING$NRM\n";
1337 }
1338 }
1339 }
1340 print "\nWhat authentication mechanism do you want to use for SMTP connections?\n";
1341 print $WHT . "none" . $NRM . " - Your SMTP server does not require authorization.\n";
1342 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1343 print $WHT . "plain" . $NRM . " - SASL PLAIN. You already know it if you need this.\n";
1344 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext.\n";
1345 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1346 print $WHT . "\n*** YOUR SMTP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n" . $NRM;
1347 print "If you don't understand or are unsure, you probably want \"none\"\n\n";
1348 print "none, login, cram-md5, or digest-md5 [$WHT$smtp_auth_mech$NRM]: $WHT";
1349 $inval=<STDIN>;
1350 chomp($inval);
1351 if ($inval =~ /^none\b/i) {
1352 # SMTP doesn't necessarily require logins
1353 return "none";
1354 }
1355 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) ||
1356 ($inval =~ /^login\b/i) || ($inval =~/^plain\b/i)) {
1357 return lc($inval);
1358 } else {
1359 # user entered garbage, or default value so nothing needs to be set
1360 return $smtp_auth_mech;
1361 }
1362 }
1363
1364 # TLS
1365 # This sub is reused for IMAP and SMTP
1366 # Args: service name, default value
1367 sub command113 {
1368 my($default_val,$service,$inval);
1369 $service=$_[0];
1370 $default_val=$_[1];
1371 print "TLS (Transport Layer Security) encrypts the traffic between server and client.\n";
1372 print "If you're familiar with SSL, you get the idea.\n";
1373 print "To use this feature, your " . $service . " server must offer TLS\n";
1374 print "capability, plus PHP 4.3.x with OpenSSL support.\n";
1375 print "\nIf your " . $service . " server is localhost, you can safely disable this.\n";
1376 print "If it is remote, you may wish to seriously consider enabling this.\n";
1377 print "Enable TLS (y/n) [$WHT";
1378 if ($default_val eq 'true') {
1379 print "y";
1380 } else {
1381 print "n";
1382 }
1383 print "$NRM]: $WHT";
1384 $inval=<STDIN>;
1385 $inval =~ tr/yn//cd;
1386 return 'true' if ( $inval eq "y" );
1387 return 'false' if ( $inval eq "n" );
1388 return $default_val;
1389 }
1390
1391 # $encode_header_key
1392 sub command114{
1393 print "Encryption key allows to hide SquirrelMail Received: headers\n";
1394 print "in outbound messages. Interface uses encryption key to encode\n";
1395 print "username, remote address and proxied address, then stores encoded\n";
1396 print "information in X-Squirrel-* headers.\n";
1397 print "\n";
1398 print "Warning: used encryption function is not bulletproof. When used\n";
1399 print "with static encryption keys, it provides only minimal security\n";
1400 print "measures and information can be decoded quickly.\n";
1401 print "\n";
1402 print "Encoded information can be decoded with decrypt_headers.php script\n";
1403 print "from SquirrelMail contrib/ directory.\n";
1404 print "\n";
1405 print "Enter encryption key: ";
1406 $new_encode_header_key = <STDIN>;
1407 if ( $new_encode_header_key eq "\n" ) {
1408 $new_encode_header_key = $encode_header_key;
1409 } else {
1410 $new_encode_header_key =~ s/[\r\n]//g;
1411 }
1412 return $new_encode_header_key;
1413 }
1414
1415 # MOTD
1416 sub command71 {
1417 print "\nYou can now create the welcome message that is displayed\n";
1418 print "every time a user logs on. You can use HTML or just plain\n";
1419 print
1420 "text. If you do not wish to have one, just make it blank.\n\n(Type @ on a blank line to exit)\n";
1421
1422 $new_motd = "";
1423 do {
1424 print "] ";
1425 $line = <STDIN>;
1426 $line =~ s/[\r\n]//g;
1427 if ( $line ne "@" ) {
1428 $line =~ s/ /\&nbsp;\&nbsp;/g;
1429 $line =~ s/\t/\&nbsp;\&nbsp;\&nbsp;\&nbsp;/g;
1430 $line =~ s/$/ /;
1431 $line =~ s/\"/\\\"/g;
1432
1433 $new_motd = $new_motd . $line;
1434 }
1435 } while ( $line ne "@" );
1436 return $new_motd;
1437 }
1438
1439 ################# PLUGINS ###################
1440
1441 sub command81 {
1442 $command =~ s/[\s\n\r]*//g;
1443 if ( $command > 0 ) {
1444 $command = $command - 1;
1445 if ( $command <= $#plugins ) {
1446 @newplugins = ();
1447 $ct = 0;
1448 while ( $ct <= $#plugins ) {
1449 if ( $ct != $command ) {
1450 @newplugins = ( @newplugins, $plugins[$ct] );
1451 }
1452 $ct++;
1453 }
1454 @plugins = @newplugins;
1455 } elsif ( $command <= $#plugins + $#unused_plugins + 1 ) {
1456 $num = $command - $#plugins - 1;
1457 @newplugins = @plugins;
1458 $ct = 0;
1459 while ( $ct <= $#unused_plugins ) {
1460 if ( $ct == $num ) {
1461 @newplugins = ( @newplugins, $unused_plugins[$ct] );
1462 }
1463 $ct++;
1464 }
1465 @plugins = @newplugins;
1466 }
1467 }
1468 return @plugins;
1469 }
1470
1471 ################# FOLDERS ###################
1472
1473 # default_folder_prefix
1474 sub command21 {
1475 print "Some IMAP servers (UW, for example) store mail and folders in\n";
1476 print "your user space in a separate subdirectory. This is where you\n";
1477 print "specify what that directory is.\n";
1478 print "\n";
1479 print "EXAMPLE: mail/";
1480 print "\n";
1481 print "NOTE: If you use Cyrus, or some server that would not use this\n";
1482 print " option, you must set this to 'none'.\n";
1483 print "\n";
1484 print "[$WHT$default_folder_prefix$NRM]: $WHT";
1485 $new_default_folder_prefix = <STDIN>;
1486
1487 if ( $new_default_folder_prefix eq "\n" ) {
1488 $new_default_folder_prefix = $default_folder_prefix;
1489 } else {
1490 $new_default_folder_prefix =~ s/[\r\n]//g;
1491 }
1492 if ( ( $new_default_folder_prefix =~ /^\s*$/ ) || ( $new_default_folder_prefix =~ m/^none$/i ) ) {
1493 $new_default_folder_prefix = "";
1494 } else {
1495 # add the trailing delimiter only if we know what the server is.
1496 if (($imap_server_type eq 'cyrus' and
1497 $optional_delimiter eq 'detect') or
1498 ($imap_server_type eq 'courier' and
1499 $optional_delimiter eq 'detect')) {
1500 $new_default_folder_prefix =~ s/\.*$/\./;
1501 } elsif ($imap_server_type eq 'uw' and
1502 $optional_delimiter eq 'detect') {
1503 $new_default_folder_prefix =~ s/\/*$/\//;
1504 }
1505 }
1506 return $new_default_folder_prefix;
1507 }
1508
1509 # Show Folder Prefix
1510 sub command22 {
1511 print "It is possible to set up the default folder prefix as a user\n";
1512 print "specific option, where each user can specify what their mail\n";
1513 print "folder is. If you set this to false, they will never see the\n";
1514 print "option, but if it is true, this option will appear in the\n";
1515 print "'options' section.\n";
1516 print "\n";
1517 print "NOTE: You set the default folder prefix in option '1' of this\n";
1518 print " section. That will be the default if the user doesn't\n";
1519 print " specify anything different.\n";
1520 print "\n";
1521
1522 if ( lc($show_prefix_option) eq 'true' ) {
1523 $default_value = "y";
1524 } else {
1525 $default_value = "n";
1526 }
1527 print "\n";
1528 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1529 $new_show = <STDIN>;
1530 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1531 $show_prefix_option = 'true';
1532 } else {
1533 $show_prefix_option = 'false';
1534 }
1535 return $show_prefix_option;
1536 }
1537
1538 # Trash Folder
1539 sub command23a {
1540 print "You can now specify where the default trash folder is located.\n";
1541 print "On servers where you do not want this, you can set it to anything\n";
1542 print "and set option 6 to false.\n";
1543 print "\n";
1544 print "This is relative to where the rest of your email is kept. You do\n";
1545 print "not need to worry about their mail directory. If this folder\n";
1546 print "would be ~/mail/trash on the filesystem, you only need to specify\n";
1547 print "that this is 'trash', and be sure to put 'mail/' in option 1.\n";
1548 print "\n";
1549
1550 print "[$WHT$trash_folder$NRM]: $WHT";
1551 $new_trash_folder = <STDIN>;
1552 if ( $new_trash_folder eq "\n" ) {
1553 $new_trash_folder = $trash_folder;
1554 } else {
1555 $new_trash_folder =~ s/[\r\n]//g;
1556 }
1557 return $new_trash_folder;
1558 }
1559
1560 # Sent Folder
1561 sub command23b {
1562 print "This is where messages that are sent will be stored. SquirrelMail\n";
1563 print "by default puts a copy of all outgoing messages in this folder.\n";
1564 print "\n";
1565 print "This is relative to where the rest of your email is kept. You do\n";
1566 print "not need to worry about their mail directory. If this folder\n";
1567 print "would be ~/mail/sent on the filesystem, you only need to specify\n";
1568 print "that this is 'sent', and be sure to put 'mail/' in option 1.\n";
1569 print "\n";
1570
1571 print "[$WHT$sent_folder$NRM]: $WHT";
1572 $new_sent_folder = <STDIN>;
1573 if ( $new_sent_folder eq "\n" ) {
1574 $new_sent_folder = $sent_folder;
1575 } else {
1576 $new_sent_folder =~ s/[\r\n]//g;
1577 }
1578 return $new_sent_folder;
1579 }
1580
1581 # Draft Folder
1582 sub command23c {
1583 print "You can now specify where the default draft folder is located.\n";
1584 print "On servers where you do not want this, you can set it to anything\n";
1585 print "and set option 9 to false.\n";
1586 print "\n";
1587 print "This is relative to where the rest of your email is kept. You do\n";
1588 print "not need to worry about their mail directory. If this folder\n";
1589 print "would be ~/mail/drafts on the filesystem, you only need to specify\n";
1590 print "that this is 'drafts', and be sure to put 'mail/' in option 1.\n";
1591 print "\n";
1592
1593 print "[$WHT$draft_folder$NRM]: $WHT";
1594 $new_draft_folder = <STDIN>;
1595 if ( $new_draft_folder eq "\n" ) {
1596 $new_draft_folder = $draft_folder;
1597 } else {
1598 $new_draft_folder =~ s/[\r\n]//g;
1599 }
1600 return $new_draft_folder;
1601 }
1602
1603 # default move to trash
1604 sub command24a {
1605 print "By default, should messages get moved to the trash folder? You\n";
1606 print "can specify the default trash folder in option 3. If this is set\n";
1607 print "to false, messages will get deleted immediately without moving\n";
1608 print "to the trash folder.\n";
1609 print "\n";
1610 print "Trash folder is currently: $trash_folder\n";
1611 print "\n";
1612
1613 if ( lc($default_move_to_trash) eq 'true' ) {
1614 $default_value = "y";
1615 } else {
1616 $default_value = "n";
1617 }
1618 print "By default, move to trash (y/n) [$WHT$default_value$NRM]: $WHT";
1619 $new_show = <STDIN>;
1620 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1621 $default_move_to_trash = 'true';
1622 } else {
1623 $default_move_to_trash = 'false';
1624 }
1625 return $default_move_to_trash;
1626 }
1627
1628 # default move to sent
1629 sub command24b {
1630 print "By default, should messages get moved to the sent folder? You\n";
1631 print "can specify the default sent folder in option 4. If this is set\n";
1632 print "to false, messages will get sent and no copy will be made.\n";
1633 print "\n";
1634 print "Sent folder is currently: $sent_folder\n";
1635 print "\n";
1636
1637 if ( lc($default_move_to_sent) eq 'true' ) {
1638 $default_value = "y";
1639 } else {
1640 $default_value = "n";
1641 }
1642 print "By default, move to sent (y/n) [$WHT$default_value$NRM]: $WHT";
1643 $new_show = <STDIN>;
1644 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1645 $default_move_to_sent = 'true';
1646 } else {
1647 $default_move_to_sent = 'false';
1648 }
1649 return $default_move_to_sent;
1650 }
1651
1652 # default save as draft
1653 sub command24c {
1654 print "By default, should the save to draft option be shown? You can\n";
1655 print "specify the default drafts folder in option 5. If this is set\n";
1656 print "to false, users will not be shown the save to draft option.\n";
1657 print "\n";
1658 print "Drafts folder is currently: $draft_folder\n";
1659 print "\n";
1660
1661 if ( lc($default_move_to_draft) eq 'true' ) {
1662 $default_value = "y";
1663 } else {
1664 $default_value = "n";
1665 }
1666 print "By default, save as draft (y/n) [$WHT$default_value$NRM]: $WHT";
1667 $new_show = <STDIN>;
1668 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1669 $default_save_as_draft = 'true';
1670 } else {
1671 $default_save_as_draft = 'false';
1672 }
1673 return $default_save_as_draft;
1674 }
1675
1676 # List special folders first
1677 sub command27 {
1678 print "SquirrelMail has what we call 'special folders' that are not\n";
1679 print "manipulated and viewed like normal folders. Some examples of\n";
1680 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
1681 print "Simply asks if you want these folders listed first in the folder\n";
1682 print "listing.\n";
1683 print "\n";
1684
1685 if ( lc($list_special_folders_first) eq 'true' ) {
1686 $default_value = "y";
1687 } else {
1688 $default_value = "n";
1689 }
1690 print "\n";
1691 print "List first (y/n) [$WHT$default_value$NRM]: $WHT";
1692 $new_show = <STDIN>;
1693 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1694 $list_special_folders_first = 'true';
1695 } else {
1696 $list_special_folders_first = 'false';
1697 }
1698 return $list_special_folders_first;
1699 }
1700
1701 # Show special folders color
1702 sub command28 {
1703 print "SquirrelMail has what we call 'special folders' that are not\n";
1704 print "manipulated and viewed like normal folders. Some examples of\n";
1705 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
1706 print "wants to know if we should display special folders in a\n";
1707 print "color than the other folders.\n";
1708 print "\n";
1709
1710 if ( lc($use_special_folder_color) eq 'true' ) {
1711 $default_value = "y";
1712 } else {
1713 $default_value = "n";
1714 }
1715 print "\n";
1716 print "Show color (y/n) [$WHT$default_value$NRM]: $WHT";
1717 $new_show = <STDIN>;
1718 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1719 $use_special_folder_color = 'true';
1720 } else {
1721 $use_special_folder_color = 'false';
1722 }
1723 return $use_special_folder_color;
1724 }
1725
1726 # Auto expunge
1727 sub command29 {
1728 print "The way that IMAP handles deleting messages is as follows. You\n";
1729 print "mark the message as deleted, and then to 'really' delete it, you\n";
1730 print "expunge it. This option asks if you want to just have messages\n";
1731 print "marked as deleted, or if you want SquirrelMail to expunge the \n";
1732 print "messages too.\n";
1733 print "\n";
1734
1735 if ( lc($auto_expunge) eq 'true' ) {
1736 $default_value = "y";
1737 } else {
1738 $default_value = "n";
1739 }
1740 print "Auto expunge (y/n) [$WHT$default_value$NRM]: $WHT";
1741 $new_show = <STDIN>;
1742 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1743 $auto_expunge = 'true';
1744 } else {
1745 $auto_expunge = 'false';
1746 }
1747 return $auto_expunge;
1748 }
1749
1750 # Default sub of inbox
1751 sub command210 {
1752 print "Some IMAP servers (Cyrus) have all folders as subfolders of INBOX.\n";
1753 print "This can cause some confusion in folder creation for users when\n";
1754 print "they try to create folders and don't put it as a subfolder of INBOX\n";
1755 print "and get permission errors. This option asks if you want folders\n";
1756 print "to be subfolders of INBOX by default.\n";
1757 print "\n";
1758
1759 if ( lc($default_sub_of_inbox) eq 'true' ) {
1760 $default_value = "y";
1761 } else {
1762 $default_value = "n";
1763 }
1764 print "Default sub of INBOX (y/n) [$WHT$default_value$NRM]: $WHT";
1765 $new_show = <STDIN>;
1766 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1767 $default_sub_of_inbox = 'true';
1768 } else {
1769 $default_sub_of_inbox = 'false';
1770 }
1771 return $default_sub_of_inbox;
1772 }
1773
1774 # Show contain subfolder option
1775 sub command211 {
1776 print "Some IMAP servers (UW) make it so that there are two types of\n";
1777 print "folders. Those that contain messages, and those that contain\n";
1778 print "subfolders. If this is the case for your server, set this to\n";
1779 print "true, and it will ask the user whether the folder they are\n";
1780 print "creating contains subfolders or messages.\n";
1781 print "\n";
1782
1783 if ( lc($show_contain_subfolders_option) eq 'true' ) {
1784 $default_value = "y";
1785 } else {
1786 $default_value = "n";
1787 }
1788 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1789 $new_show = <STDIN>;
1790 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1791 $show_contain_subfolders_option = 'true';
1792 } else {
1793 $show_contain_subfolders_option = 'false';
1794 }
1795 return $show_contain_subfolders_option;
1796 }
1797
1798 # Default Unseen Notify
1799 sub command212 {
1800 print "This option specifies where the users will receive notification\n";
1801 print "about unseen messages by default. This is of course an option that\n";
1802 print "can be changed on a user level.\n";
1803 print " 1 = No notification\n";
1804 print " 2 = Only on the INBOX\n";
1805 print " 3 = On all folders\n";
1806 print "\n";
1807
1808 print "Which one should be default (1,2,3)? [$WHT$default_unseen_notify$NRM]: $WHT";
1809 $new_show = <STDIN>;
1810 if ( $new_show =~ /^[123]\n/i ) {
1811 $default_unseen_notify = $new_show;
1812 }
1813 $default_unseen_notify =~ s/[\r\n]//g;
1814 return $default_unseen_notify;
1815 }
1816
1817 # Default Unseen Type
1818 sub command213 {
1819 print "Here you can define the default way that unseen messages will be displayed\n";
1820 print "to the user in the folder listing on the left side.\n";
1821 print " 1 = Only unseen messages (4)\n";
1822 print " 2 = Unseen and Total messages (4/27)\n";
1823 print "\n";
1824
1825 print "Which one should be default (1,2)? [$WHT$default_unseen_type$NRM]: $WHT";
1826 $new_show = <STDIN>;
1827 if ( $new_show =~ /^[12]\n/i ) {
1828 $default_unseen_type = $new_show;
1829 }
1830 $default_unseen_type =~ s/[\r\n]//g;
1831 return $default_unseen_type;
1832 }
1833
1834 # Auto create special folders
1835 sub command214 {
1836 print "Would you like the Sent, Trash, and Drafts folders to be created\n";
1837 print "automatically print for you when a user logs in? If the user\n";
1838 print "accidentally deletes their special folders, this option will\n";
1839 print "automatically create it again for them.\n";
1840 print "\n";
1841
1842 if ( lc($auto_create_special) eq 'true' ) {
1843 $default_value = "y";
1844 } else {
1845 $default_value = "n";
1846 }
1847 print "Auto create special folders? (y/n) [$WHT$default_value$NRM]: $WHT";
1848 $new_show = <STDIN>;
1849 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1850 $auto_create_special = 'true';
1851 } else {
1852 $auto_create_special = 'false';
1853 }
1854 return $auto_create_special;
1855 }
1856
1857 # Automatically delete folders
1858 sub command215 {
1859 if ( $imap_server_type eq "uw" ) {
1860 print "UW IMAP servers will not allow folders containing mail to also contain folders.\n";
1861 print "Deleting folders will bypass the trash folder and be immediately deleted\n\n";
1862 print "If this is not the correct value for your server,\n";
1863 print "please use option D on the Main Menu to configure your server correctly.\n\n";
1864 print "Press any key to continue...\n";
1865 $new_delete = <STDIN>;
1866 $delete_folder = 'true';
1867 } else {
1868 if ( $imap_server_type eq "courier" ) {
1869 print "Courier (or Courier-IMAP) IMAP servers may not support ";
1870 print "subfolders of Trash. \n";
1871 print "Specifically, if Courier is set to always move messages to Trash, \n";
1872 print "Trash will be treated by Courier as a special folder that does not \n";
1873 print "allow subfolders. \n\n";
1874 print "Please verify your Courier configuration, and test folder deletion \n";
1875 print "when changing this setting.\n\n";
1876 }
1877
1878 print "Are subfolders of the Trash supported by your IMAP server?\n";
1879 print "If so, should deleted folders be sent to Trash?\n";
1880 print "If not, say no (deleted folders should not be sent to Trash)\n\n";
1881 # reversal of logic.
1882 # question was: Should folders be automatically deleted instead of sent to trash..
1883 # we've changed the question to make it more clear,
1884 # and are here handling that to avoid changing the answers..
1885 if ( lc($delete_folder) eq 'true' ) {
1886 $default_value = "n";
1887 } else {
1888 $default_value = "y";
1889 }
1890 print "Send deleted folders to Trash? (y/n) [$WHT$default_value$NRM]: $WHT";
1891 $new_delete = <STDIN>;
1892 if ( ( $new_delete =~ /^y\n/i ) || ( ( $new_delete =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1893 $delete_folder = 'false';
1894 } else {
1895 $delete_folder = 'true';
1896 }
1897 }
1898 return $delete_folder;
1899 }
1900
1901 #noselect fix
1902 sub command216 {
1903 print "Some IMAP server allow subfolders to exist even if the parent\n";
1904 print "folders do not. This fixes some problems with the folder list\n";
1905 print "when this is the case, causing the /NoSelect folders to be displayed\n";
1906 print "\n";
1907
1908 if ( lc($noselect_fix_enable) eq 'true' ) {
1909 $default_value = "y";
1910 } else {
1911 $default_value = "n";
1912 }
1913 print "enable noselect fix? (y/n) [$WHT$noselect_fix_enable$NRM]: $WHT";
1914 $noselect_fix_enable = <STDIN>;
1915 if ( ( $noselect_fix_enable =~ /^y\n/i ) || ( ( $noselect_fix_enable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1916 $noselect_fix_enable = 'true';
1917 } else {
1918 $noselect_fix_enable = 'false';
1919 }
1920 return $noselect_fix_enable;
1921 }
1922 ############# GENERAL OPTIONS #####################
1923
1924 # Data directory
1925 sub command33a {
1926 print "Specify the location for your data directory.\n";
1927 print "You need to create this directory yourself.\n";
1928 print "The path name can be absolute or relative (to the config directory).\n";
1929 print "Here are two examples:\n";
1930 print " Absolute: /var/local/squirrelmail/data/\n";
1931 print " Relative: ../data/\n";
1932 print "Relative paths to directories outside of the SquirrelMail distribution\n";
1933 print "will be converted to their absolute path equivalents in config.php.\n\n";
1934 print "Note: There are potential security risks with having a writeable directory\n";
1935 print "under the web server's root directory (ex: /home/httpd/html).\n";
1936 print "For this reason, it is recommended to put the data directory\n";
1937 print "in an alternate location of your choice. \n";
1938 print "\n";
1939
1940 print "[$WHT$data_dir$NRM]: $WHT";
1941 $new_data_dir = <STDIN>;
1942 if ( $new_data_dir eq "\n" ) {
1943 $new_data_dir = $data_dir;
1944 } else {
1945 $new_data_dir =~ s/[\r\n]//g;
1946 }
1947 if ( $new_data_dir =~ /^\s*$/ ) {
1948 $new_data_dir = "";
1949 } else {
1950 $new_data_dir =~ s/\/*$//g;
1951 $new_data_dir =~ s/$/\//g;
1952 }
1953 return $new_data_dir;
1954 }
1955
1956 # Attachment directory
1957 sub command33b {
1958 print "Path to directory used for storing attachments while a mail is\n";
1959 print "being composed. The path name can be absolute or relative (to the\n";
1960 print "config directory). Here are two examples:\n";
1961 print " Absolute: /var/local/squirrelmail/attach/\n";
1962 print " Relative: ../attach/\n";
1963 print "Relative paths to directories outside of the SquirrelMail distribution\n";
1964 print "will be converted to their absolute path equivalents in config.php.\n\n";
1965 print "Note: There are a few security considerations regarding this\n";
1966 print "directory:\n";
1967 print " 1. It should have the permission 733 (rwx-wx-wx) to make it\n";
1968 print " impossible for a random person with access to the webserver\n";
1969 print " to list files in this directory. Confidential data might\n";
1970 print " be laying around in there.\n";
1971 print " Depending on your user:group assignments, 730 (rwx-wx---)\n";
1972 print " may be possible, and more secure (e.g. root:apache)\n";
1973 print " 2. Since the webserver is not able to list the files in the\n";
1974 print " content is also impossible for the webserver to delete files\n";
1975 print " lying around there for too long.\n";
1976 print " 3. It should probably be another directory than the data\n";
1977 print " directory specified in option 3.\n";
1978 print "\n";
1979
1980 print "[$WHT$attachment_dir$NRM]: $WHT";
1981 $new_attachment_dir = <STDIN>;
1982 if ( $new_attachment_dir eq "\n" ) {
1983 $new_attachment_dir = $attachment_dir;
1984 } else {
1985 $new_attachment_dir =~ s/[\r\n]//g;
1986 }
1987 if ( $new_attachment_dir =~ /^\s*$/ ) {
1988 $new_attachment_dir = "";
1989 } else {
1990 $new_attachment_dir =~ s/\/*$//g;
1991 $new_attachment_dir =~ s/$/\//g;
1992 }
1993 return $new_attachment_dir;
1994 }
1995
1996 sub command33c {
1997 print "The directory hash level setting allows you to configure the level\n";
1998 print "of hashing that SquirrelMail employs in your data and attachment\n";
1999 print "directories. This value must be an integer ranging from 0 to 4.\n";
2000 print "When this value is set to 0, SquirrelMail will simply store all\n";
2001 print "files as normal in the data and attachment directories. However,\n";
2002 print "when set to a value from 1 to 4, a simple hashing scheme will be\n";
2003 print "used to organize the files in this directory. In short, the crc32\n";
2004 print "value for a username will be computed. Then, up to the first 4\n";
2005 print "digits of the hash, as set by this configuration value, will be\n";
2006 print "used to directory hash the files for that user in the data and\n";
2007 print "attachment directory. This allows for better performance on\n";
2008 print "servers with larger numbers of users.\n";
2009 print "\n";
2010
2011 print "[$WHT$dir_hash_level$NRM]: $WHT";
2012 $new_dir_hash_level = <STDIN>;
2013 if ( $new_dir_hash_level eq "\n" ) {
2014 $new_dir_hash_level = $dir_hash_level;
2015 } else {
2016 $new_dir_hash_level =~ s/[\r\n]//g;
2017 }
2018 if ( ( int($new_dir_hash_level) < 0 )
2019 || ( int($new_dir_hash_level) > 4 )
2020 || !( int($new_dir_hash_level) eq $new_dir_hash_level ) ) {
2021 print "Invalid Directory Hash Level.\n";
2022 print "Value must be an integer ranging from 0 to 4\n";
2023 print "Hit enter to continue.\n";
2024 $enter_key = <STDIN>;
2025
2026 $new_dir_hash_level = $dir_hash_level;
2027 }
2028
2029 return $new_dir_hash_level;
2030 }
2031
2032 sub command35 {
2033 print "This is the default size (in pixels) of the left folder list.\n";
2034 print "Default is 200, but you can set it to whatever you wish. This\n";
2035 print "is a user preference, so this will only show up as their default.\n";
2036 print "\n";
2037 print "[$WHT$default_left_size$NRM]: $WHT";
2038 $new_default_left_size = <STDIN>;
2039 if ( $new_default_left_size eq "\n" ) {
2040 $new_default_left_size = $default_left_size;
2041 } else {
2042 $new_default_left_size =~ s/[\r\n]//g;
2043 }
2044 return $new_default_left_size;
2045 }
2046
2047 sub command36 {
2048 print "Some IMAP servers only have lowercase letters in the usernames\n";
2049 print "but they still allow people with uppercase to log in. This\n";
2050 print "causes a problem with the user's preference files. This option\n";
2051 print "transparently changes all usernames to lowercase.";
2052 print "\n";
2053
2054 if ( lc($force_username_lowercase) eq 'true' ) {
2055 $default_value = "y";
2056 } else {
2057 $default_value = "n";
2058 }
2059 print "Convert usernames to lowercase (y/n) [$WHT$default_value$NRM]: $WHT";
2060 $new_show = <STDIN>;
2061 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2062 return 'true';
2063 }
2064 return 'false';
2065 }
2066
2067 sub command37 {
2068 print "";
2069 print "\n";
2070
2071 if ( lc($default_use_priority) eq 'true' ) {
2072 $default_value = "y";
2073 } else {
2074 $default_value = "n";
2075 }
2076
2077 print "Allow users to specify priority of outgoing mail (y/n) [$WHT$default_value$NRM]: $WHT";
2078 $new_show = <STDIN>;
2079 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2080 return 'true';
2081 }
2082 return 'false';
2083 }
2084
2085 sub command38 {
2086 print "";
2087 print "\n";
2088
2089 if ( lc($default_hide_attribution) eq 'true' ) {
2090 $default_value = "y";
2091 } else {
2092 $default_value = "n";
2093 }
2094
2095 print "Hide SM attributions (y/n) [$WHT$default_value$NRM]: $WHT";
2096 $new_show = <STDIN>;
2097 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2098 return 'true';
2099 }
2100 return 'false';
2101 }
2102
2103 sub command39 {
2104 print "";
2105 print "\n";
2106
2107 if ( lc($default_use_mdn) eq 'true' ) {
2108 $default_value = "y";
2109 } else {
2110 $default_value = "n";
2111 }
2112
2113 print "Enable support for read/delivery receipt support (y/n) [$WHT$default_value$NRM]: $WHT";
2114 $new_show = <STDIN>;
2115 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2116 return 'true';
2117 }
2118 return 'false';
2119 }
2120
2121
2122 sub command310 {
2123 print " In loosely managed environments, you may want to allow users
2124 to edit their full name and email address. In strictly managed
2125 environments, you may want to force users to use the name
2126 and email address assigned to them.
2127
2128 'y' - allow a user to edit their full name and email address,
2129 'n' - users must use the assigned values.
2130
2131 ";
2132
2133 if ( lc($edit_identity) eq 'true' ) {
2134 $default_value = "y";
2135 } else {
2136 $default_value = "n";
2137 }
2138 print "Allow editing of user's identity? (y/n) [$WHT$default_value$NRM]: $WHT";
2139 $new_edit = <STDIN>;
2140 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2141 $edit_identity = 'true';
2142 $edit_name = 'true';
2143 $hide_auth_header = command311b();
2144 } else {
2145 $edit_identity = 'false';
2146 $edit_name = command311();
2147 $hide_auth_header = command311b();
2148 }
2149 return $edit_identity;
2150 }
2151
2152 sub command311 {
2153 print " Given that users are not allowed to modify their
2154 email address, can they edit their full name?
2155
2156 ";
2157
2158 if ( lc($edit_name) eq 'true' ) {
2159 $default_value = "y";
2160 } else {
2161 $default_value = "n";
2162 }
2163 print "Allow the user to edit their full name? (y/n) [$WHT$default_value$NRM]: $WHT";
2164 $new_edit = <STDIN>;
2165 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2166 $edit_name = 'true';
2167 } else {
2168 $edit_name = 'false';
2169 }
2170 return $edit_name;
2171 }
2172
2173 sub command311b {
2174 print " SquirrelMail adds username information to every sent email
2175 in order to prevent possible sender forging when users are allowed
2176 to change their email and/or full name.
2177
2178 You can remove user information from this header (y), if you think that
2179 it violates privacy or security.
2180
2181 Note: If users are allowed to change their email addresses,
2182 this setting will make it difficult to determine who sent what where.
2183 Use at your own risk.
2184
2185 ";
2186
2187 if ( lc($hide_auth_header) eq "true" ) {
2188 $default_value = "y";
2189 } else {
2190 $default_value = "n";
2191 }
2192 print "Remove username from email headers? (y/n) [$WHT$default_value$NRM]: $WHT";
2193 $new_header = <STDIN>;
2194 if ( ( $new_header =~ /^y\n/i ) || ( ( $new_header =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2195 $hide_auth_header = "true";
2196 } else {
2197 $hide_auth_header = "false";
2198 }
2199 return $hide_auth_header;
2200 }
2201
2202 sub command312 {
2203 print "This option allows you to choose if users can use thread sorting\n";
2204 print "Your IMAP server must support the THREAD command for this to work\n";
2205 print "PHP versions later than 4.0.3 recommended\n";
2206 print "\n";
2207
2208 if ( lc($allow_thread_sort) eq 'true' ) {
2209 $default_value = "y";
2210 } else {
2211 $default_value = "n";
2212 }
2213 print "Allow server side thread sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2214 $allow_thread_sort = <STDIN>;
2215 if ( ( $allow_thread_sort =~ /^y\n/i ) || ( ( $allow_thread_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2216 $allow_thread_sort = 'true';
2217 } else {
2218 $allow_thread_sort = 'false';
2219 }
2220 return $allow_thread_sort;
2221 }
2222
2223 sub command313 {
2224 print "This option allows you to choose if SM uses server-side sorting\n";
2225 print "Your IMAP server must support the SORT command for this to work\n";
2226 print "\n";
2227
2228 if ( lc($allow_server_sort) eq 'true' ) {
2229 $default_value = "y";
2230 } else {
2231 $default_value = "n";
2232 }
2233 print "Allow server-side sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2234 $allow_server_sort = <STDIN>;
2235 if ( ( $allow_server_sort =~ /^y\n/i ) || ( ( $allow_server_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2236 $allow_server_sort = 'true';
2237 } else {
2238 $allow_server_sort = 'false';
2239 }
2240 return $allow_server_sort;
2241 }
2242
2243 sub command314 {
2244 print "This option allows you to choose if SM uses charset search\n";
2245 print "Your IMAP server must support the SEARCH CHARSET command for this to work\n";
2246 print "\n";
2247
2248 if ( lc($allow_charset_search) eq 'true' ) {
2249 $default_value = "y";
2250 } else {
2251 $default_value = "n";
2252 }
2253 print "Allow charset searching? (y/n) [$WHT$default_value$NRM]: $WHT";
2254 $allow_charset_search = <STDIN>;
2255 if ( ( $allow_charset_search =~ /^y\n/i ) || ( ( $allow_charset_search =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2256 $allow_charset_search = 'true';
2257 } else {
2258 $allow_charset_search = 'false';
2259 }
2260 return $allow_charset_search;
2261 }
2262
2263 # command315 (UID support) obsoleted.
2264
2265 # advanced search option
2266 sub command316 {
2267 print "This option allows you to control the use of advanced search form.\n";
2268 print " 0 = enable basic search only\n";
2269 print " 1 = enable advanced search only\n";
2270 print " 2 = enable both\n";
2271 print "\n";
2272
2273 print "Allowed search (0,1,2)? [$WHT$allow_advanced_search$NRM]: $WHT";
2274 $new_allow_advanced_search = <STDIN>;
2275 if ( $new_allow_advanced_search =~ /^[012]\n/i ) {
2276 $allow_advanced_search = $new_allow_advanced_search;
2277 }
2278 $allow_advanced_search =~ s/[\r\n]//g;
2279 return $allow_advanced_search;
2280 }
2281
2282
2283 sub command317 {
2284 print "This option allows you to change the name of the PHP session used\n";
2285 print "by SquirrelMail. Unless you know what you are doing, you probably\n";
2286 print "don't need or want to change this from the default of SQMSESSID.\n";
2287 print "[$WHT$session_name$NRM]: $WHT";
2288 $new_session_name = <STDIN>;
2289 chomp($new_session_name);
2290 if ( $new_session_name eq "" ) {
2291 $new_session_name = $session_name;
2292 }
2293 return $new_session_name;
2294 }
2295
2296 # time zone config (since 1.5.1)
2297 sub command318 {
2298 print "This option allows you to control the use of time zones.\n";
2299 print " 0 = (default) standard, GNU C time zone names\n";
2300 print " 1 = strict, generic time zone codes with offsets\n";
2301 print " 2 = custom, GNU C time zones loaded from config/timezones.php\n";
2302 print " 3 = custom strict, generic time zone codes with offsets loaded \n";
2303 print " from config/timezones.php\n";
2304 print "See SquirrelMail documentation about format of config/timezones.php file.\n";
2305 print "\n";
2306
2307 print "Used time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT";
2308 $new_time_zone_type = <STDIN>;
2309 if ( $new_time_zone_type =~ /^[0123]\n/i ) {
2310 $time_zone_type = $new_time_zone_type;
2311 } else {
2312 print "\nInvalid configuration value.\n";
2313 print "\nPress enter to continue...";
2314 $tmp = <STDIN>;
2315 }
2316 $time_zone_type =~ s/[\r\n]//g;
2317 return $time_zone_type;
2318 }
2319
2320
2321 sub command41 {
2322 print "\nDefine the themes that you wish to use. If you have added ";
2323 print "a theme of your own, just follow the instructions (?) about how to add ";
2324 print "them. You can also change the default theme.\n";
2325 print "[theme] command (?=help) > ";
2326 $input = <STDIN>;
2327 $input =~ s/[\r\n]//g;
2328 while ( $input ne "d" ) {
2329 if ( $input =~ /^\s*l\s*/i ) {
2330 $count = 0;
2331 while ( $count <= $#theme_name ) {
2332 if ( $count == $theme_default ) {
2333 print " *";
2334 } else {
2335 print " ";
2336 }
2337 if ( $count < 10 ) {
2338 print " ";
2339 }
2340 $name = $theme_name[$count];
2341 $num_spaces = 35 - length($name);
2342 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2343 $name = $name . " ";
2344 }
2345
2346 print " $count. $name";
2347 print "($theme_path[$count])\n";
2348
2349 $count++;
2350 }
2351 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
2352 $old_def = $theme_default;
2353 $theme_default = $input;
2354 $theme_default =~ s/^\s*m\s*//;
2355 if ( ( $theme_default > $#theme_name ) || ( $theme_default < 0 ) ) {
2356 print "Cannot set default theme to $theme_default. That theme does not exist.\n";
2357 $theme_default = $old_def;
2358 }
2359 } elsif ( $input =~ /^\s*\+/ ) {
2360 print "What is the name of this theme: ";
2361 $name = <STDIN>;
2362 $name =~ s/[\r\n]//g;
2363 $theme_name[ $#theme_name + 1 ] = $name;
2364 print "Be sure to put ../themes/ before the filename.\n";
2365 print "What file is this stored in (ex: ../themes/default_theme.php): ";
2366 $name = <STDIN>;
2367 $name =~ s/[\r\n]//g;
2368 $theme_path[ $#theme_path + 1 ] = $name;
2369 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
2370 if ( $input =~ /[0-9]+\s*$/ ) {
2371 $rem_num = $input;
2372 $rem_num =~ s/^\s*-\s*//g;
2373 $rem_num =~ s/\s*$//;
2374 } else {
2375 $rem_num = $#theme_name;
2376 }
2377 if ( $rem_num == $theme_default ) {
2378 print "You cannot remove the default theme!\n";
2379 } else {
2380 $count = 0;
2381 @new_theme_name = ();
2382 @new_theme_path = ();
2383 while ( $count <= $#theme_name ) {
2384 if ( $count != $rem_num ) {
2385 @new_theme_name = ( @new_theme_name, $theme_name[$count] );
2386 @new_theme_path = ( @new_theme_path, $theme_path[$count] );
2387 }
2388 $count++;
2389 }
2390 @theme_name = @new_theme_name;
2391 @theme_path = @new_theme_path;
2392 if ( $theme_default > $rem_num ) {
2393 $theme_default--;
2394 }
2395 }
2396 } elsif ( $input =~ /^\s*t\s*/i ) {
2397 print "\nStarting detection...\n\n";
2398
2399 opendir( DIR, "../themes" );
2400 @files = grep { /\.php$/i } readdir(DIR);
2401 $cnt = 0;
2402 while ( $cnt <= $#files ) {
2403 $filename = "../themes/" . $files[$cnt];
2404 if ( $filename ne "../themes/index.php" ) {
2405 $found = 0;
2406 for ( $x = 0 ; $x <= $#theme_path ; $x++ ) {
2407 if ( $theme_path[$x] eq $filename ) {
2408 $found = 1;
2409 }
2410 }
2411 if ( $found != 1 ) {
2412 print "** Found theme: $filename\n";
2413 print " What is its name? ";
2414 $nm = <STDIN>;
2415 $nm =~ s/[\n\r]//g;
2416 $theme_name[ $#theme_name + 1 ] = $nm;
2417 $theme_path[ $#theme_path + 1 ] = $filename;
2418 }
2419 }
2420 $cnt++;
2421 }
2422 print "\n";
2423 for ( $cnt = 0 ; $cnt <= $#theme_path ; $cnt++ ) {
2424 $filename = $theme_path[$cnt];
2425 if ( !( -e $filename ) ) {
2426 print " Removing $filename (file not found)\n";
2427 $offset = 0;
2428 @new_theme_name = ();
2429 @new_theme_path = ();
2430 for ( $x = 0 ; $x < $#theme_path ; $x++ ) {
2431 if ( $theme_path[$x] eq $filename ) {
2432 $offset = 1;
2433 }
2434 if ( $offset == 1 ) {
2435 $new_theme_name[$x] = $theme_name[ $x + 1 ];
2436 $new_theme_path[$x] = $theme_path[ $x + 1 ];
2437 } else {
2438 $new_theme_name[$x] = $theme_name[$x];
2439 $new_theme_path[$x] = $theme_path[$x];
2440 }
2441 }
2442 @theme_name = @new_theme_name;
2443 @theme_path = @new_theme_path;
2444 }
2445 }
2446 print "\nDetection complete!\n\n";
2447
2448 closedir DIR;
2449 } elsif ( $input =~ /^\s*\?\s*/ ) {
2450 print ".-------------------------.\n";
2451 print "| t (detect themes) |\n";
2452 print "| + (add theme) |\n";
2453 print "| - N (remove theme) |\n";
2454 print "| m N (mark default) |\n";
2455 print "| l (list themes) |\n";
2456 print "| d (done) |\n";
2457 print "`-------------------------'\n";
2458 }
2459 print "[theme] command (?=help) > ";
2460 $input = <STDIN>;
2461 $input =~ s/[\r\n]//g;
2462 }
2463 }
2464
2465 # Theme - CSS file
2466 sub command42 {
2467 print "You may specify a cascading style-sheet (CSS) file to be included\n";
2468 print "on each html page generated by SquirrelMail. The CSS file is useful\n";
2469 print "for specifying a site-wide font. If you're not familiar with CSS\n";
2470 print "files, leave this blank.\n";
2471 print "\n";
2472 print "To clear out an existing value, just type a space for the input.\n";
2473 print "\n";
2474 print "Please be aware of the following: \n";
2475 print " - Relative URLs are relative to the config dir\n";
2476 print " to use the themes directory, use ../themes/css/newdefault.css\n";
2477 print " - To specify a css file defined outside the SquirrelMail source tree\n";
2478 print " use the absolute URL the webserver would use to include the file\n";
2479 print " e.g. http://some.host.com/css/mystyle.css or /css/mystyle.css\n";
2480 print "\n";
2481 print "[$WHT$theme_css$NRM]: $WHT";
2482 $new_theme_css = <STDIN>;
2483
2484 if ( $new_theme_css eq "\n" ) {
2485 $new_theme_css = $theme_css;
2486 } else {
2487 $new_theme_css =~ s/[\r\n]//g;
2488 }
2489 $new_theme_css =~ s/^\s*//;
2490 return $new_theme_css;
2491 }
2492
2493 sub command61 {
2494 print "You can now define different LDAP servers.\n";
2495 print "[ldap] command (?=help) > ";
2496 $input = <STDIN>;
2497 $input =~ s/[\r\n]//g;
2498 while ( $input ne "d" ) {
2499 if ( $input =~ /^\s*l\s*/i ) {
2500 $count = 0;
2501 while ( $count <= $#ldap_host ) {
2502 print "$count. $ldap_host[$count]\n";
2503 print " base: $ldap_base[$count]\n";
2504 if ( $ldap_charset[$count] ) {
2505 print " charset: $ldap_charset[$count]\n";
2506 }
2507 if ( $ldap_port[$count] ) {
2508 print " port: $ldap_port[$count]\n";
2509 }
2510 if ( $ldap_name[$count] ) {
2511 print " name: $ldap_name[$count]\n";
2512 }
2513 if ( $ldap_maxrows[$count] ) {
2514 print " maxrows: $ldap_maxrows[$count]\n";
2515 }
2516 if ( $ldap_filter[$count] ) {
2517 print " filter: $ldap_filter[$count]\n";
2518 }
2519 if ( $ldap_binddn[$count] ) {
2520 print " binddn: $ldap_binddn[$count]\n";
2521 if ( $ldap_bindpw[$count] ) {
2522 print " bindpw: $ldap_bindpw[$count]\n";
2523 }
2524 }
2525 if ( $ldap_protocol[$count] ) {
2526 print " protocol: $ldap_protocol[$count]\n";
2527 }
2528 if ( $ldap_limit_scope[$count] ) {
2529 print " limit_scope: $ldap_limit_scope[$count]\n";
2530 }
2531 if ( $ldap_listing[$count] ) {
2532 print " listing: $ldap_listing[$count]\n";
2533 }
2534 if ( $ldap_search_tree[$count] ) {
2535 print " search_tree: $ldap_search_tree[$count]\n";
2536 }
2537 if ( $ldap_starttls[$count] ) {
2538 print " starttls: $ldap_starttls[$count]\n";
2539 }
2540
2541 print "\n";
2542 $count++;
2543 }
2544 } elsif ( $input =~ /^\s*\+/ ) {
2545 $sub = $#ldap_host + 1;
2546
2547 print "First, we need to have the hostname or the IP address where\n";
2548 print "this LDAP server resides. Example: ldap.bigfoot.com\n";
2549 print "hostname: ";
2550 $name = <STDIN>;
2551 $name =~ s/[\r\n]//g;
2552 $ldap_host[$sub] = $name;
2553
2554 print "\n";
2555
2556 print "Next, we need the server root (base dn). For this, an empty\n";
2557 print "string is allowed.\n";
2558 print "Example: ou=member_directory,o=netcenter.com\n";
2559 print "base: ";
2560 $name = <STDIN>;
2561 $name =~ s/[\r\n]//g;
2562 $ldap_base[$sub] = $name;
2563
2564 print "\n";
2565
2566 print "This is the TCP/IP port number for the LDAP server. Default\n";
2567 print "port is 389. This is optional. Press ENTER for default.\n";
2568 print "port: ";
2569 $name = <STDIN>;
2570 $name =~ s/[\r\n]//g;
2571 $ldap_port[$sub] = $name;
2572
2573 print "\n";
2574
2575 print "This is the charset for the server. Default is utf-8. This\n";
2576 print "is also optional. Press ENTER for default.\n";
2577 print "charset: ";
2578 $name = <STDIN>;
2579 $name =~ s/[\r\n]//g;
2580 $ldap_charset[$sub] = $name;
2581
2582 print "\n";
2583
2584 print "This is the name for the server, used to tag the results of\n";
2585 print "the search. Default it \"LDAP: hostname\". Press ENTER for default\n";
2586 print "name: ";
2587 $name = <STDIN>;
2588 $name =~ s/[\r\n]//g;
2589 $ldap_name[$sub] = $name;
2590
2591 print "\n";
2592
2593 print "You can specify the maximum number of rows in the search result.\n";
2594 print "Default value is equal to 250 rows. Press ENTER for default.\n";
2595 print "maxrows: ";
2596 $name = <STDIN>;
2597 $name =~ s/[\r\n]//g;
2598 $ldap_maxrows[$sub] = $name;
2599
2600
2601 print "\n";
2602
2603 print "If your LDAP server does not like anonymous logins, you can specify bind DN.\n";
2604 print "Default is none, anonymous bind. Press ENTER for default.\n";
2605 print "binddn: ";
2606 $name = <STDIN>;
2607 $name =~ s/[\r\n]//g;
2608 $ldap_binddn[$sub] = $name;
2609
2610 print "\n";
2611
2612 if ( $ldap_binddn[$sub] ne '' ) {
2613
2614 print "Now, please specify password for that DN.\n";
2615 print "bindpw: ";
2616 $name = <STDIN>;
2617 $name =~ s/[\r\n]//g;
2618 $ldap_bindpw[$sub] = $name;
2619
2620 print "\n";
2621 }
2622
2623 print "You can specify bind protocol version here.\n";
2624 print "Default protocol version depends on your php ldap settings.\n";
2625 print "Press ENTER for default.\n";
2626 print "protocol: ";
2627 $name = <STDIN>;
2628 $name =~ s/[\r\n]//g;
2629 $ldap_protocol[$sub] = $name;
2630
2631 print "\n";
2632
2633 print "This configuration section allows to set some rarely used\n";
2634 print "options and options specific to some LDAP implementations.\n";
2635 print "\n";
2636 print "Do you want to set advanced LDAP directory settings? (y/N):";
2637 $ldap_advanced_settings = <STDIN>;
2638 if ( $ldap_advanced_settings =~ /^y\n/i ) {
2639 $ldap_advanced_settings = 'true';
2640 } else {
2641 $ldap_advanced_settings = 'false';
2642 }
2643
2644 if ($ldap_advanced_settings eq 'true') {
2645 print "\n";
2646
2647 print "You can control LDAP directory listing here. This option can\n";
2648 print "be useful if you run small LDAP server and want to provide listing\n";
2649 print "of all addresses stored in LDAP to users of webmail interface.\n";
2650 print "Number of displayed entries is limited by maxrows setting.\n";
2651 print "\n";
2652 print "Don't enable this option for public LDAP directories.\n";
2653 print "This feature is experimental.\n";
2654 print "\n";
2655 print "Allow listing of LDAP directory? (y/N):";
2656 $name = <STDIN>;
2657 if ( $name =~ /^y\n/i ) {
2658 $name = 'true';
2659 } else {
2660 $name = 'false';
2661 }
2662 $ldap_listing[$sub] = $name;
2663
2664 print "\n";
2665
2666 print "You can specify an additional search filter.\n";
2667 print "This could be something like \"(objectclass=posixAccount)\".\n";
2668 print "No filtering is performed by default. Press ENTER for default.\n";
2669 print "filter: ";
2670 $name = <STDIN>;
2671 $name =~ s/[\r|\n]//g;
2672 $ldap_filter[$sub] = $name;
2673
2674 print "\n";
2675
2676 print "You can control search scope here.\n";
2677 print "This option is specific to Microsoft ADS implementation.\n";
2678 print "It requires use of v3 or newer LDAP protocol.\n";
2679 print "Don't enable it, if you use other LDAP server.\n";
2680 print "\n";
2681 print "Limit ldap scope? (y/N):";
2682 $name = <STDIN>;
2683 if ( $name =~ /^y\n/i ) {
2684 $name = 'true';
2685 } else {
2686 $name = 'false';
2687 }
2688 $ldap_limit_scope[$sub] = $name;
2689
2690 print "\n";
2691
2692 print "You can control ldap search type here.\n";
2693 print "Addresses can be searched in entire LDAP subtree (default)\n";
2694 print "or only first level entries are returned.\n";
2695 print "\n";
2696 print "Search entire LDAP subtree? (Y/n):";
2697 $name = <STDIN>;
2698 if ( $name =~ /^n\n/i ) {
2699 $name = 'false';
2700 } else {
2701 $name = 'true';
2702 }
2703 $ldap_search_tree[$sub] = $name;
2704
2705 print "\n";
2706
2707 print "You can control use of StartTLS on LDAP connection here.\n";
2708 print "This option requires use of v3 or newer LDAP protocol and php 4.2+.\n";
2709 print "\n";
2710 print "Use StartTLS? (y/N):";
2711 $name = <STDIN>;
2712 if ( $name =~ /^y\n/i ) {
2713 $name = 'true';
2714 } else {
2715 $name = 'false';
2716 }
2717 $ldap_starttls[$sub] = $name;
2718 }
2719 print "\n";
2720
2721 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
2722 if ( $input =~ /[0-9]+\s*$/ ) {
2723 $rem_num = $input;
2724 $rem_num =~ s/^\s*-\s*//g;
2725 $rem_num =~ s/\s*$//;
2726 } else {
2727 $rem_num = $#ldap_host;
2728 }
2729 $count = 0;
2730 @new_ldap_host = ();
2731 @new_ldap_base = ();
2732 @new_ldap_port = ();
2733 @new_ldap_name = ();
2734 @new_ldap_charset = ();
2735 @new_ldap_maxrows = ();
2736 @new_ldap_filter = ();
2737 @new_ldap_bindpw = ();
2738 @new_ldap_binddn = ();
2739 @new_ldap_protocol = ();
2740 @new_ldap_limit_scope = ();
2741 @new_ldap_listing = ();
2742 @new_ldap_search_tree = ();
2743 @new_ldap_starttls = ();
2744
2745 while ( $count <= $#ldap_host ) {
2746 if ( $count != $rem_num ) {
2747 @new_ldap_host = ( @new_ldap_host, $ldap_host[$count] );
2748 @new_ldap_base = ( @new_ldap_base, $ldap_base[$count] );
2749 @new_ldap_port = ( @new_ldap_port, $ldap_port[$count] );
2750 @new_ldap_name = ( @new_ldap_name, $ldap_name[$count] );
2751 @new_ldap_charset = ( @new_ldap_charset, $ldap_charset[$count] );
2752 @new_ldap_maxrows = ( @new_ldap_maxrows, $ldap_maxrows[$count] );
2753 @new_ldap_filter = ( @new_ldap_filter, $ldap_filter[$count] );
2754 @new_ldap_binddn = ( @new_ldap_binddn, $ldap_binddn[$count] );
2755 @new_ldap_bindpw = ( @new_ldap_bindpw, $ldap_bindpw[$count] );
2756 @new_ldap_protocol = ( @new_ldap_protocol, $ldap_protocol[$count] );
2757 @new_ldap_limit_scope = ( @new_ldap_limit_scope, $ldap_limit_scope[$count] );
2758 @new_ldap_listing = ( @new_ldap_listing, $ldap_listing[$count] );
2759 @new_ldap_search_tree = ( @new_ldap_search_tree, $ldap_search_tree[$count] );
2760 @new_ldap_starttls = ( @new_ldap_starttls, $ldap_starttls[$count] );
2761 }
2762 $count++;
2763 }
2764 @ldap_host = @new_ldap_host;
2765 @ldap_base = @new_ldap_base;
2766 @ldap_port = @new_ldap_port;
2767 @ldap_name = @new_ldap_name;
2768 @ldap_charset = @new_ldap_charset;
2769 @ldap_maxrows = @new_ldap_maxrows;
2770 @ldap_filter = @new_ldap_filter;
2771 @ldap_binddn = @new_ldap_binddn;
2772 @ldap_bindpw = @new_ldap_bindpw;
2773 @ldap_protocol = @new_ldap_protocol;
2774 @ldap_limit_scope = @new_ldap_limit_scope;
2775 @ldap_listing = @new_ldap_listing;
2776 @ldap_search_tree = @new_ldap_search_tree;
2777 @ldap_starttls = @new_ldap_starttls;
2778
2779 } elsif ( $input =~ /^\s*\?\s*/ ) {
2780 print ".-------------------------.\n";
2781 print "| + (add host) |\n";
2782 print "| - N (remove host) |\n";
2783 print "| l (list hosts) |\n";
2784 print "| d (done) |\n";
2785 print "`-------------------------'\n";
2786 }
2787 print "[ldap] command (?=help) > ";
2788 $input = <STDIN>;
2789 $input =~ s/[\r\n]//g;
2790 }
2791 }
2792
2793 sub command62 {
2794 print "Some of our developers have come up with very good javascript interface\n";
2795 print "for searching through address books, however, our original goals said\n";
2796 print "that we would be 100% HTML. In order to make it possible to use their\n";
2797 print "interface, and yet stick with our goals, we have also written a plain\n";
2798 print "HTML version of the search. Here, you can choose which version to use.\n";
2799 print "\n";
2800 print "This is just the default value. It is also a user option that each\n";
2801 print "user can configure individually\n";
2802 print "\n";
2803
2804 if ( lc($default_use_javascript_addr_book) eq 'true' ) {
2805 $default_value = "y";
2806 } else {
2807 $default_use_javascript_addr_book = 'false';
2808 $default_value = "n";
2809 }
2810 print "Use javascript version by default (y/n) [$WHT$default_value$NRM]: $WHT";
2811 $new_show = <STDIN>;
2812 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2813 $default_use_javascript_addr_book = 'true';
2814 } else {
2815 $default_use_javascript_addr_book = 'false';
2816 }
2817 return $default_use_javascript_addr_book;
2818 }
2819
2820 # global filebased address book
2821 sub command63 {
2822 print "If you want to use global file address book, then you\n";
2823 print "must set this option to a valid value. If option does\n";
2824 print "not have path elements, system assumes that file is\n";
2825 print "stored in data directory. If relative path is set, it is\n";
2826 print "relative to main SquirrelMail directory. If value is empty,\n";
2827 print "address book is not enabled.\n";
2828 print "\n";
2829
2830 print "[$WHT$abook_global_file$NRM]: $WHT";
2831 $new_abook_global_file = <STDIN>;
2832 if ( $new_abook_global_file eq "\n" ) {
2833 $new_abook_global_file = $abook_global_file;
2834 } else {
2835 $new_abook_global_file =~ s/[\r\n]//g;
2836 }
2837 return $new_abook_global_file;
2838 }
2839
2840 # writing into global filebased abook control
2841 sub command64 {
2842 print "This setting controls writing into global file address\n";
2843 print "book options. Address book file must be writeable by\n";
2844 print "webserver's user, if you want to enable this option.\n";
2845 print "\n";
2846
2847 if ( lc($abook_global_file_writeable) eq 'true' ) {
2848 $default_value = "y";
2849 } else {
2850 $abook_global_file_writeable = 'false';
2851 $default_value = "n";
2852 }
2853 print "Allow writing into global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
2854 $new_show = <STDIN>;
2855 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2856 $abook_global_file_writeable = 'true';
2857 } else {
2858 $abook_global_file_writeable = 'false';
2859 }
2860 return $abook_global_file_writeable;
2861 }
2862
2863 # listing of global filebased abook control
2864 sub command65 {
2865 print "This setting controls listing of global file address\n";
2866 print "book in addresses page.\n";
2867 print "\n";
2868
2869 if ( lc($abook_global_file_listing) eq 'true' ) {
2870 $default_value = "y";
2871 } else {
2872 $abook_global_file_listing = 'false';
2873 $default_value = "n";
2874 }
2875 print "Allow listing of global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
2876 $new_show = <STDIN>;
2877 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2878 $abook_global_file_listing = 'true';
2879 } else {
2880 $abook_global_file_listing = 'false';
2881 }
2882 return $abook_global_file_listing;
2883 }
2884
2885 sub command91 {
2886 print "If you want to store your users address book details in a database then\n";
2887 print "you need to set this DSN to a valid value. The format for this is:\n";
2888 print "mysql://user:pass\@hostname/dbname\n";
2889 print "Where mysql can be one of the databases PHP supports, the most common\n";
2890 print "of these are mysql, msql and pgsql\n";
2891 print "If the DSN is left empty (hit space and then return) the database\n";
2892 print "related code for address books will not be used\n";
2893 print "\n";
2894
2895 if ( $addrbook_dsn eq "" ) {
2896 $default_value = "Disabled";
2897 } else {
2898 $default_value = $addrbook_dsn;
2899 }
2900 print "[$WHT$addrbook_dsn$NRM]: $WHT";
2901 $new_dsn = <STDIN>;
2902 if ( $new_dsn eq "\n" ) {
2903 $new_dsn = "";
2904 } else {
2905 $new_dsn =~ s/[\r\n]//g;
2906 $new_dsn =~ s/^\s+$//g;
2907 }
2908 return $new_dsn;
2909 }
2910
2911 sub command92 {
2912 print "This is the name of the table you want to store the address book\n";
2913 print "data in, it defaults to 'address'\n";
2914 print "\n";
2915 print "[$WHT$addrbook_table$NRM]: $WHT";
2916 $new_table = <STDIN>;
2917 if ( $new_table eq "\n" ) {
2918 $new_table = $addrbook_table;
2919 } else {
2920 $new_table =~ s/[\r\n]//g;
2921 }
2922 return $new_table;
2923 }
2924
2925 sub command93 {
2926 print "If you want to store your users preferences in a database then\n";
2927 print "you need to set this DSN to a valid value. The format for this is:\n";
2928 print "mysql://user:pass\@hostname/dbname\n";
2929 print "Where mysql can be one of the databases PHP supports, the most common\n";
2930 print "of these are mysql, msql and pgsql\n";
2931 print "If the DSN is left empty (hit space and then return) the database\n";
2932 print "related code for address books will not be used\n";
2933 print "\n";
2934
2935 if ( $prefs_dsn eq "" ) {
2936 $default_value = "Disabled";
2937 } else {
2938 $default_value = $prefs_dsn;
2939 }
2940 print "[$WHT$prefs_dsn$NRM]: $WHT";
2941 $new_dsn = <STDIN>;
2942 if ( $new_dsn eq "\n" ) {
2943 $new_dsn = "";
2944 } else {
2945 $new_dsn =~ s/[\r\n]//g;
2946 $new_dsn =~ s/^\s+$//g;
2947 }
2948 return $new_dsn;
2949 }
2950
2951 sub command94 {
2952 print "This is the name of the table you want to store the preferences\n";
2953 print "data in, it defaults to 'userprefs'\n";
2954 print "\n";
2955 print "[$WHT$prefs_table$NRM]: $WHT";
2956 $new_table = <STDIN>;
2957 if ( $new_table eq "\n" ) {
2958 $new_table = $prefs_table;
2959 } else {
2960 $new_table =~ s/[\r\n]//g;
2961 }
2962 return $new_table;
2963 }
2964
2965 sub command95 {
2966 print "This is the name of the field in which you want to store the\n";
2967 print "username of the person the prefs are for. It default to 'user'\n";
2968 print "which clashes with a reserved keyword in PostgreSQL so this\n";
2969 print "will need to be changed for that database at least\n";
2970 print "\n";
2971 print "[$WHT$prefs_user_field$NRM]: $WHT";
2972 $new_field = <STDIN>;
2973 if ( $new_field eq "\n" ) {
2974 $new_field = $prefs_user_field;
2975 } else {
2976 $new_field =~ s/[\r\n]//g;
2977 }
2978 $prefs_user_size = db_pref_size($prefs_user_size);
2979 return $new_field;
2980 }
2981
2982 sub command96 {
2983 print "This is the name of the field in which you want to store the\n";
2984 print "preferences keyword. It defaults to 'prefkey'\n";
2985 print "\n";
2986 print "[$WHT$prefs_key_field$NRM]: $WHT";
2987 $new_field = <STDIN>;
2988 if ( $new_field eq "\n" ) {
2989 $new_field = $prefs_key_field;
2990 } else {
2991 $new_field =~ s/[\r\n]//g;
2992 }
2993 $prefs_key_size = db_pref_size($prefs_key_size);
2994 return $new_field;
2995 }
2996
2997 sub command97 {
2998 print "This is the name of the field in which you want to store the\n";
2999 print "preferences value. It defaults to 'prefval'\n";
3000 print "\n";
3001 print "[$WHT$prefs_val_field$NRM]: $WHT";
3002 $new_field = <STDIN>;
3003 if ( $new_field eq "\n" ) {
3004 $new_field = $prefs_val_field;
3005 } else {
3006 $new_field =~ s/[\r\n]//g;
3007 }
3008 $prefs_val_size = db_pref_size($prefs_val_size);
3009 return $new_field;
3010 }
3011
3012 # routine is used to set database field limits
3013 # it needs one argument
3014 sub db_pref_size() {
3015 my ($size) = $_[0];
3016 print "\nDatabase fields have size limits.\n";
3017 print "\n";
3018 print "What limit is set for this field? [$WHT$size$NRM]: $WHT";
3019 $new_size = <STDIN>;
3020 if ( $new_size eq "\n" ) {
3021 $new_size = $size;
3022 } else {
3023 $new_size =~ s/[\r\n]//g;
3024 }
3025 return $new_size;
3026 }
3027
3028 sub command98 {
3029 print "If you want to store your global address book in a database then\n";
3030 print "you need to set this DSN to a valid value. The format for this is:\n";
3031 print "mysql://user:pass\@hostname/dbname\n";
3032 print "Where mysql can be one of the databases PHP supports, the most common\n";
3033 print "of these are mysql, msql and pgsql\n";
3034 print "If the DSN is left empty (hit space and then return) the database\n";
3035 print "related code for global SQL address book will not be used\n";
3036 print "\n";
3037
3038 if ( $addrbook_global_dsn eq "" ) {
3039 $default_value = "Disabled";
3040 } else {
3041 $default_value = $addrbook_global_dsn;
3042 }
3043 print "[$WHT$addrbook_global_dsn$NRM]: $WHT";
3044 $new_dsn = <STDIN>;
3045 if ( $new_dsn eq "\n" ) {
3046 $new_dsn = "";
3047 } else {
3048 $new_dsn =~ s/[\r\n]//g;
3049 $new_dsn =~ s/^\s+$//g;
3050 }
3051 return $new_dsn;
3052 }
3053
3054 sub command99 {
3055 print "This is the name of the table you want to store the global address book\n";
3056 print "data in. Default table name is 'global_abook'. Address book uses same\n";
3057 print "database format as personal address book.\n";
3058 print "\n";
3059 print "[$WHT$addrbook_global_table$NRM]: $WHT";
3060 $new_table = <STDIN>;
3061 if ( $new_table eq "\n" ) {
3062 $new_table = $addrbook_global_table;
3063 } else {
3064 $new_table =~ s/[\r\n]//g;
3065 }
3066 return $new_table;
3067 }
3068
3069 sub command910 {
3070 print "This option controls users\' ability to add or modify records stored \n";
3071 print "in global address book\n";
3072
3073 if ( lc($addrbook_global_writeable) eq 'true' ) {
3074 $default_value = "y";
3075 } else {
3076 $default_value = "n";
3077 }
3078 print "Allow writing into global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
3079 $addrbook_global_writeable = <STDIN>;
3080 if ( ( $addrbook_global_writeable =~ /^y\n/i ) || ( ( $addrbook_global_writeable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3081 $addrbook_global_writeable = 'true';
3082 } else {
3083 $addrbook_global_writeable = 'false';
3084 }
3085 return $addrbook_global_writeable;
3086 }
3087
3088 sub command911 {
3089 print "Enable this option if you want to see listing of addresses stored \n";
3090 print "in global address book\n";
3091
3092 if ( lc($addrbook_global_listing) eq 'true' ) {
3093 $default_value = "y";
3094 } else {
3095 $default_value = "n";
3096 }
3097 print "Allow listing of global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
3098 $addrbook_global_listing = <STDIN>;
3099 if ( ( $addrbook_global_listing =~ /^y\n/i ) || ( ( $addrbook_global_listing =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3100 $addrbook_global_listing = 'true';
3101 } else {
3102 $addrbook_global_listing = 'false';
3103 }
3104 return $addrbook_global_listing;
3105 }
3106
3107
3108 # Default language
3109 sub commandA1 {
3110 print "SquirrelMail attempts to set the language in many ways. If it\n";
3111 print "can not figure it out in another way, it will default to this\n";
3112 print "language. Please use the code for the desired language.\n";
3113 print "\n";
3114 print "[$WHT$squirrelmail_default_language$NRM]: $WHT";
3115 $new_squirrelmail_default_language = <STDIN>;
3116 if ( $new_squirrelmail_default_language eq "\n" ) {
3117 $new_squirrelmail_default_language = $squirrelmail_default_language;
3118 } else {
3119 $new_squirrelmail_default_language =~ s/[\r\n]//g;
3120 $new_squirrelmail_default_language =~ s/^\s+$//g;
3121 }
3122 return $new_squirrelmail_default_language;
3123 }
3124 # Default Charset
3125 sub commandA2 {
3126 print "This option controls what character set is used when sending\n";
3127 print "mail and when sending HTML to the browser. Option works only\n";
3128 print "with US English (en_US) translation. Other translations use\n";
3129 print "charsets that are set in functions/i18n.php.\n";
3130 print "\n";
3131
3132 print "[$WHT$default_charset$NRM]: $WHT";
3133 $new_default_charset = <STDIN>;
3134 if ( $new_default_charset eq "\n" ) {
3135 $new_default_charset = $default_charset;
3136 } else {
3137 $new_default_charset =~ s/[\r\n]//g;
3138 }
3139 return $new_default_charset;
3140 }
3141 # Alternative language names
3142 sub commandA3 {
3143 print "Enable this option if you want to see localized language names in\n";
3144 print "language selection box. Note, that this option can trigger\n";
3145 print "installation of foreign language support modules in some browsers.\n";
3146 print "\n";
3147
3148 if ( lc($show_alternative_names) eq 'true' ) {
3149 $default_value = "y";
3150 } else {
3151 $default_value = "n";
3152 }
3153 print "Show alternative language names? (y/n) [$WHT$default_value$NRM]: $WHT";
3154 $show_alternative_names = <STDIN>;
3155 if ( ( $show_alternative_names =~ /^y\n/i ) || ( ( $show_alternative_names =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3156 $show_alternative_names = 'true';
3157 } else {
3158 $show_alternative_names = 'false';
3159 }
3160 return $show_alternative_names;
3161 }
3162
3163 # Aggressive decoding
3164 sub commandA4 {
3165 print "Enable this option if you want to use CPU and memory intensive decoding\n";
3166 print "functions. This option allows reading multibyte charset, that are used\n";
3167 print "in Eastern Asia. SquirrelMail will try to use recode functions here,\n";
3168 print "even when you have disabled use of recode in Tweaks section.\n";
3169 print "\n";
3170
3171 if ( lc($aggressive_decoding) eq 'true' ) {
3172 $default_value = "y";
3173 } else {
3174 $default_value = "n";
3175 }
3176 print "Enable aggressive decoding? (y/n) [$WHT$default_value$NRM]: $WHT";
3177 $aggressive_decoding = <STDIN>;
3178 if ( ( $aggressive_decoding =~ /^y\n/i ) || ( ( $aggressive_decoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3179 $aggressive_decoding = 'true';
3180 } else {
3181 $aggressive_decoding = 'false';
3182 }
3183 return $aggressive_decoding;
3184 }
3185
3186 # Lossy encoding
3187 sub commandA5 {
3188 print "Enable this option if you want to allow lossy charset encoding in message\n";
3189 print "composition pages. This option allows charset conversions when output\n";
3190 print "charset does not support all symbols used in original charset. Symbols\n";
3191 print "unsupported by output charset will be replaced with question marks.\n";
3192 print "\n";
3193
3194 if ( lc($lossy_encoding) eq 'true' ) {
3195 $default_value = "y";
3196 } else {
3197 $default_value = "n";
3198 }
3199 print "Enable lossy encoding? (y/n) [$WHT$default_value$NRM]: $WHT";
3200 $lossy_encoding = <STDIN>;
3201 if ( ( $lossy_encoding =~ /^y\n/i ) || ( ( $lossy_encoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3202 $lossy_encoding = 'true';
3203 } else {
3204 $lossy_encoding = 'false';
3205 }
3206 return $lossy_encoding;
3207 }
3208
3209
3210 # Advanced tree
3211 sub commandB1 {
3212 print "Enable this option if you want to use DHTML based folder listing.\n";
3213 print "Code is experimental, works only with some browsers and there might\n";
3214 print "be some glitches.\n";
3215 print "\n";
3216
3217 if ( lc($advanced_tree) eq 'true' ) {
3218 $default_value = "y";
3219 } else {
3220 $default_value = "n";
3221 }
3222 print "Use advanced tree in folder listing? (y/n) [$WHT$default_value$NRM]: $WHT";
3223 $advanced_tree = <STDIN>;
3224 if ( ( $advanced_tree =~ /^y\n/i ) || ( ( $advanced_tree =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3225 $advanced_tree = 'true';
3226 } else {
3227 $advanced_tree = 'false';
3228 }
3229 return $advanced_tree;
3230 }
3231 # display html emails in iframe
3232 sub commandB2 {
3233 print "This option can enable html email rendering inside iframe.\n";
3234 print "Inline frames are used in order to provide sandbox environment";
3235 print "for html code included in html formated emails.";
3236 print "Option is experimental and might have glitches in some parts of code.";
3237 print "\n";
3238
3239 if ( lc($use_iframe) eq 'true' ) {
3240 $default_value = "y";
3241 } else {
3242 $default_value = "n";
3243 }
3244 print "Display html emails in iframe? (y/n) [$WHT$default_value$NRM]: $WHT";
3245 $use_iframe = <STDIN>;
3246 if ( ( $use_iframe =~ /^y\n/i ) || ( ( $use_iframe =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3247 $use_iframe = 'true';
3248 } else {
3249 $use_iframe = 'false';
3250 }
3251 return $use_iframe;
3252 }
3253 # use icons
3254 sub commandB3 {
3255 print "Enabling this option will cause icons to be used instead of text\n";
3256 print "markers next to each message in mailbox lists that represent\n";
3257 print "new, read, flagged, and deleted messages, as well as those that\n";
3258 print "have been replied to and forwarded. Icons are also used next to\n";
3259 print "(un)expanded folders in the folder list (Oldway = false). These\n";
3260 print "icons are quite small, but will obviously be more of a resource\n";
3261 print "drain than text markers.\n";
3262 print "\n";
3263
3264 if ( lc($use_icons) eq 'true' ) {
3265 $default_value = "y";
3266 } else {
3267 $default_value = "n";
3268 }
3269 print "Use icons? (y/n) [$WHT$default_value$NRM]: $WHT";
3270 $use_icons = <STDIN>;
3271 if ( ( $use_icons =~ /^y\n/i ) || ( ( $use_icons =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3272 $use_icons = 'true';
3273 } else {
3274 $use_icons = 'false';
3275 }
3276 return $use_icons;
3277 }
3278 # php recode
3279 sub commandB4 {
3280 print "Enable this option if you want to use php recode functions to read\n";
3281 print "emails written in charset that differs from the one that is set in\n";
3282 print "translation selected by user. Code is experimental, it might cause\n";
3283 print "errors, if email contains charset unsupported by recode or if your\n";
3284 print "php does not have recode support.\n";
3285 print "\n";
3286
3287 if ( lc($use_php_recode) eq 'true' ) {
3288 $default_value = "y";
3289 } else {
3290 $default_value = "n";
3291 }
3292 print "Use php recode functions? (y/n) [$WHT$default_value$NRM]: $WHT";
3293 $use_php_recode = <STDIN>;
3294 if ( ( $use_php_recode =~ /^y\n/i ) || ( ( $use_php_recode =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3295 $use_php_recode = 'true';
3296 } else {
3297 $use_php_recode = 'false';
3298 }
3299 return $use_php_recode;
3300 }
3301 # php iconv
3302 sub commandB5 {
3303 print "Enable this option if you want to use php iconv functions to read\n";
3304 print "emails written in charset that differs from the one that is set in\n";
3305 print "translation selected by user. Code is experimental, it works only\n";
3306 print "with translations that use utf-8 charset. Code might cause errors,\n";
3307 print "if email contains charset unsupported by iconv or if your php does\n";
3308 print "not have iconv support.\n";
3309 print "\n";
3310
3311 if ( lc($use_php_iconv) eq 'true' ) {
3312 $default_value = "y";
3313 } else {
3314 $default_value = "n";
3315 }
3316 print "Use php iconv functions? (y/n) [$WHT$default_value$NRM]: $WHT";
3317 $use_php_iconv = <STDIN>;
3318 if ( ( $use_php_iconv =~ /^y\n/i ) || ( ( $use_php_iconv =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3319 $use_php_iconv = 'true';
3320 } else {
3321 $use_php_iconv = 'false';
3322 }
3323 return $use_php_iconv;
3324 }
3325
3326 # configtest block
3327 sub commandB6 {
3328 print "Enable this option if you want to check SquirrelMail configuration\n";
3329 print "remotely with configtest.php script.\n";
3330 print "\n";
3331
3332 if ( lc($allow_remote_configtest) eq 'true' ) {
3333 $default_value = "y";
3334 } else {
3335 $default_value = "n";
3336 }
3337 print "Allow remote configuration tests? (y/n) [$WHT$default_value$NRM]: $WHT";
3338 $allow_remote_configtest = <STDIN>;
3339 if ( ( $allow_remote_configtest =~ /^y\n/i ) || ( ( $allow_remote_configtest =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3340 $allow_remote_configtest = 'true';
3341 } else {
3342 $allow_remote_configtest = 'false';
3343 }
3344 return $allow_remote_configtest;
3345 }
3346
3347
3348
3349 sub save_data {
3350 $tab = " ";
3351 if ( open( CF, ">config.php" ) ) {
3352 print CF "<?php\n";
3353 print CF "\n";
3354
3355 print CF "/**\n";
3356 print CF " * SquirrelMail Configuration File\n";
3357 print CF " * Created using the configure script, conf.pl\n";
3358 print CF " */\n";
3359 print CF "\n";
3360 print CF "global \$version;\n";
3361
3362 if ($print_config_version) {
3363 print CF "\$config_version = '$print_config_version';\n";
3364 }
3365 # integer
3366 print CF "\$config_use_color = $config_use_color;\n";
3367 print CF "\n";
3368
3369 # string
3370 print CF "\$org_name = \"$org_name\";\n";
3371 # string
3372 print CF "\$org_logo = " . &change_to_SM_path($org_logo) . ";\n";
3373 $org_logo_width |= 0;
3374 $org_logo_height |= 0;
3375 # string
3376 print CF "\$org_logo_width = '$org_logo_width';\n";
3377 # string
3378 print CF "\$org_logo_height = '$org_logo_height';\n";
3379 # string that can contain variables.
3380 print CF "\$org_title = \"$org_title\";\n";
3381 # string
3382 print CF "\$signout_page = " . &change_to_SM_path($signout_page) . ";\n";
3383 # string
3384 print CF "\$frame_top = '$frame_top';\n";
3385 print CF "\n";
3386
3387 print CF "\$provider_uri = '$provider_uri';\n";
3388 print CF "\n";
3389
3390 print CF "\$provider_name = '$provider_name';\n";
3391 print CF "\n";
3392
3393 # string that can contain variables
3394 print CF "\$motd = \"$motd\";\n";
3395 print CF "\n";
3396
3397 # string
3398 print CF "\$squirrelmail_default_language = '$squirrelmail_default_language';\n";
3399 # string
3400 print CF "\$default_charset = '$default_charset';\n";
3401 # boolean
3402 print CF "\$show_alternative_names = $show_alternative_names;\n";
3403 # boolean
3404 print CF "\$aggressive_decoding = $aggressive_decoding;\n";
3405 # boolean
3406 print CF "\$lossy_encoding = $lossy_encoding;\n";
3407 print CF "\n";
3408
3409 # string
3410 print CF "\$domain = '$domain';\n";
3411 # string
3412 print CF "\$imapServerAddress = '$imapServerAddress';\n";
3413 # integer
3414 print CF "\$imapPort = $imapPort;\n";
3415 # boolean
3416 print CF "\$useSendmail = $useSendmail;\n";
3417 # string
3418 print CF "\$smtpServerAddress = '$smtpServerAddress';\n";
3419 # integer
3420 print CF "\$smtpPort = $smtpPort;\n";
3421 # string
3422 print CF "\$sendmail_path = '$sendmail_path';\n";
3423 # boolean
3424 # print CF "\$use_authenticated_smtp = $use_authenticated_smtp;\n";
3425 # boolean
3426 print CF "\$pop_before_smtp = $pop_before_smtp;\n";
3427 # string
3428 print CF "\$imap_server_type = '$imap_server_type';\n";
3429 # boolean
3430 print CF "\$invert_time = $invert_time;\n";
3431 # string
3432 print CF "\$optional_delimiter = '$optional_delimiter';\n";
3433 # string
3434 print CF "\$encode_header_key = '$encode_header_key';\n";
3435 print CF "\n";
3436
3437 # string
3438 print CF "\$default_folder_prefix = '$default_folder_prefix';\n";
3439 # string
3440 print CF "\$trash_folder = '$trash_folder';\n";
3441 # string
3442 print CF "\$sent_folder = '$sent_folder';\n";
3443 # string
3444 print CF "\$draft_folder = '$draft_folder';\n";
3445 # boolean
3446 print CF "\$default_move_to_trash = $default_move_to_trash;\n";
3447 # boolean
3448 print CF "\$default_move_to_sent = $default_move_to_sent;\n";
3449 # boolean
3450 print CF "\$default_save_as_draft = $default_save_as_draft;\n";
3451 # boolean
3452 print CF "\$show_prefix_option = $show_prefix_option;\n";
3453 # boolean
3454 print CF "\$list_special_folders_first = $list_special_folders_first;\n";
3455 # boolean
3456 print CF "\$use_special_folder_color = $use_special_folder_color;\n";
3457 # boolean
3458 print CF "\$auto_expunge = $auto_expunge;\n";
3459 # boolean
3460 print CF "\$default_sub_of_inbox = $default_sub_of_inbox;\n";
3461 # boolean
3462 print CF "\$show_contain_subfolders_option = $show_contain_subfolders_option;\n";
3463 # integer
3464 print CF "\$default_unseen_notify = $default_unseen_notify;\n";
3465 # integer
3466 print CF "\$default_unseen_type = $default_unseen_type;\n";
3467 # boolean
3468 print CF "\$auto_create_special = $auto_create_special;\n";
3469 # boolean
3470 print CF "\$delete_folder = $delete_folder;\n";
3471 # boolean
3472 print CF "\$noselect_fix_enable = $noselect_fix_enable;\n";
3473
3474 print CF "\n";
3475
3476 # string
3477 print CF "\$data_dir = " . &change_to_SM_path($data_dir) . ";\n";
3478 # string that can contain a variable
3479 print CF "\$attachment_dir = " . &change_to_SM_path($attachment_dir) . ";\n";
3480 # integer
3481 print CF "\$dir_hash_level = $dir_hash_level;\n";
3482 # string
3483 print CF "\$default_left_size = '$default_left_size';\n";
3484 # boolean
3485 print CF "\$force_username_lowercase = $force_username_lowercase;\n";
3486 # boolean
3487 print CF "\$default_use_priority = $default_use_priority;\n";
3488 # boolean
3489 print CF "\$hide_sm_attributions = $hide_sm_attributions;\n";
3490 # boolean
3491 print CF "\$default_use_mdn = $default_use_mdn;\n";
3492 # boolean
3493 print CF "\$edit_identity = $edit_identity;\n";
3494 # boolean
3495 print CF "\$edit_name = $edit_name;\n";
3496 # boolean
3497 print CF "\$hide_auth_header = $hide_auth_header;\n";
3498 # boolean
3499 print CF "\$allow_thread_sort = $allow_thread_sort;\n";
3500 # boolean
3501 print CF "\$allow_server_sort = $allow_server_sort;\n";
3502 # boolean
3503 print CF "\$allow_charset_search = $allow_charset_search;\n";
3504 # integer
3505 print CF "\$allow_advanced_search = $allow_advanced_search;\n";
3506 print CF "\n";
3507 # integer
3508 print CF "\$time_zone_type = $time_zone_type;\n";
3509 print CF "\n";
3510
3511 # all plugins are strings
3512 for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
3513 print CF "\$plugins[] = '$plugins[$ct]';\n";
3514 }
3515 print CF "\n";
3516
3517 # strings
3518 print CF "\$theme_css = " . &change_to_SM_path($theme_css) . ";\n";
3519 if ( $theme_default eq '' ) { $theme_default = '0'; }
3520 print CF "\$theme_default = $theme_default;\n";
3521
3522 for ( $count = 0 ; $count <= $#theme_name ; $count++ ) {
3523 print CF "\$theme[$count]['PATH'] = " . &change_to_SM_path($theme_path[$count]) . ";\n";
3524 # escape theme name so it can contain single quotes.
3525 $esc_name = $theme_name[$count];
3526 $esc_name =~ s/\\/\\\\/g;
3527 $esc_name =~ s/'/\\'/g;
3528 print CF "\$theme[$count]['NAME'] = '$esc_name';\n";
3529 }
3530 print CF "\n";
3531
3532 ## Address books
3533 # boolean
3534 print CF "\$default_use_javascript_addr_book = $default_use_javascript_addr_book;\n";
3535 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
3536 print CF "\$ldap_server[$count] = array(\n";
3537 # string
3538 print CF " 'host' => '$ldap_host[$count]',\n";
3539 # string
3540 print CF " 'base' => '$ldap_base[$count]'";
3541 if ( $ldap_name[$count] ) {
3542 print CF ",\n";
3543 # string
3544 print CF " 'name' => '$ldap_name[$count]'";
3545 }
3546 if ( $ldap_port[$count] ) {
3547 print CF ",\n";
3548 # integer
3549 print CF " 'port' => $ldap_port[$count]";
3550 }
3551 if ( $ldap_charset[$count] ) {
3552 print CF ",\n";
3553 # string
3554 print CF " 'charset' => '$ldap_charset[$count]'";
3555 }
3556 if ( $ldap_maxrows[$count] ) {
3557 print CF ",\n";
3558 # integer
3559 print CF " 'maxrows' => $ldap_maxrows[$count]";
3560 }
3561 # string
3562 if ( $ldap_filter[$count] ) {
3563 print CF ",\n";
3564 print CF " 'filter' => '$ldap_filter[$count]'";
3565 }
3566 if ( $ldap_binddn[$count] ) {
3567 print CF ",\n";
3568 # string
3569 print CF " 'binddn' => '$ldap_binddn[$count]'";
3570 if ( $ldap_bindpw[$count] ) {
3571 print CF ",\n";
3572 # string
3573 print CF " 'bindpw' => '$ldap_bindpw[$count]'";
3574 }
3575 }
3576 if ( $ldap_protocol[$count] ) {
3577 print CF ",\n";
3578 # integer
3579 print CF " 'protocol' => $ldap_protocol[$count]";
3580 }
3581 if ( $ldap_limit_scope[$count] ) {
3582 print CF ",\n";
3583 # boolean
3584 print CF " 'limit_scope' => $ldap_limit_scope[$count]";
3585 }
3586 if ( $ldap_listing[$count] ) {
3587 print CF ",\n";
3588 # boolean
3589 print CF " 'listing' => $ldap_listing[$count]";
3590 }
3591 if ( $ldap_search_tree[$count] ) {
3592 print CF ",\n";
3593 # integer
3594 print CF " 'search_tree' => $ldap_search_tree[$count]";
3595 }
3596 if ( $ldap_listing[$count] ) {
3597 print CF ",\n";
3598 # boolean
3599 print CF " 'starttls' => $ldap_starttls[$count]";
3600 }
3601 print CF "\n";
3602 print CF ");\n";
3603 print CF "\n";
3604 }
3605
3606 # string
3607 print CF "\$addrbook_dsn = '$addrbook_dsn';\n";
3608 # string
3609 print CF "\$addrbook_table = '$addrbook_table';\n\n";
3610 # string
3611 print CF "\$prefs_dsn = '$prefs_dsn';\n";
3612 # string
3613 print CF "\$prefs_table = '$prefs_table';\n";
3614 # string
3615 print CF "\$prefs_user_field = '$prefs_user_field';\n";
3616 # integer
3617 print CF "\$prefs_user_size = $prefs_user_size;\n";
3618 # string
3619 print CF "\$prefs_key_field = '$prefs_key_field';\n";
3620 # integer
3621 print CF "\$prefs_key_size = $prefs_key_size;\n";
3622 # string
3623 print CF "\$prefs_val_field = '$prefs_val_field';\n";
3624 # integer
3625 print CF "\$prefs_val_size = $prefs_val_size;\n\n";
3626 # string
3627 print CF "\$addrbook_global_dsn = '$addrbook_global_dsn';\n";
3628 # string
3629 print CF "\$addrbook_global_table = '$addrbook_global_table';\n";
3630 # boolean
3631 print CF "\$addrbook_global_writeable = $addrbook_global_writeable;\n";
3632 # boolean
3633 print CF "\$addrbook_global_listing = $addrbook_global_listing;\n\n";
3634 # string
3635 print CF "\$abook_global_file = '$abook_global_file';\n";
3636 # boolean
3637 print CF "\$abook_global_file_writeable = $abook_global_file_writeable;\n\n";
3638 # boolean
3639 print CF "\$abook_global_file_listing = $abook_global_file_listing;\n\n";
3640 # boolean
3641 print CF "\$no_list_for_subscribe = $no_list_for_subscribe;\n";
3642
3643 # string
3644 print CF "\$smtp_auth_mech = '$smtp_auth_mech';\n";
3645 # string
3646 print CF "\$imap_auth_mech = '$imap_auth_mech';\n";
3647 # boolean
3648 print CF "\$use_imap_tls = $use_imap_tls;\n";
3649 # boolean
3650 print CF "\$use_smtp_tls = $use_smtp_tls;\n";
3651 # string
3652 print CF "\$session_name = '$session_name';\n";
3653
3654 print CF "\n";
3655
3656 # boolean
3657 print CF "\$advanced_tree = $advanced_tree;\n";
3658 print CF "\n";
3659 # boolean
3660 print CF "\$use_iframe = $use_iframe;\n";
3661 print CF "\n";
3662 # boolean
3663 print CF "\$use_icons = $use_icons;\n";
3664 print CF "\n";
3665 # boolean
3666 print CF "\$use_php_recode = $use_php_recode;\n";
3667 print CF "\n";
3668 # boolean
3669 print CF "\$use_php_iconv = $use_php_iconv;\n";
3670 print CF "\n";
3671 # boolean
3672 print CF "\$allow_remote_configtest = $allow_remote_configtest;\n";
3673 print CF "\n";
3674
3675 print CF "\@include SM_PATH . 'config/config_local.php';\n";
3676
3677 print CF "\n/**\n";
3678 print CF " * Make sure there are no characters after the PHP closing\n";
3679 print CF " * tag below (including newline characters and whitespace).\n";
3680 print CF " * Otherwise, that character will cause the headers to be\n";
3681 print CF " * sent and regular output to begin, which will majorly screw\n";
3682 print CF " * things up when we try to send more headers later.\n";
3683 print CF " */\n";
3684 print CF "?>";
3685
3686 close CF;
3687
3688 print "Data saved in config.php\n";
3689 } else {
3690 print "Error saving config.php: $!\n";
3691 }
3692 }
3693
3694 sub set_defaults {
3695 clear_screen();
3696 print $WHT. "SquirrelMail Configuration : " . $NRM;
3697 if ( $config == 1 ) { print "Read: config.php"; }
3698 elsif ( $config == 2 ) { print "Read: config_default.php"; }
3699 print "\n";
3700 print "---------------------------------------------------------\n";
3701
3702 print "While we have been building SquirrelMail, we have discovered some\n";
3703 print "preferences that work better with some servers that don't work so\n";
3704 print "well with others. If you select your IMAP server, this option will\n";
3705 print "set some pre-defined settings for that server.\n";
3706 print "\n";
3707 print "Please note that you will still need to go through and make sure\n";
3708 print "everything is correct. This does not change everything. There are\n";
3709 print "only a few settings that this will change.\n";
3710 print "\n";
3711
3712 $continue = 0;
3713 while ( $continue != 1 ) {
3714 print "Please select your IMAP server:\n";
3715 print " bincimap = Binc IMAP server\n";
3716 print " courier = Courier IMAP server\n";
3717 print " cyrus = Cyrus IMAP server\n";
3718 print " dovecot = Dovecot Secure IMAP server\n";
3719 print " exchange = Microsoft Exchange IMAP server\n";
3720 print " hmailserver = hMailServer\n";
3721 print " macosx = Mac OS X Mailserver\n";
3722 print " mercury32 = Mercury/32\n";
3723 print " uw = University of Washington's IMAP server\n";
3724 print "\n";
3725 print " quit = Do not change anything\n";
3726 print "\n";
3727 print "Command >> ";
3728 $server = <STDIN>;
3729 $server =~ s/[\r\n]//g;
3730
3731 # variable is used to display additional messages.
3732 $message = "";
3733
3734 print "\n";
3735 if ( $server eq "cyrus" ) {
3736 $imap_server_type = "cyrus";
3737 $default_folder_prefix = "";
3738 $trash_folder = "INBOX.Trash";
3739 $sent_folder = "INBOX.Sent";
3740 $draft_folder = "INBOX.Drafts";
3741 $show_prefix_option = false;
3742 $default_sub_of_inbox = true;
3743 $show_contain_subfolders_option = false;
3744 $optional_delimiter = ".";
3745 $disp_default_folder_prefix = "<none>";
3746 $force_username_lowercase = false;
3747
3748 $continue = 1;
3749 } elsif ( $server eq "uw" ) {
3750 $imap_server_type = "uw";
3751 $default_folder_prefix = "mail/";
3752 $trash_folder = "Trash";
3753 $sent_folder = "Sent";
3754 $draft_folder = "Drafts";
3755 $show_prefix_option = true;
3756 $default_sub_of_inbox = false;
3757 $show_contain_subfolders_option = true;
3758 $optional_delimiter = "/";
3759 $disp_default_folder_prefix = $default_folder_prefix;
3760 $delete_folder = true;
3761 $force_username_lowercase = true;
3762
3763 $continue = 1;
3764 } elsif ( $server eq "exchange" ) {
3765 $imap_server_type = "exchange";
3766 $default_folder_prefix = "";
3767 $default_sub_of_inbox = true;
3768 $trash_folder = "INBOX/Deleted Items";
3769 $sent_folder = "INBOX/Sent Items";
3770 $drafts_folder = "INBOX/Drafts";
3771 $show_prefix_option = false;
3772 $show_contain_subfolders_option = false;
3773 $optional_delimiter = "detect";
3774 $disp_default_folder_prefix = "<none>";
3775 $force_username_lowercase = true;
3776
3777 $continue = 1;
3778 } elsif ( $server eq "courier" ) {
3779 $imap_server_type = "courier";
3780 $default_folder_prefix = "INBOX.";
3781 $trash_folder = "Trash";
3782 $sent_folder = "Sent";
3783 $draft_folder = "Drafts";
3784 $show_prefix_option = false;
3785 $default_sub_of_inbox = false;
3786 $show_contain_subfolders_option = false;
3787 $optional_delimiter = ".";
3788 $disp_default_folder_prefix = $default_folder_prefix;
3789 $delete_folder = true;
3790 $force_username_lowercase = false;
3791
3792 $continue = 1;
3793 } elsif ( $server eq "macosx" ) {
3794 $imap_server_type = "macosx";
3795 $default_folder_prefix = "INBOX/";
3796 $trash_folder = "Trash";
3797 $sent_folder = "Sent";
3798 $draft_folder = "Drafts";
3799 $show_prefix_option = false;
3800 $default_sub_of_inbox = true;
3801 $show_contain_subfolders_option = false;
3802 $optional_delimiter = "detect";
3803 $allow_charset_search = false;
3804 $disp_default_folder_prefix = $default_folder_prefix;
3805
3806 $continue = 1;
3807 } elsif ( $server eq "hmailserver" ) {
3808 $imap_server_type = "hmailserver";
3809 $default_folder_prefix = "";
3810 $trash_folder = "INBOX.Trash";
3811 $sent_folder = "INBOX.Sent";
3812 $draft_folder = "INBOX.Drafts";
3813 $show_prefix_option = false;
3814 $default_sub_of_inbox = true;
3815 $show_contain_subfolders_option = false;
3816 $optional_delimiter = "detect";
3817 $allow_charset_search = false;
3818 $disp_default_folder_prefix = $default_folder_prefix;
3819 $delete_folder = false;
3820 $force_username_lowercase = false;
3821
3822 $continue = 1;
3823 } elsif ( $server eq "mercury32" ) {
3824 $imap_server_type = "mercury32";
3825 $default_folder_prefix = "";
3826 $trash_folder = "Trash";
3827 $sent_folder = "Sent";
3828 $draft_folder = "Drafts";
3829 $show_prefix_option = false;
3830 $default_sub_of_inbox = true;
3831 $show_contain_subfolders_option = true;
3832 $optional_delimiter = "detect";
3833 $delete_folder = true;
3834 $force_username_lowercase = true;
3835
3836 $continue = 1;
3837 } elsif ( $server eq "dovecot" ) {
3838 $imap_server_type = "dovecot";
3839 $default_folder_prefix = "";
3840 $trash_folder = "Trash";
3841 $sent_folder = "Sent";
3842 $draft_folder = "Drafts";
3843 $show_prefix_option = false;
3844 $default_sub_of_inbox = false;
3845 $show_contain_subfolders_option = false;
3846 $delete_folder = false;
3847 $force_username_lowercase = true;
3848 $optional_delimiter = "detect";
3849 $disp_default_folder_prefix = "<none>";
3850
3851 $continue = 1;
3852 } elsif ( $server eq "bincimap" ) {
3853 $imap_server_type = "bincimap";
3854 $default_folder_prefix = "INBOX/";
3855 $trash_folder = "Trash";
3856 $sent_folder = "Sent";
3857 $draft_folder = "Drafts";
3858 $show_prefix_option = false;
3859 $default_sub_of_inbox = false;
3860 $show_contain_subfolders_option = false;
3861 $delete_folder = true;
3862 $force_username_lowercase = false;
3863 $optional_delimiter = "detect";
3864 $disp_default_folder_prefix = $default_folder_prefix;
3865
3866 # Default folder prefix depends on used depot.
3867 $message = "\nIf you use IMAPdir depot, you must set default folder prefix to empty string.\n";
3868
3869 $continue = 1;
3870 } elsif ( $server eq "quit" ) {
3871 $continue = 1;
3872 } else {
3873 $disp_default_folder_prefix = $default_folder_prefix;
3874 print "Unrecognized server: $server\n";
3875 print "\n";
3876 }
3877
3878 print " imap_server_type = $imap_server_type\n";
3879 print " default_folder_prefix = $disp_default_folder_prefix\n";
3880 print " trash_folder = $trash_folder\n";
3881 print " sent_folder = $sent_folder\n";
3882 print " draft_folder = $draft_folder\n";
3883 print " show_prefix_option = $show_prefix_option\n";
3884 print " default_sub_of_inbox = $default_sub_of_inbox\n";
3885 print "show_contain_subfolders_option = $show_contain_subfolders_option\n";
3886 print " optional_delimiter = $optional_delimiter\n";
3887 print " delete_folder = $delete_folder\n";
3888 print " force_username_lowercase = $force_username_lowercase\n";
3889
3890 print "$message";
3891 }
3892 print "\nPress enter to continue...";
3893 $tmp = <STDIN>;
3894 }
3895
3896 # This subroutine corrects relative paths to ensure they
3897 # will work within the SM space. If the path falls within
3898 # the SM directory tree, the SM_PATH variable will be
3899 # prepended to the path, if not, then the path will be
3900 # converted to an absolute path, e.g.
3901 # '../images/logo.gif' --> SM_PATH . 'images/logo.gif'
3902 # '../../someplace/data' --> '/absolute/path/someplace/data'
3903 # 'images/logo.gif' --> SM_PATH . 'config/images/logo.gif'
3904 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
3905 # 'http://whatever/' --> 'http://whatever'
3906 # $some_var/path --> "$some_var/path"
3907 sub change_to_SM_path() {
3908 my ($old_path) = @_;
3909 my $new_path = '';
3910 my @rel_path;
3911 my @abs_path;
3912 my $subdir;
3913
3914 # If the path is absolute, don't bother.
3915 return "\'" . $old_path . "\'" if ( $old_path eq '');
3916 return "\'" . $old_path . "\'" if ( $old_path =~ /^(\/|http)/ );
3917 return "\'" . $old_path . "\'" if ( $old_path =~ /^\w:\// );
3918 return $old_path if ( $old_path =~ /^\'(\/|http)/ );
3919 return $old_path if ( $old_path =~ /^\'\w:\// );
3920 return $old_path if ( $old_path =~ /^SM_PATH/);
3921
3922 if ( $old_path =~ /^\$/ ) {
3923 # check if it's a single var, or a $var/path combination
3924 # if it's $var/path, enclose in ""
3925 if ( $old_path =~ /\// ) {
3926 return '"'.$old_path.'"';
3927 }
3928 return $old_path;
3929 }
3930
3931 # Remove remaining '
3932 $old_path =~ s/\'//g;
3933
3934 # For relative paths, split on '../'
3935 @rel_path = split(/\.\.\//, $old_path);
3936
3937 if ( $#rel_path > 1 ) {
3938 # more than two levels away. Make it absolute.
3939 @abs_path = split(/\//, $dir);
3940
3941 # Lop off the relative pieces of the absolute path..
3942 for ( $i = 0; $i <= $#rel_path; $i++ ) {
3943 pop @abs_path;
3944 shift @rel_path;
3945 }
3946 push @abs_path, @rel_path;
3947 $new_path = "\'" . join('/', @abs_path) . "\'";
3948 } elsif ( $#rel_path > 0 ) {
3949 # it's within the SM tree, prepend SM_PATH
3950 $new_path = $old_path;
3951 $new_path =~ s/^\.\.\//SM_PATH . \'/;
3952 $new_path .= "\'";
3953 } else {
3954 # Last, it's a relative path without any leading '.'
3955 # Prepend SM_PATH and config, since the paths are
3956 # relative to the config directory
3957 $new_path = "SM_PATH . \'config/" . $old_path . "\'";
3958 }
3959 return $new_path;
3960 }
3961
3962
3963 # Change SM_PATH to admin-friendly version, e.g.:
3964 # SM_PATH . 'images/logo.gif' --> '../images/logo.gif'
3965 # SM_PATH . 'config/some.php' --> 'some.php'
3966 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
3967 # 'http://whatever/' --> 'http://whatever'
3968 sub change_to_rel_path() {
3969 my ($old_path) = @_;
3970 my $new_path = $old_path;
3971
3972 if ( $old_path =~ /^SM_PATH/ ) {
3973 $new_path =~ s/^SM_PATH . \'/\.\.\//;
3974 $new_path =~ s/\.\.\/config\///;
3975 }
3976
3977 return $new_path;
3978 }
3979
3980 sub detect_auth_support {
3981 # Attempts to auto-detect if a specific auth mechanism is supported.
3982 # Called by 'command112a' and 'command112b'
3983 # ARGS: service-name (IMAP or SMTP), host:port, mech-name (ie. CRAM-MD5)
3984
3985 # Misc setup
3986 use IO::Socket;
3987 my $service = shift;
3988 my $host = shift;
3989 my $mech = shift;
3990 # Sanity checks
3991 if ((!defined($service)) or (!defined($host)) or (!defined($mech))) {
3992 # Error - wrong # of args
3993 print "BAD ARGS!\n";
3994 return undef;
3995 }
3996
3997 if ($service eq 'SMTP') {
3998 $cmd = "AUTH $mech\r\n";
3999 $logout = "QUIT\r\n";
4000 } elsif ($service eq 'IMAP') {
4001 $cmd = "A01 AUTHENTICATE $mech\n";
4002 $logout = "C01 LOGOUT\n";
4003 } else {
4004 # unknown service - whoops.
4005 return undef;
4006 }
4007
4008 # Get this show on the road
4009 my $sock=IO::Socket::INET->new($host);
4010 if (!defined($sock)) {
4011 # Connect failed
4012 return undef;
4013 }
4014 my $discard = <$sock>; # Server greeting/banner - who cares..
4015
4016 if ($service eq 'SMTP') {
4017 # Say hello first..
4018 print $sock "HELO $domain\r\n";
4019 $discard = <$sock>; # Yeah yeah, you're happy to see me..
4020 }
4021 print $sock $cmd;
4022
4023 my $response = <$sock>;
4024 chomp($response);
4025 if (!defined($response)) {
4026 return undef;
4027 }
4028
4029 # So at this point, we have a response, and it is (hopefully) valid.
4030 if ($service eq 'SMTP') {
4031 if (($response =~ /^535/) or ($response =~/^502/)) {
4032 # Not supported
4033 print $sock $logout;
4034 close $sock;
4035 return 'NO';
4036 } elsif ($response =~ /^503/) {
4037 #Something went wrong
4038 return undef;
4039 }
4040 } elsif ($service eq 'IMAP') {
4041 if ($response =~ /^A01/) {
4042 # Not supported
4043 print $sock $logout;
4044 close $sock;
4045 return 'NO';
4046 }
4047 } else {
4048 # Unknown service - this shouldn't be able to happen.
4049 close $sock;
4050 return undef;
4051 }
4052
4053 # If it gets here, the mech is supported
4054 print $sock "*\n"; # Attempt to cancel authentication
4055 print $sock $logout; # Try to log out, but we don't really care if this fails
4056 close $sock;
4057 return 'YES';
4058 }
4059
4060 sub clear_screen() {
4061 if ( $^O =~ /^mswin/i) {
4062 system "cls";
4063 } else {
4064 system "clear";
4065 }
4066 }