Search page should remember last move-target too
[squirrelmail.git] / config / conf.pl
CommitLineData
23afd0bd 1#!/usr/bin/env perl
bbd30ac8 2# conf.pl
bbd30ac8 3#
c4faef33 4# Copyright (c) 1999-2020 The SquirrelMail Project Team
6614128e 5# Licensed under the GNU GPL. For full terms see COPYING.
6#
7# A simple configure script to configure SquirrelMail
245a6892 8#
9# $Id$
598294a7 10############################################################
3641f36d 11$conf_pl_version = "1.5.0";
bbd30ac8 12
38b69acb 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############################################################
8bd9e0dd 19my $dir;
eaace00e 20if ( eval q{require "File/Basename.pm"} ) {
8bd9e0dd 21 $dir = File::Basename::dirname($0);
38b69acb 22 chdir($dir);
23}
24
598294a7 25############################################################
d595e32e 26# Some people try to run this as a CGI. That's wrong!
598294a7 27############################################################
eaace00e 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 }
d595e32e 35
8bd9e0dd 36############################################################
37# If we got here, use Cwd to get the full directory path
38# (the Basename stuff above will sometimes return '.' as
598294a7 39# the base directory, which is not helpful here).
8bd9e0dd 40############################################################
41use Cwd;
42$dir = cwd();
43
598294a7 44
45############################################################
34aa9765 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...
598294a7 63############################################################
eaace00e 64if ( -e "config.php" ) {
9061389c 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";
8b56e282 72 print "Press enter to continue";
9061389c 73 $ctu = <STDIN>;
74 exit;
75 }
eaace00e 76 open( FILE, "config.php" );
77 while ( $line = <FILE> ) {
78 $line =~ s/^\s+//;
79 $line =~ s/^\$//;
80 $var = $line;
81
82 $var =~ s/=/EQUALS/;
85645192 83 if ( $var =~ /^([a-z])/i ) {
eaace00e 84 @o = split ( /\s*EQUALS\s*/, $var );
85 if ( $o[0] eq "config_version" ) {
85645192 86 $o[1] =~ s/[\n\r]//g;
87 $o[1] =~ s/[\'\"];\s*$//;
eaace00e 88 $o[1] =~ s/;$//;
85645192 89 $o[1] =~ s/^[\'\"]//;
eaace00e 90
91 $config_version = $o[1];
92 close(FILE);
93 }
94 }
95 }
96 close(FILE);
97
98 if ( $config_version ne $conf_pl_version ) {
f8c17cdd 99 clear_screen();
9061389c 100 print "WARNING:\n";
eaace00e 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/;
85645192 136 if ( $var =~ /^([a-z])/i ) {
eaace00e 137 @o = split ( /\s*EQUALS\s*/, $var );
138 if ( $o[0] eq "config_version" ) {
85645192 139 $o[1] =~ s/[\n\r]//g;
140 $o[1] =~ s/[\'\"];\s*$//;
eaace00e 141 $o[1] =~ s/;$//;
85645192 142 $o[1] =~ s/^[\'\"]//;
eaace00e 143
144 $config_version = $o[1];
145 close(FILE);
146 }
147 }
148 }
149 close(FILE);
150
151 if ( $config_version ne $conf_pl_version ) {
f8c17cdd 152 clear_screen();
9061389c 153 print "WARNING:\n";
eaace00e 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";
a3bb5005 159 print " http://squirrelmail.org.\n";
eaace00e 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" );
1e0628fb 180} else {
eaace00e 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;
bbd30ac8 185}
186
a3439b27 187# Read and parse the current configuration file
188# (either config.php or config_default.php).
eaace00e 189while ( $line = <FILE> ) {
598294a7 190 $line =~ s/^\s+//;
eaace00e 191 $line =~ s/^\$//;
192 $var = $line;
193
194 $var =~ s/=/EQUALS/;
85645192 195 if ( $var =~ /^([a-z])/i ) {
eaace00e 196 @options = split ( /\s*EQUALS\s*/, $var );
85645192 197 $options[1] =~ s/[\n\r]//g;
198 $options[1] =~ s/[\'\"];\s*$//;
eaace00e 199 $options[1] =~ s/;$//;
85645192 200 $options[1] =~ s/^[\'\"]//;
ed65d11b 201 # de-escape escaped strings
202 $options[1] =~ s/\\'/'/g;
203 $options[1] =~ s/\\\\/\\/g;
eaace00e 204
82351c82 205 if ( $options[0] =~ /^user_themes\[[0-9]+\]\[['"]PATH['"]\]/ ) {
eaace00e 206 $sub = $options[0];
85645192 207 $sub =~ s/\]\[['"]PATH['"]\]//;
eaace00e 208 $sub =~ s/.*\[//;
82351c82 209 if ( -e "../css/" ) {
210 $options[1] =~ s/^\.\.\/config/\.\.\/css/;
a3439b27 211 }
82351c82 212 $user_theme_path[$sub] = &change_to_rel_path($options[1]);
213 } elsif ( $options[0] =~ /^user_themes\[[0-9]+\]\[['"]NAME['"]\]/ ) {
eaace00e 214 $sub = $options[0];
85645192 215 $sub =~ s/\]\[['"]NAME['"]\]//;
eaace00e 216 $sub =~ s/.*\[//;
82351c82 217 $user_theme_name[$sub] = $options[1];
83139c0b 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];
5e78e498 231 } elsif ( $options[0] =~ /^aTemplateSet\[[0-9]+\]\[['"]ID['"]\]/ ) {
85bacb8f 232 $sub = $options[0];
5e78e498 233 $sub =~ s/\]\[['"]ID['"]\]//;
85bacb8f 234 $sub =~ s/.*\[//;
235 if ( -e "../templates" ) {
236 $options[1] =~ s/^\.\.\/config/\.\.\/templates/;
237 }
5e78e498 238 $templateset_id[$sub] = $options[1];
649162c3 239##### FIXME: This section BELOW here so old prefs files don't blow up when running conf.pl
b4e8b4a3 240##### Remove after a month or two
649162c3 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
b4e8b4a3 250##### Remove after a month or two
85bacb8f 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];
a1b036d6 256 } elsif ( $options[0] =~ /^plugins\[[0-9]*\]/ ) {
eaace00e 257 $sub = $options[0];
258 $sub =~ s/\]//;
259 $sub =~ s/^plugins\[//;
a1b036d6 260 if ($sub eq '') {
261 push @plugins, $options[1];
262 } else {
263 $plugins[$sub] = $options[1];
264 }
81132de8 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];
e2409f9c 271 } elsif ( $options[0] =~ /^theme\[[0-9]+\]\[['"]PATH|NAME['"]\]/ ) {
9061389c 272 ##
273 ## $color themes are no longer supported. Please leave this
274 ## so conf.pl doesn't barf if it encounters a $theme.
275 ##
eaace00e 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
85645192 286 if ( $tmp =~ /^\s*[\'\"]host[\'\"]/i ) {
287 $tmp =~ s/^\s*[\'\"]host[\'\"]\s*=>\s*[\'\"]//i;
288 $tmp =~ s/[\'\"],?\s*$//;
289 $tmp =~ s/[\'\"]\);\s*$//;
eaace00e 290 $host = $tmp;
85645192 291 } elsif ( $tmp =~ /^\s*[\'\"]base[\'\"]/i ) {
292 $tmp =~ s/^\s*[\'\"]base[\'\"]\s*=>\s*[\'\"]//i;
293 $tmp =~ s/[\'\"],?\s*$//;
294 $tmp =~ s/[\'\"]\);\s*$//;
eaace00e 295 $base = $tmp;
85645192 296 } elsif ( $tmp =~ /^\s*[\'\"]charset[\'\"]/i ) {
297 $tmp =~ s/^\s*[\'\"]charset[\'\"]\s*=>\s*[\'\"]//i;
298 $tmp =~ s/[\'\"],?\s*$//;
299 $tmp =~ s/[\'\"]\);\s*$//;
eaace00e 300 $charset = $tmp;
85645192 301 } elsif ( $tmp =~ /^\s*[\'\"]port[\'\"]/i ) {
302 $tmp =~ s/^\s*[\'\"]port[\'\"]\s*=>\s*[\'\"]?//i;
303 $tmp =~ s/[\'\"]?,?\s*$//;
304 $tmp =~ s/[\'\"]?\);\s*$//;
eaace00e 305 $port = $tmp;
85645192 306 } elsif ( $tmp =~ /^\s*[\'\"]maxrows[\'\"]/i ) {
307 $tmp =~ s/^\s*[\'\"]maxrows[\'\"]\s*=>\s*[\'\"]?//i;
308 $tmp =~ s/[\'\"]?,?\s*$//;
309 $tmp =~ s/[\'\"]?\);\s*$//;
eaace00e 310 $maxrows = $tmp;
43397658 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;
85645192 316 } elsif ( $tmp =~ /^\s*[\'\"]name[\'\"]/i ) {
317 $tmp =~ s/^\s*[\'\"]name[\'\"]\s*=>\s*[\'\"]//i;
318 $tmp =~ s/[\'\"],?\s*$//;
319 $tmp =~ s/[\'\"]\);\s*$//;
eaace00e 320 $name = $tmp;
85645192 321 } elsif ( $tmp =~ /^\s*[\'\"]binddn[\'\"]/i ) {
322 $tmp =~ s/^\s*[\'\"]binddn[\'\"]\s*=>\s*[\'\"]//i;
323 $tmp =~ s/[\'\"],?\s*$//;
324 $tmp =~ s/[\'\"]\);\s*$//;
30e9932c 325 $binddn = $tmp;
85645192 326 } elsif ( $tmp =~ /^\s*[\'\"]bindpw[\'\"]/i ) {
327 $tmp =~ s/^\s*[\'\"]bindpw[\'\"]\s*=>\s*[\'\"]//i;
328 $tmp =~ s/[\'\"],?\s*$//;
329 $tmp =~ s/[\'\"]\);\s*$//;
30e9932c 330 $bindpw = $tmp;
85645192 331 } elsif ( $tmp =~ /^\s*[\'\"]protocol[\'\"]/i ) {
332 $tmp =~ s/^\s*[\'\"]protocol[\'\"]\s*=>\s*[\'\"]?//i;
333 $tmp =~ s/[\'\"]?,?\s*$//;
334 $tmp =~ s/[\'\"]?\);\s*$//;
30e9932c 335 $protocol = $tmp;
43397658 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;
327e2d96 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;
664fd7a0 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;
593370a4 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;
eaace00e 361 }
a3439b27 362 }
eaace00e 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;
43397658 368 $ldap_filter[$sub] = $filter;
eaace00e 369 $ldap_charset[$sub] = $charset;
30e9932c 370 $ldap_binddn[$sub] = $binddn;
371 $ldap_bindpw[$sub] = $bindpw;
372 $ldap_protocol[$sub] = $protocol;
43397658 373 $ldap_limit_scope[$sub] = $limit_scope;
327e2d96 374 $ldap_listing[$sub] = $listing;
664fd7a0 375 $ldap_writeable[$sub] = $writeable;
593370a4 376 $ldap_search_tree[$sub] = $search_tree;
377 $ldap_starttls[$sub] = $starttls;
83139c0b 378 } elsif ( $options[0] =~ /^(data_dir|attachment_dir|org_logo|signout_page|icon_theme_def)$/ ) {
8bd9e0dd 379 ${ $options[0] } = &change_to_rel_path($options[1]);
eaace00e 380 } else {
381 ${ $options[0] } = $options[1];
382 }
383 }
bbd30ac8 384}
1a7a2fcc 385close FILE;
0ae4c1f2 386
d81572f7 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
a15f9d93 395# FIXME: unknown introduction date
35aaf666 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 );
783e926e 399$pop_before_smtp_host = '' if ( !$pop_before_smtp_host );
35aaf666 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 );
35aaf666 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 );
5810acfa 413$provider_name = '' if ( !$provider_name || $provider_name eq 'SquirrelMail');
35aaf666 414$no_list_for_subscribe = 'false' if ( !$no_list_for_subscribe );
415$allow_charset_search = 'true' if ( !$allow_charset_search );
66bfb27b 416$allow_advanced_search = 0 if ( !$allow_advanced_search) ;
35aaf666 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 );
a15f9d93 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
beebd508 424# since 1.2.0
425$hide_sm_attributions = 'false' if ( !$hide_sm_attributions );
a2aa472a 426# since 1.2.5
427$edit_identity = 'true' if ( !$edit_identity );
428$edit_name = 'true' if ( !$edit_name );
3f7a756d 429# since 1.4.23/1.5.2
430$edit_reply_to = 'true' if ( !$edit_reply_to );
beebd508 431
a15f9d93 432# since 1.4.0
35aaf666 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 );
81132de8 437
e036ff69 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
71d3f882 444# since 1.5.0
35aaf666 445$show_alternative_names = 'false' if ( !$show_alternative_names );
5ba5dc8e 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 );
f03f6ee7 449$aggressive_decoding = 'false' if ( !$aggressive_decoding );
ca885a4f 450# available only in 1.5.0 and 1.5.1
451# $advanced_tree = 'false' if ( !$advanced_tree );
35aaf666 452$use_php_recode = 'false' if ( !$use_php_recode );
453$use_php_iconv = 'false' if ( !$use_php_iconv );
775a1f52 454$buffer_output = 'false' if ( !$buffer_output );
81132de8 455
71d3f882 456# since 1.5.1
457$use_icons = 'false' if ( !$use_icons );
ef6ad2a1 458$use_iframe = 'false' if ( !$use_iframe );
71d3f882 459$lossy_encoding = 'false' if ( !$lossy_encoding );
460$allow_remote_configtest = 'false' if ( !$allow_remote_configtest );
061108dc 461$secured_config = 'true' if ( !$secured_config );
8f557b94 462$sq_https_port = 443 if ( !$sq_https_port );
463$sq_ignore_http_x_forwarded_headers = 'true' if ( !$sq_ignore_http_x_forwarded_headers );
1888b1bf 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
71d3f882 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 );
432db2fc 476$encode_header_key = '' if ( !$encode_header_key );
477$hide_auth_header = 'false' if ( !$hide_auth_header );
ee20a285 478$time_zone_type = '0' if ( !$time_zone_type );
06316c07 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 );
81132de8 482
fd7ab795 483# add qmail-inject test here for backwards compatibility
85bacb8f 484if ( !$sendmail_args && $sendmail_path =~ /qmail-inject/ ) {
fd7ab795 485 $sendmail_args = '';
486} elsif ( !$sendmail_args ) {
487 $sendmail_args = '-i -t';
488}
39d3ec89 489
81132de8 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
801da708 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 );
81132de8 503
7311c377 504# since 1.5.2
505$abook_file_line_length = 2048 if ( !$abook_file_line_length );
3dc5d88f 506$config_location_base = '' if ( !$config_location_base );
029d1fc2 507$smtp_sitewide_user = '' if ( !$smtp_sitewide_user );
508$smtp_sitewide_pass = '' if ( !$smtp_sitewide_pass );
9061389c 509$icon_theme_def = '' if ( !$icon_theme_def );
93d67e0d 510$disable_plugins = 'false' if ( !$disable_plugins );
511$disable_plugins_user = '' if ( !$disable_plugins_user );
9c0f1780 512$only_secure_cookies = 'true' if ( !$only_secure_cookies );
d555f507 513$disable_security_tokens = 'false' if ( !$disable_security_tokens );
514$check_referrer = '' if ( !$check_referrer );
209e24bb 515$ask_user_info = 'true' if ( !$ask_user_info );
6ab8321f 516$use_transparent_security_image = 'true' if ( !$use_transparent_security_image );
9ae70b62 517$display_imap_login_error = 'false' if ( !$display_imap_login_error );
83d6bb4b 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 );
7311c377 521
eaace00e 522if ( $ARGV[0] eq '--install-plugin' ) {
523 print "Activating plugin " . $ARGV[1] . "\n";
fb98dfcf 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 }
eaace00e 532} elsif ( $ARGV[0] eq '--remove-plugin' ) {
533 print "Removing plugin " . $ARGV[1] . "\n";
ebd13f55 534 foreach $plugin (@plugins) {
eaace00e 535 if ( $plugin ne $ARGV[1] ) {
536 push @newplugins, $plugin;
ebd13f55 537 }
538 }
539 @plugins = @newplugins;
540 save_data();
541 exit(0);
091ee417 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);
ebd13f55 556}
557
7a4f9bfb 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" .
a798d8b2 572 " uw = University of Washington's IMAP server\n" .
573 " gmail = IMAP access to Google mail (Gmail) accounts\n";
7a4f9bfb 574
5b6ae78a 575#####################################################################################
eaace00e 576if ( $config_use_color == 1 ) {
021044ec 577 $WHT = "\x1B[1m";
eaace00e 578 $NRM = "\x1B[0m";
0ecb47e5 579} else {
eaace00e 580 $WHT = "";
581 $NRM = "";
582 $config_use_color = 2;
583}
584
af5de065 585# lists can be printed in more than one column; default is just one
586#
587$columns = 1;
eec03d8c 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}
af5de065 602
8b5c49cd 603while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
f8c17cdd 604 clear_screen();
eaace00e 605 print $WHT. "SquirrelMail Configuration : " . $NRM;
606 if ( $config == 1 ) { print "Read: config.php"; }
607 elsif ( $config == 2 ) { print "Read: config_default.php"; }
34aa9765 608 print "\nConfig version $print_config_version; SquirrelMail version $sm_version\n";
eaace00e 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";
348610ca 617 print "5. User Interface\n";
4272758c 618 print "6. Address Books\n";
eaace00e 619 print "7. Message of the Day (MOTD)\n";
620 print "8. Plugins\n";
621 print "9. Database\n";
598294a7 622 print "10. Language settings\n";
623 print "11. Tweaks\n";
eaace00e 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;
b6e0c3b6 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";
39d3ec89 634 print "6. Top Frame : $WHT$frame_top$NRM\n";
635 print "7. Provider link : $WHT$provider_uri$NRM\n";
5810acfa 636 print "8. Provider link text : $WHT$provider_name$NRM\n";
0ae4c1f2 637
eaace00e 638 print "\n";
dcc1cc82 639 print "R Return to Main Menu\n";
eaace00e 640 } elsif ( $menu == 2 ) {
47a29326 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";
35aaf666 647 if ( lc($useSendmail) eq 'true' ) {
eaace00e 648 print "Sendmail";
649 } else {
650 print "SMTP";
651 }
652 print "$NRM\n";
47a29326 653 print "\n";
598294a7 654
47a29326 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";
2b4a868c 660 print "7. Secure IMAP (TLS) : $WHT" . display_use_tls($use_imap_tls) . "$NRM\n";
47a29326 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 ) {
35aaf666 665 if ( lc($useSendmail) eq 'true' ) {
47a29326 666 print $WHT . "Sendmail" . $NRM . "\n--------\n";
667 print "4. Sendmail Path : $WHT$sendmail_path$NRM\n";
fd7ab795 668 print "5. Sendmail arguments : $WHT$sendmail_args$NRM\n";
669 print "6. Header encryption key : $WHT$encode_header_key$NRM\n";
47a29326 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";
029d1fc2 676 print "7. SMTP Authentication : $WHT$smtp_auth_mech" . display_smtp_sitewide_userpass() ."$NRM\n";
2b4a868c 677 print "8. Secure SMTP (TLS) : $WHT" . display_use_tls($use_smtp_tls) . "$NRM\n";
432db2fc 678 print "9. Header encryption key : $WHT$encode_header_key$NRM\n";
47a29326 679 print "\n";
680 }
eaace00e 681 }
47a29326 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";
598294a7 688 }
47a29326 689 if ($show_smtp_settings == 0) {
35aaf666 690 if ( lc($useSendmail) eq 'true' ) {
47a29326 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 {
598294a7 700 print "H. Hide " .
701 ($show_imap_settings ? "IMAP Server" :
35aaf666 702 (lc($useSendmail) eq 'true') ? "Sendmail" : "SMTP") . " Settings\n";
47a29326 703 }
598294a7 704
eaace00e 705 print "\n";
dcc1cc82 706 print "R Return to Main Menu\n";
eaace00e 707 } elsif ( $menu == 3 ) {
708 print $WHT. "Folder Defaults\n" . $NRM;
bcd3bed7 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";
eaace00e 727 print "\n";
dcc1cc82 728 print "R Return to Main Menu\n";
eaace00e 729 } elsif ( $menu == 4 ) {
730 print $WHT. "General Options\n" . $NRM;
9c0f1780 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";
3f7a756d 741 print " Allow editing of reply-to : $WHT$edit_reply_to$NRM\n";
9c0f1780 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";
d555f507 751 print "18. Disable secure forms : $WHT$disable_security_tokens$NRM\n";
752 print "19. Page referal requirement : $WHT$check_referrer$NRM\n";
6ab8321f 753 print "20. Security image : $WHT" . (lc($use_transparent_security_image) eq 'true' ? 'Transparent' : 'Textual') . "$NRM\n";
9ae70b62 754 print "21. Display login error from IMAP: $WHT$display_imap_login_error$NRM\n";
83d6bb4b 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";
eaace00e 758 print "\n";
dcc1cc82 759 print "R Return to Main Menu\n";
eaace00e 760 } elsif ( $menu == 5 ) {
348610ca 761 print $WHT. "User Interface\n" . $NRM;
83139c0b 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";
52bc19ad 765 print "3. Manage template sets (skins)\n";
83139c0b 766 print "4. Manage user themes\n";
767 print "5. Manage font sets\n";
768 print "6. Manage icon themes\n";
85bacb8f 769
eaace00e 770 print "\n";
dcc1cc82 771 print "R Return to Main Menu\n";
eaace00e 772 } elsif ( $menu == 6 ) {
4272758c 773 print $WHT. "Address Books\n" . $NRM;
774 print "1. Change LDAP Servers\n";
eaace00e 775 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
776 print " > $ldap_host[$count]\n";
777 }
71d3f882 778 print "2. Use Javascript address book search : $WHT$default_use_javascript_addr_book$NRM\n";
ee20a285 779 print "3. Global address book file : $WHT$abook_global_file$NRM\n";
4272758c 780 print "4. Allow writing into global file address book : $WHT$abook_global_file_writeable$NRM\n";
71d3f882 781 print "5. Allow listing of global file address book : $WHT$abook_global_file_listing$NRM\n";
7311c377 782 print "6. Allowed address book line length : $WHT$abook_file_line_length$NRM\n";
eaace00e 783 print "\n";
dcc1cc82 784 print "R Return to Main Menu\n";
eaace00e 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";
dcc1cc82 791 print "R Return to Main Menu\n";
eaace00e 792 } elsif ( $menu == 8 ) {
93d67e0d 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 }
eaace00e 800 print " Installed Plugins\n";
af5de065 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 }
184e94a3 813 }
eaace00e 814 }
815 print "\n Available Plugins:\n";
816 opendir( DIR, "../plugins" );
52bc19ad 817 @files = sort(readdir(DIR));
eaace00e 818 $pos = 0;
819 @unused_plugins = ();
820 for ( $i = 0 ; $i <= $#files ; $i++ ) {
a0fa595d 821 if ( -d "../plugins/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne ".svn" ) {
eaace00e 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 }
1a7a2fcc 832 }
eaace00e 833 }
834
af5de065 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 }
184e94a3 846 }
eaace00e 847 }
848 closedir DIR;
849
eaace00e 850 print "\n";
93d67e0d 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";
dcc1cc82 859 print "R Return to Main Menu\n";
af5de065 860 print "C# List plugins in <#> number of columns\n";
eec03d8c 861 print "W# Change screen width to <#> (currently $screen_width)\n";
eaace00e 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";
99a6c222 866 print "\n";
eaace00e 867 print "3. DSN for Preferences : $WHT$prefs_dsn$NRM\n";
868 print "4. Table for Preferences : $WHT$prefs_table$NRM\n";
06316c07 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";
eaace00e 872 print "\n";
30e9932c 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";
dcc1cc82 878 print "R Return to Main Menu\n";
39d3ec89 879 } elsif ( $menu == 10 ) {
af5de065 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";
dcc1cc82 887 print "R Return to Main Menu\n";
39d3ec89 888 } elsif ( $menu == 11 ) {
af5de065 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";
775a1f52 896 print "6. Buffer all output : $WHT$buffer_output$NRM\n";
af5de065 897 print "\n";
898 print $WHT. "Configuration tweaks\n" . $NRM;
775a1f52 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";
8f557b94 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";
af5de065 904 print "\n";
dcc1cc82 905 print "R Return to Main Menu\n";
eaace00e 906 }
907 if ( $config_use_color == 1 ) {
1ef64acb 908 print "C Turn color off\n";
eaace00e 909 } else {
1ef64acb 910 print "C Turn color on\n";
eaace00e 911 }
dcc1cc82 912 print "S Save data\n";
913 print "Q Quit\n";
eaace00e 914
915 print "\n";
916 print "Command >> " . $WHT;
917 $command = <STDIN>;
85645192 918 $command =~ s/[\n\r]//g;
eaace00e 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;
021044ec 944 $WHT = "\x1B[1m";
eaace00e 945 $NRM = "\x1B[0m";
946 }
af5de065 947 } elsif ( $command =~ /^w([0-9]+)/ ) {
948 $screen_width = $1;
eaace00e 949 } elsif ( $command eq "d" && $menu == 0 ) {
950 set_defaults();
951 } else {
952 $saved = 0;
953 if ( $menu == 0 ) {
39d3ec89 954 if ( ( $command > 0 ) && ( $command < 12 ) ) {
eaace00e 955 $menu = $command;
1a7a2fcc 956 }
eaace00e 957 } elsif ( $menu == 1 ) {
958 if ( $command == 1 ) { $org_name = command1(); }
959 elsif ( $command == 2 ) { $org_logo = command2(); }
b6e0c3b6 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(); }
39d3ec89 963 elsif ( $command == 6 ) { $frame_top = command6(); }
964 elsif ( $command == 7 ) { $provider_uri = command7(); }
965 elsif ( $command == 8 ) { $provider_name = command8(); }
0ae4c1f2 966
eaace00e 967 } elsif ( $menu == 2 ) {
47a29326 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(); }
b47821fb 979 elsif ( $command == 6 ) { $imap_auth_mech = command112a(); }
a15f9d93 980 elsif ( $command == 7 ) { $use_imap_tls = command_use_tls("IMAP",$use_imap_tls); }
47a29326 981 elsif ( $command == 8 ) { $imap_server_type = command19(); }
982 elsif ( $command == 9 ) { $optional_delimiter = command111(); }
35aaf666 983 } elsif ( $show_smtp_settings && lc($useSendmail) eq 'true' ) {
432db2fc 984 if ( $command == 4 ) { $sendmail_path = command15(); }
fd7ab795 985 elsif ( $command == 5 ) { $sendmail_args = command_sendmail_args(); }
986 elsif ( $command == 6 ) { $encode_header_key = command114(); }
47a29326 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(); }
b47821fb 991 elsif ( $command == 7 ) { $smtp_auth_mech = command112b(); }
a15f9d93 992 elsif ( $command == 8 ) { $use_smtp_tls = command_use_tls("SMTP",$use_smtp_tls); }
432db2fc 993 elsif ( $command == 9 ) { $encode_header_key = command114(); }
47a29326 994 }
eaace00e 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(); }
ca85aabe 1013 elsif ( $command == 18 ) { $noselect_fix_enable = command216(); }
eaace00e 1014 } elsif ( $menu == 4 ) {
39d3ec89 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(); }
ee20a285 1023 elsif ( $command == 9 ) { $edit_identity = command310(); }
11e00010 1024 elsif ( $command == 10 ) { $disable_thread_sort = command312(); }
1025 elsif ( $command == 11 ) { $disable_server_sort = command313(); }
39d3ec89 1026 elsif ( $command == 12 ) { $allow_charset_search = command314(); }
de74555e 1027 elsif ( $command == 13 ) { $allow_advanced_search = command316(); }
1028 elsif ( $command == 14 ) { $session_name = command317(); }
ee20a285 1029 elsif ( $command == 15 ) { $time_zone_type = command318(); }
3dc5d88f 1030 elsif ( $command == 16 ) { $config_location_base = command_config_location_base(); }
9c0f1780 1031 elsif ( $command == 17 ) { $only_secure_cookies = command319(); }
d555f507 1032 elsif ( $command == 18 ) { $disable_security_tokens = command320(); }
1033 elsif ( $command == 19 ) { $check_referrer = command321(); }
6ab8321f 1034 elsif ( $command == 20 ) { $use_transparent_security_image = command322(); }
9ae70b62 1035 elsif ( $command == 21 ) { $display_imap_login_error = command323(); }
83d6bb4b 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(); }
eaace00e 1039 } elsif ( $menu == 5 ) {
83139c0b 1040 if ( $command == 1 ) { $use_icons = commandB3(); }
775a1f52 1041# elsif ( $command == 3 ) { $icon_theme_def = command53(); }
83139c0b 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(); }
eaace00e 1047 } elsif ( $menu == 6 ) {
1048 if ( $command == 1 ) { command61(); }
1049 elsif ( $command == 2 ) { command62(); }
4272758c 1050 elsif ( $command == 3 ) { $abook_global_file=command63(); }
1051 elsif ( $command == 4 ) { command64(); }
71d3f882 1052 elsif ( $command == 5 ) { command65(); }
7311c377 1053 elsif ( $command == 6 ) { command_abook_file_line_length(); }
eaace00e 1054 } elsif ( $menu == 7 ) {
1055 if ( $command == 1 ) { $motd = command71(); }
1056 } elsif ( $menu == 8 ) {
af5de065 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; }
eaace00e 1062 } elsif ( $menu == 9 ) {
99a6c222 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(); }
30e9932c 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(); }
39d3ec89 1074 } elsif ( $menu == 10 ) {
1075 if ( $command == 1 ) { $squirrelmail_default_language = commandA1(); }
5ba5dc8e 1076 elsif ( $command == 2 ) { $default_charset = commandA2(); }
dcc1cc82 1077 elsif ( $command == 3 ) { $show_alternative_names = commandA3(); }
5ba5dc8e 1078 elsif ( $command == 4 ) { $aggressive_decoding = commandA4(); }
1079 elsif ( $command == 5 ) { $lossy_encoding = commandA5(); }
39d3ec89 1080 } elsif ( $menu == 11 ) {
ca885a4f 1081 if ( $command == 1 ) { $use_iframe = commandB2(); }
209e24bb 1082 elsif ( $command == 2 ) { $ask_user_info = command_ask_user_info(); }
72bf0ae7 1083 elsif ( $command == 4 ) { $use_php_recode = commandB4(); }
1084 elsif ( $command == 5 ) { $use_php_iconv = commandB5(); }
775a1f52 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(); }
8f557b94 1089 elsif ( $command == 10 ) { $sq_https_port = commandB10(); }
1090 elsif ( $command == 11 ) { $sq_ignore_http_x_forwarded_headers = commandB11(); }
eaace00e 1091 }
1092 }
828b4753 1093}
1094
cbd6543c 1095# we exit here
1096print "\nExiting conf.pl.\n".
35aaf666 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";
cbd6543c 1100
1101
828b4753 1102####################################################################################
1103
5b6ae78a 1104# org_name
1105sub command1 {
eaace00e 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";
360ef370 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";
360ef370 1113 print "\n";
eaace00e 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 {
85645192 1119 $new_org_name =~ s/[\r\n]//g;
35aaf666 1120 $new_org_name =~ s/\"/&quot;/g;
eaace00e 1121 }
1122 return $new_org_name;
5b6ae78a 1123}
1124
1125# org_logo
1126sub command2 {
eaace00e 1127 print "Your organization's logo is an image that will be displayed at\n";
25be56ab 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";
a3bb5005 1135 print " e.g. http://example.com/images/mylogo.gif or /images/mylogo.jpg\n";
eaace00e 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 {
85645192 1142 $new_org_logo =~ s/[\r\n]//g;
eaace00e 1143 }
1144 return $new_org_logo;
5b6ae78a 1145}
1146
b6e0c3b6 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 }
0e21688d 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!
e03345e1 1163 if( $new_org_logo_height eq '' ) {
35aaf666 1164 $new_org_logo_height = $org_logo_height;
1165 }
00c4b08d 1166 } else {
0e21688d 1167 $new_org_logo_height = 0;
b6e0c3b6 1168 }
1169 return ($new_org_logo_width, $new_org_logo_height);
1170}
1171
5b6ae78a 1172# org_title
1173sub command3 {
eaace00e 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";
360ef370 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";
360ef370 1181 print "\n";
eaace00e 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 {
85645192 1187 $new_org_title =~ s/[\r\n]//g;
35aaf666 1188 $new_org_title =~ s/\"/\'/g;
eaace00e 1189 }
1190 return $new_org_title;
5b6ae78a 1191}
5b6ae78a 1192
f923b93d 1193# signout_page
1194sub command4 {
eaace00e 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 {
85645192 1205 $new_signout_page =~ s/[\r\n]//g;
eaace00e 1206 $new_signout_page =~ s/^\s+$//g;
1207 }
1208 return $new_signout_page;
6ef7145f 1209}
1210
80e86e94 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>;
eaace00e 1219 if ( $new_frame_top eq "\n" ) {
80e86e94 1220 $new_frame_top = '_top';
1221 } else {
85645192 1222 $new_frame_top =~ s/[\r\n]//g;
80e86e94 1223 $new_frame_top =~ s/^\s+$//g;
1224 }
1225 return $new_frame_top;
1226}
1227
0ae4c1f2 1228# Default link to provider
1229sub command7 {
5810acfa 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";
0ae4c1f2 1232 print "\n";
1233 print "[$WHT$provider_uri$NRM]: $WHT";
1234 $new_provider_uri = <STDIN>;
1235 if ( $new_provider_uri eq "\n" ) {
8b5c49cd 1236 $new_provider_uri = '';
0ae4c1f2 1237 } else {
85645192 1238 $new_provider_uri =~ s/[\r\n]//g;
0ae4c1f2 1239 $new_provider_uri =~ s/^\s+$//g;
1240 }
7b6563c0 1241 return $new_provider_uri;
0ae4c1f2 1242}
1243
1244sub command8 {
5810acfa 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";
0ae4c1f2 1247 print "\n";
1248 print "[$WHT$provider_name$NRM]: $WHT";
1249 $new_provider_name = <STDIN>;
1250 if ( $new_provider_name eq "\n" ) {
5810acfa 1251 $new_provider_name = '';
0ae4c1f2 1252 } else {
85645192 1253 $new_provider_name =~ s/[\r\n]//g;
0ae4c1f2 1254 $new_provider_name =~ s/^\s+$//g;
26eed4f7 1255 $new_provider_name =~ s/\'/\\'/g;
0ae4c1f2 1256 }
7b6563c0 1257 return $new_provider_name;
0ae4c1f2 1258}
1259
828b4753 1260####################################################################################
5b6ae78a 1261
828b4753 1262# domain
1263sub command11 {
e1e4f932 1264 print "The domain name is the suffix at the end of all email addresses. If\n";
5d28b77e 1265 print "for example, your email address is jdoe\@example.com, then your domain\n";
1266 print "would be example.com.\n";
eaace00e 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 {
da9e7627 1273 $new_domain =~ s/\s//g;
eaace00e 1274 }
1275 return $new_domain;
828b4753 1276}
5b6ae78a 1277
828b4753 1278# imapServerAddress
1279sub command12 {
47a29326 1280 print "This is the hostname where your IMAP server can be contacted.\n";
eaace00e 1281 print "[$WHT$imapServerAddress$NRM]: $WHT";
1282 $new_imapServerAddress = <STDIN>;
1283 if ( $new_imapServerAddress eq "\n" ) {
1284 $new_imapServerAddress = $imapServerAddress;
1285 } else {
85645192 1286 $new_imapServerAddress =~ s/[\r\n]//g;
eaace00e 1287 }
1288 return $new_imapServerAddress;
828b4753 1289}
5b6ae78a 1290
828b4753 1291# imapPort
1292sub command13 {
eaace00e 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 {
85645192 1299 $new_imapPort =~ s/[\r\n]//g;
eaace00e 1300 }
1301 return $new_imapPort;
828b4753 1302}
1303
1304# useSendmail
1305sub command14 {
eaace00e 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";
35aaf666 1309 if ( lc($useSendmail) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 1321 $useSendmail = 'true';
eaace00e 1322 } else {
35aaf666 1323 $useSendmail = 'false';
eaace00e 1324 }
1325 return $useSendmail;
828b4753 1326}
5b6ae78a 1327
828b4753 1328# sendmail_path
1329sub command15 {
eaace00e 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 {
85645192 1336 $new_sendmail_path =~ s/[\r\n]//g;
eaace00e 1337 }
1338 return $new_sendmail_path;
828b4753 1339}
5b6ae78a 1340
fd7ab795 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";
85bacb8f 1349 print "empty string or use arguments suitable for your mailer.\n";
fd7ab795 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
828b4753 1362# smtpServerAddress
1363sub command16 {
47a29326 1364 print "This is the hostname of your SMTP server.\n";
eaace00e 1365 print "[$WHT$smtpServerAddress$NRM]: $WHT";
1366 $new_smtpServerAddress = <STDIN>;
1367 if ( $new_smtpServerAddress eq "\n" ) {
1368 $new_smtpServerAddress = $smtpServerAddress;
1369 } else {
85645192 1370 $new_smtpServerAddress =~ s/[\r\n]//g;
eaace00e 1371 }
1372 return $new_smtpServerAddress;
828b4753 1373}
1374
1375# smtpPort
1376sub command17 {
eaace00e 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 {
85645192 1383 $new_smtpPort =~ s/[\r\n]//g;
eaace00e 1384 }
1385 return $new_smtpPort;
bbd30ac8 1386}
d2f4c914 1387
2044f95a 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';
35aaf666 1394 $YesNo = 'y' if ( lc($pop_before_smtp) eq 'true' );
2044f95a 1395
783e926e 1396 print "Use POP before SMTP (y/n) [$WHT$YesNo$NRM]: $WHT";
2044f95a 1397
1398 $new_pop_before_smtp = <STDIN>;
1399 $new_pop_before_smtp =~ tr/yn//cd;
783e926e 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;
2044f95a 1428}
1429
598294a7 1430# imap_server_type
d2f4c914 1431sub command19 {
eaace00e 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";
7a4f9bfb 1438 print $list_supported_imap_servers;
a33764f6 1439 print "\n";
b39825f0 1440 print " other = Not one of the above servers\n";
a33764f6 1441 print "\n";
eaace00e 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 {
85645192 1448 $new_imap_server_type =~ s/[\r\n]//g;
eaace00e 1449 }
1450 return $new_imap_server_type;
a93b12ba 1451}
3f8fe68e 1452
d47b2518 1453# invert_time
d2f4c914 1454sub command110 {
eaace00e 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';
35aaf666 1465 $YesNo = 'y' if ( lc($invert_time) eq 'true' );
eaace00e 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;
35aaf666 1471 return 'true' if ( $new_invert_time eq "y" );
1472 return 'false' if ( $new_invert_time eq "n" );
eaace00e 1473 return $invert_time;
1474}
d47b2518 1475
d2f4c914 1476sub command111 {
eaace00e 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 {
85645192 1490 $new_optional_delimiter =~ s/[\r\n]//g;
eaace00e 1491 }
1492 return $new_optional_delimiter;
40ba4d36 1493}
b47821fb 1494# IMAP authentication type
33feaaec 1495# Possible values: login, plain, cram-md5, digest-md5
b47821fb 1496# Now offers to detect supported mechs, assuming server & port are set correctly
1497
1498sub command112a {
61e49023 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";
80e3fcf8 1504 } else {
35aaf666 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 }
80e3fcf8 1525 } else {
35aaf666 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 }
598294a7 1540
35aaf666 1541 }
598294a7 1542 }
35aaf666 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";
33feaaec 1545 print $WHT . "plain" . $NRM . " - SASL PLAIN. If you need this, you already know it.\n";
35aaf666 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";
b47821fb 1551 $inval=<STDIN>;
1552 chomp($inval);
33feaaec 1553 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || ($inval =~ /^login\b/i) || ($inval =~ /^plain\b/i)) {
b47821fb 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}
40ba4d36 1560
598294a7 1561
b47821fb 1562# SMTP authentication type
615b2793 1563# Possible choices: none, login, plain, cram-md5, digest-md5
b47821fb 1564sub command112b {
61e49023 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
80e3fcf8 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";
35aaf666 1571 print "Auto-detection is *optional* - you can safely say \"n\" here.\n";
80e3fcf8 1572 print "\nTry to detect auth mechanisms? [y/N]: ";
1573 $inval=<STDIN>;
1574 chomp($inval);
1575 if ($inval =~ /^y\b/i) {
35aaf666 1576 # Yes, let's try to detect.
1577 print "Trying to detect supported methods (SMTP)...\n";
598294a7 1578
35aaf666 1579 # Special case!
1580 # Check none by trying to relay to junk@microsoft.com
1581 $host = $smtpServerAddress . ':' . $smtpPort;
35aaf666 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 {
15dce5a6 1588 $got = <$sock>; # Discard greeting
5d28b77e 1589 print $sock "HELO $domain\r\n";
35aaf666 1590 $got = <$sock>; # Discard
5d28b77e 1591 print $sock "MAIL FROM:<tester\@squirrelmail.org>\r\n";
1592 $got = <$sock>; # Discard
1593 print $sock "RCPT TO:<junk\@microsoft.com\r\n";
35aaf666 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 }
5d28b77e 1600 print $sock "RSET\r\n";
1601 print $sock "QUIT\r\n";
35aaf666 1602 close $sock;
1603 }
615b2793 1604
35aaf666 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 }
598294a7 1617
615b2793 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
35aaf666 1631 # Try CRAM-MD5
80e3fcf8 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";
b47821fb 1642 }
598294a7 1643
80e3fcf8 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";
b47821fb 1655 }
598294a7 1656 }
80e3fcf8 1657 }
1658 print "\nWhat authentication mechanism do you want to use for SMTP connections?\n";
b47821fb 1659 print $WHT . "none" . $NRM . " - Your SMTP server does not require authorization.\n";
fe0b18b3 1660 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
615b2793 1661 print $WHT . "plain" . $NRM . " - SASL PLAIN. Plaintext. If you can do better, you probably should.\n";
639c7164 1662 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext.\n";
1663 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
fe0b18b3 1664 print $WHT . "\n*** YOUR SMTP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n" . $NRM;
b47821fb 1665 print "If you don't understand or are unsure, you probably want \"none\"\n\n";
615b2793 1666 print "none, login, plain, cram-md5, or digest-md5 [$WHT$smtp_auth_mech$NRM]: $WHT";
47a29326 1667 $inval=<STDIN>;
1668 chomp($inval);
b47821fb 1669 if ($inval =~ /^none\b/i) {
029d1fc2 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;
47a29326 1686 }
029d1fc2 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));
54b27c06 1694 if ($auth_mech eq 'none') {
029d1fc2 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';
7b899075 1703 print " [Y/n]:";
029d1fc2 1704 } else {
1705 $default = 'n';
7b899075 1706 print " [y/N]:";
029d1fc2 1707 }
1708 $tmp=<STDIN>;
1709 $tmp = trim($tmp);
1710
1711 if ($tmp eq '') {
1712 $tmp = $default;
47a29326 1713 } else {
029d1fc2 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";
8b56e282 1737 print "Click enter to continue\n";
029d1fc2 1738 $tmp = <STDIN>;
1739 }
1740 } else {
1741 print "Invalid input\n";
8b56e282 1742 print "Click enter to continue\n";
029d1fc2 1743 $tmp = <STDIN>;
47a29326 1744 }
1745}
1746
029d1fc2 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
47a29326 1760# TLS
1761# This sub is reused for IMAP and SMTP
1762# Args: service name, default value
a15f9d93 1763sub command_use_tls {
35aaf666 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";
a15f9d93 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";
35aaf666 1773 print "If it is remote, you may wish to seriously consider enabling this.\n";
a15f9d93 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 }
47a29326 1786 }
a15f9d93 1787 if ($inval ne '') {$default_val = $inval};
47a29326 1788 return $default_val;
35aaf666 1789}
47a29326 1790
2b4a868c 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
432db2fc 1804# $encode_header_key
a6519f05 1805sub command114 {
919b9d41 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";
432db2fc 1810 print "\n";
919b9d41 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";
432db2fc 1816 print "\n";
919b9d41 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";
432db2fc 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;
35aaf666 1831}
47a29326 1832
3f8fe68e 1833# MOTD
1834sub command71 {
eaace00e 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";
dcc1cc82 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";
eaace00e 1839
1840 $new_motd = "";
1841 do {
1842 print "] ";
1843 $line = <STDIN>;
85645192 1844 $line =~ s/[\r\n]//g;
eaace00e 1845 if ( $line ne "@" ) {
1846 $line =~ s/ /\&nbsp;\&nbsp;/g;
1847 $line =~ s/\t/\&nbsp;\&nbsp;\&nbsp;\&nbsp;/g;
1848 $line =~ s/$/ /;
8278a58d 1849 $line =~ s/\"/\\\"/g;
eaace00e 1850
1851 $new_motd = $new_motd . $line;
1852 }
1853 } while ( $line ne "@" );
1854 return $new_motd;
3f8fe68e 1855}
911ad01c 1856
9d0c7bee 1857################# PLUGINS ###################
1858
1859sub command81 {
85645192 1860 $command =~ s/[\s\n\r]*//g;
eaace00e 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++;
9d0c7bee 1871 }
eaace00e 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] );
eaace00e 1880 }
1881 $ct++;
9d0c7bee 1882 }
eaace00e 1883 @plugins = @newplugins;
1884 }
1885 }
1886 return @plugins;
1887}
9d0c7bee 1888
93d67e0d 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
911ad01c 1908################# FOLDERS ###################
1909
1910# default_folder_prefix
1911sub command21 {
eaace00e 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 {
d52532d5 1927 $new_default_folder_prefix =~ s/[\r\n]//g;
eaace00e 1928 }
d52532d5 1929 if ( ( $new_default_folder_prefix =~ /^\s*$/ ) || ( $new_default_folder_prefix =~ m/^none$/i ) ) {
eaace00e 1930 $new_default_folder_prefix = "";
1931 } else {
d52532d5 1932 # add the trailing delimiter only if we know what the server is.
ce9f808b 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')) {
d52532d5 1937 $new_default_folder_prefix =~ s/\.*$/\./;
ce9f808b 1938 } elsif ($imap_server_type eq 'uw' and
1939 $optional_delimiter eq 'detect') {
d52532d5 1940 $new_default_folder_prefix =~ s/\/*$/\//;
0e21688d 1941 }
eaace00e 1942 }
1943 return $new_default_folder_prefix;
911ad01c 1944}
1945
1946# Show Folder Prefix
1947sub command22 {
eaace00e 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
35aaf666 1959 if ( lc($show_prefix_option) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 1968 $show_prefix_option = 'true';
eaace00e 1969 } else {
35aaf666 1970 $show_prefix_option = 'false';
eaace00e 1971 }
1972 return $show_prefix_option;
911ad01c 1973}
1974
598294a7 1975# Trash Folder
f7b1b3b1 1976sub command23a {
eaace00e 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 {
5ef3253e 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 }
eaace00e 1997 }
1998 return $new_trash_folder;
911ad01c 1999}
2000
598294a7 2001# Sent Folder
f7b1b3b1 2002sub command23b {
eaace00e 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 {
5ef3253e 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 }
eaace00e 2022 }
2023 return $new_sent_folder;
911ad01c 2024}
2025
598294a7 2026# Draft Folder
f7b1b3b1 2027sub command23c {
eaace00e 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 {
5ef3253e 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 }
eaace00e 2048 }
2049 return $new_draft_folder;
f7b1b3b1 2050}
2051
598294a7 2052# default move to trash
f7b1b3b1 2053sub command24a {
eaace00e 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
35aaf666 2062 if ( lc($default_move_to_trash) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 2070 $default_move_to_trash = 'true';
eaace00e 2071 } else {
35aaf666 2072 $default_move_to_trash = 'false';
eaace00e 2073 }
2074 return $default_move_to_trash;
2f287147 2075}
2076
bcd3bed7 2077# default move to sent (save sent messages)
f7b1b3b1 2078sub command24b {
bcd3bed7 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";
eaace00e 2083 print "\n";
6517cfd0 2084 print "Sent folder is currently: $sent_folder\n";
eaace00e 2085 print "\n";
2086
35aaf666 2087 if ( lc($default_move_to_sent) eq 'true' ) {
eaace00e 2088 $default_value = "y";
2089 } else {
2090 $default_value = "n";
2091 }
bcd3bed7 2092 print "By default, save sent messages (y/n) [$WHT$default_value$NRM]: $WHT";
eaace00e 2093 $new_show = <STDIN>;
2094 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 2095 $default_move_to_sent = 'true';
eaace00e 2096 } else {
35aaf666 2097 $default_move_to_sent = 'false';
eaace00e 2098 }
2099 return $default_move_to_sent;
2f287147 2100}
2101
f7b1b3b1 2102# default save as draft
2103sub command24c {
eaace00e 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
bcd3bed7 2111 if ( lc($default_save_as_draft) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 2119 $default_save_as_draft = 'true';
eaace00e 2120 } else {
35aaf666 2121 $default_save_as_draft = 'false';
eaace00e 2122 }
2123 return $default_save_as_draft;
f7b1b3b1 2124}
2125
598294a7 2126# List special folders first
2f287147 2127sub command27 {
eaace00e 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
35aaf666 2135 if ( lc($list_special_folders_first) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 2144 $list_special_folders_first = 'true';
eaace00e 2145 } else {
35aaf666 2146 $list_special_folders_first = 'false';
eaace00e 2147 }
2148 return $list_special_folders_first;
911ad01c 2149}
2150
598294a7 2151# Show special folders color
2f287147 2152sub command28 {
eaace00e 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
35aaf666 2160 if ( lc($use_special_folder_color) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 2169 $use_special_folder_color = 'true';
eaace00e 2170 } else {
35aaf666 2171 $use_special_folder_color = 'false';
eaace00e 2172 }
2173 return $use_special_folder_color;
911ad01c 2174}
2175
598294a7 2176# Auto expunge
2f287147 2177sub command29 {
eaace00e 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
35aaf666 2185 if ( lc($auto_expunge) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 2193 $auto_expunge = 'true';
eaace00e 2194 } else {
35aaf666 2195 $auto_expunge = 'false';
eaace00e 2196 }
2197 return $auto_expunge;
911ad01c 2198}
2199
598294a7 2200# Default sub of inbox
2f287147 2201sub command210 {
eaace00e 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
35aaf666 2209 if ( lc($default_sub_of_inbox) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 2217 $default_sub_of_inbox = 'true';
eaace00e 2218 } else {
35aaf666 2219 $default_sub_of_inbox = 'false';
eaace00e 2220 }
2221 return $default_sub_of_inbox;
911ad01c 2222}
2223
598294a7 2224# Show contain subfolder option
2f287147 2225sub command211 {
eaace00e 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
35aaf666 2233 if ( lc($show_contain_subfolders_option) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 2241 $show_contain_subfolders_option = 'true';
eaace00e 2242 } else {
35aaf666 2243 $show_contain_subfolders_option = 'false';
eaace00e 2244 }
2245 return $show_contain_subfolders_option;
911ad01c 2246}
2247
598294a7 2248# Default Unseen Notify
24fc5dd2 2249sub command212 {
eaace00e 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>;
85645192 2260 if ( $new_show =~ /^[123]\n/i ) {
eaace00e 2261 $default_unseen_notify = $new_show;
2262 }
85645192 2263 $default_unseen_notify =~ s/[\r\n]//g;
eaace00e 2264 return $default_unseen_notify;
24fc5dd2 2265}
2266
598294a7 2267# Default Unseen Type
24fc5dd2 2268sub command213 {
eaace00e 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>;
85645192 2277 if ( $new_show =~ /^[12]\n/i ) {
eaace00e 2278 $default_unseen_type = $new_show;
2279 }
85645192 2280 $default_unseen_type =~ s/[\r\n]//g;
eaace00e 2281 return $default_unseen_type;
24fc5dd2 2282}
2283
f7bfc9de 2284# Auto create special folders
2285sub command214 {
eaace00e 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
35aaf666 2292 if ( lc($auto_create_special) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 2300 $auto_create_special = 'true';
eaace00e 2301 } else {
35aaf666 2302 $auto_create_special = 'false';
eaace00e 2303 }
2304 return $auto_create_special;
f7bfc9de 2305}
2306
598294a7 2307# Automatically delete folders
4e85a37f 2308sub command215 {
d04165f3 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";
98468fba 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";
8b56e282 2314 print "Press enter to continue...\n";
2eec12b5 2315 $new_delete = <STDIN>;
35aaf666 2316 $delete_folder = 'true';
598294a7 2317 } else {
d04165f3 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";
598294a7 2325 print "when changing this setting.\n\n";
d04165f3 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..
598294a7 2333 # we've changed the question to make it more clear,
2334 # and are here handling that to avoid changing the answers..
35aaf666 2335 if ( lc($delete_folder) eq 'true' ) {
2eec12b5 2336 $default_value = "n";
d04165f3 2337 } else {
2338 $default_value = "y";
2eec12b5 2339 }
d04165f3 2340 print "Send deleted folders to Trash? (y/n) [$WHT$default_value$NRM]: $WHT";
2eec12b5 2341 $new_delete = <STDIN>;
2342 if ( ( $new_delete =~ /^y\n/i ) || ( ( $new_delete =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 2343 $delete_folder = 'false';
d04165f3 2344 } else {
35aaf666 2345 $delete_folder = 'true';
2eec12b5 2346 }
eaace00e 2347 }
2348 return $delete_folder;
2349}
24fc5dd2 2350
ca85aabe 2351#noselect fix
2352sub command216 {
fc4447c3 2353 print "Some IMAP servers allow subfolders to exist even if the parent\n";
ca85aabe 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
35aaf666 2358 if ( lc($noselect_fix_enable) eq 'true' ) {
ca85aabe 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" ) ) ) {
35aaf666 2366 $noselect_fix_enable = 'true';
ca85aabe 2367 } else {
35aaf666 2368 $noselect_fix_enable = 'false';
ca85aabe 2369 }
2370 return $noselect_fix_enable;
2371}
ccfb2029 2372############# GENERAL OPTIONS #####################
2373
ccfb2029 2374# Data directory
3392dc86 2375sub command33a {
e6566358 2376 print "Specify the location for your data directory.\n";
368ab966 2377 print "You need to create this directory yourself.\n";
e6566358 2378 print "The path name can be absolute or relative (to the config directory).\n";
368ab966 2379 print "Here are two examples:\n";
2380 print " Absolute: /var/local/squirrelmail/data/\n";
598294a7 2381 print " Relative: ../data/\n";
8bd9e0dd 2382 print "Relative paths to directories outside of the SquirrelMail distribution\n";
e6566358 2383 print "will be converted to their absolute path equivalents in config.php.\n\n";
30e9932c 2384 print "Note: There are potential security risks with having a writeable directory\n";
e6566358 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";
2eec12b5 2387 print "in an alternate location of your choice. \n";
2388 print "\n";
2389
eaace00e 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 {
85645192 2395 $new_data_dir =~ s/[\r\n]//g;
eaace00e 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;
ccfb2029 2404}
2405
2406# Attachment directory
3392dc86 2407sub command33b {
eaace00e 2408 print "Path to directory used for storing attachments while a mail is\n";
368ab966 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";
e6566358 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";
eaace00e 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";
e6566358 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";
eaace00e 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 {
85645192 2435 $new_attachment_dir =~ s/[\r\n]//g;
eaace00e 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;
ccfb2029 2444}
2445
3392dc86 2446sub command33c {
eaace00e 2447 print "The directory hash level setting allows you to configure the level\n";
598294a7 2448 print "of hashing that SquirrelMail employs in your data and attachment\n";
eaace00e 2449 print "directories. This value must be an integer ranging from 0 to 4.\n";
598294a7 2450 print "When this value is set to 0, SquirrelMail will simply store all\n";
eaace00e 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 {
85645192 2466 $new_dir_hash_level =~ s/[\r\n]//g;
eaace00e 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;
3392dc86 2480}
ccfb2029 2481
2482sub command35 {
eaace00e 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 {
85645192 2492 $new_default_left_size =~ s/[\r\n]//g;
eaace00e 2493 }
2494 return $new_default_left_size;
ccfb2029 2495}
2496
985f7c88 2497sub command36 {
eaace00e 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
35aaf666 2504 if ( lc($force_username_lowercase) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 2512 return 'true';
eaace00e 2513 }
35aaf666 2514 return 'false';
985f7c88 2515}
2516
0d15cd19 2517sub command37 {
eaace00e 2518 print "";
2519 print "\n";
985f7c88 2520
35aaf666 2521 if ( lc($default_use_priority) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 2530 return 'true';
eaace00e 2531 }
35aaf666 2532 return 'false';
826b7f71 2533}
2534
eaace00e 2535sub command38 {
2536 print "";
2537 print "\n";
2538
d1aa5322 2539 if ( lc($hide_sm_attributions) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 2548 return 'true';
eaace00e 2549 }
35aaf666 2550 return 'false';
eaace00e 2551}
826b7f71 2552
8c21da0c 2553sub command39 {
eaace00e 2554 print "";
2555 print "\n";
2556
35aaf666 2557 if ( lc($default_use_mdn) eq 'true' ) {
eaace00e 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" ) ) ) {
35aaf666 2566 return 'true';
eaace00e 2567 }
35aaf666 2568 return 'false';
8c21da0c 2569}
2570
432db2fc 2571
8a7d0669 2572sub command310 {
85bacb8f 2573 print " In loosely managed environments, you may want to allow users
2574 to edit their full name and email address. In strictly managed
bb08da84 2575 environments, you may want to force users to use the name
2576 and email address assigned to them.
85bacb8f 2577
bb08da84 2578 'y' - allow a user to edit their full name and email address,
2579 'n' - users must use the assigned values.
85bacb8f 2580
bb08da84 2581 ";
eaace00e 2582
35aaf666 2583 if ( lc($edit_identity) eq 'true' ) {
8a7d0669 2584 $default_value = "y";
2585 } else {
2586 $default_value = "n";
2587 }
2eec12b5 2588 print "Allow editing of user's identity? (y/n) [$WHT$default_value$NRM]: $WHT";
8a7d0669 2589 $new_edit = <STDIN>;
eaace00e 2590 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 2591 $edit_identity = 'true';
2592 $edit_name = 'true';
3f7a756d 2593 $edit_reply_to = 'true';
2594 $hide_auth_header = command311c();
8a7d0669 2595 } else {
35aaf666 2596 $edit_identity = 'false';
2eec12b5 2597 $edit_name = command311();
3f7a756d 2598 $edit_reply_to = command311b();
2599 $hide_auth_header = command311c();
8a7d0669 2600 }
2601 return $edit_identity;
2602}
2603
2604sub command311 {
b6cbc7e0 2605 print "$NRM";
202d6445 2606 print "\n Given that users are not allowed to modify their
bb08da84 2607 email address, can they edit their full name?
85bacb8f 2608
bb08da84 2609 ";
8a7d0669 2610
35aaf666 2611 if ( lc($edit_name) eq 'true' ) {
8a7d0669 2612 $default_value = "y";
2613 } else {
2614 $default_value = "n";
2615 }
bb08da84 2616 print "Allow the user to edit their full name? (y/n) [$WHT$default_value$NRM]: $WHT";
8a7d0669 2617 $new_edit = <STDIN>;
eaace00e 2618 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 2619 $edit_name = 'true';
8a7d0669 2620 } else {
35aaf666 2621 $edit_name = 'false';
8a7d0669 2622 }
2623 return $edit_name;
2624}
8c21da0c 2625
432db2fc 2626sub command311b {
3f7a756d 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 {
b6cbc7e0 2649 print "$NRM";
ec79d5c6 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.
bb08da84 2653
d1d2eafd 2654 You can remove user information from this header (y) if you think
2655 that it violates privacy or security.
85bacb8f 2656
ec79d5c6 2657 Note: If users are allowed to change their email addresses, this
2658 setting will make it difficult to determine who sent what where.
bb08da84 2659 Use at your own risk.
85bacb8f 2660
2405c716 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
bb08da84 2666 ";
85bacb8f 2667
432db2fc 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 }
bb08da84 2680 return $hide_auth_header;
432db2fc 2681}
2682
7c612fdd 2683sub command312 {
0e3ece54 2684 print "This option allows you to disable server side thread sorting if your server \n";
801da708 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";
7c612fdd 2689 print "\n";
2690
801da708 2691 if ( lc($disable_thread_sort) eq 'true' ) {
7c612fdd 2692 $default_value = "y";
2693 } else {
2694 $default_value = "n";
2695 }
801da708 2696 print "Disable server side thread sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
11e00010 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';
7c612fdd 2700 } else {
11e00010 2701 $disable_thread_sort = 'false';
7c612fdd 2702 }
11e00010 2703 return $disable_thread_sort;
7c612fdd 2704}
2705
aa0da530 2706sub command313 {
0e3ece54 2707 print "This option allows you to disable server side sorting if your server declares \n";
801da708 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.";
aa0da530 2714 print "\n";
2715
11e00010 2716 if ( lc($disable_server_sort) eq 'true' ) {
aa0da530 2717 $default_value = "y";
2718 } else {
2719 $default_value = "n";
2720 }
801da708 2721 print "Disable server-side sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
11e00010 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';
aa0da530 2725 } else {
11e00010 2726 $disable_server_sort = 'false';
aa0da530 2727 }
11e00010 2728 return $disable_server_sort;
aa0da530 2729}
2730
65ffb3ce 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
35aaf666 2736 if ( lc($allow_charset_search) eq 'true' ) {
65ffb3ce 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" ) ) ) {
35aaf666 2744 $allow_charset_search = 'true';
65ffb3ce 2745 } else {
35aaf666 2746 $allow_charset_search = 'false';
65ffb3ce 2747 }
2748 return $allow_charset_search;
2749}
2750
4ecd3a70 2751# command315 (UID support) obsoleted.
3c7ee482 2752
de74555e 2753# advanced search option
6c499577 2754sub command316 {
66bfb27b 2755 print "This option allows you to control the use of advanced search form.\n";
0f1b00b8 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>;
85645192 2763 if ( $new_allow_advanced_search =~ /^[012]\n/i ) {
0f1b00b8 2764 $allow_advanced_search = $new_allow_advanced_search;
de74555e 2765 }
85645192 2766 $allow_advanced_search =~ s/[\r\n]//g;
66bfb27b 2767 return $allow_advanced_search;
de74555e 2768}
2769
2770
2771sub command317 {
35aaf666 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";
6c499577 2775 print "[$WHT$session_name$NRM]: $WHT";
2776 $new_session_name = <STDIN>;
35aaf666 2777 chomp($new_session_name);
6614128e 2778 if ( $new_session_name eq "" ) {
6c499577 2779 $new_session_name = $session_name;
2780 }
2781 return $new_session_name;
2782}
2783
ee20a285 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
1888b1bf 2795 print "Desired time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT";
ee20a285 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}
dcc1cc82 2807
74530cf4 2808# set the location base for redirects (since 1.5.2)
3dc5d88f 2809sub command_config_location_base {
74530cf4 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
9c0f1780 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
74530cf4 2852
d555f507 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
6ab8321f 2879# check_referrer (since 1.5.2)
d555f507 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
6ab8321f 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
9ae70b62 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
83d6bb4b 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 ####
83139c0b 3052sub command_userThemes {
82351c82 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";
3641f36d 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 }
9061389c 3079
3080 print "\n";
3641f36d 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";
9061389c 3089
3641f36d 3090 print "\n[user_themes] command (?=help) > ";
eaace00e 3091 $input = <STDIN>;
85645192 3092 $input =~ s/[\r\n]//g;
eaace00e 3093 while ( $input ne "d" ) {
3094 if ( $input =~ /^\s*l\s*/i ) {
3095 $count = 0;
82351c82 3096 while ( $count <= $#user_theme_name ) {
3097 if ( $count == $user_theme_default ) {
eaace00e 3098 print " *";
3099 } else {
3100 print " ";
3101 }
2eec12b5 3102 if ( $count < 10 ) {
3103 print " ";
3104 }
82351c82 3105 $name = $user_theme_name[$count];
2eec12b5 3106 $num_spaces = 35 - length($name);
eaace00e 3107 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
3108 $name = $name . " ";
3109 }
3110
3111 print " $count. $name";
82351c82 3112 print "($user_theme_path[$count])\n";
eaace00e 3113
3114 $count++;
ccfb2029 3115 }
eaace00e 3116 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
82351c82 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;
ccfb2029 3123 }
eaace00e 3124 } elsif ( $input =~ /^\s*\+/ ) {
82351c82 3125 print "What is the name of this theme? ";
eaace00e 3126 $name = <STDIN>;
85645192 3127 $name =~ s/[\r\n]//g;
83139c0b 3128 $user_theme_name[ $#user_theme_name + 1 ] = $name;
82351c82 3129 print "Be sure to put ../css/ before the filename.\n";
3130 print "What file is this stored in (ex: ../css/my_theme/): ";
eaace00e 3131 $name = <STDIN>;
85645192 3132 $name =~ s/[\r\n]//g;
82351c82 3133 $user_theme_path[ $#user_theme_path + 1 ] = $name;
eaace00e 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 {
82351c82 3140 $rem_num = $#user_theme_name;
ccfb2029 3141 }
82351c82 3142 if ( $rem_num == $user_theme_default ) {
eaace00e 3143 print "You cannot remove the default theme!\n";
3144 } else {
3145 $count = 0;
3146 @new_theme_name = ();
3147 @new_theme_path = ();
82351c82 3148 while ( $count <= $#user_theme_name ) {
eaace00e 3149 if ( $count != $rem_num ) {
82351c82 3150 @new_theme_name = ( @new_theme_name, $user_theme_name[$count] );
3151 @new_theme_path = ( @new_theme_path, $user_theme_path[$count] );
eaace00e 3152 }
3153 $count++;
3154 }
82351c82 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--;
eaace00e 3159 }
8442ac08 3160 }
eaace00e 3161 } elsif ( $input =~ /^\s*t\s*/i ) {
3162 print "\nStarting detection...\n\n";
3163
82351c82 3164 opendir( DIR, "../css" );
e06886c9 3165 @files = sort(readdir(DIR));
eaace00e 3166 $cnt = 0;
3167 while ( $cnt <= $#files ) {
82351c82 3168 $filename = "../css/" . $files[$cnt] .'/';
a0fa595d 3169 if ( $files[$cnt] !~ /^\./ && $filename ne "../css/rtl.css" && -e $filename . "default.css" ) {
eaace00e 3170 $found = 0;
82351c82 3171 for ( $x = 0 ; $x <= $#user_theme_path ; $x++ ) {
3172 if ( $user_theme_path[$x] eq $filename ) {
eaace00e 3173 $found = 1;
3174 }
3175 }
3176 if ( $found != 1 ) {
82351c82 3177 print "** Found user theme: $filename\n";
a0fa595d 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]: ";
eaace00e 3185 $nm = <STDIN>;
a0fa595d 3186 $nm =~ s/^\s+|\s+$|[\n\r]//g;
3187 if ( $nm eq '' ) { $nm = $def; }
82351c82 3188 $user_theme_name[ $#user_theme_name + 1 ] = $nm;
3189 $user_theme_path[ $#user_theme_path + 1 ] = $filename;
eaace00e 3190 }
3191 }
3192 $cnt++;
8442ac08 3193 }
eaace00e 3194 print "\n";
82351c82 3195 for ( $cnt = 0 ; $cnt <= $#user_theme_path ; $cnt++ ) {
3196 $filename = $user_theme_path[$cnt];
3197 if ( $filename != 'none' && !( -e $filename ."/default.css" ) ) {
eaace00e 3198 print " Removing $filename (file not found)\n";
3199 $offset = 0;
82351c82 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 ) {
eaace00e 3204 $offset = 1;
3205 }
3206 if ( $offset == 1 ) {
82351c82 3207 $new_user_theme_name[$x] = $user_theme_name[ $x + 1 ];
3208 $new_user_theme_path[$x] = $user_theme_path[ $x + 1 ];
eaace00e 3209 } else {
82351c82 3210 $new_user_theme_name[$x] = $user_theme_name[$x];
3211 $new_user_theme_path[$x] = $user_theme_path[$x];
eaace00e 3212 }
3213 }
82351c82 3214 @user_theme_name = @new_user_theme_name;
3215 @user_theme_path = @new_user_theme_path;
eaace00e 3216 }
3217 }
3218 print "\nDetection complete!\n\n";
3219
3220 closedir DIR;
3221 } elsif ( $input =~ /^\s*\?\s*/ ) {
83139c0b 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";
341fd984 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";
3641f36d 3244
3245 print "Available icon themes:\n\n";
3246
3247 $count = 0;
3248 while ( $count <= $#icon_theme_name ) {
3249 if ( $count == $icon_theme_def ) {
341fd984 3250 print " d";
3251 } else {
3252 print " ";
3253 }
3254 if ( $count eq $icon_theme_fallback ) {
3255 print "f ";
3641f36d 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
341fd984 3274 print "\n d = Default icon theme\n";
3275 print " f = Fallback icon theme\n";
3641f36d 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";
341fd984 3282 print "| f N (set fallback icon set) |\n";
3641f36d 3283 print "| l (list icon themes) |\n";
3284 print "| d (done) |\n";
3285 print "`------------------------------------'\n";
3286
3287 print "\n[icon_themes] command (?=help) > ";
83139c0b 3288 $input = <STDIN>;
3289 $input =~ s/[\r\n]//g;
3290 while ( $input ne "d" ) {
3291 if ( $input =~ /^\s*l\s*/i ) {
3292 $count = 0;
341fd984 3293 print "\n";
83139c0b 3294 while ( $count <= $#icon_theme_name ) {
341fd984 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 }
83139c0b 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 }
341fd984 3316 print "\n d = Default icon theme\n";
3317 print " f = Fallback icon theme\n\n";
83139c0b 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 }
341fd984 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 }
83139c0b 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";
341fd984 3354 } elsif ( $rem_num == $icon_theme_fallback ) {
3355 print "You cannot remove the fallback icon theme!\n";
83139c0b 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/" );
e06886c9 3377 @files = sort(readdir(DIR));
83139c0b 3378 $cnt = 0;
3379 while ( $cnt <= $#files ) {
3380 $filename = "../images/themes/" . $files[$cnt] .'/';
a0fa595d 3381 if ( -d "../images/themes/" . $files[$cnt] && $files[$cnt] !~ /^\./ && $files[$cnt] ne ".svn" ) {
83139c0b 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";
a0fa595d 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]: ";
83139c0b 3397 $nm = <STDIN>;
a0fa595d 3398 $nm =~ s/^\s+|\s+$|[\n\r]//g;
3399 if ( $nm eq '' ) { $nm = $def; }
83139c0b 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";
341fd984 3439 print "| f N (set fallback icon set) |\n";
83139c0b 3440 print "| l (list icon themes) |\n";
3441 print "| d (done) |\n";
3442 print "`------------------------------------'\n";
eaace00e 3443 }
83139c0b 3444 print "[icon_themes] command (?=help) > ";
eaace00e 3445 $input = <STDIN>;
85645192 3446 $input =~ s/[\r\n]//g;
eaace00e 3447 }
3448}
ccfb2029 3449
85bacb8f 3450sub command_templates {
52bc19ad 3451 print "\nDefine the template sets (skins) that you wish to use. If you have added\n";
3641f36d 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";
85bacb8f 3454
3455 print "\n Available Templates:\n";
3456
3457 $count = 0;
3458 while ( $count <= $#templateset_name ) {
293906dd 3459 if ( $templateset_id[$count] eq $templateset_default ) {
3460 print " d";
3461 } else {
3462 print " ";
3463 }
3464 if ( $templateset_id[$count] eq $templateset_fallback ) {
d81572f7 3465 print "f";
3466 } else {
3467 print " ";
3468 }
3469 if ( $templateset_id[$count] eq $rpc_templateset ) {
3470 print "r ";
85bacb8f 3471 } else {
3472 print " ";
3473 }
3474 if ( $count < 10 ) {
3475 print " ";
3476 }
d81572f7 3477 if ( $count < 100 ) {
3478 print " ";
3479 }
85bacb8f 3480 $name = $templateset_name[$count];
d81572f7 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
85bacb8f 3494 }
3495
d81572f7 3496 print " $count. $name\n";
85bacb8f 3497
3498 $count++;
d81572f7 3499 }
3500 print "\n d = default template set\n"
3501 . " f = fallback template set\n"
3502 . " r = RPC template set\n\n";
85bacb8f 3503
5e78e498 3504 $menu_text = ".-------------------------------------.\n"
83139c0b 3505 . "| t (detect template set) |\n"
5e78e498 3506 . "| + (add template set) |\n"
3507 . "| - N (remove template set) |\n"
3508 . "| m N (mark default template set) |\n"
293906dd 3509 . "| f N (set fallback template set) |\n"
d81572f7 3510 . "| r N (set RPC template set) |\n"
52bc19ad 3511 . "| l (list template sets/skins) |\n"
5e78e498 3512 . "| d (done) |\n"
3513 . "|-------------------------------------|\n"
3514 . "| where N is a template set number |\n"
3515 . "`-------------------------------------'\n";
85bacb8f 3516 print "\n";
5e78e498 3517 print $menu_text;
85bacb8f 3518 print "\n[template set] command (?=help) > ";
3519
3520 $input = <STDIN>;
3521 $input =~ s/[\r\n]//g;
3522 while ( $input ne "d" ) {
5e78e498 3523
3524 # list template sets
3525 #
85bacb8f 3526 if ( $input =~ /^\s*l\s*/i ) {
3527 $count = 0;
3528 while ( $count <= $#templateset_name ) {
293906dd 3529 if ( $templateset_id[$count] eq $templateset_default ) {
3530 print " d";
3531 } else {
3532 print " ";
3533 }
3534 if ( $templateset_id[$count] eq $templateset_fallback ) {
d81572f7 3535 print "f";
3536 } else {
3537 print " ";
3538 }
3539 if ( $templateset_id[$count] eq $rpc_templateset ) {
3540 print "r ";
85bacb8f 3541 } else {
3542 print " ";
3543 }
3544 if ( $count < 10 ) {
3545 print " ";
3546 }
d81572f7 3547 if ( $count < 100 ) {
3548 print " ";
3549 }
85bacb8f 3550 $name = $templateset_name[$count];
d81572f7 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
85bacb8f 3564 }
3565
d81572f7 3566 print " $count. $name\n";
85bacb8f 3567
3568 $count++;
3569 }
293906dd 3570 print "\n d = default template set\n"
d81572f7 3571 . " f = fallback template set\n"
3572 . " r = RPC template set\n\n";
5e78e498 3573
3574 # mark default template set
3575 #
85bacb8f 3576 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
3577 $old_def = $templateset_default;
293906dd 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";
85bacb8f 3582 $templateset_default = $old_def;
3583 }
d81572f7 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 }
5e78e498 3588
293906dd 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 }
d81572f7 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 }
293906dd 3618
5e78e498 3619 # add template set
3620 #
85bacb8f 3621 } elsif ( $input =~ /^\s*\+/ ) {
5e78e498 3622 print "\nWhat is the name of this template (as shown to your users): ";
85bacb8f 3623 $name = <STDIN>;
3624 $name =~ s/[\r\n]//g;
3625 $templateset_name[ $#templateset_name + 1 ] = $name;
5e78e498 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): ";
85bacb8f 3631 $name = <STDIN>;
3632 $name =~ s/[\r\n]//g;
5e78e498 3633 $templateset_id[ $#templateset_id + 1 ] = $name;
3634
3635 # detect template sets
3636 #
85bacb8f 3637 } elsif ( $input =~ /^\s*t\s*/i ) {
3638 print "\nStarting detection...\n\n";
3639 opendir( DIR, "../templates" );
e06886c9 3640 @files = sort(readdir(DIR));
85bacb8f 3641 $cnt = 0;
85bacb8f 3642 while ( $cnt <= $#files ) {
a0fa595d 3643 if ( -d "../templates/" . $files[$cnt] && $files[$cnt] !~ /^\./ && $files[$cnt] ne ".svn" ) {
5e78e498 3644 $filename = $files[$cnt];
85bacb8f 3645 $found = 0;
5e78e498 3646 for ( $x = 0 ; $x <= $#templateset_id ; $x++ ) {
3647 if ( $templateset_id[$x] eq $filename ) {
85bacb8f 3648 $found = 1;
5e78e498 3649 last;
85bacb8f 3650 }
3651 }
5e78e498 3652 if ( $found != 1) {
85bacb8f 3653 print "** Found template set: $filename\n";
a0fa595d 3654 $def = $files[$cnt];
d81572f7 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 }
5e78e498 3671 $templateset_id[ $#templateset_id + 1 ] = $filename;
85bacb8f 3672 $templateset_name[ $#templateset_name + 1 ] = $nm;
85bacb8f 3673 }
85bacb8f 3674 }
3675 $cnt++;
3676 }
3677 print "\n";
5e78e498 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";
293906dd 3682 if ( $templateset_default eq $filename ) { $templateset_default = 'default'; }
3683 if ( $templateset_fallback eq $filename ) { $templateset_fallback = 'default'; }
d81572f7 3684 if ( $rpc_templateset eq $filename ) { $rpc_templateset = 'default_rpc'; }
85bacb8f 3685 $offset = 0;
3686 @new_templateset_name = ();
5e78e498 3687 @new_templateset_id = ();
3688 for ( $x = 0 ; $x < $#templateset_id ; $x++ ) {
3689 if ( $templateset_id[$x] eq $filename ) {
85bacb8f 3690 $offset = 1;
3691 }
3692 if ( $offset == 1 ) {
3693 $new_templateset_name[$x] = $templateset_name[ $x + 1 ];
5e78e498 3694 $new_templateset_id[$x] = $templateset_id[ $x + 1 ];
85bacb8f 3695 } else {
3696 $new_templateset_name[$x] = $templateset_name[$x];
5e78e498 3697 $new_templateset_id[$x] = $templateset_id[$x];
85bacb8f 3698 }
3699 }
3700 @templateset_name = @new_templateset_name;
5e78e498 3701 @templateset_id = @new_templateset_id;
3702 } else { $cnt++; }
85bacb8f 3703 }
3704 print "\nDetection complete!\n\n";
3705
3706 closedir DIR;
5e78e498 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]+/ ) {
85bacb8f 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 }
293906dd 3720 if ( $templateset_id[$rem_num] eq $templateset_default ) {
85bacb8f 3721 print "You cannot remove the default template set!\n";
293906dd 3722 } elsif ( $templateset_id[$rem_num] eq $templateset_fallback ) {
3723 print "You cannot remove the fallback template set!\n";
d81572f7 3724 } elsif ( $templateset_id[$rem_num] eq $rpc_templateset ) {
3725 print "You cannot remove the RPC template set!\n";
85bacb8f 3726 } else {
3727 $count = 0;
3728 @new_templateset_name = ();
5e78e498 3729 @new_templateset_id = ();
85bacb8f 3730 while ( $count <= $#templateset_name ) {
3731 if ( $count != $rem_num ) {
3732 @new_templateset_name = ( @new_templateset_name, $templateset_name[$count] );
5e78e498 3733 @new_templateset_id = ( @new_templateset_id, $templateset_id[$count] );
85bacb8f 3734 }
3735 $count++;
3736 }
3737 @templateset_name = @new_templateset_name;
5e78e498 3738 @templateset_id = @new_templateset_id;
85bacb8f 3739 }
5e78e498 3740
3741 # help
3742 #
85bacb8f 3743 } elsif ( $input =~ /^\s*\?\s*/ ) {
5e78e498 3744 print $menu_text;
293906dd 3745
3746 # command not understood
3747 #
3748 } else {
3749 print "Command not understood\n";
85bacb8f 3750 }
293906dd 3751
85bacb8f 3752 print "[template set] command (?=help) > ";
3753 $input = <STDIN>;
3754 $input =~ s/[\r\n]//g;
3755 }
3756 return $templateset_default;
3757}
3758
3759
81132de8 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
1e0628fb 3843sub command61 {
eaace00e 3844 print "You can now define different LDAP servers.\n";
223cc0f5 3845 print "Please ensure proper permissions for config.php when including\n";
3846 print "sensitive passwords.\n\n";
eaace00e 3847 print "[ldap] command (?=help) > ";
3848 $input = <STDIN>;
85645192 3849 $input =~ s/[\r\n]//g;
eaace00e 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 }
43397658 3868 if ( $ldap_filter[$count] ) {
3869 print " filter: $ldap_filter[$count]\n";
3870 }
30e9932c 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 }
43397658 3877 if ( $ldap_protocol[$count] ) {
30e9932c 3878 print " protocol: $ldap_protocol[$count]\n";
3879 }
43397658 3880 if ( $ldap_limit_scope[$count] ) {
3881 print " limit_scope: $ldap_limit_scope[$count]\n";
3882 }
327e2d96 3883 if ( $ldap_listing[$count] ) {
3884 print " listing: $ldap_listing[$count]\n";
3885 }
664fd7a0 3886 if ( $ldap_writeable[$count] ) {
3887 print " writeable: $ldap_writeable[$count]\n";
3888 }
593370a4 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 }
30e9932c 3895
eaace00e 3896 print "\n";
3897 $count++;
a93b12ba 3898 }
eaace00e 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";
51abca07 3903 print "this LDAP server resides. Example: ldap.bigfoot.com\n";
9061389c 3904 print "\n";
3905 print "You can use any URI compatible with your LDAP library. Please\n";
51abca07 3906 print "note that StartTLS option is not compatible with ldaps and\n";
9061389c 3907 print "ldapi URIs.\n";
eaace00e 3908 print "hostname: ";
3909 $name = <STDIN>;
85645192 3910 $name =~ s/[\r\n]//g;
eaace00e 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>;
85645192 3920 $name =~ s/[\r\n]//g;
eaace00e 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>;
85645192 3929 $name =~ s/[\r\n]//g;
eaace00e 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>;
85645192 3938 $name =~ s/[\r\n]//g;
eaace00e 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>;
85645192 3947 $name =~ s/[\r\n]//g;
eaace00e 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";
327e2d96 3953 print "Default value is equal to 250 rows. Press ENTER for default.\n";
eaace00e 3954 print "maxrows: ";
3955 $name = <STDIN>;
85645192 3956 $name =~ s/[\r\n]//g;
eaace00e 3957 $ldap_maxrows[$sub] = $name;
3958
43397658 3959
3960 print "\n";
3961
30e9932c 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>;
85645192 3966 $name =~ s/[\r\n]//g;
30e9932c 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>;
85645192 3976 $name =~ s/[\r\n]//g;
30e9932c 3977 $ldap_bindpw[$sub] = $name;
3978
3979 print "\n";
3980 }
3981
43397658 3982 print "You can specify bind protocol version here.\n";
30e9932c 3983 print "Default protocol version depends on your php ldap settings.\n";
43397658 3984 print "Press ENTER for default.\n";
30e9932c 3985 print "protocol: ";
3986 $name = <STDIN>;
85645192 3987 $name =~ s/[\r\n]//g;
30e9932c 3988 $ldap_protocol[$sub] = $name;
3989
3990 print "\n";
3991
327e2d96 3992 print "This configuration section allows to set some rarely used\n";
3993 print "options and options specific to some LDAP implementations.\n";
43397658 3994 print "\n";
327e2d96 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';
43397658 3999 } else {
327e2d96 4000 $ldap_advanced_settings = 'false';
43397658 4001 }
43397658 4002
327e2d96 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";
327e2d96 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
664fd7a0 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
327e2d96 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;
593370a4 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;
327e2d96 4093 }
43397658 4094 print "\n";
4095
eaace00e 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 = ();
43397658 4111 @new_ldap_filter = ();
30e9932c 4112 @new_ldap_bindpw = ();
4113 @new_ldap_binddn = ();
4114 @new_ldap_protocol = ();
43397658 4115 @new_ldap_limit_scope = ();
327e2d96 4116 @new_ldap_listing = ();
664fd7a0 4117 @new_ldap_writeable = ();
593370a4 4118 @new_ldap_search_tree = ();
4119 @new_ldap_starttls = ();
eaace00e 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] );
43397658 4129 @new_ldap_filter = ( @new_ldap_filter, $ldap_filter[$count] );
30e9932c 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] );
43397658 4133 @new_ldap_limit_scope = ( @new_ldap_limit_scope, $ldap_limit_scope[$count] );
327e2d96 4134 @new_ldap_listing = ( @new_ldap_listing, $ldap_listing[$count] );
664fd7a0 4135 @new_ldap_writeable = ( @new_ldap_writeable, $ldap_writeable[$count] );
593370a4 4136 @new_ldap_search_tree = ( @new_ldap_search_tree, $ldap_search_tree[$count] );
4137 @new_ldap_starttls = ( @new_ldap_starttls, $ldap_starttls[$count] );
eaace00e 4138 }
4139 $count++;
1e0628fb 4140 }
eaace00e 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;
43397658 4147 @ldap_filter = @new_ldap_filter;
30e9932c 4148 @ldap_binddn = @new_ldap_binddn;
4149 @ldap_bindpw = @new_ldap_bindpw;
4150 @ldap_protocol = @new_ldap_protocol;
43397658 4151 @ldap_limit_scope = @new_ldap_limit_scope;
327e2d96 4152 @ldap_listing = @new_ldap_listing;
664fd7a0 4153 @ldap_writeable = @new_ldap_writeable;
593370a4 4154 @ldap_search_tree = @new_ldap_search_tree;
4155 @ldap_starttls = @new_ldap_starttls;
30e9932c 4156
eaace00e 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>;
85645192 4167 $input =~ s/[\r\n]//g;
eaace00e 4168 }
4169}
1e0628fb 4170
3806fa52 4171sub command62 {
eaace00e 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
35aaf666 4182 if ( lc($default_use_javascript_addr_book) eq 'true' ) {
eaace00e 4183 $default_value = "y";
4184 } else {
35aaf666 4185 $default_use_javascript_addr_book = 'false';
eaace00e 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" ) ) ) {
35aaf666 4191 $default_use_javascript_addr_book = 'true';
eaace00e 4192 } else {
35aaf666 4193 $default_use_javascript_addr_book = 'false';
eaace00e 4194 }
4195 return $default_use_javascript_addr_book;
3806fa52 4196}
1e0628fb 4197
4272758c 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";
598294a7 4204 print "relative to main SquirrelMail directory. If value is empty,\n";
4272758c 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 {
7eb64c3e 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";
4272758c 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 }
7eb64c3e 4231 print "Allow writing into global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
4272758c 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
71d3f882 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
7311c377 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
497203d4 4294sub command91 {
eaace00e 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";
223cc0f5 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";
eaace00e 4302 print "If the DSN is left empty (hit space and then return) the database\n";
223cc0f5 4303 print "related code for address books will not be used.\n";
eaace00e 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" ) {
97eea19d 4314 $new_dsn = $addrbook_dsn;
eaace00e 4315 } else {
85645192 4316 $new_dsn =~ s/[\r\n]//g;
eaace00e 4317 $new_dsn =~ s/^\s+$//g;
4318 }
4319 return $new_dsn;
497203d4 4320}
ccfb2029 4321
4f40a59d 4322sub command92 {
eaace00e 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 {
85645192 4331 $new_table =~ s/[\r\n]//g;
eaace00e 4332 }
4333 return $new_table;
4f40a59d 4334}
4335
3499f99f 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";
223cc0f5 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";
3499f99f 4344 print "If the DSN is left empty (hit space and then return) the database\n";
223cc0f5 4345 print "related code for address books will not be used.\n";
3499f99f 4346 print "\n";
4347
eaace00e 4348 if ( $prefs_dsn eq "" ) {
3499f99f 4349 $default_value = "Disabled";
4350 } else {
4351 $default_value = $prefs_dsn;
4352 }
4353 print "[$WHT$prefs_dsn$NRM]: $WHT";
4354 $new_dsn = <STDIN>;
eaace00e 4355 if ( $new_dsn eq "\n" ) {
97eea19d 4356 $new_dsn = $prefs_dsn;
3499f99f 4357 } else {
85645192 4358 $new_dsn =~ s/[\r\n]//g;
3499f99f 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";
99a6c222 4366 print "data in, it defaults to 'userprefs'\n";
3499f99f 4367 print "\n";
4368 print "[$WHT$prefs_table$NRM]: $WHT";
4369 $new_table = <STDIN>;
eaace00e 4370 if ( $new_table eq "\n" ) {
3499f99f 4371 $new_table = $prefs_table;
4372 } else {
85645192 4373 $new_table =~ s/[\r\n]//g;
3499f99f 4374 }
4375 return $new_table;
eaace00e 4376}
3499f99f 4377
99a6c222 4378sub command95 {
4379 print "This is the name of the field in which you want to store the\n";
6d9f22db 4380 print "username of the person the prefs are for. It defaults to 'user'\n";
99a6c222 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 {
85645192 4387 $new_field =~ s/[\r\n]//g;
99a6c222 4388 }
06316c07 4389 $prefs_user_size = db_pref_size($prefs_user_size);
99a6c222 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 {
85645192 4402 $new_field =~ s/[\r\n]//g;
99a6c222 4403 }
06316c07 4404 $prefs_key_size = db_pref_size($prefs_key_size);
99a6c222 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 {
85645192 4417 $new_field =~ s/[\r\n]//g;
99a6c222 4418 }
06316c07 4419 $prefs_val_size = db_pref_size($prefs_val_size);
99a6c222 4420 return $new_field;
4421}
4422
06316c07 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
30e9932c 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";
223cc0f5 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";
30e9932c 4447 print "If the DSN is left empty (hit space and then return) the database\n";
223cc0f5 4448 print "related code for global SQL address book will not be used.\n";
30e9932c 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" ) {
97eea19d 4459 $new_dsn = $addrbook_global_dsn;
30e9932c 4460 } else {
85645192 4461 $new_dsn =~ s/[\r\n]//g;
30e9932c 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";
6e00b127 4469 print "data in. Default table name is 'global_abook'. Address book uses same\n";
4470 print "database format as personal address book.\n";
30e9932c 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 {
85645192 4477 $new_table =~ s/[\r\n]//g;
30e9932c 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
35aaf666 4486 if ( lc($addrbook_global_writeable) eq 'true' ) {
30e9932c 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" ) ) ) {
35aaf666 4494 $addrbook_global_writeable = 'true';
30e9932c 4495 } else {
35aaf666 4496 $addrbook_global_writeable = 'false';
30e9932c 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
35aaf666 4505 if ( lc($addrbook_global_listing) eq 'true' ) {
30e9932c 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" ) ) ) {
35aaf666 4513 $addrbook_global_listing = 'true';
30e9932c 4514 } else {
35aaf666 4515 $addrbook_global_listing = 'false';
30e9932c 4516 }
4517 return $addrbook_global_listing;
4518}
4519
4520
39d3ec89 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 {
85645192 4532 $new_squirrelmail_default_language =~ s/[\r\n]//g;
39d3ec89 4533 $new_squirrelmail_default_language =~ s/^\s+$//g;
4534 }
4535 return $new_squirrelmail_default_language;
4536}
4537# Default Charset
4538sub commandA2 {
fe48c808 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";
867fed37 4542 print "charsets that are set in translation settings.\n";
39d3ec89 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 {
85645192 4550 $new_default_charset =~ s/[\r\n]//g;
39d3ec89 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";
5ba5dc8e 4557 print "language selection box. Note, that this option can trigger\n";
4558 print "installation of foreign language support modules in some browsers.\n";
39d3ec89 4559 print "\n";
4560
35aaf666 4561 if ( lc($show_alternative_names) eq 'true' ) {
39d3ec89 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" ) ) ) {
35aaf666 4569 $show_alternative_names = 'true';
39d3ec89 4570 } else {
35aaf666 4571 $show_alternative_names = 'false';
39d3ec89 4572 }
4573 return $show_alternative_names;
4574}
5ba5dc8e 4575
f03f6ee7 4576# Aggressive decoding
5ba5dc8e 4577sub commandA4 {
39d3ec89 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
f03f6ee7 4584 if ( lc($aggressive_decoding) eq 'true' ) {
39d3ec89 4585 $default_value = "y";
4586 } else {
4587 $default_value = "n";
4588 }
f03f6ee7 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';
39d3ec89 4593 } else {
f03f6ee7 4594 $aggressive_decoding = 'false';
39d3ec89 4595 }
f03f6ee7 4596 return $aggressive_decoding;
39d3ec89 4597}
4598
6d3689f5 4599# Lossy encoding
5ba5dc8e 4600sub commandA5 {
6d3689f5 4601 print "Enable this option if you want to allow lossy charset encoding in message\n";
f03f6ee7 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
6d3689f5 4607 if ( lc($lossy_encoding) eq 'true' ) {
f03f6ee7 4608 $default_value = "y";
4609 } else {
4610 $default_value = "n";
4611 }
6d3689f5 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';
f03f6ee7 4616 } else {
6d3689f5 4617 $lossy_encoding = 'false';
f03f6ee7 4618 }
6d3689f5 4619 return $lossy_encoding;
f03f6ee7 4620}
4621
74d6a0d9 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}
209e24bb 4644
7af858cd 4645# ask user info
209e24bb 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
6395c46d 4668# use icons
39d3ec89 4669sub commandB3 {
6395c46d 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
35aaf666 4679 if ( lc($use_icons) eq 'true' ) {
6395c46d 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" ) ) ) {
35aaf666 4687 $use_icons = 'true';
6395c46d 4688 } else {
35aaf666 4689 $use_icons = 'false';
6395c46d 4690 }
4691 return $use_icons;
4692}
4693# php recode
4694sub commandB4 {
39d3ec89 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
35aaf666 4702 if ( lc($use_php_recode) eq 'true' ) {
39d3ec89 4703 $default_value = "y";
4704 } else {
4705 $default_value = "n";
4706 }
ad9d110a 4707 print "Use php recode functions? (y/n) [$WHT$default_value$NRM]: $WHT";
39d3ec89 4708 $use_php_recode = <STDIN>;
4709 if ( ( $use_php_recode =~ /^y\n/i ) || ( ( $use_php_recode =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 4710 $use_php_recode = 'true';
39d3ec89 4711 } else {
35aaf666 4712 $use_php_recode = 'false';
39d3ec89 4713 }
4714 return $use_php_recode;
4715}
4716# php iconv
6395c46d 4717sub commandB5 {
39d3ec89 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
35aaf666 4726 if ( lc($use_php_iconv) eq 'true' ) {
39d3ec89 4727 $default_value = "y";
4728 } else {
4729 $default_value = "n";
4730 }
ad9d110a 4731 print "Use php iconv functions? (y/n) [$WHT$default_value$NRM]: $WHT";
39d3ec89 4732 $use_php_iconv = <STDIN>;
4733 if ( ( $use_php_iconv =~ /^y\n/i ) || ( ( $use_php_iconv =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 4734 $use_php_iconv = 'true';
39d3ec89 4735 } else {
35aaf666 4736 $use_php_iconv = 'false';
39d3ec89 4737 }
4738 return $use_php_iconv;
4739}
4740
775a1f52 4741# buffer output
71d3f882 4742sub commandB6 {
775a1f52 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 {
71d3f882 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
72bf0ae7 4791# Default Icon theme
775a1f52 4792sub command53 {
9061389c 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";
72bf0ae7 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}
39d3ec89 4817
1888b1bf 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" : " ")
3f55fe04 4845 . " Moderate debugging (PHP E_ALL without E_STRICT)\n";
1888b1bf 4846 print "3 " . ($sm_debug_mode & 524288 ? "y" : " ")
3f55fe04 4847 . " Advanced debugging (PHP E_ALL (without E_STRICT) plus\n";
4848 print " log errors intentionally suppressed)\n";
1888b1bf 4849 print "4 " . ($sm_debug_mode & 536870912 ? "y" : " ")
3f55fe04 4850 . " Strict debugging (PHP E_ALL and E_STRICT)\n";
1888b1bf 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
061108dc 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
8f557b94 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
ccfb2029 4983sub save_data {
ebd13f55 4984 $tab = " ";
eaace00e 4985 if ( open( CF, ">config.php" ) ) {
ebd13f55 4986 print CF "<?php\n";
4987 print CF "\n";
eaace00e 4988
ebd13f55 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";
598294a7 4994
ebd13f55 4995 if ($print_config_version) {
eaace00e 4996 print CF "\$config_version = '$print_config_version';\n";
ebd13f55 4997 }
35aaf666 4998 # integer
254ded61 4999 print CF "\$config_use_color = $config_use_color;\n";
ebd13f55 5000 print CF "\n";
598294a7 5001
35aaf666 5002 # string
d756b071 5003 print CF "\$org_name = \"$org_name\";\n";
254ded61 5004 # string
35aaf666 5005 print CF "\$org_logo = " . &change_to_SM_path($org_logo) . ";\n";
b6e0c3b6 5006 $org_logo_width |= 0;
5007 $org_logo_height |= 0;
35aaf666 5008 # string
6c2d0a35 5009 print CF "\$org_logo_width = '$org_logo_width';\n";
5010 # string
35aaf666 5011 print CF "\$org_logo_height = '$org_logo_height';\n";
5012 # string that can contain variables.
12947430 5013 print CF "\$org_title = \"$org_title\";\n";
35aaf666 5014 # string
8bd9e0dd 5015 print CF "\$signout_page = " . &change_to_SM_path($signout_page) . ";\n";
35aaf666 5016 # string
3d043efc 5017 print CF "\$frame_top = '$frame_top';\n";
ebd13f55 5018 print CF "\n";
eaace00e 5019
0ae4c1f2 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
35aaf666 5026 # string that can contain variables
254ded61 5027 print CF "\$motd = \"$motd\";\n";
ebd13f55 5028 print CF "\n";
598294a7 5029
35aaf666 5030 # string
ebd13f55 5031 print CF "\$squirrelmail_default_language = '$squirrelmail_default_language';\n";
35aaf666 5032 # string
39d3ec89 5033 print CF "\$default_charset = '$default_charset';\n";
35aaf666 5034 # boolean
6cbbd722 5035 print CF "\$show_alternative_names = $show_alternative_names;\n";
35aaf666 5036 # boolean
f03f6ee7 5037 print CF "\$aggressive_decoding = $aggressive_decoding;\n";
5038 # boolean
6d3689f5 5039 print CF "\$lossy_encoding = $lossy_encoding;\n";
ebd13f55 5040 print CF "\n";
eaace00e 5041
35aaf666 5042 # string
ebd13f55 5043 print CF "\$domain = '$domain';\n";
35aaf666 5044 # string
ebd13f55 5045 print CF "\$imapServerAddress = '$imapServerAddress';\n";
35aaf666 5046 # integer
254ded61 5047 print CF "\$imapPort = $imapPort;\n";
35aaf666 5048 # boolean
254ded61 5049 print CF "\$useSendmail = $useSendmail;\n";
35aaf666 5050 # string
ebd13f55 5051 print CF "\$smtpServerAddress = '$smtpServerAddress';\n";
35aaf666 5052 # integer
254ded61 5053 print CF "\$smtpPort = $smtpPort;\n";
35aaf666 5054 # string
ebd13f55 5055 print CF "\$sendmail_path = '$sendmail_path';\n";
fd7ab795 5056 # string
5057 print CF "\$sendmail_args = '$sendmail_args';\n";
35aaf666 5058 # boolean
47a29326 5059# print CF "\$use_authenticated_smtp = $use_authenticated_smtp;\n";
35aaf666 5060 # boolean
254ded61 5061 print CF "\$pop_before_smtp = $pop_before_smtp;\n";
35aaf666 5062 # string
783e926e 5063 print CF "\$pop_before_smtp_host = '$pop_before_smtp_host';\n";
5064 # string
ebd13f55 5065 print CF "\$imap_server_type = '$imap_server_type';\n";
35aaf666 5066 # boolean
374726c9 5067 print CF "\$invert_time = $invert_time;\n";
35aaf666 5068 # string
ebd13f55 5069 print CF "\$optional_delimiter = '$optional_delimiter';\n";
432db2fc 5070 # string
5071 print CF "\$encode_header_key = '$encode_header_key';\n";
ebd13f55 5072 print CF "\n";
eaace00e 5073
81132de8 5074 # string
ebd13f55 5075 print CF "\$default_folder_prefix = '$default_folder_prefix';\n";
81132de8 5076 # string
ebd13f55 5077 print CF "\$trash_folder = '$trash_folder';\n";
81132de8 5078 # string
ebd13f55 5079 print CF "\$sent_folder = '$sent_folder';\n";
81132de8 5080 # string
ebd13f55 5081 print CF "\$draft_folder = '$draft_folder';\n";
81132de8 5082 # boolean
254ded61 5083 print CF "\$default_move_to_trash = $default_move_to_trash;\n";
81132de8 5084 # boolean
254ded61 5085 print CF "\$default_move_to_sent = $default_move_to_sent;\n";
81132de8 5086 # boolean
254ded61 5087 print CF "\$default_save_as_draft = $default_save_as_draft;\n";
81132de8 5088 # boolean
254ded61 5089 print CF "\$show_prefix_option = $show_prefix_option;\n";
81132de8 5090 # boolean
254ded61 5091 print CF "\$list_special_folders_first = $list_special_folders_first;\n";
81132de8 5092 # boolean
254ded61 5093 print CF "\$use_special_folder_color = $use_special_folder_color;\n";
81132de8 5094 # boolean
254ded61 5095 print CF "\$auto_expunge = $auto_expunge;\n";
81132de8 5096 # boolean
254ded61 5097 print CF "\$default_sub_of_inbox = $default_sub_of_inbox;\n";
81132de8 5098 # boolean
254ded61 5099 print CF "\$show_contain_subfolders_option = $show_contain_subfolders_option;\n";
81132de8 5100 # integer
254ded61 5101 print CF "\$default_unseen_notify = $default_unseen_notify;\n";
81132de8 5102 # integer
254ded61 5103 print CF "\$default_unseen_type = $default_unseen_type;\n";
81132de8 5104 # boolean
254ded61 5105 print CF "\$auto_create_special = $auto_create_special;\n";
81132de8 5106 # boolean
254ded61 5107 print CF "\$delete_folder = $delete_folder;\n";
81132de8 5108 # boolean
ca85aabe 5109 print CF "\$noselect_fix_enable = $noselect_fix_enable;\n";
5110
ebd13f55 5111 print CF "\n";
eaace00e 5112
81132de8 5113 # string
8bd9e0dd 5114 print CF "\$data_dir = " . &change_to_SM_path($data_dir) . ";\n";
81132de8 5115 # string that can contain a variable
8bd9e0dd 5116 print CF "\$attachment_dir = " . &change_to_SM_path($attachment_dir) . ";\n";
81132de8 5117 # integer
254ded61 5118 print CF "\$dir_hash_level = $dir_hash_level;\n";
81132de8 5119 # string
80519ece 5120 print CF "\$default_left_size = '$default_left_size';\n";
81132de8 5121 # boolean
254ded61 5122 print CF "\$force_username_lowercase = $force_username_lowercase;\n";
81132de8 5123 # boolean
254ded61 5124 print CF "\$default_use_priority = $default_use_priority;\n";
81132de8 5125 # boolean
254ded61 5126 print CF "\$hide_sm_attributions = $hide_sm_attributions;\n";
81132de8 5127 # boolean
254ded61 5128 print CF "\$default_use_mdn = $default_use_mdn;\n";
81132de8 5129 # boolean
254ded61 5130 print CF "\$edit_identity = $edit_identity;\n";
81132de8 5131 # boolean
254ded61 5132 print CF "\$edit_name = $edit_name;\n";
81132de8 5133 # boolean
3f7a756d 5134 print CF "\$edit_reply_to = $edit_reply_to;\n";
5135 # boolean
432db2fc 5136 print CF "\$hide_auth_header = $hide_auth_header;\n";
81132de8 5137 # boolean
74530cf4 5138 print CF "\$disable_thread_sort = $disable_thread_sort;\n";
81132de8 5139 # boolean
74530cf4 5140 print CF "\$disable_server_sort = $disable_server_sort;\n";
81132de8 5141 # boolean
3c7ee482 5142 print CF "\$allow_charset_search = $allow_charset_search;\n";
81132de8 5143 # integer
0f1b00b8 5144 print CF "\$allow_advanced_search = $allow_advanced_search;\n";
ebd13f55 5145 print CF "\n";
ee20a285 5146 # integer
5147 print CF "\$time_zone_type = $time_zone_type;\n";
5148 print CF "\n";
74530cf4 5149 # string
5150 print CF "\$config_location_base = '$config_location_base';\n";
5151 print CF "\n";
93d67e0d 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";
598294a7 5157
81132de8 5158 # all plugins are strings
eaace00e 5159 for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
a1b036d6 5160 print CF "\$plugins[] = '$plugins[$ct]';\n";
ebd13f55 5161 }
5162 print CF "\n";
eaace00e 5163
81132de8 5164 # strings
82351c82 5165 if ( $user_theme_default eq '' ) { $user_theme_default = '0'; }
5166 print CF "\$user_theme_default = $user_theme_default;\n";
57c6fabc 5167
82351c82 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";
ed65d11b 5175 # escape theme name so it can contain single quotes.
82351c82 5176 $esc_name = $user_theme_name[$count];
ed65d11b 5177 $esc_name =~ s/\\/\\\\/g;
5178 $esc_name =~ s/'/\\'/g;
82351c82 5179 print CF "\$user_themes[$count]['NAME'] = '$esc_name';\n";
ebd13f55 5180 }
5181 print CF "\n";
eaace00e 5182
83139c0b 5183 if ( $icon_theme_def eq '' ) { $icon_theme_def = '0'; }
5184 print CF "\$icon_theme_def = $icon_theme_def;\n";
341fd984 5185 if ( $icon_theme_fallback eq '' ) { $icon_theme_fallback = '0'; }
5186 print CF "\$icon_theme_fallback = $icon_theme_fallback;\n";
5187
83139c0b 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
293906dd 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";
85bacb8f 5209
d81572f7 5210 if ( $rpc_templateset eq '' ) { $rpc_templateset = 'default_rpc'; }
5211 print CF "\$rpc_templateset = '$rpc_templateset';\n";
5212
85bacb8f 5213 for ( $count = 0 ; $count <= $#templateset_name ; $count++ ) {
d81572f7 5214
5215 # don't include RPC template sets
5216 #
5217 if ( $templateset_id[$count] =~ /_rpc$/ ) { next; }
5218
5e78e498 5219 print CF "\$aTemplateSet[$count]['ID'] = '" . $templateset_id[$count] . "';\n";
85bacb8f 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
81132de8 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
96862638 5241 ## Address books
5242 # boolean
ebd13f55 5243 print CF "\$default_use_javascript_addr_book = $default_use_javascript_addr_book;\n";
eaace00e 5244 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
5245 print CF "\$ldap_server[$count] = array(\n";
81132de8 5246 # string
eaace00e 5247 print CF " 'host' => '$ldap_host[$count]',\n";
81132de8 5248 # string
eaace00e 5249 print CF " 'base' => '$ldap_base[$count]'";
5250 if ( $ldap_name[$count] ) {
5251 print CF ",\n";
81132de8 5252 # string
eaace00e 5253 print CF " 'name' => '$ldap_name[$count]'";
5254 }
5255 if ( $ldap_port[$count] ) {
5256 print CF ",\n";
81132de8 5257 # integer
254ded61 5258 print CF " 'port' => $ldap_port[$count]";
eaace00e 5259 }
5260 if ( $ldap_charset[$count] ) {
5261 print CF ",\n";
81132de8 5262 # string
eaace00e 5263 print CF " 'charset' => '$ldap_charset[$count]'";
5264 }
5265 if ( $ldap_maxrows[$count] ) {
5266 print CF ",\n";
81132de8 5267 # integer
254ded61 5268 print CF " 'maxrows' => $ldap_maxrows[$count]";
eaace00e 5269 }
43397658 5270 # string
5271 if ( $ldap_filter[$count] ) {
5272 print CF ",\n";
5273 print CF " 'filter' => '$ldap_filter[$count]'";
5274 }
30e9932c 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";
327e2d96 5287 # integer
30e9932c 5288 print CF " 'protocol' => $ldap_protocol[$count]";
5289 }
43397658 5290 if ( $ldap_limit_scope[$count] ) {
5291 print CF ",\n";
5292 # boolean
5293 print CF " 'limit_scope' => $ldap_limit_scope[$count]";
5294 }
327e2d96 5295 if ( $ldap_listing[$count] ) {
5296 print CF ",\n";
5297 # boolean
5298 print CF " 'listing' => $ldap_listing[$count]";
5299 }
664fd7a0 5300 if ( $ldap_writeable[$count] ) {
5301 print CF ",\n";
5302 # boolean
5303 print CF " 'writeable' => $ldap_writeable[$count]";
5304 }
593370a4 5305 if ( $ldap_search_tree[$count] ) {
5306 print CF ",\n";
5307 # integer
5308 print CF " 'search_tree' => $ldap_search_tree[$count]";
5309 }
768c6816 5310 if ( $ldap_starttls[$count] ) {
593370a4 5311 print CF ",\n";
5312 # boolean
5313 print CF " 'starttls' => $ldap_starttls[$count]";
5314 }
eaace00e 5315 print CF "\n";
5316 print CF ");\n";
5317 print CF "\n";
ebd13f55 5318 }
b622e1b8 5319
81132de8 5320 # string
4f40a59d 5321 print CF "\$addrbook_dsn = '$addrbook_dsn';\n";
81132de8 5322 # string
4f40a59d 5323 print CF "\$addrbook_table = '$addrbook_table';\n\n";
81132de8 5324 # string
3499f99f 5325 print CF "\$prefs_dsn = '$prefs_dsn';\n";
81132de8 5326 # string
99a6c222 5327 print CF "\$prefs_table = '$prefs_table';\n";
81132de8 5328 # string
99a6c222 5329 print CF "\$prefs_user_field = '$prefs_user_field';\n";
81132de8 5330 # integer
06316c07 5331 print CF "\$prefs_user_size = $prefs_user_size;\n";
81132de8 5332 # string
99a6c222 5333 print CF "\$prefs_key_field = '$prefs_key_field';\n";
81132de8 5334 # integer
06316c07 5335 print CF "\$prefs_key_size = $prefs_key_size;\n";
81132de8 5336 # string
06316c07 5337 print CF "\$prefs_val_field = '$prefs_val_field';\n";
81132de8 5338 # integer
06316c07 5339 print CF "\$prefs_val_size = $prefs_val_size;\n\n";
81132de8 5340 # string
30e9932c 5341 print CF "\$addrbook_global_dsn = '$addrbook_global_dsn';\n";
81132de8 5342 # string
30e9932c 5343 print CF "\$addrbook_global_table = '$addrbook_global_table';\n";
81132de8 5344 # boolean
4272758c 5345 print CF "\$addrbook_global_writeable = $addrbook_global_writeable;\n";
81132de8 5346 # boolean
30e9932c 5347 print CF "\$addrbook_global_listing = $addrbook_global_listing;\n\n";
81132de8 5348 # string
4272758c 5349 print CF "\$abook_global_file = '$abook_global_file';\n";
81132de8 5350 # boolean
4272758c 5351 print CF "\$abook_global_file_writeable = $abook_global_file_writeable;\n\n";
81132de8 5352 # boolean
71d3f882 5353 print CF "\$abook_global_file_listing = $abook_global_file_listing;\n\n";
7311c377 5354 # integer
5355 print CF "\$abook_file_line_length = $abook_file_line_length;\n\n";
81132de8 5356 # boolean
6395c46d 5357 print CF "\$no_list_for_subscribe = $no_list_for_subscribe;\n";
47a29326 5358
81132de8 5359 # string
9c0f1780 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";
81132de8 5363 # string
9c0f1780 5364 print CF "\$imap_auth_mech = '$imap_auth_mech';\n";
d85e52d0 5365 # integer
9c0f1780 5366 print CF "\$use_imap_tls = $use_imap_tls;\n";
d85e52d0 5367 # integer
9c0f1780 5368 print CF "\$use_smtp_tls = $use_smtp_tls;\n";
9ae70b62 5369 # boolean
5370 print CF "\$display_imap_login_error = $display_imap_login_error;\n";
81132de8 5371 # string
9c0f1780 5372 print CF "\$session_name = '$session_name';\n";
5373 # boolean
d555f507 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";
6c499577 5379
6ab8321f 5380 # boolean
5381 print CF "\$use_transparent_security_image = $use_transparent_security_image;\n";
5382
83d6bb4b 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
81132de8 5387 print CF "\n";
35aaf666 5388
81132de8 5389 # boolean
5390 print CF "\$use_iframe = $use_iframe;\n";
209e24bb 5391 # boolean
5392 print CF "\$ask_user_info = $ask_user_info;\n";
81132de8 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";
81132de8 5398 # boolean
5399 print CF "\$use_php_iconv = $use_php_iconv;\n";
5400 print CF "\n";
5401 # boolean
775a1f52 5402 print CF "\$buffer_output = $buffer_output;\n";
5403 print CF "\n";
5404 # boolean
81132de8 5405 print CF "\$allow_remote_configtest = $allow_remote_configtest;\n";
061108dc 5406 print CF "\$secured_config = $secured_config;\n";
8f557b94 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";
1888b1bf 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";
81132de8 5415 print CF "\n";
85bacb8f 5416
35aaf666 5417 close CF;
ebd13f55 5418
35aaf666 5419 print "Data saved in config.php\n";
8b56e282 5420
5421 build_plugin_hook_array();
5422
ebd13f55 5423 } else {
5424 print "Error saving config.php: $!\n";
5425 }
911ad01c 5426}
a93b12ba 5427
5428sub set_defaults {
f8c17cdd 5429 clear_screen();
eaace00e 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";
7a4f9bfb 5449 print $list_supported_imap_servers;
a33764f6 5450 print "\n";
b39825f0 5451 print " quit = Do not change anything\n";
a33764f6 5452 print "\n";
eaace00e 5453 print "Command >> ";
5454 $server = <STDIN>;
85645192 5455 $server =~ s/[\r\n]//g;
eaace00e 5456
e498ebbd 5457 # variable is used to display additional messages.
5458 $message = "";
5459
eaace00e 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>";
b79b84c2 5472 $force_username_lowercase = false;
eaace00e 5473
3e6c7bc3 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
eaace00e 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;
2eec12b5 5489 $delete_folder = true;
b79b84c2 5490 $force_username_lowercase = true;
598294a7 5491
eaace00e 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>";
b79b84c2 5504 $force_username_lowercase = true;
eaace00e 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;
2eec12b5 5518 $delete_folder = true;
b79b84c2 5519 $force_username_lowercase = false;
598294a7 5520
cfe486a7 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;
eaace00e 5534
063ed2b1 5535 $continue = 1;
b39825f0 5536 } elsif ( $server eq "hmailserver" ) {
5537 $imap_server_type = "hmailserver";
946b11e9 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;
e50f5ac2 5548 $delete_folder = false;
5549 $force_username_lowercase = false;
b39825f0 5550
e50f5ac2 5551 $continue = 1;
063ed2b1 5552 } elsif ( $server eq "mercury32" ) {
5553 $imap_server_type = "mercury32";
5554 $default_folder_prefix = "";
67a24f8a 5555 $trash_folder = "Trash";
5556 $sent_folder = "Sent";
5557 $draft_folder = "Drafts";
063ed2b1 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
a33764f6 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
e498ebbd 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
eaace00e 5598 $continue = 1;
a798d8b2 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;
a7b9afd9 5617 $use_imap_tls = 1;
a798d8b2 5618 $imap_auth_mech = "login";
5619 $smtpServerAddress = "smtp.gmail.com";
5620 $smtpPort = 465;
5621 $pop_before_smtp = false;
5622 $useSendmail = false;
a7b9afd9 5623 $use_smtp_tls = 1;
a798d8b2 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
eaace00e 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";
2eec12b5 5660 print " delete_folder = $delete_folder\n";
b79b84c2 5661 print " force_username_lowercase = $force_username_lowercase\n";
e498ebbd 5662
5663 print "$message";
eaace00e 5664 }
b79b84c2 5665 print "\nPress enter to continue...";
eaace00e 5666 $tmp = <STDIN>;
a93b12ba 5667}
8bd9e0dd 5668
8bd9e0dd 5669# This subroutine corrects relative paths to ensure they
5670# will work within the SM space. If the path falls within
598294a7 5671# the SM directory tree, the SM_PATH variable will be
8bd9e0dd 5672# prepended to the path, if not, then the path will be
e6566358 5673# converted to an absolute path, e.g.
fbd01364 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"
8bd9e0dd 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 '');
a28a56da 5690 return "\'" . $old_path . "\'" if ( $old_path =~ /^(\/|http)/ );
fbd01364 5691 return "\'" . $old_path . "\'" if ( $old_path =~ /^\w:(\\|\/)/ );
25be56ab 5692 return $old_path if ( $old_path =~ /^\'(\/|http)/ );
d3fb3870 5693 return $old_path if ( $old_path =~ /^\'\w:\// );
b72da239 5694 return $old_path if ( $old_path =~ /^SM_PATH/);
598294a7 5695
b72da239 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 }
598294a7 5704
25be56ab 5705 # Remove remaining '
5706 $old_path =~ s/\'//g;
598294a7 5707
8bd9e0dd 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.
a2a74376 5713 @abs_path = split(/\//, $dir);
598294a7 5714
a2a74376 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;
1df76076 5721 $new_path = "\'" . join('/', @abs_path) . "\'";
8bd9e0dd 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 . \'/;
25be56ab 5726 $new_path .= "\'";
8bd9e0dd 5727 } else {
5728 # Last, it's a relative path without any leading '.'
598294a7 5729 # Prepend SM_PATH and config, since the paths are
35aaf666 5730 # relative to the config directory
e6566358 5731 $new_path = "SM_PATH . \'config/" . $old_path . "\'";
8bd9e0dd 5732 }
8bd9e0dd 5733 return $new_path;
5734}
5735
e6566358 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'
8bd9e0dd 5742sub change_to_rel_path() {
5743 my ($old_path) = @_;
e6566358 5744 my $new_path = $old_path;
8bd9e0dd 5745
5746 if ( $old_path =~ /^SM_PATH/ ) {
5e78e498 5747 # FIXME: the following replacement loses the opening quote mark!
8bd9e0dd 5748 $new_path =~ s/^SM_PATH . \'/\.\.\//;
b72da239 5749 $new_path =~ s/\.\.\/config\///;
8bd9e0dd 5750 }
5751
5752 return $new_path;
5753}
b47821fb 5754
b47821fb 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)
61e49023 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 }
35aaf666 5764 # Misc setup
35aaf666 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 }
598294a7 5774
35aaf666 5775 if ($service eq 'SMTP') {
5d28b77e 5776 $cmd = "AUTH $mech\r\n";
5777 $logout = "QUIT\r\n";
35aaf666 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
b47821fb 5787 my $sock=IO::Socket::INET->new($host);
5788 if (!defined($sock)) {
5789 # Connect failed
5790 return undef;
5791 }
35aaf666 5792 my $discard = <$sock>; # Server greeting/banner - who cares..
5793
5794 if ($service eq 'SMTP') {
5795 # Say hello first..
5d28b77e 5796 print $sock "HELO $domain\r\n";
35aaf666 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') {
15dce5a6 5809 if (!($response =~ /^334/)) {
35aaf666 5810 # Not supported
5d28b77e 5811 print $sock $logout;
35aaf666 5812 close $sock;
5813 return 'NO';
35aaf666 5814 }
5815 } elsif ($service eq 'IMAP') {
5816 if ($response =~ /^A01/) {
5817 # Not supported
5d28b77e 5818 print $sock $logout;
35aaf666 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';
b47821fb 5833}
f8c17cdd 5834
fd7ab795 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
f8c17cdd 5846sub clear_screen() {
5847 if ( $^O =~ /^mswin/i) {
5848 system "cls";
5849 } else {
5850 system "clear";
5851 }
5852}
5ef3253e 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(@_);
ef00a16b 5858
5859 if ($folder_name =~ /[\x80-\xFFFF]/) {
5ef3253e 5860 print "Folder name contains 8bit characters. Configuration utility requires\n";
5861 print "UTF7-IMAP encoded folder names.\n";
8b56e282 5862 print "Press enter to continue...";
5ef3253e 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";
7b899075 5868 print "Are you sure that folder name is correct? (y/N): ";
5ef3253e 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}
029d1fc2 5880
5881# quotes string written in single quotes
5882sub quote_single($) {
5883 my $string = shift(@_);
5884 $string =~ s/\'/\\'/g;
5885 return $string;
5886}
8b56e282 5887
3e339df8 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
184e94a3 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
8b56e282 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
8b56e282 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
02473e22 6097 # throw away lines that are not exactly one "brace set" deep
6098 #
6099 if ($brace_count > 1) {
6100 next;
6101 }
6102
6103
8b56e282 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
02473e22 6136 if ( $options[0] =~ /^squirrelmail_plugin_hooks\s*\[\s*['"]([a-z0-9 \/._*-]+)['"]\s*\]\s*\[\s*['"]([0-9a-z._-]+)['"]\s*\]/i ) {
8b56e282 6137 $hook_name = $1;
6138 $hooked_plugin_name = $2;
f94f306d 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 #}
8b56e282 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) {
f94f306d 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 }
8b56e282 6155 }
6156 $line =~ s/ {2,}/ /g;
6609e189 6157 $line =~ s/=/\n =/;
8b56e282 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}
1888b1bf 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}
af5de065 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