Disable SVG display be default
[squirrelmail.git] / config / conf.pl
1 #!/usr/bin/env perl
2 # conf.pl
3 #
4 # Copyright (c) 1999-2019 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.5.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 # Try to determine what the version of SquirrelMail is
47 ############################################################
48 $sm_version = 'unknown';
49 if ( -e "../include/constants.php" && -r "../include/constants.php") {
50 open( FILE, "../include/constants.php" );
51 while ( $line = <FILE> ) {
52 if ($line =~ m/^define\('SM_VERSION', ?'(\d+\.\d+\.\d+( ?\[\w+]|))'/) {
53 $sm_version = $1;
54 last;
55 }
56 }
57 close(FILE);
58 }
59
60
61 ############################################################
62 # First, let's read in the data already in there...
63 ############################################################
64 if ( -e "config.php" ) {
65 # Make sure that file is readable
66 if (! -r "config.php") {
67 clear_screen();
68 print "WARNING:\n";
69 print "The file \"config/config.php\" was found, but you don't\n";
70 print "have rights to read it.\n";
71 print "\n";
72 print "Press enter to continue";
73 $ctu = <STDIN>;
74 exit;
75 }
76 open( FILE, "config.php" );
77 while ( $line = <FILE> ) {
78 $line =~ s/^\s+//;
79 $line =~ s/^\$//;
80 $var = $line;
81
82 $var =~ s/=/EQUALS/;
83 if ( $var =~ /^([a-z])/i ) {
84 @o = split ( /\s*EQUALS\s*/, $var );
85 if ( $o[0] eq "config_version" ) {
86 $o[1] =~ s/[\n\r]//g;
87 $o[1] =~ s/[\'\"];\s*$//;
88 $o[1] =~ s/;$//;
89 $o[1] =~ s/^[\'\"]//;
90
91 $config_version = $o[1];
92 close(FILE);
93 }
94 }
95 }
96 close(FILE);
97
98 if ( $config_version ne $conf_pl_version ) {
99 clear_screen();
100 print "WARNING:\n";
101 print " The file \"config/config.php\" was found, but it is for\n";
102 print " an older version of SquirrelMail. It is possible to still\n";
103 print " read the defaults from this file but be warned that many\n";
104 print " preferences change between versions. It is recommended that\n";
105 print " you start with a clean config.php for each upgrade that you\n";
106 print " do. To do this, just move config/config.php out of the way.\n";
107 print "\n";
108 print "Continue loading with the old config.php [y/N]? ";
109 $ctu = <STDIN>;
110
111 if ( ( $ctu !~ /^y\n/i ) || ( $ctu =~ /^\n/ ) ) {
112 exit;
113 }
114
115 print "\nDo you want me to stop warning you [y/N]? ";
116 $ctu = <STDIN>;
117 if ( $ctu =~ /^y\n/i ) {
118 $print_config_version = $conf_pl_version;
119 } else {
120 $print_config_version = $config_version;
121 }
122 } else {
123 $print_config_version = $config_version;
124 }
125
126 $config = 1;
127 open( FILE, "config.php" );
128 } elsif ( -e "config_default.php" ) {
129 open( FILE, "config_default.php" );
130 while ( $line = <FILE> ) {
131 $line =~ s/^\s+//;
132 $line =~ s/^\$//;
133 $var = $line;
134
135 $var =~ s/=/EQUALS/;
136 if ( $var =~ /^([a-z])/i ) {
137 @o = split ( /\s*EQUALS\s*/, $var );
138 if ( $o[0] eq "config_version" ) {
139 $o[1] =~ s/[\n\r]//g;
140 $o[1] =~ s/[\'\"];\s*$//;
141 $o[1] =~ s/;$//;
142 $o[1] =~ s/^[\'\"]//;
143
144 $config_version = $o[1];
145 close(FILE);
146 }
147 }
148 }
149 close(FILE);
150
151 if ( $config_version ne $conf_pl_version ) {
152 clear_screen();
153 print "WARNING:\n";
154 print " You are trying to use a 'config_default.php' from an older\n";
155 print " version of SquirrelMail. This is HIGHLY unrecommended. You\n";
156 print " should get the 'config_default.php' that matches the version\n";
157 print " of SquirrelMail that you are running. You can get this from\n";
158 print " the SquirrelMail web page by going to the following URL:\n";
159 print " http://squirrelmail.org.\n";
160 print "\n";
161 print "Continue loading with old config_default.php (a bad idea) [y/N]? ";
162 $ctu = <STDIN>;
163
164 if ( ( $ctu !~ /^y\n/i ) || ( $ctu =~ /^\n/ ) ) {
165 exit;
166 }
167
168 print "\nDo you want me to stop warning you [y/N]? ";
169 $ctu = <STDIN>;
170 if ( $ctu =~ /^y\n/i ) {
171 $print_config_version = $conf_pl_version;
172 } else {
173 $print_config_version = $config_version;
174 }
175 } else {
176 $print_config_version = $config_version;
177 }
178 $config = 2;
179 open( FILE, "config_default.php" );
180 } else {
181 print "No configuration file found. Please get config_default.php\n";
182 print "or config.php before running this again. This program needs\n";
183 print "a default config file to get default values.\n";
184 exit;
185 }
186
187 # Read and parse the current configuration file
188 # (either config.php or config_default.php).
189 while ( $line = <FILE> ) {
190 $line =~ s/^\s+//;
191 $line =~ s/^\$//;
192 $var = $line;
193
194 $var =~ s/=/EQUALS/;
195 if ( $var =~ /^([a-z])/i ) {
196 @options = split ( /\s*EQUALS\s*/, $var );
197 $options[1] =~ s/[\n\r]//g;
198 $options[1] =~ s/[\'\"];\s*$//;
199 $options[1] =~ s/;$//;
200 $options[1] =~ s/^[\'\"]//;
201 # de-escape escaped strings
202 $options[1] =~ s/\\'/'/g;
203 $options[1] =~ s/\\\\/\\/g;
204
205 if ( $options[0] =~ /^user_themes\[[0-9]+\]\[['"]PATH['"]\]/ ) {
206 $sub = $options[0];
207 $sub =~ s/\]\[['"]PATH['"]\]//;
208 $sub =~ s/.*\[//;
209 if ( -e "../css/" ) {
210 $options[1] =~ s/^\.\.\/config/\.\.\/css/;
211 }
212 $user_theme_path[$sub] = &change_to_rel_path($options[1]);
213 } elsif ( $options[0] =~ /^user_themes\[[0-9]+\]\[['"]NAME['"]\]/ ) {
214 $sub = $options[0];
215 $sub =~ s/\]\[['"]NAME['"]\]//;
216 $sub =~ s/.*\[//;
217 $user_theme_name[$sub] = $options[1];
218 } elsif ( $options[0] =~ /^icon_themes\[[0-9]+\]\[['"]PATH['"]\]/ ) {
219 $sub = $options[0];
220 $sub =~ s/\]\[['"]PATH['"]\]//;
221 $sub =~ s/.*\[//;
222 if ( -e "../images/" ) {
223 $options[1] =~ s/^\.\.\/config/\.\.\/images/;
224 }
225 $icon_theme_path[$sub] = &change_to_rel_path($options[1]);
226 } elsif ( $options[0] =~ /^icon_themes\[[0-9]+\]\[['"]NAME['"]\]/ ) {
227 $sub = $options[0];
228 $sub =~ s/\]\[['"]NAME['"]\]//;
229 $sub =~ s/.*\[//;
230 $icon_theme_name[$sub] = $options[1];
231 } elsif ( $options[0] =~ /^aTemplateSet\[[0-9]+\]\[['"]ID['"]\]/ ) {
232 $sub = $options[0];
233 $sub =~ s/\]\[['"]ID['"]\]//;
234 $sub =~ s/.*\[//;
235 if ( -e "../templates" ) {
236 $options[1] =~ s/^\.\.\/config/\.\.\/templates/;
237 }
238 $templateset_id[$sub] = $options[1];
239 ##### FIXME: This section BELOW here so old prefs files don't blow up when running conf.pl
240 ##### Remove after a month or two
241 } elsif ( $options[0] =~ /^aTemplateSet\[[0-9]+\]\[['"]PATH['"]\]/ ) {
242 $sub = $options[0];
243 $sub =~ s/\]\[['"]PATH['"]\]//;
244 $sub =~ s/.*\[//;
245 if ( -e "../templates" ) {
246 $options[1] =~ s/^\.\.\/config/\.\.\/templates/;
247 }
248 $templateset_id[$sub] = $options[1];
249 ##### FIXME: This section ABOVE here so old prefs files don't blow up when running conf.pl
250 ##### Remove after a month or two
251 } elsif ( $options[0] =~ /^aTemplateSet\[[0-9]+\]\[['"]NAME['"]\]/ ) {
252 $sub = $options[0];
253 $sub =~ s/\]\[['"]NAME['"]\]//;
254 $sub =~ s/.*\[//;
255 $templateset_name[$sub] = $options[1];
256 } elsif ( $options[0] =~ /^plugins\[[0-9]*\]/ ) {
257 $sub = $options[0];
258 $sub =~ s/\]//;
259 $sub =~ s/^plugins\[//;
260 if ($sub eq '') {
261 push @plugins, $options[1];
262 } else {
263 $plugins[$sub] = $options[1];
264 }
265 } elsif ($options[0] =~ /^fontsets\[\'[a-z]*\'\]/) {
266 # parse associative $fontsets array
267 $sub = $options[0];
268 $sub =~ s/\'\]//;
269 $sub =~ s/^fontsets\[\'//;
270 $fontsets{$sub} = $options[1];
271 } elsif ( $options[0] =~ /^theme\[[0-9]+\]\[['"]PATH|NAME['"]\]/ ) {
272 ##
273 ## $color themes are no longer supported. Please leave this
274 ## so conf.pl doesn't barf if it encounters a $theme.
275 ##
276 } elsif ( $options[0] =~ /^ldap_server\[[0-9]+\]/ ) {
277 $sub = $options[0];
278 $sub =~ s/\]//;
279 $sub =~ s/^ldap_server\[//;
280 $continue = 0;
281 while ( ( $tmp = <FILE> ) && ( $continue != 1 ) ) {
282 if ( $tmp =~ /\);\s*$/ ) {
283 $continue = 1;
284 }
285
286 if ( $tmp =~ /^\s*[\'\"]host[\'\"]/i ) {
287 $tmp =~ s/^\s*[\'\"]host[\'\"]\s*=>\s*[\'\"]//i;
288 $tmp =~ s/[\'\"],?\s*$//;
289 $tmp =~ s/[\'\"]\);\s*$//;
290 $host = $tmp;
291 } elsif ( $tmp =~ /^\s*[\'\"]base[\'\"]/i ) {
292 $tmp =~ s/^\s*[\'\"]base[\'\"]\s*=>\s*[\'\"]//i;
293 $tmp =~ s/[\'\"],?\s*$//;
294 $tmp =~ s/[\'\"]\);\s*$//;
295 $base = $tmp;
296 } elsif ( $tmp =~ /^\s*[\'\"]charset[\'\"]/i ) {
297 $tmp =~ s/^\s*[\'\"]charset[\'\"]\s*=>\s*[\'\"]//i;
298 $tmp =~ s/[\'\"],?\s*$//;
299 $tmp =~ s/[\'\"]\);\s*$//;
300 $charset = $tmp;
301 } elsif ( $tmp =~ /^\s*[\'\"]port[\'\"]/i ) {
302 $tmp =~ s/^\s*[\'\"]port[\'\"]\s*=>\s*[\'\"]?//i;
303 $tmp =~ s/[\'\"]?,?\s*$//;
304 $tmp =~ s/[\'\"]?\);\s*$//;
305 $port = $tmp;
306 } elsif ( $tmp =~ /^\s*[\'\"]maxrows[\'\"]/i ) {
307 $tmp =~ s/^\s*[\'\"]maxrows[\'\"]\s*=>\s*[\'\"]?//i;
308 $tmp =~ s/[\'\"]?,?\s*$//;
309 $tmp =~ s/[\'\"]?\);\s*$//;
310 $maxrows = $tmp;
311 } elsif ( $tmp =~ /^\s*[\'\"]filter[\'\"]/i ) {
312 $tmp =~ s/^\s*[\'\"]filter[\'\"]\s*=>\s*[\'\"]?//i;
313 $tmp =~ s/[\'\"]?,?\s*$//;
314 $tmp =~ s/[\'\"]?\);\s*$//;
315 $filter = $tmp;
316 } elsif ( $tmp =~ /^\s*[\'\"]name[\'\"]/i ) {
317 $tmp =~ s/^\s*[\'\"]name[\'\"]\s*=>\s*[\'\"]//i;
318 $tmp =~ s/[\'\"],?\s*$//;
319 $tmp =~ s/[\'\"]\);\s*$//;
320 $name = $tmp;
321 } elsif ( $tmp =~ /^\s*[\'\"]binddn[\'\"]/i ) {
322 $tmp =~ s/^\s*[\'\"]binddn[\'\"]\s*=>\s*[\'\"]//i;
323 $tmp =~ s/[\'\"],?\s*$//;
324 $tmp =~ s/[\'\"]\);\s*$//;
325 $binddn = $tmp;
326 } elsif ( $tmp =~ /^\s*[\'\"]bindpw[\'\"]/i ) {
327 $tmp =~ s/^\s*[\'\"]bindpw[\'\"]\s*=>\s*[\'\"]//i;
328 $tmp =~ s/[\'\"],?\s*$//;
329 $tmp =~ s/[\'\"]\);\s*$//;
330 $bindpw = $tmp;
331 } elsif ( $tmp =~ /^\s*[\'\"]protocol[\'\"]/i ) {
332 $tmp =~ s/^\s*[\'\"]protocol[\'\"]\s*=>\s*[\'\"]?//i;
333 $tmp =~ s/[\'\"]?,?\s*$//;
334 $tmp =~ s/[\'\"]?\);\s*$//;
335 $protocol = $tmp;
336 } elsif ( $tmp =~ /^\s*[\'\"]limit_scope[\'\"]/i ) {
337 $tmp =~ s/^\s*[\'\"]limit_scope[\'\"]\s*=>\s*[\'\"]?//i;
338 $tmp =~ s/[\'\"]?,?\s*$//;
339 $tmp =~ s/[\'\"]?\);\s*$//;
340 $limit_scope = $tmp;
341 } elsif ( $tmp =~ /^\s*[\'\"]listing[\'\"]/i ) {
342 $tmp =~ s/^\s*[\'\"]listing[\'\"]\s*=>\s*[\'\"]?//i;
343 $tmp =~ s/[\'\"]?,?\s*$//;
344 $tmp =~ s/[\'\"]?\);\s*$//;
345 $listing = $tmp;
346 } elsif ( $tmp =~ /^\s*[\'\"]writeable[\'\"]/i ) {
347 $tmp =~ s/^\s*[\'\"]writeable[\'\"]\s*=>\s*[\'\"]?//i;
348 $tmp =~ s/[\'\"]?,?\s*$//;
349 $tmp =~ s/[\'\"]?\);\s*$//;
350 $writeable = $tmp;
351 } elsif ( $tmp =~ /^\s*[\'\"]search_tree[\'\"]/i ) {
352 $tmp =~ s/^\s*[\'\"]search_tree[\'\"]\s*=>\s*[\'\"]?//i;
353 $tmp =~ s/[\'\"]?,?\s*$//;
354 $tmp =~ s/[\'\"]?\);\s*$//;
355 $search_tree = $tmp;
356 } elsif ( $tmp =~ /^\s*[\'\"]starttls[\'\"]/i ) {
357 $tmp =~ s/^\s*[\'\"]starttls[\'\"]\s*=>\s*[\'\"]?//i;
358 $tmp =~ s/[\'\"]?,?\s*$//;
359 $tmp =~ s/[\'\"]?\);\s*$//;
360 $starttls = $tmp;
361 }
362 }
363 $ldap_host[$sub] = $host;
364 $ldap_base[$sub] = $base;
365 $ldap_name[$sub] = $name;
366 $ldap_port[$sub] = $port;
367 $ldap_maxrows[$sub] = $maxrows;
368 $ldap_filter[$sub] = $filter;
369 $ldap_charset[$sub] = $charset;
370 $ldap_binddn[$sub] = $binddn;
371 $ldap_bindpw[$sub] = $bindpw;
372 $ldap_protocol[$sub] = $protocol;
373 $ldap_limit_scope[$sub] = $limit_scope;
374 $ldap_listing[$sub] = $listing;
375 $ldap_writeable[$sub] = $writeable;
376 $ldap_search_tree[$sub] = $search_tree;
377 $ldap_starttls[$sub] = $starttls;
378 } elsif ( $options[0] =~ /^(data_dir|attachment_dir|org_logo|signout_page|icon_theme_def)$/ ) {
379 ${ $options[0] } = &change_to_rel_path($options[1]);
380 } else {
381 ${ $options[0] } = $options[1];
382 }
383 }
384 }
385 close FILE;
386
387 # RPC template sets aren't included in user interface skin list,
388 # so add the one from the config file here
389 #
390 if ($rpc_templateset =~ /_rpc$/) {
391 $templateset_name[$#templateset_name + 1] = $rpc_templateset;
392 $templateset_id[$#templateset_id + 1] = $rpc_templateset;
393 }
394
395 # FIXME: unknown introduction date
396 $useSendmail = 'false' if ( lc($useSendmail) ne 'true' );
397 $sendmail_path = "/usr/sbin/sendmail" if ( !$sendmail_path );
398 $pop_before_smtp = 'false' if ( !$pop_before_smtp );
399 $pop_before_smtp_host = '' if ( !$pop_before_smtp_host );
400 $default_unseen_notify = 2 if ( !$default_unseen_notify );
401 $default_unseen_type = 1 if ( !$default_unseen_type );
402 $config_use_color = 0 if ( !$config_use_color );
403 $invert_time = 'false' if ( !$invert_time );
404 $force_username_lowercase = 'false' if ( !$force_username_lowercase );
405 $optional_delimiter = "detect" if ( !$optional_delimiter );
406 $auto_create_special = 'false' if ( !$auto_create_special );
407 $default_use_priority = 'true' if ( !$default_use_priority );
408 $default_use_mdn = 'true' if ( !$default_use_mdn );
409 $delete_folder = 'false' if ( !$delete_folder );
410 $noselect_fix_enable = 'false' if ( !$noselect_fix_enable );
411 $frame_top = "_top" if ( !$frame_top );
412 $provider_uri = '' if ( !$provider_uri );
413 $provider_name = '' if ( !$provider_name || $provider_name eq 'SquirrelMail');
414 $no_list_for_subscribe = 'false' if ( !$no_list_for_subscribe );
415 $allow_charset_search = 'true' if ( !$allow_charset_search );
416 $allow_advanced_search = 0 if ( !$allow_advanced_search) ;
417 $prefs_user_field = 'user' if ( !$prefs_user_field );
418 $prefs_key_field = 'prefkey' if ( !$prefs_key_field );
419 $prefs_val_field = 'prefval' if ( !$prefs_val_field );
420 $session_name = 'SQMSESSID' if ( !$session_name );
421 $skip_SM_header = 'false' if ( !$skip_SM_header );
422 $default_use_javascript_addr_book = 'false' if (! $default_use_javascript_addr_book);
423
424 # since 1.2.0
425 $hide_sm_attributions = 'false' if ( !$hide_sm_attributions );
426 # since 1.2.5
427 $edit_identity = 'true' if ( !$edit_identity );
428 $edit_name = 'true' if ( !$edit_name );
429 # since 1.4.23/1.5.2
430 $edit_reply_to = 'true' if ( !$edit_reply_to );
431
432 # since 1.4.0
433 $use_smtp_tls= 'false' if ( !$use_smtp_tls);
434 $smtp_auth_mech = 'none' if ( !$smtp_auth_mech );
435 $use_imap_tls = 'false' if ( !$use_imap_tls );
436 $imap_auth_mech = 'login' if ( !$imap_auth_mech );
437
438 # $use_imap_tls and $use_smtp_tls are switched to integer since 1.5.1
439 $use_imap_tls = 0 if ( $use_imap_tls eq 'false');
440 $use_imap_tls = 1 if ( $use_imap_tls eq 'true');
441 $use_smtp_tls = 0 if ( $use_smtp_tls eq 'false');
442 $use_smtp_tls = 1 if ( $use_smtp_tls eq 'true');
443
444 # since 1.5.0
445 $show_alternative_names = 'false' if ( !$show_alternative_names );
446 # $available_languages option available only in 1.5.0. removed due to $languages
447 # implementation changes. options are provided by limit_languages plugin
448 # $available_languages = 'all' if ( !$available_languages );
449 $aggressive_decoding = 'false' if ( !$aggressive_decoding );
450 # available only in 1.5.0 and 1.5.1
451 # $advanced_tree = 'false' if ( !$advanced_tree );
452 $use_php_recode = 'false' if ( !$use_php_recode );
453 $use_php_iconv = 'false' if ( !$use_php_iconv );
454 $buffer_output = 'false' if ( !$buffer_output );
455
456 # since 1.5.1
457 $use_icons = 'false' if ( !$use_icons );
458 $use_iframe = 'false' if ( !$use_iframe );
459 $lossy_encoding = 'false' if ( !$lossy_encoding );
460 $allow_remote_configtest = 'false' if ( !$allow_remote_configtest );
461 $secured_config = 'true' if ( !$secured_config );
462 $sq_https_port = 443 if ( !$sq_https_port );
463 $sq_ignore_http_x_forwarded_headers = 'true' if ( !$sq_ignore_http_x_forwarded_headers );
464
465 $sm_debug_mode = 'SM_DEBUG_MODE_MODERATE' if ( !$sm_debug_mode );
466 #FIXME: When this is STABLE software, remove the line above and uncomment the one below:
467 #$sm_debug_mode = 'SM_DEBUG_MODE_OFF' if ( !$sm_debug_mode );
468 $sm_debug_mode = convert_debug_binary_integer_to_constants($sm_debug_mode);
469
470 $addrbook_global_table = 'global_abook' if ( !$addrbook_global_table );
471 $addrbook_global_writeable = 'false' if ( !$addrbook_global_writeable );
472 $addrbook_global_listing = 'false' if ( !$addrbook_global_listing );
473 $abook_global_file = '' if ( !$abook_global_file);
474 $abook_global_file_writeable = 'false' if ( !$abook_global_file_writeable);
475 $abook_global_file_listing = 'true' if ( !$abook_global_file_listing );
476 $encode_header_key = '' if ( !$encode_header_key );
477 $hide_auth_header = 'false' if ( !$hide_auth_header );
478 $time_zone_type = '0' if ( !$time_zone_type );
479 $prefs_user_size = 128 if ( !$prefs_user_size );
480 $prefs_key_size = 64 if ( !$prefs_key_size );
481 $prefs_val_size = 65536 if ( !$prefs_val_size );
482
483 # add qmail-inject test here for backwards compatibility
484 if ( !$sendmail_args && $sendmail_path =~ /qmail-inject/ ) {
485 $sendmail_args = '';
486 } elsif ( !$sendmail_args ) {
487 $sendmail_args = '-i -t';
488 }
489
490 $default_fontsize = '' if ( !$default_fontsize);
491 $default_fontset = '' if ( !$default_fontset);
492 if ( !%fontsets) {
493 %fontsets = ('serif', 'serif',
494 'sans', 'helvetica,arial,sans-serif',
495 'comicsans', 'comic sans ms,sans-serif',
496 'tahoma', 'tahoma,sans-serif',
497 'verasans', 'bitstream vera sans,verdana,sans-serif');
498 }
499
500 # sorting options changed names and reversed values in 1.5.1
501 $disable_thread_sort = 'false' if ( !$disable_thread_sort );
502 $disable_server_sort = 'false' if ( !$disable_server_sort );
503
504 # since 1.5.2
505 $abook_file_line_length = 2048 if ( !$abook_file_line_length );
506 $config_location_base = '' if ( !$config_location_base );
507 $smtp_sitewide_user = '' if ( !$smtp_sitewide_user );
508 $smtp_sitewide_pass = '' if ( !$smtp_sitewide_pass );
509 $icon_theme_def = '' if ( !$icon_theme_def );
510 $disable_plugins = 'false' if ( !$disable_plugins );
511 $disable_plugins_user = '' if ( !$disable_plugins_user );
512 $only_secure_cookies = 'true' if ( !$only_secure_cookies );
513 $disable_security_tokens = 'false' if ( !$disable_security_tokens );
514 $check_referrer = '' if ( !$check_referrer );
515 $ask_user_info = 'true' if ( !$ask_user_info );
516 $use_transparent_security_image = 'true' if ( !$use_transparent_security_image );
517 $display_imap_login_error = 'false' if ( !$display_imap_login_error );
518
519 if ( $ARGV[0] eq '--install-plugin' ) {
520 print "Activating plugin " . $ARGV[1] . "\n";
521 if ( -d "../plugins/" . $ARGV[1]) {
522 push @plugins, $ARGV[1];
523 save_data();
524 exit(0);
525 } else {
526 print "No such plugin.\n";
527 exit(1);
528 }
529 } elsif ( $ARGV[0] eq '--remove-plugin' ) {
530 print "Removing plugin " . $ARGV[1] . "\n";
531 foreach $plugin (@plugins) {
532 if ( $plugin ne $ARGV[1] ) {
533 push @newplugins, $plugin;
534 }
535 }
536 @plugins = @newplugins;
537 save_data();
538 exit(0);
539 } elsif ( $ARGV[0] eq '--update-plugins' or $ARGV[0] eq '-u') {
540 build_plugin_hook_array();
541 exit(0);
542 } elsif ( $ARGV[0] eq '--help' or $ARGV[0] eq '-h') {
543 print "SquirrelMail Configuration Script\n";
544 print "Usage:\n";
545 print " * No arguments: initiates the configuration dialog\n";
546 print " * --install-plugin <plugin> : activates the specified plugin\n";
547 print " * --remove-plugin <plugin> : deactivates the specified plugin\n";
548 print " * --update-plugins , -u : rebuilds plugin_hooks.php according\n";
549 print " to plugins activated in config.php\n";
550 print " * --help , -h : Displays this help\n";
551 print "\n";
552 exit(0);
553 }
554
555
556
557 ####################################################################################
558
559 # used in multiple places, define once
560 $list_supported_imap_servers =
561 " bincimap = Binc IMAP server\n" .
562 " courier = Courier IMAP server\n" .
563 " cyrus = Cyrus IMAP server\n" .
564 " dovecot = Dovecot Secure IMAP server\n" .
565 " exchange = Microsoft Exchange IMAP server\n" .
566 " hmailserver = hMailServer\n" .
567 " macosx = Mac OS X Mailserver\n" .
568 " mercury32 = Mercury/32\n" .
569 " uw = University of Washington's IMAP server\n" .
570 " gmail = IMAP access to Google mail (Gmail) accounts\n";
571
572 #####################################################################################
573 if ( $config_use_color == 1 ) {
574 $WHT = "\x1B[1m";
575 $NRM = "\x1B[0m";
576 } else {
577 $WHT = "";
578 $NRM = "";
579 $config_use_color = 2;
580 }
581
582 # lists can be printed in more than one column; default is just one
583 #
584 $columns = 1;
585
586 # try to get screen width dynamically if possible; default to 80
587 # (user can override with "w#" command)
588 #
589 eval { require "sys/ioctl.ph" };
590 if ($@
591 || !defined &TIOCGWINSZ
592 || !open(TTY, "+</dev/tty")
593 || !ioctl(TTY, &TIOCGWINSZ, $winsize='')) {
594 $screen_width = 80;
595 } else {
596 ($row, $col, $xpixel, $ypixel) = unpack('S4', $winsize);
597 $screen_width = $col;
598 }
599
600 while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
601 clear_screen();
602 print $WHT. "SquirrelMail Configuration : " . $NRM;
603 if ( $config == 1 ) { print "Read: config.php"; }
604 elsif ( $config == 2 ) { print "Read: config_default.php"; }
605 print "\nConfig version $print_config_version; SquirrelMail version $sm_version\n";
606 print "---------------------------------------------------------\n";
607
608 if ( $menu == 0 ) {
609 print $WHT. "Main Menu --\n" . $NRM;
610 print "1. Organization Preferences\n";
611 print "2. Server Settings\n";
612 print "3. Folder Defaults\n";
613 print "4. General Options\n";
614 print "5. User Interface\n";
615 print "6. Address Books\n";
616 print "7. Message of the Day (MOTD)\n";
617 print "8. Plugins\n";
618 print "9. Database\n";
619 print "10. Language settings\n";
620 print "11. Tweaks\n";
621 print "\n";
622 print "D. Set pre-defined settings for specific IMAP servers\n";
623 print "\n";
624 } elsif ( $menu == 1 ) {
625 print $WHT. "Organization Preferences\n" . $NRM;
626 print "1. Organization Name : $WHT$org_name$NRM\n";
627 print "2. Organization Logo : $WHT$org_logo$NRM\n";
628 print "3. Org. Logo Width/Height : $WHT($org_logo_width/$org_logo_height)$NRM\n";
629 print "4. Organization Title : $WHT$org_title$NRM\n";
630 print "5. Signout Page : $WHT$signout_page$NRM\n";
631 print "6. Top Frame : $WHT$frame_top$NRM\n";
632 print "7. Provider link : $WHT$provider_uri$NRM\n";
633 print "8. Provider link text : $WHT$provider_name$NRM\n";
634
635 print "\n";
636 print "R Return to Main Menu\n";
637 } elsif ( $menu == 2 ) {
638 print $WHT. "Server Settings\n\n" . $NRM;
639 print $WHT . "General" . $NRM . "\n";
640 print "-------\n";
641 print "1. Domain : $WHT$domain$NRM\n";
642 print "2. Invert Time : $WHT$invert_time$NRM\n";
643 print "3. Sendmail or SMTP : $WHT";
644 if ( lc($useSendmail) eq 'true' ) {
645 print "Sendmail";
646 } else {
647 print "SMTP";
648 }
649 print "$NRM\n";
650 print "\n";
651
652 if ( $show_imap_settings ) {
653 print $WHT . "IMAP Settings". $NRM . "\n--------------\n";
654 print "4. IMAP Server : $WHT$imapServerAddress$NRM\n";
655 print "5. IMAP Port : $WHT$imapPort$NRM\n";
656 print "6. Authentication type : $WHT$imap_auth_mech$NRM\n";
657 print "7. Secure IMAP (TLS) : $WHT" . display_use_tls($use_imap_tls) . "$NRM\n";
658 print "8. Server software : $WHT$imap_server_type$NRM\n";
659 print "9. Delimiter : $WHT$optional_delimiter$NRM\n";
660 print "\n";
661 } elsif ( $show_smtp_settings ) {
662 if ( lc($useSendmail) eq 'true' ) {
663 print $WHT . "Sendmail" . $NRM . "\n--------\n";
664 print "4. Sendmail Path : $WHT$sendmail_path$NRM\n";
665 print "5. Sendmail arguments : $WHT$sendmail_args$NRM\n";
666 print "6. Header encryption key : $WHT$encode_header_key$NRM\n";
667 print "\n";
668 } else {
669 print $WHT . "SMTP Settings" . $NRM . "\n-------------\n";
670 print "4. SMTP Server : $WHT$smtpServerAddress$NRM\n";
671 print "5. SMTP Port : $WHT$smtpPort$NRM\n";
672 print "6. POP before SMTP : $WHT$pop_before_smtp$NRM\n";
673 print "7. SMTP Authentication : $WHT$smtp_auth_mech" . display_smtp_sitewide_userpass() ."$NRM\n";
674 print "8. Secure SMTP (TLS) : $WHT" . display_use_tls($use_smtp_tls) . "$NRM\n";
675 print "9. Header encryption key : $WHT$encode_header_key$NRM\n";
676 print "\n";
677 }
678 }
679
680 if ($show_imap_settings == 0) {
681 print "A. Update IMAP Settings : ";
682 print "$WHT$imapServerAddress$NRM:";
683 print "$WHT$imapPort$NRM ";
684 print "($WHT$imap_server_type$NRM)\n";
685 }
686 if ($show_smtp_settings == 0) {
687 if ( lc($useSendmail) eq 'true' ) {
688 print "B. Change Sendmail Config : $WHT$sendmail_path$NRM\n";
689 } else {
690 print "B. Update SMTP Settings : ";
691 print "$WHT$smtpServerAddress$NRM:";
692 print "$WHT$smtpPort$NRM\n";
693 }
694 }
695 if ( $show_smtp_settings || $show_imap_settings )
696 {
697 print "H. Hide " .
698 ($show_imap_settings ? "IMAP Server" :
699 (lc($useSendmail) eq 'true') ? "Sendmail" : "SMTP") . " Settings\n";
700 }
701
702 print "\n";
703 print "R Return to Main Menu\n";
704 } elsif ( $menu == 3 ) {
705 print $WHT. "Folder Defaults\n" . $NRM;
706 print "1. Default Folder Prefix : $WHT$default_folder_prefix$NRM\n";
707 print "2. Show Folder Prefix Option : $WHT$show_prefix_option$NRM\n";
708 print "3. Trash Folder : $WHT$trash_folder$NRM\n";
709 print "4. Sent Folder : $WHT$sent_folder$NRM\n";
710 print "5. Drafts Folder : $WHT$draft_folder$NRM\n";
711 print "6. By default, move to trash : $WHT$default_move_to_trash$NRM\n";
712 print "7. By default, save sent messages : $WHT$default_move_to_sent$NRM\n";
713 print "8. By default, save as draft : $WHT$default_save_as_draft$NRM\n";
714 print "9. List Special Folders First : $WHT$list_special_folders_first$NRM\n";
715 print "10. Show Special Folders Color : $WHT$use_special_folder_color$NRM\n";
716 print "11. Auto Expunge : $WHT$auto_expunge$NRM\n";
717 print "12. Default Sub. of INBOX : $WHT$default_sub_of_inbox$NRM\n";
718 print "13. Show 'Contain Sub.' Option : $WHT$show_contain_subfolders_option$NRM\n";
719 print "14. Default Unseen Notify : $WHT$default_unseen_notify$NRM\n";
720 print "15. Default Unseen Type : $WHT$default_unseen_type$NRM\n";
721 print "16. Auto Create Special Folders : $WHT$auto_create_special$NRM\n";
722 print "17. Folder Delete Bypasses Trash : $WHT$delete_folder$NRM\n";
723 print "18. Enable /NoSelect folder fix : $WHT$noselect_fix_enable$NRM\n";
724 print "\n";
725 print "R Return to Main Menu\n";
726 } elsif ( $menu == 4 ) {
727 print $WHT. "General Options\n" . $NRM;
728 print "1. Data Directory : $WHT$data_dir$NRM\n";
729 print "2. Attachment Directory : $WHT$attachment_dir$NRM\n";
730 print "3. Directory Hash Level : $WHT$dir_hash_level$NRM\n";
731 print "4. Default Left Size : $WHT$default_left_size$NRM\n";
732 print "5. Usernames in Lowercase : $WHT$force_username_lowercase$NRM\n";
733 print "6. Allow use of priority : $WHT$default_use_priority$NRM\n";
734 print "7. Hide SM attributions : $WHT$hide_sm_attributions$NRM\n";
735 print "8. Allow use of receipts : $WHT$default_use_mdn$NRM\n";
736 print "9. Allow editing of identity : $WHT$edit_identity$NRM\n";
737 print " Allow editing of name : $WHT$edit_name$NRM\n";
738 print " Allow editing of reply-to : $WHT$edit_reply_to$NRM\n";
739 print " Remove username from header : $WHT$hide_auth_header$NRM\n";
740 print "10. Disable server thread sort : $WHT$disable_thread_sort$NRM\n";
741 print "11. Disable server-side sorting : $WHT$disable_server_sort$NRM\n";
742 print "12. Allow server charset search : $WHT$allow_charset_search$NRM\n";
743 print "13. Allow advanced search : $WHT$allow_advanced_search$NRM\n";
744 print "14. PHP session name : $WHT$session_name$NRM\n";
745 print "15. Time zone configuration : $WHT$time_zone_type$NRM\n";
746 print "16. Location base : $WHT$config_location_base$NRM\n";
747 print "17. Only secure cookies if poss. : $WHT$only_secure_cookies$NRM\n";
748 print "18. Disable secure forms : $WHT$disable_security_tokens$NRM\n";
749 print "19. Page referal requirement : $WHT$check_referrer$NRM\n";
750 print "20. Security image : $WHT" . (lc($use_transparent_security_image) eq 'true' ? 'Transparent' : 'Textual') . "$NRM\n";
751 print "21. Display login error from IMAP: $WHT$display_imap_login_error$NRM\n";
752 print "\n";
753 print "R Return to Main Menu\n";
754 } elsif ( $menu == 5 ) {
755 print $WHT. "User Interface\n" . $NRM;
756 print "1. Use Icons? : $WHT$use_icons$NRM\n";
757 # print "3. Default Icon Set : $WHT$icon_theme_def$NRM\n";
758 print "2. Default font size : $WHT$default_fontsize$NRM\n";
759 print "3. Manage template sets (skins)\n";
760 print "4. Manage user themes\n";
761 print "5. Manage font sets\n";
762 print "6. Manage icon themes\n";
763
764 print "\n";
765 print "R Return to Main Menu\n";
766 } elsif ( $menu == 6 ) {
767 print $WHT. "Address Books\n" . $NRM;
768 print "1. Change LDAP Servers\n";
769 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
770 print " > $ldap_host[$count]\n";
771 }
772 print "2. Use Javascript address book search : $WHT$default_use_javascript_addr_book$NRM\n";
773 print "3. Global address book file : $WHT$abook_global_file$NRM\n";
774 print "4. Allow writing into global file address book : $WHT$abook_global_file_writeable$NRM\n";
775 print "5. Allow listing of global file address book : $WHT$abook_global_file_listing$NRM\n";
776 print "6. Allowed address book line length : $WHT$abook_file_line_length$NRM\n";
777 print "\n";
778 print "R Return to Main Menu\n";
779 } elsif ( $menu == 7 ) {
780 print $WHT. "Message of the Day (MOTD)\n" . $NRM;
781 print "\n$motd\n";
782 print "\n";
783 print "1 Edit the MOTD\n";
784 print "\n";
785 print "R Return to Main Menu\n";
786 } elsif ( $menu == 8 ) {
787 if (lc($disable_plugins) eq 'true' && $disable_plugins_user ne '') {
788 print $WHT. "Plugins (WARNING: All plugins are currently disabled\n for the user \"$disable_plugins_user\"!)\n" . $NRM;
789 } elsif (lc($disable_plugins) eq 'true') {
790 print $WHT. "Plugins (WARNING: All plugins are currently disabled!)\n" . $NRM;
791 } else {
792 print $WHT. "Plugins\n" . $NRM;
793 }
794 print " Installed Plugins\n";
795 if ($columns > 1) {
796 $num = print_multi_col_list(1, $columns, $screen_width, 1, @plugins);
797 } else {
798 $num = 0;
799 for ( $count = 0 ; $count <= $#plugins ; $count++ ) {
800 $num = $count + 1;
801 $english_name = get_plugin_english_name($plugins[$count]);
802 if ( $english_name eq "" ) {
803 print " $WHT$num.$NRM $plugins[$count]" . get_plugin_version($plugins[$count]) . "\n";
804 } else {
805 print " $WHT$num.$NRM $english_name ($plugins[$count])" . get_plugin_version($plugins[$count]) . "\n";
806 }
807 }
808 }
809 print "\n Available Plugins:\n";
810 opendir( DIR, "../plugins" );
811 @files = sort(readdir(DIR));
812 $pos = 0;
813 @unused_plugins = ();
814 for ( $i = 0 ; $i <= $#files ; $i++ ) {
815 if ( -d "../plugins/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne ".svn" ) {
816 $match = 0;
817 for ( $k = 0 ; $k <= $#plugins ; $k++ ) {
818 if ( $plugins[$k] eq $files[$i] ) {
819 $match = 1;
820 }
821 }
822 if ( $match == 0 ) {
823 $unused_plugins[$pos] = $files[$i];
824 $pos++;
825 }
826 }
827 }
828
829 if ($columns > 1) {
830 $num = print_multi_col_list($num + 1, $columns, $screen_width, 1, @unused_plugins);
831 } else {
832 for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
833 $num = $num + 1;
834 $english_name = get_plugin_english_name($unused_plugins[$i]);
835 if ( $english_name eq "" ) {
836 print " $WHT$num.$NRM $unused_plugins[$i]" . get_plugin_version($unused_plugins[$i]) . "\n";
837 } else {
838 print " $WHT$num.$NRM $english_name ($unused_plugins[$i])" . get_plugin_version($unused_plugins[$i]) . "\n";
839 }
840 }
841 }
842 closedir DIR;
843
844 print "\n";
845 if (lc($disable_plugins) eq 'true' && $disable_plugins_user ne '') {
846 print "E Enable active plugins (all plugins currently\n disabled for the user \"$disable_plugins_user\")\n";
847 } elsif (lc($disable_plugins) eq 'true') {
848 print "E Enable active plugins (all plugins currently\n disabled)\n";
849 } else {
850 print "D Disable all plugins\n";
851 }
852 print "U Set the user for whom plugins can be disabled\n";
853 print "R Return to Main Menu\n";
854 print "C# List plugins in <#> number of columns\n";
855 print "W# Change screen width to <#> (currently $screen_width)\n";
856 } elsif ( $menu == 9 ) {
857 print $WHT. "Database\n" . $NRM;
858 print "1. DSN for Address Book : $WHT$addrbook_dsn$NRM\n";
859 print "2. Table for Address Book : $WHT$addrbook_table$NRM\n";
860 print "\n";
861 print "3. DSN for Preferences : $WHT$prefs_dsn$NRM\n";
862 print "4. Table for Preferences : $WHT$prefs_table$NRM\n";
863 print "5. Field for username : $WHT$prefs_user_field$NRM ($prefs_user_size)\n";
864 print "6. Field for prefs key : $WHT$prefs_key_field$NRM ($prefs_key_size)\n";
865 print "7. Field for prefs value : $WHT$prefs_val_field$NRM ($prefs_val_size)\n";
866 print "\n";
867 print "8. DSN for Global Address Book : $WHT$addrbook_global_dsn$NRM\n";
868 print "9. Table for Global Address Book : $WHT$addrbook_global_table$NRM\n";
869 print "10. Allow writing into Global Address Book : $WHT$addrbook_global_writeable$NRM\n";
870 print "11. Allow listing of Global Address Book : $WHT$addrbook_global_listing$NRM\n";
871 print "\n";
872 print "R Return to Main Menu\n";
873 } elsif ( $menu == 10 ) {
874 print $WHT. "Language settings\n" . $NRM;
875 print "1. Default Language : $WHT$squirrelmail_default_language$NRM\n";
876 print "2. Default Charset : $WHT$default_charset$NRM\n";
877 print "3. Show alternative language names : $WHT$show_alternative_names$NRM\n";
878 print "4. Enable aggressive decoding : $WHT$aggressive_decoding$NRM\n";
879 print "5. Enable lossy encoding : $WHT$lossy_encoding$NRM\n";
880 print "\n";
881 print "R Return to Main Menu\n";
882 } elsif ( $menu == 11 ) {
883 print $WHT. "Interface tweaks\n" . $NRM;
884 print "1. Display html mails in iframe : $WHT$use_iframe$NRM\n";
885 print "2. Ask user info on first login : $WHT$ask_user_info$NRM\n";
886 print "\n";
887 print $WHT. "PHP tweaks\n" . $NRM;
888 print "4. Use php recode functions : $WHT$use_php_recode$NRM\n";
889 print "5. Use php iconv functions : $WHT$use_php_iconv$NRM\n";
890 print "6. Buffer all output : $WHT$buffer_output$NRM\n";
891 print "\n";
892 print $WHT. "Configuration tweaks\n" . $NRM;
893 print "7. Allow remote configtest : $WHT$allow_remote_configtest$NRM\n";
894 print "8. Debug mode : $WHT$sm_debug_mode$NRM\n";
895 print "9. Secured configuration mode : $WHT$secured_config$NRM\n";
896 print "10. HTTPS port : $WHT$sq_https_port$NRM\n";
897 print "11. Ignore HTTP_X_FORWARDED headers: $WHT$sq_ignore_http_x_forwarded_headers$NRM\n";
898 print "\n";
899 print "R Return to Main Menu\n";
900 }
901 if ( $config_use_color == 1 ) {
902 print "C Turn color off\n";
903 } else {
904 print "C Turn color on\n";
905 }
906 print "S Save data\n";
907 print "Q Quit\n";
908
909 print "\n";
910 print "Command >> " . $WHT;
911 $command = <STDIN>;
912 $command =~ s/[\n\r]//g;
913 $command =~ tr/A-Z/a-z/;
914 print "$NRM\n";
915
916 # Read the commands they entered.
917 if ( $command eq "r" ) {
918 $menu = 0;
919 } elsif ( $command eq "s" ) {
920 save_data();
921 print "Press enter to continue...";
922 $tmp = <STDIN>;
923 $saved = 1;
924 } elsif ( ( $command eq "q" ) && ( $saved == 0 ) ) {
925 print "You have not saved your data.\n";
926 print "Save? [" . $WHT . "Y" . $NRM . "/n]: ";
927 $save = <STDIN>;
928 if ( ( $save =~ /^y/i ) || ( $save =~ /^\s*$/ ) ) {
929 save_data();
930 }
931 } elsif ( $command eq "c" ) {
932 if ( $config_use_color == 1 ) {
933 $config_use_color = 2;
934 $WHT = "";
935 $NRM = "";
936 } else {
937 $config_use_color = 1;
938 $WHT = "\x1B[1m";
939 $NRM = "\x1B[0m";
940 }
941 } elsif ( $command =~ /^w([0-9]+)/ ) {
942 $screen_width = $1;
943 } elsif ( $command eq "d" && $menu == 0 ) {
944 set_defaults();
945 } else {
946 $saved = 0;
947 if ( $menu == 0 ) {
948 if ( ( $command > 0 ) && ( $command < 12 ) ) {
949 $menu = $command;
950 }
951 } elsif ( $menu == 1 ) {
952 if ( $command == 1 ) { $org_name = command1(); }
953 elsif ( $command == 2 ) { $org_logo = command2(); }
954 elsif ( $command == 3 ) { ($org_logo_width,$org_logo_height) = command2a(); }
955 elsif ( $command == 4 ) { $org_title = command3(); }
956 elsif ( $command == 5 ) { $signout_page = command4(); }
957 elsif ( $command == 6 ) { $frame_top = command6(); }
958 elsif ( $command == 7 ) { $provider_uri = command7(); }
959 elsif ( $command == 8 ) { $provider_name = command8(); }
960
961 } elsif ( $menu == 2 ) {
962 if ( $command eq "a" ) { $show_imap_settings = 1; $show_smtp_settings = 0; }
963 elsif ( $command eq "b" ) { $show_imap_settings = 0; $show_smtp_settings = 1; }
964 elsif ( $command eq "h" ) { $show_imap_settings = 0; $show_smtp_settings = 0; }
965 elsif ( $command <= 3 ) {
966 if ( $command == 1 ) { $domain = command11(); }
967 elsif ( $command == 2 ) { $invert_time = command110(); }
968 elsif ( $command == 3 ) { $useSendmail = command14(); }
969 $show_imap_settings = 0; $show_smtp_settings = 0;
970 } elsif ( $show_imap_settings ) {
971 if ( $command == 4 ) { $imapServerAddress = command12(); }
972 elsif ( $command == 5 ) { $imapPort = command13(); }
973 elsif ( $command == 6 ) { $imap_auth_mech = command112a(); }
974 elsif ( $command == 7 ) { $use_imap_tls = command_use_tls("IMAP",$use_imap_tls); }
975 elsif ( $command == 8 ) { $imap_server_type = command19(); }
976 elsif ( $command == 9 ) { $optional_delimiter = command111(); }
977 } elsif ( $show_smtp_settings && lc($useSendmail) eq 'true' ) {
978 if ( $command == 4 ) { $sendmail_path = command15(); }
979 elsif ( $command == 5 ) { $sendmail_args = command_sendmail_args(); }
980 elsif ( $command == 6 ) { $encode_header_key = command114(); }
981 } elsif ( $show_smtp_settings ) {
982 if ( $command == 4 ) { $smtpServerAddress = command16(); }
983 elsif ( $command == 5 ) { $smtpPort = command17(); }
984 elsif ( $command == 6 ) { $pop_before_smtp = command18a(); }
985 elsif ( $command == 7 ) { $smtp_auth_mech = command112b(); }
986 elsif ( $command == 8 ) { $use_smtp_tls = command_use_tls("SMTP",$use_smtp_tls); }
987 elsif ( $command == 9 ) { $encode_header_key = command114(); }
988 }
989 } elsif ( $menu == 3 ) {
990 if ( $command == 1 ) { $default_folder_prefix = command21(); }
991 elsif ( $command == 2 ) { $show_prefix_option = command22(); }
992 elsif ( $command == 3 ) { $trash_folder = command23a(); }
993 elsif ( $command == 4 ) { $sent_folder = command23b(); }
994 elsif ( $command == 5 ) { $draft_folder = command23c(); }
995 elsif ( $command == 6 ) { $default_move_to_trash = command24a(); }
996 elsif ( $command == 7 ) { $default_move_to_sent = command24b(); }
997 elsif ( $command == 8 ) { $default_save_as_draft = command24c(); }
998 elsif ( $command == 9 ) { $list_special_folders_first = command27(); }
999 elsif ( $command == 10 ) { $use_special_folder_color = command28(); }
1000 elsif ( $command == 11 ) { $auto_expunge = command29(); }
1001 elsif ( $command == 12 ) { $default_sub_of_inbox = command210(); }
1002 elsif ( $command == 13 ) { $show_contain_subfolders_option = command211(); }
1003 elsif ( $command == 14 ) { $default_unseen_notify = command212(); }
1004 elsif ( $command == 15 ) { $default_unseen_type = command213(); }
1005 elsif ( $command == 16 ) { $auto_create_special = command214(); }
1006 elsif ( $command == 17 ) { $delete_folder = command215(); }
1007 elsif ( $command == 18 ) { $noselect_fix_enable = command216(); }
1008 } elsif ( $menu == 4 ) {
1009 if ( $command == 1 ) { $data_dir = command33a(); }
1010 elsif ( $command == 2 ) { $attachment_dir = command33b(); }
1011 elsif ( $command == 3 ) { $dir_hash_level = command33c(); }
1012 elsif ( $command == 4 ) { $default_left_size = command35(); }
1013 elsif ( $command == 5 ) { $force_username_lowercase = command36(); }
1014 elsif ( $command == 6 ) { $default_use_priority = command37(); }
1015 elsif ( $command == 7 ) { $hide_sm_attributions = command38(); }
1016 elsif ( $command == 8 ) { $default_use_mdn = command39(); }
1017 elsif ( $command == 9 ) { $edit_identity = command310(); }
1018 elsif ( $command == 10 ) { $disable_thread_sort = command312(); }
1019 elsif ( $command == 11 ) { $disable_server_sort = command313(); }
1020 elsif ( $command == 12 ) { $allow_charset_search = command314(); }
1021 elsif ( $command == 13 ) { $allow_advanced_search = command316(); }
1022 elsif ( $command == 14 ) { $session_name = command317(); }
1023 elsif ( $command == 15 ) { $time_zone_type = command318(); }
1024 elsif ( $command == 16 ) { $config_location_base = command_config_location_base(); }
1025 elsif ( $command == 17 ) { $only_secure_cookies = command319(); }
1026 elsif ( $command == 18 ) { $disable_security_tokens = command320(); }
1027 elsif ( $command == 19 ) { $check_referrer = command321(); }
1028 elsif ( $command == 20 ) { $use_transparent_security_image = command322(); }
1029 elsif ( $command == 21 ) { $display_imap_login_error = command323(); }
1030 } elsif ( $menu == 5 ) {
1031 if ( $command == 1 ) { $use_icons = commandB3(); }
1032 # elsif ( $command == 3 ) { $icon_theme_def = command53(); }
1033 elsif ( $command == 2 ) { $default_fontsize = command_default_fontsize(); }
1034 elsif ( $command == 3 ) { $templateset_default = command_templates(); }
1035 elsif ( $command == 4 ) { command_userThemes(); }
1036 elsif ( $command == 5 ) { command_fontsets(); }
1037 elsif ( $command == 6 ) { command_iconSets(); }
1038 } elsif ( $menu == 6 ) {
1039 if ( $command == 1 ) { command61(); }
1040 elsif ( $command == 2 ) { command62(); }
1041 elsif ( $command == 3 ) { $abook_global_file=command63(); }
1042 elsif ( $command == 4 ) { command64(); }
1043 elsif ( $command == 5 ) { command65(); }
1044 elsif ( $command == 6 ) { command_abook_file_line_length(); }
1045 } elsif ( $menu == 7 ) {
1046 if ( $command == 1 ) { $motd = command71(); }
1047 } elsif ( $menu == 8 ) {
1048 if ( $command =~ /^[0-9]+/ ) { @plugins = command81(); }
1049 elsif ( $command eq "u" ) { $disable_plugins_user = command82(); }
1050 elsif ( $command eq "d" ) { $disable_plugins = 'true'; }
1051 elsif ( $command eq "e" ) { $disable_plugins = 'false'; }
1052 elsif ( $command =~ /^c([0-9]+)/ ) { $columns = $1; }
1053 } elsif ( $menu == 9 ) {
1054 if ( $command == 1 ) { $addrbook_dsn = command91(); }
1055 elsif ( $command == 2 ) { $addrbook_table = command92(); }
1056 elsif ( $command == 3 ) { $prefs_dsn = command93(); }
1057 elsif ( $command == 4 ) { $prefs_table = command94(); }
1058 elsif ( $command == 5 ) { $prefs_user_field = command95(); }
1059 elsif ( $command == 6 ) { $prefs_key_field = command96(); }
1060 elsif ( $command == 7 ) { $prefs_val_field = command97(); }
1061 elsif ( $command == 8 ) { $addrbook_global_dsn = command98(); }
1062 elsif ( $command == 9 ) { $addrbook_global_table = command99(); }
1063 elsif ( $command == 10 ) { $addrbook_global_writeable = command910(); }
1064 elsif ( $command == 11 ) { $addrbook_global_listing = command911(); }
1065 } elsif ( $menu == 10 ) {
1066 if ( $command == 1 ) { $squirrelmail_default_language = commandA1(); }
1067 elsif ( $command == 2 ) { $default_charset = commandA2(); }
1068 elsif ( $command == 3 ) { $show_alternative_names = commandA3(); }
1069 elsif ( $command == 4 ) { $aggressive_decoding = commandA4(); }
1070 elsif ( $command == 5 ) { $lossy_encoding = commandA5(); }
1071 } elsif ( $menu == 11 ) {
1072 if ( $command == 1 ) { $use_iframe = commandB2(); }
1073 elsif ( $command == 2 ) { $ask_user_info = command_ask_user_info(); }
1074 elsif ( $command == 4 ) { $use_php_recode = commandB4(); }
1075 elsif ( $command == 5 ) { $use_php_iconv = commandB5(); }
1076 elsif ( $command == 6 ) { $buffer_output = commandB6(); }
1077 elsif ( $command == 7 ) { $allow_remote_configtest = commandB7(); }
1078 elsif ( $command == 8 ) { $sm_debug_mode = commandB8(); }
1079 elsif ( $command == 9 ) { $secured_config = commandB9(); }
1080 elsif ( $command == 10 ) { $sq_https_port = commandB10(); }
1081 elsif ( $command == 11 ) { $sq_ignore_http_x_forwarded_headers = commandB11(); }
1082 }
1083 }
1084 }
1085
1086 # we exit here
1087 print "\nExiting conf.pl.\n".
1088 "You might want to test your configuration by browsing to\n".
1089 "http://your-squirrelmail-location/src/configtest.php\n".
1090 "Happy SquirrelMailing!\n\n";
1091
1092
1093 ####################################################################################
1094
1095 # org_name
1096 sub command1 {
1097 print "We have tried to make the name SquirrelMail as transparent as\n";
1098 print "possible. If you set up an organization name, most places where\n";
1099 print "SquirrelMail would take credit will be credited to your organization.\n";
1100 print "\n";
1101 print "If your Organization Name includes a '\$', please precede it with a \\. \n";
1102 print "Other '\$' will be considered the beginning of a variable that\n";
1103 print "must be defined before the \$org_name is printed.\n";
1104 print "\n";
1105 print "[$WHT$org_name$NRM]: $WHT";
1106 $new_org_name = <STDIN>;
1107 if ( $new_org_name eq "\n" ) {
1108 $new_org_name = $org_name;
1109 } else {
1110 $new_org_name =~ s/[\r\n]//g;
1111 $new_org_name =~ s/\"/&quot;/g;
1112 }
1113 return $new_org_name;
1114 }
1115
1116 # org_logo
1117 sub command2 {
1118 print "Your organization's logo is an image that will be displayed at\n";
1119 print "different times throughout SquirrelMail. ";
1120 print "\n";
1121 print "Please be aware of the following: \n";
1122 print " - Relative URLs are relative to the config dir\n";
1123 print " to use the default logo, use ../images/sm_logo.png\n";
1124 print " - To specify a logo defined outside the SquirrelMail source tree\n";
1125 print " use the absolute URL the webserver would use to include the file\n";
1126 print " e.g. http://example.com/images/mylogo.gif or /images/mylogo.jpg\n";
1127 print "\n";
1128 print "[$WHT$org_logo$NRM]: $WHT";
1129 $new_org_logo = <STDIN>;
1130 if ( $new_org_logo eq "\n" ) {
1131 $new_org_logo = $org_logo;
1132 } else {
1133 $new_org_logo =~ s/[\r\n]//g;
1134 }
1135 return $new_org_logo;
1136 }
1137
1138 # org_logo_width
1139 sub command2a {
1140 print "Your organization's logo is an image that will be displayed at\n";
1141 print "different times throughout SquirrelMail. Width\n";
1142 print "and Height of your logo image. Use '0' to disable.\n";
1143 print "\n";
1144 print "Width: [$WHT$org_logo_width$NRM]: $WHT";
1145 $new_org_logo_width = <STDIN>;
1146 $new_org_logo_width =~ tr/0-9//cd; # only want digits!
1147 if ( $new_org_logo_width eq '' ) {
1148 $new_org_logo_width = $org_logo_width;
1149 }
1150 if ( $new_org_logo_width > 0 ) {
1151 print "Height: [$WHT$org_logo_height$NRM]: $WHT";
1152 $new_org_logo_height = <STDIN>;
1153 $new_org_logo_height =~ tr/0-9//cd; # only want digits!
1154 if( $new_org_logo_height eq '' ) {
1155 $new_org_logo_height = $org_logo_height;
1156 }
1157 } else {
1158 $new_org_logo_height = 0;
1159 }
1160 return ($new_org_logo_width, $new_org_logo_height);
1161 }
1162
1163 # org_title
1164 sub command3 {
1165 print "A title is what is displayed at the top of the browser window in\n";
1166 print "the titlebar. Usually this will end up looking something like:\n";
1167 print "\"Netscape: $org_title\"\n";
1168 print "\n";
1169 print "If your Organization Title includes a '\$', please precede it with a \\. \n";
1170 print "Other '\$' will be considered the beginning of a variable that\n";
1171 print "must be defined before the \$org_title is printed.\n";
1172 print "\n";
1173 print "[$WHT$org_title$NRM]: $WHT";
1174 $new_org_title = <STDIN>;
1175 if ( $new_org_title eq "\n" ) {
1176 $new_org_title = $org_title;
1177 } else {
1178 $new_org_title =~ s/[\r\n]//g;
1179 $new_org_title =~ s/\"/\'/g;
1180 }
1181 return $new_org_title;
1182 }
1183
1184 # signout_page
1185 sub command4 {
1186 print "When users click the Sign Out button they will be logged out and\n";
1187 print "then sent to signout_page. If signout_page is left empty,\n";
1188 print "(hit space and then return) they will be taken, as normal,\n";
1189 print "to the default and rather sparse SquirrelMail signout page.\n";
1190 print "\n";
1191 print "[$WHT$signout_page$NRM]: $WHT";
1192 $new_signout_page = <STDIN>;
1193 if ( $new_signout_page eq "\n" ) {
1194 $new_signout_page = $signout_page;
1195 } else {
1196 $new_signout_page =~ s/[\r\n]//g;
1197 $new_signout_page =~ s/^\s+$//g;
1198 }
1199 return $new_signout_page;
1200 }
1201
1202 # Default top frame
1203 sub command6 {
1204 print "SquirrelMail defaults to using the whole of the browser window.\n";
1205 print "This allows you to keep it within a specified frame. The default\n";
1206 print "is '_top'\n";
1207 print "\n";
1208 print "[$WHT$frame_top$NRM]: $WHT";
1209 $new_frame_top = <STDIN>;
1210 if ( $new_frame_top eq "\n" ) {
1211 $new_frame_top = '_top';
1212 } else {
1213 $new_frame_top =~ s/[\r\n]//g;
1214 $new_frame_top =~ s/^\s+$//g;
1215 }
1216 return $new_frame_top;
1217 }
1218
1219 # Default link to provider
1220 sub command7 {
1221 print "Here you can set the link on the top-right of the message list.\n";
1222 print "If empty, it will not be displayed.\n";
1223 print "\n";
1224 print "[$WHT$provider_uri$NRM]: $WHT";
1225 $new_provider_uri = <STDIN>;
1226 if ( $new_provider_uri eq "\n" ) {
1227 $new_provider_uri = '';
1228 } else {
1229 $new_provider_uri =~ s/[\r\n]//g;
1230 $new_provider_uri =~ s/^\s+$//g;
1231 }
1232 return $new_provider_uri;
1233 }
1234
1235 sub command8 {
1236 print "Here you can set the name of the link on the top-right of the message list.\n";
1237 print "The default is empty (do not display anything).'\n";
1238 print "\n";
1239 print "[$WHT$provider_name$NRM]: $WHT";
1240 $new_provider_name = <STDIN>;
1241 if ( $new_provider_name eq "\n" ) {
1242 $new_provider_name = '';
1243 } else {
1244 $new_provider_name =~ s/[\r\n]//g;
1245 $new_provider_name =~ s/^\s+$//g;
1246 $new_provider_name =~ s/\'/\\'/g;
1247 }
1248 return $new_provider_name;
1249 }
1250
1251 ####################################################################################
1252
1253 # domain
1254 sub command11 {
1255 print "The domain name is the suffix at the end of all email addresses. If\n";
1256 print "for example, your email address is jdoe\@example.com, then your domain\n";
1257 print "would be example.com.\n";
1258 print "\n";
1259 print "[$WHT$domain$NRM]: $WHT";
1260 $new_domain = <STDIN>;
1261 if ( $new_domain eq "\n" ) {
1262 $new_domain = $domain;
1263 } else {
1264 $new_domain =~ s/\s//g;
1265 }
1266 return $new_domain;
1267 }
1268
1269 # imapServerAddress
1270 sub command12 {
1271 print "This is the hostname where your IMAP server can be contacted.\n";
1272 print "[$WHT$imapServerAddress$NRM]: $WHT";
1273 $new_imapServerAddress = <STDIN>;
1274 if ( $new_imapServerAddress eq "\n" ) {
1275 $new_imapServerAddress = $imapServerAddress;
1276 } else {
1277 $new_imapServerAddress =~ s/[\r\n]//g;
1278 }
1279 return $new_imapServerAddress;
1280 }
1281
1282 # imapPort
1283 sub command13 {
1284 print "This is the port that your IMAP server is on. Usually this is 143.\n";
1285 print "[$WHT$imapPort$NRM]: $WHT";
1286 $new_imapPort = <STDIN>;
1287 if ( $new_imapPort eq "\n" ) {
1288 $new_imapPort = $imapPort;
1289 } else {
1290 $new_imapPort =~ s/[\r\n]//g;
1291 }
1292 return $new_imapPort;
1293 }
1294
1295 # useSendmail
1296 sub command14 {
1297 print "You now need to choose the method that you will use for sending\n";
1298 print "messages in SquirrelMail. You can either connect to an SMTP server\n";
1299 print "or use sendmail directly.\n";
1300 if ( lc($useSendmail) eq 'true' ) {
1301 $default_value = "1";
1302 } else {
1303 $default_value = "2";
1304 }
1305 print "\n";
1306 print " 1. Sendmail\n";
1307 print " 2. SMTP\n";
1308 print "Your choice [1/2] [$WHT$default_value$NRM]: $WHT";
1309 $use_sendmail = <STDIN>;
1310 if ( ( $use_sendmail =~ /^1\n/i )
1311 || ( ( $use_sendmail =~ /^\n/ ) && ( $default_value eq "1" ) ) ) {
1312 $useSendmail = 'true';
1313 } else {
1314 $useSendmail = 'false';
1315 }
1316 return $useSendmail;
1317 }
1318
1319 # sendmail_path
1320 sub command15 {
1321 print "Specify where the sendmail executable is located. Usually /usr/sbin/sendmail\n";
1322 print "[$WHT$sendmail_path$NRM]: $WHT";
1323 $new_sendmail_path = <STDIN>;
1324 if ( $new_sendmail_path eq "\n" ) {
1325 $new_sendmail_path = $sendmail_path;
1326 } else {
1327 $new_sendmail_path =~ s/[\r\n]//g;
1328 }
1329 return $new_sendmail_path;
1330 }
1331
1332 # Extra sendmail arguments
1333 sub command_sendmail_args {
1334 print "Specify additional sendmail program arguments.\n";
1335 print "\n";
1336 print "Make sure that arguments are supported by your sendmail program. -f argument \n";
1337 print "is added automatically by SquirrelMail scripts. Variable defaults to standard\n";
1338 print "/usr/sbin/sendmail arguments. If you use qmail-inject, nbsmtp or any other \n";
1339 print "sendmail wrapper, which does not support -i and -t arguments, set variable to\n";
1340 print "empty string or use arguments suitable for your mailer.\n";
1341 print "\n";
1342 print "[$WHT$sendmail_args$NRM]: $WHT";
1343 $new_sendmail_args = <STDIN>;
1344 if ( $new_sendmail_args eq "\n" ) {
1345 $new_sendmail_args = $sendmail_args;
1346 } else {
1347 # strip linefeeds and crs.
1348 $new_sendmail_args =~ s/[\r\n]//g;
1349 }
1350 return trim($new_sendmail_args);
1351 }
1352
1353 # smtpServerAddress
1354 sub command16 {
1355 print "This is the hostname of your SMTP server.\n";
1356 print "[$WHT$smtpServerAddress$NRM]: $WHT";
1357 $new_smtpServerAddress = <STDIN>;
1358 if ( $new_smtpServerAddress eq "\n" ) {
1359 $new_smtpServerAddress = $smtpServerAddress;
1360 } else {
1361 $new_smtpServerAddress =~ s/[\r\n]//g;
1362 }
1363 return $new_smtpServerAddress;
1364 }
1365
1366 # smtpPort
1367 sub command17 {
1368 print "This is the port to connect to for SMTP. Usually 25.\n";
1369 print "[$WHT$smtpPort$NRM]: $WHT";
1370 $new_smtpPort = <STDIN>;
1371 if ( $new_smtpPort eq "\n" ) {
1372 $new_smtpPort = $smtpPort;
1373 } else {
1374 $new_smtpPort =~ s/[\r\n]//g;
1375 }
1376 return $new_smtpPort;
1377 }
1378
1379 # pop before SMTP
1380 sub command18a {
1381 print "Do you wish to use POP3 before SMTP? Your server must\n";
1382 print "support this in order for SquirrelMail to work with it.\n";
1383
1384 $YesNo = 'n';
1385 $YesNo = 'y' if ( lc($pop_before_smtp) eq 'true' );
1386
1387 print "Use POP before SMTP (y/n) [$WHT$YesNo$NRM]: $WHT";
1388
1389 $new_pop_before_smtp = <STDIN>;
1390 $new_pop_before_smtp =~ tr/yn//cd;
1391 if ( $new_pop_before_smtp eq "y" ) {
1392 $new_pop_before_smtp = "true";
1393 } elsif ( $new_pop_before_smtp eq "n" ) {
1394 $new_pop_before_smtp = "false";
1395 } else {
1396 $new_pop_before_smtp = $pop_before_smtp;
1397 }
1398
1399 # if using POP before SMTP, allow setting of custom POP server address
1400 if ($new_pop_before_smtp eq "true") {
1401 print "$NRM\nIf the address of the POP server is not the same as\n";
1402 print "your SMTP server, you may specify it here. Leave blank (to\n";
1403 print "clear this, enter only spaces) to use the same address as\n";
1404 print "your SMTP server.\n";
1405 print "POP before SMTP server address [$WHT$pop_before_smtp_host$NRM]: $WHT";
1406
1407 $new_pop_before_smtp_host = <STDIN>;
1408 if ( $new_pop_before_smtp_host eq "\n" ) {
1409 $new_pop_before_smtp_host = $pop_before_smtp_host;
1410 } elsif ($new_pop_before_smtp_host =~ /^\s+$/) {
1411 $new_pop_before_smtp_host = '';
1412 } else {
1413 $new_pop_before_smtp_host =~ s/[\r|\n]//g;
1414 }
1415 $pop_before_smtp_host = $new_pop_before_smtp_host;
1416 }
1417
1418 return $new_pop_before_smtp;
1419 }
1420
1421 # imap_server_type
1422 sub command19 {
1423 print "Each IMAP server has its own quirks. As much as we tried to stick\n";
1424 print "to standards, it doesn't help much if the IMAP server doesn't follow\n";
1425 print "the same principles. We have made some work-arounds for some of\n";
1426 print "these servers. If you would like to use them, please select your\n";
1427 print "IMAP server. If you do not wish to use these work-arounds, you can\n";
1428 print "set this to \"other\", and none will be used.\n";
1429 print $list_supported_imap_servers;
1430 print "\n";
1431 print " other = Not one of the above servers\n";
1432 print "\n";
1433 print "[$WHT$imap_server_type$NRM]: $WHT";
1434 $new_imap_server_type = <STDIN>;
1435
1436 if ( $new_imap_server_type eq "\n" ) {
1437 $new_imap_server_type = $imap_server_type;
1438 } else {
1439 $new_imap_server_type =~ s/[\r\n]//g;
1440 }
1441 return $new_imap_server_type;
1442 }
1443
1444 # invert_time
1445 sub command110 {
1446 print "Sometimes the date of messages sent is messed up (off by a few hours\n";
1447 print "on some machines). Typically this happens if the system doesn't support\n";
1448 print "tm_gmtoff. It will happen only if your time zone is \"negative\".\n";
1449 print "This most often occurs on Solaris 7 machines in the United States.\n";
1450 print "By default, this is off. It should be kept off unless problems surface\n";
1451 print "about the time that messages are sent.\n";
1452 print " no = Do NOT fix time -- almost always correct\n";
1453 print " yes = Fix the time for this system\n";
1454
1455 $YesNo = 'n';
1456 $YesNo = 'y' if ( lc($invert_time) eq 'true' );
1457
1458 print "Fix the time for this system (y/n) [$WHT$YesNo$NRM]: $WHT";
1459
1460 $new_invert_time = <STDIN>;
1461 $new_invert_time =~ tr/yn//cd;
1462 return 'true' if ( $new_invert_time eq "y" );
1463 return 'false' if ( $new_invert_time eq "n" );
1464 return $invert_time;
1465 }
1466
1467 sub command111 {
1468 print "This is the delimiter that your IMAP server uses to distinguish between\n";
1469 print "folders. For example, Cyrus uses '.' as the delimiter and a complete\n";
1470 print "folder would look like 'INBOX.Friends.Bob', while UW uses '/' and would\n";
1471 print "look like 'INBOX/Friends/Bob'. Normally this should be left at 'detect'\n";
1472 print "but if you are sure you know what delimiter your server uses, you can\n";
1473 print "specify it here.\n";
1474 print "\nTo have it autodetect the delimiter, set it to 'detect'.\n\n";
1475 print "[$WHT$optional_delimiter$NRM]: $WHT";
1476 $new_optional_delimiter = <STDIN>;
1477
1478 if ( $new_optional_delimiter eq "\n" ) {
1479 $new_optional_delimiter = $optional_delimiter;
1480 } else {
1481 $new_optional_delimiter =~ s/[\r\n]//g;
1482 }
1483 return $new_optional_delimiter;
1484 }
1485 # IMAP authentication type
1486 # Possible values: login, plain, cram-md5, digest-md5
1487 # Now offers to detect supported mechs, assuming server & port are set correctly
1488
1489 sub command112a {
1490 if ($use_imap_tls ne "0") {
1491 # 1. Script does not handle TLS.
1492 # 2. Server does not have to declare all supported authentication mechs when
1493 # STARTTLS is used. Supported mechs are declared only after STARTTLS.
1494 print "Auto-detection of login methods is unavailable when using TLS or STARTTLS.\n";
1495 } else {
1496 print "If you have already set the hostname and port number, I can try to\n";
1497 print "detect the mechanisms your IMAP server supports.\n";
1498 print "I will try to detect CRAM-MD5 and DIGEST-MD5 support. I can't test\n";
1499 print "for \"login\" or \"plain\" without knowing a username and password.\n";
1500 print "Auto-detecting is optional - you can safely say \"n\" here.\n";
1501 print "\nTry to detect supported mechanisms? [y/N]: ";
1502 $inval=<STDIN>;
1503 chomp($inval);
1504 if ($inval =~ /^y\b/i) {
1505 # Yes, let's try to detect.
1506 print "Trying to detect IMAP capabilities...\n";
1507 my $host = $imapServerAddress . ':'. $imapPort;
1508 print "CRAM-MD5:\t";
1509 my $tmp = detect_auth_support('IMAP',$host,'CRAM-MD5');
1510 if (defined($tmp)) {
1511 if ($tmp eq 'YES') {
1512 print "$WHT SUPPORTED$NRM\n";
1513 } else {
1514 print "$WHT NOT SUPPORTED$NRM\n";
1515 }
1516 } else {
1517 print $WHT . " ERROR DETECTING$NRM\n";
1518 }
1519
1520 print "DIGEST-MD5:\t";
1521 $tmp = detect_auth_support('IMAP',$host,'DIGEST-MD5');
1522 if (defined($tmp)) {
1523 if ($tmp eq 'YES') {
1524 print "$WHT SUPPORTED$NRM\n";
1525 } else {
1526 print "$WHT NOT SUPPORTED$NRM\n";
1527 }
1528 } else {
1529 print $WHT . " ERROR DETECTING$NRM\n";
1530 }
1531
1532 }
1533 }
1534 print "\nWhat authentication mechanism do you want to use for IMAP connections?\n\n";
1535 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1536 print $WHT . "plain" . $NRM . " - SASL PLAIN. If you need this, you already know it.\n";
1537 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext methods.\n";
1538 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1539 print "\n*** YOUR IMAP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n";
1540 print "If you don't understand or are unsure, you probably want \"login\"\n\n";
1541 print "login, plain, cram-md5, or digest-md5 [$WHT$imap_auth_mech$NRM]: $WHT";
1542 $inval=<STDIN>;
1543 chomp($inval);
1544 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || ($inval =~ /^login\b/i) || ($inval =~ /^plain\b/i)) {
1545 return lc($inval);
1546 } else {
1547 # user entered garbage or default value so nothing needs to be set
1548 return $imap_auth_mech;
1549 }
1550 }
1551
1552
1553 # SMTP authentication type
1554 # Possible choices: none, login, plain, cram-md5, digest-md5
1555 sub command112b {
1556 if ($use_smtp_tls ne "0") {
1557 print "Auto-detection of login methods is unavailable when using TLS or STARTTLS.\n";
1558 } elsif (eval ("use IO::Socket; 1")) {
1559 # try loading IO::Socket module
1560 print "If you have already set the hostname and port number, I can try to\n";
1561 print "automatically detect some of the mechanisms your SMTP server supports.\n";
1562 print "Auto-detection is *optional* - you can safely say \"n\" here.\n";
1563 print "\nTry to detect auth mechanisms? [y/N]: ";
1564 $inval=<STDIN>;
1565 chomp($inval);
1566 if ($inval =~ /^y\b/i) {
1567 # Yes, let's try to detect.
1568 print "Trying to detect supported methods (SMTP)...\n";
1569
1570 # Special case!
1571 # Check none by trying to relay to junk@microsoft.com
1572 $host = $smtpServerAddress . ':' . $smtpPort;
1573 my $sock = IO::Socket::INET->new($host);
1574 print "Testing none:\t\t$WHT";
1575 if (!defined($sock)) {
1576 print " ERROR TESTING\n";
1577 close $sock;
1578 } else {
1579 $got = <$sock>; # Discard greeting
1580 print $sock "HELO $domain\r\n";
1581 $got = <$sock>; # Discard
1582 print $sock "MAIL FROM:<tester\@squirrelmail.org>\r\n";
1583 $got = <$sock>; # Discard
1584 print $sock "RCPT TO:<junk\@microsoft.com\r\n";
1585 $got = <$sock>; # This is the important line
1586 if ($got =~ /^250\b/) { # SMTP will relay without auth
1587 print "SUPPORTED$NRM\n";
1588 } else {
1589 print "NOT SUPPORTED$NRM\n";
1590 }
1591 print $sock "RSET\r\n";
1592 print $sock "QUIT\r\n";
1593 close $sock;
1594 }
1595
1596 # Try login (SquirrelMail default)
1597 print "Testing login:\t\t";
1598 $tmp=detect_auth_support('SMTP',$host,'LOGIN');
1599 if (defined($tmp)) {
1600 if ($tmp eq 'YES') {
1601 print $WHT . "SUPPORTED$NRM\n";
1602 } else {
1603 print $WHT . "NOT SUPPORTED$NRM\n";
1604 }
1605 } else {
1606 print $WHT . "ERROR DETECTING$NRM\n";
1607 }
1608
1609 # Try plain
1610 print "Testing plain:\t\t";
1611 $tmp=detect_auth_support('SMTP',$host,'PLAIN');
1612 if (defined($tmp)) {
1613 if ($tmp eq 'YES') {
1614 print $WHT . "SUPPORTED$NRM\n";
1615 } else {
1616 print $WHT . "NOT SUPPORTED$NRM\n";
1617 }
1618 } else {
1619 print $WHT . "ERROR DETECTING$NRM\n";
1620 }
1621
1622 # Try CRAM-MD5
1623 print "Testing CRAM-MD5:\t";
1624 $tmp=detect_auth_support('SMTP',$host,'CRAM-MD5');
1625 if (defined($tmp)) {
1626 if ($tmp eq 'YES') {
1627 print $WHT . "SUPPORTED$NRM\n";
1628 } else {
1629 print $WHT . "NOT SUPPORTED$NRM\n";
1630 }
1631 } else {
1632 print $WHT . "ERROR DETECTING$NRM\n";
1633 }
1634
1635
1636 print "Testing DIGEST-MD5:\t";
1637 $tmp=detect_auth_support('SMTP',$host,'DIGEST-MD5');
1638 if (defined($tmp)) {
1639 if ($tmp eq 'YES') {
1640 print $WHT . "SUPPORTED$NRM\n";
1641 } else {
1642 print $WHT . "NOT SUPPORTED$NRM\n";
1643 }
1644 } else {
1645 print $WHT . "ERROR DETECTING$NRM\n";
1646 }
1647 }
1648 }
1649 print "\nWhat authentication mechanism do you want to use for SMTP connections?\n";
1650 print $WHT . "none" . $NRM . " - Your SMTP server does not require authorization.\n";
1651 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1652 print $WHT . "plain" . $NRM . " - SASL PLAIN. Plaintext. If you can do better, you probably should.\n";
1653 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext.\n";
1654 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1655 print $WHT . "\n*** YOUR SMTP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n" . $NRM;
1656 print "If you don't understand or are unsure, you probably want \"none\"\n\n";
1657 print "none, login, plain, cram-md5, or digest-md5 [$WHT$smtp_auth_mech$NRM]: $WHT";
1658 $inval=<STDIN>;
1659 chomp($inval);
1660 if ($inval =~ /^none\b/i) {
1661 # remove sitewide smtp authentication information
1662 $smtp_sitewide_user = '';
1663 $smtp_sitewide_pass = '';
1664 # SMTP doesn't necessarily require logins
1665 return "none";
1666 } elsif ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) ||
1667 ($inval =~ /^login\b/i) || ($inval =~/^plain\b/i)) {
1668 command_smtp_sitewide_userpass($inval);
1669 return lc($inval);
1670 } elsif (trim($inval) eq '') {
1671 # user selected default value
1672 command_smtp_sitewide_userpass($smtp_auth_mech);
1673 return $smtp_auth_mech;
1674 } else {
1675 # user entered garbage
1676 return $smtp_auth_mech;
1677 }
1678 }
1679
1680 sub command_smtp_sitewide_userpass($) {
1681 # get first function argument
1682 my $auth_mech = shift(@_);
1683 my $default, $tmp;
1684 $auth_mech = lc(trim($auth_mech));
1685 if ($auth_mech eq 'none') {
1686 return;
1687 }
1688 print "SMTP authentication uses IMAP username and password by default.\n";
1689 print "\n";
1690 print "Would you like to use other login and password for all SquirrelMail \n";
1691 print "SMTP connections?";
1692 if ($smtp_sitewide_user ne '') {
1693 $default = 'y';
1694 print " [Y/n]:";
1695 } else {
1696 $default = 'n';
1697 print " [y/N]:";
1698 }
1699 $tmp=<STDIN>;
1700 $tmp = trim($tmp);
1701
1702 if ($tmp eq '') {
1703 $tmp = $default;
1704 } else {
1705 $tmp = lc($tmp);
1706 }
1707
1708 if ($tmp eq 'n') {
1709 $smtp_sitewide_user = '';
1710 $smtp_sitewide_pass = '';
1711 } elsif ($tmp eq 'y') {
1712 print "Enter username [$smtp_sitewide_user]:";
1713 my $new_user = <STDIN>;
1714 $new_user = trim($new_user);
1715 if ($new_user ne '') {
1716 $smtp_sitewide_user = $new_user;
1717 }
1718 if ($smtp_sitewide_user ne '') {
1719 print "If you don't enter any password, current sitewide password will be used.\n";
1720 print "If you enter space, password will be set to empty string.\n";
1721 print "Enter password:";
1722 my $new_pass = <STDIN>;
1723 if ($new_pass ne "\n") {
1724 $smtp_sitewide_pass = trim($new_pass);
1725 }
1726 } else {
1727 print "Invalid input. You must set username used for SMTP authentication.\n";
1728 print "Click enter to continue\n";
1729 $tmp = <STDIN>;
1730 }
1731 } else {
1732 print "Invalid input\n";
1733 print "Click enter to continue\n";
1734 $tmp = <STDIN>;
1735 }
1736 }
1737
1738 # Sub adds information about SMTP authentication type to menu
1739 sub display_smtp_sitewide_userpass() {
1740 my $ret = '';
1741 if ($smtp_auth_mech ne 'none') {
1742 if ($smtp_sitewide_user ne '') {
1743 $ret = ' (with custom username and password)';
1744 } else {
1745 $ret = ' (with IMAP username and password)';
1746 }
1747 }
1748 return $ret;
1749 }
1750
1751 # TLS
1752 # This sub is reused for IMAP and SMTP
1753 # Args: service name, default value
1754 sub command_use_tls {
1755 my($default_val,$service,$inval);
1756 $service=$_[0];
1757 $default_val=$_[1];
1758 print "TLS (Transport Layer Security) encrypts the traffic between server and client.\n";
1759 print "STARTTLS extensions allow to start encryption on existing plain text connection.\n";
1760 print "These options add specific PHP and IMAP server configuration requirements.\n";
1761 print "See SquirrelMail documentation about connection security.\n";
1762 print "\n";
1763 print "If your " . $service . " server is localhost, you can safely disable this.\n";
1764 print "If it is remote, you may wish to seriously consider enabling this.\n";
1765 $valid_input=0;
1766 while ($valid_input eq 0) {
1767 print "\nSelect connection security model:\n";
1768 print " 0 - Use plain text connection\n";
1769 print " 1 - Use TLS connection\n";
1770 print " 2 - Use STARTTLS extension\n";
1771 print "Select [$default_val]: ";
1772 $inval=<STDIN>;
1773 $inval=trim($inval);
1774 if ($inval =~ /^[012]$/ || $inval eq '') {
1775 $valid_input = 1;
1776 }
1777 }
1778 if ($inval ne '') {$default_val = $inval};
1779 return $default_val;
1780 }
1781
1782 # This sub is used to display human readable text for
1783 # $use_imap_tls and $use_smtp_tls values in conf.pl menu
1784 sub display_use_tls($) {
1785 my $val = shift(@_);
1786 my $ret = 'disabled';
1787 if ($val eq '2') {
1788 $ret = 'STARTTLS';
1789 } elsif ($val eq '1') {
1790 $ret = 'TLS';
1791 }
1792 return $ret;
1793 }
1794
1795 # $encode_header_key
1796 sub command114 {
1797 print "This encryption key allows the hiding of SquirrelMail Received:\n";
1798 print "headers in outbound messages. SquirrelMail uses the encryption\n";
1799 print "key to encode the username, remote address, and proxied address\n";
1800 print "and then stores that encoded information in X-Squirrel-* headers.\n";
1801 print "\n";
1802 print "Warning: the encryption function used to accomplish this is not\n";
1803 print "bulletproof. When used with a static encryption key as it is here,\n";
1804 print "it provides only minimal security and the encoded user information\n";
1805 print "in the X-Squirrel-* headers can be decoded quickly by a skilled\n";
1806 print "attacker.\n";
1807 print "\n";
1808 print "When you need to inspect an email sent from your system with the\n";
1809 print "X-Squirrel-* headers, you can decode the user information therein\n";
1810 print "by using the decrypt_headers.php script found in the SquirrelMail\n";
1811 print "contrib/ directory. You'll need the encryption key that you\n";
1812 print "defined here when doing so.\n";
1813 print "\n";
1814 print "Enter encryption key: ";
1815 $new_encode_header_key = <STDIN>;
1816 if ( $new_encode_header_key eq "\n" ) {
1817 $new_encode_header_key = $encode_header_key;
1818 } else {
1819 $new_encode_header_key =~ s/[\r\n]//g;
1820 }
1821 return $new_encode_header_key;
1822 }
1823
1824 # MOTD
1825 sub command71 {
1826 print "\nYou can now create the welcome message that is displayed\n";
1827 print "every time a user logs on. You can use HTML or just plain\n";
1828 print
1829 "text. If you do not wish to have one, just make it blank.\n\n(Type @ on a blank line to exit)\n";
1830
1831 $new_motd = "";
1832 do {
1833 print "] ";
1834 $line = <STDIN>;
1835 $line =~ s/[\r\n]//g;
1836 if ( $line ne "@" ) {
1837 $line =~ s/ /\&nbsp;\&nbsp;/g;
1838 $line =~ s/\t/\&nbsp;\&nbsp;\&nbsp;\&nbsp;/g;
1839 $line =~ s/$/ /;
1840 $line =~ s/\"/\\\"/g;
1841
1842 $new_motd = $new_motd . $line;
1843 }
1844 } while ( $line ne "@" );
1845 return $new_motd;
1846 }
1847
1848 ################# PLUGINS ###################
1849
1850 sub command81 {
1851 $command =~ s/[\s\n\r]*//g;
1852 if ( $command > 0 ) {
1853 $command = $command - 1;
1854 if ( $command <= $#plugins ) {
1855 @newplugins = ();
1856 $ct = 0;
1857 while ( $ct <= $#plugins ) {
1858 if ( $ct != $command ) {
1859 @newplugins = ( @newplugins, $plugins[$ct] );
1860 }
1861 $ct++;
1862 }
1863 @plugins = @newplugins;
1864 } elsif ( $command <= $#plugins + $#unused_plugins + 1 ) {
1865 $num = $command - $#plugins - 1;
1866 @newplugins = @plugins;
1867 $ct = 0;
1868 while ( $ct <= $#unused_plugins ) {
1869 if ( $ct == $num ) {
1870 @newplugins = ( @newplugins, $unused_plugins[$ct] );
1871 }
1872 $ct++;
1873 }
1874 @plugins = @newplugins;
1875 }
1876 }
1877 return @plugins;
1878 }
1879
1880 # disable_plugins_user
1881 sub command82 {
1882 print "When all active plugins are disabled, they can be disabled only\n";
1883 print "for the one user named here. If left blank, plugins will be\n";
1884 print "disabled for ALL users. This setting has no effect if plugins\n";
1885 print "are not disabled.\n";
1886 print "\n";
1887 print "This must be the exact IMAP login name for the desired user.\n";
1888 print "\n";
1889 print "[$WHT$disable_plugins_user$NRM]: $WHT";
1890 $new_disable_plugins_user = <STDIN>;
1891 if ( $new_disable_plugins_user eq "\n" ) {
1892 $new_disable_plugins_user = $disable_plugins_user;
1893 } else {
1894 $new_disable_plugins_user =~ s/[\r\n]//g;
1895 }
1896 return $new_disable_plugins_user;
1897 }
1898
1899 ################# FOLDERS ###################
1900
1901 # default_folder_prefix
1902 sub command21 {
1903 print "Some IMAP servers (UW, for example) store mail and folders in\n";
1904 print "your user space in a separate subdirectory. This is where you\n";
1905 print "specify what that directory is.\n";
1906 print "\n";
1907 print "EXAMPLE: mail/";
1908 print "\n";
1909 print "NOTE: If you use Cyrus, or some server that would not use this\n";
1910 print " option, you must set this to 'none'.\n";
1911 print "\n";
1912 print "[$WHT$default_folder_prefix$NRM]: $WHT";
1913 $new_default_folder_prefix = <STDIN>;
1914
1915 if ( $new_default_folder_prefix eq "\n" ) {
1916 $new_default_folder_prefix = $default_folder_prefix;
1917 } else {
1918 $new_default_folder_prefix =~ s/[\r\n]//g;
1919 }
1920 if ( ( $new_default_folder_prefix =~ /^\s*$/ ) || ( $new_default_folder_prefix =~ m/^none$/i ) ) {
1921 $new_default_folder_prefix = "";
1922 } else {
1923 # add the trailing delimiter only if we know what the server is.
1924 if (($imap_server_type eq 'cyrus' and
1925 $optional_delimiter eq 'detect') or
1926 ($imap_server_type eq 'courier' and
1927 $optional_delimiter eq 'detect')) {
1928 $new_default_folder_prefix =~ s/\.*$/\./;
1929 } elsif ($imap_server_type eq 'uw' and
1930 $optional_delimiter eq 'detect') {
1931 $new_default_folder_prefix =~ s/\/*$/\//;
1932 }
1933 }
1934 return $new_default_folder_prefix;
1935 }
1936
1937 # Show Folder Prefix
1938 sub command22 {
1939 print "It is possible to set up the default folder prefix as a user\n";
1940 print "specific option, where each user can specify what their mail\n";
1941 print "folder is. If you set this to false, they will never see the\n";
1942 print "option, but if it is true, this option will appear in the\n";
1943 print "'options' section.\n";
1944 print "\n";
1945 print "NOTE: You set the default folder prefix in option '1' of this\n";
1946 print " section. That will be the default if the user doesn't\n";
1947 print " specify anything different.\n";
1948 print "\n";
1949
1950 if ( lc($show_prefix_option) eq 'true' ) {
1951 $default_value = "y";
1952 } else {
1953 $default_value = "n";
1954 }
1955 print "\n";
1956 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1957 $new_show = <STDIN>;
1958 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1959 $show_prefix_option = 'true';
1960 } else {
1961 $show_prefix_option = 'false';
1962 }
1963 return $show_prefix_option;
1964 }
1965
1966 # Trash Folder
1967 sub command23a {
1968 print "You can now specify where the default trash folder is located.\n";
1969 print "On servers where you do not want this, you can set it to anything\n";
1970 print "and set option 6 to false.\n";
1971 print "\n";
1972 print "This is relative to where the rest of your email is kept. You do\n";
1973 print "not need to worry about their mail directory. If this folder\n";
1974 print "would be ~/mail/trash on the filesystem, you only need to specify\n";
1975 print "that this is 'trash', and be sure to put 'mail/' in option 1.\n";
1976 print "\n";
1977
1978 print "[$WHT$trash_folder$NRM]: $WHT";
1979 $new_trash_folder = <STDIN>;
1980 if ( $new_trash_folder eq "\n" ) {
1981 $new_trash_folder = $trash_folder;
1982 } else {
1983 if (check_imap_folder($new_trash_folder)) {
1984 $new_trash_folder =~ s/[\r\n]//g;
1985 } else {
1986 $new_trash_folder = $trash_folder;
1987 }
1988 }
1989 return $new_trash_folder;
1990 }
1991
1992 # Sent Folder
1993 sub command23b {
1994 print "This is where messages that are sent will be stored. SquirrelMail\n";
1995 print "by default puts a copy of all outgoing messages in this folder.\n";
1996 print "\n";
1997 print "This is relative to where the rest of your email is kept. You do\n";
1998 print "not need to worry about their mail directory. If this folder\n";
1999 print "would be ~/mail/sent on the filesystem, you only need to specify\n";
2000 print "that this is 'sent', and be sure to put 'mail/' in option 1.\n";
2001 print "\n";
2002
2003 print "[$WHT$sent_folder$NRM]: $WHT";
2004 $new_sent_folder = <STDIN>;
2005 if ( $new_sent_folder eq "\n" ) {
2006 $new_sent_folder = $sent_folder;
2007 } else {
2008 if (check_imap_folder($new_sent_folder)) {
2009 $new_sent_folder =~ s/[\r\n]//g;
2010 } else {
2011 $new_sent_folder = $sent_folder;
2012 }
2013 }
2014 return $new_sent_folder;
2015 }
2016
2017 # Draft Folder
2018 sub command23c {
2019 print "You can now specify where the default draft folder is located.\n";
2020 print "On servers where you do not want this, you can set it to anything\n";
2021 print "and set option 9 to false.\n";
2022 print "\n";
2023 print "This is relative to where the rest of your email is kept. You do\n";
2024 print "not need to worry about their mail directory. If this folder\n";
2025 print "would be ~/mail/drafts on the filesystem, you only need to specify\n";
2026 print "that this is 'drafts', and be sure to put 'mail/' in option 1.\n";
2027 print "\n";
2028
2029 print "[$WHT$draft_folder$NRM]: $WHT";
2030 $new_draft_folder = <STDIN>;
2031 if ( $new_draft_folder eq "\n" ) {
2032 $new_draft_folder = $draft_folder;
2033 } else {
2034 if (check_imap_folder($new_draft_folder)) {
2035 $new_draft_folder =~ s/[\r\n]//g;
2036 } else {
2037 $new_draft_folder = $draft_folder;
2038 }
2039 }
2040 return $new_draft_folder;
2041 }
2042
2043 # default move to trash
2044 sub command24a {
2045 print "By default, should messages get moved to the trash folder? You\n";
2046 print "can specify the default trash folder in option 3. If this is set\n";
2047 print "to false, messages will get deleted immediately without moving\n";
2048 print "to the trash folder.\n";
2049 print "\n";
2050 print "Trash folder is currently: $trash_folder\n";
2051 print "\n";
2052
2053 if ( lc($default_move_to_trash) eq 'true' ) {
2054 $default_value = "y";
2055 } else {
2056 $default_value = "n";
2057 }
2058 print "By default, move to trash (y/n) [$WHT$default_value$NRM]: $WHT";
2059 $new_show = <STDIN>;
2060 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2061 $default_move_to_trash = 'true';
2062 } else {
2063 $default_move_to_trash = 'false';
2064 }
2065 return $default_move_to_trash;
2066 }
2067
2068 # default move to sent (save sent messages)
2069 sub command24b {
2070 print "By default, should copies of outgoing messages get saved in the\n";
2071 print "sent folder? You can specify the default sent folder in option 4.\n";
2072 print "If this is set to false, messages will get sent and no copy will\n";
2073 print "be made.\n";
2074 print "\n";
2075 print "Sent folder is currently: $sent_folder\n";
2076 print "\n";
2077
2078 if ( lc($default_move_to_sent) eq 'true' ) {
2079 $default_value = "y";
2080 } else {
2081 $default_value = "n";
2082 }
2083 print "By default, save sent messages (y/n) [$WHT$default_value$NRM]: $WHT";
2084 $new_show = <STDIN>;
2085 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2086 $default_move_to_sent = 'true';
2087 } else {
2088 $default_move_to_sent = 'false';
2089 }
2090 return $default_move_to_sent;
2091 }
2092
2093 # default save as draft
2094 sub command24c {
2095 print "By default, should the save to draft option be shown? You can\n";
2096 print "specify the default drafts folder in option 5. If this is set\n";
2097 print "to false, users will not be shown the save to draft option.\n";
2098 print "\n";
2099 print "Drafts folder is currently: $draft_folder\n";
2100 print "\n";
2101
2102 if ( lc($default_save_as_draft) eq 'true' ) {
2103 $default_value = "y";
2104 } else {
2105 $default_value = "n";
2106 }
2107 print "By default, save as draft (y/n) [$WHT$default_value$NRM]: $WHT";
2108 $new_show = <STDIN>;
2109 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2110 $default_save_as_draft = 'true';
2111 } else {
2112 $default_save_as_draft = 'false';
2113 }
2114 return $default_save_as_draft;
2115 }
2116
2117 # List special folders first
2118 sub command27 {
2119 print "SquirrelMail has what we call 'special folders' that are not\n";
2120 print "manipulated and viewed like normal folders. Some examples of\n";
2121 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
2122 print "Simply asks if you want these folders listed first in the folder\n";
2123 print "listing.\n";
2124 print "\n";
2125
2126 if ( lc($list_special_folders_first) eq 'true' ) {
2127 $default_value = "y";
2128 } else {
2129 $default_value = "n";
2130 }
2131 print "\n";
2132 print "List first (y/n) [$WHT$default_value$NRM]: $WHT";
2133 $new_show = <STDIN>;
2134 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2135 $list_special_folders_first = 'true';
2136 } else {
2137 $list_special_folders_first = 'false';
2138 }
2139 return $list_special_folders_first;
2140 }
2141
2142 # Show special folders color
2143 sub command28 {
2144 print "SquirrelMail has what we call 'special folders' that are not\n";
2145 print "manipulated and viewed like normal folders. Some examples of\n";
2146 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
2147 print "wants to know if we should display special folders in a\n";
2148 print "color than the other folders.\n";
2149 print "\n";
2150
2151 if ( lc($use_special_folder_color) eq 'true' ) {
2152 $default_value = "y";
2153 } else {
2154 $default_value = "n";
2155 }
2156 print "\n";
2157 print "Show color (y/n) [$WHT$default_value$NRM]: $WHT";
2158 $new_show = <STDIN>;
2159 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2160 $use_special_folder_color = 'true';
2161 } else {
2162 $use_special_folder_color = 'false';
2163 }
2164 return $use_special_folder_color;
2165 }
2166
2167 # Auto expunge
2168 sub command29 {
2169 print "The way that IMAP handles deleting messages is as follows. You\n";
2170 print "mark the message as deleted, and then to 'really' delete it, you\n";
2171 print "expunge it. This option asks if you want to just have messages\n";
2172 print "marked as deleted, or if you want SquirrelMail to expunge the \n";
2173 print "messages too.\n";
2174 print "\n";
2175
2176 if ( lc($auto_expunge) eq 'true' ) {
2177 $default_value = "y";
2178 } else {
2179 $default_value = "n";
2180 }
2181 print "Auto expunge (y/n) [$WHT$default_value$NRM]: $WHT";
2182 $new_show = <STDIN>;
2183 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2184 $auto_expunge = 'true';
2185 } else {
2186 $auto_expunge = 'false';
2187 }
2188 return $auto_expunge;
2189 }
2190
2191 # Default sub of inbox
2192 sub command210 {
2193 print "Some IMAP servers (Cyrus) have all folders as subfolders of INBOX.\n";
2194 print "This can cause some confusion in folder creation for users when\n";
2195 print "they try to create folders and don't put it as a subfolder of INBOX\n";
2196 print "and get permission errors. This option asks if you want folders\n";
2197 print "to be subfolders of INBOX by default.\n";
2198 print "\n";
2199
2200 if ( lc($default_sub_of_inbox) eq 'true' ) {
2201 $default_value = "y";
2202 } else {
2203 $default_value = "n";
2204 }
2205 print "Default sub of INBOX (y/n) [$WHT$default_value$NRM]: $WHT";
2206 $new_show = <STDIN>;
2207 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2208 $default_sub_of_inbox = 'true';
2209 } else {
2210 $default_sub_of_inbox = 'false';
2211 }
2212 return $default_sub_of_inbox;
2213 }
2214
2215 # Show contain subfolder option
2216 sub command211 {
2217 print "Some IMAP servers (UW) make it so that there are two types of\n";
2218 print "folders. Those that contain messages, and those that contain\n";
2219 print "subfolders. If this is the case for your server, set this to\n";
2220 print "true, and it will ask the user whether the folder they are\n";
2221 print "creating contains subfolders or messages.\n";
2222 print "\n";
2223
2224 if ( lc($show_contain_subfolders_option) eq 'true' ) {
2225 $default_value = "y";
2226 } else {
2227 $default_value = "n";
2228 }
2229 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
2230 $new_show = <STDIN>;
2231 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2232 $show_contain_subfolders_option = 'true';
2233 } else {
2234 $show_contain_subfolders_option = 'false';
2235 }
2236 return $show_contain_subfolders_option;
2237 }
2238
2239 # Default Unseen Notify
2240 sub command212 {
2241 print "This option specifies where the users will receive notification\n";
2242 print "about unseen messages by default. This is of course an option that\n";
2243 print "can be changed on a user level.\n";
2244 print " 1 = No notification\n";
2245 print " 2 = Only on the INBOX\n";
2246 print " 3 = On all folders\n";
2247 print "\n";
2248
2249 print "Which one should be default (1,2,3)? [$WHT$default_unseen_notify$NRM]: $WHT";
2250 $new_show = <STDIN>;
2251 if ( $new_show =~ /^[123]\n/i ) {
2252 $default_unseen_notify = $new_show;
2253 }
2254 $default_unseen_notify =~ s/[\r\n]//g;
2255 return $default_unseen_notify;
2256 }
2257
2258 # Default Unseen Type
2259 sub command213 {
2260 print "Here you can define the default way that unseen messages will be displayed\n";
2261 print "to the user in the folder listing on the left side.\n";
2262 print " 1 = Only unseen messages (4)\n";
2263 print " 2 = Unseen and Total messages (4/27)\n";
2264 print "\n";
2265
2266 print "Which one should be default (1,2)? [$WHT$default_unseen_type$NRM]: $WHT";
2267 $new_show = <STDIN>;
2268 if ( $new_show =~ /^[12]\n/i ) {
2269 $default_unseen_type = $new_show;
2270 }
2271 $default_unseen_type =~ s/[\r\n]//g;
2272 return $default_unseen_type;
2273 }
2274
2275 # Auto create special folders
2276 sub command214 {
2277 print "Would you like the Sent, Trash, and Drafts folders to be created\n";
2278 print "automatically print for you when a user logs in? If the user\n";
2279 print "accidentally deletes their special folders, this option will\n";
2280 print "automatically create it again for them.\n";
2281 print "\n";
2282
2283 if ( lc($auto_create_special) eq 'true' ) {
2284 $default_value = "y";
2285 } else {
2286 $default_value = "n";
2287 }
2288 print "Auto create special folders? (y/n) [$WHT$default_value$NRM]: $WHT";
2289 $new_show = <STDIN>;
2290 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2291 $auto_create_special = 'true';
2292 } else {
2293 $auto_create_special = 'false';
2294 }
2295 return $auto_create_special;
2296 }
2297
2298 # Automatically delete folders
2299 sub command215 {
2300 if ( $imap_server_type eq "uw" ) {
2301 print "UW IMAP servers will not allow folders containing mail to also contain folders.\n";
2302 print "Deleting folders will bypass the trash folder and be immediately deleted\n\n";
2303 print "If this is not the correct value for your server,\n";
2304 print "please use option D on the Main Menu to configure your server correctly.\n\n";
2305 print "Press enter to continue...\n";
2306 $new_delete = <STDIN>;
2307 $delete_folder = 'true';
2308 } else {
2309 if ( $imap_server_type eq "courier" ) {
2310 print "Courier (or Courier-IMAP) IMAP servers may not support ";
2311 print "subfolders of Trash. \n";
2312 print "Specifically, if Courier is set to always move messages to Trash, \n";
2313 print "Trash will be treated by Courier as a special folder that does not \n";
2314 print "allow subfolders. \n\n";
2315 print "Please verify your Courier configuration, and test folder deletion \n";
2316 print "when changing this setting.\n\n";
2317 }
2318
2319 print "Are subfolders of the Trash supported by your IMAP server?\n";
2320 print "If so, should deleted folders be sent to Trash?\n";
2321 print "If not, say no (deleted folders should not be sent to Trash)\n\n";
2322 # reversal of logic.
2323 # question was: Should folders be automatically deleted instead of sent to trash..
2324 # we've changed the question to make it more clear,
2325 # and are here handling that to avoid changing the answers..
2326 if ( lc($delete_folder) eq 'true' ) {
2327 $default_value = "n";
2328 } else {
2329 $default_value = "y";
2330 }
2331 print "Send deleted folders to Trash? (y/n) [$WHT$default_value$NRM]: $WHT";
2332 $new_delete = <STDIN>;
2333 if ( ( $new_delete =~ /^y\n/i ) || ( ( $new_delete =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2334 $delete_folder = 'false';
2335 } else {
2336 $delete_folder = 'true';
2337 }
2338 }
2339 return $delete_folder;
2340 }
2341
2342 #noselect fix
2343 sub command216 {
2344 print "Some IMAP servers allow subfolders to exist even if the parent\n";
2345 print "folders do not. This fixes some problems with the folder list\n";
2346 print "when this is the case, causing the /NoSelect folders to be displayed\n";
2347 print "\n";
2348
2349 if ( lc($noselect_fix_enable) eq 'true' ) {
2350 $default_value = "y";
2351 } else {
2352 $default_value = "n";
2353 }
2354 print "enable noselect fix? (y/n) [$WHT$noselect_fix_enable$NRM]: $WHT";
2355 $noselect_fix_enable = <STDIN>;
2356 if ( ( $noselect_fix_enable =~ /^y\n/i ) || ( ( $noselect_fix_enable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2357 $noselect_fix_enable = 'true';
2358 } else {
2359 $noselect_fix_enable = 'false';
2360 }
2361 return $noselect_fix_enable;
2362 }
2363 ############# GENERAL OPTIONS #####################
2364
2365 # Data directory
2366 sub command33a {
2367 print "Specify the location for your data directory.\n";
2368 print "You need to create this directory yourself.\n";
2369 print "The path name can be absolute or relative (to the config directory).\n";
2370 print "Here are two examples:\n";
2371 print " Absolute: /var/local/squirrelmail/data/\n";
2372 print " Relative: ../data/\n";
2373 print "Relative paths to directories outside of the SquirrelMail distribution\n";
2374 print "will be converted to their absolute path equivalents in config.php.\n\n";
2375 print "Note: There are potential security risks with having a writeable directory\n";
2376 print "under the web server's root directory (ex: /home/httpd/html).\n";
2377 print "For this reason, it is recommended to put the data directory\n";
2378 print "in an alternate location of your choice. \n";
2379 print "\n";
2380
2381 print "[$WHT$data_dir$NRM]: $WHT";
2382 $new_data_dir = <STDIN>;
2383 if ( $new_data_dir eq "\n" ) {
2384 $new_data_dir = $data_dir;
2385 } else {
2386 $new_data_dir =~ s/[\r\n]//g;
2387 }
2388 if ( $new_data_dir =~ /^\s*$/ ) {
2389 $new_data_dir = "";
2390 } else {
2391 $new_data_dir =~ s/\/*$//g;
2392 $new_data_dir =~ s/$/\//g;
2393 }
2394 return $new_data_dir;
2395 }
2396
2397 # Attachment directory
2398 sub command33b {
2399 print "Path to directory used for storing attachments while a mail is\n";
2400 print "being composed. The path name can be absolute or relative (to the\n";
2401 print "config directory). Here are two examples:\n";
2402 print " Absolute: /var/local/squirrelmail/attach/\n";
2403 print " Relative: ../attach/\n";
2404 print "Relative paths to directories outside of the SquirrelMail distribution\n";
2405 print "will be converted to their absolute path equivalents in config.php.\n\n";
2406 print "Note: There are a few security considerations regarding this\n";
2407 print "directory:\n";
2408 print " 1. It should have the permission 733 (rwx-wx-wx) to make it\n";
2409 print " impossible for a random person with access to the webserver\n";
2410 print " to list files in this directory. Confidential data might\n";
2411 print " be laying around in there.\n";
2412 print " Depending on your user:group assignments, 730 (rwx-wx---)\n";
2413 print " may be possible, and more secure (e.g. root:apache)\n";
2414 print " 2. Since the webserver is not able to list the files in the\n";
2415 print " content is also impossible for the webserver to delete files\n";
2416 print " lying around there for too long.\n";
2417 print " 3. It should probably be another directory than the data\n";
2418 print " directory specified in option 3.\n";
2419 print "\n";
2420
2421 print "[$WHT$attachment_dir$NRM]: $WHT";
2422 $new_attachment_dir = <STDIN>;
2423 if ( $new_attachment_dir eq "\n" ) {
2424 $new_attachment_dir = $attachment_dir;
2425 } else {
2426 $new_attachment_dir =~ s/[\r\n]//g;
2427 }
2428 if ( $new_attachment_dir =~ /^\s*$/ ) {
2429 $new_attachment_dir = "";
2430 } else {
2431 $new_attachment_dir =~ s/\/*$//g;
2432 $new_attachment_dir =~ s/$/\//g;
2433 }
2434 return $new_attachment_dir;
2435 }
2436
2437 sub command33c {
2438 print "The directory hash level setting allows you to configure the level\n";
2439 print "of hashing that SquirrelMail employs in your data and attachment\n";
2440 print "directories. This value must be an integer ranging from 0 to 4.\n";
2441 print "When this value is set to 0, SquirrelMail will simply store all\n";
2442 print "files as normal in the data and attachment directories. However,\n";
2443 print "when set to a value from 1 to 4, a simple hashing scheme will be\n";
2444 print "used to organize the files in this directory. In short, the crc32\n";
2445 print "value for a username will be computed. Then, up to the first 4\n";
2446 print "digits of the hash, as set by this configuration value, will be\n";
2447 print "used to directory hash the files for that user in the data and\n";
2448 print "attachment directory. This allows for better performance on\n";
2449 print "servers with larger numbers of users.\n";
2450 print "\n";
2451
2452 print "[$WHT$dir_hash_level$NRM]: $WHT";
2453 $new_dir_hash_level = <STDIN>;
2454 if ( $new_dir_hash_level eq "\n" ) {
2455 $new_dir_hash_level = $dir_hash_level;
2456 } else {
2457 $new_dir_hash_level =~ s/[\r\n]//g;
2458 }
2459 if ( ( int($new_dir_hash_level) < 0 )
2460 || ( int($new_dir_hash_level) > 4 )
2461 || !( int($new_dir_hash_level) eq $new_dir_hash_level ) ) {
2462 print "Invalid Directory Hash Level.\n";
2463 print "Value must be an integer ranging from 0 to 4\n";
2464 print "Hit enter to continue.\n";
2465 $enter_key = <STDIN>;
2466
2467 $new_dir_hash_level = $dir_hash_level;
2468 }
2469
2470 return $new_dir_hash_level;
2471 }
2472
2473 sub command35 {
2474 print "This is the default size (in pixels) of the left folder list.\n";
2475 print "Default is 200, but you can set it to whatever you wish. This\n";
2476 print "is a user preference, so this will only show up as their default.\n";
2477 print "\n";
2478 print "[$WHT$default_left_size$NRM]: $WHT";
2479 $new_default_left_size = <STDIN>;
2480 if ( $new_default_left_size eq "\n" ) {
2481 $new_default_left_size = $default_left_size;
2482 } else {
2483 $new_default_left_size =~ s/[\r\n]//g;
2484 }
2485 return $new_default_left_size;
2486 }
2487
2488 sub command36 {
2489 print "Some IMAP servers only have lowercase letters in the usernames\n";
2490 print "but they still allow people with uppercase to log in. This\n";
2491 print "causes a problem with the user's preference files. This option\n";
2492 print "transparently changes all usernames to lowercase.";
2493 print "\n";
2494
2495 if ( lc($force_username_lowercase) eq 'true' ) {
2496 $default_value = "y";
2497 } else {
2498 $default_value = "n";
2499 }
2500 print "Convert usernames to lowercase (y/n) [$WHT$default_value$NRM]: $WHT";
2501 $new_show = <STDIN>;
2502 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2503 return 'true';
2504 }
2505 return 'false';
2506 }
2507
2508 sub command37 {
2509 print "";
2510 print "\n";
2511
2512 if ( lc($default_use_priority) eq 'true' ) {
2513 $default_value = "y";
2514 } else {
2515 $default_value = "n";
2516 }
2517
2518 print "Allow users to specify priority of outgoing mail (y/n) [$WHT$default_value$NRM]: $WHT";
2519 $new_show = <STDIN>;
2520 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2521 return 'true';
2522 }
2523 return 'false';
2524 }
2525
2526 sub command38 {
2527 print "";
2528 print "\n";
2529
2530 if ( lc($hide_sm_attributions) eq 'true' ) {
2531 $default_value = "y";
2532 } else {
2533 $default_value = "n";
2534 }
2535
2536 print "Hide SM attributions (y/n) [$WHT$default_value$NRM]: $WHT";
2537 $new_show = <STDIN>;
2538 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2539 return 'true';
2540 }
2541 return 'false';
2542 }
2543
2544 sub command39 {
2545 print "";
2546 print "\n";
2547
2548 if ( lc($default_use_mdn) eq 'true' ) {
2549 $default_value = "y";
2550 } else {
2551 $default_value = "n";
2552 }
2553
2554 print "Enable support for read/delivery receipt support (y/n) [$WHT$default_value$NRM]: $WHT";
2555 $new_show = <STDIN>;
2556 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2557 return 'true';
2558 }
2559 return 'false';
2560 }
2561
2562
2563 sub command310 {
2564 print " In loosely managed environments, you may want to allow users
2565 to edit their full name and email address. In strictly managed
2566 environments, you may want to force users to use the name
2567 and email address assigned to them.
2568
2569 'y' - allow a user to edit their full name and email address,
2570 'n' - users must use the assigned values.
2571
2572 ";
2573
2574 if ( lc($edit_identity) eq 'true' ) {
2575 $default_value = "y";
2576 } else {
2577 $default_value = "n";
2578 }
2579 print "Allow editing of user's identity? (y/n) [$WHT$default_value$NRM]: $WHT";
2580 $new_edit = <STDIN>;
2581 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2582 $edit_identity = 'true';
2583 $edit_name = 'true';
2584 $edit_reply_to = 'true';
2585 $hide_auth_header = command311c();
2586 } else {
2587 $edit_identity = 'false';
2588 $edit_name = command311();
2589 $edit_reply_to = command311b();
2590 $hide_auth_header = command311c();
2591 }
2592 return $edit_identity;
2593 }
2594
2595 sub command311 {
2596 print "$NRM";
2597 print "\n Given that users are not allowed to modify their
2598 email address, can they edit their full name?
2599
2600 ";
2601
2602 if ( lc($edit_name) eq 'true' ) {
2603 $default_value = "y";
2604 } else {
2605 $default_value = "n";
2606 }
2607 print "Allow the user to edit their full name? (y/n) [$WHT$default_value$NRM]: $WHT";
2608 $new_edit = <STDIN>;
2609 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2610 $edit_name = 'true';
2611 } else {
2612 $edit_name = 'false';
2613 }
2614 return $edit_name;
2615 }
2616
2617 sub command311b {
2618 print "$NRM";
2619 print "\n Given that users are not allowed to modify their
2620 email address, can they edit their reply-to address?
2621
2622 ";
2623
2624 if ( lc($edit_reply_to) eq 'true' ) {
2625 $default_value = "y";
2626 } else {
2627 $default_value = "n";
2628 }
2629 print "Allow the user to edit their reply-to address? (y/n) [$WHT$default_value$NRM]: $WHT";
2630 $new_edit = <STDIN>;
2631 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2632 $edit_reply_to = 'true';
2633 } else {
2634 $edit_reply_to = 'false';
2635 }
2636 return $edit_reply_to;
2637 }
2638
2639 sub command311c {
2640 print "$NRM";
2641 print "\n SquirrelMail adds username information to every outgoing email in
2642 order to prevent possible sender forging by users that are allowed
2643 to change their email and/or full name.
2644
2645 You can remove user information from this header (y) if you think
2646 that it violates privacy or security.
2647
2648 Note: If users are allowed to change their email addresses, this
2649 setting will make it difficult to determine who sent what where.
2650 Use at your own risk.
2651
2652 Note: If you have defined a header encryption key in your SMTP or
2653 Sendmail settings (see the \"Server Settings\" option page), this
2654 setting is ignored because all user information in outgoing messages
2655 is encoded.
2656
2657 ";
2658
2659 if ( lc($hide_auth_header) eq "true" ) {
2660 $default_value = "y";
2661 } else {
2662 $default_value = "n";
2663 }
2664 print "Remove username from email headers? (y/n) [$WHT$default_value$NRM]: $WHT";
2665 $new_header = <STDIN>;
2666 if ( ( $new_header =~ /^y\n/i ) || ( ( $new_header =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2667 $hide_auth_header = "true";
2668 } else {
2669 $hide_auth_header = "false";
2670 }
2671 return $hide_auth_header;
2672 }
2673
2674 sub command312 {
2675 print "This option allows you to disable server side thread sorting if your server \n";
2676 print "declares THREAD support, but you don't want to provide threading options \n";
2677 print "to end users or THREAD extension is broken or extension does not work with \n";
2678 print "options used by SquirrelMail. Option is not used, if THREAD extension is \n";
2679 print "not declared in IMAP CAPABILITY.\n";
2680 print "\n";
2681
2682 if ( lc($disable_thread_sort) eq 'true' ) {
2683 $default_value = "y";
2684 } else {
2685 $default_value = "n";
2686 }
2687 print "Disable server side thread sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2688 $disable_thread_sort = <STDIN>;
2689 if ( ( $disable_thread_sort =~ /^y\n/i ) || ( ( $disable_thread_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2690 $disable_thread_sort = 'true';
2691 } else {
2692 $disable_thread_sort = 'false';
2693 }
2694 return $disable_thread_sort;
2695 }
2696
2697 sub command313 {
2698 print "This option allows you to disable server side sorting if your server declares \n";
2699 print "SORT support, but SORT extension is broken or does not work with options \n";
2700 print "used by SquirrelMail. Option is not used, if SORT extension is not declared \n";
2701 print "in IMAP CAPABILITY.\n";
2702 print "\n";
2703 print "It is strongly recommended to keep server side sorting enabled, if your ";
2704 print "IMAP server supports it.";
2705 print "\n";
2706
2707 if ( lc($disable_server_sort) eq 'true' ) {
2708 $default_value = "y";
2709 } else {
2710 $default_value = "n";
2711 }
2712 print "Disable server-side sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2713 $disable_server_sort = <STDIN>;
2714 if ( ( $disable_server_sort =~ /^y\n/i ) || ( ( $disable_server_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2715 $disable_server_sort = 'true';
2716 } else {
2717 $disable_server_sort = 'false';
2718 }
2719 return $disable_server_sort;
2720 }
2721
2722 sub command314 {
2723 print "This option allows you to choose if SM uses charset search\n";
2724 print "Your IMAP server must support the SEARCH CHARSET command for this to work\n";
2725 print "\n";
2726
2727 if ( lc($allow_charset_search) eq 'true' ) {
2728 $default_value = "y";
2729 } else {
2730 $default_value = "n";
2731 }
2732 print "Allow charset searching? (y/n) [$WHT$default_value$NRM]: $WHT";
2733 $allow_charset_search = <STDIN>;
2734 if ( ( $allow_charset_search =~ /^y\n/i ) || ( ( $allow_charset_search =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2735 $allow_charset_search = 'true';
2736 } else {
2737 $allow_charset_search = 'false';
2738 }
2739 return $allow_charset_search;
2740 }
2741
2742 # command315 (UID support) obsoleted.
2743
2744 # advanced search option
2745 sub command316 {
2746 print "This option allows you to control the use of advanced search form.\n";
2747 print " 0 = enable basic search only\n";
2748 print " 1 = enable advanced search only\n";
2749 print " 2 = enable both\n";
2750 print "\n";
2751
2752 print "Allowed search (0,1,2)? [$WHT$allow_advanced_search$NRM]: $WHT";
2753 $new_allow_advanced_search = <STDIN>;
2754 if ( $new_allow_advanced_search =~ /^[012]\n/i ) {
2755 $allow_advanced_search = $new_allow_advanced_search;
2756 }
2757 $allow_advanced_search =~ s/[\r\n]//g;
2758 return $allow_advanced_search;
2759 }
2760
2761
2762 sub command317 {
2763 print "This option allows you to change the name of the PHP session used\n";
2764 print "by SquirrelMail. Unless you know what you are doing, you probably\n";
2765 print "don't need or want to change this from the default of SQMSESSID.\n";
2766 print "[$WHT$session_name$NRM]: $WHT";
2767 $new_session_name = <STDIN>;
2768 chomp($new_session_name);
2769 if ( $new_session_name eq "" ) {
2770 $new_session_name = $session_name;
2771 }
2772 return $new_session_name;
2773 }
2774
2775 # time zone config (since 1.5.1)
2776 sub command318 {
2777 print "This option allows you to control the use of time zones.\n";
2778 print " 0 = (default) standard, GNU C time zone names\n";
2779 print " 1 = strict, generic time zone codes with offsets\n";
2780 print " 2 = custom, GNU C time zones loaded from config/timezones.php\n";
2781 print " 3 = custom strict, generic time zone codes with offsets loaded \n";
2782 print " from config/timezones.php\n";
2783 print "See SquirrelMail documentation about format of config/timezones.php file.\n";
2784 print "\n";
2785
2786 print "Desired time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT";
2787 $new_time_zone_type = <STDIN>;
2788 if ( $new_time_zone_type =~ /^[0123]\n/i ) {
2789 $time_zone_type = $new_time_zone_type;
2790 } else {
2791 print "\nInvalid configuration value.\n";
2792 print "\nPress enter to continue...";
2793 $tmp = <STDIN>;
2794 }
2795 $time_zone_type =~ s/[\r\n]//g;
2796 return $time_zone_type;
2797 }
2798
2799 # set the location base for redirects (since 1.5.2)
2800 sub command_config_location_base {
2801 print "Here you can set the base part of the SquirrelMail URL.\n";
2802 print "It is normally autodetected but if that fails, use this\n";
2803 print "option to override.\n";
2804 print "It should contain only the protocol and hostname/port parts\n";
2805 print "of the URL; the full path will be appended automatically.\n\n";
2806 print "Examples:\nhttp://webmail.example.org\nhttp://webmail.example.com:8080\nhttps://webmail.example.com:6691\n\n";
2807 print "Do not add any path elements.\n";
2808
2809 print "URL base? [" .$WHT."autodetect$NRM]: $WHT";
2810 $new_config_location_base = <STDIN>;
2811 chomp($new_config_location_base);
2812 $config_location_base = $new_config_location_base;
2813
2814 return $config_location_base;
2815 }
2816
2817 # only_secure_cookies (since 1.5.2)
2818 sub command319 {
2819 print "This option allows you to specify that if a user session is initiated\n";
2820 print "under a secure (HTTPS, SSL-encrypted) connection, the cookies given to\n";
2821 print "the browser will ONLY be transmitted via a secure connection henceforth.\n\n";
2822 print "Generally this is a Good Thing, and should NOT be disabled. However,\n";
2823 print "if you intend to use the Secure Login or Show SSL Link plugins to\n";
2824 print "encrypt the user login, but not the rest of the SquirrelMail session,\n";
2825 print "this can be turned off. Think twice before doing so.\n";
2826 print "\n";
2827
2828 if ( lc($only_secure_cookies) eq 'true' ) {
2829 $default_value = "y";
2830 } else {
2831 $default_value = "n";
2832 }
2833 print "Transmit cookies only on secure connection when available? (y/n) [$WHT$default_value$NRM]: $WHT";
2834 $only_secure_cookies = <STDIN>;
2835 if ( ( $only_secure_cookies =~ /^y\n/i ) || ( ( $only_secure_cookies =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2836 $only_secure_cookies = 'true';
2837 } else {
2838 $only_secure_cookies = 'false';
2839 }
2840 return $only_secure_cookies;
2841 }
2842
2843
2844 # disable_security_tokens (since 1.5.2)
2845 sub command320 {
2846 print "This option allows you to turn off the security checks in the forms\n";
2847 print "that SquirrelMail generates. It is NOT RECOMMENDED that you disable\n";
2848 print "this feature - otherwise, your users may be exposed to phishing and\n";
2849 print "other attacks.\n";
2850 print "Unless you know what you are doing, you should leave this set to \"NO\".\n";
2851 print "\n";
2852
2853 if ( lc($disable_security_tokens) eq 'true' ) {
2854 $default_value = "y";
2855 } else {
2856 $default_value = "n";
2857 }
2858 print "Disable secure forms? (y/n) [$WHT$default_value$NRM]: $WHT";
2859 $disable_security_tokens = <STDIN>;
2860 if ( ( $disable_security_tokens =~ /^y\n/i ) || ( ( $disable_security_tokens =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2861 $disable_security_tokens = 'true';
2862 } else {
2863 $disable_security_tokens = 'false';
2864 }
2865 return $disable_security_tokens;
2866 }
2867
2868
2869
2870 # check_referrer (since 1.5.2)
2871 sub command321 {
2872 print "This option allows you to enable referal checks for all page requests\n";
2873 print "made to SquirrelMail. This can help ensure that page requests came\n";
2874 print "from the same server and not from an attacker's site (usually the\n";
2875 print "result of a XSS or phishing attack). To enable referal checking,\n";
2876 print "this setting can be set to the domain where your SquirrelMail is\n";
2877 print "being hosted (usually the same as the Domain setting under Server\n";
2878 print "Settings). For example, it could be \"example.com\", or if you\n";
2879 print "use a plugin (such as Login Manager) to host SquirrelMail on more\n";
2880 print "than one domain, you can set this to \"###DOMAIN###\" to tell it\n";
2881 print "to use the current domain.\n";
2882 print "\n";
2883 print "However, in some cases (where proxy servers are in use, etc.), the\n";
2884 print "domain might be different.\n";
2885 print "\n";
2886 print "NOTE that referal checks are not foolproof - they can be spoofed by\n";
2887 print "browsers, and some browsers intentionally don't send referal\n";
2888 print "information (in which case, the check is silently bypassed)\n";
2889 print "\n";
2890
2891 print "Referal requirement? [$WHT$check_referrer$NRM]: $WHT";
2892 $new_check_referrer = <STDIN>;
2893 chomp($new_check_referrer);
2894 $check_referrer = $new_check_referrer;
2895
2896 return $check_referrer;
2897 }
2898
2899
2900
2901 # use_transparent_security_image (since 1.5.2)
2902 sub command322 {
2903 print "When HTML messages are being displayed, SquirrelMail's default behavior\n";
2904 print "is to remove all remote images and replace them with a local one.\n";
2905 print "\n";
2906 print "This option allows you to specify whether the local image should contain\n";
2907 print "text that indicates to the user that \"this image has been removed for\n";
2908 print "security reasons\" (translated into most languages), or if it should be\n";
2909 print "transparent.\n";
2910 print "\n";
2911
2912 if ( lc($use_transparent_security_image) eq 'true' ) {
2913 $default_value = "y";
2914 } else {
2915 $default_value = "n";
2916 }
2917 print "Use transparent security image? (y/n) [$WHT$default_value$NRM]: $WHT";
2918 $use_transparent_security_image = <STDIN>;
2919 if ( ( $use_transparent_security_image =~ /^y\n/i ) || ( ( $use_transparent_security_image =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2920 $use_transparent_security_image = 'true';
2921 } else {
2922 $use_transparent_security_image = 'false';
2923 }
2924 return $use_transparent_security_image;
2925 }
2926
2927
2928
2929 # display_imap_login_error (since 1.5.2)
2930 sub command323 {
2931 print "Some IMAP servers return detailed information about why a login is\n";
2932 print "being refused (the username or password could be invalid or there\n";
2933 print "might be an administrative lock on the account).\n";
2934 print "\n";
2935 print "Enabling this option will cause SquirrelMail to display login failure\n";
2936 print "messages directly from the IMAP server. When it is disabled, login\n";
2937 print "failures are always reported to the user with the traditional \"Unknown\n";
2938 print "user or password incorrect.\"\n";
2939 print "\n";
2940
2941 if ( lc($display_imap_login_error) eq 'true' ) {
2942 $default_value = "y";
2943 } else {
2944 $default_value = "n";
2945 }
2946 print "Display login error messages directly from the IMAP server? (y/n) [$WHT$default_value$NRM]: $WHT";
2947 $display_imap_login_error = <STDIN>;
2948 if ( ( $display_imap_login_error =~ /^y\n/i ) || ( ( $display_imap_login_error =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2949 $display_imap_login_error = 'true';
2950 } else {
2951 $display_imap_login_error = 'false';
2952 }
2953 return $display_imap_login_error;
2954 }
2955
2956
2957
2958 sub command_userThemes {
2959 print "\nDefine the user themes that you wish to use. If you have added\n";
2960 print "a theme of your own, just follow the instructions (?) about\n";
2961 print "how to add them. You can also change the default theme.\n\n";
2962
2963 print "Available user themes:\n";
2964 $count = 0;
2965 while ( $count <= $#user_theme_name ) {
2966 if ( $count == $user_theme_default ) {
2967 print " *";
2968 } else {
2969 print " ";
2970 }
2971 if ( $count < 10 ) {
2972 print " ";
2973 }
2974 $name = $user_theme_name[$count];
2975 $num_spaces = 35 - length($name);
2976 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2977 $name = $name . " ";
2978 }
2979
2980 print " $count. $name";
2981 print "($user_theme_path[$count])\n";
2982
2983 $count++;
2984 }
2985
2986 print "\n";
2987 print ".------------------------------------.\n";
2988 print "| t (detect user themes) |\n";
2989 print "| + (add user theme) |\n";
2990 print "| - N (remove user theme) |\n";
2991 print "| m N (mark default user theme) |\n";
2992 print "| l (list user themes) |\n";
2993 print "| d (done) |\n";
2994 print "`------------------------------------'\n";
2995
2996 print "\n[user_themes] command (?=help) > ";
2997 $input = <STDIN>;
2998 $input =~ s/[\r\n]//g;
2999 while ( $input ne "d" ) {
3000 if ( $input =~ /^\s*l\s*/i ) {
3001 $count = 0;
3002 while ( $count <= $#user_theme_name ) {
3003 if ( $count == $user_theme_default ) {
3004 print " *";
3005 } else {
3006 print " ";
3007 }
3008 if ( $count < 10 ) {
3009 print " ";
3010 }
3011 $name = $user_theme_name[$count];
3012 $num_spaces = 35 - length($name);
3013 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3014 $name = $name . " ";
3015 }
3016
3017 print " $count. $name";
3018 print "($user_theme_path[$count])\n";
3019
3020 $count++;
3021 }
3022 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
3023 $old_def = $user_theme_default;
3024 $user_theme_default = $input;
3025 $user_theme_default =~ s/^\s*m\s*//;
3026 if ( ( $user_theme_default > $#user_theme_name ) || ( $user_theme_default < 0 ) ) {
3027 print "Cannot set default theme to $user_theme_default. That theme does not exist.\n";
3028 $user_theme_default = $old_def;
3029 }
3030 } elsif ( $input =~ /^\s*\+/ ) {
3031 print "What is the name of this theme? ";
3032 $name = <STDIN>;
3033 $name =~ s/[\r\n]//g;
3034 $user_theme_name[ $#user_theme_name + 1 ] = $name;
3035 print "Be sure to put ../css/ before the filename.\n";
3036 print "What file is this stored in (ex: ../css/my_theme/): ";
3037 $name = <STDIN>;
3038 $name =~ s/[\r\n]//g;
3039 $user_theme_path[ $#user_theme_path + 1 ] = $name;
3040 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
3041 if ( $input =~ /[0-9]+\s*$/ ) {
3042 $rem_num = $input;
3043 $rem_num =~ s/^\s*-\s*//g;
3044 $rem_num =~ s/\s*$//;
3045 } else {
3046 $rem_num = $#user_theme_name;
3047 }
3048 if ( $rem_num == $user_theme_default ) {
3049 print "You cannot remove the default theme!\n";
3050 } else {
3051 $count = 0;
3052 @new_theme_name = ();
3053 @new_theme_path = ();
3054 while ( $count <= $#user_theme_name ) {
3055 if ( $count != $rem_num ) {
3056 @new_theme_name = ( @new_theme_name, $user_theme_name[$count] );
3057 @new_theme_path = ( @new_theme_path, $user_theme_path[$count] );
3058 }
3059 $count++;
3060 }
3061 @user_theme_name = @new_theme_name;
3062 @user_theme_path = @new_theme_path;
3063 if ( $user_theme_default > $rem_num ) {
3064 $user_theme_default--;
3065 }
3066 }
3067 } elsif ( $input =~ /^\s*t\s*/i ) {
3068 print "\nStarting detection...\n\n";
3069
3070 opendir( DIR, "../css" );
3071 @files = sort(readdir(DIR));
3072 $cnt = 0;
3073 while ( $cnt <= $#files ) {
3074 $filename = "../css/" . $files[$cnt] .'/';
3075 if ( $files[$cnt] !~ /^\./ && $filename ne "../css/rtl.css" && -e $filename . "default.css" ) {
3076 $found = 0;
3077 for ( $x = 0 ; $x <= $#user_theme_path ; $x++ ) {
3078 if ( $user_theme_path[$x] eq $filename ) {
3079 $found = 1;
3080 }
3081 }
3082 if ( $found != 1 ) {
3083 print "** Found user theme: $filename\n";
3084 $def = $files[$cnt];
3085 $def =~ s/_/ /g;
3086 $def = lc($def);
3087 #$def =~ s/(^\w+)/ucfirst $1/eg;
3088 #$def =~ s/(\s+)(\w+)/$1 . ucfirst $2/eg;
3089 $def =~ s/(^\w+)|(\s+)(\w+)/ucfirst $1 . $2 . ucfirst $3/eg;
3090 print " What is its name? [$def]: ";
3091 $nm = <STDIN>;
3092 $nm =~ s/^\s+|\s+$|[\n\r]//g;
3093 if ( $nm eq '' ) { $nm = $def; }
3094 $user_theme_name[ $#user_theme_name + 1 ] = $nm;
3095 $user_theme_path[ $#user_theme_path + 1 ] = $filename;
3096 }
3097 }
3098 $cnt++;
3099 }
3100 print "\n";
3101 for ( $cnt = 0 ; $cnt <= $#user_theme_path ; $cnt++ ) {
3102 $filename = $user_theme_path[$cnt];
3103 if ( $filename != 'none' && !( -e $filename ."/default.css" ) ) {
3104 print " Removing $filename (file not found)\n";
3105 $offset = 0;
3106 @new_user_theme_name = ();
3107 @new_user_theme_path = ();
3108 for ( $x = 0 ; $x < $#user_theme_path ; $x++ ) {
3109 if ( $user_theme_path[$x] eq $filename ) {
3110 $offset = 1;
3111 }
3112 if ( $offset == 1 ) {
3113 $new_user_theme_name[$x] = $user_theme_name[ $x + 1 ];
3114 $new_user_theme_path[$x] = $user_theme_path[ $x + 1 ];
3115 } else {
3116 $new_user_theme_name[$x] = $user_theme_name[$x];
3117 $new_user_theme_path[$x] = $user_theme_path[$x];
3118 }
3119 }
3120 @user_theme_name = @new_user_theme_name;
3121 @user_theme_path = @new_user_theme_path;
3122 }
3123 }
3124 print "\nDetection complete!\n\n";
3125
3126 closedir DIR;
3127 } elsif ( $input =~ /^\s*\?\s*/ ) {
3128 print ".------------------------------------.\n";
3129 print "| t (detect user themes) |\n";
3130 print "| + (add user theme) |\n";
3131 print "| - N (remove user theme) |\n";
3132 print "| m N (mark default user theme) |\n";
3133 print "| l (list user themes) |\n";
3134 print "| d (done) |\n";
3135 print "`------------------------------------'\n";
3136 }
3137 print "[user_themes] command (?=help) > ";
3138 $input = <STDIN>;
3139 $input =~ s/[\r\n]//g;
3140 }
3141 }
3142
3143 sub command_iconSets {
3144 print "\nDefine the icon themes that you wish to use. If you have added\n";
3145 print "a theme of your own, just follow the instructions (?) about\n";
3146 print "how to add them. You can also change the default and fallback\n";
3147 print "themes. The default theme will be used when no icon theme is\n";
3148 print "set by the user. The fallback theme will be used if an icon\n";
3149 print "cannot be found in the currently selected icon theme.\n\n";
3150
3151 print "Available icon themes:\n\n";
3152
3153 $count = 0;
3154 while ( $count <= $#icon_theme_name ) {
3155 if ( $count == $icon_theme_def ) {
3156 print " d";
3157 } else {
3158 print " ";
3159 }
3160 if ( $count eq $icon_theme_fallback ) {
3161 print "f ";
3162 } else {
3163 print " ";
3164 }
3165 if ( $count < 10 ) {
3166 print " ";
3167 }
3168 $name = $icon_theme_name[$count];
3169 $num_spaces = 35 - length($name);
3170 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3171 $name = $name . " ";
3172 }
3173
3174 print " $count. $name";
3175 print "($icon_theme_path[$count])\n";
3176
3177 $count++;
3178 }
3179
3180 print "\n d = Default icon theme\n";
3181 print " f = Fallback icon theme\n";
3182 print "\n";
3183 print ".------------------------------------.\n";
3184 print "| t (detect icon themes) |\n";
3185 print "| + (add icon theme) |\n";
3186 print "| - N (remove icon theme) |\n";
3187 print "| m N (mark default icon theme) |\n";
3188 print "| f N (set fallback icon set) |\n";
3189 print "| l (list icon themes) |\n";
3190 print "| d (done) |\n";
3191 print "`------------------------------------'\n";
3192
3193 print "\n[icon_themes] command (?=help) > ";
3194 $input = <STDIN>;
3195 $input =~ s/[\r\n]//g;
3196 while ( $input ne "d" ) {
3197 if ( $input =~ /^\s*l\s*/i ) {
3198 $count = 0;
3199 print "\n";
3200 while ( $count <= $#icon_theme_name ) {
3201 if ( $count == $icon_theme_def ) {
3202 print " d";
3203 } else {
3204 print " ";
3205 }
3206 if ( $count eq $icon_theme_fallback ) {
3207 print "f ";
3208 } else {
3209 print " ";
3210 }
3211 $name = $icon_theme_name[$count];
3212 $num_spaces = 35 - length($name);
3213 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3214 $name = $name . " ";
3215 }
3216
3217 print " $count. $name";
3218 print "($icon_theme_path[$count])\n";
3219
3220 $count++;
3221 }
3222 print "\n d = Default icon theme\n";
3223 print " f = Fallback icon theme\n\n";
3224 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
3225 $old_def = $icon_theme_def;
3226 $icon_theme_def = $input;
3227 $icon_theme_def =~ s/^\s*m\s*//;
3228 if ( ( $icon_theme_default > $#icon_theme_name ) || ( $icon_theme_default < 0 ) ) {
3229 print "Cannot set default icon theme to $icon_theme_default. That theme does not exist.\n";
3230 $icon_theme_def = $old_def;
3231 }
3232 } elsif ( $input =~ /^\s*f\s*[0-9]+/i ) {
3233 $old_fb = $icon_theme_fallback;
3234 $icon_theme_fallback = $input;
3235 $icon_theme_fallback =~ s/^\s*f\s*//;
3236 if ( ( $icon_theme_fallback > $#icon_theme_name ) || ( $icon_theme_fallback < 0 ) ) {
3237 print "Cannot set fallback icon theme to $icon_theme_fallback. That theme does not exist.\n";
3238 $icon_theme_fallback = $old_fb;
3239 }
3240 } elsif ( $input =~ /^\s*\+/ ) {
3241 print "What is the name of this icon theme? ";
3242 $name = <STDIN>;
3243 $name =~ s/[\r\n]//g;
3244 $icon_theme_name[ $#icon_theme_name + 1 ] = $name;
3245 print "Be sure to put ../images/themes/ before the filename.\n";
3246 print "What directory is this icon theme stored in (ex: ../images/themes/my_theme/)? ";
3247 $name = <STDIN>;
3248 $name =~ s/[\r\n]//g;
3249 $icon_theme_path[ $#icon_theme_path + 1 ] = $name;
3250 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
3251 if ( $input =~ /[0-9]+\s*$/ ) {
3252 $rem_num = $input;
3253 $rem_num =~ s/^\s*-\s*//g;
3254 $rem_num =~ s/\s*$//;
3255 } else {
3256 $rem_num = $#icon_theme_name;
3257 }
3258 if ( $rem_num == $icon_theme_def ) {
3259 print "You cannot remove the default icon theme!\n";
3260 } elsif ( $rem_num == $icon_theme_fallback ) {
3261 print "You cannot remove the fallback icon theme!\n";
3262 } else {
3263 $count = 0;
3264 @new_theme_name = ();
3265 @new_theme_path = ();
3266 while ( $count <= $#icon_theme_name ) {
3267 if ( $count != $rem_num ) {
3268 @new_theme_name = ( @new_theme_name, $icon_theme_name[$count] );
3269 @new_theme_path = ( @new_theme_path, $icon_theme_path[$count] );
3270 }
3271 $count++;
3272 }
3273 @icon_theme_name = @new_theme_name;
3274 @icon_theme_path = @new_theme_path;
3275 if ( $icon_theme_def > $rem_num ) {
3276 $icon_theme_def--;
3277 }
3278 }
3279 } elsif ( $input =~ /^\s*t\s*/i ) {
3280 print "\nStarting detection...\n\n";
3281
3282 opendir( DIR, "../images/themes/" );
3283 @files = sort(readdir(DIR));
3284 $cnt = 0;
3285 while ( $cnt <= $#files ) {
3286 $filename = "../images/themes/" . $files[$cnt] .'/';
3287 if ( -d "../images/themes/" . $files[$cnt] && $files[$cnt] !~ /^\./ && $files[$cnt] ne ".svn" ) {
3288 $found = 0;
3289 for ( $x = 0 ; $x <= $#icon_theme_path ; $x++ ) {
3290 if ( $icon_theme_path[$x] eq $filename ) {
3291 $found = 1;
3292 }
3293 }
3294 if ( $found != 1 ) {
3295 print "** Found icon theme: $filename\n";
3296 $def = $files[$cnt];
3297 $def =~ s/_/ /g;
3298 $def = lc($def);
3299 #$def =~ s/(^\w+)/ucfirst $1/eg;
3300 #$def =~ s/(\s+)(\w+)/$1 . ucfirst $2/eg;
3301 $def =~ s/(^\w+)|(\s+)(\w+)/ucfirst $1 . $2 . ucfirst $3/eg;
3302 print " What is its name? [$def]: ";
3303 $nm = <STDIN>;
3304 $nm =~ s/^\s+|\s+$|[\n\r]//g;
3305 if ( $nm eq '' ) { $nm = $def; }
3306 $icon_theme_name[ $#icon_theme_name + 1 ] = $nm;
3307 $icon_theme_path[ $#icon_theme_path + 1 ] = $filename;
3308 }
3309 }
3310 $cnt++;
3311 }
3312 print "\n";
3313 for ( $cnt = 0 ; $cnt <= $#icon_theme_path ; $cnt++ ) {
3314 $filename = $icon_theme_path[$cnt];
3315 if ( $filename ne "none" && $filename ne "template" && ! -d $filename ) {
3316 print " Removing $filename (file not found)\n";
3317 $offset = 0;
3318 @new_icon_theme_name = ();
3319 @new_icon_theme_path = ();
3320 for ( $x = 0 ; $x < $#icon_theme_path ; $x++ ) {
3321 if ( $icon_theme_path[$x] eq $filename ) {
3322 $offset = 1;
3323 }
3324 if ( $offset == 1 ) {
3325 $new_icon_theme_name[$x] = $icon_theme_name[ $x + 1 ];
3326 $new_icon_theme_path[$x] = $icon_theme_path[ $x + 1 ];
3327 } else {
3328 $new_icon_theme_name[$x] = $icon_theme_name[$x];
3329 $new_icon_theme_path[$x] = $icon_theme_path[$x];
3330 }
3331 }
3332 @icon_theme_name = @new_icon_theme_name;
3333 @icon_theme_path = @new_icon_theme_path;
3334 }
3335 }
3336 print "\nDetection complete!\n\n";
3337
3338 closedir DIR;
3339 } elsif ( $input =~ /^\s*\?\s*/ ) {
3340 print ".------------------------------------.\n";
3341 print "| t (detect icon themes) |\n";
3342 print "| + (add icon theme) |\n";
3343 print "| - N (remove icon theme) |\n";
3344 print "| m N (mark default icon theme) |\n";
3345 print "| f N (set fallback icon set) |\n";
3346 print "| l (list icon themes) |\n";
3347 print "| d (done) |\n";
3348 print "`------------------------------------'\n";
3349 }
3350 print "[icon_themes] command (?=help) > ";
3351 $input = <STDIN>;
3352 $input =~ s/[\r\n]//g;
3353 }
3354 }
3355
3356 sub command_templates {
3357 print "\nDefine the template sets (skins) that you wish to use. If you have added\n";
3358 print "a template set of your own, just follow the instructions (?) about\n";
3359 print "how to add them. You can also change the default template.\n";
3360
3361 print "\n Available Templates:\n";
3362
3363 $count = 0;
3364 while ( $count <= $#templateset_name ) {
3365 if ( $templateset_id[$count] eq $templateset_default ) {
3366 print " d";
3367 } else {
3368 print " ";
3369 }
3370 if ( $templateset_id[$count] eq $templateset_fallback ) {
3371 print "f";
3372 } else {
3373 print " ";
3374 }
3375 if ( $templateset_id[$count] eq $rpc_templateset ) {
3376 print "r ";
3377 } else {
3378 print " ";
3379 }
3380 if ( $count < 10 ) {
3381 print " ";
3382 }
3383 if ( $count < 100 ) {
3384 print " ";
3385 }
3386 $name = $templateset_name[$count];
3387
3388 # present RPC template sets differently
3389 #
3390 if ( $templateset_id[$count] =~ /_rpc$/ ) {
3391 $name = $name . " (not shown in user interface; used for RPC interface only)";
3392 } else {
3393
3394 $num_spaces = 35 - length($name);
3395 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3396 $name = $name . " ";
3397 }
3398 $name = $name . "($templateset_id[$count])";
3399
3400 }
3401
3402 print " $count. $name\n";
3403
3404 $count++;
3405 }
3406 print "\n d = default template set\n"
3407 . " f = fallback template set\n"
3408 . " r = RPC template set\n\n";
3409
3410 $menu_text = ".-------------------------------------.\n"
3411 . "| t (detect template set) |\n"
3412 . "| + (add template set) |\n"
3413 . "| - N (remove template set) |\n"
3414 . "| m N (mark default template set) |\n"
3415 . "| f N (set fallback template set) |\n"
3416 . "| r N (set RPC template set) |\n"
3417 . "| l (list template sets/skins) |\n"
3418 . "| d (done) |\n"
3419 . "|-------------------------------------|\n"
3420 . "| where N is a template set number |\n"
3421 . "`-------------------------------------'\n";
3422 print "\n";
3423 print $menu_text;
3424 print "\n[template set] command (?=help) > ";
3425
3426 $input = <STDIN>;
3427 $input =~ s/[\r\n]//g;
3428 while ( $input ne "d" ) {
3429
3430 # list template sets
3431 #
3432 if ( $input =~ /^\s*l\s*/i ) {
3433 $count = 0;
3434 while ( $count <= $#templateset_name ) {
3435 if ( $templateset_id[$count] eq $templateset_default ) {
3436 print " d";
3437 } else {
3438 print " ";
3439 }
3440 if ( $templateset_id[$count] eq $templateset_fallback ) {
3441 print "f";
3442 } else {
3443 print " ";
3444 }
3445 if ( $templateset_id[$count] eq $rpc_templateset ) {
3446 print "r ";
3447 } else {
3448 print " ";
3449 }
3450 if ( $count < 10 ) {
3451 print " ";
3452 }
3453 if ( $count < 100 ) {
3454 print " ";
3455 }
3456 $name = $templateset_name[$count];
3457
3458 # present RPC template sets differently
3459 #
3460 if ( $templateset_id[$count] =~ /_rpc$/ ) {
3461 $name = $name . " (not shown in user interface; used for RPC interface only)";
3462 } else {
3463
3464 $num_spaces = 35 - length($name);
3465 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3466 $name = $name . " ";
3467 }
3468 $name = $name . "($templateset_id[$count])";
3469
3470 }
3471
3472 print " $count. $name\n";
3473
3474 $count++;
3475 }
3476 print "\n d = default template set\n"
3477 . " f = fallback template set\n"
3478 . " r = RPC template set\n\n";
3479
3480 # mark default template set
3481 #
3482 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
3483 $old_def = $templateset_default;
3484 $input =~ s/^\s*m\s*//;
3485 $templateset_default = $templateset_id[$input];
3486 if ( $templateset_default =~ /^\s*$/ ) {
3487 print "Cannot set default template set to $input. That template set does not exist.\n";
3488 $templateset_default = $old_def;
3489 }
3490 if ( $templateset_default =~ /_rpc$/ ) {
3491 print "Cannot set default template set to $input. That template set is intended for the RPC interface only.\n";
3492 $templateset_default = $old_def;
3493 }
3494
3495 # set fallback template set
3496 #
3497 } elsif ( $input =~ /^\s*f\s*[0-9]+/i ) {
3498 $old_def = $templateset_fallback;
3499 $input =~ s/^\s*f\s*//;
3500 $templateset_fallback = $templateset_id[$input];
3501 if ( $templateset_fallback =~ /^\s*$/ ) {
3502 print "Cannot set fallback template set to $input. That template set does not exist.\n";
3503 $templateset_fallback = $old_def;
3504 }
3505 if ( $templateset_fallback =~ /_rpc$/ ) {
3506 print "Cannot set fallback template set to $input. That template set is intended for the RPC interface only.\n";
3507 $templateset_fallback = $old_def;
3508 }
3509
3510 # set RPC template set
3511 #
3512 } elsif ( $input =~ /^\s*r\s*[0-9]+/i ) {
3513 $old_def = $rpc_templateset;
3514 $input =~ s/^\s*r\s*//;
3515 $rpc_templateset = $templateset_id[$input];
3516 if ( $rpc_templateset =~ /^\s*$/ ) {
3517 print "Cannot set RPC template set to $input. That template set does not exist.\n";
3518 $rpc_templateset = $old_def;
3519 }
3520 if ( $rpc_templateset !~ /_rpc$/ ) {
3521 print "Cannot set fallback template set to $input. That template set is not intended for the RPC interface.\n";
3522 $rpc_templateset = $old_def;
3523 }
3524
3525 # add template set
3526 #
3527 } elsif ( $input =~ /^\s*\+/ ) {
3528 print "\nWhat is the name of this template (as shown to your users): ";
3529 $name = <STDIN>;
3530 $name =~ s/[\r\n]//g;
3531 $templateset_name[ $#templateset_name + 1 ] = $name;
3532 print "\n\nThe directory name should not contain any path information\n"
3533 . "or slashes, and should be the name of the directory that the\n"
3534 . "template set is found in within the SquirrelMail templates\n"
3535 . "directory.\n\n";
3536 print "What directory is this stored in (ex: default_advanced): ";
3537 $name = <STDIN>;
3538 $name =~ s/[\r\n]//g;
3539 $templateset_id[ $#templateset_id + 1 ] = $name;
3540
3541 # detect template sets
3542 #
3543 } elsif ( $input =~ /^\s*t\s*/i ) {
3544 print "\nStarting detection...\n\n";
3545 opendir( DIR, "../templates" );
3546 @files = sort(readdir(DIR));
3547 $cnt = 0;
3548 while ( $cnt <= $#files ) {
3549 if ( -d "../templates/" . $files[$cnt] && $files[$cnt] !~ /^\./ && $files[$cnt] ne ".svn" ) {
3550 $filename = $files[$cnt];
3551 $found = 0;
3552 for ( $x = 0 ; $x <= $#templateset_id ; $x++ ) {
3553 if ( $templateset_id[$x] eq $filename ) {
3554 $found = 1;
3555 last;
3556 }
3557 }
3558 if ( $found != 1) {
3559 print "** Found template set: $filename\n";
3560 $def = $files[$cnt];
3561
3562 # no user-friendly names needed for RPC template sets
3563 #
3564 if ( $def =~ /_rpc$/ ) {
3565 $nm = $def;
3566 } else {
3567 $def = lc($def);
3568 $def =~ s/_/ /g;
3569 #$def =~ s/(^\w+)/ucfirst $1/eg;
3570 #$def =~ s/(\s+)(\w+)/$1 . ucfirst $2/eg;
3571 $def =~ s/(^\w+)|(\s+)(\w+)/ucfirst $1 . $2 . ucfirst $3/eg;
3572 print " What is it's name (as shown to your users)? [$def]: ";
3573 $nm = <STDIN>;
3574 $nm =~ s/^\s+|\s+$|[\n\r]//g;
3575 if ( $nm eq '' ) { $nm = $def; }
3576 }
3577 $templateset_id[ $#templateset_id + 1 ] = $filename;
3578 $templateset_name[ $#templateset_name + 1 ] = $nm;
3579 }
3580 }
3581 $cnt++;
3582 }
3583 print "\n";
3584 for ( $cnt= 0 ; $cnt <= $#templateset_id ; ) {
3585 $filename = $templateset_id[$cnt];
3586 if ( !(-d change_to_rel_path('SM_PATH . \'templates/' . $filename)) ) {
3587 print " Removing \"$filename\" (template set directory not found)\n";
3588 if ( $templateset_default eq $filename ) { $templateset_default = 'default'; }
3589 if ( $templateset_fallback eq $filename ) { $templateset_fallback = 'default'; }
3590 if ( $rpc_templateset eq $filename ) { $rpc_templateset = 'default_rpc'; }
3591 $offset = 0;
3592 @new_templateset_name = ();
3593 @new_templateset_id = ();
3594 for ( $x = 0 ; $x < $#templateset_id ; $x++ ) {
3595 if ( $templateset_id[$x] eq $filename ) {
3596 $offset = 1;
3597 }
3598 if ( $offset == 1 ) {
3599 $new_templateset_name[$x] = $templateset_name[ $x + 1 ];
3600 $new_templateset_id[$x] = $templateset_id[ $x + 1 ];
3601 } else {
3602 $new_templateset_name[$x] = $templateset_name[$x];
3603 $new_templateset_id[$x] = $templateset_id[$x];
3604 }
3605 }
3606 @templateset_name = @new_templateset_name;
3607 @templateset_id = @new_templateset_id;
3608 } else { $cnt++; }
3609 }
3610 print "\nDetection complete!\n\n";
3611
3612 closedir DIR;
3613
3614 # remove template set
3615 #
3616 # undocumented functionality of removing last template set isn't that great
3617 #} elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
3618 } elsif ( $input =~ /^\s*-\s*[0-9]+/ ) {
3619 if ( $input =~ /[0-9]+\s*$/ ) {
3620 $rem_num = $input;
3621 $rem_num =~ s/^\s*-\s*//g;
3622 $rem_num =~ s/\s*$//;
3623 } else {
3624 $rem_num = $#templateset_name;
3625 }
3626 if ( $templateset_id[$rem_num] eq $templateset_default ) {
3627 print "You cannot remove the default template set!\n";
3628 } elsif ( $templateset_id[$rem_num] eq $templateset_fallback ) {
3629 print "You cannot remove the fallback template set!\n";
3630 } elsif ( $templateset_id[$rem_num] eq $rpc_templateset ) {
3631 print "You cannot remove the RPC template set!\n";
3632 } else {
3633 $count = 0;
3634 @new_templateset_name = ();
3635 @new_templateset_id = ();
3636 while ( $count <= $#templateset_name ) {
3637 if ( $count != $rem_num ) {
3638 @new_templateset_name = ( @new_templateset_name, $templateset_name[$count] );
3639 @new_templateset_id = ( @new_templateset_id, $templateset_id[$count] );
3640 }
3641 $count++;
3642 }
3643 @templateset_name = @new_templateset_name;
3644 @templateset_id = @new_templateset_id;
3645 }
3646
3647 # help
3648 #
3649 } elsif ( $input =~ /^\s*\?\s*/ ) {
3650 print $menu_text;
3651
3652 # command not understood
3653 #
3654 } else {
3655 print "Command not understood\n";
3656 }
3657
3658 print "[template set] command (?=help) > ";
3659 $input = <STDIN>;
3660 $input =~ s/[\r\n]//g;
3661 }
3662 return $templateset_default;
3663 }
3664
3665
3666 # sets default font size option
3667 sub command_default_fontsize {
3668 print "Enter default font size [$WHT$$default_fontsize$NRM]: $WHT";
3669 $new_size = <STDIN>;
3670 if ( $new_size eq "\n" ) {
3671 $new_size = $size;
3672 } else {
3673 $new_size =~ s/[\r\n]//g;
3674 }
3675 return $new_size;
3676 }
3677
3678 # controls available fontsets
3679 sub command_fontsets {
3680 # Greeting
3681 print "You can control fontsets available to end users here.\n";
3682 # set initial $input value
3683 $input = 'l';
3684 while ( $input ne "x" ) {
3685 if ( $input =~ /^\s*a\s*/i ) {
3686 # add new fontset
3687 print "\nFontset name: ";
3688 $name = <STDIN>;
3689 if (! $fontsets{trim($name)}) {
3690 print "Fontset string: ";
3691 $value = <STDIN>;
3692 $fontsets{trim($name)} = trim($value);
3693 } else {
3694 print "\nERROR: Such fontset already exists.\n";
3695 }
3696 } elsif ( $input =~ /^\s*e\s*/i ) {
3697 # edit existing fontset
3698 print "\nFontset name: ";
3699 $name = <STDIN>;
3700 if (! $fontsets{trim($name)}) {
3701 print "\nERROR: No such fontset.\n";
3702 } else {
3703 print "Fontset string [$fontsets{trim($name)}]: ";
3704 $value = <STDIN>;
3705 $fontsets{trim($name)} = trim($value);
3706 }
3707 } elsif ( $input =~ /^\s*d\s*/ ) {
3708 # delete existing fontset
3709 print "\nFontset name: ";
3710 $name = <STDIN>;
3711 if (! $fontsets{trim($name)}) {
3712 print "\nERROR: No such fontset.\n";
3713 } else {
3714 delete $fontsets{trim($name)};
3715 }
3716 } elsif ( $input =~ /^\s*l\s*/ ) {
3717 # list fontsets
3718 print "\nConfigured fontsets:\n";
3719 while (($fontset_name, $fontset_string) = each(%fontsets)) {
3720 print " $fontset_name = $fontset_string\n";
3721 }
3722 print "Default fontset: $default_fontset\n";
3723 } elsif ( $input =~ /^\s*m\s*/ ) {
3724 # set default fontset
3725 print "\nSet default fontset [$default_fontset]: ";
3726 $name = <STDIN>;
3727 if (trim($name) ne '' and ! $fontsets{trim($name)}) {
3728 print "\nERROR: No such fontset.\n";
3729 } else {
3730 $default_fontset = trim($name);
3731 }
3732 } else {
3733 # print available commands on any other input
3734 print "\nAvailable commands:\n";
3735 print " a - Adds new fontset.\n";
3736 print " d - Deletes existing fontset.\n";
3737 print " e - Edits existing fontset.\n";
3738 print " h or ? - Shows this help screen.\n";
3739 print " l - Lists available fontsets.\n";
3740 print " m - Sets default fontset.\n";
3741 print " x - Exits fontset editor mode.\n";
3742 }
3743 print "\nCommand [fontsets] (a,d,e,h,?=help,l,m,x)> ";
3744 $input = <STDIN>;
3745 $input =~ s/[\r\n]//g;
3746 }
3747 }
3748
3749 sub command61 {
3750 print "You can now define different LDAP servers.\n";
3751 print "Please ensure proper permissions for config.php when including\n";
3752 print "sensitive passwords.\n\n";
3753 print "[ldap] command (?=help) > ";
3754 $input = <STDIN>;
3755 $input =~ s/[\r\n]//g;
3756 while ( $input ne "d" ) {
3757 if ( $input =~ /^\s*l\s*/i ) {
3758 $count = 0;
3759 while ( $count <= $#ldap_host ) {
3760 print "$count. $ldap_host[$count]\n";
3761 print " base: $ldap_base[$count]\n";
3762 if ( $ldap_charset[$count] ) {
3763 print " charset: $ldap_charset[$count]\n";
3764 }
3765 if ( $ldap_port[$count] ) {
3766 print " port: $ldap_port[$count]\n";
3767 }
3768 if ( $ldap_name[$count] ) {
3769 print " name: $ldap_name[$count]\n";
3770 }
3771 if ( $ldap_maxrows[$count] ) {
3772 print " maxrows: $ldap_maxrows[$count]\n";
3773 }
3774 if ( $ldap_filter[$count] ) {
3775 print " filter: $ldap_filter[$count]\n";
3776 }
3777 if ( $ldap_binddn[$count] ) {
3778 print " binddn: $ldap_binddn[$count]\n";
3779 if ( $ldap_bindpw[$count] ) {
3780 print " bindpw: $ldap_bindpw[$count]\n";
3781 }
3782 }
3783 if ( $ldap_protocol[$count] ) {
3784 print " protocol: $ldap_protocol[$count]\n";
3785 }
3786 if ( $ldap_limit_scope[$count] ) {
3787 print " limit_scope: $ldap_limit_scope[$count]\n";
3788 }
3789 if ( $ldap_listing[$count] ) {
3790 print " listing: $ldap_listing[$count]\n";
3791 }
3792 if ( $ldap_writeable[$count] ) {
3793 print " writeable: $ldap_writeable[$count]\n";
3794 }
3795 if ( $ldap_search_tree[$count] ) {
3796 print " search_tree: $ldap_search_tree[$count]\n";
3797 }
3798 if ( $ldap_starttls[$count] ) {
3799 print " starttls: $ldap_starttls[$count]\n";
3800 }
3801
3802 print "\n";
3803 $count++;
3804 }
3805 } elsif ( $input =~ /^\s*\+/ ) {
3806 $sub = $#ldap_host + 1;
3807
3808 print "First, we need to have the hostname or the IP address where\n";
3809 print "this LDAP server resides. Example: ldap.bigfoot.com\n";
3810 print "\n";
3811 print "You can use any URI compatible with your LDAP library. Please\n";
3812 print "note that StartTLS option is not compatible with ldaps and\n";
3813 print "ldapi URIs.\n";
3814 print "hostname: ";
3815 $name = <STDIN>;
3816 $name =~ s/[\r\n]//g;
3817 $ldap_host[$sub] = $name;
3818
3819 print "\n";
3820
3821 print "Next, we need the server root (base dn). For this, an empty\n";
3822 print "string is allowed.\n";
3823 print "Example: ou=member_directory,o=netcenter.com\n";
3824 print "base: ";
3825 $name = <STDIN>;
3826 $name =~ s/[\r\n]//g;
3827 $ldap_base[$sub] = $name;
3828
3829 print "\n";
3830
3831 print "This is the TCP/IP port number for the LDAP server. Default\n";
3832 print "port is 389. This is optional. Press ENTER for default.\n";
3833 print "port: ";
3834 $name = <STDIN>;
3835 $name =~ s/[\r\n]//g;
3836 $ldap_port[$sub] = $name;
3837
3838 print "\n";
3839
3840 print "This is the charset for the server. Default is utf-8. This\n";
3841 print "is also optional. Press ENTER for default.\n";
3842 print "charset: ";
3843 $name = <STDIN>;
3844 $name =~ s/[\r\n]//g;
3845 $ldap_charset[$sub] = $name;
3846
3847 print "\n";
3848
3849 print "This is the name for the server, used to tag the results of\n";
3850 print "the search. Default it \"LDAP: hostname\". Press ENTER for default\n";
3851 print "name: ";
3852 $name = <STDIN>;
3853 $name =~ s/[\r\n]//g;
3854 $ldap_name[$sub] = $name;
3855
3856 print "\n";
3857
3858 print "You can specify the maximum number of rows in the search result.\n";
3859 print "Default value is equal to 250 rows. Press ENTER for default.\n";
3860 print "maxrows: ";
3861 $name = <STDIN>;
3862 $name =~ s/[\r\n]//g;
3863 $ldap_maxrows[$sub] = $name;
3864
3865
3866 print "\n";
3867
3868 print "If your LDAP server does not like anonymous logins, you can specify bind DN.\n";
3869 print "Default is none, anonymous bind. Press ENTER for default.\n";
3870 print "binddn: ";
3871 $name = <STDIN>;
3872 $name =~ s/[\r\n]//g;
3873 $ldap_binddn[$sub] = $name;
3874
3875 print "\n";
3876
3877 if ( $ldap_binddn[$sub] ne '' ) {
3878
3879 print "Now, please specify password for that DN.\n";
3880 print "bindpw: ";
3881 $name = <STDIN>;
3882 $name =~ s/[\r\n]//g;
3883 $ldap_bindpw[$sub] = $name;
3884
3885 print "\n";
3886 }
3887
3888 print "You can specify bind protocol version here.\n";
3889 print "Default protocol version depends on your php ldap settings.\n";
3890 print "Press ENTER for default.\n";
3891 print "protocol: ";
3892 $name = <STDIN>;
3893 $name =~ s/[\r\n]//g;
3894 $ldap_protocol[$sub] = $name;
3895
3896 print "\n";
3897
3898 print "This configuration section allows to set some rarely used\n";
3899 print "options and options specific to some LDAP implementations.\n";
3900 print "\n";
3901 print "Do you want to set advanced LDAP directory settings? (y/N):";
3902 $ldap_advanced_settings = <STDIN>;
3903 if ( $ldap_advanced_settings =~ /^y\n/i ) {
3904 $ldap_advanced_settings = 'true';
3905 } else {
3906 $ldap_advanced_settings = 'false';
3907 }
3908
3909 if ($ldap_advanced_settings eq 'true') {
3910 print "\n";
3911
3912 print "You can control LDAP directory listing here. This option can\n";
3913 print "be useful if you run small LDAP server and want to provide listing\n";
3914 print "of all addresses stored in LDAP to users of webmail interface.\n";
3915 print "Number of displayed entries is limited by maxrows setting.\n";
3916 print "\n";
3917 print "Don't enable this option for public LDAP directories.\n";
3918 print "\n";
3919 print "Allow listing of LDAP directory? (y/N):";
3920 $name = <STDIN>;
3921 if ( $name =~ /^y\n/i ) {
3922 $name = 'true';
3923 } else {
3924 $name = 'false';
3925 }
3926 $ldap_listing[$sub] = $name;
3927
3928 print "\n";
3929
3930 print "You can control write access to LDAP address book here. This option can\n";
3931 print "be useful if you run small LDAP server and want to provide writable\n";
3932 print "shared address book stored in LDAP to users of webmail interface.\n";
3933 print "\n";
3934 print "Don't enable this option for public LDAP directories.\n";
3935 print "\n";
3936 print "Allow writing to LDAP directory? (y/N):";
3937 $name = <STDIN>;
3938 if ( $name =~ /^y\n/i ) {
3939 $name = 'true';
3940 } else {
3941 $name = 'false';
3942 }
3943 $ldap_writeable[$sub] = $name;
3944
3945 print "\n";
3946
3947 print "You can specify an additional search filter.\n";
3948 print "This could be something like \"(objectclass=posixAccount)\".\n";
3949 print "No filtering is performed by default. Press ENTER for default.\n";
3950 print "filter: ";
3951 $name = <STDIN>;
3952 $name =~ s/[\r|\n]//g;
3953 $ldap_filter[$sub] = $name;
3954
3955 print "\n";
3956
3957 print "You can control search scope here.\n";
3958 print "This option is specific to Microsoft ADS implementation.\n";
3959 print "It requires use of v3 or newer LDAP protocol.\n";
3960 print "Don't enable it, if you use other LDAP server.\n";
3961 print "\n";
3962 print "Limit ldap scope? (y/N):";
3963 $name = <STDIN>;
3964 if ( $name =~ /^y\n/i ) {
3965 $name = 'true';
3966 } else {
3967 $name = 'false';
3968 }
3969 $ldap_limit_scope[$sub] = $name;
3970
3971 print "\n";
3972
3973 print "You can control ldap search type here.\n";
3974 print "Addresses can be searched in entire LDAP subtree (default)\n";
3975 print "or only first level entries are returned.\n";
3976 print "\n";
3977 print "Search entire LDAP subtree? (Y/n):";
3978 $name = <STDIN>;
3979 if ( $name =~ /^n\n/i ) {
3980 $name = 'false';
3981 } else {
3982 $name = 'true';
3983 }
3984 $ldap_search_tree[$sub] = $name;
3985
3986 print "\n";
3987
3988 print "You can control use of StartTLS on LDAP connection here.\n";
3989 print "This option requires use of v3 or newer LDAP protocol and php 4.2+.\n";
3990 print "\n";
3991 print "Use StartTLS? (y/N):";
3992 $name = <STDIN>;
3993 if ( $name =~ /^y\n/i ) {
3994 $name = 'true';
3995 } else {
3996 $name = 'false';
3997 }
3998 $ldap_starttls[$sub] = $name;
3999 }
4000 print "\n";
4001
4002 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
4003 if ( $input =~ /[0-9]+\s*$/ ) {
4004 $rem_num = $input;
4005 $rem_num =~ s/^\s*-\s*//g;
4006 $rem_num =~ s/\s*$//;
4007 } else {
4008 $rem_num = $#ldap_host;
4009 }
4010 $count = 0;
4011 @new_ldap_host = ();
4012 @new_ldap_base = ();
4013 @new_ldap_port = ();
4014 @new_ldap_name = ();
4015 @new_ldap_charset = ();
4016 @new_ldap_maxrows = ();
4017 @new_ldap_filter = ();
4018 @new_ldap_bindpw = ();
4019 @new_ldap_binddn = ();
4020 @new_ldap_protocol = ();
4021 @new_ldap_limit_scope = ();
4022 @new_ldap_listing = ();
4023 @new_ldap_writeable = ();
4024 @new_ldap_search_tree = ();
4025 @new_ldap_starttls = ();
4026
4027 while ( $count <= $#ldap_host ) {
4028 if ( $count != $rem_num ) {
4029 @new_ldap_host = ( @new_ldap_host, $ldap_host[$count] );
4030 @new_ldap_base = ( @new_ldap_base, $ldap_base[$count] );
4031 @new_ldap_port = ( @new_ldap_port, $ldap_port[$count] );
4032 @new_ldap_name = ( @new_ldap_name, $ldap_name[$count] );
4033 @new_ldap_charset = ( @new_ldap_charset, $ldap_charset[$count] );
4034 @new_ldap_maxrows = ( @new_ldap_maxrows, $ldap_maxrows[$count] );
4035 @new_ldap_filter = ( @new_ldap_filter, $ldap_filter[$count] );
4036 @new_ldap_binddn = ( @new_ldap_binddn, $ldap_binddn[$count] );
4037 @new_ldap_bindpw = ( @new_ldap_bindpw, $ldap_bindpw[$count] );
4038 @new_ldap_protocol = ( @new_ldap_protocol, $ldap_protocol[$count] );
4039 @new_ldap_limit_scope = ( @new_ldap_limit_scope, $ldap_limit_scope[$count] );
4040 @new_ldap_listing = ( @new_ldap_listing, $ldap_listing[$count] );
4041 @new_ldap_writeable = ( @new_ldap_writeable, $ldap_writeable[$count] );
4042 @new_ldap_search_tree = ( @new_ldap_search_tree, $ldap_search_tree[$count] );
4043 @new_ldap_starttls = ( @new_ldap_starttls, $ldap_starttls[$count] );
4044 }
4045 $count++;
4046 }
4047 @ldap_host = @new_ldap_host;
4048 @ldap_base = @new_ldap_base;
4049 @ldap_port = @new_ldap_port;
4050 @ldap_name = @new_ldap_name;
4051 @ldap_charset = @new_ldap_charset;
4052 @ldap_maxrows = @new_ldap_maxrows;
4053 @ldap_filter = @new_ldap_filter;
4054 @ldap_binddn = @new_ldap_binddn;
4055 @ldap_bindpw = @new_ldap_bindpw;
4056 @ldap_protocol = @new_ldap_protocol;
4057 @ldap_limit_scope = @new_ldap_limit_scope;
4058 @ldap_listing = @new_ldap_listing;
4059 @ldap_writeable = @new_ldap_writeable;
4060 @ldap_search_tree = @new_ldap_search_tree;
4061 @ldap_starttls = @new_ldap_starttls;
4062
4063 } elsif ( $input =~ /^\s*\?\s*/ ) {
4064 print ".-------------------------.\n";
4065 print "| + (add host) |\n";
4066 print "| - N (remove host) |\n";
4067 print "| l (list hosts) |\n";
4068 print "| d (done) |\n";
4069 print "`-------------------------'\n";
4070 }
4071 print "[ldap] command (?=help) > ";
4072 $input = <STDIN>;
4073 $input =~ s/[\r\n]//g;
4074 }
4075 }
4076
4077 sub command62 {
4078 print "Some of our developers have come up with very good javascript interface\n";
4079 print "for searching through address books, however, our original goals said\n";
4080 print "that we would be 100% HTML. In order to make it possible to use their\n";
4081 print "interface, and yet stick with our goals, we have also written a plain\n";
4082 print "HTML version of the search. Here, you can choose which version to use.\n";
4083 print "\n";
4084 print "This is just the default value. It is also a user option that each\n";
4085 print "user can configure individually\n";
4086 print "\n";
4087
4088 if ( lc($default_use_javascript_addr_book) eq 'true' ) {
4089 $default_value = "y";
4090 } else {
4091 $default_use_javascript_addr_book = 'false';
4092 $default_value = "n";
4093 }
4094 print "Use javascript version by default (y/n) [$WHT$default_value$NRM]: $WHT";
4095 $new_show = <STDIN>;
4096 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4097 $default_use_javascript_addr_book = 'true';
4098 } else {
4099 $default_use_javascript_addr_book = 'false';
4100 }
4101 return $default_use_javascript_addr_book;
4102 }
4103
4104 # global filebased address book
4105 sub command63 {
4106 print "If you want to use global file address book, then you\n";
4107 print "must set this option to a valid value. If option does\n";
4108 print "not have path elements, system assumes that file is\n";
4109 print "stored in data directory. If relative path is set, it is\n";
4110 print "relative to main SquirrelMail directory. If value is empty,\n";
4111 print "address book is not enabled.\n";
4112 print "\n";
4113
4114 print "[$WHT$abook_global_file$NRM]: $WHT";
4115 $new_abook_global_file = <STDIN>;
4116 if ( $new_abook_global_file eq "\n" ) {
4117 $new_abook_global_file = $abook_global_file;
4118 } else {
4119 $new_abook_global_file =~ s/[\r\n]//g;
4120 }
4121 return $new_abook_global_file;
4122 }
4123
4124 # writing into global filebased abook control
4125 sub command64 {
4126 print "This setting controls writing into global file address\n";
4127 print "book options. Address book file must be writeable by\n";
4128 print "webserver's user, if you want to enable this option.\n";
4129 print "\n";
4130
4131 if ( lc($abook_global_file_writeable) eq 'true' ) {
4132 $default_value = "y";
4133 } else {
4134 $abook_global_file_writeable = 'false';
4135 $default_value = "n";
4136 }
4137 print "Allow writing into global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
4138 $new_show = <STDIN>;
4139 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4140 $abook_global_file_writeable = 'true';
4141 } else {
4142 $abook_global_file_writeable = 'false';
4143 }
4144 return $abook_global_file_writeable;
4145 }
4146
4147 # listing of global filebased abook control
4148 sub command65 {
4149 print "This setting controls listing of global file address\n";
4150 print "book in addresses page.\n";
4151 print "\n";
4152
4153 if ( lc($abook_global_file_listing) eq 'true' ) {
4154 $default_value = "y";
4155 } else {
4156 $abook_global_file_listing = 'false';
4157 $default_value = "n";
4158 }
4159 print "Allow listing of global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
4160 $new_show = <STDIN>;
4161 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4162 $abook_global_file_listing = 'true';
4163 } else {
4164 $abook_global_file_listing = 'false';
4165 }
4166 return $abook_global_file_listing;
4167 }
4168
4169 # controls $abook_file_line_length setting
4170 sub command_abook_file_line_length {
4171 print "This setting controls space allocated to file based address book records.\n";
4172 print "End users will be unable to save address book entry, if total entry size \n";
4173 print "(quoted address book fields + 4 delimiters + linefeed) exceeds allowed \n";
4174 print "address book length size.\n";
4175 print "\n";
4176 print "Same setting is applied to personal and global file based address books.\n";
4177 print "\n";
4178 print "It is strongly recommended to keep default setting value. Change it only\n";
4179 print "if you really want to store address book entries that are bigger than two\n";
4180 print "kilobytes (2048).\n";
4181 print "\n";
4182
4183 print "Enter allowed address book line length [$abook_file_line_length]: ";
4184 my $tmp = <STDIN>;
4185 $tmp = trim($tmp);
4186 # value is not modified, if user hits Enter or enters space
4187 if ($tmp ne '') {
4188 # make sure that input is numeric
4189 if ($tmp =~ /^\d+$/) {
4190 $abook_file_line_length = $tmp;
4191 } else {
4192 print "If you want to change this setting, you must enter number.\n";
4193 print "If you want to keep original setting - enter space.\n\n";
4194 print "Press Enter to continue...";
4195 $tmp = <STDIN>;
4196 }
4197 }
4198 }
4199
4200 sub command91 {
4201 print "If you want to store your users address book details in a database then\n";
4202 print "you need to set this DSN to a valid value. The format for this is:\n";
4203 print "mysql://user:pass\@hostname/dbname\n";
4204 print "Where mysql can be one of the databases PHP supports, the most common\n";
4205 print "of these are mysql, msql and pgsql.\n";
4206 print "Please ensure proper permissions for config.php when including\n";
4207 print "sensitive passwords.\n\n";
4208 print "If the DSN is left empty (hit space and then return) the database\n";
4209 print "related code for address books will not be used.\n";
4210 print "\n";
4211
4212 if ( $addrbook_dsn eq "" ) {
4213 $default_value = "Disabled";
4214 } else {
4215 $default_value = $addrbook_dsn;
4216 }
4217 print "[$WHT$addrbook_dsn$NRM]: $WHT";
4218 $new_dsn = <STDIN>;
4219 if ( $new_dsn eq "\n" ) {
4220 $new_dsn = $addrbook_dsn;
4221 } else {
4222 $new_dsn =~ s/[\r\n]//g;
4223 $new_dsn =~ s/^\s+$//g;
4224 }
4225 return $new_dsn;
4226 }
4227
4228 sub command92 {
4229 print "This is the name of the table you want to store the address book\n";
4230 print "data in, it defaults to 'address'\n";
4231 print "\n";
4232 print "[$WHT$addrbook_table$NRM]: $WHT";
4233 $new_table = <STDIN>;
4234 if ( $new_table eq "\n" ) {
4235 $new_table = $addrbook_table;
4236 } else {
4237 $new_table =~ s/[\r\n]//g;
4238 }
4239 return $new_table;
4240 }
4241
4242 sub command93 {
4243 print "If you want to store your users preferences in a database then\n";
4244 print "you need to set this DSN to a valid value. The format for this is:\n";
4245 print "mysql://user:pass\@hostname/dbname\n";
4246 print "Where mysql can be one of the databases PHP supports, the most common\n";
4247 print "of these are mysql, msql and pgsql.\n";
4248 print "Please ensure proper permissions for config.php when including\n";
4249 print "sensitive passwords.\n\n";
4250 print "If the DSN is left empty (hit space and then return) the database\n";
4251 print "related code for address books will not be used.\n";
4252 print "\n";
4253
4254 if ( $prefs_dsn eq "" ) {
4255 $default_value = "Disabled";
4256 } else {
4257 $default_value = $prefs_dsn;
4258 }
4259 print "[$WHT$prefs_dsn$NRM]: $WHT";
4260 $new_dsn = <STDIN>;
4261 if ( $new_dsn eq "\n" ) {
4262 $new_dsn = $prefs_dsn;
4263 } else {
4264 $new_dsn =~ s/[\r\n]//g;
4265 $new_dsn =~ s/^\s+$//g;
4266 }
4267 return $new_dsn;
4268 }
4269
4270 sub command94 {
4271 print "This is the name of the table you want to store the preferences\n";
4272 print "data in, it defaults to 'userprefs'\n";
4273 print "\n";
4274 print "[$WHT$prefs_table$NRM]: $WHT";
4275 $new_table = <STDIN>;
4276 if ( $new_table eq "\n" ) {
4277 $new_table = $prefs_table;
4278 } else {
4279 $new_table =~ s/[\r\n]//g;
4280 }
4281 return $new_table;
4282 }
4283
4284 sub command95 {
4285 print "This is the name of the field in which you want to store the\n";
4286 print "username of the person the prefs are for. It defaults to 'user'\n";
4287 print "\n";
4288 print "[$WHT$prefs_user_field$NRM]: $WHT";
4289 $new_field = <STDIN>;
4290 if ( $new_field eq "\n" ) {
4291 $new_field = $prefs_user_field;
4292 } else {
4293 $new_field =~ s/[\r\n]//g;
4294 }
4295 $prefs_user_size = db_pref_size($prefs_user_size);
4296 return $new_field;
4297 }
4298
4299 sub command96 {
4300 print "This is the name of the field in which you want to store the\n";
4301 print "preferences keyword. It defaults to 'prefkey'\n";
4302 print "\n";
4303 print "[$WHT$prefs_key_field$NRM]: $WHT";
4304 $new_field = <STDIN>;
4305 if ( $new_field eq "\n" ) {
4306 $new_field = $prefs_key_field;
4307 } else {
4308 $new_field =~ s/[\r\n]//g;
4309 }
4310 $prefs_key_size = db_pref_size($prefs_key_size);
4311 return $new_field;
4312 }
4313
4314 sub command97 {
4315 print "This is the name of the field in which you want to store the\n";
4316 print "preferences value. It defaults to 'prefval'\n";
4317 print "\n";
4318 print "[$WHT$prefs_val_field$NRM]: $WHT";
4319 $new_field = <STDIN>;
4320 if ( $new_field eq "\n" ) {
4321 $new_field = $prefs_val_field;
4322 } else {
4323 $new_field =~ s/[\r\n]//g;
4324 }
4325 $prefs_val_size = db_pref_size($prefs_val_size);
4326 return $new_field;
4327 }
4328
4329 # routine is used to set database field limits
4330 # it needs one argument
4331 sub db_pref_size() {
4332 my ($size) = $_[0];
4333 print "\nDatabase fields have size limits.\n";
4334 print "\n";
4335 print "What limit is set for this field? [$WHT$size$NRM]: $WHT";
4336 $new_size = <STDIN>;
4337 if ( $new_size eq "\n" ) {
4338 $new_size = $size;
4339 } else {
4340 $new_size =~ s/[\r\n]//g;
4341 }
4342 return $new_size;
4343 }
4344
4345 sub command98 {
4346 print "If you want to store your global address book in a database then\n";
4347 print "you need to set this DSN to a valid value. The format for this is:\n";
4348 print "mysql://user:pass\@hostname/dbname\n";
4349 print "Where mysql can be one of the databases PHP supports, the most common\n";
4350 print "of these are mysql, msql and pgsql.\n";
4351 print "Please ensure proper permissions for config.php when including\n";
4352 print "sensitive passwords.\n\n";
4353 print "If the DSN is left empty (hit space and then return) the database\n";
4354 print "related code for global SQL address book will not be used.\n";
4355 print "\n";
4356
4357 if ( $addrbook_global_dsn eq "" ) {
4358 $default_value = "Disabled";
4359 } else {
4360 $default_value = $addrbook_global_dsn;
4361 }
4362 print "[$WHT$addrbook_global_dsn$NRM]: $WHT";
4363 $new_dsn = <STDIN>;
4364 if ( $new_dsn eq "\n" ) {
4365 $new_dsn = $addrbook_global_dsn;
4366 } else {
4367 $new_dsn =~ s/[\r\n]//g;
4368 $new_dsn =~ s/^\s+$//g;
4369 }
4370 return $new_dsn;
4371 }
4372
4373 sub command99 {
4374 print "This is the name of the table you want to store the global address book\n";
4375 print "data in. Default table name is 'global_abook'. Address book uses same\n";
4376 print "database format as personal address book.\n";
4377 print "\n";
4378 print "[$WHT$addrbook_global_table$NRM]: $WHT";
4379 $new_table = <STDIN>;
4380 if ( $new_table eq "\n" ) {
4381 $new_table = $addrbook_global_table;
4382 } else {
4383 $new_table =~ s/[\r\n]//g;
4384 }
4385 return $new_table;
4386 }
4387
4388 sub command910 {
4389 print "This option controls users\' ability to add or modify records stored \n";
4390 print "in global address book\n";
4391
4392 if ( lc($addrbook_global_writeable) eq 'true' ) {
4393 $default_value = "y";
4394 } else {
4395 $default_value = "n";
4396 }
4397 print "Allow writing into global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
4398 $addrbook_global_writeable = <STDIN>;
4399 if ( ( $addrbook_global_writeable =~ /^y\n/i ) || ( ( $addrbook_global_writeable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4400 $addrbook_global_writeable = 'true';
4401 } else {
4402 $addrbook_global_writeable = 'false';
4403 }
4404 return $addrbook_global_writeable;
4405 }
4406
4407 sub command911 {
4408 print "Enable this option if you want to see listing of addresses stored \n";
4409 print "in global address book\n";
4410
4411 if ( lc($addrbook_global_listing) eq 'true' ) {
4412 $default_value = "y";
4413 } else {
4414 $default_value = "n";
4415 }
4416 print "Allow listing of global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
4417 $addrbook_global_listing = <STDIN>;
4418 if ( ( $addrbook_global_listing =~ /^y\n/i ) || ( ( $addrbook_global_listing =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4419 $addrbook_global_listing = 'true';
4420 } else {
4421 $addrbook_global_listing = 'false';
4422 }
4423 return $addrbook_global_listing;
4424 }
4425
4426
4427 # Default language
4428 sub commandA1 {
4429 print "SquirrelMail attempts to set the language in many ways. If it\n";
4430 print "can not figure it out in another way, it will default to this\n";
4431 print "language. Please use the code for the desired language.\n";
4432 print "\n";
4433 print "[$WHT$squirrelmail_default_language$NRM]: $WHT";
4434 $new_squirrelmail_default_language = <STDIN>;
4435 if ( $new_squirrelmail_default_language eq "\n" ) {
4436 $new_squirrelmail_default_language = $squirrelmail_default_language;
4437 } else {
4438 $new_squirrelmail_default_language =~ s/[\r\n]//g;
4439 $new_squirrelmail_default_language =~ s/^\s+$//g;
4440 }
4441 return $new_squirrelmail_default_language;
4442 }
4443 # Default Charset
4444 sub commandA2 {
4445 print "This option controls what character set is used when sending\n";
4446 print "mail and when sending HTML to the browser. Option works only\n";
4447 print "with US English (en_US) translation. Other translations use\n";
4448 print "charsets that are set in translation settings.\n";
4449 print "\n";
4450
4451 print "[$WHT$default_charset$NRM]: $WHT";
4452 $new_default_charset = <STDIN>;
4453 if ( $new_default_charset eq "\n" ) {
4454 $new_default_charset = $default_charset;
4455 } else {
4456 $new_default_charset =~ s/[\r\n]//g;
4457 }
4458 return $new_default_charset;
4459 }
4460 # Alternative language names
4461 sub commandA3 {
4462 print "Enable this option if you want to see localized language names in\n";
4463 print "language selection box. Note, that this option can trigger\n";
4464 print "installation of foreign language support modules in some browsers.\n";
4465 print "\n";
4466
4467 if ( lc($show_alternative_names) eq 'true' ) {
4468 $default_value = "y";
4469 } else {
4470 $default_value = "n";
4471 }
4472 print "Show alternative language names? (y/n) [$WHT$default_value$NRM]: $WHT";
4473 $show_alternative_names = <STDIN>;
4474 if ( ( $show_alternative_names =~ /^y\n/i ) || ( ( $show_alternative_names =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4475 $show_alternative_names = 'true';
4476 } else {
4477 $show_alternative_names = 'false';
4478 }
4479 return $show_alternative_names;
4480 }
4481
4482 # Aggressive decoding
4483 sub commandA4 {
4484 print "Enable this option if you want to use CPU and memory intensive decoding\n";
4485 print "functions. This option allows reading multibyte charset, that are used\n";
4486 print "in Eastern Asia. SquirrelMail will try to use recode functions here,\n";
4487 print "even when you have disabled use of recode in Tweaks section.\n";
4488 print "\n";
4489
4490 if ( lc($aggressive_decoding) eq 'true' ) {
4491 $default_value = "y";
4492 } else {
4493 $default_value = "n";
4494 }
4495 print "Enable aggressive decoding? (y/n) [$WHT$default_value$NRM]: $WHT";
4496 $aggressive_decoding = <STDIN>;
4497 if ( ( $aggressive_decoding =~ /^y\n/i ) || ( ( $aggressive_decoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4498 $aggressive_decoding = 'true';
4499 } else {
4500 $aggressive_decoding = 'false';
4501 }
4502 return $aggressive_decoding;
4503 }
4504
4505 # Lossy encoding
4506 sub commandA5 {
4507 print "Enable this option if you want to allow lossy charset encoding in message\n";
4508 print "composition pages. This option allows charset conversions when output\n";
4509 print "charset does not support all symbols used in original charset. Symbols\n";
4510 print "unsupported by output charset will be replaced with question marks.\n";
4511 print "\n";
4512
4513 if ( lc($lossy_encoding) eq 'true' ) {
4514 $default_value = "y";
4515 } else {
4516 $default_value = "n";
4517 }
4518 print "Enable lossy encoding? (y/n) [$WHT$default_value$NRM]: $WHT";
4519 $lossy_encoding = <STDIN>;
4520 if ( ( $lossy_encoding =~ /^y\n/i ) || ( ( $lossy_encoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4521 $lossy_encoding = 'true';
4522 } else {
4523 $lossy_encoding = 'false';
4524 }
4525 return $lossy_encoding;
4526 }
4527
4528 # display html emails in iframe
4529 sub commandB2 {
4530 print "This option can enable html email rendering inside iframe.\n";
4531 print "Inline frames are used in order to provide sandbox environment";
4532 print "for html code included in html formated emails.";
4533 print "Option is experimental and might have glitches in some parts of code.";
4534 print "\n";
4535
4536 if ( lc($use_iframe) eq 'true' ) {
4537 $default_value = "y";
4538 } else {
4539 $default_value = "n";
4540 }
4541 print "Display html emails in iframe? (y/n) [$WHT$default_value$NRM]: $WHT";
4542 $use_iframe = <STDIN>;
4543 if ( ( $use_iframe =~ /^y\n/i ) || ( ( $use_iframe =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4544 $use_iframe = 'true';
4545 } else {
4546 $use_iframe = 'false';
4547 }
4548 return $use_iframe;
4549 }
4550
4551 # ask user info
4552 sub command_ask_user_info {
4553 print "New users need to supply their real name and email address to\n";
4554 print "send out proper mails. When this option is enabled, a user that\n";
4555 print "logs in for the first time will be redirected to the Personal\n";
4556 print "Options screen and asked to supply their personal data.\n";
4557 print "\n";
4558
4559 if ( lc($ask_user_info) eq 'true' ) {
4560 $default_value = "y";
4561 } else {
4562 $default_value = "n";
4563 }
4564 print "Ask user info? (y/n) [$WHT$default_value$NRM]: $WHT";
4565 $ask_user_info = <STDIN>;
4566 if ( ( $ask_user_info =~ /^y\n/i ) || ( ( $ask_user_info =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4567 $ask_user_info = 'true';
4568 } else {
4569 $ask_user_info = 'false';
4570 }
4571 return $ask_user_info;
4572 }
4573
4574 # use icons
4575 sub commandB3 {
4576 print "Enabling this option will cause icons to be used instead of text\n";
4577 print "markers next to each message in mailbox lists that represent\n";
4578 print "new, read, flagged, and deleted messages, as well as those that\n";
4579 print "have been replied to and forwarded. Icons are also used next to\n";
4580 print "(un)expanded folders in the folder list (Oldway = false). These\n";
4581 print "icons are quite small, but will obviously be more of a resource\n";
4582 print "drain than text markers.\n";
4583 print "\n";
4584
4585 if ( lc($use_icons) eq 'true' ) {
4586 $default_value = "y";
4587 } else {
4588 $default_value = "n";
4589 }
4590 print "Use icons? (y/n) [$WHT$default_value$NRM]: $WHT";
4591 $use_icons = <STDIN>;
4592 if ( ( $use_icons =~ /^y\n/i ) || ( ( $use_icons =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4593 $use_icons = 'true';
4594 } else {
4595 $use_icons = 'false';
4596 }
4597 return $use_icons;
4598 }
4599 # php recode
4600 sub commandB4 {
4601 print "Enable this option if you want to use php recode functions to read\n";
4602 print "emails written in charset that differs from the one that is set in\n";
4603 print "translation selected by user. Code is experimental, it might cause\n";
4604 print "errors, if email contains charset unsupported by recode or if your\n";
4605 print "php does not have recode support.\n";
4606 print "\n";
4607
4608 if ( lc($use_php_recode) eq 'true' ) {
4609 $default_value = "y";
4610 } else {
4611 $default_value = "n";
4612 }
4613 print "Use php recode functions? (y/n) [$WHT$default_value$NRM]: $WHT";
4614 $use_php_recode = <STDIN>;
4615 if ( ( $use_php_recode =~ /^y\n/i ) || ( ( $use_php_recode =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4616 $use_php_recode = 'true';
4617 } else {
4618 $use_php_recode = 'false';
4619 }
4620 return $use_php_recode;
4621 }
4622 # php iconv
4623 sub commandB5 {
4624 print "Enable this option if you want to use php iconv functions to read\n";
4625 print "emails written in charset that differs from the one that is set in\n";
4626 print "translation selected by user. Code is experimental, it works only\n";
4627 print "with translations that use utf-8 charset. Code might cause errors,\n";
4628 print "if email contains charset unsupported by iconv or if your php does\n";
4629 print "not have iconv support.\n";
4630 print "\n";
4631
4632 if ( lc($use_php_iconv) eq 'true' ) {
4633 $default_value = "y";
4634 } else {
4635 $default_value = "n";
4636 }
4637 print "Use php iconv functions? (y/n) [$WHT$default_value$NRM]: $WHT";
4638 $use_php_iconv = <STDIN>;
4639 if ( ( $use_php_iconv =~ /^y\n/i ) || ( ( $use_php_iconv =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4640 $use_php_iconv = 'true';
4641 } else {
4642 $use_php_iconv = 'false';
4643 }
4644 return $use_php_iconv;
4645 }
4646
4647 # buffer output
4648 sub commandB6 {
4649 print "In some cases, buffering all output (holding it on the server until\n";
4650 print "the full page is ready to send to the browser) allows more complex\n";
4651 print "functionality, especially for plugins that want to add headers on hooks\n";
4652 print "that are beyond the point of output having been sent to the browser\n";
4653 print "otherwise. Most plugins that need this functionality will enable it\n";
4654 print "automatically on their own, but you can turn it on manually here. You'd\n";
4655 print "usually want to do this if you want to specify a custom output handler\n";
4656 print "for parsing the output - you can do that by specifying a value for\n";
4657 print "\$buffered_output_handler in config_local.php. Don't forget to define\n";
4658 print "a function of the same name as what \$buffered_output_handler is set to.\n";
4659 print "\n";
4660
4661 if ( lc($buffer_output) eq 'true' ) {
4662 $default_value = "y";
4663 } else {
4664 $default_value = "n";
4665 }
4666 print "Buffer all output? (y/n) [$WHT$default_value$NRM]: $WHT";
4667 $buffer_output = <STDIN>;
4668 if ( ( $buffer_output =~ /^y\n/i ) || ( ( $buffer_output =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4669 $buffer_output = 'true';
4670 } else {
4671 $buffer_output = 'false';
4672 }
4673 return $buffer_output;
4674 }
4675
4676 # configtest block
4677 sub commandB7 {
4678 print "Enable this option if you want to check SquirrelMail configuration\n";
4679 print "remotely with configtest.php script.\n";
4680 print "\n";
4681
4682 if ( lc($allow_remote_configtest) eq 'true' ) {
4683 $default_value = "y";
4684 } else {
4685 $default_value = "n";
4686 }
4687 print "Allow remote configuration tests? (y/n) [$WHT$default_value$NRM]: $WHT";
4688 $allow_remote_configtest = <STDIN>;
4689 if ( ( $allow_remote_configtest =~ /^y\n/i ) || ( ( $allow_remote_configtest =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4690 $allow_remote_configtest = 'true';
4691 } else {
4692 $allow_remote_configtest = 'false';
4693 }
4694 return $allow_remote_configtest;
4695 }
4696
4697 # Default Icon theme
4698 sub command53 {
4699 print "You may change the path to the default icon theme to be used, if icons\n";
4700 print "have been enabled. This theme will be used when an icon cannot be\n";
4701 print "found in the current theme, or when no icon theme is specified. If\n";
4702 print "left blank, and icons are enabled, the default theme will be used\n";
4703 print "from images/themes/default/.\n";
4704 print "\n";
4705 print "To clear out an existing value, just type a space for the input.\n";
4706 print "\n";
4707 print "Please be aware of the following: \n";
4708 print " - Relative URLs are relative to the config dir\n";
4709 print " to use the icon themes directory, use ../images/themes/newtheme/\n";
4710 print " - The icon theme may be outside the SquirrelMail directory, but\n";
4711 print " it must be web accessible.\n";
4712 print "[$WHT$icon_theme_def$NRM]: $WHT";
4713 $new_icon_theme_def = <STDIN>;
4714
4715 if ( $new_icon_theme_def eq "\n" ) {
4716 $new_icon_theme_def = $icon_theme_def;
4717 } else {
4718 $new_icon_theme_def =~ s/[\r\n]//g;
4719 }
4720 $new_icon_theme_def =~ s/^\s*//;
4721 return $new_icon_theme_def;
4722 }
4723
4724 # SquirrelMail debug mode (since 1.5.2)
4725 sub commandB8 {
4726 print "When debugging or developing SquirrelMail, you may want to increase\n";
4727 print "the verbosity of certain kinds of errors, notices, and/or diagnostics.\n";
4728 print "You may enable one or more of the debugging modes here. Please make\n";
4729 print "sure that you have turned off debugging if you are using SquirrelMail\n";
4730 print "in a production environment.\n\n";
4731
4732 $input = "";
4733 while ( $input ne "d\n" ) {
4734 $sm_debug_mode = convert_debug_constants_to_binary_integer($sm_debug_mode);
4735
4736 # per include/constants.php, here are the debug mode values:
4737 #
4738 # 0 SM_DEBUG_MODE_OFF
4739 # 1 SM_DEBUG_MODE_SIMPLE
4740 # 512 SM_DEBUG_MODE_MODERATE
4741 # 524288 SM_DEBUG_MODE_ADVANCED
4742 # 536870912 SM_DEBUG_MODE_STRICT
4743 #
4744 print "\n# Enabled? Description\n";
4745 print "---------------------------------------------------------------------\n";
4746 print "0 " . ($sm_debug_mode == 0 ? "y" : " ")
4747 . " No debugging (recommended in production environments)\n";
4748 print "1 " . ($sm_debug_mode & 1 ? "y" : " ")
4749 . " Simple debugging (PHP E_ERROR)\n";
4750 print "2 " . ($sm_debug_mode & 512 ? "y" : " ")
4751 . " Moderate debugging (PHP E_ALL without E_STRICT)\n";
4752 print "3 " . ($sm_debug_mode & 524288 ? "y" : " ")
4753 . " Advanced debugging (PHP E_ALL (without E_STRICT) plus\n";
4754 print " log errors intentionally suppressed)\n";
4755 print "4 " . ($sm_debug_mode & 536870912 ? "y" : " ")
4756 . " Strict debugging (PHP E_ALL and E_STRICT)\n";
4757 print "\n";
4758
4759 print "SquirrelMail debug mode (0,1,2,3,4) or d when done? : $WHT";
4760 $input = <STDIN>;
4761 if ( $input eq "d\n" ) {
4762 # nothing
4763 } elsif ($input !~ /^[0-9]+\n$/) {
4764 print "\nInvalid configuration value.\n";
4765 print "\nPress enter to continue...";
4766 $tmp = <STDIN>;
4767 } elsif ( $input == "0\n" ) {
4768 $sm_debug_mode = 0;
4769 } elsif ( $input == "1\n" ) {
4770 if ($sm_debug_mode & 1) {
4771 $sm_debug_mode ^= 1;
4772 } else {
4773 $sm_debug_mode |= 1;
4774 }
4775 } elsif ( $input == "2\n" ) {
4776 if ($sm_debug_mode & 512) {
4777 $sm_debug_mode ^= 512;
4778 } else {
4779 $sm_debug_mode |= 512;
4780 }
4781 } elsif ( $input == "3\n" ) {
4782 if ($sm_debug_mode & 524288) {
4783 $sm_debug_mode ^= 524288;
4784 } else {
4785 $sm_debug_mode |= 524288;
4786 }
4787 } elsif ( $input == "4\n" ) {
4788 if ($sm_debug_mode & 536870912) {
4789 $sm_debug_mode ^= 536870912;
4790 } else {
4791 $sm_debug_mode |= 536870912;
4792 }
4793 } else {
4794 print "\nInvalid configuration value.\n";
4795 print "\nPress enter to continue...";
4796 $tmp = <STDIN>;
4797 }
4798 print "\n";
4799 }
4800 $sm_debug_mode = convert_debug_binary_integer_to_constants($sm_debug_mode);
4801 return $sm_debug_mode;
4802 }
4803
4804 # Secured configuration mode (since 1.5.2)
4805 sub commandB9 {
4806 print "This option allows you to enable \"Secured Configuration\" mode,\n";
4807 print "which will guarantee that certain settings made herein will be\n";
4808 print "made immutable and will not be subject to override by either friendly\n";
4809 print "or unfriendly code/plugins. Only a small number of settings herein\n";
4810 print "will be used in this manner - just those that are deemed to be a\n";
4811 print "potential security threat when rouge plugin or other code may be\n";
4812 print "executed inside SquirrelMail.\n";
4813 print "\n";
4814
4815 if ( lc($secured_config) eq 'true' ) {
4816 $default_value = "y";
4817 } else {
4818 $default_value = "n";
4819 }
4820 print "Enable secured configuration mode? (y/n) [$WHT$default_value$NRM]: $WHT";
4821 $secured_config = <STDIN>;
4822 if ( ( $secured_config =~ /^y\n/i ) || ( ( $secured_config =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4823 $secured_config = 'true';
4824 } else {
4825 $secured_config = 'false';
4826 }
4827 return $secured_config;
4828 }
4829
4830 # Set a (non-standard) HTTPS port
4831 sub commandB10 {
4832 print "If you run HTTPS (SSL-secured HTTP) on a non-standard port, you should\n";
4833 print "indicate that port here. Even if you do not, SquirrelMail may still\n";
4834 print "auto-detect secure connections, but it is safer and also very useful\n";
4835 print "for third party plugins if you specify the port number here.\n";
4836 print "\n";
4837 print "Most SquirrelMail administrators will not need to use this setting\n";
4838 print "because most all web servers use port 443 for HTTPS connections, and\n";
4839 print "SquirrelMail assumes 443 unless something else is given here.\n";
4840 print "\n";
4841
4842 print "Enter your HTTPS port [$sq_https_port]: ";
4843 my $tmp = <STDIN>;
4844 $tmp = trim($tmp);
4845 # value is not modified, if user hits Enter or enters space
4846 if ($tmp ne '') {
4847 # make sure that input is numeric
4848 if ($tmp =~ /^\d+$/) {
4849 $sq_https_port = $tmp;
4850 } else {
4851 print "\n";
4852 print "--- INPUT ERROR ---\n";
4853 print "\n";
4854 print "If you want to change this setting, you must enter a number.\n";
4855 print "If you want to keep the original value, just press Enter.\n\n";
4856 print "Press Enter to continue...";
4857 $tmp = <STDIN>;
4858 }
4859 }
4860 return $sq_https_port;
4861 }
4862
4863 # Ignore HTTP_X_FORWARDED_* headers?
4864 sub commandB11 {
4865
4866 if ( lc($sq_ignore_http_x_forwarded_headers) eq 'true' ) {
4867 $default_value = "y";
4868 } else {
4869 $default_value = "n";
4870 }
4871
4872 print "Because HTTP_X_FORWARDED_* headers can be sent by the client and\n";
4873 print "therefore possibly exploited by an outsider, SquirrelMail ignores\n";
4874 print "them by default. If a proxy server or other machine sits between\n";
4875 print "clients and your SquirrelMail server, you can turn this off to\n";
4876 print "tell SquirrelMail to use such headers.\n";
4877 print "\n";
4878
4879 print "Ignore HTTP_X_FORWARDED headers? (y/n) [$WHT$default_value$NRM]: $WHT";
4880 $sq_ignore_http_x_forwarded_headers = <STDIN>;
4881 if ( ( $sq_ignore_http_x_forwarded_headers =~ /^y\n/i ) || ( ( $sq_ignore_http_x_forwarded_headers =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
4882 $sq_ignore_http_x_forwarded_headers = 'true';
4883 } else {
4884 $sq_ignore_http_x_forwarded_headers = 'false';
4885 }
4886 return $sq_ignore_http_x_forwarded_headers;
4887 }
4888
4889 sub save_data {
4890 $tab = " ";
4891 if ( open( CF, ">config.php" ) ) {
4892 print CF "<?php\n";
4893 print CF "\n";
4894
4895 print CF "/**\n";
4896 print CF " * SquirrelMail Configuration File\n";
4897 print CF " * Created using the configure script, conf.pl\n";
4898 print CF " */\n";
4899 print CF "\n";
4900
4901 if ($print_config_version) {
4902 print CF "\$config_version = '$print_config_version';\n";
4903 }
4904 # integer
4905 print CF "\$config_use_color = $config_use_color;\n";
4906 print CF "\n";
4907
4908 # string
4909 print CF "\$org_name = \"$org_name\";\n";
4910 # string
4911 print CF "\$org_logo = " . &change_to_SM_path($org_logo) . ";\n";
4912 $org_logo_width |= 0;
4913 $org_logo_height |= 0;
4914 # string
4915 print CF "\$org_logo_width = '$org_logo_width';\n";
4916 # string
4917 print CF "\$org_logo_height = '$org_logo_height';\n";
4918 # string that can contain variables.
4919 print CF "\$org_title = \"$org_title\";\n";
4920 # string
4921 print CF "\$signout_page = " . &change_to_SM_path($signout_page) . ";\n";
4922 # string
4923 print CF "\$frame_top = '$frame_top';\n";
4924 print CF "\n";
4925
4926 print CF "\$provider_uri = '$provider_uri';\n";
4927 print CF "\n";
4928
4929 print CF "\$provider_name = '$provider_name';\n";
4930 print CF "\n";
4931
4932 # string that can contain variables
4933 print CF "\$motd = \"$motd\";\n";
4934 print CF "\n";
4935
4936 # string
4937 print CF "\$squirrelmail_default_language = '$squirrelmail_default_language';\n";
4938 # string
4939 print CF "\$default_charset = '$default_charset';\n";
4940 # boolean
4941 print CF "\$show_alternative_names = $show_alternative_names;\n";
4942 # boolean
4943 print CF "\$aggressive_decoding = $aggressive_decoding;\n";
4944 # boolean
4945 print CF "\$lossy_encoding = $lossy_encoding;\n";
4946 print CF "\n";
4947
4948 # string
4949 print CF "\$domain = '$domain';\n";
4950 # string
4951 print CF "\$imapServerAddress = '$imapServerAddress';\n";
4952 # integer
4953 print CF "\$imapPort = $imapPort;\n";
4954 # boolean
4955 print CF "\$useSendmail = $useSendmail;\n";
4956 # string
4957 print CF "\$smtpServerAddress = '$smtpServerAddress';\n";
4958 # integer
4959 print CF "\$smtpPort = $smtpPort;\n";
4960 # string
4961 print CF "\$sendmail_path = '$sendmail_path';\n";
4962 # string
4963 print CF "\$sendmail_args = '$sendmail_args';\n";
4964 # boolean
4965 # print CF "\$use_authenticated_smtp = $use_authenticated_smtp;\n";
4966 # boolean
4967 print CF "\$pop_before_smtp = $pop_before_smtp;\n";
4968 # string
4969 print CF "\$pop_before_smtp_host = '$pop_before_smtp_host';\n";
4970 # string
4971 print CF "\$imap_server_type = '$imap_server_type';\n";
4972 # boolean
4973 print CF "\$invert_time = $invert_time;\n";
4974 # string
4975 print CF "\$optional_delimiter = '$optional_delimiter';\n";
4976 # string
4977 print CF "\$encode_header_key = '$encode_header_key';\n";
4978 print CF "\n";
4979
4980 # string
4981 print CF "\$default_folder_prefix = '$default_folder_prefix';\n";
4982 # string
4983 print CF "\$trash_folder = '$trash_folder';\n";
4984 # string
4985 print CF "\$sent_folder = '$sent_folder';\n";
4986 # string
4987 print CF "\$draft_folder = '$draft_folder';\n";
4988 # boolean
4989 print CF "\$default_move_to_trash = $default_move_to_trash;\n";
4990 # boolean
4991 print CF "\$default_move_to_sent = $default_move_to_sent;\n";
4992 # boolean
4993 print CF "\$default_save_as_draft = $default_save_as_draft;\n";
4994 # boolean
4995 print CF "\$show_prefix_option = $show_prefix_option;\n";
4996 # boolean
4997 print CF "\$list_special_folders_first = $list_special_folders_first;\n";
4998 # boolean
4999 print CF "\$use_special_folder_color = $use_special_folder_color;\n";
5000 # boolean
5001 print CF "\$auto_expunge = $auto_expunge;\n";
5002 # boolean
5003 print CF "\$default_sub_of_inbox = $default_sub_of_inbox;\n";
5004 # boolean
5005 print CF "\$show_contain_subfolders_option = $show_contain_subfolders_option;\n";
5006 # integer
5007 print CF "\$default_unseen_notify = $default_unseen_notify;\n";
5008 # integer
5009 print CF "\$default_unseen_type = $default_unseen_type;\n";
5010 # boolean
5011 print CF "\$auto_create_special = $auto_create_special;\n";
5012 # boolean
5013 print CF "\$delete_folder = $delete_folder;\n";
5014 # boolean
5015 print CF "\$noselect_fix_enable = $noselect_fix_enable;\n";
5016
5017 print CF "\n";
5018
5019 # string
5020 print CF "\$data_dir = " . &change_to_SM_path($data_dir) . ";\n";
5021 # string that can contain a variable
5022 print CF "\$attachment_dir = " . &change_to_SM_path($attachment_dir) . ";\n";
5023 # integer
5024 print CF "\$dir_hash_level = $dir_hash_level;\n";
5025 # string
5026 print CF "\$default_left_size = '$default_left_size';\n";
5027 # boolean
5028 print CF "\$force_username_lowercase = $force_username_lowercase;\n";
5029 # boolean
5030 print CF "\$default_use_priority = $default_use_priority;\n";
5031 # boolean
5032 print CF "\$hide_sm_attributions = $hide_sm_attributions;\n";
5033 # boolean
5034 print CF "\$default_use_mdn = $default_use_mdn;\n";
5035 # boolean
5036 print CF "\$edit_identity = $edit_identity;\n";
5037 # boolean
5038 print CF "\$edit_name = $edit_name;\n";
5039 # boolean
5040 print CF "\$edit_reply_to = $edit_reply_to;\n";
5041 # boolean
5042 print CF "\$hide_auth_header = $hide_auth_header;\n";
5043 # boolean
5044 print CF "\$disable_thread_sort = $disable_thread_sort;\n";
5045 # boolean
5046 print CF "\$disable_server_sort = $disable_server_sort;\n";
5047 # boolean
5048 print CF "\$allow_charset_search = $allow_charset_search;\n";
5049 # integer
5050 print CF "\$allow_advanced_search = $allow_advanced_search;\n";
5051 print CF "\n";
5052 # integer
5053 print CF "\$time_zone_type = $time_zone_type;\n";
5054 print CF "\n";
5055 # string
5056 print CF "\$config_location_base = '$config_location_base';\n";
5057 print CF "\n";
5058 # boolean
5059 print CF "\$disable_plugins = $disable_plugins;\n";
5060 # string
5061 print CF "\$disable_plugins_user = '$disable_plugins_user';\n";
5062 print CF "\n";
5063
5064 # all plugins are strings
5065 for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
5066 print CF "\$plugins[] = '$plugins[$ct]';\n";
5067 }
5068 print CF "\n";
5069
5070 # strings
5071 if ( $user_theme_default eq '' ) { $user_theme_default = '0'; }
5072 print CF "\$user_theme_default = $user_theme_default;\n";
5073
5074 for ( $count = 0 ; $count <= $#user_theme_name ; $count++ ) {
5075 if ($user_theme_path[$count] eq 'none') {
5076 $path = '\'none\'';
5077 } else {
5078 $path = &change_to_SM_path($user_theme_path[$count]);
5079 }
5080 print CF "\$user_themes[$count]['PATH'] = " . $path . ";\n";
5081 # escape theme name so it can contain single quotes.
5082 $esc_name = $user_theme_name[$count];
5083 $esc_name =~ s/\\/\\\\/g;
5084 $esc_name =~ s/'/\\'/g;
5085 print CF "\$user_themes[$count]['NAME'] = '$esc_name';\n";
5086 }
5087 print CF "\n";
5088
5089 if ( $icon_theme_def eq '' ) { $icon_theme_def = '0'; }
5090 print CF "\$icon_theme_def = $icon_theme_def;\n";
5091 if ( $icon_theme_fallback eq '' ) { $icon_theme_fallback = '0'; }
5092 print CF "\$icon_theme_fallback = $icon_theme_fallback;\n";
5093
5094 for ( $count = 0 ; $count <= $#icon_theme_name ; $count++ ) {
5095 $path = $icon_theme_path[$count];
5096 if ($path eq 'none' || $path eq 'template') {
5097 $path = "'".$path."'";
5098 } else {
5099 $path = &change_to_SM_path($icon_theme_path[$count]);
5100 }
5101 print CF "\$icon_themes[$count]['PATH'] = " . $path . ";\n";
5102 # escape theme name so it can contain single quotes.
5103 $esc_name = $icon_theme_name[$count];
5104 $esc_name =~ s/\\/\\\\/g;
5105 $esc_name =~ s/'/\\'/g;
5106 print CF "\$icon_themes[$count]['NAME'] = '$esc_name';\n";
5107 }
5108 print CF "\n";
5109
5110 if ( $templateset_default eq '' ) { $templateset_default = 'default'; }
5111 print CF "\$templateset_default = '$templateset_default';\n";
5112
5113 if ( $templateset_fallback eq '' ) { $templateset_fallback = 'default'; }
5114 print CF "\$templateset_fallback = '$templateset_fallback';\n";
5115
5116 if ( $rpc_templateset eq '' ) { $rpc_templateset = 'default_rpc'; }
5117 print CF "\$rpc_templateset = '$rpc_templateset';\n";
5118
5119 for ( $count = 0 ; $count <= $#templateset_name ; $count++ ) {
5120
5121 # don't include RPC template sets
5122 #
5123 if ( $templateset_id[$count] =~ /_rpc$/ ) { next; }
5124
5125 print CF "\$aTemplateSet[$count]['ID'] = '" . $templateset_id[$count] . "';\n";
5126 # escape theme name so it can contain single quotes.
5127 $esc_name = $templateset_name[$count];
5128 $esc_name =~ s/\\/\\\\/g;
5129 $esc_name =~ s/'/\\'/g;
5130 print CF "\$aTemplateSet[$count]['NAME'] = '$esc_name';\n";
5131 }
5132 print CF "\n";
5133
5134
5135 # integer
5136 print CF "\$default_fontsize = '$default_fontsize';\n";
5137 # string
5138 print CF "\$default_fontset = '$default_fontset';\n";
5139 print CF "\n";
5140 # assoc. array (maybe initial value should be set somewhere else)
5141 print CF '$fontsets = array();'."\n";
5142 while (($fontset_name, $fontset_value) = each(%fontsets)) {
5143 print CF "\$fontsets\['$fontset_name'\] = '$fontset_value';\n";
5144 }
5145 print CF "\n";
5146
5147 ## Address books
5148 # boolean
5149 print CF "\$default_use_javascript_addr_book = $default_use_javascript_addr_book;\n";
5150 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
5151 print CF "\$ldap_server[$count] = array(\n";
5152 # string
5153 print CF " 'host' => '$ldap_host[$count]',\n";
5154 # string
5155 print CF " 'base' => '$ldap_base[$count]'";
5156 if ( $ldap_name[$count] ) {
5157 print CF ",\n";
5158 # string
5159 print CF " 'name' => '$ldap_name[$count]'";
5160 }
5161 if ( $ldap_port[$count] ) {
5162 print CF ",\n";
5163 # integer
5164 print CF " 'port' => $ldap_port[$count]";
5165 }
5166 if ( $ldap_charset[$count] ) {
5167 print CF ",\n";
5168 # string
5169 print CF " 'charset' => '$ldap_charset[$count]'";
5170 }
5171 if ( $ldap_maxrows[$count] ) {
5172 print CF ",\n";
5173 # integer
5174 print CF " 'maxrows' => $ldap_maxrows[$count]";
5175 }
5176 # string
5177 if ( $ldap_filter[$count] ) {
5178 print CF ",\n";
5179 print CF " 'filter' => '$ldap_filter[$count]'";
5180 }
5181 if ( $ldap_binddn[$count] ) {
5182 print CF ",\n";
5183 # string
5184 print CF " 'binddn' => '$ldap_binddn[$count]'";
5185 if ( $ldap_bindpw[$count] ) {
5186 print CF ",\n";
5187 # string
5188 print CF " 'bindpw' => '$ldap_bindpw[$count]'";
5189 }
5190 }
5191 if ( $ldap_protocol[$count] ) {
5192 print CF ",\n";
5193 # integer
5194 print CF " 'protocol' => $ldap_protocol[$count]";
5195 }
5196 if ( $ldap_limit_scope[$count] ) {
5197 print CF ",\n";
5198 # boolean
5199 print CF " 'limit_scope' => $ldap_limit_scope[$count]";
5200 }
5201 if ( $ldap_listing[$count] ) {
5202 print CF ",\n";
5203 # boolean
5204 print CF " 'listing' => $ldap_listing[$count]";
5205 }
5206 if ( $ldap_writeable[$count] ) {
5207 print CF ",\n";
5208 # boolean
5209 print CF " 'writeable' => $ldap_writeable[$count]";
5210 }
5211 if ( $ldap_search_tree[$count] ) {
5212 print CF ",\n";
5213 # integer
5214 print CF " 'search_tree' => $ldap_search_tree[$count]";
5215 }
5216 if ( $ldap_starttls[$count] ) {
5217 print CF ",\n";
5218 # boolean
5219 print CF " 'starttls' => $ldap_starttls[$count]";
5220 }
5221 print CF "\n";
5222 print CF ");\n";
5223 print CF "\n";
5224 }
5225
5226 # string
5227 print CF "\$addrbook_dsn = '$addrbook_dsn';\n";
5228 # string
5229 print CF "\$addrbook_table = '$addrbook_table';\n\n";
5230 # string
5231 print CF "\$prefs_dsn = '$prefs_dsn';\n";
5232 # string
5233 print CF "\$prefs_table = '$prefs_table';\n";
5234 # string
5235 print CF "\$prefs_user_field = '$prefs_user_field';\n";
5236 # integer
5237 print CF "\$prefs_user_size = $prefs_user_size;\n";
5238 # string
5239 print CF "\$prefs_key_field = '$prefs_key_field';\n";
5240 # integer
5241 print CF "\$prefs_key_size = $prefs_key_size;\n";
5242 # string
5243 print CF "\$prefs_val_field = '$prefs_val_field';\n";
5244 # integer
5245 print CF "\$prefs_val_size = $prefs_val_size;\n\n";
5246 # string
5247 print CF "\$addrbook_global_dsn = '$addrbook_global_dsn';\n";
5248 # string
5249 print CF "\$addrbook_global_table = '$addrbook_global_table';\n";
5250 # boolean
5251 print CF "\$addrbook_global_writeable = $addrbook_global_writeable;\n";
5252 # boolean
5253 print CF "\$addrbook_global_listing = $addrbook_global_listing;\n\n";
5254 # string
5255 print CF "\$abook_global_file = '$abook_global_file';\n";
5256 # boolean
5257 print CF "\$abook_global_file_writeable = $abook_global_file_writeable;\n\n";
5258 # boolean
5259 print CF "\$abook_global_file_listing = $abook_global_file_listing;\n\n";
5260 # integer
5261 print CF "\$abook_file_line_length = $abook_file_line_length;\n\n";
5262 # boolean
5263 print CF "\$no_list_for_subscribe = $no_list_for_subscribe;\n";
5264
5265 # string
5266 print CF "\$smtp_auth_mech = '$smtp_auth_mech';\n";
5267 print CF "\$smtp_sitewide_user = '". quote_single($smtp_sitewide_user) ."';\n";
5268 print CF "\$smtp_sitewide_pass = '". quote_single($smtp_sitewide_pass) ."';\n";
5269 # string
5270 print CF "\$imap_auth_mech = '$imap_auth_mech';\n";
5271 # integer
5272 print CF "\$use_imap_tls = $use_imap_tls;\n";
5273 # integer
5274 print CF "\$use_smtp_tls = $use_smtp_tls;\n";
5275 # boolean
5276 print CF "\$display_imap_login_error = $display_imap_login_error;\n";
5277 # string
5278 print CF "\$session_name = '$session_name';\n";
5279 # boolean
5280 print CF "\$only_secure_cookies = $only_secure_cookies;\n";
5281 print CF "\$disable_security_tokens = $disable_security_tokens;\n";
5282
5283 # string
5284 print CF "\$check_referrer = '$check_referrer';\n";
5285
5286 # boolean
5287 print CF "\$use_transparent_security_image = $use_transparent_security_image;\n";
5288
5289 print CF "\n";
5290
5291 # boolean
5292 print CF "\$use_iframe = $use_iframe;\n";
5293 # boolean
5294 print CF "\$ask_user_info = $ask_user_info;\n";
5295 # boolean
5296 print CF "\$use_icons = $use_icons;\n";
5297 print CF "\n";
5298 # boolean
5299 print CF "\$use_php_recode = $use_php_recode;\n";
5300 # boolean
5301 print CF "\$use_php_iconv = $use_php_iconv;\n";
5302 print CF "\n";
5303 # boolean
5304 print CF "\$buffer_output = $buffer_output;\n";
5305 print CF "\n";
5306 # boolean
5307 print CF "\$allow_remote_configtest = $allow_remote_configtest;\n";
5308 print CF "\$secured_config = $secured_config;\n";
5309 # integer
5310 print CF "\$sq_https_port = $sq_https_port;\n";
5311 # boolean
5312 print CF "\$sq_ignore_http_x_forwarded_headers = $sq_ignore_http_x_forwarded_headers;\n";
5313 # (binary) integer or constant - convert integer
5314 # values to constants before output
5315 $sm_debug_mode = convert_debug_binary_integer_to_constants($sm_debug_mode);
5316 print CF "\$sm_debug_mode = $sm_debug_mode;\n";
5317 print CF "\n";
5318
5319 close CF;
5320
5321 print "Data saved in config.php\n";
5322
5323 build_plugin_hook_array();
5324
5325 } else {
5326 print "Error saving config.php: $!\n";
5327 }
5328 }
5329
5330 sub set_defaults {
5331 clear_screen();
5332 print $WHT. "SquirrelMail Configuration : " . $NRM;
5333 if ( $config == 1 ) { print "Read: config.php"; }
5334 elsif ( $config == 2 ) { print "Read: config_default.php"; }
5335 print "\n";
5336 print "---------------------------------------------------------\n";
5337
5338 print "While we have been building SquirrelMail, we have discovered some\n";
5339 print "preferences that work better with some servers that don't work so\n";
5340 print "well with others. If you select your IMAP server, this option will\n";
5341 print "set some pre-defined settings for that server.\n";
5342 print "\n";
5343 print "Please note that you will still need to go through and make sure\n";
5344 print "everything is correct. This does not change everything. There are\n";
5345 print "only a few settings that this will change.\n";
5346 print "\n";
5347
5348 $continue = 0;
5349 while ( $continue != 1 ) {
5350 print "Please select your IMAP server:\n";
5351 print $list_supported_imap_servers;
5352 print "\n";
5353 print " quit = Do not change anything\n";
5354 print "\n";
5355 print "Command >> ";
5356 $server = <STDIN>;
5357 $server =~ s/[\r\n]//g;
5358
5359 # variable is used to display additional messages.
5360 $message = "";
5361
5362 print "\n";
5363 if ( $server eq "cyrus" ) {
5364 $imap_server_type = "cyrus";
5365 $default_folder_prefix = "";
5366 $trash_folder = "INBOX.Trash";
5367 $sent_folder = "INBOX.Sent";
5368 $draft_folder = "INBOX.Drafts";
5369 $show_prefix_option = false;
5370 $default_sub_of_inbox = true;
5371 $show_contain_subfolders_option = false;
5372 $optional_delimiter = ".";
5373 $disp_default_folder_prefix = "<none>";
5374 $force_username_lowercase = false;
5375
5376 # Delimiter might differ if unixhierarchysep is set to yes.
5377 $message = "\nIf you have enabled unixhierarchysep, you must change delimiter and special folder names.\n";
5378
5379 $continue = 1;
5380 } elsif ( $server eq "uw" ) {
5381 $imap_server_type = "uw";
5382 $default_folder_prefix = "mail/";
5383 $trash_folder = "Trash";
5384 $sent_folder = "Sent";
5385 $draft_folder = "Drafts";
5386 $show_prefix_option = true;
5387 $default_sub_of_inbox = false;
5388 $show_contain_subfolders_option = true;
5389 $optional_delimiter = "/";
5390 $disp_default_folder_prefix = $default_folder_prefix;
5391 $delete_folder = true;
5392 $force_username_lowercase = true;
5393
5394 $continue = 1;
5395 } elsif ( $server eq "exchange" ) {
5396 $imap_server_type = "exchange";
5397 $default_folder_prefix = "";
5398 $default_sub_of_inbox = true;
5399 $trash_folder = "INBOX/Deleted Items";
5400 $sent_folder = "INBOX/Sent Items";
5401 $drafts_folder = "INBOX/Drafts";
5402 $show_prefix_option = false;
5403 $show_contain_subfolders_option = false;
5404 $optional_delimiter = "detect";
5405 $disp_default_folder_prefix = "<none>";
5406 $force_username_lowercase = true;
5407
5408 $continue = 1;
5409 } elsif ( $server eq "courier" ) {
5410 $imap_server_type = "courier";
5411 $default_folder_prefix = "INBOX.";
5412 $trash_folder = "Trash";
5413 $sent_folder = "Sent";
5414 $draft_folder = "Drafts";
5415 $show_prefix_option = false;
5416 $default_sub_of_inbox = false;
5417 $show_contain_subfolders_option = false;
5418 $optional_delimiter = ".";
5419 $disp_default_folder_prefix = $default_folder_prefix;
5420 $delete_folder = true;
5421 $force_username_lowercase = false;
5422
5423 $continue = 1;
5424 } elsif ( $server eq "macosx" ) {
5425 $imap_server_type = "macosx";
5426 $default_folder_prefix = "INBOX/";
5427 $trash_folder = "Trash";
5428 $sent_folder = "Sent";
5429 $draft_folder = "Drafts";
5430 $show_prefix_option = false;
5431 $default_sub_of_inbox = true;
5432 $show_contain_subfolders_option = false;
5433 $optional_delimiter = "detect";
5434 $allow_charset_search = false;
5435 $disp_default_folder_prefix = $default_folder_prefix;
5436
5437 $continue = 1;
5438 } elsif ( $server eq "hmailserver" ) {
5439 $imap_server_type = "hmailserver";
5440 $default_folder_prefix = "";
5441 $trash_folder = "INBOX.Trash";
5442 $sent_folder = "INBOX.Sent";
5443 $draft_folder = "INBOX.Drafts";
5444 $show_prefix_option = false;
5445 $default_sub_of_inbox = true;
5446 $show_contain_subfolders_option = false;
5447 $optional_delimiter = "detect";
5448 $allow_charset_search = false;
5449 $disp_default_folder_prefix = $default_folder_prefix;
5450 $delete_folder = false;
5451 $force_username_lowercase = false;
5452
5453 $continue = 1;
5454 } elsif ( $server eq "mercury32" ) {
5455 $imap_server_type = "mercury32";
5456 $default_folder_prefix = "";
5457 $trash_folder = "Trash";
5458 $sent_folder = "Sent";
5459 $draft_folder = "Drafts";
5460 $show_prefix_option = false;
5461 $default_sub_of_inbox = true;
5462 $show_contain_subfolders_option = true;
5463 $optional_delimiter = "detect";
5464 $delete_folder = true;
5465 $force_username_lowercase = true;
5466
5467 $continue = 1;
5468 } elsif ( $server eq "dovecot" ) {
5469 $imap_server_type = "dovecot";
5470 $default_folder_prefix = "";
5471 $trash_folder = "Trash";
5472 $sent_folder = "Sent";
5473 $draft_folder = "Drafts";
5474 $show_prefix_option = false;
5475 $default_sub_of_inbox = false;
5476 $show_contain_subfolders_option = false;
5477 $delete_folder = false;
5478 $force_username_lowercase = true;
5479 $optional_delimiter = "detect";
5480 $disp_default_folder_prefix = "<none>";
5481
5482 $continue = 1;
5483 } elsif ( $server eq "bincimap" ) {
5484 $imap_server_type = "bincimap";
5485 $default_folder_prefix = "INBOX/";
5486 $trash_folder = "Trash";
5487 $sent_folder = "Sent";
5488 $draft_folder = "Drafts";
5489 $show_prefix_option = false;
5490 $default_sub_of_inbox = false;
5491 $show_contain_subfolders_option = false;
5492 $delete_folder = true;
5493 $force_username_lowercase = false;
5494 $optional_delimiter = "detect";
5495 $disp_default_folder_prefix = $default_folder_prefix;
5496
5497 # Default folder prefix depends on used depot.
5498 $message = "\nIf you use IMAPdir depot, you must set default folder prefix to empty string.\n";
5499
5500 $continue = 1;
5501 } elsif ( $server eq "gmail" ) {
5502 $imap_server_type = "gmail";
5503 $default_folder_prefix = "";
5504 $trash_folder = "[Gmail]/Trash";
5505 $default_move_to_trash = true;
5506 $sent_folder = "[Gmail]/Sent Mail";
5507 $draft_folder = "[Gmail]/Drafts";
5508 $auto_create_special = false;
5509 $show_prefix_option = false;
5510 $default_sub_of_inbox = false;
5511 $show_contain_subfolders_option = false;
5512 $delete_folder = true;
5513 $force_username_lowercase = false;
5514 $optional_delimiter = "/";
5515 $disp_default_folder_prefix = "<none>";
5516 $domain = "gmail.com";
5517 $imapServerAddress = "imap.gmail.com";
5518 $imapPort = 993;
5519 $use_imap_tls = 1;
5520 $imap_auth_mech = "login";
5521 $smtpServerAddress = "smtp.gmail.com";
5522 $smtpPort = 465;
5523 $pop_before_smtp = false;
5524 $useSendmail = false;
5525 $use_smtp_tls = 1;
5526 $smtp_auth_mech = "login";
5527 $continue = 1;
5528
5529 # Gmail changes system folder names (Drafts, Sent, Trash) out
5530 # from under you when the user changes language settings
5531 $message = "\nNOTE! When a user changes languages in Gmail's interface, the\n"
5532 . "Drafts, Sent and Trash folder names are changed to localized\n"
5533 . "versions thereof. To see those folders correctly in SquirrelMail,\n"
5534 . "the user should change the SquirrelMail language to match.\n"
5535 . "Moreover, SquirrelMail then needs to be told what folders to use\n"
5536 . "for Drafts, Sent and Trash in Options --> Folder Preferences.\n"
5537 . "These default settings will only correctly find the Sent, Trash\n"
5538 . "and Drafts folders if both Gmail and SquirrelMail languages are\n"
5539 . "set to English.\n\n"
5540 . "Also note that in some regions (Europe?), the default folder\n"
5541 . "names (see main menu selection 3. Folder Defaults) are different\n"
5542 . "(they may need to have the prefix \"[Google Mail]\" instead of\n"
5543 . "\"[Gmail]\") and \"Trash\" may be called \"Bin\" instead.\n";
5544
5545 } elsif ( $server eq "quit" ) {
5546 $continue = 1;
5547 } else {
5548 $disp_default_folder_prefix = $default_folder_prefix;
5549 print "Unrecognized server: $server\n";
5550 print "\n";
5551 }
5552
5553 print " imap_server_type = $imap_server_type\n";
5554 print " default_folder_prefix = $disp_default_folder_prefix\n";
5555 print " trash_folder = $trash_folder\n";
5556 print " sent_folder = $sent_folder\n";
5557 print " draft_folder = $draft_folder\n";
5558 print " show_prefix_option = $show_prefix_option\n";
5559 print " default_sub_of_inbox = $default_sub_of_inbox\n";
5560 print "show_contain_subfolders_option = $show_contain_subfolders_option\n";
5561 print " optional_delimiter = $optional_delimiter\n";
5562 print " delete_folder = $delete_folder\n";
5563 print " force_username_lowercase = $force_username_lowercase\n";
5564
5565 print "$message";
5566 }
5567 print "\nPress enter to continue...";
5568 $tmp = <STDIN>;
5569 }
5570
5571 # This subroutine corrects relative paths to ensure they
5572 # will work within the SM space. If the path falls within
5573 # the SM directory tree, the SM_PATH variable will be
5574 # prepended to the path, if not, then the path will be
5575 # converted to an absolute path, e.g.
5576 # '../images/logo.gif' --> SM_PATH . 'images/logo.gif'
5577 # '../../someplace/data' --> '/absolute/path/someplace/data'
5578 # 'images/logo.gif' --> SM_PATH . 'config/images/logo.gif'
5579 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
5580 # 'C:\absolute\path\logo.gif' --> 'C:\absolute\path\logo.gif'
5581 # 'http://whatever/' --> 'http://whatever'
5582 # $some_var/path --> "$some_var/path"
5583 sub change_to_SM_path() {
5584 my ($old_path) = @_;
5585 my $new_path = '';
5586 my @rel_path;
5587 my @abs_path;
5588 my $subdir;
5589
5590 # If the path is absolute, don't bother.
5591 return "\'" . $old_path . "\'" if ( $old_path eq '');
5592 return "\'" . $old_path . "\'" if ( $old_path =~ /^(\/|http)/ );
5593 return "\'" . $old_path . "\'" if ( $old_path =~ /^\w:(\\|\/)/ );
5594 return $old_path if ( $old_path =~ /^\'(\/|http)/ );
5595 return $old_path if ( $old_path =~ /^\'\w:\// );
5596 return $old_path if ( $old_path =~ /^SM_PATH/);
5597
5598 if ( $old_path =~ /^\$/ ) {
5599 # check if it's a single var, or a $var/path combination
5600 # if it's $var/path, enclose in ""
5601 if ( $old_path =~ /\// ) {
5602 return '"'.$old_path.'"';
5603 }
5604 return $old_path;
5605 }
5606
5607 # Remove remaining '
5608 $old_path =~ s/\'//g;
5609
5610 # For relative paths, split on '../'
5611 @rel_path = split(/\.\.\//, $old_path);
5612
5613 if ( $#rel_path > 1 ) {
5614 # more than two levels away. Make it absolute.
5615 @abs_path = split(/\//, $dir);
5616
5617 # Lop off the relative pieces of the absolute path..
5618 for ( $i = 0; $i <= $#rel_path; $i++ ) {
5619 pop @abs_path;
5620 shift @rel_path;
5621 }
5622 push @abs_path, @rel_path;
5623 $new_path = "\'" . join('/', @abs_path) . "\'";
5624 } elsif ( $#rel_path > 0 ) {
5625 # it's within the SM tree, prepend SM_PATH
5626 $new_path = $old_path;
5627 $new_path =~ s/^\.\.\//SM_PATH . \'/;
5628 $new_path .= "\'";
5629 } else {
5630 # Last, it's a relative path without any leading '.'
5631 # Prepend SM_PATH and config, since the paths are
5632 # relative to the config directory
5633 $new_path = "SM_PATH . \'config/" . $old_path . "\'";
5634 }
5635 return $new_path;
5636 }
5637
5638
5639 # Change SM_PATH to admin-friendly version, e.g.:
5640 # SM_PATH . 'images/logo.gif' --> '../images/logo.gif'
5641 # SM_PATH . 'config/some.php' --> 'some.php'
5642 # '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
5643 # 'http://whatever/' --> 'http://whatever'
5644 sub change_to_rel_path() {
5645 my ($old_path) = @_;
5646 my $new_path = $old_path;
5647
5648 if ( $old_path =~ /^SM_PATH/ ) {
5649 # FIXME: the following replacement loses the opening quote mark!
5650 $new_path =~ s/^SM_PATH . \'/\.\.\//;
5651 $new_path =~ s/\.\.\/config\///;
5652 }
5653
5654 return $new_path;
5655 }
5656
5657 # Attempts to auto-detect if a specific auth mechanism is supported.
5658 # Called by 'command112a' and 'command112b'
5659 # ARGS: service-name (IMAP or SMTP), host:port, mech-name (ie. CRAM-MD5)
5660 sub detect_auth_support {
5661 # Try loading IO::Socket
5662 unless (eval("use IO::Socket; 1")) {
5663 print "Perl IO::Socket module is not available.";
5664 return undef;
5665 }
5666 # Misc setup
5667 my $service = shift;
5668 my $host = shift;
5669 my $mech = shift;
5670 # Sanity checks
5671 if ((!defined($service)) or (!defined($host)) or (!defined($mech))) {
5672 # Error - wrong # of args
5673 print "BAD ARGS!\n";
5674 return undef;
5675 }
5676
5677 if ($service eq 'SMTP') {
5678 $cmd = "AUTH $mech\r\n";
5679 $logout = "QUIT\r\n";
5680 } elsif ($service eq 'IMAP') {
5681 $cmd = "A01 AUTHENTICATE $mech\n";
5682 $logout = "C01 LOGOUT\n";
5683 } else {
5684 # unknown service - whoops.
5685 return undef;
5686 }
5687
5688 # Get this show on the road
5689 my $sock=IO::Socket::INET->new($host);
5690 if (!defined($sock)) {
5691 # Connect failed
5692 return undef;
5693 }
5694 my $discard = <$sock>; # Server greeting/banner - who cares..
5695
5696 if ($service eq 'SMTP') {
5697 # Say hello first..
5698 print $sock "HELO $domain\r\n";
5699 $discard = <$sock>; # Yeah yeah, you're happy to see me..
5700 }
5701 print $sock $cmd;
5702
5703 my $response = <$sock>;
5704 chomp($response);
5705 if (!defined($response)) {
5706 return undef;
5707 }
5708
5709 # So at this point, we have a response, and it is (hopefully) valid.
5710 if ($service eq 'SMTP') {
5711 if (!($response =~ /^334/)) {
5712 # Not supported
5713 print $sock $logout;
5714 close $sock;
5715 return 'NO';
5716 }
5717 } elsif ($service eq 'IMAP') {
5718 if ($response =~ /^A01/) {
5719 # Not supported
5720 print $sock $logout;
5721 close $sock;
5722 return 'NO';
5723 }
5724 } else {
5725 # Unknown service - this shouldn't be able to happen.
5726 close $sock;
5727 return undef;
5728 }
5729
5730 # If it gets here, the mech is supported
5731 print $sock "*\n"; # Attempt to cancel authentication
5732 print $sock $logout; # Try to log out, but we don't really care if this fails
5733 close $sock;
5734 return 'YES';
5735 }
5736
5737 # trims whitespace
5738 # Example code from O'Reilly Perl Cookbook
5739 sub trim {
5740 my @out = @_;
5741 for (@out) {
5742 s/^\s+//;
5743 s/\s+$//;
5744 }
5745 return wantarray ? @out : $out[0];
5746 }
5747
5748 sub clear_screen() {
5749 if ( $^O =~ /^mswin/i) {
5750 system "cls";
5751 } else {
5752 system "clear";
5753 }
5754 }
5755
5756 # checks IMAP mailbox name. Refuses to accept 8bit folders
5757 # returns 0 (folder name is not correct) or 1 (folder name is correct)
5758 sub check_imap_folder($) {
5759 my $folder_name = shift(@_);
5760
5761 if ($folder_name =~ /[\x80-\xFFFF]/) {
5762 print "Folder name contains 8bit characters. Configuration utility requires\n";
5763 print "UTF7-IMAP encoded folder names.\n";
5764 print "Press enter to continue...";
5765 my $tmp = <STDIN>;
5766 return 0;
5767 } elsif ($folder_name =~ /[&\*\%]/) {
5768 # check for ampersand and list-wildcards
5769 print "Folder name contains special UTF7-IMAP characters.\n";
5770 print "Are you sure that folder name is correct? (y/N): ";
5771 my $tmp = <STDIN>;
5772 $tmp = lc(trim($tmp));
5773 if ($tmp =~ /^y$/) {
5774 return 1;
5775 } else {
5776 return 0;
5777 }
5778 } else {
5779 return 1;
5780 }
5781 }
5782
5783 # quotes string written in single quotes
5784 sub quote_single($) {
5785 my $string = shift(@_);
5786 $string =~ s/\'/\\'/g;
5787 return $string;
5788 }
5789
5790 # determine a plugin's version number
5791 #
5792 # parses the setup.php file, looking for the
5793 # version string in the <plugin>_info() or the
5794 # <plugin>_version functions.
5795 #
5796 sub get_plugin_version() {
5797
5798 my $plugin_name = shift(@_);
5799
5800 $setup_file = '../plugins/' . $plugin_name . '/setup.php';
5801 if ( -e "$setup_file" ) {
5802 # Make sure that file is readable
5803 if (! -r "$setup_file") {
5804 print "\n";
5805 print "WARNING:\n";
5806 print "The file \"$setup_file\" was found, but you don't\n";
5807 print "have rights to read it. The plugin \"";
5808 print $plugin_name . "\" may not work correctly until you fix this.\n";
5809 print "\nPress enter to continue";
5810 $ctu = <STDIN>;
5811 print "\n";
5812 next;
5813 }
5814
5815 $version = ' ';
5816 # FIXME: grep the file instead of reading it into memory?
5817 $whole_file = '';
5818 open( FILE, "$setup_file" );
5819 while ( $line = <FILE> ) {
5820 $whole_file .= $line;
5821 }
5822 close(FILE);
5823
5824 # ideally, there is a version in the <plugin>_info function...
5825 #
5826 if ($whole_file =~ /('version'\s*=>\s*['"](.*?)['"])/) {
5827 $version .= $2;
5828
5829 # this assumes there is only one function that returns
5830 # a static string in the setup file
5831 #
5832 } elsif ($whole_file =~ /(return\s*['"](.*?)['"])/) {
5833 $version .= $2;
5834 }
5835
5836 return $version;
5837
5838 } else {
5839 print "\n";
5840 print "WARNING:\n";
5841 print "The file \"$setup_file\" was not found.\n";
5842 print "The plugin \"" . $plugin_name;
5843 print "\" may not work correctly until you fix this.\n";
5844 print "\nPress enter to continue";
5845 $ctu = <STDIN>;
5846 print "\n";
5847 next;
5848 }
5849
5850 }
5851
5852 # determine a plugin's English name
5853 #
5854 # parses the setup.php file, looking for the
5855 # English name in the <plugin>_info() function.
5856 #
5857 sub get_plugin_english_name() {
5858
5859 my $plugin_name = shift(@_);
5860
5861 $setup_file = '../plugins/' . $plugin_name . '/setup.php';
5862 if ( -e "$setup_file" ) {
5863 # Make sure that file is readable
5864 if (! -r "$setup_file") {
5865 print "\n";
5866 print "WARNING:\n";
5867 print "The file \"$setup_file\" was found, but you don't\n";
5868 print "have rights to read it. The plugin \"";
5869 print $plugin_name . "\" may not work correctly until you fix this.\n";
5870 print "\nPress enter to continue";
5871 $ctu = <STDIN>;
5872 print "\n";
5873 next;
5874 }
5875
5876 $english_name = '';
5877 # FIXME: grep the file instead of reading it into memory?
5878 $whole_file = '';
5879 open( FILE, "$setup_file" );
5880 while ( $line = <FILE> ) {
5881 $whole_file .= $line;
5882 }
5883 close(FILE);
5884
5885 # the English name is in the <plugin>_info function or nothing...
5886 #
5887 if ($whole_file =~ /('english_name'\s*=>\s*['"](.*?)['"])/) {
5888 $english_name .= $2;
5889 }
5890
5891 return $english_name;
5892
5893 } else {
5894 print "\n";
5895 print "WARNING:\n";
5896 print "The file \"$setup_file\" was not found.\n";
5897 print "The plugin \"" . $plugin_name;
5898 print "\" may not work correctly until you fix this.\n";
5899 print "\nPress enter to continue";
5900 $ctu = <STDIN>;
5901 print "\n";
5902 next;
5903 }
5904
5905 }
5906
5907 # parses the setup.php files for all activated plugins and
5908 # builds static plugin hooks array so we don't have to load
5909 # ALL plugins are runtime and build the hook array on every
5910 # page request
5911 #
5912 # hook array is saved in config/plugin_hooks.php
5913 #
5914 # Note the $verbose variable at the top of this routine
5915 # can be set to zero to quiet it down.
5916 #
5917 # NOTE/FIXME: we aren't necessarily interested in writing
5918 # a full-blown PHP parsing engine, so plenty
5919 # of assumptions are included herein about the
5920 # coding of the plugin setup files, and things
5921 # like commented out curly braces or other
5922 # such oddities can break this in a bad way.
5923 #
5924 sub build_plugin_hook_array() {
5925
5926 $verbose = 1;
5927
5928 if ($verbose) {
5929 print "\n\n";
5930 }
5931
5932 if ( open( HOOKFILE, ">plugin_hooks.php" ) ) {
5933 print HOOKFILE "<?php\n";
5934 print HOOKFILE "\n";
5935
5936 print HOOKFILE "/**\n";
5937 print HOOKFILE " * SquirrelMail Plugin Hook Registration File\n";
5938 print HOOKFILE " * Auto-generated using the configure script, conf.pl\n";
5939 print HOOKFILE " */\n";
5940 print HOOKFILE "\n";
5941 print HOOKFILE "global \$squirrelmail_plugin_hooks;\n";
5942 print HOOKFILE "\n";
5943
5944 PLUGIN: for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
5945
5946 if ($verbose) {
5947 print "Activating plugin \"" . $plugins[$ct] . "\"...\n";
5948 }
5949
5950 $setup_file = '../plugins/' . $plugins[$ct] . '/setup.php';
5951 if ( -e "$setup_file" ) {
5952 # Make sure that file is readable
5953 if (! -r "$setup_file") {
5954 print "\n";
5955 print "WARNING:\n";
5956 print "The file \"$setup_file\" was found, but you don't\n";
5957 print "have rights to read it. The plugin \"";
5958 print $plugins[$ct] . "\" will not be activated until you fix this.\n";
5959 print "\nPress enter to continue";
5960 $ctu = <STDIN>;
5961 print "\n";
5962 next;
5963 }
5964 open( FILE, "$setup_file" );
5965 $inside_init_fxn = 0;
5966 $brace_count = 0;
5967 while ( $line = <FILE> ) {
5968
5969 # throw away lines until we get to target function
5970 #
5971 if (!$inside_init_fxn
5972 && $line !~ /^\s*function\s*squirrelmail_plugin_init_/i) {
5973 next;
5974 }
5975 $inside_init_fxn = 1;
5976
5977
5978 # count open braces
5979 #
5980 if ($line =~ /{/) {
5981 $brace_count++;
5982 }
5983
5984
5985 # count close braces
5986 #
5987 if ($line =~ /}/) {
5988 $brace_count--;
5989
5990 # leaving <plugin>_init() function...
5991 if ($brace_count == 0) {
5992 close(FILE);
5993 next PLUGIN;
5994 }
5995
5996 }
5997
5998
5999 # throw away lines that are not exactly one "brace set" deep
6000 #
6001 if ($brace_count > 1) {
6002 next;
6003 }
6004
6005
6006 # also not interested in lines that are not
6007 # hook registration points
6008 #
6009 if ($line !~ /^\s*\$squirrelmail_plugin_hooks/i) {
6010 next;
6011 }
6012
6013
6014 # if $line does not have an ending semicolon,
6015 # we need to recursively read in subsequent
6016 # lines until we find one
6017 while ( $line !~ /;\s*$/ ) {
6018 $line =~ s/[\n\r]\s*$//;
6019 $line .= <FILE>;
6020 }
6021
6022
6023 $line =~ s/^\s+//;
6024 $line =~ s/^\$//;
6025 $var = $line;
6026
6027 $var =~ s/=/EQUALS/;
6028 if ( $var =~ /^([a-z])/i ) {
6029 @options = split ( /\s*EQUALS\s*/, $var );
6030 $options[1] =~ s/[\n\r]//g;
6031 $options[1] =~ s/[\'\"];\s*$//;
6032 $options[1] =~ s/;$//;
6033 $options[1] =~ s/^[\'\"]//;
6034 # de-escape escaped strings
6035 $options[1] =~ s/\\'/'/g;
6036 $options[1] =~ s/\\\\/\\/g;
6037
6038 if ( $options[0] =~ /^squirrelmail_plugin_hooks\s*\[\s*['"]([a-z0-9 \/._*-]+)['"]\s*\]\s*\[\s*['"]([0-9a-z._-]+)['"]\s*\]/i ) {
6039 $hook_name = $1;
6040 $hooked_plugin_name = $2;
6041 # Note: if we wanted to stop plugins from registering
6042 # a *different* plugin on a hook, we could catch
6043 # it here, however this has actually proven to be
6044 # a useful *feature*
6045 #if ($hooked_plugin_name ne $plugins[$ct]) {
6046 # print "...plugin is tring to hook in under different name...\n";
6047 #}
6048
6049 #FIXME: do we want to count the number of hook registrations for each plugin and warn if a plugin doesn't have any?
6050 # hook registration has been found!
6051 if ($verbose) {
6052 if ($hooked_plugin_name ne $plugins[$ct]) {
6053 print " registering on hook \"" . $hook_name . "\" (as \"$hooked_plugin_name\" plugin)\n";
6054 } else {
6055 print " registering on hook \"" . $hook_name . "\"\n";
6056 }
6057 }
6058 $line =~ s/ {2,}/ /g;
6059 $line =~ s/=/\n =/;
6060 print HOOKFILE "\$$line";
6061
6062 }
6063
6064 }
6065
6066 }
6067 close(FILE);
6068
6069 } else {
6070 print "\n";
6071 print "WARNING:\n";
6072 print "The file \"$setup_file\" was not found.\n";
6073 print "The plugin \"" . $plugins[$ct];
6074 print "\" will not be activated until you fix this.\n";
6075 print "\nPress enter to continue";
6076 $ctu = <STDIN>;
6077 print "\n";
6078 next;
6079 }
6080
6081 }
6082
6083 print HOOKFILE "\n\n";
6084 close(HOOKFILE);
6085 # if ($verbose) {
6086 print "\nDone activating plugins; registration data saved in plugin_hooks.php\n\n";
6087 # }
6088
6089 } else {
6090
6091 print "\n";
6092 print "WARNING:\n";
6093 print "The file \"plugin_hooks.php\" was not able to be written to.\n";
6094 print "No plugins will be activated until you fix this.\n";
6095 print "\nPress enter to continue";
6096 $ctu = <STDIN>;
6097 print "\n";
6098
6099 }
6100
6101 }
6102
6103 # converts (binary) integer values that correspond
6104 # to the SquirrelMail debug mode constants (see
6105 # include/constants.php) into those constant strings
6106 # (bitwise or'd if more than one is enabled)
6107 #
6108 # if the value passed in is not an integer, it is
6109 # returned unmolested
6110 #
6111 sub convert_debug_binary_integer_to_constants() {
6112
6113 my ($debug_mode) = @_;
6114 if ($debug_mode =~ /^[^0-9]/) {
6115 return $debug_mode;
6116 }
6117 $debug_mode = int($debug_mode);
6118 $new_debug_mode = '';
6119
6120 # per include/constants.php, here are their values:
6121 #
6122 # 0 SM_DEBUG_MODE_OFF
6123 # 1 SM_DEBUG_MODE_SIMPLE
6124 # 512 SM_DEBUG_MODE_MODERATE
6125 # 524288 SM_DEBUG_MODE_ADVANCED
6126 # 536870912 SM_DEBUG_MODE_STRICT
6127 #
6128 if ($debug_mode & 1) {
6129 $new_debug_mode .= ' | SM_DEBUG_MODE_SIMPLE';
6130 }
6131 if ($debug_mode & 512) {
6132 $new_debug_mode .= ' | SM_DEBUG_MODE_MODERATE';
6133 }
6134 if ($debug_mode & 524288) {
6135 $new_debug_mode .= ' | SM_DEBUG_MODE_ADVANCED';
6136 }
6137 if ($debug_mode & 536870912) {
6138 $new_debug_mode .= ' | SM_DEBUG_MODE_STRICT';
6139 }
6140
6141 $new_debug_mode =~ s/^ \| //;
6142 if (!$new_debug_mode) {
6143 $new_debug_mode = 'SM_DEBUG_MODE_OFF';
6144 }
6145
6146 return $new_debug_mode;
6147 }
6148
6149 # converts SquirrelMail debug mode constants (see
6150 # include/constants.php) into their corresponding
6151 # (binary) integer values
6152 #
6153 # if the value passed in is an integer already, it
6154 # is returned unmolested
6155 #
6156 sub convert_debug_constants_to_binary_integer() {
6157
6158 my ($debug_mode) = @_;
6159 if ($debug_mode =~ /^[0-9]/) {
6160 return $debug_mode;
6161 }
6162 $new_debug_mode = 0;
6163
6164 # per include/constants.php, here are their values:
6165 #
6166 # 0 SM_DEBUG_MODE_OFF
6167 # 1 SM_DEBUG_MODE_SIMPLE
6168 # 512 SM_DEBUG_MODE_MODERATE
6169 # 524288 SM_DEBUG_MODE_ADVANCED
6170 # 536870912 SM_DEBUG_MODE_STRICT
6171 #
6172 if ($debug_mode =~ /\bSM_DEBUG_MODE_OFF\b/) {
6173 $new_debug_mode = 0;
6174 }
6175 if ($debug_mode =~ /\bSM_DEBUG_MODE_SIMPLE\b/) {
6176 $new_debug_mode |= 1;
6177 }
6178 if ($debug_mode =~ /\bSM_DEBUG_MODE_MODERATE\b/) {
6179 $new_debug_mode |= 512;
6180 }
6181 if ($debug_mode =~ /\bSM_DEBUG_MODE_ADVANCED\b/) {
6182 $new_debug_mode |= 524288;
6183 }
6184 if ($debug_mode =~ /\bSM_DEBUG_MODE_STRICT\b/) {
6185 $new_debug_mode |= 536870912;
6186 }
6187
6188 return $new_debug_mode;
6189 }
6190
6191 # Function to print n column numbered lists
6192 #
6193 # WARNING: the names in the list will be truncated
6194 # to fit in their respective columns based on the
6195 # screen width and number of columns.
6196 #
6197 # Expected arguments (in this order):
6198 #
6199 # * The start number to use for the list
6200 # * The number of columns to use
6201 # * The screen width
6202 # * Boolean (zero/one), indicating
6203 # whether or not to show item numbers
6204 # * The list of strings to be shown
6205 #
6206 # Returns: The number printed on screen of the last item in the list
6207 #
6208 sub print_multi_col_list {
6209 my ($num, $cols, $screen_width, $show_numbering, @list) = @_;
6210 my $x;
6211 my $col_cnt = 0;
6212 my $row_cnt = 0;
6213 my $rows;
6214 my $col_width;
6215 my $total = 0;
6216 my @layout = ();
6217 my @numbers = ();
6218
6219 $rows = int(@list / $cols);
6220 if (@list % $cols) { $rows++; }
6221 if ($show_numbering) { $col_width = int(($screen_width - 2) / $cols) - 5; }
6222 else { $col_width = int(($screen_width - 2) / $cols) - 2; }
6223
6224 # build the layout array so numbers run down each column
6225 #
6226 for ( $x = 0; $x < @list; $x++ ) {
6227
6228 $layout[$row_cnt][$col_cnt] = $list[$x];
6229 $numbers[$row_cnt][$col_cnt] = $num++;
6230
6231 # move to next column
6232 #
6233 if ($row_cnt == $rows - 1) {
6234 $row_cnt = 0;
6235 $col_cnt++;
6236 }
6237 else { $row_cnt++; }
6238
6239 }
6240
6241 # if we filled up fewer rows than needed, recalc column width
6242 #
6243 if ($rows * $col_cnt == @list) { $col_cnt--; } # loop above ended right after increment
6244 if ($col_cnt + 1 < $cols) {
6245 if ($show_numbering) { $col_width = int(($screen_width - 2) / ($col_cnt + 1)) - 5; }
6246 else { $col_width = int(($screen_width - 2) / ($col_cnt + 1)) - 2; }
6247 }
6248
6249 # print it
6250 # iterate rows
6251 #
6252 for ( $row_cnt = 0; $row_cnt <= $rows; $row_cnt++ ) {
6253
6254 # indent the row
6255 #
6256 print " ";
6257
6258 # iterate columns for this row
6259 #
6260 for ( $col_cnt = 0; $col_cnt <= $cols; $col_cnt++ ) {
6261 if ($layout[$row_cnt][$col_cnt]) {
6262 print " ";
6263 if ($show_numbering) { printf "$WHT% 2u.$NRM", $numbers[$row_cnt][$col_cnt]; }
6264 printf " %-$col_width." . $col_width . "s", $layout[$row_cnt][$col_cnt];
6265 }
6266 }
6267 print "\n";
6268 }
6269
6270
6271 return $num - 1;
6272 }
6273