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