Move management of user themes (SM_PATH/css/) to conf.pl.
[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] =~ /^aTemplateSet\[[0-9]+\]\[['"]ID['"]\]/ ) {
192 $sub = $options[0];
193 $sub =~ s/\]\[['"]ID['"]\]//;
194 $sub =~ s/.*\[//;
195 if ( -e "../templates" ) {
196 $options[1] =~ s/^\.\.\/config/\.\.\/templates/;
197 }
198 $templateset_id[$sub] = $options[1];
199 ##### FIXME: This section BELOW here so old prefs files don't blow up when running conf.pl
200 ##### Remove after a month or two
201 } elsif ( $options[0] =~ /^aTemplateSet\[[0-9]+\]\[['"]PATH['"]\]/ ) {
202 $sub = $options[0];
203 $sub =~ s/\]\[['"]PATH['"]\]//;
204 $sub =~ s/.*\[//;
205 if ( -e "../templates" ) {
206 $options[1] =~ s/^\.\.\/config/\.\.\/templates/;
207 }
208 $templateset_id[$sub] = $options[1];
209 ##### FIXME: This section ABOVE here so old prefs files don't blow up when running conf.pl
210 ##### Remove after a month or two
211 } elsif ( $options[0] =~ /^aTemplateSet\[[0-9]+\]\[['"]NAME['"]\]/ ) {
212 $sub = $options[0];
213 $sub =~ s/\]\[['"]NAME['"]\]//;
214 $sub =~ s/.*\[//;
215 $templateset_name[$sub] = $options[1];
216 } elsif ( $options[0] =~ /^plugins\[[0-9]*\]/ ) {
217 $sub = $options[0];
218 $sub =~ s/\]//;
219 $sub =~ s/^plugins\[//;
220 if ($sub eq '') {
221 push @plugins, $options[1];
222 } else {
223 $plugins[$sub] = $options[1];
224 }
225 } elsif ($options[0] =~ /^fontsets\[\'[a-z]*\'\]/) {
226 # parse associative $fontsets array
227 $sub = $options[0];
228 $sub =~ s/\'\]//;
229 $sub =~ s/^fontsets\[\'//;
230 $fontsets{$sub} = $options[1];
231 } elsif ( $options[0] =~ /^ldap_server\[[0-9]+\]/ ) {
232 $sub = $options[0];
233 $sub =~ s/\]//;
234 $sub =~ s/^ldap_server\[//;
235 $continue = 0;
236 while ( ( $tmp = <FILE> ) && ( $continue != 1 ) ) {
237 if ( $tmp =~ /\);\s*$/ ) {
238 $continue = 1;
239 }
240
241 if ( $tmp =~ /^\s*[\'\"]host[\'\"]/i ) {
242 $tmp =~ s/^\s*[\'\"]host[\'\"]\s*=>\s*[\'\"]//i;
243 $tmp =~ s/[\'\"],?\s*$//;
244 $tmp =~ s/[\'\"]\);\s*$//;
245 $host = $tmp;
246 } elsif ( $tmp =~ /^\s*[\'\"]base[\'\"]/i ) {
247 $tmp =~ s/^\s*[\'\"]base[\'\"]\s*=>\s*[\'\"]//i;
248 $tmp =~ s/[\'\"],?\s*$//;
249 $tmp =~ s/[\'\"]\);\s*$//;
250 $base = $tmp;
251 } elsif ( $tmp =~ /^\s*[\'\"]charset[\'\"]/i ) {
252 $tmp =~ s/^\s*[\'\"]charset[\'\"]\s*=>\s*[\'\"]//i;
253 $tmp =~ s/[\'\"],?\s*$//;
254 $tmp =~ s/[\'\"]\);\s*$//;
255 $charset = $tmp;
256 } elsif ( $tmp =~ /^\s*[\'\"]port[\'\"]/i ) {
257 $tmp =~ s/^\s*[\'\"]port[\'\"]\s*=>\s*[\'\"]?//i;
258 $tmp =~ s/[\'\"]?,?\s*$//;
259 $tmp =~ s/[\'\"]?\);\s*$//;
260 $port = $tmp;
261 } elsif ( $tmp =~ /^\s*[\'\"]maxrows[\'\"]/i ) {
262 $tmp =~ s/^\s*[\'\"]maxrows[\'\"]\s*=>\s*[\'\"]?//i;
263 $tmp =~ s/[\'\"]?,?\s*$//;
264 $tmp =~ s/[\'\"]?\);\s*$//;
265 $maxrows = $tmp;
266 } elsif ( $tmp =~ /^\s*[\'\"]filter[\'\"]/i ) {
267 $tmp =~ s/^\s*[\'\"]filter[\'\"]\s*=>\s*[\'\"]?//i;
268 $tmp =~ s/[\'\"]?,?\s*$//;
269 $tmp =~ s/[\'\"]?\);\s*$//;
270 $filter = $tmp;
271 } elsif ( $tmp =~ /^\s*[\'\"]name[\'\"]/i ) {
272 $tmp =~ s/^\s*[\'\"]name[\'\"]\s*=>\s*[\'\"]//i;
273 $tmp =~ s/[\'\"],?\s*$//;
274 $tmp =~ s/[\'\"]\);\s*$//;
275 $name = $tmp;
276 } elsif ( $tmp =~ /^\s*[\'\"]binddn[\'\"]/i ) {
277 $tmp =~ s/^\s*[\'\"]binddn[\'\"]\s*=>\s*[\'\"]//i;
278 $tmp =~ s/[\'\"],?\s*$//;
279 $tmp =~ s/[\'\"]\);\s*$//;
280 $binddn = $tmp;
281 } elsif ( $tmp =~ /^\s*[\'\"]bindpw[\'\"]/i ) {
282 $tmp =~ s/^\s*[\'\"]bindpw[\'\"]\s*=>\s*[\'\"]//i;
283 $tmp =~ s/[\'\"],?\s*$//;
284 $tmp =~ s/[\'\"]\);\s*$//;
285 $bindpw = $tmp;
286 } elsif ( $tmp =~ /^\s*[\'\"]protocol[\'\"]/i ) {
287 $tmp =~ s/^\s*[\'\"]protocol[\'\"]\s*=>\s*[\'\"]?//i;
288 $tmp =~ s/[\'\"]?,?\s*$//;
289 $tmp =~ s/[\'\"]?\);\s*$//;
290 $protocol = $tmp;
291 } elsif ( $tmp =~ /^\s*[\'\"]limit_scope[\'\"]/i ) {
292 $tmp =~ s/^\s*[\'\"]limit_scope[\'\"]\s*=>\s*[\'\"]?//i;
293 $tmp =~ s/[\'\"]?,?\s*$//;
294 $tmp =~ s/[\'\"]?\);\s*$//;
295 $limit_scope = $tmp;
296 } elsif ( $tmp =~ /^\s*[\'\"]listing[\'\"]/i ) {
297 $tmp =~ s/^\s*[\'\"]listing[\'\"]\s*=>\s*[\'\"]?//i;
298 $tmp =~ s/[\'\"]?,?\s*$//;
299 $tmp =~ s/[\'\"]?\);\s*$//;
300 $listing = $tmp;
301 } elsif ( $tmp =~ /^\s*[\'\"]writeable[\'\"]/i ) {
302 $tmp =~ s/^\s*[\'\"]writeable[\'\"]\s*=>\s*[\'\"]?//i;
303 $tmp =~ s/[\'\"]?,?\s*$//;
304 $tmp =~ s/[\'\"]?\);\s*$//;
305 $writeable = $tmp;
306 } elsif ( $tmp =~ /^\s*[\'\"]search_tree[\'\"]/i ) {
307 $tmp =~ s/^\s*[\'\"]search_tree[\'\"]\s*=>\s*[\'\"]?//i;
308 $tmp =~ s/[\'\"]?,?\s*$//;
309 $tmp =~ s/[\'\"]?\);\s*$//;
310 $search_tree = $tmp;
311 } elsif ( $tmp =~ /^\s*[\'\"]starttls[\'\"]/i ) {
312 $tmp =~ s/^\s*[\'\"]starttls[\'\"]\s*=>\s*[\'\"]?//i;
313 $tmp =~ s/[\'\"]?,?\s*$//;
314 $tmp =~ s/[\'\"]?\);\s*$//;
315 $starttls = $tmp;
316 }
317 }
318 $ldap_host[$sub] = $host;
319 $ldap_base[$sub] = $base;
320 $ldap_name[$sub] = $name;
321 $ldap_port[$sub] = $port;
322 $ldap_maxrows[$sub] = $maxrows;
323 $ldap_filter[$sub] = $filter;
324 $ldap_charset[$sub] = $charset;
325 $ldap_binddn[$sub] = $binddn;
326 $ldap_bindpw[$sub] = $bindpw;
327 $ldap_protocol[$sub] = $protocol;
328 $ldap_limit_scope[$sub] = $limit_scope;
329 $ldap_listing[$sub] = $listing;
330 $ldap_writeable[$sub] = $writeable;
331 $ldap_search_tree[$sub] = $search_tree;
332 $ldap_starttls[$sub] = $starttls;
333 } elsif ( $options[0] =~ /^(data_dir|attachment_dir|user_theme_default|org_logo|signout_page|icon_theme_def)$/ ) {
334 ${ $options[0] } = &change_to_rel_path($options[1]);
335 } else {
336 ${ $options[0] } = $options[1];
337 }
338 }
339 }
340 close FILE;
341
342 # FIXME: unknown introduction date
343 $useSendmail = 'false' if ( lc($useSendmail) ne 'true' );
344 $sendmail_path = "/usr/sbin/sendmail" if ( !$sendmail_path );
345 $pop_before_smtp = 'false' if ( !$pop_before_smtp );
346 $default_unseen_notify = 2 if ( !$default_unseen_notify );
347 $default_unseen_type = 1 if ( !$default_unseen_type );
348 $config_use_color = 0 if ( !$config_use_color );
349 $invert_time = 'false' if ( !$invert_time );
350 $force_username_lowercase = 'false' if ( !$force_username_lowercase );
351 $optional_delimiter = "detect" if ( !$optional_delimiter );
352 $auto_create_special = 'false' if ( !$auto_create_special );
353 $default_use_priority = 'true' if ( !$default_use_priority );
354 $default_use_mdn = 'true' if ( !$default_use_mdn );
355 $delete_folder = 'false' if ( !$delete_folder );
356 $noselect_fix_enable = 'false' if ( !$noselect_fix_enable );
357 $frame_top = "_top" if ( !$frame_top );
358 $provider_uri = '' if ( !$provider_uri );
359 $provider_name = '' if ( !$provider_name );
360 $no_list_for_subscribe = 'false' if ( !$no_list_for_subscribe );
361 $allow_charset_search = 'true' if ( !$allow_charset_search );
362 $allow_advanced_search = 0 if ( !$allow_advanced_search) ;
363 $prefs_user_field = 'user' if ( !$prefs_user_field );
364 $prefs_key_field = 'prefkey' if ( !$prefs_key_field );
365 $prefs_val_field = 'prefval' if ( !$prefs_val_field );
366 $session_name = 'SQMSESSID' if ( !$session_name );
367 $skip_SM_header = 'false' if ( !$skip_SM_header );
368 $default_use_javascript_addr_book = 'false' if (! $default_use_javascript_addr_book);
369
370 # since 1.2.0
371 $hide_sm_attributions = 'false' if ( !$hide_sm_attributions );
372 # since 1.2.5
373 $edit_identity = 'true' if ( !$edit_identity );
374 $edit_name = 'true' if ( !$edit_name );
375
376 # since 1.4.0
377 $use_smtp_tls= 'false' if ( !$use_smtp_tls);
378 $smtp_auth_mech = 'none' if ( !$smtp_auth_mech );
379 $use_imap_tls = 'false' if ( !$use_imap_tls );
380 $imap_auth_mech = 'login' if ( !$imap_auth_mech );
381
382 # since 1.5.0
383 $show_alternative_names = 'false' if ( !$show_alternative_names );
384 # $available_languages option available only in 1.5.0. removed due to $languages
385 # implementation changes. options are provided by limit_languages plugin
386 # $available_languages = 'all' if ( !$available_languages );
387 $aggressive_decoding = 'false' if ( !$aggressive_decoding );
388 # available only in 1.5.0 and 1.5.1
389 # $advanced_tree = 'false' if ( !$advanced_tree );
390 $use_php_recode = 'false' if ( !$use_php_recode );
391 $use_php_iconv = 'false' if ( !$use_php_iconv );
392
393 # since 1.5.1
394 $use_icons = 'false' if ( !$use_icons );
395 $use_iframe = 'false' if ( !$use_iframe );
396 $lossy_encoding = 'false' if ( !$lossy_encoding );
397 $allow_remote_configtest = 'false' if ( !$allow_remote_configtest );
398 $addrbook_global_table = 'global_abook' if ( !$addrbook_global_table );
399 $addrbook_global_writeable = 'false' if ( !$addrbook_global_writeable );
400 $addrbook_global_listing = 'false' if ( !$addrbook_global_listing );
401 $abook_global_file = '' if ( !$abook_global_file);
402 $abook_global_file_writeable = 'false' if ( !$abook_global_file_writeable);
403 $abook_global_file_listing = 'true' if ( !$abook_global_file_listing );
404 $encode_header_key = '' if ( !$encode_header_key );
405 $hide_auth_header = 'false' if ( !$hide_auth_header );
406 $time_zone_type = '0' if ( !$time_zone_type );
407 $prefs_user_size = 128 if ( !$prefs_user_size );
408 $prefs_key_size = 64 if ( !$prefs_key_size );
409 $prefs_val_size = 65536 if ( !$prefs_val_size );
410
411 # since 1.5.2
412 $icon_theme_def = '' if ( !$icon_theme_def );
413
414 # add qmail-inject test here for backwards compatibility
415 if ( !$sendmail_args && $sendmail_path =~ /qmail-inject/ ) {
416 $sendmail_args = '';
417 } elsif ( !$sendmail_args ) {
418 $sendmail_args = '-i -t';
419 }
420
421 $default_fontsize = '' if ( !$default_fontsize);
422 $default_fontset = '' if ( !$default_fontset);
423 if ( !%fontsets) {
424 %fontsets = ('serif', 'serif',
425 'sans', 'helvetica,arial,sans-serif',
426 'comicsans', 'comic sans ms,sans-serif',
427 'tahoma', 'tahoma,sans-serif',
428 'verasans', 'bitstream vera sans,verdana,sans-serif');
429 }
430
431 # $use_imap_tls and $use_smtp_tls are switched to integer since 1.5.1
432 $use_imap_tls = 0 if ( $use_imap_tls eq 'false');
433 $use_imap_tls = 1 if ( $use_imap_tls eq 'true');
434 $use_smtp_tls = 0 if ( $use_smtp_tls eq 'false');
435 $use_smtp_tls = 1 if ( $use_smtp_tls eq 'true');
436 # sorting options changed names and reversed values in 1.5.1
437 $disable_thread_sort = 'false' if ( !$disable_thread_sort );
438 $disable_server_sort = 'false' if ( !$disable_server_sort );
439
440 # since 1.5.2
441 $abook_file_line_length = 2048 if ( !$abook_file_line_length );
442 $config_location_base = '' if ( !$config_location_base );
443 $smtp_sitewide_user = '' if ( !$smtp_sitewide_user );
444 $smtp_sitewide_pass = '' if ( !$smtp_sitewide_pass );
445
446 if ( $ARGV[0] eq '--install-plugin' ) {
447 print "Activating plugin " . $ARGV[1] . "\n";
448 push @plugins, $ARGV[1];
449 save_data();
450 exit(0);
451 } elsif ( $ARGV[0] eq '--remove-plugin' ) {
452 print "Removing plugin " . $ARGV[1] . "\n";
453 foreach $plugin (@plugins) {
454 if ( $plugin ne $ARGV[1] ) {
455 push @newplugins, $plugin;
456 }
457 }
458 @plugins = @newplugins;
459 save_data();
460 exit(0);
461 }
462
463 #####################################################################################
464 if ( $config_use_color == 1 ) {
465 $WHT = "\x1B[37;1m";
466 $NRM = "\x1B[0m";
467 } else {
468 $WHT = "";
469 $NRM = "";
470 $config_use_color = 2;
471 }
472
473 while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
474 clear_screen();
475 print $WHT. "SquirrelMail Configuration : " . $NRM;
476 if ( $config == 1 ) { print "Read: config.php"; }
477 elsif ( $config == 2 ) { print "Read: config_default.php"; }
478 print " ($print_config_version)\n";
479 print "---------------------------------------------------------\n";
480
481 if ( $menu == 0 ) {
482 print $WHT. "Main Menu --\n" . $NRM;
483 print "1. Organization Preferences\n";
484 print "2. Server Settings\n";
485 print "3. Folder Defaults\n";
486 print "4. General Options\n";
487 print "5. User Interface\n";
488 print "6. Address Books\n";
489 print "7. Message of the Day (MOTD)\n";
490 print "8. Plugins\n";
491 print "9. Database\n";
492 print "10. Language settings\n";
493 print "11. Tweaks\n";
494 print "\n";
495 print "D. Set pre-defined settings for specific IMAP servers\n";
496 print "\n";
497 } elsif ( $menu == 1 ) {
498 print $WHT. "Organization Preferences\n" . $NRM;
499 print "1. Organization Name : $WHT$org_name$NRM\n";
500 print "2. Organization Logo : $WHT$org_logo$NRM\n";
501 print "3. Org. Logo Width/Height : $WHT($org_logo_width/$org_logo_height)$NRM\n";
502 print "4. Organization Title : $WHT$org_title$NRM\n";
503 print "5. Signout Page : $WHT$signout_page$NRM\n";
504 print "6. Top Frame : $WHT$frame_top$NRM\n";
505 print "7. Provider link : $WHT$provider_uri$NRM\n";
506 print "8. Provider name : $WHT$provider_name$NRM\n";
507
508 print "\n";
509 print "R Return to Main Menu\n";
510 } elsif ( $menu == 2 ) {
511 print $WHT. "Server Settings\n\n" . $NRM;
512 print $WHT . "General" . $NRM . "\n";
513 print "-------\n";
514 print "1. Domain : $WHT$domain$NRM\n";
515 print "2. Invert Time : $WHT$invert_time$NRM\n";
516 print "3. Sendmail or SMTP : $WHT";
517 if ( lc($useSendmail) eq 'true' ) {
518 print "Sendmail";
519 } else {
520 print "SMTP";
521 }
522 print "$NRM\n";
523 print "\n";
524
525 if ( $show_imap_settings ) {
526 print $WHT . "IMAP Settings". $NRM . "\n--------------\n";
527 print "4. IMAP Server : $WHT$imapServerAddress$NRM\n";
528 print "5. IMAP Port : $WHT$imapPort$NRM\n";
529 print "6. Authentication type : $WHT$imap_auth_mech$NRM\n";
530 print "7. Secure IMAP (TLS) : $WHT" . display_use_tls($use_imap_tls) . "$NRM\n";
531 print "8. Server software : $WHT$imap_server_type$NRM\n";
532 print "9. Delimiter : $WHT$optional_delimiter$NRM\n";
533 print "\n";
534 } elsif ( $show_smtp_settings ) {
535 if ( lc($useSendmail) eq 'true' ) {
536 print $WHT . "Sendmail" . $NRM . "\n--------\n";
537 print "4. Sendmail Path : $WHT$sendmail_path$NRM\n";
538 print "5. Sendmail arguments : $WHT$sendmail_args$NRM\n";
539 print "6. Header encryption key : $WHT$encode_header_key$NRM\n";
540 print "\n";
541 } else {
542 print $WHT . "SMTP Settings" . $NRM . "\n-------------\n";
543 print "4. SMTP Server : $WHT$smtpServerAddress$NRM\n";
544 print "5. SMTP Port : $WHT$smtpPort$NRM\n";
545 print "6. POP before SMTP : $WHT$pop_before_smtp$NRM\n";
546 print "7. SMTP Authentication : $WHT$smtp_auth_mech" . display_smtp_sitewide_userpass() ."$NRM\n";
547 print "8. Secure SMTP (TLS) : $WHT" . display_use_tls($use_smtp_tls) . "$NRM\n";
548 print "9. Header encryption key : $WHT$encode_header_key$NRM\n";
549 print "\n";
550 }
551 }
552
553 if ($show_imap_settings == 0) {
554 print "A. Update IMAP Settings : ";
555 print "$WHT$imapServerAddress$NRM:";
556 print "$WHT$imapPort$NRM ";
557 print "($WHT$imap_server_type$NRM)\n";
558 }
559 if ($show_smtp_settings == 0) {
560 if ( lc($useSendmail) eq 'true' ) {
561 print "B. Change Sendmail Config : $WHT$sendmail_path$NRM\n";
562 } else {
563 print "B. Update SMTP Settings : ";
564 print "$WHT$smtpServerAddress$NRM:";
565 print "$WHT$smtpPort$NRM\n";
566 }
567 }
568 if ( $show_smtp_settings || $show_imap_settings )
569 {
570 print "H. Hide " .
571 ($show_imap_settings ? "IMAP Server" :
572 (lc($useSendmail) eq 'true') ? "Sendmail" : "SMTP") . " Settings\n";
573 }
574
575 print "\n";
576 print "R Return to Main Menu\n";
577 } elsif ( $menu == 3 ) {
578 print $WHT. "Folder Defaults\n" . $NRM;
579 print "1. Default Folder Prefix : $WHT$default_folder_prefix$NRM\n";
580 print "2. Show Folder Prefix Option : $WHT$show_prefix_option$NRM\n";
581 print "3. Trash Folder : $WHT$trash_folder$NRM\n";
582 print "4. Sent Folder : $WHT$sent_folder$NRM\n";
583 print "5. Drafts Folder : $WHT$draft_folder$NRM\n";
584 print "6. By default, move to trash : $WHT$default_move_to_trash$NRM\n";
585 print "7. By default, move to sent : $WHT$default_move_to_sent$NRM\n";
586 print "8. By default, save as draft : $WHT$default_save_as_draft$NRM\n";
587 print "9. List Special Folders First : $WHT$list_special_folders_first$NRM\n";
588 print "10. Show Special Folders Color : $WHT$use_special_folder_color$NRM\n";
589 print "11. Auto Expunge : $WHT$auto_expunge$NRM\n";
590 print "12. Default Sub. of INBOX : $WHT$default_sub_of_inbox$NRM\n";
591 print "13. Show 'Contain Sub.' Option : $WHT$show_contain_subfolders_option$NRM\n";
592 print "14. Default Unseen Notify : $WHT$default_unseen_notify$NRM\n";
593 print "15. Default Unseen Type : $WHT$default_unseen_type$NRM\n";
594 print "16. Auto Create Special Folders : $WHT$auto_create_special$NRM\n";
595 print "17. Folder Delete Bypasses Trash : $WHT$delete_folder$NRM\n";
596 print "18. Enable /NoSelect folder fix : $WHT$noselect_fix_enable$NRM\n";
597 print "\n";
598 print "R Return to Main Menu\n";
599 } elsif ( $menu == 4 ) {
600 print $WHT. "General Options\n" . $NRM;
601 print "1. Data Directory : $WHT$data_dir$NRM\n";
602 print "2. Attachment Directory : $WHT$attachment_dir$NRM\n";
603 print "3. Directory Hash Level : $WHT$dir_hash_level$NRM\n";
604 print "4. Default Left Size : $WHT$default_left_size$NRM\n";
605 print "5. Usernames in Lowercase : $WHT$force_username_lowercase$NRM\n";
606 print "6. Allow use of priority : $WHT$default_use_priority$NRM\n";
607 print "7. Hide SM attributions : $WHT$hide_sm_attributions$NRM\n";
608 print "8. Allow use of receipts : $WHT$default_use_mdn$NRM\n";
609 print "9. Allow editing of identity : $WHT$edit_identity$NRM\n";
610 print " Allow editing of name : $WHT$edit_name$NRM\n";
611 print " Remove username from header : $WHT$hide_auth_header$NRM\n";
612 print "10. Disable server thread sort : $WHT$disable_thread_sort$NRM\n";
613 print "11. Disable server-side sorting : $WHT$disable_server_sort$NRM\n";
614 print "12. Allow server charset search : $WHT$allow_charset_search$NRM\n";
615 print "13. Allow advanced search : $WHT$allow_advanced_search$NRM\n";
616 print "14. PHP session name : $WHT$session_name$NRM\n";
617 print "15. Time zone configuration : $WHT$time_zone_type$NRM\n";
618 print "16. Location base : $WHT$config_location_base$NRM\n";
619 print "\n";
620 print "R Return to Main Menu\n";
621 } elsif ( $menu == 5 ) {
622 print $WHT. "User Interface\n" . $NRM;
623 print "1. Modify Template sets\n";
624 print "2. Use Icons : $WHT$use_icons$NRM\n";
625 print "3. Default Icon Set : $WHT$icon_theme_def$NRM\n";
626 print "4. Default font size : $WHT$default_fontsize$NRM\n";
627 print "5. Modify available font sets\n";
628 print "6. Modify available user themes\n";
629
630 print "\n";
631 print "R Return to Main Menu\n";
632 } elsif ( $menu == 6 ) {
633 print $WHT. "Address Books\n" . $NRM;
634 print "1. Change LDAP Servers\n";
635 for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
636 print " > $ldap_host[$count]\n";
637 }
638 print "2. Use Javascript address book search : $WHT$default_use_javascript_addr_book$NRM\n";
639 print "3. Global address book file : $WHT$abook_global_file$NRM\n";
640 print "4. Allow writing into global file address book : $WHT$abook_global_file_writeable$NRM\n";
641 print "5. Allow listing of global file address book : $WHT$abook_global_file_listing$NRM\n";
642 print "6. Allowed address book line length : $WHT$abook_file_line_length$NRM\n";
643 print "\n";
644 print "R Return to Main Menu\n";
645 } elsif ( $menu == 7 ) {
646 print $WHT. "Message of the Day (MOTD)\n" . $NRM;
647 print "\n$motd\n";
648 print "\n";
649 print "1 Edit the MOTD\n";
650 print "\n";
651 print "R Return to Main Menu\n";
652 } elsif ( $menu == 8 ) {
653 print $WHT. "Plugins\n" . $NRM;
654 print " Installed Plugins\n";
655 $num = 0;
656 for ( $count = 0 ; $count <= $#plugins ; $count++ ) {
657 $num = $count + 1;
658 print " $num. $plugins[$count]\n";
659 }
660 print "\n Available Plugins:\n";
661 opendir( DIR, "../plugins" );
662 @files = readdir(DIR);
663 $pos = 0;
664 @unused_plugins = ();
665 for ( $i = 0 ; $i <= $#files ; $i++ ) {
666 if ( -d "../plugins/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
667 $match = 0;
668 for ( $k = 0 ; $k <= $#plugins ; $k++ ) {
669 if ( $plugins[$k] eq $files[$i] ) {
670 $match = 1;
671 }
672 }
673 if ( $match == 0 ) {
674 $unused_plugins[$pos] = $files[$i];
675 $pos++;
676 }
677 }
678 }
679
680 for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
681 $num = $num + 1;
682 print " $num. $unused_plugins[$i]\n";
683 }
684 closedir DIR;
685
686 print "\n";
687 print "R Return to Main Menu\n";
688 } elsif ( $menu == 9 ) {
689 print $WHT. "Database\n" . $NRM;
690 print "1. DSN for Address Book : $WHT$addrbook_dsn$NRM\n";
691 print "2. Table for Address Book : $WHT$addrbook_table$NRM\n";
692 print "\n";
693 print "3. DSN for Preferences : $WHT$prefs_dsn$NRM\n";
694 print "4. Table for Preferences : $WHT$prefs_table$NRM\n";
695 print "5. Field for username : $WHT$prefs_user_field$NRM ($prefs_user_size)\n";
696 print "6. Field for prefs key : $WHT$prefs_key_field$NRM ($prefs_key_size)\n";
697 print "7. Field for prefs value : $WHT$prefs_val_field$NRM ($prefs_val_size)\n";
698 print "\n";
699 print "8. DSN for Global Address Book : $WHT$addrbook_global_dsn$NRM\n";
700 print "9. Table for Global Address Book : $WHT$addrbook_global_table$NRM\n";
701 print "10. Allow writing into Global Address Book : $WHT$addrbook_global_writeable$NRM\n";
702 print "11. Allow listing of Global Address Book : $WHT$addrbook_global_listing$NRM\n";
703 print "\n";
704 print "R Return to Main Menu\n";
705 } elsif ( $menu == 10 ) {
706 print $WHT. "Language settings\n" . $NRM;
707 print "1. Default Language : $WHT$squirrelmail_default_language$NRM\n";
708 print "2. Default Charset : $WHT$default_charset$NRM\n";
709 print "3. Show alternative language names : $WHT$show_alternative_names$NRM\n";
710 print "4. Enable aggressive decoding : $WHT$aggressive_decoding$NRM\n";
711 print "5. Enable lossy encoding : $WHT$lossy_encoding$NRM\n";
712 print "\n";
713 print "R Return to Main Menu\n";
714 } elsif ( $menu == 11 ) {
715 print $WHT. "Interface tweaks\n" . $NRM;
716 print "1. Display html mails in iframe : $WHT$use_iframe$NRM\n";
717 print "\n";
718 print $WHT. "PHP tweaks\n" . $NRM;
719 print "4. Use php recode functions : $WHT$use_php_recode$NRM\n";
720 print "5. Use php iconv functions : $WHT$use_php_iconv$NRM\n";
721 print "\n";
722 print $WHT. "Configuration tweaks\n" . $NRM;
723 print "6. Allow remote configtest : $WHT$allow_remote_configtest$NRM\n";
724 print "\n";
725 print "R Return to Main Menu\n";
726 }
727 if ( $config_use_color == 1 ) {
728 print "C Turn color off\n";
729 } else {
730 print "C Turn color on\n";
731 }
732 print "S Save data\n";
733 print "Q Quit\n";
734
735 print "\n";
736 print "Command >> " . $WHT;
737 $command = <STDIN>;
738 $command =~ s/[\n\r]//g;
739 $command =~ tr/A-Z/a-z/;
740 print "$NRM\n";
741
742 # Read the commands they entered.
743 if ( $command eq "r" ) {
744 $menu = 0;
745 } elsif ( $command eq "s" ) {
746 save_data();
747 print "Press enter to continue...";
748 $tmp = <STDIN>;
749 $saved = 1;
750 } elsif ( ( $command eq "q" ) && ( $saved == 0 ) ) {
751 print "You have not saved your data.\n";
752 print "Save? [" . $WHT . "Y" . $NRM . "/n]: ";
753 $save = <STDIN>;
754 if ( ( $save =~ /^y/i ) || ( $save =~ /^\s*$/ ) ) {
755 save_data();
756 }
757 } elsif ( $command eq "c" ) {
758 if ( $config_use_color == 1 ) {
759 $config_use_color = 2;
760 $WHT = "";
761 $NRM = "";
762 } else {
763 $config_use_color = 1;
764 $WHT = "\x1B[37;1m";
765 $NRM = "\x1B[0m";
766 }
767 } elsif ( $command eq "d" && $menu == 0 ) {
768 set_defaults();
769 } else {
770 $saved = 0;
771 if ( $menu == 0 ) {
772 if ( ( $command > 0 ) && ( $command < 12 ) ) {
773 $menu = $command;
774 }
775 } elsif ( $menu == 1 ) {
776 if ( $command == 1 ) { $org_name = command1(); }
777 elsif ( $command == 2 ) { $org_logo = command2(); }
778 elsif ( $command == 3 ) { ($org_logo_width,$org_logo_height) = command2a(); }
779 elsif ( $command == 4 ) { $org_title = command3(); }
780 elsif ( $command == 5 ) { $signout_page = command4(); }
781 elsif ( $command == 6 ) { $frame_top = command6(); }
782 elsif ( $command == 7 ) { $provider_uri = command7(); }
783 elsif ( $command == 8 ) { $provider_name = command8(); }
784
785 } elsif ( $menu == 2 ) {
786 if ( $command eq "a" ) { $show_imap_settings = 1; $show_smtp_settings = 0; }
787 elsif ( $command eq "b" ) { $show_imap_settings = 0; $show_smtp_settings = 1; }
788 elsif ( $command eq "h" ) { $show_imap_settings = 0; $show_smtp_settings = 0; }
789 elsif ( $command <= 3 ) {
790 if ( $command == 1 ) { $domain = command11(); }
791 elsif ( $command == 2 ) { $invert_time = command110(); }
792 elsif ( $command == 3 ) { $useSendmail = command14(); }
793 $show_imap_settings = 0; $show_smtp_settings = 0;
794 } elsif ( $show_imap_settings ) {
795 if ( $command == 4 ) { $imapServerAddress = command12(); }
796 elsif ( $command == 5 ) { $imapPort = command13(); }
797 elsif ( $command == 6 ) { $imap_auth_mech = command112a(); }
798 elsif ( $command == 7 ) { $use_imap_tls = command_use_tls("IMAP",$use_imap_tls); }
799 elsif ( $command == 8 ) { $imap_server_type = command19(); }
800 elsif ( $command == 9 ) { $optional_delimiter = command111(); }
801 } elsif ( $show_smtp_settings && lc($useSendmail) eq 'true' ) {
802 if ( $command == 4 ) { $sendmail_path = command15(); }
803 elsif ( $command == 5 ) { $sendmail_args = command_sendmail_args(); }
804 elsif ( $command == 6 ) { $encode_header_key = command114(); }
805 } elsif ( $show_smtp_settings ) {
806 if ( $command == 4 ) { $smtpServerAddress = command16(); }
807 elsif ( $command == 5 ) { $smtpPort = command17(); }
808 elsif ( $command == 6 ) { $pop_before_smtp = command18a(); }
809 elsif ( $command == 7 ) { $smtp_auth_mech = command112b(); }
810 elsif ( $command == 8 ) { $use_smtp_tls = command_use_tls("SMTP",$use_smtp_tls); }
811 elsif ( $command == 9 ) { $encode_header_key = command114(); }
812 }
813 } elsif ( $menu == 3 ) {
814 if ( $command == 1 ) { $default_folder_prefix = command21(); }
815 elsif ( $command == 2 ) { $show_prefix_option = command22(); }
816 elsif ( $command == 3 ) { $trash_folder = command23a(); }
817 elsif ( $command == 4 ) { $sent_folder = command23b(); }
818 elsif ( $command == 5 ) { $draft_folder = command23c(); }
819 elsif ( $command == 6 ) { $default_move_to_trash = command24a(); }
820 elsif ( $command == 7 ) { $default_move_to_sent = command24b(); }
821 elsif ( $command == 8 ) { $default_save_as_draft = command24c(); }
822 elsif ( $command == 9 ) { $list_special_folders_first = command27(); }
823 elsif ( $command == 10 ) { $use_special_folder_color = command28(); }
824 elsif ( $command == 11 ) { $auto_expunge = command29(); }
825 elsif ( $command == 12 ) { $default_sub_of_inbox = command210(); }
826 elsif ( $command == 13 ) { $show_contain_subfolders_option = command211(); }
827 elsif ( $command == 14 ) { $default_unseen_notify = command212(); }
828 elsif ( $command == 15 ) { $default_unseen_type = command213(); }
829 elsif ( $command == 16 ) { $auto_create_special = command214(); }
830 elsif ( $command == 17 ) { $delete_folder = command215(); }
831 elsif ( $command == 18 ) { $noselect_fix_enable = command216(); }
832 } elsif ( $menu == 4 ) {
833 if ( $command == 1 ) { $data_dir = command33a(); }
834 elsif ( $command == 2 ) { $attachment_dir = command33b(); }
835 elsif ( $command == 3 ) { $dir_hash_level = command33c(); }
836 elsif ( $command == 4 ) { $default_left_size = command35(); }
837 elsif ( $command == 5 ) { $force_username_lowercase = command36(); }
838 elsif ( $command == 6 ) { $default_use_priority = command37(); }
839 elsif ( $command == 7 ) { $hide_sm_attributions = command38(); }
840 elsif ( $command == 8 ) { $default_use_mdn = command39(); }
841 elsif ( $command == 9 ) { $edit_identity = command310(); }
842 elsif ( $command == 10 ) { $disable_thread_sort = command312(); }
843 elsif ( $command == 11 ) { $disable_server_sort = command313(); }
844 elsif ( $command == 12 ) { $allow_charset_search = command314(); }
845 elsif ( $command == 13 ) { $allow_advanced_search = command316(); }
846 elsif ( $command == 14 ) { $session_name = command317(); }
847 elsif ( $command == 15 ) { $time_zone_type = command318(); }
848 elsif ( $command == 16 ) { $config_location_base = command_config_location_base(); }
849 } elsif ( $menu == 5 ) {
850 if ( $command == 1 ) { $templateset_default = command_templates(); }
851 elsif ( $command == 2 ) { $use_icons = commandB3(); }
852 elsif ( $command == 3 ) { $icon_theme_def = commandB7(); }
853 elsif ( $command == 4 ) { $default_fontsize = command_default_fontsize(); }
854 elsif ( $command == 5 ) { command_fontsets(); }
855 elsif ( $command == 6 ) { command41(); }
856 } elsif ( $menu == 6 ) {
857 if ( $command == 1 ) { command61(); }
858 elsif ( $command == 2 ) { command62(); }
859 elsif ( $command == 3 ) { $abook_global_file=command63(); }
860 elsif ( $command == 4 ) { command64(); }
861 elsif ( $command == 5 ) { command65(); }
862 elsif ( $command == 6 ) { command_abook_file_line_length(); }
863 } elsif ( $menu == 7 ) {
864 if ( $command == 1 ) { $motd = command71(); }
865 } elsif ( $menu == 8 ) {
866 if ( $command =~ /^[0-9]+/ ) { @plugins = command81(); }
867 } elsif ( $menu == 9 ) {
868 if ( $command == 1 ) { $addrbook_dsn = command91(); }
869 elsif ( $command == 2 ) { $addrbook_table = command92(); }
870 elsif ( $command == 3 ) { $prefs_dsn = command93(); }
871 elsif ( $command == 4 ) { $prefs_table = command94(); }
872 elsif ( $command == 5 ) { $prefs_user_field = command95(); }
873 elsif ( $command == 6 ) { $prefs_key_field = command96(); }
874 elsif ( $command == 7 ) { $prefs_val_field = command97(); }
875 elsif ( $command == 8 ) { $addrbook_global_dsn = command98(); }
876 elsif ( $command == 9 ) { $addrbook_global_table = command99(); }
877 elsif ( $command == 10 ) { $addrbook_global_writeable = command910(); }
878 elsif ( $command == 11 ) { $addrbook_global_listing = command911(); }
879 } elsif ( $menu == 10 ) {
880 if ( $command == 1 ) { $squirrelmail_default_language = commandA1(); }
881 elsif ( $command == 2 ) { $default_charset = commandA2(); }
882 elsif ( $command == 3 ) { $show_alternative_names = commandA3(); }
883 elsif ( $command == 4 ) { $aggressive_decoding = commandA4(); }
884 elsif ( $command == 5 ) { $lossy_encoding = commandA5(); }
885 } elsif ( $menu == 11 ) {
886 if ( $command == 1 ) { $use_iframe = commandB2(); }
887 elsif ( $command == 4 ) { $use_php_recode = commandB4(); }
888 elsif ( $command == 5 ) { $use_php_iconv = commandB5(); }
889 elsif ( $command == 6 ) { $allow_remote_configtest = commandB6(); }
890 }
891 }
892 }
893
894 # we exit here
895 print "\nExiting conf.pl.\n".
896 "You might want to test your configuration by browsing to\n".
897 "http://your-squirrelmail-location/src/configtest.php\n".
898 "Happy SquirrelMailing!\n\n";
899
900
901 ####################################################################################
902
903 # org_name
904 sub command1 {
905 print "We have tried to make the name SquirrelMail as transparent as\n";
906 print "possible. If you set up an organization name, most places where\n";
907 print "SquirrelMail would take credit will be credited to your organization.\n";
908 print "\n";
909 print "If your Organization Name includes a '\$', please precede it with a \\. \n";
910 print "Other '\$' will be considered the beginning of a variable that\n";
911 print "must be defined before the \$org_name is printed.\n";
912 print "\n";
913 print "[$WHT$org_name$NRM]: $WHT";
914 $new_org_name = <STDIN>;
915 if ( $new_org_name eq "\n" ) {
916 $new_org_name = $org_name;
917 } else {
918 $new_org_name =~ s/[\r\n]//g;
919 $new_org_name =~ s/\"/&quot;/g;
920 }
921 return $new_org_name;
922 }
923
924 # org_logo
925 sub command2 {
926 print "Your organization's logo is an image that will be displayed at\n";
927 print "different times throughout SquirrelMail. ";
928 print "\n";
929 print "Please be aware of the following: \n";
930 print " - Relative URLs are relative to the config dir\n";
931 print " to use the default logo, use ../images/sm_logo.png\n";
932 print " - To specify a logo defined outside the SquirrelMail source tree\n";
933 print " use the absolute URL the webserver would use to include the file\n";
934 print " e.g. http://www.example.com/images/mylogo.gif or /images/mylogo.jpg\n";
935 print "\n";
936 print "[$WHT$org_logo$NRM]: $WHT";
937 $new_org_logo = <STDIN>;
938 if ( $new_org_logo eq "\n" ) {
939 $new_org_logo = $org_logo;
940 } else {
941 $new_org_logo =~ s/[\r\n]//g;
942 }
943 return $new_org_logo;
944 }
945
946 # org_logo_width
947 sub command2a {
948 print "Your organization's logo is an image that will be displayed at\n";
949 print "different times throughout SquirrelMail. Width\n";
950 print "and Height of your logo image. Use '0' to disable.\n";
951 print "\n";
952 print "Width: [$WHT$org_logo_width$NRM]: $WHT";
953 $new_org_logo_width = <STDIN>;
954 $new_org_logo_width =~ tr/0-9//cd; # only want digits!
955 if ( $new_org_logo_width eq '' ) {
956 $new_org_logo_width = $org_logo_width;
957 }
958 if ( $new_org_logo_width > 0 ) {
959 print "Height: [$WHT$org_logo_height$NRM]: $WHT";
960 $new_org_logo_height = <STDIN>;
961 $new_org_logo_height =~ tr/0-9//cd; # only want digits!
962 if( $new_org_logo_height eq '' ) {
963 $new_org_logo_height = $org_logo_height;
964 }
965 } else {
966 $new_org_logo_height = 0;
967 }
968 return ($new_org_logo_width, $new_org_logo_height);
969 }
970
971 # org_title
972 sub command3 {
973 print "A title is what is displayed at the top of the browser window in\n";
974 print "the titlebar. Usually this will end up looking something like:\n";
975 print "\"Netscape: $org_title\"\n";
976 print "\n";
977 print "If your Organization Title includes a '\$', please precede it with a \\. \n";
978 print "Other '\$' will be considered the beginning of a variable that\n";
979 print "must be defined before the \$org_title is printed.\n";
980 print "\n";
981 print "[$WHT$org_title$NRM]: $WHT";
982 $new_org_title = <STDIN>;
983 if ( $new_org_title eq "\n" ) {
984 $new_org_title = $org_title;
985 } else {
986 $new_org_title =~ s/[\r\n]//g;
987 $new_org_title =~ s/\"/\'/g;
988 }
989 return $new_org_title;
990 }
991
992 # signout_page
993 sub command4 {
994 print "When users click the Sign Out button they will be logged out and\n";
995 print "then sent to signout_page. If signout_page is left empty,\n";
996 print "(hit space and then return) they will be taken, as normal,\n";
997 print "to the default and rather sparse SquirrelMail signout page.\n";
998 print "\n";
999 print "[$WHT$signout_page$NRM]: $WHT";
1000 $new_signout_page = <STDIN>;
1001 if ( $new_signout_page eq "\n" ) {
1002 $new_signout_page = $signout_page;
1003 } else {
1004 $new_signout_page =~ s/[\r\n]//g;
1005 $new_signout_page =~ s/^\s+$//g;
1006 }
1007 return $new_signout_page;
1008 }
1009
1010 # Default top frame
1011 sub command6 {
1012 print "SquirrelMail defaults to using the whole of the browser window.\n";
1013 print "This allows you to keep it within a specified frame. The default\n";
1014 print "is '_top'\n";
1015 print "\n";
1016 print "[$WHT$frame_top$NRM]: $WHT";
1017 $new_frame_top = <STDIN>;
1018 if ( $new_frame_top eq "\n" ) {
1019 $new_frame_top = '_top';
1020 } else {
1021 $new_frame_top =~ s/[\r\n]//g;
1022 $new_frame_top =~ s/^\s+$//g;
1023 }
1024 return $new_frame_top;
1025 }
1026
1027 # Default link to provider
1028 sub command7 {
1029 print "Here you can set the link on the right of the page.\n";
1030 print "If empty, it will link to the SquirrelMail About page.\n";
1031 print "\n";
1032 print "[$WHT$provider_uri$NRM]: $WHT";
1033 $new_provider_uri = <STDIN>;
1034 if ( $new_provider_uri eq "\n" ) {
1035 $new_provider_uri = '';
1036 } else {
1037 $new_provider_uri =~ s/[\r\n]//g;
1038 $new_provider_uri =~ s/^\s+$//g;
1039 }
1040 return $new_provider_uri;
1041 }
1042
1043 sub command8 {
1044 print "Here you can set the name of the link on the right of the page.\n";
1045 print "The default is 'SquirrelMail'\n";
1046 print "\n";
1047 print "[$WHT$provider_name$NRM]: $WHT";
1048 $new_provider_name = <STDIN>;
1049 if ( $new_provider_name eq "\n" ) {
1050 $new_provider_name = 'SquirrelMail';
1051 } else {
1052 $new_provider_name =~ s/[\r\n]//g;
1053 $new_provider_name =~ s/^\s+$//g;
1054 $new_provider_name =~ s/\'/\\'/g;
1055 }
1056 return $new_provider_name;
1057 }
1058
1059 ####################################################################################
1060
1061 # domain
1062 sub command11 {
1063 print "The domain name is the suffix at the end of all email addresses. If\n";
1064 print "for example, your email address is jdoe\@example.com, then your domain\n";
1065 print "would be example.com.\n";
1066 print "\n";
1067 print "[$WHT$domain$NRM]: $WHT";
1068 $new_domain = <STDIN>;
1069 if ( $new_domain eq "\n" ) {
1070 $new_domain = $domain;
1071 } else {
1072 $new_domain =~ s/[\r\n]//g;
1073 }
1074 return $new_domain;
1075 }
1076
1077 # imapServerAddress
1078 sub command12 {
1079 print "This is the hostname where your IMAP server can be contacted.\n";
1080 print "[$WHT$imapServerAddress$NRM]: $WHT";
1081 $new_imapServerAddress = <STDIN>;
1082 if ( $new_imapServerAddress eq "\n" ) {
1083 $new_imapServerAddress = $imapServerAddress;
1084 } else {
1085 $new_imapServerAddress =~ s/[\r\n]//g;
1086 }
1087 return $new_imapServerAddress;
1088 }
1089
1090 # imapPort
1091 sub command13 {
1092 print "This is the port that your IMAP server is on. Usually this is 143.\n";
1093 print "[$WHT$imapPort$NRM]: $WHT";
1094 $new_imapPort = <STDIN>;
1095 if ( $new_imapPort eq "\n" ) {
1096 $new_imapPort = $imapPort;
1097 } else {
1098 $new_imapPort =~ s/[\r\n]//g;
1099 }
1100 return $new_imapPort;
1101 }
1102
1103 # useSendmail
1104 sub command14 {
1105 print "You now need to choose the method that you will use for sending\n";
1106 print "messages in SquirrelMail. You can either connect to an SMTP server\n";
1107 print "or use sendmail directly.\n";
1108 if ( lc($useSendmail) eq 'true' ) {
1109 $default_value = "1";
1110 } else {
1111 $default_value = "2";
1112 }
1113 print "\n";
1114 print " 1. Sendmail\n";
1115 print " 2. SMTP\n";
1116 print "Your choice [1/2] [$WHT$default_value$NRM]: $WHT";
1117 $use_sendmail = <STDIN>;
1118 if ( ( $use_sendmail =~ /^1\n/i )
1119 || ( ( $use_sendmail =~ /^\n/ ) && ( $default_value eq "1" ) ) ) {
1120 $useSendmail = 'true';
1121 } else {
1122 $useSendmail = 'false';
1123 }
1124 return $useSendmail;
1125 }
1126
1127 # sendmail_path
1128 sub command15 {
1129 print "Specify where the sendmail executable is located. Usually /usr/sbin/sendmail\n";
1130 print "[$WHT$sendmail_path$NRM]: $WHT";
1131 $new_sendmail_path = <STDIN>;
1132 if ( $new_sendmail_path eq "\n" ) {
1133 $new_sendmail_path = $sendmail_path;
1134 } else {
1135 $new_sendmail_path =~ s/[\r\n]//g;
1136 }
1137 return $new_sendmail_path;
1138 }
1139
1140 # Extra sendmail arguments
1141 sub command_sendmail_args {
1142 print "Specify additional sendmail program arguments.\n";
1143 print "\n";
1144 print "Make sure that arguments are supported by your sendmail program. -f argument \n";
1145 print "is added automatically by SquirrelMail scripts. Variable defaults to standard\n";
1146 print "/usr/sbin/sendmail arguments. If you use qmail-inject, nbsmtp or any other \n";
1147 print "sendmail wrapper, which does not support -i and -t arguments, set variable to\n";
1148 print "empty string or use arguments suitable for your mailer.\n";
1149 print "\n";
1150 print "[$WHT$sendmail_args$NRM]: $WHT";
1151 $new_sendmail_args = <STDIN>;
1152 if ( $new_sendmail_args eq "\n" ) {
1153 $new_sendmail_args = $sendmail_args;
1154 } else {
1155 # strip linefeeds and crs.
1156 $new_sendmail_args =~ s/[\r\n]//g;
1157 }
1158 return trim($new_sendmail_args);
1159 }
1160
1161 # smtpServerAddress
1162 sub command16 {
1163 print "This is the hostname of your SMTP server.\n";
1164 print "[$WHT$smtpServerAddress$NRM]: $WHT";
1165 $new_smtpServerAddress = <STDIN>;
1166 if ( $new_smtpServerAddress eq "\n" ) {
1167 $new_smtpServerAddress = $smtpServerAddress;
1168 } else {
1169 $new_smtpServerAddress =~ s/[\r\n]//g;
1170 }
1171 return $new_smtpServerAddress;
1172 }
1173
1174 # smtpPort
1175 sub command17 {
1176 print "This is the port to connect to for SMTP. Usually 25.\n";
1177 print "[$WHT$smtpPort$NRM]: $WHT";
1178 $new_smtpPort = <STDIN>;
1179 if ( $new_smtpPort eq "\n" ) {
1180 $new_smtpPort = $smtpPort;
1181 } else {
1182 $new_smtpPort =~ s/[\r\n]//g;
1183 }
1184 return $new_smtpPort;
1185 }
1186
1187 # pop before SMTP
1188 sub command18a {
1189 print "Do you wish to use POP3 before SMTP? Your server must\n";
1190 print "support this in order for SquirrelMail to work with it.\n";
1191
1192 $YesNo = 'n';
1193 $YesNo = 'y' if ( lc($pop_before_smtp) eq 'true' );
1194
1195 print "Use pop before SMTP (y/n) [$WHT$YesNo$NRM]: $WHT";
1196
1197 $new_pop_before_smtp = <STDIN>;
1198 $new_pop_before_smtp =~ tr/yn//cd;
1199 return 'true' if ( $new_pop_before_smtp eq "y" );
1200 return 'false' if ( $new_pop_before_smtp eq "n" );
1201 return $pop_before_smtp;
1202 }
1203
1204 # imap_server_type
1205 sub command19 {
1206 print "Each IMAP server has its own quirks. As much as we tried to stick\n";
1207 print "to standards, it doesn't help much if the IMAP server doesn't follow\n";
1208 print "the same principles. We have made some work-arounds for some of\n";
1209 print "these servers. If you would like to use them, please select your\n";
1210 print "IMAP server. If you do not wish to use these work-arounds, you can\n";
1211 print "set this to \"other\", and none will be used.\n";
1212 print " courier = Courier IMAP server\n";
1213 print " cyrus = Cyrus IMAP server\n";
1214 print " dovecot = Dovecot Secure IMAP server\n";
1215 print " exchange = Microsoft Exchange IMAP server\n";
1216 print " hmailserver = hMailServer\n";
1217 print " macosx = Mac OS X Mailserver\n";
1218 print " mercury32 = Mercury Mail Transport System\n";
1219 print " uw = University of Washington's IMAP server\n";
1220 print "\n";
1221 print " other = Not one of the above servers\n";
1222 print "\n";
1223 print "[$WHT$imap_server_type$NRM]: $WHT";
1224 $new_imap_server_type = <STDIN>;
1225
1226 if ( $new_imap_server_type eq "\n" ) {
1227 $new_imap_server_type = $imap_server_type;
1228 } else {
1229 $new_imap_server_type =~ s/[\r\n]//g;
1230 }
1231 return $new_imap_server_type;
1232 }
1233
1234 # invert_time
1235 sub command110 {
1236 print "Sometimes the date of messages sent is messed up (off by a few hours\n";
1237 print "on some machines). Typically this happens if the system doesn't support\n";
1238 print "tm_gmtoff. It will happen only if your time zone is \"negative\".\n";
1239 print "This most often occurs on Solaris 7 machines in the United States.\n";
1240 print "By default, this is off. It should be kept off unless problems surface\n";
1241 print "about the time that messages are sent.\n";
1242 print " no = Do NOT fix time -- almost always correct\n";
1243 print " yes = Fix the time for this system\n";
1244
1245 $YesNo = 'n';
1246 $YesNo = 'y' if ( lc($invert_time) eq 'true' );
1247
1248 print "Fix the time for this system (y/n) [$WHT$YesNo$NRM]: $WHT";
1249
1250 $new_invert_time = <STDIN>;
1251 $new_invert_time =~ tr/yn//cd;
1252 return 'true' if ( $new_invert_time eq "y" );
1253 return 'false' if ( $new_invert_time eq "n" );
1254 return $invert_time;
1255 }
1256
1257 sub command111 {
1258 print "This is the delimiter that your IMAP server uses to distinguish between\n";
1259 print "folders. For example, Cyrus uses '.' as the delimiter and a complete\n";
1260 print "folder would look like 'INBOX.Friends.Bob', while UW uses '/' and would\n";
1261 print "look like 'INBOX/Friends/Bob'. Normally this should be left at 'detect'\n";
1262 print "but if you are sure you know what delimiter your server uses, you can\n";
1263 print "specify it here.\n";
1264 print "\nTo have it autodetect the delimiter, set it to 'detect'.\n\n";
1265 print "[$WHT$optional_delimiter$NRM]: $WHT";
1266 $new_optional_delimiter = <STDIN>;
1267
1268 if ( $new_optional_delimiter eq "\n" ) {
1269 $new_optional_delimiter = $optional_delimiter;
1270 } else {
1271 $new_optional_delimiter =~ s/[\r\n]//g;
1272 }
1273 return $new_optional_delimiter;
1274 }
1275 # IMAP authentication type
1276 # Possible values: login, plain, cram-md5, digest-md5
1277 # Now offers to detect supported mechs, assuming server & port are set correctly
1278
1279 sub command112a {
1280 if ($use_imap_tls ne "0") {
1281 # 1. Script does not handle TLS.
1282 # 2. Server does not have to declare all supported authentication mechs when
1283 # STARTTLS is used. Supported mechs are declared only after STARTTLS.
1284 print "Auto-detection of login methods is unavailable when using TLS or STARTTLS.\n";
1285 } else {
1286 print "If you have already set the hostname and port number, I can try to\n";
1287 print "detect the mechanisms your IMAP server supports.\n";
1288 print "I will try to detect CRAM-MD5 and DIGEST-MD5 support. I can't test\n";
1289 print "for \"login\" or \"plain\" without knowing a username and password.\n";
1290 print "Auto-detecting is optional - you can safely say \"n\" here.\n";
1291 print "\nTry to detect supported mechanisms? [y/N]: ";
1292 $inval=<STDIN>;
1293 chomp($inval);
1294 if ($inval =~ /^y\b/i) {
1295 # Yes, let's try to detect.
1296 print "Trying to detect IMAP capabilities...\n";
1297 my $host = $imapServerAddress . ':'. $imapPort;
1298 print "CRAM-MD5:\t";
1299 my $tmp = detect_auth_support('IMAP',$host,'CRAM-MD5');
1300 if (defined($tmp)) {
1301 if ($tmp eq 'YES') {
1302 print "$WHT SUPPORTED$NRM\n";
1303 } else {
1304 print "$WHT NOT SUPPORTED$NRM\n";
1305 }
1306 } else {
1307 print $WHT . " ERROR DETECTING$NRM\n";
1308 }
1309
1310 print "DIGEST-MD5:\t";
1311 $tmp = detect_auth_support('IMAP',$host,'DIGEST-MD5');
1312 if (defined($tmp)) {
1313 if ($tmp eq 'YES') {
1314 print "$WHT SUPPORTED$NRM\n";
1315 } else {
1316 print "$WHT NOT SUPPORTED$NRM\n";
1317 }
1318 } else {
1319 print $WHT . " ERROR DETECTING$NRM\n";
1320 }
1321
1322 }
1323 }
1324 print "\nWhat authentication mechanism do you want to use for IMAP connections?\n\n";
1325 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1326 print $WHT . "plain" . $NRM . " - SASL PLAIN. If you need this, you already know it.\n";
1327 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext methods.\n";
1328 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1329 print "\n*** YOUR IMAP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n";
1330 print "If you don't understand or are unsure, you probably want \"login\"\n\n";
1331 print "login, plain, cram-md5, or digest-md5 [$WHT$imap_auth_mech$NRM]: $WHT";
1332 $inval=<STDIN>;
1333 chomp($inval);
1334 if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || ($inval =~ /^login\b/i) || ($inval =~ /^plain\b/i)) {
1335 return lc($inval);
1336 } else {
1337 # user entered garbage or default value so nothing needs to be set
1338 return $imap_auth_mech;
1339 }
1340 }
1341
1342
1343 # SMTP authentication type
1344 # Possible choices: none, plain, cram-md5, digest-md5
1345 sub command112b {
1346 if ($use_smtp_tls ne "0") {
1347 print "Auto-detection of login methods is unavailable when using TLS or STARTTLS.\n";
1348 } elsif (eval ("use IO::Socket; 1")) {
1349 # try loading IO::Socket module
1350 print "If you have already set the hostname and port number, I can try to\n";
1351 print "automatically detect some of the mechanisms your SMTP server supports.\n";
1352 print "Auto-detection is *optional* - you can safely say \"n\" here.\n";
1353 print "\nTry to detect auth mechanisms? [y/N]: ";
1354 $inval=<STDIN>;
1355 chomp($inval);
1356 if ($inval =~ /^y\b/i) {
1357 # Yes, let's try to detect.
1358 print "Trying to detect supported methods (SMTP)...\n";
1359
1360 # Special case!
1361 # Check none by trying to relay to junk@microsoft.com
1362 $host = $smtpServerAddress . ':' . $smtpPort;
1363 my $sock = IO::Socket::INET->new($host);
1364 print "Testing none:\t\t$WHT";
1365 if (!defined($sock)) {
1366 print " ERROR TESTING\n";
1367 close $sock;
1368 } else {
1369 print $sock "HELO $domain\r\n";
1370 $got = <$sock>; # Discard
1371 print $sock "MAIL FROM:<tester\@squirrelmail.org>\r\n";
1372 $got = <$sock>; # Discard
1373 print $sock "RCPT TO:<junk\@microsoft.com\r\n";
1374 $got = <$sock>; # This is the important line
1375 if ($got =~ /^250\b/) { # SMTP will relay without auth
1376 print "SUPPORTED$NRM\n";
1377 } else {
1378 print "NOT SUPPORTED$NRM\n";
1379 }
1380 print $sock "RSET\r\n";
1381 print $sock "QUIT\r\n";
1382 close $sock;
1383 }
1384 # Try login (SquirrelMail default)
1385 print "Testing login:\t\t";
1386 $tmp=detect_auth_support('SMTP',$host,'LOGIN');
1387 if (defined($tmp)) {
1388 if ($tmp eq 'YES') {
1389 print $WHT . "SUPPORTED$NRM\n";
1390 } else {
1391 print $WHT . "NOT SUPPORTED$NRM\n";
1392 }
1393 } else {
1394 print $WHT . "ERROR DETECTING$NRM\n";
1395 }
1396
1397 # Try CRAM-MD5
1398 print "Testing CRAM-MD5:\t";
1399 $tmp=detect_auth_support('SMTP',$host,'CRAM-MD5');
1400 if (defined($tmp)) {
1401 if ($tmp eq 'YES') {
1402 print $WHT . "SUPPORTED$NRM\n";
1403 } else {
1404 print $WHT . "NOT SUPPORTED$NRM\n";
1405 }
1406 } else {
1407 print $WHT . "ERROR DETECTING$NRM\n";
1408 }
1409
1410
1411 print "Testing DIGEST-MD5:\t";
1412 $tmp=detect_auth_support('SMTP',$host,'DIGEST-MD5');
1413 if (defined($tmp)) {
1414 if ($tmp eq 'YES') {
1415 print $WHT . "SUPPORTED$NRM\n";
1416 } else {
1417 print $WHT . "NOT SUPPORTED$NRM\n";
1418 }
1419 } else {
1420 print $WHT . "ERROR DETECTING$NRM\n";
1421 }
1422 }
1423 }
1424 print "\nWhat authentication mechanism do you want to use for SMTP connections?\n";
1425 print $WHT . "none" . $NRM . " - Your SMTP server does not require authorization.\n";
1426 print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
1427 print $WHT . "plain" . $NRM . " - SASL PLAIN. You already know it if you need this.\n";
1428 print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext.\n";
1429 print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
1430 print $WHT . "\n*** YOUR SMTP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n" . $NRM;
1431 print "If you don't understand or are unsure, you probably want \"none\"\n\n";
1432 print "none, login, cram-md5, or digest-md5 [$WHT$smtp_auth_mech$NRM]: $WHT";
1433 $inval=<STDIN>;
1434 chomp($inval);
1435 if ($inval =~ /^none\b/i) {
1436 # remove sitewide smtp authentication information
1437 $smtp_sitewide_user = '';
1438 $smtp_sitewide_pass = '';
1439 # SMTP doesn't necessarily require logins
1440 return "none";
1441 } elsif ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) ||
1442 ($inval =~ /^login\b/i) || ($inval =~/^plain\b/i)) {
1443 command_smtp_sitewide_userpass($inval);
1444 return lc($inval);
1445 } elsif (trim($inval) eq '') {
1446 # user selected default value
1447 command_smtp_sitewide_userpass($smtp_auth_mech);
1448 return $smtp_auth_mech;
1449 } else {
1450 # user entered garbage
1451 return $smtp_auth_mech;
1452 }
1453 }
1454
1455 sub command_smtp_sitewide_userpass($) {
1456 # get first function argument
1457 my $auth_mech = shift(@_);
1458 my $default, $tmp;
1459 $auth_mech = lc(trim($auth_mech));
1460 if ($auth_mech eq 'none') {
1461 return;
1462 }
1463 print "SMTP authentication uses IMAP username and password by default.\n";
1464 print "\n";
1465 print "Would you like to use other login and password for all SquirrelMail \n";
1466 print "SMTP connections?";
1467 if ($smtp_sitewide_user ne '') {
1468 $default = 'y';
1469 print " [Yn]:";
1470 } else {
1471 $default = 'n';
1472 print " [yN]:";
1473 }
1474 $tmp=<STDIN>;
1475 $tmp = trim($tmp);
1476
1477 if ($tmp eq '') {
1478 $tmp = $default;
1479 } else {
1480 $tmp = lc($tmp);
1481 }
1482
1483 if ($tmp eq 'n') {
1484 $smtp_sitewide_user = '';
1485 $smtp_sitewide_pass = '';
1486 } elsif ($tmp eq 'y') {
1487 print "Enter username [$smtp_sitewide_user]:";
1488 my $new_user = <STDIN>;
1489 $new_user = trim($new_user);
1490 if ($new_user ne '') {
1491 $smtp_sitewide_user = $new_user;
1492 }
1493 if ($smtp_sitewide_user ne '') {
1494 print "If you don't enter any password, current sitewide password will be used.\n";
1495 print "If you enter space, password will be set to empty string.\n";
1496 print "Enter password:";
1497 my $new_pass = <STDIN>;
1498 if ($new_pass ne "\n") {
1499 $smtp_sitewide_pass = trim($new_pass);
1500 }
1501 } else {
1502 print "Invalid input. You must set username used for SMTP authentication.\n";
1503 print "Click any key to continue\n";
1504 $tmp = <STDIN>;
1505 }
1506 } else {
1507 print "Invalid input\n";
1508 print "Click any key to continue\n";
1509 $tmp = <STDIN>;
1510 }
1511 }
1512
1513 # Sub adds information about SMTP authentication type to menu
1514 sub display_smtp_sitewide_userpass() {
1515 my $ret = '';
1516 if ($smtp_auth_mech ne 'none') {
1517 if ($smtp_sitewide_user ne '') {
1518 $ret = ' (with custom username and password)';
1519 } else {
1520 $ret = ' (with IMAP username and password)';
1521 }
1522 }
1523 return $ret;
1524 }
1525
1526 # TLS
1527 # This sub is reused for IMAP and SMTP
1528 # Args: service name, default value
1529 sub command_use_tls {
1530 my($default_val,$service,$inval);
1531 $service=$_[0];
1532 $default_val=$_[1];
1533 print "TLS (Transport Layer Security) encrypts the traffic between server and client.\n";
1534 print "STARTTLS extensions allow to start encryption on existing plain text connection.\n";
1535 print "These options add specific PHP and IMAP server configuration requirements.\n";
1536 print "See SquirrelMail documentation about connection security.\n";
1537 print "\n";
1538 print "If your " . $service . " server is localhost, you can safely disable this.\n";
1539 print "If it is remote, you may wish to seriously consider enabling this.\n";
1540 $valid_input=0;
1541 while ($valid_input eq 0) {
1542 print "\nSelect connection security model:\n";
1543 print " 0 - Use plain text connection\n";
1544 print " 1 - Use TLS connection\n";
1545 print " 2 - Use STARTTLS extension\n";
1546 print "Select [$default_val]: ";
1547 $inval=<STDIN>;
1548 $inval=trim($inval);
1549 if ($inval =~ /^[012]$/ || $inval eq '') {
1550 $valid_input = 1;
1551 }
1552 }
1553 if ($inval ne '') {$default_val = $inval};
1554 return $default_val;
1555 }
1556
1557 # This sub is used to display human readable text for
1558 # $use_imap_tls and $use_smtp_tls values in conf.pl menu
1559 sub display_use_tls($) {
1560 my $val = shift(@_);
1561 my $ret = 'disabled';
1562 if ($val eq '2') {
1563 $ret = 'STARTTLS';
1564 } elsif ($val eq '1') {
1565 $ret = 'TLS';
1566 }
1567 return $ret;
1568 }
1569
1570 # $encode_header_key
1571 sub command114{
1572 print "Encryption key allows to hide SquirrelMail Received: headers\n";
1573 print "in outbound messages. Interface uses encryption key to encode\n";
1574 print "username, remote address and proxied address, then stores encoded\n";
1575 print "information in X-Squirrel-* headers.\n";
1576 print "\n";
1577 print "Warning: used encryption function is not bulletproof. When used\n";
1578 print "with static encryption keys, it provides only minimal security\n";
1579 print "measures and information can be decoded quickly.\n";
1580 print "\n";
1581 print "Encoded information can be decoded with decrypt_headers.php script\n";
1582 print "from SquirrelMail contrib/ directory.\n";
1583 print "\n";
1584 print "Enter encryption key: ";
1585 $new_encode_header_key = <STDIN>;
1586 if ( $new_encode_header_key eq "\n" ) {
1587 $new_encode_header_key = $encode_header_key;
1588 } else {
1589 $new_encode_header_key =~ s/[\r\n]//g;
1590 }
1591 return $new_encode_header_key;
1592 }
1593
1594 # MOTD
1595 sub command71 {
1596 print "\nYou can now create the welcome message that is displayed\n";
1597 print "every time a user logs on. You can use HTML or just plain\n";
1598 print
1599 "text. If you do not wish to have one, just make it blank.\n\n(Type @ on a blank line to exit)\n";
1600
1601 $new_motd = "";
1602 do {
1603 print "] ";
1604 $line = <STDIN>;
1605 $line =~ s/[\r\n]//g;
1606 if ( $line ne "@" ) {
1607 $line =~ s/ /\&nbsp;\&nbsp;/g;
1608 $line =~ s/\t/\&nbsp;\&nbsp;\&nbsp;\&nbsp;/g;
1609 $line =~ s/$/ /;
1610 $line =~ s/\"/\\\"/g;
1611
1612 $new_motd = $new_motd . $line;
1613 }
1614 } while ( $line ne "@" );
1615 return $new_motd;
1616 }
1617
1618 ################# PLUGINS ###################
1619
1620 sub command81 {
1621 $command =~ s/[\s\n\r]*//g;
1622 if ( $command > 0 ) {
1623 $command = $command - 1;
1624 if ( $command <= $#plugins ) {
1625 @newplugins = ();
1626 $ct = 0;
1627 while ( $ct <= $#plugins ) {
1628 if ( $ct != $command ) {
1629 @newplugins = ( @newplugins, $plugins[$ct] );
1630 }
1631 $ct++;
1632 }
1633 @plugins = @newplugins;
1634 } elsif ( $command <= $#plugins + $#unused_plugins + 1 ) {
1635 $num = $command - $#plugins - 1;
1636 @newplugins = @plugins;
1637 $ct = 0;
1638 while ( $ct <= $#unused_plugins ) {
1639 if ( $ct == $num ) {
1640 @newplugins = ( @newplugins, $unused_plugins[$ct] );
1641 }
1642 $ct++;
1643 }
1644 @plugins = @newplugins;
1645 }
1646 }
1647 return @plugins;
1648 }
1649
1650 ################# FOLDERS ###################
1651
1652 # default_folder_prefix
1653 sub command21 {
1654 print "Some IMAP servers (UW, for example) store mail and folders in\n";
1655 print "your user space in a separate subdirectory. This is where you\n";
1656 print "specify what that directory is.\n";
1657 print "\n";
1658 print "EXAMPLE: mail/";
1659 print "\n";
1660 print "NOTE: If you use Cyrus, or some server that would not use this\n";
1661 print " option, you must set this to 'none'.\n";
1662 print "\n";
1663 print "[$WHT$default_folder_prefix$NRM]: $WHT";
1664 $new_default_folder_prefix = <STDIN>;
1665
1666 if ( $new_default_folder_prefix eq "\n" ) {
1667 $new_default_folder_prefix = $default_folder_prefix;
1668 } else {
1669 $new_default_folder_prefix =~ s/[\r\n]//g;
1670 }
1671 if ( ( $new_default_folder_prefix =~ /^\s*$/ ) || ( $new_default_folder_prefix =~ m/^none$/i ) ) {
1672 $new_default_folder_prefix = "";
1673 } else {
1674 # add the trailing delimiter only if we know what the server is.
1675 if (($imap_server_type eq 'cyrus' and
1676 $optional_delimiter eq 'detect') or
1677 ($imap_server_type eq 'courier' and
1678 $optional_delimiter eq 'detect')) {
1679 $new_default_folder_prefix =~ s/\.*$/\./;
1680 } elsif ($imap_server_type eq 'uw' and
1681 $optional_delimiter eq 'detect') {
1682 $new_default_folder_prefix =~ s/\/*$/\//;
1683 }
1684 }
1685 return $new_default_folder_prefix;
1686 }
1687
1688 # Show Folder Prefix
1689 sub command22 {
1690 print "It is possible to set up the default folder prefix as a user\n";
1691 print "specific option, where each user can specify what their mail\n";
1692 print "folder is. If you set this to false, they will never see the\n";
1693 print "option, but if it is true, this option will appear in the\n";
1694 print "'options' section.\n";
1695 print "\n";
1696 print "NOTE: You set the default folder prefix in option '1' of this\n";
1697 print " section. That will be the default if the user doesn't\n";
1698 print " specify anything different.\n";
1699 print "\n";
1700
1701 if ( lc($show_prefix_option) eq 'true' ) {
1702 $default_value = "y";
1703 } else {
1704 $default_value = "n";
1705 }
1706 print "\n";
1707 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1708 $new_show = <STDIN>;
1709 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1710 $show_prefix_option = 'true';
1711 } else {
1712 $show_prefix_option = 'false';
1713 }
1714 return $show_prefix_option;
1715 }
1716
1717 # Trash Folder
1718 sub command23a {
1719 print "You can now specify where the default trash folder is located.\n";
1720 print "On servers where you do not want this, you can set it to anything\n";
1721 print "and set option 6 to false.\n";
1722 print "\n";
1723 print "This is relative to where the rest of your email is kept. You do\n";
1724 print "not need to worry about their mail directory. If this folder\n";
1725 print "would be ~/mail/trash on the filesystem, you only need to specify\n";
1726 print "that this is 'trash', and be sure to put 'mail/' in option 1.\n";
1727 print "\n";
1728
1729 print "[$WHT$trash_folder$NRM]: $WHT";
1730 $new_trash_folder = <STDIN>;
1731 if ( $new_trash_folder eq "\n" ) {
1732 $new_trash_folder = $trash_folder;
1733 } else {
1734 if (check_imap_folder($new_trash_folder)) {
1735 $new_trash_folder =~ s/[\r\n]//g;
1736 } else {
1737 $new_trash_folder = $trash_folder;
1738 }
1739 }
1740 return $new_trash_folder;
1741 }
1742
1743 # Sent Folder
1744 sub command23b {
1745 print "This is where messages that are sent will be stored. SquirrelMail\n";
1746 print "by default puts a copy of all outgoing messages in this folder.\n";
1747 print "\n";
1748 print "This is relative to where the rest of your email is kept. You do\n";
1749 print "not need to worry about their mail directory. If this folder\n";
1750 print "would be ~/mail/sent on the filesystem, you only need to specify\n";
1751 print "that this is 'sent', and be sure to put 'mail/' in option 1.\n";
1752 print "\n";
1753
1754 print "[$WHT$sent_folder$NRM]: $WHT";
1755 $new_sent_folder = <STDIN>;
1756 if ( $new_sent_folder eq "\n" ) {
1757 $new_sent_folder = $sent_folder;
1758 } else {
1759 if (check_imap_folder($new_sent_folder)) {
1760 $new_sent_folder =~ s/[\r\n]//g;
1761 } else {
1762 $new_sent_folder = $sent_folder;
1763 }
1764 }
1765 return $new_sent_folder;
1766 }
1767
1768 # Draft Folder
1769 sub command23c {
1770 print "You can now specify where the default draft folder is located.\n";
1771 print "On servers where you do not want this, you can set it to anything\n";
1772 print "and set option 9 to false.\n";
1773 print "\n";
1774 print "This is relative to where the rest of your email is kept. You do\n";
1775 print "not need to worry about their mail directory. If this folder\n";
1776 print "would be ~/mail/drafts on the filesystem, you only need to specify\n";
1777 print "that this is 'drafts', and be sure to put 'mail/' in option 1.\n";
1778 print "\n";
1779
1780 print "[$WHT$draft_folder$NRM]: $WHT";
1781 $new_draft_folder = <STDIN>;
1782 if ( $new_draft_folder eq "\n" ) {
1783 $new_draft_folder = $draft_folder;
1784 } else {
1785 if (check_imap_folder($new_draft_folder)) {
1786 $new_draft_folder =~ s/[\r\n]//g;
1787 } else {
1788 $new_draft_folder = $draft_folder;
1789 }
1790 }
1791 return $new_draft_folder;
1792 }
1793
1794 # default move to trash
1795 sub command24a {
1796 print "By default, should messages get moved to the trash folder? You\n";
1797 print "can specify the default trash folder in option 3. If this is set\n";
1798 print "to false, messages will get deleted immediately without moving\n";
1799 print "to the trash folder.\n";
1800 print "\n";
1801 print "Trash folder is currently: $trash_folder\n";
1802 print "\n";
1803
1804 if ( lc($default_move_to_trash) eq 'true' ) {
1805 $default_value = "y";
1806 } else {
1807 $default_value = "n";
1808 }
1809 print "By default, move to trash (y/n) [$WHT$default_value$NRM]: $WHT";
1810 $new_show = <STDIN>;
1811 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1812 $default_move_to_trash = 'true';
1813 } else {
1814 $default_move_to_trash = 'false';
1815 }
1816 return $default_move_to_trash;
1817 }
1818
1819 # default move to sent
1820 sub command24b {
1821 print "By default, should messages get moved to the sent folder? You\n";
1822 print "can specify the default sent folder in option 4. If this is set\n";
1823 print "to false, messages will get sent and no copy will be made.\n";
1824 print "\n";
1825 print "Sent folder is currently: $sent_folder\n";
1826 print "\n";
1827
1828 if ( lc($default_move_to_sent) eq 'true' ) {
1829 $default_value = "y";
1830 } else {
1831 $default_value = "n";
1832 }
1833 print "By default, move to sent (y/n) [$WHT$default_value$NRM]: $WHT";
1834 $new_show = <STDIN>;
1835 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1836 $default_move_to_sent = 'true';
1837 } else {
1838 $default_move_to_sent = 'false';
1839 }
1840 return $default_move_to_sent;
1841 }
1842
1843 # default save as draft
1844 sub command24c {
1845 print "By default, should the save to draft option be shown? You can\n";
1846 print "specify the default drafts folder in option 5. If this is set\n";
1847 print "to false, users will not be shown the save to draft option.\n";
1848 print "\n";
1849 print "Drafts folder is currently: $draft_folder\n";
1850 print "\n";
1851
1852 if ( lc($default_move_to_draft) eq 'true' ) {
1853 $default_value = "y";
1854 } else {
1855 $default_value = "n";
1856 }
1857 print "By default, save as draft (y/n) [$WHT$default_value$NRM]: $WHT";
1858 $new_show = <STDIN>;
1859 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1860 $default_save_as_draft = 'true';
1861 } else {
1862 $default_save_as_draft = 'false';
1863 }
1864 return $default_save_as_draft;
1865 }
1866
1867 # List special folders first
1868 sub command27 {
1869 print "SquirrelMail has what we call 'special folders' that are not\n";
1870 print "manipulated and viewed like normal folders. Some examples of\n";
1871 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
1872 print "Simply asks if you want these folders listed first in the folder\n";
1873 print "listing.\n";
1874 print "\n";
1875
1876 if ( lc($list_special_folders_first) eq 'true' ) {
1877 $default_value = "y";
1878 } else {
1879 $default_value = "n";
1880 }
1881 print "\n";
1882 print "List first (y/n) [$WHT$default_value$NRM]: $WHT";
1883 $new_show = <STDIN>;
1884 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1885 $list_special_folders_first = 'true';
1886 } else {
1887 $list_special_folders_first = 'false';
1888 }
1889 return $list_special_folders_first;
1890 }
1891
1892 # Show special folders color
1893 sub command28 {
1894 print "SquirrelMail has what we call 'special folders' that are not\n";
1895 print "manipulated and viewed like normal folders. Some examples of\n";
1896 print "these folders would be INBOX, Trash, Sent, etc. This option\n";
1897 print "wants to know if we should display special folders in a\n";
1898 print "color than the other folders.\n";
1899 print "\n";
1900
1901 if ( lc($use_special_folder_color) eq 'true' ) {
1902 $default_value = "y";
1903 } else {
1904 $default_value = "n";
1905 }
1906 print "\n";
1907 print "Show color (y/n) [$WHT$default_value$NRM]: $WHT";
1908 $new_show = <STDIN>;
1909 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1910 $use_special_folder_color = 'true';
1911 } else {
1912 $use_special_folder_color = 'false';
1913 }
1914 return $use_special_folder_color;
1915 }
1916
1917 # Auto expunge
1918 sub command29 {
1919 print "The way that IMAP handles deleting messages is as follows. You\n";
1920 print "mark the message as deleted, and then to 'really' delete it, you\n";
1921 print "expunge it. This option asks if you want to just have messages\n";
1922 print "marked as deleted, or if you want SquirrelMail to expunge the \n";
1923 print "messages too.\n";
1924 print "\n";
1925
1926 if ( lc($auto_expunge) eq 'true' ) {
1927 $default_value = "y";
1928 } else {
1929 $default_value = "n";
1930 }
1931 print "Auto expunge (y/n) [$WHT$default_value$NRM]: $WHT";
1932 $new_show = <STDIN>;
1933 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1934 $auto_expunge = 'true';
1935 } else {
1936 $auto_expunge = 'false';
1937 }
1938 return $auto_expunge;
1939 }
1940
1941 # Default sub of inbox
1942 sub command210 {
1943 print "Some IMAP servers (Cyrus) have all folders as subfolders of INBOX.\n";
1944 print "This can cause some confusion in folder creation for users when\n";
1945 print "they try to create folders and don't put it as a subfolder of INBOX\n";
1946 print "and get permission errors. This option asks if you want folders\n";
1947 print "to be subfolders of INBOX by default.\n";
1948 print "\n";
1949
1950 if ( lc($default_sub_of_inbox) eq 'true' ) {
1951 $default_value = "y";
1952 } else {
1953 $default_value = "n";
1954 }
1955 print "Default sub of INBOX (y/n) [$WHT$default_value$NRM]: $WHT";
1956 $new_show = <STDIN>;
1957 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1958 $default_sub_of_inbox = 'true';
1959 } else {
1960 $default_sub_of_inbox = 'false';
1961 }
1962 return $default_sub_of_inbox;
1963 }
1964
1965 # Show contain subfolder option
1966 sub command211 {
1967 print "Some IMAP servers (UW) make it so that there are two types of\n";
1968 print "folders. Those that contain messages, and those that contain\n";
1969 print "subfolders. If this is the case for your server, set this to\n";
1970 print "true, and it will ask the user whether the folder they are\n";
1971 print "creating contains subfolders or messages.\n";
1972 print "\n";
1973
1974 if ( lc($show_contain_subfolders_option) eq 'true' ) {
1975 $default_value = "y";
1976 } else {
1977 $default_value = "n";
1978 }
1979 print "Show option (y/n) [$WHT$default_value$NRM]: $WHT";
1980 $new_show = <STDIN>;
1981 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
1982 $show_contain_subfolders_option = 'true';
1983 } else {
1984 $show_contain_subfolders_option = 'false';
1985 }
1986 return $show_contain_subfolders_option;
1987 }
1988
1989 # Default Unseen Notify
1990 sub command212 {
1991 print "This option specifies where the users will receive notification\n";
1992 print "about unseen messages by default. This is of course an option that\n";
1993 print "can be changed on a user level.\n";
1994 print " 1 = No notification\n";
1995 print " 2 = Only on the INBOX\n";
1996 print " 3 = On all folders\n";
1997 print "\n";
1998
1999 print "Which one should be default (1,2,3)? [$WHT$default_unseen_notify$NRM]: $WHT";
2000 $new_show = <STDIN>;
2001 if ( $new_show =~ /^[123]\n/i ) {
2002 $default_unseen_notify = $new_show;
2003 }
2004 $default_unseen_notify =~ s/[\r\n]//g;
2005 return $default_unseen_notify;
2006 }
2007
2008 # Default Unseen Type
2009 sub command213 {
2010 print "Here you can define the default way that unseen messages will be displayed\n";
2011 print "to the user in the folder listing on the left side.\n";
2012 print " 1 = Only unseen messages (4)\n";
2013 print " 2 = Unseen and Total messages (4/27)\n";
2014 print "\n";
2015
2016 print "Which one should be default (1,2)? [$WHT$default_unseen_type$NRM]: $WHT";
2017 $new_show = <STDIN>;
2018 if ( $new_show =~ /^[12]\n/i ) {
2019 $default_unseen_type = $new_show;
2020 }
2021 $default_unseen_type =~ s/[\r\n]//g;
2022 return $default_unseen_type;
2023 }
2024
2025 # Auto create special folders
2026 sub command214 {
2027 print "Would you like the Sent, Trash, and Drafts folders to be created\n";
2028 print "automatically print for you when a user logs in? If the user\n";
2029 print "accidentally deletes their special folders, this option will\n";
2030 print "automatically create it again for them.\n";
2031 print "\n";
2032
2033 if ( lc($auto_create_special) eq 'true' ) {
2034 $default_value = "y";
2035 } else {
2036 $default_value = "n";
2037 }
2038 print "Auto create special folders? (y/n) [$WHT$default_value$NRM]: $WHT";
2039 $new_show = <STDIN>;
2040 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2041 $auto_create_special = 'true';
2042 } else {
2043 $auto_create_special = 'false';
2044 }
2045 return $auto_create_special;
2046 }
2047
2048 # Automatically delete folders
2049 sub command215 {
2050 if ( $imap_server_type eq "uw" ) {
2051 print "UW IMAP servers will not allow folders containing mail to also contain folders.\n";
2052 print "Deleting folders will bypass the trash folder and be immediately deleted\n\n";
2053 print "If this is not the correct value for your server,\n";
2054 print "please use option D on the Main Menu to configure your server correctly.\n\n";
2055 print "Press any key to continue...\n";
2056 $new_delete = <STDIN>;
2057 $delete_folder = 'true';
2058 } else {
2059 if ( $imap_server_type eq "courier" ) {
2060 print "Courier (or Courier-IMAP) IMAP servers may not support ";
2061 print "subfolders of Trash. \n";
2062 print "Specifically, if Courier is set to always move messages to Trash, \n";
2063 print "Trash will be treated by Courier as a special folder that does not \n";
2064 print "allow subfolders. \n\n";
2065 print "Please verify your Courier configuration, and test folder deletion \n";
2066 print "when changing this setting.\n\n";
2067 }
2068
2069 print "Are subfolders of the Trash supported by your IMAP server?\n";
2070 print "If so, should deleted folders be sent to Trash?\n";
2071 print "If not, say no (deleted folders should not be sent to Trash)\n\n";
2072 # reversal of logic.
2073 # question was: Should folders be automatically deleted instead of sent to trash..
2074 # we've changed the question to make it more clear,
2075 # and are here handling that to avoid changing the answers..
2076 if ( lc($delete_folder) eq 'true' ) {
2077 $default_value = "n";
2078 } else {
2079 $default_value = "y";
2080 }
2081 print "Send deleted folders to Trash? (y/n) [$WHT$default_value$NRM]: $WHT";
2082 $new_delete = <STDIN>;
2083 if ( ( $new_delete =~ /^y\n/i ) || ( ( $new_delete =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2084 $delete_folder = 'false';
2085 } else {
2086 $delete_folder = 'true';
2087 }
2088 }
2089 return $delete_folder;
2090 }
2091
2092 #noselect fix
2093 sub command216 {
2094 print "Some IMAP server allow subfolders to exist even if the parent\n";
2095 print "folders do not. This fixes some problems with the folder list\n";
2096 print "when this is the case, causing the /NoSelect folders to be displayed\n";
2097 print "\n";
2098
2099 if ( lc($noselect_fix_enable) eq 'true' ) {
2100 $default_value = "y";
2101 } else {
2102 $default_value = "n";
2103 }
2104 print "enable noselect fix? (y/n) [$WHT$noselect_fix_enable$NRM]: $WHT";
2105 $noselect_fix_enable = <STDIN>;
2106 if ( ( $noselect_fix_enable =~ /^y\n/i ) || ( ( $noselect_fix_enable =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2107 $noselect_fix_enable = 'true';
2108 } else {
2109 $noselect_fix_enable = 'false';
2110 }
2111 return $noselect_fix_enable;
2112 }
2113 ############# GENERAL OPTIONS #####################
2114
2115 # Data directory
2116 sub command33a {
2117 print "Specify the location for your data directory.\n";
2118 print "You need to create this directory yourself.\n";
2119 print "The path name can be absolute or relative (to the config directory).\n";
2120 print "Here are two examples:\n";
2121 print " Absolute: /var/local/squirrelmail/data/\n";
2122 print " Relative: ../data/\n";
2123 print "Relative paths to directories outside of the SquirrelMail distribution\n";
2124 print "will be converted to their absolute path equivalents in config.php.\n\n";
2125 print "Note: There are potential security risks with having a writeable directory\n";
2126 print "under the web server's root directory (ex: /home/httpd/html).\n";
2127 print "For this reason, it is recommended to put the data directory\n";
2128 print "in an alternate location of your choice. \n";
2129 print "\n";
2130
2131 print "[$WHT$data_dir$NRM]: $WHT";
2132 $new_data_dir = <STDIN>;
2133 if ( $new_data_dir eq "\n" ) {
2134 $new_data_dir = $data_dir;
2135 } else {
2136 $new_data_dir =~ s/[\r\n]//g;
2137 }
2138 if ( $new_data_dir =~ /^\s*$/ ) {
2139 $new_data_dir = "";
2140 } else {
2141 $new_data_dir =~ s/\/*$//g;
2142 $new_data_dir =~ s/$/\//g;
2143 }
2144 return $new_data_dir;
2145 }
2146
2147 # Attachment directory
2148 sub command33b {
2149 print "Path to directory used for storing attachments while a mail is\n";
2150 print "being composed. The path name can be absolute or relative (to the\n";
2151 print "config directory). Here are two examples:\n";
2152 print " Absolute: /var/local/squirrelmail/attach/\n";
2153 print " Relative: ../attach/\n";
2154 print "Relative paths to directories outside of the SquirrelMail distribution\n";
2155 print "will be converted to their absolute path equivalents in config.php.\n\n";
2156 print "Note: There are a few security considerations regarding this\n";
2157 print "directory:\n";
2158 print " 1. It should have the permission 733 (rwx-wx-wx) to make it\n";
2159 print " impossible for a random person with access to the webserver\n";
2160 print " to list files in this directory. Confidential data might\n";
2161 print " be laying around in there.\n";
2162 print " Depending on your user:group assignments, 730 (rwx-wx---)\n";
2163 print " may be possible, and more secure (e.g. root:apache)\n";
2164 print " 2. Since the webserver is not able to list the files in the\n";
2165 print " content is also impossible for the webserver to delete files\n";
2166 print " lying around there for too long.\n";
2167 print " 3. It should probably be another directory than the data\n";
2168 print " directory specified in option 3.\n";
2169 print "\n";
2170
2171 print "[$WHT$attachment_dir$NRM]: $WHT";
2172 $new_attachment_dir = <STDIN>;
2173 if ( $new_attachment_dir eq "\n" ) {
2174 $new_attachment_dir = $attachment_dir;
2175 } else {
2176 $new_attachment_dir =~ s/[\r\n]//g;
2177 }
2178 if ( $new_attachment_dir =~ /^\s*$/ ) {
2179 $new_attachment_dir = "";
2180 } else {
2181 $new_attachment_dir =~ s/\/*$//g;
2182 $new_attachment_dir =~ s/$/\//g;
2183 }
2184 return $new_attachment_dir;
2185 }
2186
2187 sub command33c {
2188 print "The directory hash level setting allows you to configure the level\n";
2189 print "of hashing that SquirrelMail employs in your data and attachment\n";
2190 print "directories. This value must be an integer ranging from 0 to 4.\n";
2191 print "When this value is set to 0, SquirrelMail will simply store all\n";
2192 print "files as normal in the data and attachment directories. However,\n";
2193 print "when set to a value from 1 to 4, a simple hashing scheme will be\n";
2194 print "used to organize the files in this directory. In short, the crc32\n";
2195 print "value for a username will be computed. Then, up to the first 4\n";
2196 print "digits of the hash, as set by this configuration value, will be\n";
2197 print "used to directory hash the files for that user in the data and\n";
2198 print "attachment directory. This allows for better performance on\n";
2199 print "servers with larger numbers of users.\n";
2200 print "\n";
2201
2202 print "[$WHT$dir_hash_level$NRM]: $WHT";
2203 $new_dir_hash_level = <STDIN>;
2204 if ( $new_dir_hash_level eq "\n" ) {
2205 $new_dir_hash_level = $dir_hash_level;
2206 } else {
2207 $new_dir_hash_level =~ s/[\r\n]//g;
2208 }
2209 if ( ( int($new_dir_hash_level) < 0 )
2210 || ( int($new_dir_hash_level) > 4 )
2211 || !( int($new_dir_hash_level) eq $new_dir_hash_level ) ) {
2212 print "Invalid Directory Hash Level.\n";
2213 print "Value must be an integer ranging from 0 to 4\n";
2214 print "Hit enter to continue.\n";
2215 $enter_key = <STDIN>;
2216
2217 $new_dir_hash_level = $dir_hash_level;
2218 }
2219
2220 return $new_dir_hash_level;
2221 }
2222
2223 sub command35 {
2224 print "This is the default size (in pixels) of the left folder list.\n";
2225 print "Default is 200, but you can set it to whatever you wish. This\n";
2226 print "is a user preference, so this will only show up as their default.\n";
2227 print "\n";
2228 print "[$WHT$default_left_size$NRM]: $WHT";
2229 $new_default_left_size = <STDIN>;
2230 if ( $new_default_left_size eq "\n" ) {
2231 $new_default_left_size = $default_left_size;
2232 } else {
2233 $new_default_left_size =~ s/[\r\n]//g;
2234 }
2235 return $new_default_left_size;
2236 }
2237
2238 sub command36 {
2239 print "Some IMAP servers only have lowercase letters in the usernames\n";
2240 print "but they still allow people with uppercase to log in. This\n";
2241 print "causes a problem with the user's preference files. This option\n";
2242 print "transparently changes all usernames to lowercase.";
2243 print "\n";
2244
2245 if ( lc($force_username_lowercase) eq 'true' ) {
2246 $default_value = "y";
2247 } else {
2248 $default_value = "n";
2249 }
2250 print "Convert usernames to lowercase (y/n) [$WHT$default_value$NRM]: $WHT";
2251 $new_show = <STDIN>;
2252 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2253 return 'true';
2254 }
2255 return 'false';
2256 }
2257
2258 sub command37 {
2259 print "";
2260 print "\n";
2261
2262 if ( lc($default_use_priority) eq 'true' ) {
2263 $default_value = "y";
2264 } else {
2265 $default_value = "n";
2266 }
2267
2268 print "Allow users to specify priority of outgoing mail (y/n) [$WHT$default_value$NRM]: $WHT";
2269 $new_show = <STDIN>;
2270 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2271 return 'true';
2272 }
2273 return 'false';
2274 }
2275
2276 sub command38 {
2277 print "";
2278 print "\n";
2279
2280 if ( lc($default_hide_attribution) eq 'true' ) {
2281 $default_value = "y";
2282 } else {
2283 $default_value = "n";
2284 }
2285
2286 print "Hide SM attributions (y/n) [$WHT$default_value$NRM]: $WHT";
2287 $new_show = <STDIN>;
2288 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2289 return 'true';
2290 }
2291 return 'false';
2292 }
2293
2294 sub command39 {
2295 print "";
2296 print "\n";
2297
2298 if ( lc($default_use_mdn) eq 'true' ) {
2299 $default_value = "y";
2300 } else {
2301 $default_value = "n";
2302 }
2303
2304 print "Enable support for read/delivery receipt support (y/n) [$WHT$default_value$NRM]: $WHT";
2305 $new_show = <STDIN>;
2306 if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2307 return 'true';
2308 }
2309 return 'false';
2310 }
2311
2312
2313 sub command310 {
2314 print " In loosely managed environments, you may want to allow users
2315 to edit their full name and email address. In strictly managed
2316 environments, you may want to force users to use the name
2317 and email address assigned to them.
2318
2319 'y' - allow a user to edit their full name and email address,
2320 'n' - users must use the assigned values.
2321
2322 ";
2323
2324 if ( lc($edit_identity) eq 'true' ) {
2325 $default_value = "y";
2326 } else {
2327 $default_value = "n";
2328 }
2329 print "Allow editing of user's identity? (y/n) [$WHT$default_value$NRM]: $WHT";
2330 $new_edit = <STDIN>;
2331 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2332 $edit_identity = 'true';
2333 $edit_name = 'true';
2334 $hide_auth_header = command311b();
2335 } else {
2336 $edit_identity = 'false';
2337 $edit_name = command311();
2338 $hide_auth_header = command311b();
2339 }
2340 return $edit_identity;
2341 }
2342
2343 sub command311 {
2344 print " Given that users are not allowed to modify their
2345 email address, can they edit their full name?
2346
2347 ";
2348
2349 if ( lc($edit_name) eq 'true' ) {
2350 $default_value = "y";
2351 } else {
2352 $default_value = "n";
2353 }
2354 print "Allow the user to edit their full name? (y/n) [$WHT$default_value$NRM]: $WHT";
2355 $new_edit = <STDIN>;
2356 if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2357 $edit_name = 'true';
2358 } else {
2359 $edit_name = 'false';
2360 }
2361 return $edit_name;
2362 }
2363
2364 sub command311b {
2365 print " SquirrelMail adds username information to every sent email
2366 in order to prevent possible sender forging when users are allowed
2367 to change their email and/or full name.
2368
2369 You can remove user information from this header (y), if you think that
2370 it violates privacy or security.
2371
2372 Note: If users are allowed to change their email addresses,
2373 this setting will make it difficult to determine who sent what where.
2374 Use at your own risk.
2375
2376 ";
2377
2378 if ( lc($hide_auth_header) eq "true" ) {
2379 $default_value = "y";
2380 } else {
2381 $default_value = "n";
2382 }
2383 print "Remove username from email headers? (y/n) [$WHT$default_value$NRM]: $WHT";
2384 $new_header = <STDIN>;
2385 if ( ( $new_header =~ /^y\n/i ) || ( ( $new_header =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2386 $hide_auth_header = "true";
2387 } else {
2388 $hide_auth_header = "false";
2389 }
2390 return $hide_auth_header;
2391 }
2392
2393 sub command312 {
2394 print "This option allows you to disable server side thread sorting if your server \n";
2395 print "declares THREAD support, but you don't want to provide threading options \n";
2396 print "to end users or THREAD extension is broken or extension does not work with \n";
2397 print "options used by SquirrelMail. Option is not used, if THREAD extension is \n";
2398 print "not declared in IMAP CAPABILITY.\n";
2399 print "\n";
2400
2401 if ( lc($disable_thread_sort) eq 'true' ) {
2402 $default_value = "y";
2403 } else {
2404 $default_value = "n";
2405 }
2406 print "Disable server side thread sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2407 $disable_thread_sort = <STDIN>;
2408 if ( ( $disable_thread_sort =~ /^y\n/i ) || ( ( $disable_thread_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2409 $disable_thread_sort = 'true';
2410 } else {
2411 $disable_thread_sort = 'false';
2412 }
2413 return $disable_thread_sort;
2414 }
2415
2416 sub command313 {
2417 print "This option allows you to disable server side sorting if your server declares \n";
2418 print "SORT support, but SORT extension is broken or does not work with options \n";
2419 print "used by SquirrelMail. Option is not used, if SORT extension is not declared \n";
2420 print "in IMAP CAPABILITY.\n";
2421 print "\n";
2422 print "It is strongly recommended to keep server side sorting enabled, if your ";
2423 print "IMAP server supports it.";
2424 print "\n";
2425
2426 if ( lc($disable_server_sort) eq 'true' ) {
2427 $default_value = "y";
2428 } else {
2429 $default_value = "n";
2430 }
2431 print "Disable server-side sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
2432 $disable_server_sort = <STDIN>;
2433 if ( ( $disable_server_sort =~ /^y\n/i ) || ( ( $disable_server_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2434 $disable_server_sort = 'true';
2435 } else {
2436 $disable_server_sort = 'false';
2437 }
2438 return $disable_server_sort;
2439 }
2440
2441 sub command314 {
2442 print "This option allows you to choose if SM uses charset search\n";
2443 print "Your IMAP server must support the SEARCH CHARSET command for this to work\n";
2444 print "\n";
2445
2446 if ( lc($allow_charset_search) eq 'true' ) {
2447 $default_value = "y";
2448 } else {
2449 $default_value = "n";
2450 }
2451 print "Allow charset searching? (y/n) [$WHT$default_value$NRM]: $WHT";
2452 $allow_charset_search = <STDIN>;
2453 if ( ( $allow_charset_search =~ /^y\n/i ) || ( ( $allow_charset_search =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
2454 $allow_charset_search = 'true';
2455 } else {
2456 $allow_charset_search = 'false';
2457 }
2458 return $allow_charset_search;
2459 }
2460
2461 # command315 (UID support) obsoleted.
2462
2463 # advanced search option
2464 sub command316 {
2465 print "This option allows you to control the use of advanced search form.\n";
2466 print " 0 = enable basic search only\n";
2467 print " 1 = enable advanced search only\n";
2468 print " 2 = enable both\n";
2469 print "\n";
2470
2471 print "Allowed search (0,1,2)? [$WHT$allow_advanced_search$NRM]: $WHT";
2472 $new_allow_advanced_search = <STDIN>;
2473 if ( $new_allow_advanced_search =~ /^[012]\n/i ) {
2474 $allow_advanced_search = $new_allow_advanced_search;
2475 }
2476 $allow_advanced_search =~ s/[\r\n]//g;
2477 return $allow_advanced_search;
2478 }
2479
2480
2481 sub command317 {
2482 print "This option allows you to change the name of the PHP session used\n";
2483 print "by SquirrelMail. Unless you know what you are doing, you probably\n";
2484 print "don't need or want to change this from the default of SQMSESSID.\n";
2485 print "[$WHT$session_name$NRM]: $WHT";
2486 $new_session_name = <STDIN>;
2487 chomp($new_session_name);
2488 if ( $new_session_name eq "" ) {
2489 $new_session_name = $session_name;
2490 }
2491 return $new_session_name;
2492 }
2493
2494 # time zone config (since 1.5.1)
2495 sub command318 {
2496 print "This option allows you to control the use of time zones.\n";
2497 print " 0 = (default) standard, GNU C time zone names\n";
2498 print " 1 = strict, generic time zone codes with offsets\n";
2499 print " 2 = custom, GNU C time zones loaded from config/timezones.php\n";
2500 print " 3 = custom strict, generic time zone codes with offsets loaded \n";
2501 print " from config/timezones.php\n";
2502 print "See SquirrelMail documentation about format of config/timezones.php file.\n";
2503 print "\n";
2504
2505 print "Used time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT";
2506 $new_time_zone_type = <STDIN>;
2507 if ( $new_time_zone_type =~ /^[0123]\n/i ) {
2508 $time_zone_type = $new_time_zone_type;
2509 } else {
2510 print "\nInvalid configuration value.\n";
2511 print "\nPress enter to continue...";
2512 $tmp = <STDIN>;
2513 }
2514 $time_zone_type =~ s/[\r\n]//g;
2515 return $time_zone_type;
2516 }
2517
2518 # set the location base for redirects (since 1.5.2)
2519 sub command_config_location_base {
2520 print "Here you can set the base part of the SquirrelMail URL.\n";
2521 print "It is normally autodetected but if that fails, use this\n";
2522 print "option to override.\n";
2523 print "It should contain only the protocol and hostname/port parts\n";
2524 print "of the URL; the full path will be appended automatically.\n\n";
2525 print "Examples:\nhttp://webmail.example.org\nhttp://webmail.example.com:8080\nhttps://webmail.example.com:6691\n\n";
2526 print "Do not add any path elements.\n";
2527
2528 print "URL base? [" .$WHT."autodetect$NRM]: $WHT";
2529 $new_config_location_base = <STDIN>;
2530 chomp($new_config_location_base);
2531 $config_location_base = $new_config_location_base;
2532
2533 return $config_location_base;
2534 }
2535
2536
2537
2538 sub command41 {
2539 print "\nDefine the user themes that you wish to use. If you have added\n";
2540 print "a theme of your own, just follow the instructions (?) about\n";
2541 print "how to add them. You can also change the default theme.\n\n";
2542 print "[user_theme] command (?=help) > ";
2543 $input = <STDIN>;
2544 $input =~ s/[\r\n]//g;
2545 while ( $input ne "d" ) {
2546 if ( $input =~ /^\s*l\s*/i ) {
2547 $count = 0;
2548 while ( $count <= $#user_theme_name ) {
2549 if ( $count == $user_theme_default ) {
2550 print " *";
2551 } else {
2552 print " ";
2553 }
2554 if ( $count < 10 ) {
2555 print " ";
2556 }
2557 $name = $user_theme_name[$count];
2558 $num_spaces = 35 - length($name);
2559 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2560 $name = $name . " ";
2561 }
2562
2563 print " $count. $name";
2564 print "($user_theme_path[$count])\n";
2565
2566 $count++;
2567 }
2568 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
2569 $old_def = $user_theme_default;
2570 $user_theme_default = $input;
2571 $user_theme_default =~ s/^\s*m\s*//;
2572 if ( ( $user_theme_default > $#user_theme_name ) || ( $user_theme_default < 0 ) ) {
2573 print "Cannot set default theme to $user_theme_default. That theme does not exist.\n";
2574 $user_theme_default = $old_def;
2575 }
2576 } elsif ( $input =~ /^\s*\+/ ) {
2577 print "What is the name of this theme? ";
2578 $name = <STDIN>;
2579 $name =~ s/[\r\n]//g;
2580 $user_theme_name[ $#theme_name + 1 ] = $name;
2581 print "Be sure to put ../css/ before the filename.\n";
2582 print "What file is this stored in (ex: ../css/my_theme/): ";
2583 $name = <STDIN>;
2584 $name =~ s/[\r\n]//g;
2585 $user_theme_path[ $#user_theme_path + 1 ] = $name;
2586 } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
2587 if ( $input =~ /[0-9]+\s*$/ ) {
2588 $rem_num = $input;
2589 $rem_num =~ s/^\s*-\s*//g;
2590 $rem_num =~ s/\s*$//;
2591 } else {
2592 $rem_num = $#user_theme_name;
2593 }
2594 if ( $rem_num == $user_theme_default ) {
2595 print "You cannot remove the default theme!\n";
2596 } else {
2597 $count = 0;
2598 @new_theme_name = ();
2599 @new_theme_path = ();
2600 while ( $count <= $#user_theme_name ) {
2601 if ( $count != $rem_num ) {
2602 @new_theme_name = ( @new_theme_name, $user_theme_name[$count] );
2603 @new_theme_path = ( @new_theme_path, $user_theme_path[$count] );
2604 }
2605 $count++;
2606 }
2607 @user_theme_name = @new_theme_name;
2608 @user_theme_path = @new_theme_path;
2609 if ( $user_theme_default > $rem_num ) {
2610 $user_theme_default--;
2611 }
2612 }
2613 } elsif ( $input =~ /^\s*t\s*/i ) {
2614 print "\nStarting detection...\n\n";
2615
2616 opendir( DIR, "../css" );
2617 @files = readdir(DIR);
2618 $cnt = 0;
2619 while ( $cnt <= $#files ) {
2620 $filename = "../css/" . $files[$cnt] .'/';
2621 if ( $filename ne "../css/rtl.css" && -e $filename . "default.css" ) {
2622 $found = 0;
2623 for ( $x = 0 ; $x <= $#user_theme_path ; $x++ ) {
2624 if ( $user_theme_path[$x] eq $filename ) {
2625 $found = 1;
2626 }
2627 }
2628 if ( $found != 1 ) {
2629 print "** Found user theme: $filename\n";
2630 print " What is its name? ";
2631 $nm = <STDIN>;
2632 $nm =~ s/[\n\r]//g;
2633 $user_theme_name[ $#user_theme_name + 1 ] = $nm;
2634 $user_theme_path[ $#user_theme_path + 1 ] = $filename;
2635 }
2636 }
2637 $cnt++;
2638 }
2639 print "\n";
2640 for ( $cnt = 0 ; $cnt <= $#user_theme_path ; $cnt++ ) {
2641 $filename = $user_theme_path[$cnt];
2642 if ( $filename != 'none' && !( -e $filename ."/default.css" ) ) {
2643 print " Removing $filename (file not found)\n";
2644 $offset = 0;
2645 @new_user_theme_name = ();
2646 @new_user_theme_path = ();
2647 for ( $x = 0 ; $x < $#user_theme_path ; $x++ ) {
2648 if ( $user_theme_path[$x] eq $filename ) {
2649 $offset = 1;
2650 }
2651 if ( $offset == 1 ) {
2652 $new_user_theme_name[$x] = $user_theme_name[ $x + 1 ];
2653 $new_user_theme_path[$x] = $user_theme_path[ $x + 1 ];
2654 } else {
2655 $new_user_theme_name[$x] = $user_theme_name[$x];
2656 $new_user_theme_path[$x] = $user_theme_path[$x];
2657 }
2658 }
2659 @user_theme_name = @new_user_theme_name;
2660 @user_theme_path = @new_user_theme_path;
2661 }
2662 }
2663 print "\nDetection complete!\n\n";
2664
2665 closedir DIR;
2666 } elsif ( $input =~ /^\s*\?\s*/ ) {
2667 print ".-------------------------.\n";
2668 print "| t (detect themes) |\n";
2669 print "| + (add theme) |\n";
2670 print "| - N (remove theme) |\n";
2671 print "| m N (mark default) |\n";
2672 print "| l (list themes) |\n";
2673 print "| d (done) |\n";
2674 print "`-------------------------'\n";
2675 }
2676 print "[user_theme] command (?=help) > ";
2677 $input = <STDIN>;
2678 $input =~ s/[\r\n]//g;
2679 }
2680 }
2681
2682 sub command_templates {
2683 print "\nDefine the template sets that you wish to use. If you have added ";
2684 print "a template set of your own, just follow the instructions (?) about how to add ";
2685 print "them. You can also change the default template.\n";
2686
2687 print "\n Available Templates:\n";
2688
2689 $count = 0;
2690 while ( $count <= $#templateset_name ) {
2691 if ( $count == $templateset_default ) {
2692 print " *";
2693 } else {
2694 print " ";
2695 }
2696 if ( $count < 10 ) {
2697 print " ";
2698 }
2699 $name = $templateset_name[$count];
2700 $num_spaces = 35 - length($name);
2701 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2702 $name = $name . " ";
2703 }
2704
2705 print " $count. $name";
2706 print "($templateset_id[$count])\n";
2707
2708 $count++;
2709 }
2710
2711 # FIXME: what is this stuff? it is commented out, can we just blast it?
2712 # opendir( DIR, "../templates" );
2713 # @files = readdir(DIR);
2714 # $pos = 0;
2715 #
2716 # while ( $cnt <= $#files ) {
2717 # if ( -d "../templates/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
2718 # $filename = "../templates/" . $files[$cnt];
2719 # $found = 0;
2720 # for ( $x = 0 ; $x <= $#templateset_id ; $x++ ) {
2721 # if ( $theme_path[$x] eq $filename ) {
2722 # $found = 1;
2723 # }
2724 # }
2725 # }
2726 # $cnt++;
2727 # }
2728 # for ( $i = 0 ; $i <= $#files ; $i++ ) {
2729 # if ( -d "../templates/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
2730 # $match = 0;
2731 # for ( $k = 0 ; $k <= $#aTemplateSets ; $k++ ) {
2732 # if ( $aTemplateSets[$chosen] eq $files[$i] ) {
2733 # $match = 1;
2734 # }
2735 # }
2736 # if ( $match == 0 ) {
2737 # $unused_plugins[$pos] = $files[$i];
2738 # $pos++;
2739 # }
2740 # }
2741 # }
2742 #
2743 # for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
2744 # $num = $num + 1;
2745 # print " $num. $unused_plugins[$i]\n";
2746 # }
2747 # closedir DIR;
2748
2749 $menu_text = ".-------------------------------------.\n"
2750 . "| t (detect templates set) |\n"
2751 . "| + (add template set) |\n"
2752 . "| - N (remove template set) |\n"
2753 . "| m N (mark default template set) |\n"
2754 . "| l (list template sets) |\n"
2755 . "| d (done) |\n"
2756 . "|-------------------------------------|\n"
2757 . "| where N is a template set number |\n"
2758 . "`-------------------------------------'\n";
2759 print "\n";
2760 print $menu_text;
2761 print "\n[template set] command (?=help) > ";
2762
2763 $input = <STDIN>;
2764 $input =~ s/[\r\n]//g;
2765 while ( $input ne "d" ) {
2766
2767 # list template sets
2768 #
2769 if ( $input =~ /^\s*l\s*/i ) {
2770 $count = 0;
2771 while ( $count <= $#templateset_name ) {
2772 if ( $count == $templateset_default ) {
2773 print " *";
2774 } else {
2775 print " ";
2776 }
2777 if ( $count < 10 ) {
2778 print " ";
2779 }
2780 $name = $templateset_name[$count];
2781 $num_spaces = 35 - length($name);
2782 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
2783 $name = $name . " ";
2784 }
2785
2786 print " $count. $name";
2787 print "($templateset_id[$count])\n";
2788
2789 $count++;
2790 }
2791
2792 # mark default template set
2793 #
2794 } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
2795 $old_def = $templateset_default;
2796 $templateset_default = $input;
2797 $templateset_default =~ s/^\s*m\s*//;
2798 if ( ( $templateset_default > $#templateset_name ) || ( $templateset_default < 0 ) ) {
2799 print "Cannot set default template set to $templateset_default. That template set does not exist.\n";
2800 $templateset_default = $old_def;
2801 }
2802
2803 # add template set
2804 #
2805 } elsif ( $input =~ /^\s*\+/ ) {
2806 print "\nWhat is the name of this template (as shown to your users): ";
2807 $name = <STDIN>;
2808 $name =~ s/[\r\n]//g;
2809 $templateset_name[ $#templateset_name + 1 ] = $name;
2810 print "\n\nThe directory name should not contain any path information\n"
2811 . "or slashes, and should be the name of the directory that the\n"
2812 . "template set is found in within the SquirrelMail templates\n"
2813 . "directory.\n\n";
2814 print "What directory is this stored in (ex: default_advanced): ";
2815 $name = <STDIN>;
2816 $name =~ s/[\r\n]//g;
2817 $templateset_id[ $#templateset_id + 1 ] = $name;
2818
2819 # detect template sets
2820 #
2821 } elsif ( $input =~ /^\s*t\s*/i ) {
2822 print "\nStarting detection...\n\n";
2823 opendir( DIR, "../templates" );
2824 @files = readdir(DIR);
2825 $cnt = 0;
2826 while ( $cnt <= $#files ) {
2827 if ( -d "../templates/" . $files[$cnt] && $files[$cnt] !~ /^\./ && $files[$cnt] ne "CVS" ) {
2828 $filename = $files[$cnt];
2829 $found = 0;
2830 for ( $x = 0 ; $x <= $#templateset_id ; $x++ ) {
2831 if ( $templateset_id[$x] eq $filename ) {
2832 $found = 1;
2833 last;
2834 }
2835 }
2836 if ( $found != 1) {
2837 print "** Found template set: $filename\n";
2838 print " What is it's name (as shown to your users)? ";
2839 $nm = <STDIN>;
2840 $nm =~ s/[\n\r]//g;
2841 $templateset_id[ $#templateset_id + 1 ] = $filename;
2842 $templateset_name[ $#templateset_name + 1 ] = $nm;
2843 # FIXME: why are these two lines here?
2844 # $aTemplateSet[ $#templateset_name + 1 ] = $nm;
2845 # $aTemplateSet[ $#templateset_id + 1 ] = $filename;
2846 }
2847 }
2848 $cnt++;
2849 }
2850 print "\n";
2851 for ( $cnt= 0 ; $cnt <= $#templateset_id ; ) {
2852 $filename = $templateset_id[$cnt];
2853 if ( !(-d change_to_rel_path('SM_PATH . \'templates/' . $filename)) ) {
2854 print " Removing \"$filename\" (template set directory not found)\n";
2855 if ( $templateset_default gt $cnt ) { $templateset_default--; }
2856 elsif ( $templateset_default eq $cnt ) { $templateset_default = 0; }
2857 $offset = 0;
2858 @new_templateset_name = ();
2859 @new_templateset_id = ();
2860 for ( $x = 0 ; $x < $#templateset_id ; $x++ ) {
2861 if ( $templateset_id[$x] eq $filename ) {
2862 $offset = 1;
2863 }
2864 if ( $offset == 1 ) {
2865 $new_templateset_name[$x] = $templateset_name[ $x + 1 ];
2866 $new_templateset_id[$x] = $templateset_id[ $x + 1 ];
2867 } else {
2868 $new_templateset_name[$x] = $templateset_name[$x];
2869 $new_templateset_id[$x] = $templateset_id[$x];
2870 }
2871 }
2872 @templateset_name = @new_templateset_name;
2873 @templateset_id = @new_templateset_id;
2874 } else { $cnt++; }
2875 }
2876 print "\nDetection complete!\n\n";
2877
2878 closedir DIR;
2879
2880 # remove template set
2881 #
2882 # undocumented functionality of removing last template set isn't that great
2883 #} elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
2884 } elsif ( $input =~ /^\s*-\s*[0-9]+/ ) {
2885 if ( $input =~ /[0-9]+\s*$/ ) {
2886 $rem_num = $input;
2887 $rem_num =~ s/^\s*-\s*//g;
2888 $rem_num =~ s/\s*$//;
2889 } else {
2890 $rem_num = $#templateset_name;
2891 }
2892 if ( $rem_num == $templateset_default ) {
2893 print "You cannot remove the default template set!\n";
2894 } else {
2895 $count = 0;
2896 @new_templateset_name = ();
2897 @new_templateset_id = ();
2898 while ( $count <= $#templateset_name ) {
2899 if ( $count != $rem_num ) {
2900 @new_templateset_name = ( @new_templateset_name, $templateset_name[$count] );
2901 @new_templateset_id = ( @new_templateset_id, $templateset_id[$count] );
2902 }
2903 $count++;
2904 }
2905 @templateset_name = @new_templateset_name;
2906 @templateset_id = @new_templateset_id;
2907 if ( $templateset_default > $rem_num ) {
2908 $templateset_default--;
2909 }
2910 }
2911
2912 # help
2913 #
2914 } elsif ( $input =~ /^\s*\?\s*/ ) {
2915 print $menu_text;
2916 }
2917 print "[template set] command (?=help) > ";
2918 $input = <STDIN>;
2919 $input =~ s/[\r\n]//g;
2920 }
2921 return $templateset_default;
2922 }
2923
2924
2925 # sets default font size option
2926 sub command_default_fontsize {
2927 print "Enter default font size [$WHT$$default_fontsize$NRM]: $WHT";
2928 $new_size = <STDIN>;
2929 if ( $new_size eq "\n" ) {
2930 $new_size = $size;
2931 } else {
2932 $new_size =~ s/[\r\n]//g;
2933 }
2934 return $new_size;
2935 }
2936
2937 # controls available fontsets
2938 sub command_fontsets {
2939 # Greeting
2940 print "You can control fontsets available to end users here.\n";
2941 # set initial $input value
2942 $input = 'l';
2943 while ( $input ne "x" ) {
2944 if ( $input =~ /^\s*a\s*/i ) {
2945 # add new fontset
2946 print "\nFontset name: ";
2947 $name = <STDIN>;
2948 if (! $fontsets{trim($name)}) {
2949 print "Fontset string: ";
2950 $value = <STDIN>;
2951 $fontsets{trim($name)} = trim($value);
2952 } else {
2953 print "\nERROR: Such fontset already exists.\n";
2954 }
2955 } elsif ( $input =~ /^\s*e\s*/i ) {
2956 # edit existing fontset
2957 print "\nFontset name: ";
2958 $name = <STDIN>;
2959 if (! $fontsets{trim($name)}) {
2960 print "\nERROR: No such fontset.\n";
2961 } else {
2962 print "Fontset string [$fontsets{trim($name)}]: ";
2963 $value = <STDIN>;
2964 $fontsets{trim($name)} = trim($value);
2965 }
2966 } elsif ( $input =~ /^\s*d\s*/ ) {
2967 # delete existing fontset
2968 print "\nFontset name: ";
2969 $name = <STDIN>;
2970 if (! $fontsets{trim($name)}) {
2971 print "\nERROR: No such fontset.\n";
2972 } else {
2973 delete $fontsets{trim($name)};
2974 }
2975 } elsif ( $input =~ /^\s*l\s*/ ) {
2976 # list fontsets
2977 print "\nConfigured fontsets:\n";
2978 while (($fontset_name, $fontset_string) = each(%fontsets)) {
2979 print " $fontset_name = $fontset_string\n";
2980 }
2981 print "Default fontset: $default_fontset\n";
2982 } elsif ( $input =~ /^\s*m\s*/ ) {
2983 # set default fontset
2984 print "\nSet default fontset [$default_fontset]: ";
2985 $name = <STDIN>;
2986 if (trim($name) ne '' and ! $fontsets{trim($name)}) {
2987 print "\nERROR: No such fontset.\n";
2988 } else {
2989 $default_fontset = trim($name);
2990 }
2991 } else {
2992 # print available commands on any other input
2993 print "\nAvailable commands:\n";
2994 print " a - Adds new fontset.\n";
2995 print " d - Deletes existing fontset.\n";
2996 print " e - Edits existing fontset.\n";
2997 print " h or ? - Shows this help screen.\n";
2998 print " l - Lists available fontsets.\n";
2999 print " m - Sets default fontset.\n";
3000 print " x - Exits fontset editor mode.\n";
3001 }
3002 print "\nCommand [fontsets] (a,d,e,h,?=help,l,m,x)> ";
3003 $input = <STDIN>;
3004 $input =~ s/[\r\n]//g;
3005 }
3006 }
3007
3008 sub command61 {
3009 print "You can now define different LDAP servers.\n";
3010 print "Please ensure proper permissions for config.php when including\n";
3011 print "sensitive passwords.\n\n";
3012 print "[ldap] command (?=help) > ";
3013 $input = <STDIN>;
3014 $input =~ s/[\r\n]//g;
3015 while ( $input ne "d" ) {
3016 if ( $input =~ /^\s*l\s*/i ) {
3017 $count = 0;
3018 while ( $count <= $#ldap_host ) {
3019 print "$count. $ldap_host[$count]\n";
3020 print " base: $ldap_base[$count]\n";
3021 if ( $ldap_charset[$count] ) {
3022 print " charset: $ldap_charset[$count]\n";
3023 }
3024 if ( $ldap_port[$count] ) {
3025 print " port: $ldap_port[$count]\n";
3026 }
3027 if ( $ldap_name[$count] ) {
3028 print " name: $ldap_name[$count]\n";
3029 }
3030 if ( $ldap_maxrows[$count] ) {
3031 print " maxrows: $ldap_maxrows[$count]\n";
3032 }
3033 if ( $ldap_filter[$count] ) {
3034 print " filter: $ldap_filter[$count]\n";
3035 }
3036 if ( $ldap_binddn[$count] ) {
3037 print " binddn: $ldap_binddn[$count]\n";
3038 if ( $ldap_bindpw[$count] ) {
3039 print " bindpw: $ldap_bindpw[$count]\n";
3040 }
3041 }
3042 if ( $ldap_protocol[$count] ) {
3043 print " protocol: $ldap_protocol[$count]\n";
3044 }
3045 if ( $ldap_limit_scope[$count] ) {
3046 print " limit_scope: $ldap_limit_scope[$count]\n";
3047 }
3048 if ( $ldap_listing[$count] ) {
3049 print " listing: $ldap_listing[$count]\n";
3050 }
3051 if ( $ldap_writeable[$count] ) {
3052 print " writeable: $ldap_writeable[$count]\n";
3053 }
3054 if ( $ldap_search_tree[$count] ) {
3055 print " search_tree: $ldap_search_tree[$count]\n";
3056 }
3057 if ( $ldap_starttls[$count] ) {
3058 print " starttls: $ldap_starttls[$count]\n";
3059 }
3060
3061 print "\n";
3062 $count++;
3063 }
3064 } elsif ( $input =~ /^\s*\+/ ) {
3065 $sub = $#ldap_host + 1;
3066
3067 print "First, we need to have the hostname or the IP address where\n";
3068 print "this LDAP server resides. Example: ldap.bigfoot.com\n";
3069 print "\n";
3070 print "You can use any URI compatible with your LDAP library. Please\n";
3071 print "note that StartTLS option is not compatible with ldaps and\n";
3072 print "ldapi URIs.\n";
3073 print "hostname: ";
3074 $name = <STDIN>;
3075 $name =~ s/[\r\n]//g;
3076 $ldap_host[$sub] = $name;
3077
3078 print "\n";
3079
3080 print "Next, we need the server root (base dn). For this, an empty\n";
3081 print "string is allowed.\n";
3082 print "Example: ou=member_directory,o=netcenter.com\n";
3083 print "base: ";
3084 $name = <STDIN>;
3085 $name =~ s/[\r\n]//g;
3086 $ldap_base[$sub] = $name;
3087
3088 print "\n";
3089
3090 print "This is the TCP/IP port number for the LDAP server. Default\n";
3091 print "port is 389. This is optional. Press ENTER for default.\n";
3092 print "port: ";
3093 $name = <STDIN>;
3094 $name =~ s/[\r\n]//g;
3095 $ldap_port[$sub] = $name;
3096
3097 print "\n";
3098
3099 print "This is the charset for the server. Default is utf-8. This\n";
3100 print "is also optional. Press ENTER for default.\n";
3101 print "charset: ";
3102 $name = <STDIN>;
3103 $name =~ s/[\r\n]//g;
3104 $ldap_charset[$sub] = $name;
3105
3106 print "\n";
3107
3108 print "This is the name for the server, used to tag the results of\n";
3109 print "the search. Default it \"LDAP: hostname\". Press ENTER for default\n";
3110 print "name: ";
3111 $name = <STDIN>;
3112 $name =~ s/[\r\n]//g;
3113 $ldap_name[$sub] = $name;
3114
3115 print "\n";
3116
3117 print "You can specify the maximum number of rows in the search result.\n";
3118 print "Default value is equal to 250 rows. Press ENTER for default.\n";
3119 print "maxrows: ";
3120 $name = <STDIN>;
3121 $name =~ s/[\r\n]//g;
3122 $ldap_maxrows[$sub] = $name;
3123
3124
3125 print "\n";
3126
3127 print "If your LDAP server does not like anonymous logins, you can specify bind DN.\n";
3128 print "Default is none, anonymous bind. Press ENTER for default.\n";
3129 print "binddn: ";
3130 $name = <STDIN>;
3131 $name =~ s/[\r\n]//g;
3132 $ldap_binddn[$sub] = $name;
3133
3134 print "\n";
3135
3136 if ( $ldap_binddn[$sub] ne '' ) {
3137
3138 print "Now, please specify password for that DN.\n";
3139 print "bindpw: ";
3140 $name = <STDIN>;
3141 $name =~ s/[\r\n]//g;
3142 $ldap_bindpw[$sub] = $name;
3143
3144 print "\n";
3145 }
3146
3147 print "You can specify bind protocol version here.\n";
3148 print "Default protocol version depends on your php ldap settings.\n";
3149 print "Press ENTER for default.\n";
3150 print "protocol: ";
3151 $name = <STDIN>;
3152 $name =~ s/[\r\n]//g;
3153 $ldap_protocol[$sub] = $name;
3154
3155 print "\n";
3156
3157 print "This configuration section allows to set some rarely used\n";
3158 print "options and options specific to some LDAP implementations.\n";
3159 print "\n";
3160 print "Do you want to set advanced LDAP directory settings? (y/N):";
3161 $ldap_advanced_settings = <STDIN>;
3162 if ( $ldap_advanced_settings =~ /^y\n/i ) {
3163 $ldap_advanced_settings = 'true';
3164 } else {
3165 $ldap_advanced_settings = 'false';
3166 }
3167
3168 if ($ldap_advanced_settings eq 'true') {
3169 print "\n";
3170
3171 print "You can control LDAP directory listing here. This option can\n";
3172 print "be useful if you run small LDAP server and want to provide listing\n";
3173 print "of all addresses stored in LDAP to users of webmail interface.\n";
3174 print "Number of displayed entries is limited by maxrows setting.\n";
3175 print "\n";
3176 print "Don't enable this option for public LDAP directories.\n";
3177 print "\n";
3178 print "Allow listing of LDAP directory? (y/N):";
3179 $name = <STDIN>;
3180 if ( $name =~ /^y\n/i ) {
3181 $name = 'true';
3182 } else {
3183 $name = 'false';
3184 }
3185 $ldap_listing[$sub] = $name;
3186
3187 print "\n";
3188
3189 print "You can control write access to LDAP address book here. This option can\n";
3190 print "be useful if you run small LDAP server and want to provide writable\n";
3191 print "shared address book stored in LDAP to users of webmail interface.\n";
3192 print "\n";
3193 print "Don't enable this option for public LDAP directories.\n";
3194 print "\n";
3195 print "Allow writing to LDAP directory? (y/N):";
3196 $name = <STDIN>;
3197 if ( $name =~ /^y\n/i ) {
3198 $name = 'true';
3199 } else {
3200 $name = 'false';
3201 }
3202 $ldap_writeable[$sub] = $name;
3203
3204 print "\n";
3205
3206 print "You can specify an additional search filter.\n";
3207 print "This could be something like \"(objectclass=posixAccount)\".\n";
3208 print "No filtering is performed by default. Press ENTER for default.\n";
3209 print "filter: ";
3210 $name = <STDIN>;
3211 $name =~ s/[\r|\n]//g;
3212 $ldap_filter[$sub] = $name;
3213
3214 print "\n";
3215
3216 print "You can control search scope here.\n";
3217 print "This option is specific to Microsoft ADS implementation.\n";
3218 print "It requires use of v3 or newer LDAP protocol.\n";
3219 print "Don't enable it, if you use other LDAP server.\n";
3220 print "\n";
3221 print "Limit ldap scope? (y/N):";
3222 $name = <STDIN>;
3223 if ( $name =~ /^y\n/i ) {
3224 $name = 'true';
3225 } else {
3226 $name = 'false';
3227 }
3228 $ldap_limit_scope[$sub] = $name;
3229
3230 print "\n";
3231
3232 print "You can control ldap search type here.\n";
3233 print "Addresses can be searched in entire LDAP subtree (default)\n";
3234 print "or only first level entries are returned.\n";
3235 print "\n";
3236 print "Search entire LDAP subtree? (Y/n):";
3237 $name = <STDIN>;
3238 if ( $name =~ /^n\n/i ) {
3239 $name = 'false';
3240 } else {
3241 $name = 'true';
3242 }