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