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