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