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