adding error checking in deliver_sendmail class.
[squirrelmail.git] / config / conf.pl
CommitLineData
23afd0bd 1#!/usr/bin/env perl
bbd30ac8 2# conf.pl
bbd30ac8 3#
ba6338ee 4# Copyright (c) 1999-2005 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############################################################
6614128e 11$conf_pl_version = "1.4.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" ) {
49 open( FILE, "config.php" );
50 while ( $line = <FILE> ) {
51 $line =~ s/^\s+//;
52 $line =~ s/^\$//;
53 $var = $line;
54
55 $var =~ s/=/EQUALS/;
85645192 56 if ( $var =~ /^([a-z])/i ) {
eaace00e 57 @o = split ( /\s*EQUALS\s*/, $var );
58 if ( $o[0] eq "config_version" ) {
85645192 59 $o[1] =~ s/[\n\r]//g;
60 $o[1] =~ s/[\'\"];\s*$//;
eaace00e 61 $o[1] =~ s/;$//;
85645192 62 $o[1] =~ s/^[\'\"]//;
eaace00e 63
64 $config_version = $o[1];
65 close(FILE);
66 }
67 }
68 }
69 close(FILE);
70
71 if ( $config_version ne $conf_pl_version ) {
f8c17cdd 72 clear_screen();
eaace00e 73 print $WHT. "WARNING:\n" . $NRM;
74 print " The file \"config/config.php\" was found, but it is for\n";
75 print " an older version of SquirrelMail. It is possible to still\n";
76 print " read the defaults from this file but be warned that many\n";
77 print " preferences change between versions. It is recommended that\n";
78 print " you start with a clean config.php for each upgrade that you\n";
79 print " do. To do this, just move config/config.php out of the way.\n";
80 print "\n";
81 print "Continue loading with the old config.php [y/N]? ";
82 $ctu = <STDIN>;
83
84 if ( ( $ctu !~ /^y\n/i ) || ( $ctu =~ /^\n/ ) ) {
85 exit;
86 }
87
88 print "\nDo you want me to stop warning you [y/N]? ";
89 $ctu = <STDIN>;
90 if ( $ctu =~ /^y\n/i ) {
91 $print_config_version = $conf_pl_version;
92 } else {
93 $print_config_version = $config_version;
94 }
95 } else {
96 $print_config_version = $config_version;
97 }
98
99 $config = 1;
100 open( FILE, "config.php" );
101} elsif ( -e "config_default.php" ) {
102 open( FILE, "config_default.php" );
103 while ( $line = <FILE> ) {
104 $line =~ s/^\s+//;
105 $line =~ s/^\$//;
106 $var = $line;
107
108 $var =~ s/=/EQUALS/;
85645192 109 if ( $var =~ /^([a-z])/i ) {
eaace00e 110 @o = split ( /\s*EQUALS\s*/, $var );
111 if ( $o[0] eq "config_version" ) {
85645192 112 $o[1] =~ s/[\n\r]//g;
113 $o[1] =~ s/[\'\"];\s*$//;
eaace00e 114 $o[1] =~ s/;$//;
85645192 115 $o[1] =~ s/^[\'\"]//;
eaace00e 116
117 $config_version = $o[1];
118 close(FILE);
119 }
120 }
121 }
122 close(FILE);
123
124 if ( $config_version ne $conf_pl_version ) {
f8c17cdd 125 clear_screen();
eaace00e 126 print $WHT. "WARNING:\n" . $NRM;
127 print " You are trying to use a 'config_default.php' from an older\n";
128 print " version of SquirrelMail. This is HIGHLY unrecommended. You\n";
129 print " should get the 'config_default.php' that matches the version\n";
130 print " of SquirrelMail that you are running. You can get this from\n";
131 print " the SquirrelMail web page by going to the following URL:\n";
132 print " http://www.squirrelmail.org.\n";
133 print "\n";
134 print "Continue loading with old config_default.php (a bad idea) [y/N]? ";
135 $ctu = <STDIN>;
136
137 if ( ( $ctu !~ /^y\n/i ) || ( $ctu =~ /^\n/ ) ) {
138 exit;
139 }
140
141 print "\nDo you want me to stop warning you [y/N]? ";
142 $ctu = <STDIN>;
143 if ( $ctu =~ /^y\n/i ) {
144 $print_config_version = $conf_pl_version;
145 } else {
146 $print_config_version = $config_version;
147 }
148 } else {
149 $print_config_version = $config_version;
150 }
151 $config = 2;
152 open( FILE, "config_default.php" );
1e0628fb 153} else {
eaace00e 154 print "No configuration file found. Please get config_default.php\n";
155 print "or config.php before running this again. This program needs\n";
156 print "a default config file to get default values.\n";
157 exit;
bbd30ac8 158}
159
a3439b27 160# Read and parse the current configuration file
161# (either config.php or config_default.php).
eaace00e 162while ( $line = <FILE> ) {
598294a7 163 $line =~ s/^\s+//;
eaace00e 164 $line =~ s/^\$//;
165 $var = $line;
166
167 $var =~ s/=/EQUALS/;
85645192 168 if ( $var =~ /^([a-z])/i ) {
eaace00e 169 @options = split ( /\s*EQUALS\s*/, $var );
85645192 170 $options[1] =~ s/[\n\r]//g;
171 $options[1] =~ s/[\'\"];\s*$//;
eaace00e 172 $options[1] =~ s/;$//;
85645192 173 $options[1] =~ s/^[\'\"]//;
ed65d11b 174 # de-escape escaped strings
175 $options[1] =~ s/\\'/'/g;
176 $options[1] =~ s/\\\\/\\/g;
eaace00e 177
85645192 178 if ( $options[0] =~ /^theme\[[0-9]+\]\[['"]PATH['"]\]/ ) {
eaace00e 179 $sub = $options[0];
85645192 180 $sub =~ s/\]\[['"]PATH['"]\]//;
eaace00e 181 $sub =~ s/.*\[//;
182 if ( -e "../themes" ) {
183 $options[1] =~ s/^\.\.\/config/\.\.\/themes/;
a3439b27 184 }
8bd9e0dd 185 $theme_path[$sub] = &change_to_rel_path($options[1]);
85645192 186 } elsif ( $options[0] =~ /^theme\[[0-9]+\]\[['"]NAME['"]\]/ ) {
eaace00e 187 $sub = $options[0];
85645192 188 $sub =~ s/\]\[['"]NAME['"]\]//;
eaace00e 189 $sub =~ s/.*\[//;
190 $theme_name[$sub] = $options[1];
a1b036d6 191 } elsif ( $options[0] =~ /^plugins\[[0-9]*\]/ ) {
eaace00e 192 $sub = $options[0];
193 $sub =~ s/\]//;
194 $sub =~ s/^plugins\[//;
a1b036d6 195 if ($sub eq '') {
196 push @plugins, $options[1];
197 } else {
198 $plugins[$sub] = $options[1];
199 }
eaace00e 200 } elsif ( $options[0] =~ /^ldap_server\[[0-9]+\]/ ) {
201 $sub = $options[0];
202 $sub =~ s/\]//;
203 $sub =~ s/^ldap_server\[//;
204 $continue = 0;
205 while ( ( $tmp = <FILE> ) && ( $continue != 1 ) ) {
206 if ( $tmp =~ /\);\s*$/ ) {
207 $continue = 1;
208 }
209
85645192 210 if ( $tmp =~ /^\s*[\'\"]host[\'\"]/i ) {
211 $tmp =~ s/^\s*[\'\"]host[\'\"]\s*=>\s*[\'\"]//i;
212 $tmp =~ s/[\'\"],?\s*$//;
213 $tmp =~ s/[\'\"]\);\s*$//;
eaace00e 214 $host = $tmp;
85645192 215 } elsif ( $tmp =~ /^\s*[\'\"]base[\'\"]/i ) {
216 $tmp =~ s/^\s*[\'\"]base[\'\"]\s*=>\s*[\'\"]//i;
217 $tmp =~ s/[\'\"],?\s*$//;
218 $tmp =~ s/[\'\"]\);\s*$//;
eaace00e 219 $base = $tmp;
85645192 220 } elsif ( $tmp =~ /^\s*[\'\"]charset[\'\"]/i ) {
221 $tmp =~ s/^\s*[\'\"]charset[\'\"]\s*=>\s*[\'\"]//i;
222 $tmp =~ s/[\'\"],?\s*$//;
223 $tmp =~ s/[\'\"]\);\s*$//;
eaace00e 224 $charset = $tmp;
85645192 225 } elsif ( $tmp =~ /^\s*[\'\"]port[\'\"]/i ) {
226 $tmp =~ s/^\s*[\'\"]port[\'\"]\s*=>\s*[\'\"]?//i;
227 $tmp =~ s/[\'\"]?,?\s*$//;
228 $tmp =~ s/[\'\"]?\);\s*$//;
eaace00e 229 $port = $tmp;
85645192 230 } elsif ( $tmp =~ /^\s*[\'\"]maxrows[\'\"]/i ) {
231 $tmp =~ s/^\s*[\'\"]maxrows[\'\"]\s*=>\s*[\'\"]?//i;
232 $tmp =~ s/[\'\"]?,?\s*$//;
233 $tmp =~ s/[\'\"]?\);\s*$//;
eaace00e 234 $maxrows = $tmp;
43397658 235 } elsif ( $tmp =~ /^\s*[\'\"]filter[\'\"]/i ) {
236 $tmp =~ s/^\s*[\'\"]filter[\'\"]\s*=>\s*[\'\"]?//i;
237 $tmp =~ s/[\'\"]?,?\s*$//;
238 $tmp =~ s/[\'\"]?\);\s*$//;
239 $filter = $tmp;
85645192 240 } elsif ( $tmp =~ /^\s*[\'\"]name[\'\"]/i ) {
241 $tmp =~ s/^\s*[\'\"]name[\'\"]\s*=>\s*[\'\"]//i;
242 $tmp =~ s/[\'\"],?\s*$//;
243 $tmp =~ s/[\'\"]\);\s*$//;
eaace00e 244 $name = $tmp;
85645192 245 } elsif ( $tmp =~ /^\s*[\'\"]binddn[\'\"]/i ) {
246 $tmp =~ s/^\s*[\'\"]binddn[\'\"]\s*=>\s*[\'\"]//i;
247 $tmp =~ s/[\'\"],?\s*$//;
248 $tmp =~ s/[\'\"]\);\s*$//;
30e9932c 249 $binddn = $tmp;
85645192 250 } elsif ( $tmp =~ /^\s*[\'\"]bindpw[\'\"]/i ) {
251 $tmp =~ s/^\s*[\'\"]bindpw[\'\"]\s*=>\s*[\'\"]//i;
252 $tmp =~ s/[\'\"],?\s*$//;
253 $tmp =~ s/[\'\"]\);\s*$//;
30e9932c 254 $bindpw = $tmp;
85645192 255 } elsif ( $tmp =~ /^\s*[\'\"]protocol[\'\"]/i ) {
256 $tmp =~ s/^\s*[\'\"]protocol[\'\"]\s*=>\s*[\'\"]?//i;
257 $tmp =~ s/[\'\"]?,?\s*$//;
258 $tmp =~ s/[\'\"]?\);\s*$//;
30e9932c 259 $protocol = $tmp;
43397658 260 } elsif ( $tmp =~ /^\s*[\'\"]limit_scope[\'\"]/i ) {
261 $tmp =~ s/^\s*[\'\"]limit_scope[\'\"]\s*=>\s*[\'\"]?//i;
262 $tmp =~ s/[\'\"]?,?\s*$//;
263 $tmp =~ s/[\'\"]?\);\s*$//;
264 $limit_scope = $tmp;
327e2d96 265 } elsif ( $tmp =~ /^\s*[\'\"]listing[\'\"]/i ) {
266 $tmp =~ s/^\s*[\'\"]listing[\'\"]\s*=>\s*[\'\"]?//i;
267 $tmp =~ s/[\'\"]?,?\s*$//;
268 $tmp =~ s/[\'\"]?\);\s*$//;
269 $listing = $tmp;
593370a4 270 } elsif ( $tmp =~ /^\s*[\'\"]search_tree[\'\"]/i ) {
271 $tmp =~ s/^\s*[\'\"]search_tree[\'\"]\s*=>\s*[\'\"]?//i;
272 $tmp =~ s/[\'\"]?,?\s*$//;
273 $tmp =~ s/[\'\"]?\);\s*$//;
274 $search_tree = $tmp;
275 } elsif ( $tmp =~ /^\s*[\'\"]starttls[\'\"]/i ) {
276 $tmp =~ s/^\s*[\'\"]starttls[\'\"]\s*=>\s*[\'\"]?//i;
277 $tmp =~ s/[\'\"]?,?\s*$//;
278 $tmp =~ s/[\'\"]?\);\s*$//;
279 $starttls = $tmp;
eaace00e 280 }
a3439b27 281 }
eaace00e 282 $ldap_host[$sub] = $host;
283 $ldap_base[$sub] = $base;
284 $ldap_name[$sub] = $name;
285 $ldap_port[$sub] = $port;
286 $ldap_maxrows[$sub] = $maxrows;
43397658 287 $ldap_filter[$sub] = $filter;
eaace00e 288 $ldap_charset[$sub] = $charset;
30e9932c 289 $ldap_binddn[$sub] = $binddn;
290 $ldap_bindpw[$sub] = $bindpw;
291 $ldap_protocol[$sub] = $protocol;
43397658 292 $ldap_limit_scope[$sub] = $limit_scope;
327e2d96 293 $ldap_listing[$sub] = $listing;
593370a4 294 $ldap_search_tree[$sub] = $search_tree;
295 $ldap_starttls[$sub] = $starttls;
8bd9e0dd 296 } elsif ( $options[0] =~ /^(data_dir|attachment_dir|theme_css|org_logo|signout_page)$/ ) {
297 ${ $options[0] } = &change_to_rel_path($options[1]);
eaace00e 298 } else {
299 ${ $options[0] } = $options[1];
300 }
301 }
bbd30ac8 302}
1a7a2fcc 303close FILE;
0ae4c1f2 304
35aaf666 305$useSendmail = 'false' if ( lc($useSendmail) ne 'true' );
306$sendmail_path = "/usr/sbin/sendmail" if ( !$sendmail_path );
307$pop_before_smtp = 'false' if ( !$pop_before_smtp );
308$default_unseen_notify = 2 if ( !$default_unseen_notify );
309$default_unseen_type = 1 if ( !$default_unseen_type );
310$config_use_color = 0 if ( !$config_use_color );
311$invert_time = 'false' if ( !$invert_time );
312$force_username_lowercase = 'false' if ( !$force_username_lowercase );
313$optional_delimiter = "detect" if ( !$optional_delimiter );
314$auto_create_special = 'false' if ( !$auto_create_special );
315$default_use_priority = 'true' if ( !$default_use_priority );
316$hide_sm_attributions = 'false' if ( !$hide_sm_attributions );
317$default_use_mdn = 'true' if ( !$default_use_mdn );
318$delete_folder = 'false' if ( !$delete_folder );
319$noselect_fix_enable = 'false' if ( !$noselect_fix_enable );
320$frame_top = "_top" if ( !$frame_top );
321$provider_uri = '' if ( !$provider_uri );
322$provider_name = '' if ( !$provider_name );
323$edit_identity = 'true' if ( !$edit_identity );
324$edit_name = 'true' if ( !$edit_name );
325$allow_thread_sort = 'false' if ( !$allow_thread_sort );
aacc7bec 326$allow_server_sort = 'false' if ( !$allow_server_sort );
35aaf666 327$no_list_for_subscribe = 'false' if ( !$no_list_for_subscribe );
328$allow_charset_search = 'true' if ( !$allow_charset_search );
66bfb27b 329$allow_advanced_search = 0 if ( !$allow_advanced_search) ;
35aaf666 330$prefs_user_field = 'user' if ( !$prefs_user_field );
331$prefs_key_field = 'prefkey' if ( !$prefs_key_field );
332$prefs_val_field = 'prefval' if ( !$prefs_val_field );
35aaf666 333$use_smtp_tls= 'false' if ( !$use_smtp_tls);
334$smtp_auth_mech = 'none' if ( !$smtp_auth_mech );
335$use_imap_tls = 'false' if ( !$use_imap_tls );
336$imap_auth_mech = 'login' if ( !$imap_auth_mech );
337$session_name = 'SQMSESSID' if ( !$session_name );
71d3f882 338$skip_SM_header = 'false' if ( !$skip_SM_header );
339$default_use_javascript_addr_book = 'false' if (! $default_use_javascript_addr_book);
340# since 1.5.0
35aaf666 341$show_alternative_names = 'false' if ( !$show_alternative_names );
5ba5dc8e 342# $available_languages option available only in 1.5.0. removed due to $languages
343# implementation changes. options are provided by limit_languages plugin
344# $available_languages = 'all' if ( !$available_languages );
f03f6ee7 345$aggressive_decoding = 'false' if ( !$aggressive_decoding );
35aaf666 346$advanced_tree = 'false' if ( !$advanced_tree );
35aaf666 347$use_php_recode = 'false' if ( !$use_php_recode );
348$use_php_iconv = 'false' if ( !$use_php_iconv );
71d3f882 349# since 1.5.1
350$use_icons = 'false' if ( !$use_icons );
ef6ad2a1 351$use_iframe = 'false' if ( !$use_iframe );
71d3f882 352$lossy_encoding = 'false' if ( !$lossy_encoding );
353$allow_remote_configtest = 'false' if ( !$allow_remote_configtest );
354$addrbook_global_table = 'global_abook' if ( !$addrbook_global_table );
355$addrbook_global_writeable = 'false' if ( !$addrbook_global_writeable );
356$addrbook_global_listing = 'false' if ( !$addrbook_global_listing );
357$abook_global_file = '' if ( !$abook_global_file);
358$abook_global_file_writeable = 'false' if ( !$abook_global_file_writeable);
359$abook_global_file_listing = 'true' if ( !$abook_global_file_listing );
432db2fc 360$encode_header_key = '' if ( !$encode_header_key );
361$hide_auth_header = 'false' if ( !$hide_auth_header );
ee20a285 362$time_zone_type = '0' if ( !$time_zone_type );
06316c07 363$prefs_user_size = 128 if ( !$prefs_user_size );
364$prefs_key_size = 64 if ( !$prefs_key_size );
365$prefs_val_size = 65536 if ( !$prefs_val_size );
fd7ab795 366# add qmail-inject test here for backwards compatibility
367if ( !$sendmail_args && $sendmail_path =~ /qmail-inject/ ) {
368 $sendmail_args = '';
369} elsif ( !$sendmail_args ) {
370 $sendmail_args = '-i -t';
371}
39d3ec89 372
eaace00e 373if ( $ARGV[0] eq '--install-plugin' ) {
374 print "Activating plugin " . $ARGV[1] . "\n";
ebd13f55 375 push @plugins, $ARGV[1];
376 save_data();
377 exit(0);
eaace00e 378} elsif ( $ARGV[0] eq '--remove-plugin' ) {
379 print "Removing plugin " . $ARGV[1] . "\n";
ebd13f55 380 foreach $plugin (@plugins) {
eaace00e 381 if ( $plugin ne $ARGV[1] ) {
382 push @newplugins, $plugin;
ebd13f55 383 }
384 }
385 @plugins = @newplugins;
386 save_data();
387 exit(0);
388}
389
5b6ae78a 390#####################################################################################
eaace00e 391if ( $config_use_color == 1 ) {
392 $WHT = "\x1B[37;1m";
393 $NRM = "\x1B[0m";
0ecb47e5 394} else {
eaace00e 395 $WHT = "";
396 $NRM = "";
397 $config_use_color = 2;
398}
399
8b5c49cd 400while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
f8c17cdd 401 clear_screen();
eaace00e 402 print $WHT. "SquirrelMail Configuration : " . $NRM;
403 if ( $config == 1 ) { print "Read: config.php"; }
404 elsif ( $config == 2 ) { print "Read: config_default.php"; }
405 print " ($print_config_version)\n";
406 print "---------------------------------------------------------\n";
407
408 if ( $menu == 0 ) {
409 print $WHT. "Main Menu --\n" . $NRM;
410 print "1. Organization Preferences\n";
411 print "2. Server Settings\n";
412 print "3. Folder Defaults\n";
413 print "4. General Options\n";
414 print "5. Themes\n";
4272758c 415 print "6. Address Books\n";
eaace00e 416 print "7. Message of the Day (MOTD)\n";
417 print "8. Plugins\n";
418 print "9. Database\n";
598294a7 419 print "10. Language settings\n";
420 print "11. Tweaks\n";
eaace00e 421 print "\n";
422 print "D. Set pre-defined settings for specific IMAP servers\n";
423 print "\n";
424 } elsif ( $menu == 1 ) {
425 print $WHT. "Organization Preferences\n" . $NRM;
b6e0c3b6 426 print "1. Organization Name : $WHT$org_name$NRM\n";
427 print "2. Organization Logo : $WHT$org_logo$NRM\n";
428 print "3. Org. Logo Width/Height : $WHT($org_logo_width/$org_logo_height)$NRM\n";
429 print "4. Organization Title : $WHT$org_title$NRM\n";
430 print "5. Signout Page : $WHT$signout_page$NRM\n";
39d3ec89 431 print "6. Top Frame : $WHT$frame_top$NRM\n";
432 print "7. Provider link : $WHT$provider_uri$NRM\n";
433 print "8. Provider name : $WHT$provider_name$NRM\n";
0ae4c1f2 434
eaace00e 435 print "\n";
dcc1cc82 436 print "R Return to Main Menu\n";
eaace00e 437 } elsif ( $menu == 2 ) {
47a29326 438 print $WHT. "Server Settings\n\n" . $NRM;
439 print $WHT . "General" . $NRM . "\n";
440 print "-------\n";
441 print "1. Domain : $WHT$domain$NRM\n";
442 print "2. Invert Time : $WHT$invert_time$NRM\n";
443 print "3. Sendmail or SMTP : $WHT";
35aaf666 444 if ( lc($useSendmail) eq 'true' ) {
eaace00e 445 print "Sendmail";
446 } else {
447 print "SMTP";
448 }
449 print "$NRM\n";
47a29326 450 print "\n";
598294a7 451
47a29326 452 if ( $show_imap_settings ) {
453 print $WHT . "IMAP Settings". $NRM . "\n--------------\n";
454 print "4. IMAP Server : $WHT$imapServerAddress$NRM\n";
455 print "5. IMAP Port : $WHT$imapPort$NRM\n";
456 print "6. Authentication type : $WHT$imap_auth_mech$NRM\n";
457 print "7. Secure IMAP (TLS) : $WHT$use_imap_tls$NRM\n";
458 print "8. Server software : $WHT$imap_server_type$NRM\n";
459 print "9. Delimiter : $WHT$optional_delimiter$NRM\n";
460 print "\n";
461 } elsif ( $show_smtp_settings ) {
35aaf666 462 if ( lc($useSendmail) eq 'true' ) {
47a29326 463 print $WHT . "Sendmail" . $NRM . "\n--------\n";
464 print "4. Sendmail Path : $WHT$sendmail_path$NRM\n";
fd7ab795 465 print "5. Sendmail arguments : $WHT$sendmail_args$NRM\n";
466 print "6. Header encryption key : $WHT$encode_header_key$NRM\n";
47a29326 467 print "\n";
468 } else {
469 print $WHT . "SMTP Settings" . $NRM . "\n-------------\n";
470 print "4. SMTP Server : $WHT$smtpServerAddress$NRM\n";
471 print "5. SMTP Port : $WHT$smtpPort$NRM\n";
472 print "6. POP before SMTP : $WHT$pop_before_smtp$NRM\n";
473 print "7. SMTP Authentication : $WHT$smtp_auth_mech$NRM\n";
474 print "8. Secure SMTP (TLS) : $WHT$use_smtp_tls$NRM\n";
432db2fc 475 print "9. Header encryption key : $WHT$encode_header_key$NRM\n";
47a29326 476 print "\n";
477 }
eaace00e 478 }
47a29326 479
480 if ($show_imap_settings == 0) {
481 print "A. Update IMAP Settings : ";
482 print "$WHT$imapServerAddress$NRM:";
483 print "$WHT$imapPort$NRM ";
484 print "($WHT$imap_server_type$NRM)\n";
598294a7 485 }
47a29326 486 if ($show_smtp_settings == 0) {
35aaf666 487 if ( lc($useSendmail) eq 'true' ) {
47a29326 488 print "B. Change Sendmail Config : $WHT$sendmail_path$NRM\n";
489 } else {
490 print "B. Update SMTP Settings : ";
491 print "$WHT$smtpServerAddress$NRM:";
492 print "$WHT$smtpPort$NRM\n";
493 }
494 }
495 if ( $show_smtp_settings || $show_imap_settings )
496 {
598294a7 497 print "H. Hide " .
498 ($show_imap_settings ? "IMAP Server" :
35aaf666 499 (lc($useSendmail) eq 'true') ? "Sendmail" : "SMTP") . " Settings\n";
47a29326 500 }
598294a7 501
eaace00e 502 print "\n";
dcc1cc82 503 print "R Return to Main Menu\n";
eaace00e 504 } elsif ( $menu == 3 ) {
505 print $WHT. "Folder Defaults\n" . $NRM;
506 print "1. Default Folder Prefix : $WHT$default_folder_prefix$NRM\n";
507 print "2. Show Folder Prefix Option : $WHT$show_prefix_option$NRM\n";
508 print "3. Trash Folder : $WHT$trash_folder$NRM\n";
509 print "4. Sent Folder : $WHT$sent_folder$NRM\n";
510 print "5. Drafts Folder : $WHT$draft_folder$NRM\n";
511 print "6. By default, move to trash : $WHT$default_move_to_trash$NRM\n";
512 print "7. By default, move to sent : $WHT$default_move_to_sent$NRM\n";
513 print "8. By default, save as draft : $WHT$default_save_as_draft$NRM\n";
514 print "9. List Special Folders First : $WHT$list_special_folders_first$NRM\n";
515 print "10. Show Special Folders Color : $WHT$use_special_folder_color$NRM\n";
516 print "11. Auto Expunge : $WHT$auto_expunge$NRM\n";
517 print "12. Default Sub. of INBOX : $WHT$default_sub_of_inbox$NRM\n";
518 print "13. Show 'Contain Sub.' Option : $WHT$show_contain_subfolders_option$NRM\n";
519 print "14. Default Unseen Notify : $WHT$default_unseen_notify$NRM\n";
520 print "15. Default Unseen Type : $WHT$default_unseen_type$NRM\n";
521 print "16. Auto Create Special Folders : $WHT$auto_create_special$NRM\n";
2eec12b5 522 print "17. Folder Delete Bypasses Trash : $WHT$delete_folder$NRM\n";
ca85aabe 523 print "18. Enable /NoSelect folder fix : $WHT$noselect_fix_enable$NRM\n";
eaace00e 524 print "\n";
dcc1cc82 525 print "R Return to Main Menu\n";
eaace00e 526 } elsif ( $menu == 4 ) {
527 print $WHT. "General Options\n" . $NRM;
39d3ec89 528 print "1. Data Directory : $WHT$data_dir$NRM\n";
529 print "2. Attachment Directory : $WHT$attachment_dir$NRM\n";
530 print "3. Directory Hash Level : $WHT$dir_hash_level$NRM\n";
531 print "4. Default Left Size : $WHT$default_left_size$NRM\n";
532 print "5. Usernames in Lowercase : $WHT$force_username_lowercase$NRM\n";
533 print "6. Allow use of priority : $WHT$default_use_priority$NRM\n";
534 print "7. Hide SM attributions : $WHT$hide_sm_attributions$NRM\n";
535 print "8. Allow use of receipts : $WHT$default_use_mdn$NRM\n";
432db2fc 536 print "9. Allow editing of identity : $WHT$edit_identity$NRM\n";
537 print " Allow editing of name : $WHT$edit_name$NRM\n";
538 print " Remove username from header : $WHT$hide_auth_header$NRM\n";
39d3ec89 539 print "10. Allow server thread sort : $WHT$allow_thread_sort$NRM\n";
aacc7bec 540 print "11. Allow server-side sorting : $WHT$allow_server_sort$NRM\n";
39d3ec89 541 print "12. Allow server charset search : $WHT$allow_charset_search$NRM\n";
de74555e 542 print "13. Allow advanced search : $WHT$allow_advanced_search$NRM\n";
66bfb27b 543 print "14. PHP session name : $WHT$session_name$NRM\n";
ee20a285 544 print "15. Time zone configuration : $WHT$time_zone_type$NRM\n";
eaace00e 545 print "\n";
dcc1cc82 546 print "R Return to Main Menu\n";
eaace00e 547 } elsif ( $menu == 5 ) {
548 print $WHT. "Themes\n" . $NRM;
549 print "1. Change Themes\n";
2eec12b5 550 for ( $count = 0 ; $count <= $#theme_name/2 ; $count++ ) {
551 $temp_name = $theme_name[$count*2];
598294a7 552 printf " %s%*s %s\n", $temp_name,
2eec12b5 553 40 - length($temp_name), " ",
554 $theme_name[($count*2)+1];
eaace00e 555 }
556 print "2. CSS File : $WHT$theme_css$NRM\n";
557 print "\n";
dcc1cc82 558 print "R Return to Main Menu\n";
eaace00e 559 } elsif ( $menu == 6 ) {
4272758c 560 print $WHT. "Address Books\n" . $NRM;
561 print "1. Change LDAP Servers\n";
eaace00e 562 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
563 print " > $ldap_host[$count]\n";
564 }
71d3f882 565 print "2. Use Javascript address book search : $WHT$default_use_javascript_addr_book$NRM\n";
ee20a285 566 print "3. Global address book file : $WHT$abook_global_file$NRM\n";
4272758c 567 print "4. Allow writing into global file address book : $WHT$abook_global_file_writeable$NRM\n";
71d3f882 568 print "5. Allow listing of global file address book : $WHT$abook_global_file_listing$NRM\n";
eaace00e 569 print "\n";
dcc1cc82 570 print "R Return to Main Menu\n";
eaace00e 571 } elsif ( $menu == 7 ) {
572 print $WHT. "Message of the Day (MOTD)\n" . $NRM;
573 print "\n$motd\n";
574 print "\n";
575 print "1 Edit the MOTD\n";
576 print "\n";
dcc1cc82 577 print "R Return to Main Menu\n";
eaace00e 578 } elsif ( $menu == 8 ) {
579 print $WHT. "Plugins\n" . $NRM;
580 print " Installed Plugins\n";
581 $num = 0;
582 for ( $count = 0 ; $count <= $#plugins ; $count++ ) {
583 $num = $count + 1;
584 print " $num. $plugins[$count]\n";
585 }
586 print "\n Available Plugins:\n";
587 opendir( DIR, "../plugins" );
588 @files = readdir(DIR);
589 $pos = 0;
590 @unused_plugins = ();
591 for ( $i = 0 ; $i <= $#files ; $i++ ) {
592 if ( -d "../plugins/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
593 $match = 0;
594 for ( $k = 0 ; $k <= $#plugins ; $k++ ) {
595 if ( $plugins[$k] eq $files[$i] ) {
596 $match = 1;
597 }
598 }
599 if ( $match == 0 ) {
600 $unused_plugins[$pos] = $files[$i];
601 $pos++;
602 }
1a7a2fcc 603 }
eaace00e 604 }
605
606 for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
607 $num = $num + 1;
608 print " $num. $unused_plugins[$i]\n";
609 }
610 closedir DIR;
611
eaace00e 612 print "\n";
dcc1cc82 613 print "R Return to Main Menu\n";
eaace00e 614 } elsif ( $menu == 9 ) {
615 print $WHT. "Database\n" . $NRM;
616 print "1. DSN for Address Book : $WHT$addrbook_dsn$NRM\n";
617 print "2. Table for Address Book : $WHT$addrbook_table$NRM\n";
99a6c222 618 print "\n";
eaace00e 619 print "3. DSN for Preferences : $WHT$prefs_dsn$NRM\n";
620 print "4. Table for Preferences : $WHT$prefs_table$NRM\n";
06316c07 621 print "5. Field for username : $WHT$prefs_user_field$NRM ($prefs_user_size)\n";
622 print "6. Field for prefs key : $WHT$prefs_key_field$NRM ($prefs_key_size)\n";
623 print "7. Field for prefs value : $WHT$prefs_val_field$NRM ($prefs_val_size)\n";
eaace00e 624 print "\n";
30e9932c 625 print "8. DSN for Global Address Book : $WHT$addrbook_global_dsn$NRM\n";
626 print "9. Table for Global Address Book : $WHT$addrbook_global_table$NRM\n";
627 print "10. Allow writing into Global Address Book : $WHT$addrbook_global_writeable$NRM\n";
628 print "11. Allow listing of Global Address Book : $WHT$addrbook_global_listing$NRM\n";
629 print "\n";
dcc1cc82 630 print "R Return to Main Menu\n";
39d3ec89 631 } elsif ( $menu == 10 ) {
35aaf666 632 print $WHT. "Language settings\n" . $NRM;
633 print "1. Default Language : $WHT$squirrelmail_default_language$NRM\n";
634 print "2. Default Charset : $WHT$default_charset$NRM\n";
635 print "3. Show alternative language names : $WHT$show_alternative_names$NRM\n";
5ba5dc8e 636 print "4. Enable aggressive decoding : $WHT$aggressive_decoding$NRM\n";
637 print "5. Enable lossy encoding : $WHT$lossy_encoding$NRM\n";
35aaf666 638 print "\n";
dcc1cc82 639 print "R Return to Main Menu\n";
39d3ec89 640 } elsif ( $menu == 11 ) {
35aaf666 641 print $WHT. "Interface tweaks\n" . $NRM;
74d6a0d9 642 print "1. Advanced tree : $WHT$advanced_tree$NRM\n";
643 print "2. Display html mails in iframe : $WHT$use_iframe$NRM\n";
644 print "3. Use Icons : $WHT$use_icons$NRM\n";
35aaf666 645 print "\n";
646 print $WHT. "PHP tweaks\n" . $NRM;
74d6a0d9 647 print "4. Use php recode functions : $WHT$use_php_recode$NRM\n";
648 print "5. Use php iconv functions : $WHT$use_php_iconv$NRM\n";
71d3f882 649 print "\n";
650 print $WHT. "Configuration tweaks\n" . $NRM;
74d6a0d9 651 print "6. Allow remote configtest : $WHT$allow_remote_configtest$NRM\n";
35aaf666 652 print "\n";
dcc1cc82 653 print "R Return to Main Menu\n";
eaace00e 654 }
655 if ( $config_use_color == 1 ) {
1ef64acb 656 print "C Turn color off\n";
eaace00e 657 } else {
1ef64acb 658 print "C Turn color on\n";
eaace00e 659 }
dcc1cc82 660 print "S Save data\n";
661 print "Q Quit\n";
eaace00e 662
663 print "\n";
664 print "Command >> " . $WHT;
665 $command = <STDIN>;
85645192 666 $command =~ s/[\n\r]//g;
eaace00e 667 $command =~ tr/A-Z/a-z/;
668 print "$NRM\n";
669
670 # Read the commands they entered.
671 if ( $command eq "r" ) {
672 $menu = 0;
673 } elsif ( $command eq "s" ) {
674 save_data();
675 print "Press enter to continue...";
676 $tmp = <STDIN>;
677 $saved = 1;
678 } elsif ( ( $command eq "q" ) && ( $saved == 0 ) ) {
679 print "You have not saved your data.\n";
680 print "Save? [" . $WHT . "Y" . $NRM . "/n]: ";
681 $save = <STDIN>;
682 if ( ( $save =~ /^y/i ) || ( $save =~ /^\s*$/ ) ) {
683 save_data();
684 }
685 } elsif ( $command eq "c" ) {
686 if ( $config_use_color == 1 ) {
687 $config_use_color = 2;
688 $WHT = "";
689 $NRM = "";
690 } else {
691 $config_use_color = 1;
692 $WHT = "\x1B[37;1m";
693 $NRM = "\x1B[0m";
694 }
695 } elsif ( $command eq "d" && $menu == 0 ) {
696 set_defaults();
697 } else {
698 $saved = 0;
699 if ( $menu == 0 ) {
39d3ec89 700 if ( ( $command > 0 ) && ( $command < 12 ) ) {
eaace00e 701 $menu = $command;
1a7a2fcc 702 }
eaace00e 703 } elsif ( $menu == 1 ) {
704 if ( $command == 1 ) { $org_name = command1(); }
705 elsif ( $command == 2 ) { $org_logo = command2(); }
b6e0c3b6 706 elsif ( $command == 3 ) { ($org_logo_width,$org_logo_height) = command2a(); }
707 elsif ( $command == 4 ) { $org_title = command3(); }
708 elsif ( $command == 5 ) { $signout_page = command4(); }
39d3ec89 709 elsif ( $command == 6 ) { $frame_top = command6(); }
710 elsif ( $command == 7 ) { $provider_uri = command7(); }
711 elsif ( $command == 8 ) { $provider_name = command8(); }
0ae4c1f2 712
eaace00e 713 } elsif ( $menu == 2 ) {
47a29326 714 if ( $command eq "a" ) { $show_imap_settings = 1; $show_smtp_settings = 0; }
715 elsif ( $command eq "b" ) { $show_imap_settings = 0; $show_smtp_settings = 1; }
716 elsif ( $command eq "h" ) { $show_imap_settings = 0; $show_smtp_settings = 0; }
717 elsif ( $command <= 3 ) {
718 if ( $command == 1 ) { $domain = command11(); }
719 elsif ( $command == 2 ) { $invert_time = command110(); }
720 elsif ( $command == 3 ) { $useSendmail = command14(); }
721 $show_imap_settings = 0; $show_smtp_settings = 0;
722 } elsif ( $show_imap_settings ) {
723 if ( $command == 4 ) { $imapServerAddress = command12(); }
724 elsif ( $command == 5 ) { $imapPort = command13(); }
b47821fb 725 elsif ( $command == 6 ) { $imap_auth_mech = command112a(); }
47a29326 726 elsif ( $command == 7 ) { $use_imap_tls = command113("IMAP",$use_imap_tls); }
727 elsif ( $command == 8 ) { $imap_server_type = command19(); }
728 elsif ( $command == 9 ) { $optional_delimiter = command111(); }
35aaf666 729 } elsif ( $show_smtp_settings && lc($useSendmail) eq 'true' ) {
432db2fc 730 if ( $command == 4 ) { $sendmail_path = command15(); }
fd7ab795 731 elsif ( $command == 5 ) { $sendmail_args = command_sendmail_args(); }
732 elsif ( $command == 6 ) { $encode_header_key = command114(); }
47a29326 733 } elsif ( $show_smtp_settings ) {
734 if ( $command == 4 ) { $smtpServerAddress = command16(); }
735 elsif ( $command == 5 ) { $smtpPort = command17(); }
736 elsif ( $command == 6 ) { $pop_before_smtp = command18a(); }
b47821fb 737 elsif ( $command == 7 ) { $smtp_auth_mech = command112b(); }
47a29326 738 elsif ( $command == 8 ) { $use_smtp_tls = command113("SMTP",$use_smtp_tls); }
432db2fc 739 elsif ( $command == 9 ) { $encode_header_key = command114(); }
47a29326 740 }
eaace00e 741 } elsif ( $menu == 3 ) {
742 if ( $command == 1 ) { $default_folder_prefix = command21(); }
743 elsif ( $command == 2 ) { $show_prefix_option = command22(); }
744 elsif ( $command == 3 ) { $trash_folder = command23a(); }
745 elsif ( $command == 4 ) { $sent_folder = command23b(); }
746 elsif ( $command == 5 ) { $draft_folder = command23c(); }
747 elsif ( $command == 6 ) { $default_move_to_trash = command24a(); }
748 elsif ( $command == 7 ) { $default_move_to_sent = command24b(); }
749 elsif ( $command == 8 ) { $default_save_as_draft = command24c(); }
750 elsif ( $command == 9 ) { $list_special_folders_first = command27(); }
751 elsif ( $command == 10 ) { $use_special_folder_color = command28(); }
752 elsif ( $command == 11 ) { $auto_expunge = command29(); }
753 elsif ( $command == 12 ) { $default_sub_of_inbox = command210(); }
754 elsif ( $command == 13 ) { $show_contain_subfolders_option = command211(); }
755 elsif ( $command == 14 ) { $default_unseen_notify = command212(); }
756 elsif ( $command == 15 ) { $default_unseen_type = command213(); }
757 elsif ( $command == 16 ) { $auto_create_special = command214(); }
758 elsif ( $command == 17 ) { $delete_folder = command215(); }
ca85aabe 759 elsif ( $command == 18 ) { $noselect_fix_enable = command216(); }
eaace00e 760 } elsif ( $menu == 4 ) {
39d3ec89 761 if ( $command == 1 ) { $data_dir = command33a(); }
762 elsif ( $command == 2 ) { $attachment_dir = command33b(); }
763 elsif ( $command == 3 ) { $dir_hash_level = command33c(); }
764 elsif ( $command == 4 ) { $default_left_size = command35(); }
765 elsif ( $command == 5 ) { $force_username_lowercase = command36(); }
766 elsif ( $command == 6 ) { $default_use_priority = command37(); }
767 elsif ( $command == 7 ) { $hide_sm_attributions = command38(); }
768 elsif ( $command == 8 ) { $default_use_mdn = command39(); }
ee20a285 769 elsif ( $command == 9 ) { $edit_identity = command310(); }
39d3ec89 770 elsif ( $command == 10 ) { $allow_thread_sort = command312(); }
771 elsif ( $command == 11 ) { $allow_server_sort = command313(); }
772 elsif ( $command == 12 ) { $allow_charset_search = command314(); }
de74555e 773 elsif ( $command == 13 ) { $allow_advanced_search = command316(); }
774 elsif ( $command == 14 ) { $session_name = command317(); }
ee20a285 775 elsif ( $command == 15 ) { $time_zone_type = command318(); }
eaace00e 776 } elsif ( $menu == 5 ) {
777 if ( $command == 1 ) { command41(); }
778 elsif ( $command == 2 ) { $theme_css = command42(); }
779 } elsif ( $menu == 6 ) {
780 if ( $command == 1 ) { command61(); }
781 elsif ( $command == 2 ) { command62(); }
4272758c 782 elsif ( $command == 3 ) { $abook_global_file=command63(); }
783 elsif ( $command == 4 ) { command64(); }
71d3f882 784 elsif ( $command == 5 ) { command65(); }
eaace00e 785 } elsif ( $menu == 7 ) {
786 if ( $command == 1 ) { $motd = command71(); }
787 } elsif ( $menu == 8 ) {
788 if ( $command =~ /^[0-9]+/ ) { @plugins = command81(); }
eaace00e 789 } elsif ( $menu == 9 ) {
99a6c222 790 if ( $command == 1 ) { $addrbook_dsn = command91(); }
791 elsif ( $command == 2 ) { $addrbook_table = command92(); }
792 elsif ( $command == 3 ) { $prefs_dsn = command93(); }
793 elsif ( $command == 4 ) { $prefs_table = command94(); }
794 elsif ( $command == 5 ) { $prefs_user_field = command95(); }
795 elsif ( $command == 6 ) { $prefs_key_field = command96(); }
796 elsif ( $command == 7 ) { $prefs_val_field = command97(); }
30e9932c 797 elsif ( $command == 8 ) { $addrbook_global_dsn = command98(); }
798 elsif ( $command == 9 ) { $addrbook_global_table = command99(); }
799 elsif ( $command == 10 ) { $addrbook_global_writeable = command910(); }
800 elsif ( $command == 11 ) { $addrbook_global_listing = command911(); }
39d3ec89 801 } elsif ( $menu == 10 ) {
802 if ( $command == 1 ) { $squirrelmail_default_language = commandA1(); }
5ba5dc8e 803 elsif ( $command == 2 ) { $default_charset = commandA2(); }
dcc1cc82 804 elsif ( $command == 3 ) { $show_alternative_names = commandA3(); }
5ba5dc8e 805 elsif ( $command == 4 ) { $aggressive_decoding = commandA4(); }
806 elsif ( $command == 5 ) { $lossy_encoding = commandA5(); }
39d3ec89 807 } elsif ( $menu == 11 ) {
808 if ( $command == 1 ) { $advanced_tree = commandB1(); }
74d6a0d9 809 if ( $command == 2 ) { $use_iframe = commandB2(); }
6395c46d 810 elsif ( $command == 3 ) { $use_icons = commandB3(); }
811 elsif ( $command == 4 ) { $use_php_recode = commandB4(); }
812 elsif ( $command == 5 ) { $use_php_iconv = commandB5(); }
71d3f882 813 elsif ( $command == 6 ) { $allow_remote_configtest = commandB6(); }
eaace00e 814 }
815 }
828b4753 816}
817
cbd6543c 818# we exit here
819print "\nExiting conf.pl.\n".
35aaf666 820 "You might want to test your configuration by browsing to\n".
821 "http://your-squirrelmail-location/src/configtest.php\n".
822 "Happy SquirrelMailing!\n\n";
cbd6543c 823
824
828b4753 825####################################################################################
826
5b6ae78a 827# org_name
828sub command1 {
eaace00e 829 print "We have tried to make the name SquirrelMail as transparent as\n";
830 print "possible. If you set up an organization name, most places where\n";
831 print "SquirrelMail would take credit will be credited to your organization.\n";
832 print "\n";
360ef370 833 print "If your Organization Name includes a '\$', please precede it with a \\. \n";
834 print "Other '\$' will be considered the beginning of a variable that\n";
835 print "must be defined before the \$org_name is printed.\n";
360ef370 836 print "\n";
eaace00e 837 print "[$WHT$org_name$NRM]: $WHT";
838 $new_org_name = <STDIN>;
839 if ( $new_org_name eq "\n" ) {
840 $new_org_name = $org_name;
841 } else {
85645192 842 $new_org_name =~ s/[\r\n]//g;
35aaf666 843 $new_org_name =~ s/\"/&quot;/g;
eaace00e 844 }
845 return $new_org_name;
5b6ae78a 846}
847
848# org_logo
849sub command2 {
eaace00e 850 print "Your organization's logo is an image that will be displayed at\n";
25be56ab 851 print "different times throughout SquirrelMail. ";
852 print "\n";
853 print "Please be aware of the following: \n";
854 print " - Relative URLs are relative to the config dir\n";
855 print " to use the default logo, use ../images/sm_logo.png\n";
856 print " - To specify a logo defined outside the SquirrelMail source tree\n";
857 print " use the absolute URL the webserver would use to include the file\n";
5d28b77e 858 print " e.g. http://www.example.com/images/mylogo.gif or /images/mylogo.jpg\n";
eaace00e 859 print "\n";
860 print "[$WHT$org_logo$NRM]: $WHT";
861 $new_org_logo = <STDIN>;
862 if ( $new_org_logo eq "\n" ) {
863 $new_org_logo = $org_logo;
864 } else {
85645192 865 $new_org_logo =~ s/[\r\n]//g;
eaace00e 866 }
867 return $new_org_logo;
5b6ae78a 868}
869
b6e0c3b6 870# org_logo_width
871sub command2a {
872 print "Your organization's logo is an image that will be displayed at\n";
873 print "different times throughout SquirrelMail. Width\n";
874 print "and Height of your logo image. Use '0' to disable.\n";
875 print "\n";
876 print "Width: [$WHT$org_logo_width$NRM]: $WHT";
877 $new_org_logo_width = <STDIN>;
878 $new_org_logo_width =~ tr/0-9//cd; # only want digits!
879 if ( $new_org_logo_width eq '' ) {
880 $new_org_logo_width = $org_logo_width;
881 }
0e21688d 882 if ( $new_org_logo_width > 0 ) {
883 print "Height: [$WHT$org_logo_height$NRM]: $WHT";
884 $new_org_logo_height = <STDIN>;
885 $new_org_logo_height =~ tr/0-9//cd; # only want digits!
e03345e1 886 if( $new_org_logo_height eq '' ) {
35aaf666 887 $new_org_logo_height = $org_logo_height;
888 }
00c4b08d 889 } else {
0e21688d 890 $new_org_logo_height = 0;
b6e0c3b6 891 }
892 return ($new_org_logo_width, $new_org_logo_height);
893}
894
5b6ae78a 895# org_title
896sub command3 {
eaace00e 897 print "A title is what is displayed at the top of the browser window in\n";
898 print "the titlebar. Usually this will end up looking something like:\n";
899 print "\"Netscape: $org_title\"\n";
900 print "\n";
360ef370 901 print "If your Organization Title includes a '\$', please precede it with a \\. \n";
902 print "Other '\$' will be considered the beginning of a variable that\n";
903 print "must be defined before the \$org_title is printed.\n";
8b5c49cd 904 print "\$version, for example can be used, and will print the\n";
360ef370 905 print "string representing the current SquirrelMail version.\n";
906 print "\n";
eaace00e 907 print "[$WHT$org_title$NRM]: $WHT";
908 $new_org_title = <STDIN>;
909 if ( $new_org_title eq "\n" ) {
910 $new_org_title = $org_title;
911 } else {
85645192 912 $new_org_title =~ s/[\r\n]//g;
35aaf666 913 $new_org_title =~ s/\"/\'/g;
eaace00e 914 }
915 return $new_org_title;
5b6ae78a 916}
5b6ae78a 917
f923b93d 918# signout_page
919sub command4 {
eaace00e 920 print "When users click the Sign Out button they will be logged out and\n";
921 print "then sent to signout_page. If signout_page is left empty,\n";
922 print "(hit space and then return) they will be taken, as normal,\n";
923 print "to the default and rather sparse SquirrelMail signout page.\n";
924 print "\n";
925 print "[$WHT$signout_page$NRM]: $WHT";
926 $new_signout_page = <STDIN>;
927 if ( $new_signout_page eq "\n" ) {
928 $new_signout_page = $signout_page;
929 } else {
85645192 930 $new_signout_page =~ s/[\r\n]//g;
eaace00e 931 $new_signout_page =~ s/^\s+$//g;
932 }
933 return $new_signout_page;
6ef7145f 934}
935
80e86e94 936# Default top frame
937sub command6 {
938 print "SquirrelMail defaults to using the whole of the browser window.\n";
939 print "This allows you to keep it within a specified frame. The default\n";
940 print "is '_top'\n";
941 print "\n";
942 print "[$WHT$frame_top$NRM]: $WHT";
943 $new_frame_top = <STDIN>;
eaace00e 944 if ( $new_frame_top eq "\n" ) {
80e86e94 945 $new_frame_top = '_top';
946 } else {
85645192 947 $new_frame_top =~ s/[\r\n]//g;
80e86e94 948 $new_frame_top =~ s/^\s+$//g;
949 }
950 return $new_frame_top;
951}
952
0ae4c1f2 953# Default link to provider
954sub command7 {
955 print "Here you can set the link on the right of the page.\n";
8b5c49cd 956 print "If empty, it will link to the SquirrelMail About page.\n";
0ae4c1f2 957 print "\n";
958 print "[$WHT$provider_uri$NRM]: $WHT";
959 $new_provider_uri = <STDIN>;
960 if ( $new_provider_uri eq "\n" ) {
8b5c49cd 961 $new_provider_uri = '';
0ae4c1f2 962 } else {
85645192 963 $new_provider_uri =~ s/[\r\n]//g;
0ae4c1f2 964 $new_provider_uri =~ s/^\s+$//g;
965 }
7b6563c0 966 return $new_provider_uri;
0ae4c1f2 967}
968
969sub command8 {
970 print "Here you can set the name of the link on the right of the page.\n";
971 print "The default is 'SquirrelMail/'\n";
972 print "\n";
973 print "[$WHT$provider_name$NRM]: $WHT";
974 $new_provider_name = <STDIN>;
975 if ( $new_provider_name eq "\n" ) {
976 $new_provider_name = 'SquirrelMail';
977 } else {
85645192 978 $new_provider_name =~ s/[\r\n]//g;
0ae4c1f2 979 $new_provider_name =~ s/^\s+$//g;
980 }
7b6563c0 981 return $new_provider_name;
0ae4c1f2 982}
983
828b4753 984####################################################################################
5b6ae78a 985
828b4753 986# domain
987sub command11 {
e1e4f932 988 print "The domain name is the suffix at the end of all email addresses. If\n";
5d28b77e 989 print "for example, your email address is jdoe\@example.com, then your domain\n";
990 print "would be example.com.\n";
eaace00e 991 print "\n";
992 print "[$WHT$domain$NRM]: $WHT";
993 $new_domain = <STDIN>;
994 if ( $new_domain eq "\n" ) {
995 $new_domain = $domain;
996 } else {
85645192 997 $new_domain =~ s/[\r\n]//g;
eaace00e 998 }
999 return $new_domain;
828b4753 1000}
5b6ae78a 1001
828b4753 1002# imapServerAddress
1003sub command12 {
47a29326 1004 print "This is the hostname where your IMAP server can be contacted.\n";
eaace00e 1005 print "[$WHT$imapServerAddress$NRM]: $WHT";
1006 $new_imapServerAddress = <STDIN>;
1007 if ( $new_imapServerAddress eq "\n" ) {
1008 $new_imapServerAddress = $imapServerAddress;
1009 } else {
85645192 1010 $new_imapServerAddress =~ s/[\r\n]//g;
eaace00e 1011 }
1012 return $new_imapServerAddress;
828b4753 1013}
5b6ae78a 1014
828b4753 1015# imapPort
1016sub command13 {
eaace00e 1017 print "This is the port that your IMAP server is on. Usually this is 143.\n";
1018 print "[$WHT$imapPort$NRM]: $WHT";
1019 $new_imapPort = <STDIN>;
1020 if ( $new_imapPort eq "\n" ) {
1021 $new_imapPort = $imapPort;
1022 } else {
85645192 1023 $new_imapPort =~ s/[\r\n]//g;
eaace00e 1024 }
1025 return $new_imapPort;
828b4753 1026}
1027
1028# useSendmail
1029sub command14 {
eaace00e 1030 print "You now need to choose the method that you will use for sending\n";
1031 print "messages in SquirrelMail. You can either connect to an SMTP server\n";
1032 print "or use sendmail directly.\n";
35aaf666 1033 if ( lc($useSendmail) eq 'true' ) {
eaace00e 1034 $default_value = "1";
1035 } else {
1036 $default_value = "2";
1037 }
1038 print "\n";
1039 print " 1. Sendmail\n";
1040 print " 2. SMTP\n";
1041 print "Your choice [1/2] [$WHT$default_value$NRM]: $WHT";
1042 $use_sendmail = <STDIN>;
1043 if ( ( $use_sendmail =~ /^1\n/i )
1044 || ( ( $use_sendmail =~ /^\n/ ) && ( $default_value eq "1" ) ) ) {
35aaf666 1045 $useSendmail = 'true';
eaace00e 1046 } else {
35aaf666 1047 $useSendmail = 'false';
eaace00e 1048 }
1049 return $useSendmail;
828b4753 1050}
5b6ae78a 1051
828b4753 1052# sendmail_path
1053sub command15 {
fd7ab795 1054 # TODO: fix check
eaace00e 1055 if ( $sendmail_path[0] !~ /./ ) {
1056 $sendmail_path = "/usr/sbin/sendmail";
1057 }
1058 print "Specify where the sendmail executable is located. Usually /usr/sbin/sendmail\n";
1059 print "[$WHT$sendmail_path$NRM]: $WHT";
1060 $new_sendmail_path = <STDIN>;
1061 if ( $new_sendmail_path eq "\n" ) {
1062 $new_sendmail_path = $sendmail_path;
1063 } else {
85645192 1064 $new_sendmail_path =~ s/[\r\n]//g;
eaace00e 1065 }
1066 return $new_sendmail_path;
828b4753 1067}
5b6ae78a 1068
fd7ab795 1069# Extra sendmail arguments
1070sub command_sendmail_args {
1071 print "Specify additional sendmail program arguments.\n";
1072 print "\n";
1073 print "Make sure that arguments are supported by your sendmail program. -f argument \n";
1074 print "is added automatically by SquirrelMail scripts. Variable defaults to standard\n";
1075 print "/usr/sbin/sendmail arguments. If you use qmail-inject, nbsmtp or any other \n";
1076 print "sendmail wrapper, which does not support -i and -t arguments, set variable to\n";
1077 print "empty string or use arguments suitable for your mailer.\n";
1078 print "\n";
1079 print "[$WHT$sendmail_args$NRM]: $WHT";
1080 $new_sendmail_args = <STDIN>;
1081 if ( $new_sendmail_args eq "\n" ) {
1082 $new_sendmail_args = $sendmail_args;
1083 } else {
1084 # strip linefeeds and crs.
1085 $new_sendmail_args =~ s/[\r\n]//g;
1086 }
1087 return trim($new_sendmail_args);
1088}
1089
828b4753 1090# smtpServerAddress
1091sub command16 {
47a29326 1092 print "This is the hostname of your SMTP server.\n";
eaace00e 1093 print "[$WHT$smtpServerAddress$NRM]: $WHT";
1094 $new_smtpServerAddress = <STDIN>;
1095 if ( $new_smtpServerAddress eq "\n" ) {
1096 $new_smtpServerAddress = $smtpServerAddress;
1097 } else {
85645192 1098 $new_smtpServerAddress =~ s/[\r\n]//g;
eaace00e 1099 }
1100 return $new_smtpServerAddress;
828b4753 1101}
1102
1103# smtpPort
1104sub command17 {
eaace00e 1105 print "This is the port to connect to for SMTP. Usually 25.\n";
1106 print "[$WHT$smtpPort$NRM]: $WHT";
1107 $new_smtpPort = <STDIN>;
1108 if ( $new_smtpPort eq "\n" ) {
1109 $new_smtpPort = $smtpPort;
1110 } else {
85645192 1111 $new_smtpPort =~ s/[\r\n]//g;
eaace00e 1112 }
1113 return $new_smtpPort;
bbd30ac8 1114}
d2f4c914 1115
598294a7 1116# authenticated server
a93b12ba 1117sub command18 {
47a29326 1118 return;
35aaf666 1119 # This sub disabled by tassium - it has been replaced with smtp_auth_mech
eaace00e 1120 print "Do you wish to use an authenticated SMTP server? Your server must\n";
1121 print "support this in order for SquirrelMail to work with it. We implemented\n";
1122 print "it according to RFC 2554.\n";
1123
1124 $YesNo = 'n';
35aaf666 1125 $YesNo = 'y' if ( lc($use_authenticated_smtp) eq 'true' );
eaace00e 1126
1127 print "Use authenticated SMTP server (y/n) [$WHT$YesNo$NRM]: $WHT";
1128
1129 $new_use_authenticated_smtp = <STDIN>;
1130 $new_use_authenticated_smtp =~ tr/yn//cd;
35aaf666 1131 return 'true' if ( $new_use_authenticated_smtp eq "y" );
1132 return 'false' if ( $new_use_authenticated_smtp eq "n" );
eaace00e 1133 return $use_authenticated_smtp;
1134}
d2f4c914 1135
2044f95a 1136# pop before SMTP
1137sub command18a {
1138 print "Do you wish to use POP3 before SMTP? Your server must\n";
1139 print "support this in order for SquirrelMail to work with it.\n";
1140
1141 $YesNo = 'n';
35aaf666 1142 $YesNo = 'y' if ( lc($pop_before_smtp) eq 'true' );
2044f95a 1143
1144 print "Use pop before SMTP (y/n) [$WHT$YesNo$NRM]: $WHT";
1145
1146 $new_pop_before_smtp = <STDIN>;
1147 $new_pop_before_smtp =~ tr/yn//cd;
35aaf666 1148 return 'true' if ( $new_pop_before_smtp eq "y" );
1149 return 'false' if ( $new_pop_before_smtp eq "n" );
2044f95a 1150 return $pop_before_smtp;
1151}
1152
598294a7 1153# imap_server_type
d2f4c914 1154sub command19 {
eaace00e 1155 print "Each IMAP server has its own quirks. As much as we tried to stick\n";
1156 print "to standards, it doesn't help much if the IMAP server doesn't follow\n";
1157 print "the same principles. We have made some work-arounds for some of\n";
1158 print "these servers. If you would like to use them, please select your\n";
1159 print "IMAP server. If you do not wish to use these work-arounds, you can\n";
1160 print "set this to \"other\", and none will be used.\n";
a33764f6 1161 print " courier = Courier IMAP server\n";
b39825f0 1162 print " cyrus = Cyrus IMAP server\n";
a33764f6 1163 print " dovecot = Dovecot Secure IMAP server\n";
b39825f0 1164 print " exchange = Microsoft Exchange IMAP server\n";
b39825f0 1165 print " hmailserver = hMailServer\n";
a33764f6 1166 print " macosx = Mac OS X Mailserver\n";
67a24f8a 1167 print " mercury32 = Mercury Mail Transport System\n";
a33764f6 1168 print " uw = University of Washington's IMAP server\n";
1169 print "\n";
b39825f0 1170 print " other = Not one of the above servers\n";
a33764f6 1171 print "\n";
eaace00e 1172 print "[$WHT$imap_server_type$NRM]: $WHT";
1173 $new_imap_server_type = <STDIN>;
1174
1175 if ( $new_imap_server_type eq "\n" ) {
1176 $new_imap_server_type = $imap_server_type;
1177 } else {
85645192 1178 $new_imap_server_type =~ s/[\r\n]//g;
eaace00e 1179 }
1180 return $new_imap_server_type;
a93b12ba 1181}
3f8fe68e 1182
d47b2518 1183# invert_time
d2f4c914 1184sub command110 {
eaace00e 1185 print "Sometimes the date of messages sent is messed up (off by a few hours\n";
1186 print "on some machines). Typically this happens if the system doesn't support\n";
1187 print "tm_gmtoff. It will happen only if your time zone is \"negative\".\n";
1188 print "This most often occurs on Solaris 7 machines in the United States.\n";
1189 print "By default, this is off. It should be kept off unless problems surface\n";
1190 print "about the time that messages are sent.\n";
1191 print " no = Do NOT fix time -- almost always correct\n";
1192 print " yes = Fix the time for this system\n";
1193
1194 $YesNo = 'n';
35aaf666 1195 $YesNo = 'y' if ( lc($invert_time) eq 'true' );
eaace00e 1196
1197 print "Fix the time for this system (y/n) [$WHT$YesNo$NRM]: $WHT";
1198
1199 $new_invert_time = <STDIN>;
1200 $new_invert_time =~ tr/yn//cd;
35aaf666 1201 return 'true' if ( $new_invert_time eq "y" );
1202 return 'false' if ( $new_invert_time eq "n" );
eaace00e 1203 return $invert_time;
1204}
d47b2518 1205
d2f4c914 1206sub command111 {
eaace00e 1207 print "This is the delimiter that your IMAP server uses to distinguish between\n";
1208 print "folders. For example, Cyrus uses '.' as the delimiter and a complete\n";
1209 print "folder would look like 'INBOX.Friends.Bob', while UW uses '/' and would\n";
1210 print "look like 'INBOX/Friends/Bob'. Normally this should be left at 'detect'\n";
1211 print "but if you are sure you know what delimiter your server uses, you can\n";
1212 print "specify it here.\n";
1213 print "\nTo have it autodetect the delimiter, set it to 'detect'.\n\n";
1214 print "[$WHT$optional_delimiter$NRM]: $WHT";
1215 $new_optional_delimiter = <STDIN>;
1216
1217 if ( $new_optional_delimiter eq "\n" ) {
1218 $new_optional_delimiter = $optional_delimiter;
1219 } else {
85645192 1220 $new_optional_delimiter =~ s/[\r\n]//g;
eaace00e 1221 }
1222 return $new_optional_delimiter;
40ba4d36 1223}
b47821fb 1224# IMAP authentication type
33feaaec 1225# Possible values: login, plain, cram-md5, digest-md5
b47821fb 1226# Now offers to detect supported mechs, assuming server & port are set correctly
1227
1228sub command112a {
80e3fcf8 1229 if ($use_imap_tls =~ /^true\b/i) {
1230 print "Auto-detection of login methods is unavailable when using TLS.\n";
1231 } else {
35aaf666 1232 print "If you have already set the hostname and port number, I can try to\n";
1233 print "detect the mechanisms your IMAP server supports.\n";
1234 print "I will try to detect CRAM-MD5 and DIGEST-MD5 support. I can't test\n";
1235 print "for \"login\" or \"plain\" without knowing a username and password.\n";
1236 print "Auto-detecting is optional - you can safely say \"n\" here.\n";
1237 print "\nTry to detect supported mechanisms? [y/N]: ";
1238 $inval=<STDIN>;
1239 chomp($inval);
1240 if ($inval =~ /^y\b/i) {
1241 # Yes, let's try to detect.
1242 print "Trying to detect IMAP capabilities...\n";
1243 my $host = $imapServerAddress . ':'. $imapPort;
1244 print "CRAM-MD5:\t";
1245 my $tmp = detect_auth_support('IMAP',$host,'CRAM-MD5');
1246 if (defined($tmp)) {
1247 if ($tmp eq 'YES') {
1248 print "$WHT SUPPORTED$NRM\n";
1249 } else {
1250 print "$WHT NOT SUPPORTED$NRM\n";
1251 }
80e3fcf8 1252 } else {
35aaf666 1253 print $WHT . " ERROR DETECTING$NRM\n";
1254 }
1255
1256 print "DIGEST-MD5:\t";
1257 $tmp = detect_auth_support('IMAP',$host,'DIGEST-MD5');
1258 if (defined($tmp)) {
1259 if ($tmp eq 'YES') {
1260 print "$WHT SUPPORTED$NRM\n";
1261 } else {
1262 print "$WHT NOT SUPPORTED$NRM\n";
1263 }
1264 } else {
1265 print $WHT . " ERROR DETECTING$NRM\n";
1266 }
598294a7 1267
35aaf666 1268 }
598294a7 1269 }
35aaf666 1270 print "\nWhat authentication mechanism do you want to use for IMAP connections?\n\n";
1271 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
33feaaec 1272 print $WHT . "plain" . $NRM . " - SASL PLAIN. If you need this, you already know it.\n";
35aaf666 1273 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext methods.\n";
1274 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1275 print "\n*** YOUR IMAP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n";
1276 print "If you don't understand or are unsure, you probably want \"login\"\n\n";
1277 print "login, plain, cram-md5, or digest-md5 [$WHT$imap_auth_mech$NRM]: $WHT";
b47821fb 1278 $inval=<STDIN>;
1279 chomp($inval);
33feaaec 1280 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || ($inval =~ /^login\b/i) || ($inval =~ /^plain\b/i)) {
b47821fb 1281 return lc($inval);
1282 } else {
1283 # user entered garbage or default value so nothing needs to be set
1284 return $imap_auth_mech;
1285 }
1286}
40ba4d36 1287
598294a7 1288
b47821fb 1289# SMTP authentication type
1290# Possible choices: none, plain, cram-md5, digest-md5
1291sub command112b {
80e3fcf8 1292 if ($use_smtp_tls =~ /^true\b/i) {
1293 print "Auto-detection of login methods is unavailable when using TLS.\n";
1294 } else {
1295 print "If you have already set the hostname and port number, I can try to\n";
1296 print "automatically detect some of the mechanisms your SMTP server supports.\n";
35aaf666 1297 print "Auto-detection is *optional* - you can safely say \"n\" here.\n";
80e3fcf8 1298 print "\nTry to detect auth mechanisms? [y/N]: ";
1299 $inval=<STDIN>;
1300 chomp($inval);
1301 if ($inval =~ /^y\b/i) {
35aaf666 1302 # Yes, let's try to detect.
1303 print "Trying to detect supported methods (SMTP)...\n";
598294a7 1304
35aaf666 1305 # Special case!
1306 # Check none by trying to relay to junk@microsoft.com
1307 $host = $smtpServerAddress . ':' . $smtpPort;
1308 use IO::Socket;
1309 my $sock = IO::Socket::INET->new($host);
1310 print "Testing none:\t\t$WHT";
1311 if (!defined($sock)) {
1312 print " ERROR TESTING\n";
1313 close $sock;
1314 } else {
5d28b77e 1315 print $sock "HELO $domain\r\n";
35aaf666 1316 $got = <$sock>; # Discard
5d28b77e 1317 print $sock "MAIL FROM:<tester\@squirrelmail.org>\r\n";
1318 $got = <$sock>; # Discard
1319 print $sock "RCPT TO:<junk\@microsoft.com\r\n";
35aaf666 1320 $got = <$sock>; # This is the important line
1321 if ($got =~ /^250\b/) { # SMTP will relay without auth
1322 print "SUPPORTED$NRM\n";
1323 } else {
1324 print "NOT SUPPORTED$NRM\n";
1325 }
5d28b77e 1326 print $sock "RSET\r\n";
1327 print $sock "QUIT\r\n";
35aaf666 1328 close $sock;
1329 }
1330 # Try login (SquirrelMail default)
1331 print "Testing login:\t\t";
1332 $tmp=detect_auth_support('SMTP',$host,'LOGIN');
1333 if (defined($tmp)) {
1334 if ($tmp eq 'YES') {
1335 print $WHT . "SUPPORTED$NRM\n";
1336 } else {
1337 print $WHT . "NOT SUPPORTED$NRM\n";
1338 }
1339 } else {
1340 print $WHT . "ERROR DETECTING$NRM\n";
1341 }
598294a7 1342
35aaf666 1343 # Try CRAM-MD5
80e3fcf8 1344 print "Testing CRAM-MD5:\t";
1345 $tmp=detect_auth_support('SMTP',$host,'CRAM-MD5');
1346 if (defined($tmp)) {
1347 if ($tmp eq 'YES') {
1348 print $WHT . "SUPPORTED$NRM\n";
1349 } else {
1350 print $WHT . "NOT SUPPORTED$NRM\n";
1351 }
1352 } else {
1353 print $WHT . "ERROR DETECTING$NRM\n";
b47821fb 1354 }
598294a7 1355
80e3fcf8 1356
1357 print "Testing DIGEST-MD5:\t";
1358 $tmp=detect_auth_support('SMTP',$host,'DIGEST-MD5');
1359 if (defined($tmp)) {
1360 if ($tmp eq 'YES') {
1361 print $WHT . "SUPPORTED$NRM\n";
1362 } else {
1363 print $WHT . "NOT SUPPORTED$NRM\n";
1364 }
1365 } else {
1366 print $WHT . "ERROR DETECTING$NRM\n";
b47821fb 1367 }
598294a7 1368 }
80e3fcf8 1369 }
1370 print "\nWhat authentication mechanism do you want to use for SMTP connections?\n";
b47821fb 1371 print $WHT . "none" . $NRM . " - Your SMTP server does not require authorization.\n";
fe0b18b3 1372 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
33feaaec 1373 print $WHT . "plain" . $NRM . " - SASL PLAIN. You already know it if you need this.\n";
639c7164 1374 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext.\n";
1375 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
fe0b18b3 1376 print $WHT . "\n*** YOUR SMTP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n" . $NRM;
b47821fb 1377 print "If you don't understand or are unsure, you probably want \"none\"\n\n";
fe0b18b3 1378 print "none, login, cram-md5, or digest-md5 [$WHT$smtp_auth_mech$NRM]: $WHT";
47a29326 1379 $inval=<STDIN>;
1380 chomp($inval);
b47821fb 1381 if ($inval =~ /^none\b/i) {
47a29326 1382 # SMTP doesn't necessarily require logins
1383 return "none";
1384 }
598294a7 1385 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) ||
33feaaec 1386 ($inval =~ /^login\b/i) || ($inval =~/^plain\b/i)) {
47a29326 1387 return lc($inval);
1388 } else {
b47821fb 1389 # user entered garbage, or default value so nothing needs to be set
35aaf666 1390 return $smtp_auth_mech;
47a29326 1391 }
1392}
1393
1394# TLS
1395# This sub is reused for IMAP and SMTP
1396# Args: service name, default value
1397sub command113 {
35aaf666 1398 my($default_val,$service,$inval);
1399 $service=$_[0];
1400 $default_val=$_[1];
1401 print "TLS (Transport Layer Security) encrypts the traffic between server and client.\n";
1402 print "If you're familiar with SSL, you get the idea.\n";
1403 print "To use this feature, your " . $service . " server must offer TLS\n";
1404 print "capability, plus PHP 4.3.x with OpenSSL support.\n";
1405 print "\nIf your " . $service . " server is localhost, you can safely disable this.\n";
1406 print "If it is remote, you may wish to seriously consider enabling this.\n";
47a29326 1407 print "Enable TLS (y/n) [$WHT";
35aaf666 1408 if ($default_val eq 'true') {
47a29326 1409 print "y";
1410 } else {
1411 print "n";
1412 }
598294a7 1413 print "$NRM]: $WHT";
47a29326 1414 $inval=<STDIN>;
1415 $inval =~ tr/yn//cd;
35aaf666 1416 return 'true' if ( $inval eq "y" );
1417 return 'false' if ( $inval eq "n" );
47a29326 1418 return $default_val;
35aaf666 1419}
47a29326 1420
432db2fc 1421# $encode_header_key
35aaf666 1422sub command114{
432db2fc 1423 print "Encryption key allows to hide SquirrelMail Received: headers\n";
1424 print "in outbound messages. Interface uses encryption key to encode\n";
1425 print "username, remote address and proxied address, then stores encoded\n";
1426 print "information in X-Squirrel-* headers.\n";
1427 print "\n";
1428 print "Warning: used encryption function is not bulletproof. When used\n";
1429 print "with static encryption keys, it provides only minimal security\n";
1430 print "measures and information can be decoded quickly.\n";
1431 print "\n";
1432 print "Encoded information can be decoded with decrypt_headers.php script\n";
1433 print "from SquirrelMail contrib/ directory.\n";
1434 print "\n";
1435 print "Enter encryption key: ";
1436 $new_encode_header_key = <STDIN>;
1437 if ( $new_encode_header_key eq "\n" ) {
1438 $new_encode_header_key = $encode_header_key;
1439 } else {
1440 $new_encode_header_key =~ s/[\r\n]//g;
1441 }
1442 return $new_encode_header_key;
35aaf666 1443}
47a29326 1444
3f8fe68e 1445# MOTD
1446sub command71 {
eaace00e 1447 print "\nYou can now create the welcome message that is displayed\n";
1448 print "every time a user logs on. You can use HTML or just plain\n";
dcc1cc82 1449 print
1450"text. If you do not wish to have one, just make it blank.\n\n(Type @ on a blank line to exit)\n";
eaace00e 1451
1452 $new_motd = "";
1453 do {
1454 print "] ";
1455 $line = <STDIN>;
85645192 1456 $line =~ s/[\r\n]//g;
eaace00e 1457 if ( $line ne "@" ) {
1458 $line =~ s/ /\&nbsp;\&nbsp;/g;
1459 $line =~ s/\t/\&nbsp;\&nbsp;\&nbsp;\&nbsp;/g;
1460 $line =~ s/$/ /;
8278a58d 1461 $line =~ s/\"/\\\"/g;
eaace00e 1462
1463 $new_motd = $new_motd . $line;
1464 }
1465 } while ( $line ne "@" );
1466 return $new_motd;
3f8fe68e 1467}
911ad01c 1468
9d0c7bee 1469################# PLUGINS ###################
1470
1471sub command81 {
85645192 1472 $command =~ s/[\s\n\r]*//g;
eaace00e 1473 if ( $command > 0 ) {
1474 $command = $command - 1;
1475 if ( $command <= $#plugins ) {
1476 @newplugins = ();
1477 $ct = 0;
1478 while ( $ct <= $#plugins ) {
1479 if ( $ct != $command ) {
1480 @newplugins = ( @newplugins, $plugins[$ct] );
1481 }
1482 $ct++;
9d0c7bee 1483 }
eaace00e 1484 @plugins = @newplugins;
1485 } elsif ( $command <= $#plugins + $#unused_plugins + 1 ) {
1486 $num = $command - $#plugins - 1;
1487 @newplugins = @plugins;
1488 $ct = 0;
1489 while ( $ct <= $#unused_plugins ) {
1490 if ( $ct == $num ) {
1491 @newplugins = ( @newplugins, $unused_plugins[$ct] );
eaace00e 1492 }
1493 $ct++;
9d0c7bee 1494 }
eaace00e 1495 @plugins = @newplugins;
1496 }
1497 }
1498 return @plugins;
1499}
9d0c7bee 1500
911ad01c 1501################# FOLDERS ###################
1502
1503# default_folder_prefix
1504sub command21 {
eaace00e 1505 print "Some IMAP servers (UW, for example) store mail and folders in\n";
1506 print "your user space in a separate subdirectory. This is where you\n";
1507 print "specify what that directory is.\n";
1508 print "\n";
1509 print "EXAMPLE: mail/";
1510 print "\n";
1511 print "NOTE: If you use Cyrus, or some server that would not use this\n";
1512 print " option, you must set this to 'none'.\n";
1513 print "\n";
1514 print "[$WHT$default_folder_prefix$NRM]: $WHT";
1515 $new_default_folder_prefix = <STDIN>;
1516
1517 if ( $new_default_folder_prefix eq "\n" ) {
1518 $new_default_folder_prefix = $default_folder_prefix;
1519 } else {
d52532d5 1520 $new_default_folder_prefix =~ s/[\r\n]//g;
eaace00e 1521 }
d52532d5 1522 if ( ( $new_default_folder_prefix =~ /^\s*$/ ) || ( $new_default_folder_prefix =~ m/^none$/i ) ) {
eaace00e 1523 $new_default_folder_prefix = "";
1524 } else {
d52532d5 1525 # add the trailing delimiter only if we know what the server is.
ce9f808b 1526 if (($imap_server_type eq 'cyrus' and
1527 $optional_delimiter eq 'detect') or
1528 ($imap_server_type eq 'courier' and
1529 $optional_delimiter eq 'detect')) {
d52532d5 1530 $new_default_folder_prefix =~ s/\.*$/\./;
ce9f808b 1531 } elsif ($imap_server_type eq 'uw' and
1532 $optional_delimiter eq 'detect') {
d52532d5 1533 $new_default_folder_prefix =~ s/\/*$/\//;
0e21688d 1534 }
eaace00e 1535 }
1536 return $new_default_folder_prefix;
911ad01c 1537}
1538
1539# Show Folder Prefix
1540sub command22 {
eaace00e 1541 print "It is possible to set up the default folder prefix as a user\n";
1542 print "specific option, where each user can specify what their mail\n";
1543 print "folder is. If you set this to false, they will never see the\n";
1544 print "option, but if it is true, this option will appear in the\n";
1545 print "'options' section.\n";
1546 print "\n";
1547 print "NOTE: You set the default folder prefix in option '1' of this\n";
1548 print " section. That will be the default if the user doesn't\n";
1549 print " specify anything different.\n";
1550 print "\n";
1551
35aaf666 1552 if ( lc($show_prefix_option) eq 'true' ) {
eaace00e 1553 $default_value = "y";
1554 } else {
1555 $default_value = "n";
1556 }
1557 print "\n";
1558 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1559 $new_show = <STDIN>;
1560 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 1561 $show_prefix_option = 'true';
eaace00e 1562 } else {
35aaf666 1563 $show_prefix_option = 'false';
eaace00e 1564 }
1565 return $show_prefix_option;
911ad01c 1566}
1567
598294a7 1568# Trash Folder
f7b1b3b1 1569sub command23a {
eaace00e 1570 print "You can now specify where the default trash folder is located.\n";
1571 print "On servers where you do not want this, you can set it to anything\n";
1572 print "and set option 6 to false.\n";
1573 print "\n";
1574 print "This is relative to where the rest of your email is kept. You do\n";
1575 print "not need to worry about their mail directory. If this folder\n";
1576 print "would be ~/mail/trash on the filesystem, you only need to specify\n";
1577 print "that this is 'trash', and be sure to put 'mail/' in option 1.\n";
1578 print "\n";
1579
1580 print "[$WHT$trash_folder$NRM]: $WHT";
1581 $new_trash_folder = <STDIN>;
1582 if ( $new_trash_folder eq "\n" ) {
1583 $new_trash_folder = $trash_folder;
1584 } else {
85645192 1585 $new_trash_folder =~ s/[\r\n]//g;
eaace00e 1586 }
1587 return $new_trash_folder;
911ad01c 1588}
1589
598294a7 1590# Sent Folder
f7b1b3b1 1591sub command23b {
eaace00e 1592 print "This is where messages that are sent will be stored. SquirrelMail\n";
1593 print "by default puts a copy of all outgoing messages in this folder.\n";
1594 print "\n";
1595 print "This is relative to where the rest of your email is kept. You do\n";
1596 print "not need to worry about their mail directory. If this folder\n";
1597 print "would be ~/mail/sent on the filesystem, you only need to specify\n";
1598 print "that this is 'sent', and be sure to put 'mail/' in option 1.\n";
1599 print "\n";
1600
1601 print "[$WHT$sent_folder$NRM]: $WHT";
1602 $new_sent_folder = <STDIN>;
1603 if ( $new_sent_folder eq "\n" ) {
1604 $new_sent_folder = $sent_folder;
1605 } else {
85645192 1606 $new_sent_folder =~ s/[\r\n]//g;
eaace00e 1607 }
1608 return $new_sent_folder;
911ad01c 1609}
1610
598294a7 1611# Draft Folder
f7b1b3b1 1612sub command23c {
eaace00e 1613 print "You can now specify where the default draft folder is located.\n";
1614 print "On servers where you do not want this, you can set it to anything\n";
1615 print "and set option 9 to false.\n";
1616 print "\n";
1617 print "This is relative to where the rest of your email is kept. You do\n";
1618 print "not need to worry about their mail directory. If this folder\n";
1619 print "would be ~/mail/drafts on the filesystem, you only need to specify\n";
1620 print "that this is 'drafts', and be sure to put 'mail/' in option 1.\n";
1621 print "\n";
1622
1623 print "[$WHT$draft_folder$NRM]: $WHT";
1624 $new_draft_folder = <STDIN>;
1625 if ( $new_draft_folder eq "\n" ) {
1626 $new_draft_folder = $draft_folder;
1627 } else {
85645192 1628 $new_draft_folder =~ s/[\r\n]//g;
eaace00e 1629 }
1630 return $new_draft_folder;
f7b1b3b1 1631}
1632
598294a7 1633# default move to trash
f7b1b3b1 1634sub command24a {
eaace00e 1635 print "By default, should messages get moved to the trash folder? You\n";
1636 print "can specify the default trash folder in option 3. If this is set\n";
1637 print "to false, messages will get deleted immediately without moving\n";
1638 print "to the trash folder.\n";
1639 print "\n";
1640 print "Trash folder is currently: $trash_folder\n";
1641 print "\n";
1642
35aaf666 1643 if ( lc($default_move_to_trash) eq 'true' ) {
eaace00e 1644 $default_value = "y";
1645 } else {
1646 $default_value = "n";
1647 }
1648 print "By default, move to trash (y/n) [$WHT$default_value$NRM]: $WHT";
1649 $new_show = <STDIN>;
1650 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 1651 $default_move_to_trash = 'true';
eaace00e 1652 } else {
35aaf666 1653 $default_move_to_trash = 'false';
eaace00e 1654 }
1655 return $default_move_to_trash;
2f287147 1656}
1657
598294a7 1658# default move to sent
f7b1b3b1 1659sub command24b {
eaace00e 1660 print "By default, should messages get moved to the sent folder? You\n";
1661 print "can specify the default sent folder in option 4. If this is set\n";
1662 print "to false, messages will get sent and no copy will be made.\n";
1663 print "\n";
6517cfd0 1664 print "Sent folder is currently: $sent_folder\n";
eaace00e 1665 print "\n";
1666
35aaf666 1667 if ( lc($default_move_to_sent) eq 'true' ) {
eaace00e 1668 $default_value = "y";
1669 } else {
1670 $default_value = "n";
1671 }
1672 print "By default, move to sent (y/n) [$WHT$default_value$NRM]: $WHT";
1673 $new_show = <STDIN>;
1674 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 1675 $default_move_to_sent = 'true';
eaace00e 1676 } else {
35aaf666 1677 $default_move_to_sent = 'false';
eaace00e 1678 }
1679 return $default_move_to_sent;
2f287147 1680}
1681
f7b1b3b1 1682# default save as draft
1683sub command24c {
eaace00e 1684 print "By default, should the save to draft option be shown? You can\n";
1685 print "specify the default drafts folder in option 5. If this is set\n";
1686 print "to false, users will not be shown the save to draft option.\n";
1687 print "\n";
1688 print "Drafts folder is currently: $draft_folder\n";
1689 print "\n";
1690
35aaf666 1691 if ( lc($default_move_to_draft) eq 'true' ) {
eaace00e 1692 $default_value = "y";
1693 } else {
1694 $default_value = "n";
1695 }
1696 print "By default, save as draft (y/n) [$WHT$default_value$NRM]: $WHT";
1697 $new_show = <STDIN>;
1698 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 1699 $default_save_as_draft = 'true';
eaace00e 1700 } else {
35aaf666 1701 $default_save_as_draft = 'false';
eaace00e 1702 }
1703 return $default_save_as_draft;
f7b1b3b1 1704}
1705
598294a7 1706# List special folders first
2f287147 1707sub command27 {
eaace00e 1708 print "SquirrelMail has what we call 'special folders' that are not\n";
1709 print "manipulated and viewed like normal folders. Some examples of\n";
1710 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
1711 print "Simply asks if you want these folders listed first in the folder\n";
1712 print "listing.\n";
1713 print "\n";
1714
35aaf666 1715 if ( lc($list_special_folders_first) eq 'true' ) {
eaace00e 1716 $default_value = "y";
1717 } else {
1718 $default_value = "n";
1719 }
1720 print "\n";
1721 print "List first (y/n) [$WHT$default_value$NRM]: $WHT";
1722 $new_show = <STDIN>;
1723 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 1724 $list_special_folders_first = 'true';
eaace00e 1725 } else {
35aaf666 1726 $list_special_folders_first = 'false';
eaace00e 1727 }
1728 return $list_special_folders_first;
911ad01c 1729}
1730
598294a7 1731# Show special folders color
2f287147 1732sub command28 {
eaace00e 1733 print "SquirrelMail has what we call 'special folders' that are not\n";
1734 print "manipulated and viewed like normal folders. Some examples of\n";
1735 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
1736 print "wants to know if we should display special folders in a\n";
1737 print "color than the other folders.\n";
1738 print "\n";
1739
35aaf666 1740 if ( lc($use_special_folder_color) eq 'true' ) {
eaace00e 1741 $default_value = "y";
1742 } else {
1743 $default_value = "n";
1744 }
1745 print "\n";
1746 print "Show color (y/n) [$WHT$default_value$NRM]: $WHT";
1747 $new_show = <STDIN>;
1748 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 1749 $use_special_folder_color = 'true';
eaace00e 1750 } else {
35aaf666 1751 $use_special_folder_color = 'false';
eaace00e 1752 }
1753 return $use_special_folder_color;
911ad01c 1754}
1755
598294a7 1756# Auto expunge
2f287147 1757sub command29 {
eaace00e 1758 print "The way that IMAP handles deleting messages is as follows. You\n";
1759 print "mark the message as deleted, and then to 'really' delete it, you\n";
1760 print "expunge it. This option asks if you want to just have messages\n";
1761 print "marked as deleted, or if you want SquirrelMail to expunge the \n";
1762 print "messages too.\n";
1763 print "\n";
1764
35aaf666 1765 if ( lc($auto_expunge) eq 'true' ) {
eaace00e 1766 $default_value = "y";
1767 } else {
1768 $default_value = "n";
1769 }
1770 print "Auto expunge (y/n) [$WHT$default_value$NRM]: $WHT";
1771 $new_show = <STDIN>;
1772 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 1773 $auto_expunge = 'true';
eaace00e 1774 } else {
35aaf666 1775 $auto_expunge = 'false';
eaace00e 1776 }
1777 return $auto_expunge;
911ad01c 1778}
1779
598294a7 1780# Default sub of inbox
2f287147 1781sub command210 {
eaace00e 1782 print "Some IMAP servers (Cyrus) have all folders as subfolders of INBOX.\n";
1783 print "This can cause some confusion in folder creation for users when\n";
1784 print "they try to create folders and don't put it as a subfolder of INBOX\n";
1785 print "and get permission errors. This option asks if you want folders\n";
1786 print "to be subfolders of INBOX by default.\n";
1787 print "\n";
1788
35aaf666 1789 if ( lc($default_sub_of_inbox) eq 'true' ) {
eaace00e 1790 $default_value = "y";
1791 } else {
1792 $default_value = "n";
1793 }
1794 print "Default sub of INBOX (y/n) [$WHT$default_value$NRM]: $WHT";
1795 $new_show = <STDIN>;
1796 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 1797 $default_sub_of_inbox = 'true';
eaace00e 1798 } else {
35aaf666 1799 $default_sub_of_inbox = 'false';
eaace00e 1800 }
1801 return $default_sub_of_inbox;
911ad01c 1802}
1803
598294a7 1804# Show contain subfolder option
2f287147 1805sub command211 {
eaace00e 1806 print "Some IMAP servers (UW) make it so that there are two types of\n";
1807 print "folders. Those that contain messages, and those that contain\n";
1808 print "subfolders. If this is the case for your server, set this to\n";
1809 print "true, and it will ask the user whether the folder they are\n";
1810 print "creating contains subfolders or messages.\n";
1811 print "\n";
1812
35aaf666 1813 if ( lc($show_contain_subfolders_option) eq 'true' ) {
eaace00e 1814 $default_value = "y";
1815 } else {
1816 $default_value = "n";
1817 }
1818 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1819 $new_show = <STDIN>;
1820 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 1821 $show_contain_subfolders_option = 'true';
eaace00e 1822 } else {
35aaf666 1823 $show_contain_subfolders_option = 'false';
eaace00e 1824 }
1825 return $show_contain_subfolders_option;
911ad01c 1826}
1827
598294a7 1828# Default Unseen Notify
24fc5dd2 1829sub command212 {
eaace00e 1830 print "This option specifies where the users will receive notification\n";
1831 print "about unseen messages by default. This is of course an option that\n";
1832 print "can be changed on a user level.\n";
1833 print " 1 = No notification\n";
1834 print " 2 = Only on the INBOX\n";
1835 print " 3 = On all folders\n";
1836 print "\n";
1837
1838 print "Which one should be default (1,2,3)? [$WHT$default_unseen_notify$NRM]: $WHT";
1839 $new_show = <STDIN>;
85645192 1840 if ( $new_show =~ /^[123]\n/i ) {
eaace00e 1841 $default_unseen_notify = $new_show;
1842 }
85645192 1843 $default_unseen_notify =~ s/[\r\n]//g;
eaace00e 1844 return $default_unseen_notify;
24fc5dd2 1845}
1846
598294a7 1847# Default Unseen Type
24fc5dd2 1848sub command213 {
eaace00e 1849 print "Here you can define the default way that unseen messages will be displayed\n";
1850 print "to the user in the folder listing on the left side.\n";
1851 print " 1 = Only unseen messages (4)\n";
1852 print " 2 = Unseen and Total messages (4/27)\n";
1853 print "\n";
1854
1855 print "Which one should be default (1,2)? [$WHT$default_unseen_type$NRM]: $WHT";
1856 $new_show = <STDIN>;
85645192 1857 if ( $new_show =~ /^[12]\n/i ) {
eaace00e 1858 $default_unseen_type = $new_show;
1859 }
85645192 1860 $default_unseen_type =~ s/[\r\n]//g;
eaace00e 1861 return $default_unseen_type;
24fc5dd2 1862}
1863
f7bfc9de 1864# Auto create special folders
1865sub command214 {
eaace00e 1866 print "Would you like the Sent, Trash, and Drafts folders to be created\n";
1867 print "automatically print for you when a user logs in? If the user\n";
1868 print "accidentally deletes their special folders, this option will\n";
1869 print "automatically create it again for them.\n";
1870 print "\n";
1871
35aaf666 1872 if ( lc($auto_create_special) eq 'true' ) {
eaace00e 1873 $default_value = "y";
1874 } else {
1875 $default_value = "n";
1876 }
1877 print "Auto create special folders? (y/n) [$WHT$default_value$NRM]: $WHT";
1878 $new_show = <STDIN>;
1879 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 1880 $auto_create_special = 'true';
eaace00e 1881 } else {
35aaf666 1882 $auto_create_special = 'false';
eaace00e 1883 }
1884 return $auto_create_special;
f7bfc9de 1885}
1886
598294a7 1887# Automatically delete folders
4e85a37f 1888sub command215 {
d04165f3 1889 if ( $imap_server_type eq "uw" ) {
1890 print "UW IMAP servers will not allow folders containing mail to also contain folders.\n";
1891 print "Deleting folders will bypass the trash folder and be immediately deleted\n\n";
98468fba 1892 print "If this is not the correct value for your server,\n";
1893 print "please use option D on the Main Menu to configure your server correctly.\n\n";
2eec12b5 1894 print "Press any key to continue...\n";
1895 $new_delete = <STDIN>;
35aaf666 1896 $delete_folder = 'true';
598294a7 1897 } else {
d04165f3 1898 if ( $imap_server_type eq "courier" ) {
1899 print "Courier (or Courier-IMAP) IMAP servers may not support ";
1900 print "subfolders of Trash. \n";
1901 print "Specifically, if Courier is set to always move messages to Trash, \n";
1902 print "Trash will be treated by Courier as a special folder that does not \n";
1903 print "allow subfolders. \n\n";
1904 print "Please verify your Courier configuration, and test folder deletion \n";
598294a7 1905 print "when changing this setting.\n\n";
d04165f3 1906 }
1907
1908 print "Are subfolders of the Trash supported by your IMAP server?\n";
1909 print "If so, should deleted folders be sent to Trash?\n";
1910 print "If not, say no (deleted folders should not be sent to Trash)\n\n";
1911 # reversal of logic.
1912 # question was: Should folders be automatically deleted instead of sent to trash..
598294a7 1913 # we've changed the question to make it more clear,
1914 # and are here handling that to avoid changing the answers..
35aaf666 1915 if ( lc($delete_folder) eq 'true' ) {
2eec12b5 1916 $default_value = "n";
d04165f3 1917 } else {
1918 $default_value = "y";
2eec12b5 1919 }
d04165f3 1920 print "Send deleted folders to Trash? (y/n) [$WHT$default_value$NRM]: $WHT";
2eec12b5 1921 $new_delete = <STDIN>;
1922 if ( ( $new_delete =~ /^y\n/i ) || ( ( $new_delete =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 1923 $delete_folder = 'false';
d04165f3 1924 } else {
35aaf666 1925 $delete_folder = 'true';
2eec12b5 1926 }
eaace00e 1927 }
1928 return $delete_folder;
1929}
24fc5dd2 1930
ca85aabe 1931#noselect fix
1932sub command216 {
1933 print "Some IMAP server allow subfolders to exist even if the parent\n";
1934 print "folders do not. This fixes some problems with the folder list\n";
1935 print "when this is the case, causing the /NoSelect folders to be displayed\n";
1936 print "\n";
1937
35aaf666 1938 if ( lc($noselect_fix_enable) eq 'true' ) {
ca85aabe 1939 $default_value = "y";
1940 } else {
1941 $default_value = "n";
1942 }
1943 print "enable noselect fix? (y/n) [$WHT$noselect_fix_enable$NRM]: $WHT";
1944 $noselect_fix_enable = <STDIN>;
1945 if ( ( $noselect_fix_enable =~ /^y\n/i ) || ( ( $noselect_fix_enable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 1946 $noselect_fix_enable = 'true';
ca85aabe 1947 } else {
35aaf666 1948 $noselect_fix_enable = 'false';
ca85aabe 1949 }
1950 return $noselect_fix_enable;
1951}
ccfb2029 1952############# GENERAL OPTIONS #####################
1953
ccfb2029 1954# Data directory
3392dc86 1955sub command33a {
e6566358 1956 print "Specify the location for your data directory.\n";
368ab966 1957 print "You need to create this directory yourself.\n";
e6566358 1958 print "The path name can be absolute or relative (to the config directory).\n";
368ab966 1959 print "Here are two examples:\n";
1960 print " Absolute: /var/local/squirrelmail/data/\n";
598294a7 1961 print " Relative: ../data/\n";
8bd9e0dd 1962 print "Relative paths to directories outside of the SquirrelMail distribution\n";
e6566358 1963 print "will be converted to their absolute path equivalents in config.php.\n\n";
30e9932c 1964 print "Note: There are potential security risks with having a writeable directory\n";
e6566358 1965 print "under the web server's root directory (ex: /home/httpd/html).\n";
1966 print "For this reason, it is recommended to put the data directory\n";
2eec12b5 1967 print "in an alternate location of your choice. \n";
1968 print "\n";
1969
eaace00e 1970 print "[$WHT$data_dir$NRM]: $WHT";
1971 $new_data_dir = <STDIN>;
1972 if ( $new_data_dir eq "\n" ) {
1973 $new_data_dir = $data_dir;
1974 } else {
85645192 1975 $new_data_dir =~ s/[\r\n]//g;
eaace00e 1976 }
1977 if ( $new_data_dir =~ /^\s*$/ ) {
1978 $new_data_dir = "";
1979 } else {
1980 $new_data_dir =~ s/\/*$//g;
1981 $new_data_dir =~ s/$/\//g;
1982 }
1983 return $new_data_dir;
ccfb2029 1984}
1985
1986# Attachment directory
3392dc86 1987sub command33b {
eaace00e 1988 print "Path to directory used for storing attachments while a mail is\n";
368ab966 1989 print "being composed. The path name can be absolute or relative (to the\n";
1990 print "config directory). Here are two examples:\n";
1991 print " Absolute: /var/local/squirrelmail/attach/\n";
e6566358 1992 print " Relative: ../attach/\n";
1993 print "Relative paths to directories outside of the SquirrelMail distribution\n";
1994 print "will be converted to their absolute path equivalents in config.php.\n\n";
1995 print "Note: There are a few security considerations regarding this\n";
eaace00e 1996 print "directory:\n";
1997 print " 1. It should have the permission 733 (rwx-wx-wx) to make it\n";
1998 print " impossible for a random person with access to the webserver\n";
1999 print " to list files in this directory. Confidential data might\n";
2000 print " be laying around in there.\n";
e6566358 2001 print " Depending on your user:group assignments, 730 (rwx-wx---)\n";
2002 print " may be possible, and more secure (e.g. root:apache)\n";
eaace00e 2003 print " 2. Since the webserver is not able to list the files in the\n";
2004 print " content is also impossible for the webserver to delete files\n";
2005 print " lying around there for too long.\n";
2006 print " 3. It should probably be another directory than the data\n";
2007 print " directory specified in option 3.\n";
2008 print "\n";
2009
2010 print "[$WHT$attachment_dir$NRM]: $WHT";
2011 $new_attachment_dir = <STDIN>;
2012 if ( $new_attachment_dir eq "\n" ) {
2013 $new_attachment_dir = $attachment_dir;
2014 } else {
85645192 2015 $new_attachment_dir =~ s/[\r\n]//g;
eaace00e 2016 }
2017 if ( $new_attachment_dir =~ /^\s*$/ ) {
2018 $new_attachment_dir = "";
2019 } else {
2020 $new_attachment_dir =~ s/\/*$//g;
2021 $new_attachment_dir =~ s/$/\//g;
2022 }
2023 return $new_attachment_dir;
ccfb2029 2024}
2025
3392dc86 2026sub command33c {
eaace00e 2027 print "The directory hash level setting allows you to configure the level\n";
598294a7 2028 print "of hashing that SquirrelMail employs in your data and attachment\n";
eaace00e 2029 print "directories. This value must be an integer ranging from 0 to 4.\n";
598294a7 2030 print "When this value is set to 0, SquirrelMail will simply store all\n";
eaace00e 2031 print "files as normal in the data and attachment directories. However,\n";
2032 print "when set to a value from 1 to 4, a simple hashing scheme will be\n";
2033 print "used to organize the files in this directory. In short, the crc32\n";
2034 print "value for a username will be computed. Then, up to the first 4\n";
2035 print "digits of the hash, as set by this configuration value, will be\n";
2036 print "used to directory hash the files for that user in the data and\n";
2037 print "attachment directory. This allows for better performance on\n";
2038 print "servers with larger numbers of users.\n";
2039 print "\n";
2040
2041 print "[$WHT$dir_hash_level$NRM]: $WHT";
2042 $new_dir_hash_level = <STDIN>;
2043 if ( $new_dir_hash_level eq "\n" ) {
2044 $new_dir_hash_level = $dir_hash_level;
2045 } else {
85645192 2046 $new_dir_hash_level =~ s/[\r\n]//g;
eaace00e 2047 }
2048 if ( ( int($new_dir_hash_level) < 0 )
2049 || ( int($new_dir_hash_level) > 4 )
2050 || !( int($new_dir_hash_level) eq $new_dir_hash_level ) ) {
2051 print "Invalid Directory Hash Level.\n";
2052 print "Value must be an integer ranging from 0 to 4\n";
2053 print "Hit enter to continue.\n";
2054 $enter_key = <STDIN>;
2055
2056 $new_dir_hash_level = $dir_hash_level;
2057 }
2058
2059 return $new_dir_hash_level;
3392dc86 2060}
ccfb2029 2061
2062sub command35 {
eaace00e 2063 print "This is the default size (in pixels) of the left folder list.\n";
2064 print "Default is 200, but you can set it to whatever you wish. This\n";
2065 print "is a user preference, so this will only show up as their default.\n";
2066 print "\n";
2067 print "[$WHT$default_left_size$NRM]: $WHT";
2068 $new_default_left_size = <STDIN>;
2069 if ( $new_default_left_size eq "\n" ) {
2070 $new_default_left_size = $default_left_size;
2071 } else {
85645192 2072 $new_default_left_size =~ s/[\r\n]//g;
eaace00e 2073 }
2074 return $new_default_left_size;
ccfb2029 2075}
2076
985f7c88 2077sub command36 {
eaace00e 2078 print "Some IMAP servers only have lowercase letters in the usernames\n";
2079 print "but they still allow people with uppercase to log in. This\n";
2080 print "causes a problem with the user's preference files. This option\n";
2081 print "transparently changes all usernames to lowercase.";
2082 print "\n";
2083
35aaf666 2084 if ( lc($force_username_lowercase) eq 'true' ) {
eaace00e 2085 $default_value = "y";
2086 } else {
2087 $default_value = "n";
2088 }
2089 print "Convert usernames to lowercase (y/n) [$WHT$default_value$NRM]: $WHT";
2090 $new_show = <STDIN>;
2091 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 2092 return 'true';
eaace00e 2093 }
35aaf666 2094 return 'false';
985f7c88 2095}
2096
0d15cd19 2097sub command37 {
eaace00e 2098 print "";
2099 print "\n";
985f7c88 2100
35aaf666 2101 if ( lc($default_use_priority) eq 'true' ) {
eaace00e 2102 $default_value = "y";
2103 } else {
2104 $default_value = "n";
2105 }
2106
2107 print "Allow users to specify priority of outgoing mail (y/n) [$WHT$default_value$NRM]: $WHT";
2108 $new_show = <STDIN>;
2109 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 2110 return 'true';
eaace00e 2111 }
35aaf666 2112 return 'false';
826b7f71 2113}
2114
eaace00e 2115sub command38 {
2116 print "";
2117 print "\n";
2118
35aaf666 2119 if ( lc($default_hide_attribution) eq 'true' ) {
eaace00e 2120 $default_value = "y";
2121 } else {
2122 $default_value = "n";
2123 }
2124
2125 print "Hide SM attributions (y/n) [$WHT$default_value$NRM]: $WHT";
2126 $new_show = <STDIN>;
2127 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 2128 return 'true';
eaace00e 2129 }
35aaf666 2130 return 'false';
eaace00e 2131}
826b7f71 2132
8c21da0c 2133sub command39 {
eaace00e 2134 print "";
2135 print "\n";
2136
35aaf666 2137 if ( lc($default_use_mdn) eq 'true' ) {
eaace00e 2138 $default_value = "y";
2139 } else {
2140 $default_value = "n";
2141 }
2142
2143 print "Enable support for read/delivery receipt support (y/n) [$WHT$default_value$NRM]: $WHT";
2144 $new_show = <STDIN>;
2145 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 2146 return 'true';
eaace00e 2147 }
35aaf666 2148 return 'false';
8c21da0c 2149}
2150
432db2fc 2151
8a7d0669 2152sub command310 {
bb08da84 2153 print " In loosely managed environments, you may want to allow users
2154 to edit their full name and email address. In strictly managed
2155 environments, you may want to force users to use the name
2156 and email address assigned to them.
2157
2158 'y' - allow a user to edit their full name and email address,
2159 'n' - users must use the assigned values.
2160
2161 ";
eaace00e 2162
35aaf666 2163 if ( lc($edit_identity) eq 'true' ) {
8a7d0669 2164 $default_value = "y";
2165 } else {
2166 $default_value = "n";
2167 }
2eec12b5 2168 print "Allow editing of user's identity? (y/n) [$WHT$default_value$NRM]: $WHT";
8a7d0669 2169 $new_edit = <STDIN>;
eaace00e 2170 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 2171 $edit_identity = 'true';
2172 $edit_name = 'true';
bb08da84 2173 $hide_auth_header = command311b();
8a7d0669 2174 } else {
35aaf666 2175 $edit_identity = 'false';
2eec12b5 2176 $edit_name = command311();
432db2fc 2177 $hide_auth_header = command311b();
8a7d0669 2178 }
2179 return $edit_identity;
2180}
2181
2182sub command311 {
bb08da84 2183 print " Given that users are not allowed to modify their
2184 email address, can they edit their full name?
2185
2186 ";
8a7d0669 2187
35aaf666 2188 if ( lc($edit_name) eq 'true' ) {
8a7d0669 2189 $default_value = "y";
2190 } else {
2191 $default_value = "n";
2192 }
bb08da84 2193 print "Allow the user to edit their full name? (y/n) [$WHT$default_value$NRM]: $WHT";
8a7d0669 2194 $new_edit = <STDIN>;
eaace00e 2195 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 2196 $edit_name = 'true';
8a7d0669 2197 } else {
35aaf666 2198 $edit_name = 'false';
8a7d0669 2199 }
2200 return $edit_name;
2201}
8c21da0c 2202
432db2fc 2203sub command311b {
bb08da84 2204 print " SquirrelMail adds username information to every sent email
2205 in order to prevent possible sender forging when users are allowed
2206 to change their email and/or full name.
2207
2208 You can remove user information from this header (y), if you think that
2209 it violates privacy or security.
2210
2211 Note: If users are allowed to change their email addresses,
2212 this setting will make it difficult to determine who sent what where.
2213 Use at your own risk.
2214
2215 ";
2216
432db2fc 2217 if ( lc($hide_auth_header) eq "true" ) {
2218 $default_value = "y";
2219 } else {
2220 $default_value = "n";
2221 }
2222 print "Remove username from email headers? (y/n) [$WHT$default_value$NRM]: $WHT";
2223 $new_header = <STDIN>;
2224 if ( ( $new_header =~ /^y\n/i ) || ( ( $new_header =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2225 $hide_auth_header = "true";
2226 } else {
2227 $hide_auth_header = "false";
2228 }
bb08da84 2229 return $hide_auth_header;
432db2fc 2230}
2231
7c612fdd 2232sub command312 {
2233 print "This option allows you to choose if users can use thread sorting\n";
2234 print "Your IMAP server must support the THREAD command for this to work\n";
35aaf666 2235 print "PHP versions later than 4.0.3 recommended\n";
7c612fdd 2236 print "\n";
2237
35aaf666 2238 if ( lc($allow_thread_sort) eq 'true' ) {
7c612fdd 2239 $default_value = "y";
2240 } else {
2241 $default_value = "n";
2242 }
2243 print "Allow server side thread sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2244 $allow_thread_sort = <STDIN>;
2245 if ( ( $allow_thread_sort =~ /^y\n/i ) || ( ( $allow_thread_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 2246 $allow_thread_sort = 'true';
7c612fdd 2247 } else {
35aaf666 2248 $allow_thread_sort = 'false';
7c612fdd 2249 }
2250 return $allow_thread_sort;
2251}
2252
aa0da530 2253sub command313 {
2254 print "This option allows you to choose if SM uses server-side sorting\n";
2255 print "Your IMAP server must support the SORT command for this to work\n";
2256 print "\n";
2257
aacc7bec 2258 if ( lc($allow_server_sort) eq 'true' ) {
aa0da530 2259 $default_value = "y";
2260 } else {
2261 $default_value = "n";
2262 }
aacc7bec 2263 print "Allow server-side sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2264 $allow_server_sort = <STDIN>;
2265 if ( ( $allow_server_sort =~ /^y\n/i ) || ( ( $allow_server_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2266 $allow_server_sort = 'true';
aa0da530 2267 } else {
aacc7bec 2268 $allow_server_sort = 'false';
aa0da530 2269 }
aacc7bec 2270 return $allow_server_sort;
aa0da530 2271}
2272
65ffb3ce 2273sub command314 {
2274 print "This option allows you to choose if SM uses charset search\n";
2275 print "Your IMAP server must support the SEARCH CHARSET command for this to work\n";
2276 print "\n";
2277
35aaf666 2278 if ( lc($allow_charset_search) eq 'true' ) {
65ffb3ce 2279 $default_value = "y";
2280 } else {
2281 $default_value = "n";
2282 }
2283 print "Allow charset searching? (y/n) [$WHT$default_value$NRM]: $WHT";
2284 $allow_charset_search = <STDIN>;
2285 if ( ( $allow_charset_search =~ /^y\n/i ) || ( ( $allow_charset_search =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 2286 $allow_charset_search = 'true';
65ffb3ce 2287 } else {
35aaf666 2288 $allow_charset_search = 'false';
65ffb3ce 2289 }
2290 return $allow_charset_search;
2291}
2292
4ecd3a70 2293# command315 (UID support) obsoleted.
3c7ee482 2294
de74555e 2295# advanced search option
6c499577 2296sub command316 {
66bfb27b 2297 print "This option allows you to control the use of advanced search form.\n";
0f1b00b8 2298 print " 0 = enable basic search only\n";
2299 print " 1 = enable advanced search only\n";
2300 print " 2 = enable both\n";
2301 print "\n";
2302
2303 print "Allowed search (0,1,2)? [$WHT$allow_advanced_search$NRM]: $WHT";
2304 $new_allow_advanced_search = <STDIN>;
85645192 2305 if ( $new_allow_advanced_search =~ /^[012]\n/i ) {
0f1b00b8 2306 $allow_advanced_search = $new_allow_advanced_search;
de74555e 2307 }
85645192 2308 $allow_advanced_search =~ s/[\r\n]//g;
66bfb27b 2309 return $allow_advanced_search;
de74555e 2310}
2311
2312
2313sub command317 {
35aaf666 2314 print "This option allows you to change the name of the PHP session used\n";
2315 print "by SquirrelMail. Unless you know what you are doing, you probably\n";
2316 print "don't need or want to change this from the default of SQMSESSID.\n";
6c499577 2317 print "[$WHT$session_name$NRM]: $WHT";
2318 $new_session_name = <STDIN>;
35aaf666 2319 chomp($new_session_name);
6614128e 2320 if ( $new_session_name eq "" ) {
6c499577 2321 $new_session_name = $session_name;
2322 }
2323 return $new_session_name;
2324}
2325
ee20a285 2326# time zone config (since 1.5.1)
2327sub command318 {
2328 print "This option allows you to control the use of time zones.\n";
2329 print " 0 = (default) standard, GNU C time zone names\n";
2330 print " 1 = strict, generic time zone codes with offsets\n";
2331 print " 2 = custom, GNU C time zones loaded from config/timezones.php\n";
2332 print " 3 = custom strict, generic time zone codes with offsets loaded \n";
2333 print " from config/timezones.php\n";
2334 print "See SquirrelMail documentation about format of config/timezones.php file.\n";
2335 print "\n";
2336
2337 print "Used time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT";
2338 $new_time_zone_type = <STDIN>;
2339 if ( $new_time_zone_type =~ /^[0123]\n/i ) {
2340 $time_zone_type = $new_time_zone_type;
2341 } else {
2342 print "\nInvalid configuration value.\n";
2343 print "\nPress enter to continue...";
2344 $tmp = <STDIN>;
2345 }
2346 $time_zone_type =~ s/[\r\n]//g;
2347 return $time_zone_type;
2348}
dcc1cc82 2349
65ffb3ce 2350
ccfb2029 2351sub command41 {
2eec12b5 2352 print "\nDefine the themes that you wish to use. If you have added ";
2353 print "a theme of your own, just follow the instructions (?) about how to add ";
eaace00e 2354 print "them. You can also change the default theme.\n";
2355 print "[theme] command (?=help) > ";
2356 $input = <STDIN>;
85645192 2357 $input =~ s/[\r\n]//g;
eaace00e 2358 while ( $input ne "d" ) {
2359 if ( $input =~ /^\s*l\s*/i ) {
2360 $count = 0;
2361 while ( $count <= $#theme_name ) {
2362 if ( $count == $theme_default ) {
2363 print " *";
2364 } else {
2365 print " ";
2366 }
2eec12b5 2367 if ( $count < 10 ) {
2368 print " ";
2369 }
eaace00e 2370 $name = $theme_name[$count];
2eec12b5 2371 $num_spaces = 35 - length($name);
eaace00e 2372 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2373 $name = $name . " ";
2374 }
2375
2376 print " $count. $name";
2377 print "($theme_path[$count])\n";
2378
2379 $count++;
ccfb2029 2380 }
eaace00e 2381 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
2382 $old_def = $theme_default;
2383 $theme_default = $input;
2384 $theme_default =~ s/^\s*m\s*//;
2385 if ( ( $theme_default > $#theme_name ) || ( $theme_default < 0 ) ) {
2386 print "Cannot set default theme to $theme_default. That theme does not exist.\n";
2387 $theme_default = $old_def;
ccfb2029 2388 }
eaace00e 2389 } elsif ( $input =~ /^\s*\+/ ) {
2390 print "What is the name of this theme: ";
2391 $name = <STDIN>;
85645192 2392 $name =~ s/[\r\n]//g;
eaace00e 2393 $theme_name[ $#theme_name + 1 ] = $name;
2394 print "Be sure to put ../themes/ before the filename.\n";
2395 print "What file is this stored in (ex: ../themes/default_theme.php): ";
2396 $name = <STDIN>;
85645192 2397 $name =~ s/[\r\n]//g;
eaace00e 2398 $theme_path[ $#theme_path + 1 ] = $name;
2399 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
2400 if ( $input =~ /[0-9]+\s*$/ ) {
2401 $rem_num = $input;
2402 $rem_num =~ s/^\s*-\s*//g;
2403 $rem_num =~ s/\s*$//;
2404 } else {
2405 $rem_num = $#theme_name;
ccfb2029 2406 }
eaace00e 2407 if ( $rem_num == $theme_default ) {
2408 print "You cannot remove the default theme!\n";
2409 } else {
2410 $count = 0;
2411 @new_theme_name = ();
2412 @new_theme_path = ();
2413 while ( $count <= $#theme_name ) {
2414 if ( $count != $rem_num ) {
2415 @new_theme_name = ( @new_theme_name, $theme_name[$count] );
2416 @new_theme_path = ( @new_theme_path, $theme_path[$count] );
2417 }
2418 $count++;
2419 }
2420 @theme_name = @new_theme_name;
2421 @theme_path = @new_theme_path;
2422 if ( $theme_default > $rem_num ) {
2423 $theme_default--;
2424 }
8442ac08 2425 }
eaace00e 2426 } elsif ( $input =~ /^\s*t\s*/i ) {
2427 print "\nStarting detection...\n\n";
2428
2429 opendir( DIR, "../themes" );
2430 @files = grep { /\.php$/i } readdir(DIR);
2431 $cnt = 0;
2432 while ( $cnt <= $#files ) {
2433 $filename = "../themes/" . $files[$cnt];
2434 if ( $filename ne "../themes/index.php" ) {
2435 $found = 0;
2436 for ( $x = 0 ; $x <= $#theme_path ; $x++ ) {
2437 if ( $theme_path[$x] eq $filename ) {
2438 $found = 1;
2439 }
2440 }
2441 if ( $found != 1 ) {
2442 print "** Found theme: $filename\n";
2443 print " What is its name? ";
2444 $nm = <STDIN>;
85645192 2445 $nm =~ s/[\n\r]//g;
eaace00e 2446 $theme_name[ $#theme_name + 1 ] = $nm;
2447 $theme_path[ $#theme_path + 1 ] = $filename;
2448 }
2449 }
2450 $cnt++;
8442ac08 2451 }
eaace00e 2452 print "\n";
2453 for ( $cnt = 0 ; $cnt <= $#theme_path ; $cnt++ ) {
2454 $filename = $theme_path[$cnt];
2455 if ( !( -e $filename ) ) {
2456 print " Removing $filename (file not found)\n";
2457 $offset = 0;
2458 @new_theme_name = ();
2459 @new_theme_path = ();
2460 for ( $x = 0 ; $x < $#theme_path ; $x++ ) {
2461 if ( $theme_path[$x] eq $filename ) {
2462 $offset = 1;
2463 }
2464 if ( $offset == 1 ) {
2465 $new_theme_name[$x] = $theme_name[ $x + 1 ];
2466 $new_theme_path[$x] = $theme_path[ $x + 1 ];
2467 } else {
2468 $new_theme_name[$x] = $theme_name[$x];
2469 $new_theme_path[$x] = $theme_path[$x];
2470 }
2471 }
2472 @theme_name = @new_theme_name;
2473 @theme_path = @new_theme_path;
2474 }
2475 }
2476 print "\nDetection complete!\n\n";
2477
2478 closedir DIR;
2479 } elsif ( $input =~ /^\s*\?\s*/ ) {
2480 print ".-------------------------.\n";
2481 print "| t (detect themes) |\n";
2482 print "| + (add theme) |\n";
2483 print "| - N (remove theme) |\n";
2484 print "| m N (mark default) |\n";
2485 print "| l (list themes) |\n";
2486 print "| d (done) |\n";
2487 print "`-------------------------'\n";
2488 }
2489 print "[theme] command (?=help) > ";
2490 $input = <STDIN>;
85645192 2491 $input =~ s/[\r\n]//g;
eaace00e 2492 }
2493}
ccfb2029 2494
6f3bfa54 2495# Theme - CSS file
2496sub command42 {
eaace00e 2497 print "You may specify a cascading style-sheet (CSS) file to be included\n";
2498 print "on each html page generated by SquirrelMail. The CSS file is useful\n";
2499 print "for specifying a site-wide font. If you're not familiar with CSS\n";
2500 print "files, leave this blank.\n";
2501 print "\n";
2502 print "To clear out an existing value, just type a space for the input.\n";
2503 print "\n";
25be56ab 2504 print "Please be aware of the following: \n";
2505 print " - Relative URLs are relative to the config dir\n";
2506 print " to use the themes directory, use ../themes/css/newdefault.css\n";
2507 print " - To specify a css file defined outside the SquirrelMail source tree\n";
2508 print " use the absolute URL the webserver would use to include the file\n";
2509 print " e.g. http://some.host.com/css/mystyle.css or /css/mystyle.css\n";
8bd9e0dd 2510 print "\n";
eaace00e 2511 print "[$WHT$theme_css$NRM]: $WHT";
2512 $new_theme_css = <STDIN>;
6f3bfa54 2513
eaace00e 2514 if ( $new_theme_css eq "\n" ) {
2515 $new_theme_css = $theme_css;
2516 } else {
85645192 2517 $new_theme_css =~ s/[\r\n]//g;
eaace00e 2518 }
2519 $new_theme_css =~ s/^\s*//;
2520 return $new_theme_css;
2521}
6f3bfa54 2522
1e0628fb 2523sub command61 {
eaace00e 2524 print "You can now define different LDAP servers.\n";
2525 print "[ldap] command (?=help) > ";
2526 $input = <STDIN>;
85645192 2527 $input =~ s/[\r\n]//g;
eaace00e 2528 while ( $input ne "d" ) {
2529 if ( $input =~ /^\s*l\s*/i ) {
2530 $count = 0;
2531 while ( $count <= $#ldap_host ) {
2532 print "$count. $ldap_host[$count]\n";
2533 print " base: $ldap_base[$count]\n";
2534 if ( $ldap_charset[$count] ) {
2535 print " charset: $ldap_charset[$count]\n";
2536 }
2537 if ( $ldap_port[$count] ) {
2538 print " port: $ldap_port[$count]\n";
2539 }
2540 if ( $ldap_name[$count] ) {
2541 print " name: $ldap_name[$count]\n";
2542 }
2543 if ( $ldap_maxrows[$count] ) {
2544 print " maxrows: $ldap_maxrows[$count]\n";
2545 }
43397658 2546 if ( $ldap_filter[$count] ) {
2547 print " filter: $ldap_filter[$count]\n";
2548 }
30e9932c 2549 if ( $ldap_binddn[$count] ) {
2550 print " binddn: $ldap_binddn[$count]\n";
2551 if ( $ldap_bindpw[$count] ) {
2552 print " bindpw: $ldap_bindpw[$count]\n";
2553 }
2554 }
43397658 2555 if ( $ldap_protocol[$count] ) {
30e9932c 2556 print " protocol: $ldap_protocol[$count]\n";
2557 }
43397658 2558 if ( $ldap_limit_scope[$count] ) {
2559 print " limit_scope: $ldap_limit_scope[$count]\n";
2560 }
327e2d96 2561 if ( $ldap_listing[$count] ) {
2562 print " listing: $ldap_listing[$count]\n";
2563 }
593370a4 2564 if ( $ldap_search_tree[$count] ) {
2565 print " search_tree: $ldap_search_tree[$count]\n";
2566 }
2567 if ( $ldap_starttls[$count] ) {
2568 print " starttls: $ldap_starttls[$count]\n";
2569 }
30e9932c 2570
eaace00e 2571 print "\n";
2572 $count++;
a93b12ba 2573 }
eaace00e 2574 } elsif ( $input =~ /^\s*\+/ ) {
2575 $sub = $#ldap_host + 1;
2576
2577 print "First, we need to have the hostname or the IP address where\n";
2578 print "this LDAP server resides. Example: ldap.bigfoot.com\n";
2579 print "hostname: ";
2580 $name = <STDIN>;
85645192 2581 $name =~ s/[\r\n]//g;
eaace00e 2582 $ldap_host[$sub] = $name;
2583
2584 print "\n";
2585
2586 print "Next, we need the server root (base dn). For this, an empty\n";
2587 print "string is allowed.\n";
2588 print "Example: ou=member_directory,o=netcenter.com\n";
2589 print "base: ";
2590 $name = <STDIN>;
85645192 2591 $name =~ s/[\r\n]//g;
eaace00e 2592 $ldap_base[$sub] = $name;
2593
2594 print "\n";
2595
2596 print "This is the TCP/IP port number for the LDAP server. Default\n";
2597 print "port is 389. This is optional. Press ENTER for default.\n";
2598 print "port: ";
2599 $name = <STDIN>;
85645192 2600 $name =~ s/[\r\n]//g;
eaace00e 2601 $ldap_port[$sub] = $name;
2602
2603 print "\n";
2604
2605 print "This is the charset for the server. Default is utf-8. This\n";
2606 print "is also optional. Press ENTER for default.\n";
2607 print "charset: ";
2608 $name = <STDIN>;
85645192 2609 $name =~ s/[\r\n]//g;
eaace00e 2610 $ldap_charset[$sub] = $name;
2611
2612 print "\n";
2613
2614 print "This is the name for the server, used to tag the results of\n";
2615 print "the search. Default it \"LDAP: hostname\". Press ENTER for default\n";
2616 print "name: ";
2617 $name = <STDIN>;
85645192 2618 $name =~ s/[\r\n]//g;
eaace00e 2619 $ldap_name[$sub] = $name;
2620
2621 print "\n";
2622
2623 print "You can specify the maximum number of rows in the search result.\n";
327e2d96 2624 print "Default value is equal to 250 rows. Press ENTER for default.\n";
eaace00e 2625 print "maxrows: ";
2626 $name = <STDIN>;
85645192 2627 $name =~ s/[\r\n]//g;
eaace00e 2628 $ldap_maxrows[$sub] = $name;
2629
43397658 2630
2631 print "\n";
2632
30e9932c 2633 print "If your LDAP server does not like anonymous logins, you can specify bind DN.\n";
2634 print "Default is none, anonymous bind. Press ENTER for default.\n";
2635 print "binddn: ";
2636 $name = <STDIN>;
85645192 2637 $name =~ s/[\r\n]//g;
30e9932c 2638 $ldap_binddn[$sub] = $name;
2639
2640 print "\n";
2641
2642 if ( $ldap_binddn[$sub] ne '' ) {
2643
2644 print "Now, please specify password for that DN.\n";
2645 print "bindpw: ";
2646 $name = <STDIN>;
85645192 2647 $name =~ s/[\r\n]//g;
30e9932c 2648 $ldap_bindpw[$sub] = $name;
2649
2650 print "\n";
2651 }
2652
43397658 2653 print "You can specify bind protocol version here.\n";
30e9932c 2654 print "Default protocol version depends on your php ldap settings.\n";
43397658 2655 print "Press ENTER for default.\n";
30e9932c 2656 print "protocol: ";
2657 $name = <STDIN>;
85645192 2658 $name =~ s/[\r\n]//g;
30e9932c 2659 $ldap_protocol[$sub] = $name;
2660
2661 print "\n";
2662
327e2d96 2663 print "This configuration section allows to set some rarely used\n";
2664 print "options and options specific to some LDAP implementations.\n";
43397658 2665 print "\n";
327e2d96 2666 print "Do you want to set advanced LDAP directory settings? (y/N):";
2667 $ldap_advanced_settings = <STDIN>;
2668 if ( $ldap_advanced_settings =~ /^y\n/i ) {
2669 $ldap_advanced_settings = 'true';
43397658 2670 } else {
327e2d96 2671 $ldap_advanced_settings = 'false';
43397658 2672 }
43397658 2673
327e2d96 2674 if ($ldap_advanced_settings eq 'true') {
2675 print "\n";
2676
2677 print "You can control LDAP directory listing here. This option can\n";
2678 print "be useful if you run small LDAP server and want to provide listing\n";
2679 print "of all addresses stored in LDAP to users of webmail interface.\n";
2680 print "Number of displayed entries is limited by maxrows setting.\n";
2681 print "\n";
2682 print "Don't enable this option for public LDAP directories.\n";
2683 print "This feature is experimental.\n";
2684 print "\n";
2685 print "Allow listing of LDAP directory? (y/N):";
2686 $name = <STDIN>;
2687 if ( $name =~ /^y\n/i ) {
2688 $name = 'true';
2689 } else {
2690 $name = 'false';
2691 }
2692 $ldap_listing[$sub] = $name;
2693
2694 print "\n";
2695
2696 print "You can specify an additional search filter.\n";
2697 print "This could be something like \"(objectclass=posixAccount)\".\n";
2698 print "No filtering is performed by default. Press ENTER for default.\n";
2699 print "filter: ";
2700 $name = <STDIN>;
2701 $name =~ s/[\r|\n]//g;
2702 $ldap_filter[$sub] = $name;
2703
2704 print "\n";
2705
2706 print "You can control search scope here.\n";
2707 print "This option is specific to Microsoft ADS implementation.\n";
2708 print "It requires use of v3 or newer LDAP protocol.\n";
2709 print "Don't enable it, if you use other LDAP server.\n";
2710 print "\n";
2711 print "Limit ldap scope? (y/N):";
2712 $name = <STDIN>;
2713 if ( $name =~ /^y\n/i ) {
2714 $name = 'true';
2715 } else {
2716 $name = 'false';
2717 }
2718 $ldap_limit_scope[$sub] = $name;
593370a4 2719
2720 print "\n";
2721
2722 print "You can control ldap search type here.\n";
2723 print "Addresses can be searched in entire LDAP subtree (default)\n";
2724 print "or only first level entries are returned.\n";
2725 print "\n";
2726 print "Search entire LDAP subtree? (Y/n):";
2727 $name = <STDIN>;
2728 if ( $name =~ /^n\n/i ) {
2729 $name = 'false';
2730 } else {
2731 $name = 'true';
2732 }
2733 $ldap_search_tree[$sub] = $name;
2734
2735 print "\n";
2736
2737 print "You can control use of StartTLS on LDAP connection here.\n";
2738 print "This option requires use of v3 or newer LDAP protocol and php 4.2+.\n";
2739 print "\n";
2740 print "Use StartTLS? (y/N):";
2741 $name = <STDIN>;
2742 if ( $name =~ /^y\n/i ) {
2743 $name = 'true';
2744 } else {
2745 $name = 'false';
2746 }
2747 $ldap_starttls[$sub] = $name;
327e2d96 2748 }
43397658 2749 print "\n";
2750
eaace00e 2751 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
2752 if ( $input =~ /[0-9]+\s*$/ ) {
2753 $rem_num = $input;
2754 $rem_num =~ s/^\s*-\s*//g;
2755 $rem_num =~ s/\s*$//;
2756 } else {
2757 $rem_num = $#ldap_host;
2758 }
2759 $count = 0;
2760 @new_ldap_host = ();
2761 @new_ldap_base = ();
2762 @new_ldap_port = ();
2763 @new_ldap_name = ();
2764 @new_ldap_charset = ();
2765 @new_ldap_maxrows = ();
43397658 2766 @new_ldap_filter = ();
30e9932c 2767 @new_ldap_bindpw = ();
2768 @new_ldap_binddn = ();
2769 @new_ldap_protocol = ();
43397658 2770 @new_ldap_limit_scope = ();
327e2d96 2771 @new_ldap_listing = ();
593370a4 2772 @new_ldap_search_tree = ();
2773 @new_ldap_starttls = ();
eaace00e 2774
2775 while ( $count <= $#ldap_host ) {
2776 if ( $count != $rem_num ) {
2777 @new_ldap_host = ( @new_ldap_host, $ldap_host[$count] );
2778 @new_ldap_base = ( @new_ldap_base, $ldap_base[$count] );
2779 @new_ldap_port = ( @new_ldap_port, $ldap_port[$count] );
2780 @new_ldap_name = ( @new_ldap_name, $ldap_name[$count] );
2781 @new_ldap_charset = ( @new_ldap_charset, $ldap_charset[$count] );
2782 @new_ldap_maxrows = ( @new_ldap_maxrows, $ldap_maxrows[$count] );
43397658 2783 @new_ldap_filter = ( @new_ldap_filter, $ldap_filter[$count] );
30e9932c 2784 @new_ldap_binddn = ( @new_ldap_binddn, $ldap_binddn[$count] );
2785 @new_ldap_bindpw = ( @new_ldap_bindpw, $ldap_bindpw[$count] );
2786 @new_ldap_protocol = ( @new_ldap_protocol, $ldap_protocol[$count] );
43397658 2787 @new_ldap_limit_scope = ( @new_ldap_limit_scope, $ldap_limit_scope[$count] );
327e2d96 2788 @new_ldap_listing = ( @new_ldap_listing, $ldap_listing[$count] );
593370a4 2789 @new_ldap_search_tree = ( @new_ldap_search_tree, $ldap_search_tree[$count] );
2790 @new_ldap_starttls = ( @new_ldap_starttls, $ldap_starttls[$count] );
eaace00e 2791 }
2792 $count++;
1e0628fb 2793 }
eaace00e 2794 @ldap_host = @new_ldap_host;
2795 @ldap_base = @new_ldap_base;
2796 @ldap_port = @new_ldap_port;
2797 @ldap_name = @new_ldap_name;
2798 @ldap_charset = @new_ldap_charset;
2799 @ldap_maxrows = @new_ldap_maxrows;
43397658 2800 @ldap_filter = @new_ldap_filter;
30e9932c 2801 @ldap_binddn = @new_ldap_binddn;
2802 @ldap_bindpw = @new_ldap_bindpw;
2803 @ldap_protocol = @new_ldap_protocol;
43397658 2804 @ldap_limit_scope = @new_ldap_limit_scope;
327e2d96 2805 @ldap_listing = @new_ldap_listing;
593370a4 2806 @ldap_search_tree = @new_ldap_search_tree;
2807 @ldap_starttls = @new_ldap_starttls;
30e9932c 2808
eaace00e 2809 } elsif ( $input =~ /^\s*\?\s*/ ) {
2810 print ".-------------------------.\n";
2811 print "| + (add host) |\n";
2812 print "| - N (remove host) |\n";
2813 print "| l (list hosts) |\n";
2814 print "| d (done) |\n";
2815 print "`-------------------------'\n";
2816 }
2817 print "[ldap] command (?=help) > ";
2818 $input = <STDIN>;
85645192 2819 $input =~ s/[\r\n]//g;
eaace00e 2820 }
2821}
1e0628fb 2822
3806fa52 2823sub command62 {
eaace00e 2824 print "Some of our developers have come up with very good javascript interface\n";
2825 print "for searching through address books, however, our original goals said\n";
2826 print "that we would be 100% HTML. In order to make it possible to use their\n";
2827 print "interface, and yet stick with our goals, we have also written a plain\n";
2828 print "HTML version of the search. Here, you can choose which version to use.\n";
2829 print "\n";
2830 print "This is just the default value. It is also a user option that each\n";
2831 print "user can configure individually\n";
2832 print "\n";
2833
35aaf666 2834 if ( lc($default_use_javascript_addr_book) eq 'true' ) {
eaace00e 2835 $default_value = "y";
2836 } else {
35aaf666 2837 $default_use_javascript_addr_book = 'false';
eaace00e 2838 $default_value = "n";
2839 }
2840 print "Use javascript version by default (y/n) [$WHT$default_value$NRM]: $WHT";
2841 $new_show = <STDIN>;
2842 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 2843 $default_use_javascript_addr_book = 'true';
eaace00e 2844 } else {
35aaf666 2845 $default_use_javascript_addr_book = 'false';
eaace00e 2846 }
2847 return $default_use_javascript_addr_book;
3806fa52 2848}
1e0628fb 2849
4272758c 2850# global filebased address book
2851sub command63 {
2852 print "If you want to use global file address book, then you\n";
2853 print "must set this option to a valid value. If option does\n";
2854 print "not have path elements, system assumes that file is\n";
2855 print "stored in data directory. If relative path is set, it is\n";
598294a7 2856 print "relative to main SquirrelMail directory. If value is empty,\n";
4272758c 2857 print "address book is not enabled.\n";
2858 print "\n";
2859
2860 print "[$WHT$abook_global_file$NRM]: $WHT";
2861 $new_abook_global_file = <STDIN>;
2862 if ( $new_abook_global_file eq "\n" ) {
2863 $new_abook_global_file = $abook_global_file;
2864 } else {
2865 $new_abook_global_file =~ s/[\r\n]//g;
2866 }
2867 return $new_abook_global_file;
2868}
2869
2870# writing into global filebased abook control
2871sub command64 {
7eb64c3e 2872 print "This setting controls writing into global file address\n";
2873 print "book options. Address book file must be writeable by\n";
2874 print "webserver's user, if you want to enable this option.\n";
4272758c 2875 print "\n";
2876
2877 if ( lc($abook_global_file_writeable) eq 'true' ) {
2878 $default_value = "y";
2879 } else {
2880 $abook_global_file_writeable = 'false';
2881 $default_value = "n";
2882 }
7eb64c3e 2883 print "Allow writing into global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
4272758c 2884 $new_show = <STDIN>;
2885 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2886 $abook_global_file_writeable = 'true';
2887 } else {
2888 $abook_global_file_writeable = 'false';
2889 }
2890 return $abook_global_file_writeable;
2891}
2892
71d3f882 2893# listing of global filebased abook control
2894sub command65 {
2895 print "This setting controls listing of global file address\n";
2896 print "book in addresses page.\n";
2897 print "\n";
2898
2899 if ( lc($abook_global_file_listing) eq 'true' ) {
2900 $default_value = "y";
2901 } else {
2902 $abook_global_file_listing = 'false';
2903 $default_value = "n";
2904 }
2905 print "Allow listing of global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
2906 $new_show = <STDIN>;
2907 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2908 $abook_global_file_listing = 'true';
2909 } else {
2910 $abook_global_file_listing = 'false';
2911 }
2912 return $abook_global_file_listing;
2913}
2914
497203d4 2915sub command91 {
eaace00e 2916 print "If you want to store your users address book details in a database then\n";
2917 print "you need to set this DSN to a valid value. The format for this is:\n";
2918 print "mysql://user:pass\@hostname/dbname\n";
2919 print "Where mysql can be one of the databases PHP supports, the most common\n";
2920 print "of these are mysql, msql and pgsql\n";
2921 print "If the DSN is left empty (hit space and then return) the database\n";
2922 print "related code for address books will not be used\n";
2923 print "\n";
2924
2925 if ( $addrbook_dsn eq "" ) {
2926 $default_value = "Disabled";
2927 } else {
2928 $default_value = $addrbook_dsn;
2929 }
2930 print "[$WHT$addrbook_dsn$NRM]: $WHT";
2931 $new_dsn = <STDIN>;
2932 if ( $new_dsn eq "\n" ) {
2933 $new_dsn = "";
2934 } else {
85645192 2935 $new_dsn =~ s/[\r\n]//g;
eaace00e 2936 $new_dsn =~ s/^\s+$//g;
2937 }
2938 return $new_dsn;
497203d4 2939}
ccfb2029 2940
4f40a59d 2941sub command92 {
eaace00e 2942 print "This is the name of the table you want to store the address book\n";
2943 print "data in, it defaults to 'address'\n";
2944 print "\n";
2945 print "[$WHT$addrbook_table$NRM]: $WHT";
2946 $new_table = <STDIN>;
2947 if ( $new_table eq "\n" ) {
2948 $new_table = $addrbook_table;
2949 } else {
85645192 2950 $new_table =~ s/[\r\n]//g;
eaace00e 2951 }
2952 return $new_table;
4f40a59d 2953}
2954
3499f99f 2955sub command93 {
2956 print "If you want to store your users preferences in a database then\n";
2957 print "you need to set this DSN to a valid value. The format for this is:\n";
2958 print "mysql://user:pass\@hostname/dbname\n";
2959 print "Where mysql can be one of the databases PHP supports, the most common\n";
2960 print "of these are mysql, msql and pgsql\n";
2961 print "If the DSN is left empty (hit space and then return) the database\n";
2962 print "related code for address books will not be used\n";
2963 print "\n";
2964
eaace00e 2965 if ( $prefs_dsn eq "" ) {
3499f99f 2966 $default_value = "Disabled";
2967 } else {
2968 $default_value = $prefs_dsn;
2969 }
2970 print "[$WHT$prefs_dsn$NRM]: $WHT";
2971 $new_dsn = <STDIN>;
eaace00e 2972 if ( $new_dsn eq "\n" ) {
3499f99f 2973 $new_dsn = "";
2974 } else {
85645192 2975 $new_dsn =~ s/[\r\n]//g;
3499f99f 2976 $new_dsn =~ s/^\s+$//g;
2977 }
2978 return $new_dsn;
2979}
2980
2981sub command94 {
2982 print "This is the name of the table you want to store the preferences\n";
99a6c222 2983 print "data in, it defaults to 'userprefs'\n";
3499f99f 2984 print "\n";
2985 print "[$WHT$prefs_table$NRM]: $WHT";
2986 $new_table = <STDIN>;
eaace00e 2987 if ( $new_table eq "\n" ) {
3499f99f 2988 $new_table = $prefs_table;
2989 } else {
85645192 2990 $new_table =~ s/[\r\n]//g;
3499f99f 2991 }
2992 return $new_table;
eaace00e 2993}
3499f99f 2994
99a6c222 2995sub command95 {
2996 print "This is the name of the field in which you want to store the\n";
2997 print "username of the person the prefs are for. It default to 'user'\n";
2998 print "which clashes with a reserved keyword in PostgreSQL so this\n";
2999 print "will need to be changed for that database at least\n";
3000 print "\n";
3001 print "[$WHT$prefs_user_field$NRM]: $WHT";
3002 $new_field = <STDIN>;
3003 if ( $new_field eq "\n" ) {
3004 $new_field = $prefs_user_field;
3005 } else {
85645192 3006 $new_field =~ s/[\r\n]//g;
99a6c222 3007 }
06316c07 3008 $prefs_user_size = db_pref_size($prefs_user_size);
99a6c222 3009 return $new_field;
3010}
3011
3012sub command96 {
3013 print "This is the name of the field in which you want to store the\n";
3014 print "preferences keyword. It defaults to 'prefkey'\n";
3015 print "\n";
3016 print "[$WHT$prefs_key_field$NRM]: $WHT";
3017 $new_field = <STDIN>;
3018 if ( $new_field eq "\n" ) {
3019 $new_field = $prefs_key_field;
3020 } else {
85645192 3021 $new_field =~ s/[\r\n]//g;
99a6c222 3022 }
06316c07 3023 $prefs_key_size = db_pref_size($prefs_key_size);
99a6c222 3024 return $new_field;
3025}
3026
3027sub command97 {
3028 print "This is the name of the field in which you want to store the\n";
3029 print "preferences value. It defaults to 'prefval'\n";
3030 print "\n";
3031 print "[$WHT$prefs_val_field$NRM]: $WHT";
3032 $new_field = <STDIN>;
3033 if ( $new_field eq "\n" ) {
3034 $new_field = $prefs_val_field;
3035 } else {
85645192 3036 $new_field =~ s/[\r\n]//g;
99a6c222 3037 }
06316c07 3038 $prefs_val_size = db_pref_size($prefs_val_size);
99a6c222 3039 return $new_field;
3040}
3041
06316c07 3042# routine is used to set database field limits
3043# it needs one argument
3044sub db_pref_size() {
3045 my ($size) = $_[0];
3046 print "\nDatabase fields have size limits.\n";
3047 print "\n";
3048 print "What limit is set for this field? [$WHT$size$NRM]: $WHT";
3049 $new_size = <STDIN>;
3050 if ( $new_size eq "\n" ) {
3051 $new_size = $size;
3052 } else {
3053 $new_size =~ s/[\r\n]//g;
3054 }
3055 return $new_size;
3056}
3057
30e9932c 3058sub command98 {
3059 print "If you want to store your global address book in a database then\n";
3060 print "you need to set this DSN to a valid value. The format for this is:\n";
3061 print "mysql://user:pass\@hostname/dbname\n";
3062 print "Where mysql can be one of the databases PHP supports, the most common\n";
3063 print "of these are mysql, msql and pgsql\n";
3064 print "If the DSN is left empty (hit space and then return) the database\n";
3065 print "related code for global SQL address book will not be used\n";
3066 print "\n";
3067
3068 if ( $addrbook_global_dsn eq "" ) {
3069 $default_value = "Disabled";
3070 } else {
3071 $default_value = $addrbook_global_dsn;
3072 }
3073 print "[$WHT$addrbook_global_dsn$NRM]: $WHT";
3074 $new_dsn = <STDIN>;
3075 if ( $new_dsn eq "\n" ) {
3076 $new_dsn = "";
3077 } else {
85645192 3078 $new_dsn =~ s/[\r\n]//g;
30e9932c 3079 $new_dsn =~ s/^\s+$//g;
3080 }
3081 return $new_dsn;
3082}
3083
3084sub command99 {
3085 print "This is the name of the table you want to store the global address book\n";
6e00b127 3086 print "data in. Default table name is 'global_abook'. Address book uses same\n";
3087 print "database format as personal address book.\n";
30e9932c 3088 print "\n";
3089 print "[$WHT$addrbook_global_table$NRM]: $WHT";
3090 $new_table = <STDIN>;
3091 if ( $new_table eq "\n" ) {
3092 $new_table = $addrbook_global_table;
3093 } else {
85645192 3094 $new_table =~ s/[\r\n]//g;
30e9932c 3095 }
3096 return $new_table;
3097}
3098
3099sub command910 {
3100 print "This option controls users\' ability to add or modify records stored \n";
3101 print "in global address book\n";
3102
35aaf666 3103 if ( lc($addrbook_global_writeable) eq 'true' ) {
30e9932c 3104 $default_value = "y";
3105 } else {
3106 $default_value = "n";
3107 }
3108 print "Allow writing into global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
3109 $addrbook_global_writeable = <STDIN>;
3110 if ( ( $addrbook_global_writeable =~ /^y\n/i ) || ( ( $addrbook_global_writeable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 3111 $addrbook_global_writeable = 'true';
30e9932c 3112 } else {
35aaf666 3113 $addrbook_global_writeable = 'false';
30e9932c 3114 }
3115 return $addrbook_global_writeable;
3116}
3117
3118sub command911 {
3119 print "Enable this option if you want to see listing of addresses stored \n";
3120 print "in global address book\n";
3121
35aaf666 3122 if ( lc($addrbook_global_listing) eq 'true' ) {
30e9932c 3123 $default_value = "y";
3124 } else {
3125 $default_value = "n";
3126 }
3127 print "Allow listing of global address book? (y/n) [$WHT$default_value$NRM]: $WHT";
3128 $addrbook_global_listing = <STDIN>;
3129 if ( ( $addrbook_global_listing =~ /^y\n/i ) || ( ( $addrbook_global_listing =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 3130 $addrbook_global_listing = 'true';
30e9932c 3131 } else {
35aaf666 3132 $addrbook_global_listing = 'false';
30e9932c 3133 }
3134 return $addrbook_global_listing;
3135}
3136
3137
39d3ec89 3138# Default language
3139sub commandA1 {
3140 print "SquirrelMail attempts to set the language in many ways. If it\n";
3141 print "can not figure it out in another way, it will default to this\n";
3142 print "language. Please use the code for the desired language.\n";
3143 print "\n";
3144 print "[$WHT$squirrelmail_default_language$NRM]: $WHT";
3145 $new_squirrelmail_default_language = <STDIN>;
3146 if ( $new_squirrelmail_default_language eq "\n" ) {
3147 $new_squirrelmail_default_language = $squirrelmail_default_language;
3148 } else {
85645192 3149 $new_squirrelmail_default_language =~ s/[\r\n]//g;
39d3ec89 3150 $new_squirrelmail_default_language =~ s/^\s+$//g;
3151 }
3152 return $new_squirrelmail_default_language;
3153}
3154# Default Charset
3155sub commandA2 {
fe48c808 3156 print "This option controls what character set is used when sending\n";
3157 print "mail and when sending HTML to the browser. Option works only\n";
3158 print "with US English (en_US) translation. Other translations use\n";
3159 print "charsets that are set in functions/i18n.php.\n";
39d3ec89 3160 print "\n";
3161
3162 print "[$WHT$default_charset$NRM]: $WHT";
3163 $new_default_charset = <STDIN>;
3164 if ( $new_default_charset eq "\n" ) {
3165 $new_default_charset = $default_charset;
3166 } else {
85645192 3167 $new_default_charset =~ s/[\r\n]//g;
39d3ec89 3168 }
3169 return $new_default_charset;
3170}
3171# Alternative language names
3172sub commandA3 {
3173 print "Enable this option if you want to see localized language names in\n";
5ba5dc8e 3174 print "language selection box. Note, that this option can trigger\n";
3175 print "installation of foreign language support modules in some browsers.\n";
39d3ec89 3176 print "\n";
3177
35aaf666 3178 if ( lc($show_alternative_names) eq 'true' ) {
39d3ec89 3179 $default_value = "y";
3180 } else {
3181 $default_value = "n";
3182 }
3183 print "Show alternative language names? (y/n) [$WHT$default_value$NRM]: $WHT";
3184 $show_alternative_names = <STDIN>;
3185 if ( ( $show_alternative_names =~ /^y\n/i ) || ( ( $show_alternative_names =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 3186 $show_alternative_names = 'true';
39d3ec89 3187 } else {
35aaf666 3188 $show_alternative_names = 'false';
39d3ec89 3189 }
3190 return $show_alternative_names;
3191}
5ba5dc8e 3192
f03f6ee7 3193# Aggressive decoding
5ba5dc8e 3194sub commandA4 {
39d3ec89 3195 print "Enable this option if you want to use CPU and memory intensive decoding\n";
3196 print "functions. This option allows reading multibyte charset, that are used\n";
3197 print "in Eastern Asia. SquirrelMail will try to use recode functions here,\n";
3198 print "even when you have disabled use of recode in Tweaks section.\n";
3199 print "\n";
3200
f03f6ee7 3201 if ( lc($aggressive_decoding) eq 'true' ) {
39d3ec89 3202 $default_value = "y";
3203 } else {
3204 $default_value = "n";
3205 }
f03f6ee7 3206 print "Enable aggressive decoding? (y/n) [$WHT$default_value$NRM]: $WHT";
3207 $aggressive_decoding = <STDIN>;
3208 if ( ( $aggressive_decoding =~ /^y\n/i ) || ( ( $aggressive_decoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3209 $aggressive_decoding = 'true';
39d3ec89 3210 } else {
f03f6ee7 3211 $aggressive_decoding = 'false';
39d3ec89 3212 }
f03f6ee7 3213 return $aggressive_decoding;
39d3ec89 3214}
3215
6d3689f5 3216# Lossy encoding
5ba5dc8e 3217sub commandA5 {
6d3689f5 3218 print "Enable this option if you want to allow lossy charset encoding in message\n";
f03f6ee7 3219 print "composition pages. This option allows charset conversions when output\n";
3220 print "charset does not support all symbols used in original charset. Symbols\n";
3221 print "unsupported by output charset will be replaced with question marks.\n";
3222 print "\n";
3223
6d3689f5 3224 if ( lc($lossy_encoding) eq 'true' ) {
f03f6ee7 3225 $default_value = "y";
3226 } else {
3227 $default_value = "n";
3228 }
6d3689f5 3229 print "Enable lossy encoding? (y/n) [$WHT$default_value$NRM]: $WHT";
3230 $lossy_encoding = <STDIN>;
3231 if ( ( $lossy_encoding =~ /^y\n/i ) || ( ( $lossy_encoding =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3232 $lossy_encoding = 'true';
f03f6ee7 3233 } else {
6d3689f5 3234 $lossy_encoding = 'false';
f03f6ee7 3235 }
6d3689f5 3236 return $lossy_encoding;
f03f6ee7 3237}
3238
3239
39d3ec89 3240# Advanced tree
3241sub commandB1 {
3242 print "Enable this option if you want to use DHTML based folder listing.\n";
3243 print "Code is experimental, works only with some browsers and there might\n";
3244 print "be some glitches.\n";
3245 print "\n";
3246
35aaf666 3247 if ( lc($advanced_tree) eq 'true' ) {
39d3ec89 3248 $default_value = "y";
3249 } else {
3250 $default_value = "n";
3251 }
3252 print "Use advanced tree in folder listing? (y/n) [$WHT$default_value$NRM]: $WHT";
3253 $advanced_tree = <STDIN>;
3254 if ( ( $advanced_tree =~ /^y\n/i ) || ( ( $advanced_tree =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 3255 $advanced_tree = 'true';
39d3ec89 3256 } else {
35aaf666 3257 $advanced_tree = 'false';
39d3ec89 3258 }
3259 return $advanced_tree;
3260}
74d6a0d9 3261# display html emails in iframe
3262sub commandB2 {
3263 print "This option can enable html email rendering inside iframe.\n";
3264 print "Inline frames are used in order to provide sandbox environment";
3265 print "for html code included in html formated emails.";
3266 print "Option is experimental and might have glitches in some parts of code.";
3267 print "\n";
3268
3269 if ( lc($use_iframe) eq 'true' ) {
3270 $default_value = "y";
3271 } else {
3272 $default_value = "n";
3273 }
3274 print "Display html emails in iframe? (y/n) [$WHT$default_value$NRM]: $WHT";
3275 $use_iframe = <STDIN>;
3276 if ( ( $use_iframe =~ /^y\n/i ) || ( ( $use_iframe =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3277 $use_iframe = 'true';
3278 } else {
3279 $use_iframe = 'false';
3280 }
3281 return $use_iframe;
3282}
6395c46d 3283# use icons
39d3ec89 3284sub commandB3 {
6395c46d 3285 print "Enabling this option will cause icons to be used instead of text\n";
3286 print "markers next to each message in mailbox lists that represent\n";
3287 print "new, read, flagged, and deleted messages, as well as those that\n";
3288 print "have been replied to and forwarded. Icons are also used next to\n";
3289 print "(un)expanded folders in the folder list (Oldway = false). These\n";
3290 print "icons are quite small, but will obviously be more of a resource\n";
3291 print "drain than text markers.\n";
3292 print "\n";
3293
35aaf666 3294 if ( lc($use_icons) eq 'true' ) {
6395c46d 3295 $default_value = "y";
3296 } else {
3297 $default_value = "n";
3298 }
3299 print "Use icons? (y/n) [$WHT$default_value$NRM]: $WHT";
3300 $use_icons = <STDIN>;
3301 if ( ( $use_icons =~ /^y\n/i ) || ( ( $use_icons =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 3302 $use_icons = 'true';
6395c46d 3303 } else {
35aaf666 3304 $use_icons = 'false';
6395c46d 3305 }
3306 return $use_icons;
3307}
3308# php recode
3309sub commandB4 {
39d3ec89 3310 print "Enable this option if you want to use php recode functions to read\n";
3311 print "emails written in charset that differs from the one that is set in\n";
3312 print "translation selected by user. Code is experimental, it might cause\n";
3313 print "errors, if email contains charset unsupported by recode or if your\n";
3314 print "php does not have recode support.\n";
3315 print "\n";
3316
35aaf666 3317 if ( lc($use_php_recode) eq 'true' ) {
39d3ec89 3318 $default_value = "y";
3319 } else {
3320 $default_value = "n";
3321 }
ad9d110a 3322 print "Use php recode functions? (y/n) [$WHT$default_value$NRM]: $WHT";
39d3ec89 3323 $use_php_recode = <STDIN>;
3324 if ( ( $use_php_recode =~ /^y\n/i ) || ( ( $use_php_recode =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 3325 $use_php_recode = 'true';
39d3ec89 3326 } else {
35aaf666 3327 $use_php_recode = 'false';
39d3ec89 3328 }
3329 return $use_php_recode;
3330}
3331# php iconv
6395c46d 3332sub commandB5 {
39d3ec89 3333 print "Enable this option if you want to use php iconv functions to read\n";
3334 print "emails written in charset that differs from the one that is set in\n";
3335 print "translation selected by user. Code is experimental, it works only\n";
3336 print "with translations that use utf-8 charset. Code might cause errors,\n";
3337 print "if email contains charset unsupported by iconv or if your php does\n";
3338 print "not have iconv support.\n";
3339 print "\n";
3340
35aaf666 3341 if ( lc($use_php_iconv) eq 'true' ) {
39d3ec89 3342 $default_value = "y";
3343 } else {
3344 $default_value = "n";
3345 }
ad9d110a 3346 print "Use php iconv functions? (y/n) [$WHT$default_value$NRM]: $WHT";
39d3ec89 3347 $use_php_iconv = <STDIN>;
3348 if ( ( $use_php_iconv =~ /^y\n/i ) || ( ( $use_php_iconv =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
35aaf666 3349 $use_php_iconv = 'true';
39d3ec89 3350 } else {
35aaf666 3351 $use_php_iconv = 'false';
39d3ec89 3352 }
3353 return $use_php_iconv;
3354}
3355
71d3f882 3356# configtest block
3357sub commandB6 {
3358 print "Enable this option if you want to check SquirrelMail configuration\n";
3359 print "remotely with configtest.php script.\n";
3360 print "\n";
3361
3362 if ( lc($allow_remote_configtest) eq 'true' ) {
3363 $default_value = "y";
3364 } else {
3365 $default_value = "n";
3366 }
3367 print "Allow remote configuration tests? (y/n) [$WHT$default_value$NRM]: $WHT";
3368 $allow_remote_configtest = <STDIN>;
3369 if ( ( $allow_remote_configtest =~ /^y\n/i ) || ( ( $allow_remote_configtest =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
3370 $allow_remote_configtest = 'true';
3371 } else {
3372 $allow_remote_configtest = 'false';
3373 }
3374 return $allow_remote_configtest;
3375}
3376
3377
39d3ec89 3378
ccfb2029 3379sub save_data {
ebd13f55 3380 $tab = " ";
eaace00e 3381 if ( open( CF, ">config.php" ) ) {
ebd13f55 3382 print CF "<?php\n";
3383 print CF "\n";
eaace00e 3384
ebd13f55 3385 print CF "/**\n";
3386 print CF " * SquirrelMail Configuration File\n";
3387 print CF " * Created using the configure script, conf.pl\n";
3388 print CF " */\n";
3389 print CF "\n";
93c06fa2 3390 print CF "global \$version;\n";
598294a7 3391
ebd13f55 3392 if ($print_config_version) {
eaace00e 3393 print CF "\$config_version = '$print_config_version';\n";
ebd13f55 3394 }
35aaf666 3395 # integer
254ded61 3396 print CF "\$config_use_color = $config_use_color;\n";
ebd13f55 3397 print CF "\n";
598294a7 3398
35aaf666 3399 # string
d756b071 3400 print CF "\$org_name = \"$org_name\";\n";
254ded61 3401 # string
35aaf666 3402 print CF "\$org_logo = " . &change_to_SM_path($org_logo) . ";\n";
b6e0c3b6 3403 $org_logo_width |= 0;
3404 $org_logo_height |= 0;
35aaf666 3405 # string
6c2d0a35 3406 print CF "\$org_logo_width = '$org_logo_width';\n";
3407 # string
35aaf666 3408 print CF "\$org_logo_height = '$org_logo_height';\n";
3409 # string that can contain variables.
12947430 3410 print CF "\$org_title = \"$org_title\";\n";
35aaf666 3411 # string
8bd9e0dd 3412 print CF "\$signout_page = " . &change_to_SM_path($signout_page) . ";\n";
35aaf666 3413 # string
3d043efc 3414 print CF "\$frame_top = '$frame_top';\n";
ebd13f55 3415 print CF "\n";
eaace00e 3416
0ae4c1f2 3417 print CF "\$provider_uri = '$provider_uri';\n";
3418 print CF "\n";
3419
3420 print CF "\$provider_name = '$provider_name';\n";
3421 print CF "\n";
3422
35aaf666 3423 # string that can contain variables
254ded61 3424 print CF "\$motd = \"$motd\";\n";
ebd13f55 3425 print CF "\n";
598294a7 3426
35aaf666 3427 # string
ebd13f55 3428 print CF "\$squirrelmail_default_language = '$squirrelmail_default_language';\n";
35aaf666 3429 # string
39d3ec89 3430 print CF "\$default_charset = '$default_charset';\n";
35aaf666 3431 # boolean
6cbbd722 3432 print CF "\$show_alternative_names = $show_alternative_names;\n";
35aaf666 3433 # boolean
f03f6ee7 3434 print CF "\$aggressive_decoding = $aggressive_decoding;\n";
3435 # boolean
6d3689f5 3436 print CF "\$lossy_encoding = $lossy_encoding;\n";
ebd13f55 3437 print CF "\n";
eaace00e 3438
35aaf666 3439 # string
ebd13f55 3440 print CF "\$domain = '$domain';\n";
35aaf666 3441 # string
ebd13f55 3442 print CF "\$imapServerAddress = '$imapServerAddress';\n";
35aaf666 3443 # integer
254ded61 3444 print CF "\$imapPort = $imapPort;\n";
35aaf666 3445 # boolean
254ded61 3446 print CF "\$useSendmail = $useSendmail;\n";
35aaf666 3447 # string
ebd13f55 3448 print CF "\$smtpServerAddress = '$smtpServerAddress';\n";
35aaf666 3449 # integer
254ded61 3450 print CF "\$smtpPort = $smtpPort;\n";
35aaf666 3451 # string
ebd13f55 3452 print CF "\$sendmail_path = '$sendmail_path';\n";
fd7ab795 3453 # string
3454 print CF "\$sendmail_args = '$sendmail_args';\n";
35aaf666 3455 # boolean
47a29326 3456# print CF "\$use_authenticated_smtp = $use_authenticated_smtp;\n";
35aaf666 3457 # boolean
254ded61 3458 print CF "\$pop_before_smtp = $pop_before_smtp;\n";
35aaf666 3459 # string
ebd13f55 3460 print CF "\$imap_server_type = '$imap_server_type';\n";
35aaf666 3461 # boolean
374726c9 3462 print CF "\$invert_time = $invert_time;\n";
35aaf666 3463 # string
ebd13f55 3464 print CF "\$optional_delimiter = '$optional_delimiter';\n";
432db2fc 3465 # string
3466 print CF "\$encode_header_key = '$encode_header_key';\n";
ebd13f55 3467 print CF "\n";
eaace00e 3468
35aaf666 3469 # string
ebd13f55 3470 print CF "\$default_folder_prefix = '$default_folder_prefix';\n";
35aaf666 3471 # string
ebd13f55 3472 print CF "\$trash_folder = '$trash_folder';\n";
35aaf666 3473 # string
ebd13f55 3474 print CF "\$sent_folder = '$sent_folder';\n";
35aaf666 3475 # string
ebd13f55 3476 print CF "\$draft_folder = '$draft_folder';\n";
35aaf666 3477 # boolean
254ded61 3478 print CF "\$default_move_to_trash = $default_move_to_trash;\n";
35aaf666 3479 # boolean
254ded61 3480 print CF "\$default_move_to_sent = $default_move_to_sent;\n";
35aaf666 3481 # boolean
254ded61 3482 print CF "\$default_save_as_draft = $default_save_as_draft;\n";
35aaf666 3483 # boolean
254ded61 3484 print CF "\$show_prefix_option = $show_prefix_option;\n";
35aaf666 3485 # boolean
254ded61 3486 print CF "\$list_special_folders_first = $list_special_folders_first;\n";
35aaf666 3487 # boolean
254ded61 3488 print CF "\$use_special_folder_color = $use_special_folder_color;\n";
35aaf666 3489 # boolean
254ded61 3490 print CF "\$auto_expunge = $auto_expunge;\n";
35aaf666 3491 # boolean
254ded61 3492 print CF "\$default_sub_of_inbox = $default_sub_of_inbox;\n";
35aaf666 3493 # boolean
254ded61 3494 print CF "\$show_contain_subfolders_option = $show_contain_subfolders_option;\n";
35aaf666 3495 # integer
254ded61 3496 print CF "\$default_unseen_notify = $default_unseen_notify;\n";
35aaf666 3497 # integer
254ded61 3498 print CF "\$default_unseen_type = $default_unseen_type;\n";
35aaf666 3499 # boolean
254ded61 3500 print CF "\$auto_create_special = $auto_create_special;\n";
35aaf666 3501 # boolean
254ded61 3502 print CF "\$delete_folder = $delete_folder;\n";
ca85aabe 3503 # boolean
3504 print CF "\$noselect_fix_enable = $noselect_fix_enable;\n";
3505
ebd13f55 3506 print CF "\n";
eaace00e 3507
35aaf666 3508 # string
8bd9e0dd 3509 print CF "\$data_dir = " . &change_to_SM_path($data_dir) . ";\n";
35aaf666 3510 # string that can contain a variable
8bd9e0dd 3511 print CF "\$attachment_dir = " . &change_to_SM_path($attachment_dir) . ";\n";
35aaf666 3512 # integer
254ded61 3513 print CF "\$dir_hash_level = $dir_hash_level;\n";
35aaf666 3514 # string
80519ece 3515 print CF "\$default_left_size = '$default_left_size';\n";
35aaf666 3516 # boolean
254ded61 3517 print CF "\$force_username_lowercase = $force_username_lowercase;\n";
35aaf666 3518 # boolean
254ded61 3519 print CF "\$default_use_priority = $default_use_priority;\n";
35aaf666 3520 # boolean
254ded61 3521 print CF "\$hide_sm_attributions = $hide_sm_attributions;\n";
35aaf666 3522 # boolean
254ded61 3523 print CF "\$default_use_mdn = $default_use_mdn;\n";
35aaf666 3524 # boolean
254ded61 3525 print CF "\$edit_identity = $edit_identity;\n";
35aaf666 3526 # boolean
254ded61 3527 print CF "\$edit_name = $edit_name;\n";
432db2fc 3528 # boolean
3529 print CF "\$hide_auth_header = $hide_auth_header;\n";
35aaf666 3530 # boolean
254ded61 3531 print CF "\$allow_thread_sort = $allow_thread_sort;\n";
35aaf666 3532 # boolean
aacc7bec 3533 print CF "\$allow_server_sort = $allow_server_sort;\n";
66bfb27b 3534 # boolean
3c7ee482 3535 print CF "\$allow_charset_search = $allow_charset_search;\n";
0f1b00b8 3536 # integer
3537 print CF "\$allow_advanced_search = $allow_advanced_search;\n";
ebd13f55 3538 print CF "\n";
ee20a285 3539 # integer
3540 print CF "\$time_zone_type = $time_zone_type;\n";
3541 print CF "\n";
598294a7 3542
35aaf666 3543 # all plugins are strings
eaace00e 3544 for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
a1b036d6 3545 print CF "\$plugins[] = '$plugins[$ct]';\n";
ebd13f55 3546 }
3547 print CF "\n";
eaace00e 3548
35aaf666 3549 # strings
8bd9e0dd 3550 print CF "\$theme_css = " . &change_to_SM_path($theme_css) . ";\n";
35aaf666 3551 if ( $theme_default eq '' ) { $theme_default = '0'; }
57c6fabc 3552 print CF "\$theme_default = $theme_default;\n";
3553
eaace00e 3554 for ( $count = 0 ; $count <= $#theme_name ; $count++ ) {
8bd9e0dd 3555 print CF "\$theme[$count]['PATH'] = " . &change_to_SM_path($theme_path[$count]) . ";\n";
ed65d11b 3556 # escape theme name so it can contain single quotes.
3557 $esc_name = $theme_name[$count];
3558 $esc_name =~ s/\\/\\\\/g;
3559 $esc_name =~ s/'/\\'/g;
3560 print CF "\$theme[$count]['NAME'] = '$esc_name';\n";
ebd13f55 3561 }
3562 print CF "\n";
eaace00e 3563
96862638 3564 ## Address books
3565 # boolean
ebd13f55 3566 print CF "\$default_use_javascript_addr_book = $default_use_javascript_addr_book;\n";
eaace00e 3567 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
3568 print CF "\$ldap_server[$count] = array(\n";
35aaf666 3569 # string
eaace00e 3570 print CF " 'host' => '$ldap_host[$count]',\n";
35aaf666 3571 # string
eaace00e 3572 print CF " 'base' => '$ldap_base[$count]'";
3573 if ( $ldap_name[$count] ) {
3574 print CF ",\n";
35aaf666 3575 # string
eaace00e 3576 print CF " 'name' => '$ldap_name[$count]'";
3577 }
3578 if ( $ldap_port[$count] ) {
3579 print CF ",\n";
35aaf666 3580 # integer
254ded61 3581 print CF " 'port' => $ldap_port[$count]";
eaace00e 3582 }
3583 if ( $ldap_charset[$count] ) {
3584 print CF ",\n";
35aaf666 3585 # string
eaace00e 3586 print CF " 'charset' => '$ldap_charset[$count]'";
3587 }
3588 if ( $ldap_maxrows[$count] ) {
3589 print CF ",\n";
35aaf666 3590 # integer
254ded61 3591 print CF " 'maxrows' => $ldap_maxrows[$count]";
eaace00e 3592 }
43397658 3593 # string
3594 if ( $ldap_filter[$count] ) {
3595 print CF ",\n";
3596 print CF " 'filter' => '$ldap_filter[$count]'";
3597 }
30e9932c 3598 if ( $ldap_binddn[$count] ) {
3599 print CF ",\n";
3600 # string
3601 print CF " 'binddn' => '$ldap_binddn[$count]'";
3602 if ( $ldap_bindpw[$count] ) {
3603 print CF ",\n";
3604 # string
3605 print CF " 'bindpw' => '$ldap_bindpw[$count]'";
3606 }
3607 }
3608 if ( $ldap_protocol[$count] ) {
3609 print CF ",\n";
327e2d96 3610 # integer
30e9932c 3611 print CF " 'protocol' => $ldap_protocol[$count]";
3612 }
43397658 3613 if ( $ldap_limit_scope[$count] ) {
3614 print CF ",\n";
3615 # boolean
3616 print CF " 'limit_scope' => $ldap_limit_scope[$count]";
3617 }
327e2d96 3618 if ( $ldap_listing[$count] ) {
3619 print CF ",\n";
3620 # boolean
3621 print CF " 'listing' => $ldap_listing[$count]";
3622 }
593370a4 3623 if ( $ldap_search_tree[$count] ) {
3624 print CF ",\n";
3625 # integer
3626 print CF " 'search_tree' => $ldap_search_tree[$count]";
3627 }
3628 if ( $ldap_listing[$count] ) {
3629 print CF ",\n";
3630 # boolean
3631 print CF " 'starttls' => $ldap_starttls[$count]";
3632 }
eaace00e 3633 print CF "\n";
3634 print CF ");\n";
3635 print CF "\n";
ebd13f55 3636 }
b622e1b8 3637
35aaf666 3638 # string
4f40a59d 3639 print CF "\$addrbook_dsn = '$addrbook_dsn';\n";
35aaf666 3640 # string
4f40a59d 3641 print CF "\$addrbook_table = '$addrbook_table';\n\n";
35aaf666 3642 # string
3499f99f 3643 print CF "\$prefs_dsn = '$prefs_dsn';\n";
35aaf666 3644 # string
99a6c222 3645 print CF "\$prefs_table = '$prefs_table';\n";
35aaf666 3646 # string
99a6c222 3647 print CF "\$prefs_user_field = '$prefs_user_field';\n";
06316c07 3648 # integer
3649 print CF "\$prefs_user_size = $prefs_user_size;\n";
35aaf666 3650 # string
99a6c222 3651 print CF "\$prefs_key_field = '$prefs_key_field';\n";
06316c07 3652 # integer
3653 print CF "\$prefs_key_size = $prefs_key_size;\n";
35aaf666 3654 # string
06316c07 3655 print CF "\$prefs_val_field = '$prefs_val_field';\n";
3656 # integer
3657 print CF "\$prefs_val_size = $prefs_val_size;\n\n";
35aaf666 3658 # string
30e9932c 3659 print CF "\$addrbook_global_dsn = '$addrbook_global_dsn';\n";
35aaf666 3660 # string
30e9932c 3661 print CF "\$addrbook_global_table = '$addrbook_global_table';\n";
35aaf666 3662 # boolean
4272758c 3663 print CF "\$addrbook_global_writeable = $addrbook_global_writeable;\n";
35aaf666 3664 # boolean
30e9932c 3665 print CF "\$addrbook_global_listing = $addrbook_global_listing;\n\n";
4272758c 3666 # string
3667 print CF "\$abook_global_file = '$abook_global_file';\n";
3668 # boolean
3669 print CF "\$abook_global_file_writeable = $abook_global_file_writeable;\n\n";
71d3f882 3670 # boolean
3671 print CF "\$abook_global_file_listing = $abook_global_file_listing;\n\n";
35aaf666 3672 # boolean
6395c46d 3673 print CF "\$no_list_for_subscribe = $no_list_for_subscribe;\n";
47a29326 3674
35aaf666 3675 # string
6395c46d 3676 print CF "\$smtp_auth_mech = '$smtp_auth_mech';\n";
35aaf666 3677 # string
6395c46d 3678 print CF "\$imap_auth_mech = '$imap_auth_mech';\n";
35aaf666 3679 # boolean
6395c46d 3680 print CF "\$use_imap_tls = $use_imap_tls;\n";
35aaf666 3681 # boolean
6395c46d 3682 print CF "\$use_smtp_tls = $use_smtp_tls;\n";
35aaf666 3683 # string
6395c46d 3684 print CF "\$session_name = '$session_name';\n";
6c499577 3685
35aaf666 3686 print CF "\n";
3687
3688 # boolean
3689 print CF "\$advanced_tree = $advanced_tree;\n";
3690 print CF "\n";
3691 # boolean
74d6a0d9 3692 print CF "\$use_iframe = $use_iframe;\n";
3693 print CF "\n";
3694 # boolean
35aaf666 3695 print CF "\$use_icons = $use_icons;\n";
3696 print CF "\n";
3697 # boolean
3698 print CF "\$use_php_recode = $use_php_recode;\n";
3699 print CF "\n";
3700 # boolean
3701 print CF "\$use_php_iconv = $use_php_iconv;\n";
71d3f882 3702 print CF "\n";
3703 # boolean
3704 print CF "\$allow_remote_configtest = $allow_remote_configtest;\n";
35aaf666 3705 print CF "\n";
3706
3707 print CF "\@include SM_PATH . 'config/config_local.php';\n";
598294a7 3708
35aaf666 3709 print CF "\n/**\n";
3710 print CF " * Make sure there are no characters after the PHP closing\n";
3711 print CF " * tag below (including newline characters and whitespace).\n";
3712 print CF " * Otherwise, that character will cause the headers to be\n";
3713 print CF " * sent and regular output to begin, which will majorly screw\n";
3714 print CF " * things up when we try to send more headers later.\n";
3715 print CF " */\n";
3716 print CF "?>";
598294a7 3717
35aaf666 3718 close CF;
ebd13f55 3719
35aaf666 3720 print "Data saved in config.php\n";
ebd13f55 3721 } else {
3722 print "Error saving config.php: $!\n";
3723 }
911ad01c 3724}
a93b12ba 3725
3726sub set_defaults {
f8c17cdd 3727 clear_screen();
eaace00e 3728 print $WHT. "SquirrelMail Configuration : " . $NRM;
3729 if ( $config == 1 ) { print "Read: config.php"; }
3730 elsif ( $config == 2 ) { print "Read: config_default.php"; }
3731 print "\n";
3732 print "---------------------------------------------------------\n";
3733
3734 print "While we have been building SquirrelMail, we have discovered some\n";
3735 print "preferences that work better with some servers that don't work so\n";
3736 print "well with others. If you select your IMAP server, this option will\n";
3737 print "set some pre-defined settings for that server.\n";
3738 print "\n";
3739 print "Please note that you will still need to go through and make sure\n";
3740 print "everything is correct. This does not change everything. There are\n";
3741 print "only a few settings that this will change.\n";
3742 print "\n";
3743
3744 $continue = 0;
3745 while ( $continue != 1 ) {
3746 print "Please select your IMAP server:\n";
e498ebbd 3747 print " bincimap = Binc IMAP server\n";
a33764f6 3748 print " courier = Courier IMAP server\n";
b39825f0 3749 print " cyrus = Cyrus IMAP server\n";
a33764f6 3750 print " dovecot = Dovecot Secure IMAP server\n";
b39825f0 3751 print " exchange = Microsoft Exchange IMAP server\n";
b39825f0 3752 print " hmailserver = hMailServer\n";
a33764f6 3753 print " macosx = Mac OS X Mailserver\n";
b39825f0 3754 print " mercury32 = Mercury/32\n";
a33764f6 3755 print " uw = University of Washington's IMAP server\n";
3756 print "\n";
b39825f0 3757 print " quit = Do not change anything\n";
a33764f6 3758 print "\n";
eaace00e 3759 print "Command >> ";
3760 $server = <STDIN>;
85645192 3761 $server =~ s/[\r\n]//g;
eaace00e 3762
e498ebbd 3763 # variable is used to display additional messages.
3764 $message = "";
3765
eaace00e 3766 print "\n";
3767 if ( $server eq "cyrus" ) {
3768 $imap_server_type = "cyrus";
3769 $default_folder_prefix = "";
3770 $trash_folder = "INBOX.Trash";
3771 $sent_folder = "INBOX.Sent";
3772 $draft_folder = "INBOX.Drafts";
3773 $show_prefix_option = false;
3774 $default_sub_of_inbox = true;
3775 $show_contain_subfolders_option = false;
3776 $optional_delimiter = ".";
3777 $disp_default_folder_prefix = "<none>";
b79b84c2 3778 $force_username_lowercase = false;
eaace00e 3779
3780 $continue = 1;
3781 } elsif ( $server eq "uw" ) {
3782 $imap_server_type = "uw";
3783 $default_folder_prefix = "mail/";
3784 $trash_folder = "Trash";
3785 $sent_folder = "Sent";
3786 $draft_folder = "Drafts";
3787 $show_prefix_option = true;
3788 $default_sub_of_inbox = false;
3789 $show_contain_subfolders_option = true;
3790 $optional_delimiter = "/";
3791 $disp_default_folder_prefix = $default_folder_prefix;
2eec12b5 3792 $delete_folder = true;
b79b84c2 3793 $force_username_lowercase = true;
598294a7 3794
eaace00e 3795 $continue = 1;
3796 } elsif ( $server eq "exchange" ) {
3797 $imap_server_type = "exchange";
3798 $default_folder_prefix = "";
3799 $default_sub_of_inbox = true;
3800 $trash_folder = "INBOX/Deleted Items";
3801 $sent_folder = "INBOX/Sent Items";
3802 $drafts_folder = "INBOX/Drafts";
3803 $show_prefix_option = false;
3804 $show_contain_subfolders_option = false;
3805 $optional_delimiter = "detect";
3806 $disp_default_folder_prefix = "<none>";
b79b84c2 3807 $force_username_lowercase = true;
eaace00e 3808
3809 $continue = 1;
3810 } elsif ( $server eq "courier" ) {
3811 $imap_server_type = "courier";
3812 $default_folder_prefix = "INBOX.";
3813 $trash_folder = "Trash";
3814 $sent_folder = "Sent";
3815 $draft_folder = "Drafts";
3816 $show_prefix_option = false;
3817 $default_sub_of_inbox = false;
3818 $show_contain_subfolders_option = false;
3819 $optional_delimiter = ".";
3820 $disp_default_folder_prefix = $default_folder_prefix;
2eec12b5 3821 $delete_folder = true;
b79b84c2 3822 $force_username_lowercase = false;
598294a7 3823
cfe486a7 3824 $continue = 1;
3825 } elsif ( $server eq "macosx" ) {
3826 $imap_server_type = "macosx";
3827 $default_folder_prefix = "INBOX/";
3828 $trash_folder = "Trash";
3829 $sent_folder = "Sent";
3830 $draft_folder = "Drafts";
3831 $show_prefix_option = false;
3832 $default_sub_of_inbox = true;
3833 $show_contain_subfolders_option = false;
3834 $optional_delimiter = "detect";
3835 $allow_charset_search = false;
3836 $disp_default_folder_prefix = $default_folder_prefix;
eaace00e 3837
063ed2b1 3838 $continue = 1;
b39825f0 3839 } elsif ( $server eq "hmailserver" ) {
3840 $imap_server_type = "hmailserver";
946b11e9 3841 $default_folder_prefix = "";
3842 $trash_folder = "INBOX.Trash";
3843 $sent_folder = "INBOX.Sent";
3844 $draft_folder = "INBOX.Drafts";
3845 $show_prefix_option = false;
3846 $default_sub_of_inbox = true;
3847 $show_contain_subfolders_option = false;
3848 $optional_delimiter = "detect";
3849 $allow_charset_search = false;
3850 $disp_default_folder_prefix = $default_folder_prefix;
e50f5ac2 3851 $delete_folder = false;
3852 $force_username_lowercase = false;
b39825f0 3853
e50f5ac2 3854 $continue = 1;
063ed2b1 3855 } elsif ( $server eq "mercury32" ) {
3856 $imap_server_type = "mercury32";
3857 $default_folder_prefix = "";
67a24f8a 3858 $trash_folder = "Trash";
3859 $sent_folder = "Sent";
3860 $draft_folder = "Drafts";
063ed2b1 3861 $show_prefix_option = false;
3862 $default_sub_of_inbox = true;
3863 $show_contain_subfolders_option = true;
3864 $optional_delimiter = "detect";
3865 $delete_folder = true;
3866 $force_username_lowercase = true;
3867
a33764f6 3868 $continue = 1;
3869 } elsif ( $server eq "dovecot" ) {
3870 $imap_server_type = "dovecot";
3871 $default_folder_prefix = "";
3872 $trash_folder = "Trash";
3873 $sent_folder = "Sent";
3874 $draft_folder = "Drafts";
3875 $show_prefix_option = false;
3876 $default_sub_of_inbox = false;
3877 $show_contain_subfolders_option = false;
3878 $delete_folder = false;
3879 $force_username_lowercase = true;
3880 $optional_delimiter = "detect";
3881 $disp_default_folder_prefix = "<none>";
3882
e498ebbd 3883 $continue = 1;
3884 } elsif ( $server eq "bincimap" ) {
3885 $imap_server_type = "bincimap";
3886 $default_folder_prefix = "INBOX/";
3887 $trash_folder = "Trash";
3888 $sent_folder = "Sent";
3889 $draft_folder = "Drafts";
3890 $show_prefix_option = false;
3891 $default_sub_of_inbox = false;
3892 $show_contain_subfolders_option = false;
3893 $delete_folder = true;
3894 $force_username_lowercase = false;
3895 $optional_delimiter = "detect";
3896 $disp_default_folder_prefix = $default_folder_prefix;
3897
3898 # Default folder prefix depends on used depot.
3899 $message = "\nIf you use IMAPdir depot, you must set default folder prefix to empty string.\n";
3900
eaace00e 3901 $continue = 1;
3902 } elsif ( $server eq "quit" ) {
3903 $continue = 1;
3904 } else {
3905 $disp_default_folder_prefix = $default_folder_prefix;
3906 print "Unrecognized server: $server\n";
3907 print "\n";
3908 }
3909
3910 print " imap_server_type = $imap_server_type\n";
3911 print " default_folder_prefix = $disp_default_folder_prefix\n";
3912 print " trash_folder = $trash_folder\n";
3913 print " sent_folder = $sent_folder\n";
3914 print " draft_folder = $draft_folder\n";
3915 print " show_prefix_option = $show_prefix_option\n";
3916 print " default_sub_of_inbox = $default_sub_of_inbox\n";
3917 print "show_contain_subfolders_option = $show_contain_subfolders_option\n";
3918 print " optional_delimiter = $optional_delimiter\n";
2eec12b5 3919 print " delete_folder = $delete_folder\n";
b79b84c2 3920 print " force_username_lowercase = $force_username_lowercase\n";
e498ebbd 3921
3922 print "$message";
eaace00e 3923 }
b79b84c2 3924 print "\nPress enter to continue...";
eaace00e 3925 $tmp = <STDIN>;
a93b12ba 3926}
8bd9e0dd 3927
8bd9e0dd 3928# This subroutine corrects relative paths to ensure they
3929# will work within the SM space. If the path falls within
598294a7 3930# the SM directory tree, the SM_PATH variable will be
8bd9e0dd 3931# prepended to the path, if not, then the path will be
e6566358 3932# converted to an absolute path, e.g.
2222aed0 3933# '../images/logo.gif' --> SM_PATH . 'images/logo.gif'
a2a74376 3934# '../../someplace/data' --> '/absolute/path/someplace/data'
2222aed0 3935# 'images/logo.gif' --> SM_PATH . 'config/images/logo.gif'
3936# '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
3937# 'http://whatever/' --> 'http://whatever'
b72da239 3938# $some_var/path --> "$some_var/path"
8bd9e0dd 3939sub change_to_SM_path() {
3940 my ($old_path) = @_;
3941 my $new_path = '';
3942 my @rel_path;
3943 my @abs_path;
3944 my $subdir;
3945
3946 # If the path is absolute, don't bother.
3947 return "\'" . $old_path . "\'" if ( $old_path eq '');
a28a56da 3948 return "\'" . $old_path . "\'" if ( $old_path =~ /^(\/|http)/ );
d3fb3870 3949 return "\'" . $old_path . "\'" if ( $old_path =~ /^\w:\// );
25be56ab 3950 return $old_path if ( $old_path =~ /^\'(\/|http)/ );
d3fb3870 3951 return $old_path if ( $old_path =~ /^\'\w:\// );
b72da239 3952 return $old_path if ( $old_path =~ /^SM_PATH/);
598294a7 3953
b72da239 3954 if ( $old_path =~ /^\$/ ) {
3955 # check if it's a single var, or a $var/path combination
3956 # if it's $var/path, enclose in ""
3957 if ( $old_path =~ /\// ) {
3958 return '"'.$old_path.'"';
3959 }
3960 return $old_path;
3961 }
598294a7 3962
25be56ab 3963 # Remove remaining '
3964 $old_path =~ s/\'//g;
598294a7 3965
8bd9e0dd 3966 # For relative paths, split on '../'
3967 @rel_path = split(/\.\.\//, $old_path);
3968
3969 if ( $#rel_path > 1 ) {
3970 # more than two levels away. Make it absolute.
a2a74376 3971 @abs_path = split(/\//, $dir);
598294a7 3972
a2a74376 3973 # Lop off the relative pieces of the absolute path..
3974 for ( $i = 0; $i <= $#rel_path; $i++ ) {
3975 pop @abs_path;
3976 shift @rel_path;
3977 }
3978 push @abs_path, @rel_path;
1df76076 3979 $new_path = "\'" . join('/', @abs_path) . "\'";
8bd9e0dd 3980 } elsif ( $#rel_path > 0 ) {
3981 # it's within the SM tree, prepend SM_PATH
3982 $new_path = $old_path;
3983 $new_path =~ s/^\.\.\//SM_PATH . \'/;
25be56ab 3984 $new_path .= "\'";
8bd9e0dd 3985 } else {
3986 # Last, it's a relative path without any leading '.'
598294a7 3987 # Prepend SM_PATH and config, since the paths are
35aaf666 3988 # relative to the config directory
e6566358 3989 $new_path = "SM_PATH . \'config/" . $old_path . "\'";
8bd9e0dd 3990 }
8bd9e0dd 3991 return $new_path;
3992}
3993
e6566358 3994
3995# Change SM_PATH to admin-friendly version, e.g.:
3996# SM_PATH . 'images/logo.gif' --> '../images/logo.gif'
3997# SM_PATH . 'config/some.php' --> 'some.php'
3998# '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
3999# 'http://whatever/' --> 'http://whatever'
8bd9e0dd 4000sub change_to_rel_path() {
4001 my ($old_path) = @_;
e6566358 4002 my $new_path = $old_path;
8bd9e0dd 4003
4004 if ( $old_path =~ /^SM_PATH/ ) {
8bd9e0dd 4005 $new_path =~ s/^SM_PATH . \'/\.\.\//;
b72da239 4006 $new_path =~ s/\.\.\/config\///;
8bd9e0dd 4007 }
4008
4009 return $new_path;
4010}
b47821fb 4011
4012sub detect_auth_support {
4013# Attempts to auto-detect if a specific auth mechanism is supported.
4014# Called by 'command112a' and 'command112b'
4015# ARGS: service-name (IMAP or SMTP), host:port, mech-name (ie. CRAM-MD5)
4016
35aaf666 4017 # Misc setup
4018 use IO::Socket;
4019 my $service = shift;
4020 my $host = shift;
4021 my $mech = shift;
4022 # Sanity checks
4023 if ((!defined($service)) or (!defined($host)) or (!defined($mech))) {
4024 # Error - wrong # of args
4025 print "BAD ARGS!\n";
4026 return undef;
4027 }
598294a7 4028
35aaf666 4029 if ($service eq 'SMTP') {
5d28b77e 4030 $cmd = "AUTH $mech\r\n";
4031 $logout = "QUIT\r\n";
35aaf666 4032 } elsif ($service eq 'IMAP') {
4033 $cmd = "A01 AUTHENTICATE $mech\n";
4034 $logout = "C01 LOGOUT\n";
4035 } else {
4036 # unknown service - whoops.
4037 return undef;
4038 }
4039
4040 # Get this show on the road
b47821fb 4041 my $sock=IO::Socket::INET->new($host);
4042 if (!defined($sock)) {
4043 # Connect failed
4044 return undef;
4045 }
35aaf666 4046 my $discard = <$sock>; # Server greeting/banner - who cares..
4047
4048 if ($service eq 'SMTP') {
4049 # Say hello first..
5d28b77e 4050 print $sock "HELO $domain\r\n";
35aaf666 4051 $discard = <$sock>; # Yeah yeah, you're happy to see me..
4052 }
4053 print $sock $cmd;
4054
4055 my $response = <$sock>;
4056 chomp($response);
4057 if (!defined($response)) {
4058 return undef;
4059 }
4060
4061 # So at this point, we have a response, and it is (hopefully) valid.
4062 if ($service eq 'SMTP') {
4063 if (($response =~ /^535/) or ($response =~/^502/)) {
4064 # Not supported
5d28b77e 4065 print $sock $logout;
35aaf666 4066 close $sock;
4067 return 'NO';
4068 } elsif ($response =~ /^503/) {
4069 #Something went wrong
4070 return undef;
4071 }
4072 } elsif ($service eq 'IMAP') {
4073 if ($response =~ /^A01/) {
4074 # Not supported
5d28b77e 4075 print $sock $logout;
35aaf666 4076 close $sock;
4077 return 'NO';
4078 }
4079 } else {
4080 # Unknown service - this shouldn't be able to happen.
4081 close $sock;
4082 return undef;
4083 }
4084
4085 # If it gets here, the mech is supported
4086 print $sock "*\n"; # Attempt to cancel authentication
4087 print $sock $logout; # Try to log out, but we don't really care if this fails
4088 close $sock;
4089 return 'YES';
b47821fb 4090}
f8c17cdd 4091
fd7ab795 4092# trims whitespace
4093# Example code from O'Reilly Perl Cookbook
4094sub trim {
4095 my @out = @_;
4096 for (@out) {
4097 s/^\s+//;
4098 s/\s+$//;
4099 }
4100 return wantarray ? @out : $out[0];
4101}
4102
f8c17cdd 4103sub clear_screen() {
4104 if ( $^O =~ /^mswin/i) {
4105 system "cls";
4106 } else {
4107 system "clear";
4108 }
4109}