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