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