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