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