+ print "Specify the location for your data directory.\n";
+ print "You need to create this directory yourself.\n";
+ print "The path name can be absolute or relative (to the config directory).\n";
+ print "Here are two examples:\n";
+ print " Absolute: /var/local/squirrelmail/data/\n";
+ print " Relative: ../data/\n";
+ print "Relative paths to directories outside of the SquirrelMail distribution\n";
+ print "will be converted to their absolute path equivalents in config.php.\n\n";
+ print "Note: There are potential security risks with having a writeable directory\n";
+ print "under the web server's root directory (ex: /home/httpd/html).\n";
+ print "For this reason, it is recommended to put the data directory\n";
+ print "in an alternate location of your choice. \n";
+ print "\n";
+
+ print "[$WHT$data_dir$NRM]: $WHT";
+ $new_data_dir = <STDIN>;
+ if ( $new_data_dir eq "\n" ) {
+ $new_data_dir = $data_dir;
+ } else {
+ $new_data_dir =~ s/[\r\n]//g;
+ }
+ if ( $new_data_dir =~ /^\s*$/ ) {
+ $new_data_dir = "";
+ } else {
+ $new_data_dir =~ s/\/*$//g;
+ $new_data_dir =~ s/$/\//g;
+ }
+ return $new_data_dir;
+}
+
+# Attachment directory
+sub command33b {
+ print "Path to directory used for storing attachments while a mail is\n";
+ print "being composed. The path name can be absolute or relative (to the\n";
+ print "config directory). Here are two examples:\n";
+ print " Absolute: /var/local/squirrelmail/attach/\n";
+ print " Relative: ../attach/\n";
+ print "Relative paths to directories outside of the SquirrelMail distribution\n";
+ print "will be converted to their absolute path equivalents in config.php.\n\n";
+ print "Note: There are a few security considerations regarding this\n";
+ print "directory:\n";
+ print " 1. It should have the permission 733 (rwx-wx-wx) to make it\n";
+ print " impossible for a random person with access to the webserver\n";
+ print " to list files in this directory. Confidential data might\n";
+ print " be laying around in there.\n";
+ print " Depending on your user:group assignments, 730 (rwx-wx---)\n";
+ print " may be possible, and more secure (e.g. root:apache)\n";
+ print " 2. Since the webserver is not able to list the files in the\n";
+ print " content is also impossible for the webserver to delete files\n";
+ print " lying around there for too long.\n";
+ print " 3. It should probably be another directory than the data\n";
+ print " directory specified in option 3.\n";
+ print "\n";
+
+ print "[$WHT$attachment_dir$NRM]: $WHT";
+ $new_attachment_dir = <STDIN>;
+ if ( $new_attachment_dir eq "\n" ) {
+ $new_attachment_dir = $attachment_dir;
+ } else {
+ $new_attachment_dir =~ s/[\r\n]//g;
+ }
+ if ( $new_attachment_dir =~ /^\s*$/ ) {
+ $new_attachment_dir = "";
+ } else {
+ $new_attachment_dir =~ s/\/*$//g;
+ $new_attachment_dir =~ s/$/\//g;
+ }
+ return $new_attachment_dir;
+}
+
+sub command33c {
+ print "The directory hash level setting allows you to configure the level\n";
+ print "of hashing that SquirrelMail employs in your data and attachment\n";
+ print "directories. This value must be an integer ranging from 0 to 4.\n";
+ print "When this value is set to 0, SquirrelMail will simply store all\n";
+ print "files as normal in the data and attachment directories. However,\n";
+ print "when set to a value from 1 to 4, a simple hashing scheme will be\n";
+ print "used to organize the files in this directory. In short, the crc32\n";
+ print "value for a username will be computed. Then, up to the first 4\n";
+ print "digits of the hash, as set by this configuration value, will be\n";
+ print "used to directory hash the files for that user in the data and\n";
+ print "attachment directory. This allows for better performance on\n";
+ print "servers with larger numbers of users.\n";
+ print "\n";
+
+ print "[$WHT$dir_hash_level$NRM]: $WHT";
+ $new_dir_hash_level = <STDIN>;
+ if ( $new_dir_hash_level eq "\n" ) {
+ $new_dir_hash_level = $dir_hash_level;
+ } else {
+ $new_dir_hash_level =~ s/[\r\n]//g;
+ }
+ if ( ( int($new_dir_hash_level) < 0 )
+ || ( int($new_dir_hash_level) > 4 )
+ || !( int($new_dir_hash_level) eq $new_dir_hash_level ) ) {
+ print "Invalid Directory Hash Level.\n";
+ print "Value must be an integer ranging from 0 to 4\n";
+ print "Hit enter to continue.\n";
+ $enter_key = <STDIN>;
+
+ $new_dir_hash_level = $dir_hash_level;
+ }
+
+ return $new_dir_hash_level;
+}
+
+sub command35 {
+ print "This is the default size (in pixels) of the left folder list.\n";
+ print "Default is 200, but you can set it to whatever you wish. This\n";
+ print "is a user preference, so this will only show up as their default.\n";
+ print "\n";
+ print "[$WHT$default_left_size$NRM]: $WHT";
+ $new_default_left_size = <STDIN>;
+ if ( $new_default_left_size eq "\n" ) {
+ $new_default_left_size = $default_left_size;
+ } else {
+ $new_default_left_size =~ s/[\r\n]//g;
+ }
+ return $new_default_left_size;
+}
+
+sub command36 {
+ print "Some IMAP servers only have lowercase letters in the usernames\n";
+ print "but they still allow people with uppercase to log in. This\n";
+ print "causes a problem with the user's preference files. This option\n";
+ print "transparently changes all usernames to lowercase.";
+ print "\n";
+
+ if ( lc($force_username_lowercase) eq 'true' ) {
+ $default_value = "y";
+ } else {
+ $default_value = "n";
+ }
+ print "Convert usernames to lowercase (y/n) [$WHT$default_value$NRM]: $WHT";
+ $new_show = <STDIN>;
+ if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+ return 'true';
+ }
+ return 'false';
+}
+
+sub command37 {
+ print "";
+ print "\n";
+
+ if ( lc($default_use_priority) eq 'true' ) {
+ $default_value = "y";
+ } else {
+ $default_value = "n";
+ }
+
+ print "Allow users to specify priority of outgoing mail (y/n) [$WHT$default_value$NRM]: $WHT";
+ $new_show = <STDIN>;
+ if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+ return 'true';
+ }
+ return 'false';
+}
+
+sub command38 {
+ print "";
+ print "\n";
+
+ if ( lc($default_hide_attribution) eq 'true' ) {
+ $default_value = "y";
+ } else {
+ $default_value = "n";
+ }
+
+ print "Hide SM attributions (y/n) [$WHT$default_value$NRM]: $WHT";
+ $new_show = <STDIN>;
+ if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+ return 'true';
+ }
+ return 'false';
+}
+
+sub command39 {
+ print "";
+ print "\n";
+
+ if ( lc($default_use_mdn) eq 'true' ) {
+ $default_value = "y";
+ } else {
+ $default_value = "n";
+ }
+
+ print "Enable support for read/delivery receipt support (y/n) [$WHT$default_value$NRM]: $WHT";
+ $new_show = <STDIN>;
+ if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+ return 'true';
+ }
+ return 'false';
+}
+
+
+sub command310 {
+ print " In loosely managed environments, you may want to allow users
+ to edit their full name and email address. In strictly managed
+ environments, you may want to force users to use the name
+ and email address assigned to them.
+
+ 'y' - allow a user to edit their full name and email address,
+ 'n' - users must use the assigned values.
+
+ ";
+
+ if ( lc($edit_identity) eq 'true' ) {
+ $default_value = "y";
+ } else {
+ $default_value = "n";
+ }
+ print "Allow editing of user's identity? (y/n) [$WHT$default_value$NRM]: $WHT";
+ $new_edit = <STDIN>;
+ if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+ $edit_identity = 'true';
+ $edit_name = 'true';
+ $hide_auth_header = command311b();
+ } else {
+ $edit_identity = 'false';
+ $edit_name = command311();
+ $hide_auth_header = command311b();
+ }
+ return $edit_identity;
+}
+
+sub command311 {
+ print " Given that users are not allowed to modify their
+ email address, can they edit their full name?
+
+ ";
+
+ if ( lc($edit_name) eq 'true' ) {
+ $default_value = "y";
+ } else {
+ $default_value = "n";
+ }
+ print "Allow the user to edit their full name? (y/n) [$WHT$default_value$NRM]: $WHT";
+ $new_edit = <STDIN>;
+ if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+ $edit_name = 'true';
+ } else {
+ $edit_name = 'false';
+ }
+ return $edit_name;
+}
+
+sub command311b {
+ print " SquirrelMail adds username information to every sent email
+ in order to prevent possible sender forging when users are allowed
+ to change their email and/or full name.
+
+ You can remove user information from this header (y), if you think that
+ it violates privacy or security.
+
+ Note: If users are allowed to change their email addresses,
+ this setting will make it difficult to determine who sent what where.
+ Use at your own risk.
+
+ ";
+
+ if ( lc($hide_auth_header) eq "true" ) {
+ $default_value = "y";
+ } else {
+ $default_value = "n";
+ }
+ print "Remove username from email headers? (y/n) [$WHT$default_value$NRM]: $WHT";
+ $new_header = <STDIN>;
+ if ( ( $new_header =~ /^y\n/i ) || ( ( $new_header =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+ $hide_auth_header = "true";
+ } else {
+ $hide_auth_header = "false";
+ }
+ return $hide_auth_header;
+}
+
+sub command312 {
+ print "This option allows you to disable server side thread sorting if your server \n";
+ print "declares THREAD support, but you don't want to provide threading options \n";
+ print "to end users or THREAD extension is broken or extension does not work with \n";
+ print "options used by SquirrelMail. Option is not used, if THREAD extension is \n";
+ print "not declared in IMAP CAPABILITY.\n";
+ print "\n";
+
+ if ( lc($disable_thread_sort) eq 'true' ) {
+ $default_value = "y";
+ } else {
+ $default_value = "n";
+ }
+ print "Disable server side thread sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
+ $disable_thread_sort = <STDIN>;
+ if ( ( $disable_thread_sort =~ /^y\n/i ) || ( ( $disable_thread_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+ $disable_thread_sort = 'true';
+ } else {
+ $disable_thread_sort = 'false';
+ }
+ return $disable_thread_sort;
+}
+
+sub command313 {
+ print "This option allows you to disable server side sorting if your server declares \n";
+ print "SORT support, but SORT extension is broken or does not work with options \n";
+ print "used by SquirrelMail. Option is not used, if SORT extension is not declared \n";
+ print "in IMAP CAPABILITY.\n";
+ print "\n";
+ print "It is strongly recommended to keep server side sorting enabled, if your ";
+ print "IMAP server supports it.";
+ print "\n";
+
+ if ( lc($disable_server_sort) eq 'true' ) {
+ $default_value = "y";
+ } else {
+ $default_value = "n";
+ }
+ print "Disable server-side sorting? (y/n) [$WHT$default_value$NRM]: $WHT";
+ $disable_server_sort = <STDIN>;
+ if ( ( $disable_server_sort =~ /^y\n/i ) || ( ( $disable_server_sort =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+ $disable_server_sort = 'true';
+ } else {
+ $disable_server_sort = 'false';
+ }
+ return $disable_server_sort;
+}
+
+sub command314 {
+ print "This option allows you to choose if SM uses charset search\n";
+ print "Your IMAP server must support the SEARCH CHARSET command for this to work\n";
+ print "\n";
+
+ if ( lc($allow_charset_search) eq 'true' ) {
+ $default_value = "y";
+ } else {
+ $default_value = "n";
+ }
+ print "Allow charset searching? (y/n) [$WHT$default_value$NRM]: $WHT";
+ $allow_charset_search = <STDIN>;
+ if ( ( $allow_charset_search =~ /^y\n/i ) || ( ( $allow_charset_search =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+ $allow_charset_search = 'true';
+ } else {
+ $allow_charset_search = 'false';
+ }
+ return $allow_charset_search;
+}
+
+# command315 (UID support) obsoleted.
+
+# advanced search option
+sub command316 {
+ print "This option allows you to control the use of advanced search form.\n";
+ print " 0 = enable basic search only\n";
+ print " 1 = enable advanced search only\n";
+ print " 2 = enable both\n";
+ print "\n";
+
+ print "Allowed search (0,1,2)? [$WHT$allow_advanced_search$NRM]: $WHT";
+ $new_allow_advanced_search = <STDIN>;
+ if ( $new_allow_advanced_search =~ /^[012]\n/i ) {
+ $allow_advanced_search = $new_allow_advanced_search;
+ }
+ $allow_advanced_search =~ s/[\r\n]//g;
+ return $allow_advanced_search;
+}
+
+
+sub command317 {
+ print "This option allows you to change the name of the PHP session used\n";
+ print "by SquirrelMail. Unless you know what you are doing, you probably\n";
+ print "don't need or want to change this from the default of SQMSESSID.\n";
+ print "[$WHT$session_name$NRM]: $WHT";
+ $new_session_name = <STDIN>;
+ chomp($new_session_name);
+ if ( $new_session_name eq "" ) {
+ $new_session_name = $session_name;
+ }
+ return $new_session_name;
+}
+
+# time zone config (since 1.5.1)
+sub command318 {
+ print "This option allows you to control the use of time zones.\n";
+ print " 0 = (default) standard, GNU C time zone names\n";
+ print " 1 = strict, generic time zone codes with offsets\n";
+ print " 2 = custom, GNU C time zones loaded from config/timezones.php\n";
+ print " 3 = custom strict, generic time zone codes with offsets loaded \n";
+ print " from config/timezones.php\n";
+ print "See SquirrelMail documentation about format of config/timezones.php file.\n";
+ print "\n";
+
+ print "Used time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT";
+ $new_time_zone_type = <STDIN>;
+ if ( $new_time_zone_type =~ /^[0123]\n/i ) {
+ $time_zone_type = $new_time_zone_type;
+ } else {
+ print "\nInvalid configuration value.\n";
+ print "\nPress enter to continue...";
+ $tmp = <STDIN>;
+ }
+ $time_zone_type =~ s/[\r\n]//g;
+ return $time_zone_type;
+}
+
+
+sub command41 {
+ print "\nDefine the themes that you wish to use. If you have added ";
+ print "a theme of your own, just follow the instructions (?) about how to add ";
+ print "them. You can also change the default theme.\n";
+ print "[theme] command (?=help) > ";
+ $input = <STDIN>;
+ $input =~ s/[\r\n]//g;
+ while ( $input ne "d" ) {
+ if ( $input =~ /^\s*l\s*/i ) {
+ $count = 0;
+ while ( $count <= $#theme_name ) {
+ if ( $count == $theme_default ) {
+ print " *";
+ } else {
+ print " ";
+ }
+ if ( $count < 10 ) {
+ print " ";
+ }
+ $name = $theme_name[$count];
+ $num_spaces = 35 - length($name);
+ for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
+ $name = $name . " ";
+ }
+
+ print " $count. $name";
+ print "($theme_path[$count])\n";
+
+ $count++;
+ }
+ } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
+ $old_def = $theme_default;
+ $theme_default = $input;
+ $theme_default =~ s/^\s*m\s*//;
+ if ( ( $theme_default > $#theme_name ) || ( $theme_default < 0 ) ) {
+ print "Cannot set default theme to $theme_default. That theme does not exist.\n";
+ $theme_default = $old_def;
+ }
+ } elsif ( $input =~ /^\s*\+/ ) {
+ print "What is the name of this theme: ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $theme_name[ $#theme_name + 1 ] = $name;
+ print "Be sure to put ../themes/ before the filename.\n";
+ print "What file is this stored in (ex: ../themes/default_theme.php): ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $theme_path[ $#theme_path + 1 ] = $name;
+ } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
+ if ( $input =~ /[0-9]+\s*$/ ) {
+ $rem_num = $input;
+ $rem_num =~ s/^\s*-\s*//g;
+ $rem_num =~ s/\s*$//;
+ } else {
+ $rem_num = $#theme_name;
+ }
+ if ( $rem_num == $theme_default ) {
+ print "You cannot remove the default theme!\n";
+ } else {
+ $count = 0;
+ @new_theme_name = ();
+ @new_theme_path = ();
+ while ( $count <= $#theme_name ) {
+ if ( $count != $rem_num ) {
+ @new_theme_name = ( @new_theme_name, $theme_name[$count] );
+ @new_theme_path = ( @new_theme_path, $theme_path[$count] );
+ }
+ $count++;
+ }
+ @theme_name = @new_theme_name;
+ @theme_path = @new_theme_path;
+ if ( $theme_default > $rem_num ) {
+ $theme_default--;
+ }
+ }
+ } elsif ( $input =~ /^\s*t\s*/i ) {
+ print "\nStarting detection...\n\n";
+
+ opendir( DIR, "../themes" );
+ @files = grep { /\.php$/i } readdir(DIR);
+ $cnt = 0;
+ while ( $cnt <= $#files ) {
+ $filename = "../themes/" . $files[$cnt];
+ if ( $filename ne "../themes/index.php" ) {
+ $found = 0;
+ for ( $x = 0 ; $x <= $#theme_path ; $x++ ) {
+ if ( $theme_path[$x] eq $filename ) {
+ $found = 1;
+ }
+ }
+ if ( $found != 1 ) {
+ print "** Found theme: $filename\n";
+ print " What is its name? ";
+ $nm = <STDIN>;
+ $nm =~ s/[\n\r]//g;
+ $theme_name[ $#theme_name + 1 ] = $nm;
+ $theme_path[ $#theme_path + 1 ] = $filename;
+ }
+ }
+ $cnt++;
+ }
+ print "\n";
+ for ( $cnt = 0 ; $cnt <= $#theme_path ; $cnt++ ) {
+ $filename = $theme_path[$cnt];
+ if ( !( -e $filename ) ) {
+ print " Removing $filename (file not found)\n";
+ $offset = 0;
+ @new_theme_name = ();
+ @new_theme_path = ();
+ for ( $x = 0 ; $x < $#theme_path ; $x++ ) {
+ if ( $theme_path[$x] eq $filename ) {
+ $offset = 1;
+ }
+ if ( $offset == 1 ) {
+ $new_theme_name[$x] = $theme_name[ $x + 1 ];
+ $new_theme_path[$x] = $theme_path[ $x + 1 ];
+ } else {
+ $new_theme_name[$x] = $theme_name[$x];
+ $new_theme_path[$x] = $theme_path[$x];
+ }
+ }
+ @theme_name = @new_theme_name;
+ @theme_path = @new_theme_path;
+ }
+ }
+ print "\nDetection complete!\n\n";
+
+ closedir DIR;
+ } elsif ( $input =~ /^\s*\?\s*/ ) {
+ print ".-------------------------.\n";
+ print "| t (detect themes) |\n";
+ print "| + (add theme) |\n";
+ print "| - N (remove theme) |\n";
+ print "| m N (mark default) |\n";
+ print "| l (list themes) |\n";
+ print "| d (done) |\n";
+ print "`-------------------------'\n";
+ }
+ print "[theme] command (?=help) > ";
+ $input = <STDIN>;
+ $input =~ s/[\r\n]//g;
+ }
+}
+
+sub command_templates {
+ print "\nDefine the template sets that you wish to use. If you have added ";
+ print "a template set of your own, just follow the instructions (?) about how to add ";
+ print "them. You can also change the default template.\n";
+
+ print "\n Available Templates:\n";
+
+ $count = 0;
+ while ( $count <= $#templateset_name ) {
+ if ( $count == $templateset_default ) {
+ print " *";
+ } else {
+ print " ";
+ }
+ if ( $count < 10 ) {
+ print " ";
+ }
+ $name = $templateset_name[$count];
+ $num_spaces = 35 - length($name);
+ for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
+ $name = $name . " ";
+ }
+
+ print " $count. $name";
+ print "($templateset_path[$count])\n";
+
+ $count++;
+ }
+
+# opendir( DIR, "../templates" );
+# @files = readdir(DIR);
+# $pos = 0;
+#
+# while ( $cnt <= $#files ) {
+# if ( -d "../templates/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
+# $filename = "../templates/" . $files[$cnt];
+# $found = 0;
+# for ( $x = 0 ; $x <= $#templateset_path ; $x++ ) {
+# if ( $theme_path[$x] eq $filename ) {
+# $found = 1;
+# }
+# }
+# }
+# $cnt++;
+# }
+# for ( $i = 0 ; $i <= $#files ; $i++ ) {
+# if ( -d "../templates/" . $files[$i] && $files[$i] !~ /^\./ && $files[$i] ne "CVS" ) {
+# $match = 0;
+# for ( $k = 0 ; $k <= $#aTemplateSets ; $k++ ) {
+# if ( $aTemplateSets[$chosen] eq $files[$i] ) {
+# $match = 1;
+# }
+# }
+# if ( $match == 0 ) {
+# $unused_plugins[$pos] = $files[$i];
+# $pos++;
+# }
+# }
+# }
+#
+# for ( $i = 0 ; $i <= $#unused_plugins ; $i++ ) {
+# $num = $num + 1;
+# print " $num. $unused_plugins[$i]\n";
+# }
+# closedir DIR;
+
+ print "\n";
+ print ".--------------------------------.\n";
+ print "| t (detect templates set) |\n";
+ print "| + (add template set) |\n";
+ print "| - N (remove template set) |\n";
+ print "| m N (mark template set) |\n";
+ print "| l (list template set) |\n";
+ print "| d (done) |\n";
+ print "`--------------------------------'\n";
+ print "\n[template set] command (?=help) > ";
+
+ $input = <STDIN>;
+ $input =~ s/[\r\n]//g;
+ while ( $input ne "d" ) {
+ if ( $input =~ /^\s*l\s*/i ) {
+ $count = 0;
+ while ( $count <= $#templateset_name ) {
+ if ( $count == $templateset_default ) {
+ print " *";
+ } else {
+ print " ";
+ }
+ if ( $count < 10 ) {
+ print " ";
+ }
+ $name = $templateset_name[$count];
+ $num_spaces = 35 - length($name);
+ for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
+ $name = $name . " ";
+ }
+
+ print " $count. $name";
+ print "($templateset_path[$count])\n";
+
+ $count++;
+ }
+ } elsif ( $input =~ /^\s*m\s*[0-9]+/i ) {
+ $old_def = $templateset_default;
+ $templateset_default = $input;
+ $templateset_default =~ s/^\s*m\s*//;
+ if ( ( $templateset_default > $#templateset_name ) || ( $templateset_default < 0 ) ) {
+ print "Cannot set default template set to $templateset_default. That template set does not exist.\n";
+ $templateset_default = $old_def;
+ }
+ } elsif ( $input =~ /^\s*\+/ ) {
+ print "What is the name of this template: ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $templateset_name[ $#templateset_name + 1 ] = $name;
+ print "Be sure to put ../templates/ before the dirname.\n";
+ print "What file is this stored in (ex: ../templates/default/): ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $templateset_path[ $#templateset_path + 1 ] = $name;
+ } elsif ( $input =~ /^\s*t\s*/i ) {
+ print "\nStarting detection...\n\n";
+ opendir( DIR, "../templates" );
+ @files = readdir(DIR);
+ $cnt = 0;
+ $detected = 0;
+ while ( $cnt <= $#files ) {
+ if ( -d "../templates/" . $files[$cnt] && $files[$cnt] !~ /^\./ && $files[$cnt] ne "CVS" ) {
+ $filename = "../templates/" . $files[$cnt]. "/";
+ $found = 0;
+ for ( $x = 0 ; $x <= $#templateset_path ; $x++ ) {
+ if ( $templateset_path[$x] eq $filename ) {
+ $found = 1;
+ }
+ }
+ if ( $found != 1 && $detected == 0) {
+ $templateset_path[ $#templateset_path + 1 ] = $filename;
+ $templateset_name[ $#templateset_name + 1 ] = "Default template";
+ $aTemplateSet[ $#templateset_name + 1 ] = "Default template";
+ $aTemplateSet[ $#templateset_path + 1 ] = $filename;
+ } elsif ( $found != 1) {
+ print "** Found template set: $filename\n";
+ print " What is it's name? ";
+ $nm = <STDIN>;
+ $nm =~ s/[\n\r]//g;
+ $templateset_path[ $#templateset_path + 1 ] = $filename;
+ $templateset_name[ $#templateset_name + 1 ] = $nm;
+
+ $aTemplateSet[ $#templateset_name + 1 ] = $nm;
+ $aTemplateSet[ $#templateset_path + 1 ] = $filename;
+ }
+ $detected++;
+ }
+ $cnt++;
+ }
+ print "\n";
+ for ( $cnt = 0 ; $cnt <= $#templateset_path ; $cnt++ ) {
+ $filename = $templateset_path[$cnt];
+ if ( !(-d $filename) ) {
+ print " Removing $filename (file not found)\n";
+ $offset = 0;
+ @new_templateset_name = ();
+ @new_templateset_path = ();
+ for ( $x = 0 ; $x < $#templateset_path ; $x++ ) {
+ if ( $templateset_path[$x] eq $filename ) {
+ $offset = 1;
+ }
+ if ( $offset == 1 ) {
+ $new_templateset_name[$x] = $templateset_name[ $x + 1 ];
+ $new_theme_path[$x] = $templateset_path[ $x + 1 ];
+ } else {
+ $new_templateset_name[$x] = $templateset_name[$x];
+ $new_templateset_path[$x] = $templateset_path[$x];
+ }
+ }
+ @templateset_name = @new_templateset_name;
+ @templateset_path = @new_templateset_path;
+ }
+ }
+ print "\nDetection complete!\n\n";
+
+ closedir DIR;
+ } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
+ if ( $input =~ /[0-9]+\s*$/ ) {
+ $rem_num = $input;
+ $rem_num =~ s/^\s*-\s*//g;
+ $rem_num =~ s/\s*$//;
+ } else {
+ $rem_num = $#templateset_name;
+ }
+ if ( $rem_num == $templateset_default ) {
+ print "You cannot remove the default template set!\n";
+ } else {
+ $count = 0;
+ @new_templateset_name = ();
+ @new_templateset_path = ();
+ while ( $count <= $#templateset_name ) {
+ if ( $count != $rem_num ) {
+ @new_templateset_name = ( @new_templateset_name, $templateset_name[$count] );
+ @new_templateset_path = ( @new_templateset_path, $templateset_path[$count] );
+ }
+ $count++;
+ }
+ @templateset_name = @new_templateset_name;
+ @templateset_path = @new_templateset_path;
+ if ( $templateset_default > $rem_num ) {
+ $templateset_default--;
+ }
+ }
+ } elsif ( $input =~ /^\s*\?\s*/ ) {
+ print ".--------------------------------.\n";
+ print "| t (detect templates set) |\n";
+ print "| + (add template set) |\n";
+ print "| - N (remove template set) |\n";
+ print "| m N (mark template set) |\n";
+ print "| l (list template set) |\n";
+ print "| d (done) |\n";
+ print "`--------------------------------'\n";
+ }
+ print "[template set] command (?=help) > ";
+ $input = <STDIN>;
+ $input =~ s/[\r\n]//g;
+ }
+ return $templateset_default;
+}
+
+
+# Theme - CSS file
+sub command42 {
+ print "You may specify a cascading style-sheet (CSS) file to be included\n";
+ print "on each html page generated by SquirrelMail. The CSS file is useful\n";
+ print "for specifying a site-wide font. If you're not familiar with CSS\n";
+ print "files, leave this blank.\n";
+ print "\n";
+ print "To clear out an existing value, just type a space for the input.\n";
+ print "\n";
+ print "Please be aware of the following: \n";
+ print " - Relative URLs are relative to the config dir\n";
+ print " to use the themes directory, use ../themes/css/newdefault.css\n";
+ print " - To specify a css file defined outside the SquirrelMail source tree\n";
+ print " use the absolute URL the webserver would use to include the file\n";
+ print " e.g. http://some.host.com/css/mystyle.css or /css/mystyle.css\n";
+ print "\n";
+ print "[$WHT$theme_css$NRM]: $WHT";
+ $new_theme_css = <STDIN>;
+
+ if ( $new_theme_css eq "\n" ) {
+ $new_theme_css = $theme_css;
+ } else {
+ $new_theme_css =~ s/[\r\n]//g;
+ }
+ $new_theme_css =~ s/^\s*//;
+ return $new_theme_css;
+}
+
+# sets default font size option
+sub command_default_fontsize {
+ print "Enter default font size [$WHT$$default_fontsize$NRM]: $WHT";
+ $new_size = <STDIN>;
+ if ( $new_size eq "\n" ) {
+ $new_size = $size;
+ } else {
+ $new_size =~ s/[\r\n]//g;
+ }
+ return $new_size;
+}
+
+# controls available fontsets
+sub command_fontsets {
+ # Greeting
+ print "You can control fontsets available to end users here.\n";
+ # set initial $input value
+ $input = 'l';
+ while ( $input ne "x" ) {
+ if ( $input =~ /^\s*a\s*/i ) {
+ # add new fontset
+ print "\nFontset name: ";
+ $name = <STDIN>;
+ if (! $fontsets{trim($name)}) {
+ print "Fontset string: ";
+ $value = <STDIN>;
+ $fontsets{trim($name)} = trim($value);
+ } else {
+ print "\nERROR: Such fontset already exists.\n";
+ }
+ } elsif ( $input =~ /^\s*e\s*/i ) {
+ # edit existing fontset
+ print "\nFontset name: ";
+ $name = <STDIN>;
+ if (! $fontsets{trim($name)}) {
+ print "\nERROR: No such fontset.\n";
+ } else {
+ print "Fontset string [$fontsets{trim($name)}]: ";
+ $value = <STDIN>;
+ $fontsets{trim($name)} = trim($value);
+ }
+ } elsif ( $input =~ /^\s*d\s*/ ) {
+ # delete existing fontset
+ print "\nFontset name: ";
+ $name = <STDIN>;
+ if (! $fontsets{trim($name)}) {
+ print "\nERROR: No such fontset.\n";
+ } else {
+ delete $fontsets{trim($name)};
+ }
+ } elsif ( $input =~ /^\s*l\s*/ ) {
+ # list fontsets
+ print "\nConfigured fontsets:\n";
+ while (($fontset_name, $fontset_string) = each(%fontsets)) {
+ print " $fontset_name = $fontset_string\n";
+ }
+ print "Default fontset: $default_fontset\n";
+ } elsif ( $input =~ /^\s*m\s*/ ) {
+ # set default fontset
+ print "\nSet default fontset [$default_fontset]: ";
+ $name = <STDIN>;
+ if (trim($name) ne '' and ! $fontsets{trim($name)}) {
+ print "\nERROR: No such fontset.\n";
+ } else {
+ $default_fontset = trim($name);
+ }
+ } else {
+ # print available commands on any other input
+ print "\nAvailable commands:\n";
+ print " a - Adds new fontset.\n";
+ print " d - Deletes existing fontset.\n";
+ print " e - Edits existing fontset.\n";
+ print " h or ? - Shows this help screen.\n";
+ print " l - Lists available fontsets.\n";
+ print " m - Sets default fontset.\n";
+ print " x - Exits fontset editor mode.\n";
+ }
+ print "\nCommand [fontsets] (a,d,e,h,?=help,l,m,x)> ";
+ $input = <STDIN>;
+ $input =~ s/[\r\n]//g;
+ }
+}
+
+sub command61 {
+ print "You can now define different LDAP servers.\n";
+ print "[ldap] command (?=help) > ";
+ $input = <STDIN>;
+ $input =~ s/[\r\n]//g;
+ while ( $input ne "d" ) {
+ if ( $input =~ /^\s*l\s*/i ) {
+ $count = 0;
+ while ( $count <= $#ldap_host ) {
+ print "$count. $ldap_host[$count]\n";
+ print " base: $ldap_base[$count]\n";
+ if ( $ldap_charset[$count] ) {
+ print " charset: $ldap_charset[$count]\n";
+ }
+ if ( $ldap_port[$count] ) {
+ print " port: $ldap_port[$count]\n";
+ }
+ if ( $ldap_name[$count] ) {
+ print " name: $ldap_name[$count]\n";
+ }
+ if ( $ldap_maxrows[$count] ) {
+ print " maxrows: $ldap_maxrows[$count]\n";
+ }
+ if ( $ldap_filter[$count] ) {
+ print " filter: $ldap_filter[$count]\n";
+ }
+ if ( $ldap_binddn[$count] ) {
+ print " binddn: $ldap_binddn[$count]\n";
+ if ( $ldap_bindpw[$count] ) {
+ print " bindpw: $ldap_bindpw[$count]\n";
+ }
+ }
+ if ( $ldap_protocol[$count] ) {
+ print " protocol: $ldap_protocol[$count]\n";
+ }
+ if ( $ldap_limit_scope[$count] ) {
+ print " limit_scope: $ldap_limit_scope[$count]\n";
+ }
+ if ( $ldap_listing[$count] ) {
+ print " listing: $ldap_listing[$count]\n";
+ }
+ if ( $ldap_writeable[$count] ) {
+ print " writeable: $ldap_writeable[$count]\n";
+ }
+ if ( $ldap_search_tree[$count] ) {
+ print " search_tree: $ldap_search_tree[$count]\n";
+ }
+ if ( $ldap_starttls[$count] ) {
+ print " starttls: $ldap_starttls[$count]\n";
+ }
+
+ print "\n";
+ $count++;
+ }
+ } elsif ( $input =~ /^\s*\+/ ) {
+ $sub = $#ldap_host + 1;
+
+ print "First, we need to have the hostname or the IP address where\n";
+ print "this LDAP server resides. Example: ldap.bigfoot.com\n";
+ print "hostname: ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $ldap_host[$sub] = $name;
+
+ print "\n";
+
+ print "Next, we need the server root (base dn). For this, an empty\n";
+ print "string is allowed.\n";
+ print "Example: ou=member_directory,o=netcenter.com\n";
+ print "base: ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $ldap_base[$sub] = $name;
+
+ print "\n";
+
+ print "This is the TCP/IP port number for the LDAP server. Default\n";
+ print "port is 389. This is optional. Press ENTER for default.\n";
+ print "port: ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $ldap_port[$sub] = $name;
+
+ print "\n";
+
+ print "This is the charset for the server. Default is utf-8. This\n";
+ print "is also optional. Press ENTER for default.\n";
+ print "charset: ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $ldap_charset[$sub] = $name;
+
+ print "\n";
+
+ print "This is the name for the server, used to tag the results of\n";
+ print "the search. Default it \"LDAP: hostname\". Press ENTER for default\n";
+ print "name: ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $ldap_name[$sub] = $name;
+
+ print "\n";
+
+ print "You can specify the maximum number of rows in the search result.\n";
+ print "Default value is equal to 250 rows. Press ENTER for default.\n";
+ print "maxrows: ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $ldap_maxrows[$sub] = $name;
+
+
+ print "\n";
+
+ print "If your LDAP server does not like anonymous logins, you can specify bind DN.\n";
+ print "Default is none, anonymous bind. Press ENTER for default.\n";
+ print "binddn: ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $ldap_binddn[$sub] = $name;
+
+ print "\n";
+
+ if ( $ldap_binddn[$sub] ne '' ) {
+
+ print "Now, please specify password for that DN.\n";
+ print "bindpw: ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $ldap_bindpw[$sub] = $name;
+
+ print "\n";
+ }
+
+ print "You can specify bind protocol version here.\n";
+ print "Default protocol version depends on your php ldap settings.\n";
+ print "Press ENTER for default.\n";
+ print "protocol: ";
+ $name = <STDIN>;
+ $name =~ s/[\r\n]//g;
+ $ldap_protocol[$sub] = $name;
+
+ print "\n";
+
+ print "This configuration section allows to set some rarely used\n";
+ print "options and options specific to some LDAP implementations.\n";
+ print "\n";
+ print "Do you want to set advanced LDAP directory settings? (y/N):";
+ $ldap_advanced_settings = <STDIN>;
+ if ( $ldap_advanced_settings =~ /^y\n/i ) {
+ $ldap_advanced_settings = 'true';
+ } else {
+ $ldap_advanced_settings = 'false';
+ }
+
+ if ($ldap_advanced_settings eq 'true') {
+ print "\n";
+
+ print "You can control LDAP directory listing here. This option can\n";
+ print "be useful if you run small LDAP server and want to provide listing\n";
+ print "of all addresses stored in LDAP to users of webmail interface.\n";
+ print "Number of displayed entries is limited by maxrows setting.\n";
+ print "\n";
+ print "Don't enable this option for public LDAP directories.\n";
+ print "\n";
+ print "Allow listing of LDAP directory? (y/N):";
+ $name = <STDIN>;
+ if ( $name =~ /^y\n/i ) {
+ $name = 'true';
+ } else {
+ $name = 'false';
+ }
+ $ldap_listing[$sub] = $name;
+
+ print "\n";
+
+ print "You can control write access to LDAP address book here. This option can\n";
+ print "be useful if you run small LDAP server and want to provide writable\n";
+ print "shared address book stored in LDAP to users of webmail interface.\n";
+ print "\n";
+ print "Don't enable this option for public LDAP directories.\n";
+ print "\n";
+ print "Allow writing to LDAP directory? (y/N):";
+ $name = <STDIN>;
+ if ( $name =~ /^y\n/i ) {
+ $name = 'true';
+ } else {
+ $name = 'false';
+ }
+ $ldap_writeable[$sub] = $name;
+
+ print "\n";
+
+ print "You can specify an additional search filter.\n";
+ print "This could be something like \"(objectclass=posixAccount)\".\n";
+ print "No filtering is performed by default. Press ENTER for default.\n";
+ print "filter: ";
+ $name = <STDIN>;
+ $name =~ s/[\r|\n]//g;
+ $ldap_filter[$sub] = $name;
+
+ print "\n";
+
+ print "You can control search scope here.\n";
+ print "This option is specific to Microsoft ADS implementation.\n";
+ print "It requires use of v3 or newer LDAP protocol.\n";
+ print "Don't enable it, if you use other LDAP server.\n";
+ print "\n";
+ print "Limit ldap scope? (y/N):";
+ $name = <STDIN>;
+ if ( $name =~ /^y\n/i ) {
+ $name = 'true';
+ } else {
+ $name = 'false';
+ }
+ $ldap_limit_scope[$sub] = $name;
+
+ print "\n";
+
+ print "You can control ldap search type here.\n";
+ print "Addresses can be searched in entire LDAP subtree (default)\n";
+ print "or only first level entries are returned.\n";
+ print "\n";
+ print "Search entire LDAP subtree? (Y/n):";
+ $name = <STDIN>;
+ if ( $name =~ /^n\n/i ) {
+ $name = 'false';
+ } else {
+ $name = 'true';
+ }
+ $ldap_search_tree[$sub] = $name;
+
+ print "\n";
+
+ print "You can control use of StartTLS on LDAP connection here.\n";
+ print "This option requires use of v3 or newer LDAP protocol and php 4.2+.\n";
+ print "\n";
+ print "Use StartTLS? (y/N):";
+ $name = <STDIN>;
+ if ( $name =~ /^y\n/i ) {
+ $name = 'true';
+ } else {
+ $name = 'false';
+ }
+ $ldap_starttls[$sub] = $name;
+ }
+ print "\n";
+
+ } elsif ( $input =~ /^\s*-\s*[0-9]?/ ) {
+ if ( $input =~ /[0-9]+\s*$/ ) {
+ $rem_num = $input;
+ $rem_num =~ s/^\s*-\s*//g;
+ $rem_num =~ s/\s*$//;
+ } else {
+ $rem_num = $#ldap_host;
+ }
+ $count = 0;
+ @new_ldap_host = ();
+ @new_ldap_base = ();
+ @new_ldap_port = ();
+ @new_ldap_name = ();
+ @new_ldap_charset = ();
+ @new_ldap_maxrows = ();
+ @new_ldap_filter = ();
+ @new_ldap_bindpw = ();
+ @new_ldap_binddn = ();
+ @new_ldap_protocol = ();
+ @new_ldap_limit_scope = ();
+ @new_ldap_listing = ();
+ @new_ldap_writeable = ();
+ @new_ldap_search_tree = ();
+ @new_ldap_starttls = ();
+
+ while ( $count <= $#ldap_host ) {
+ if ( $count != $rem_num ) {
+ @new_ldap_host = ( @new_ldap_host, $ldap_host[$count] );
+ @new_ldap_base = ( @new_ldap_base, $ldap_base[$count] );
+ @new_ldap_port = ( @new_ldap_port, $ldap_port[$count] );
+ @new_ldap_name = ( @new_ldap_name, $ldap_name[$count] );
+ @new_ldap_charset = ( @new_ldap_charset, $ldap_charset[$count] );
+ @new_ldap_maxrows = ( @new_ldap_maxrows, $ldap_maxrows[$count] );
+ @new_ldap_filter = ( @new_ldap_filter, $ldap_filter[$count] );
+ @new_ldap_binddn = ( @new_ldap_binddn, $ldap_binddn[$count] );
+ @new_ldap_bindpw = ( @new_ldap_bindpw, $ldap_bindpw[$count] );
+ @new_ldap_protocol = ( @new_ldap_protocol, $ldap_protocol[$count] );
+ @new_ldap_limit_scope = ( @new_ldap_limit_scope, $ldap_limit_scope[$count] );
+ @new_ldap_listing = ( @new_ldap_listing, $ldap_listing[$count] );
+ @new_ldap_writeable = ( @new_ldap_writeable, $ldap_writeable[$count] );
+ @new_ldap_search_tree = ( @new_ldap_search_tree, $ldap_search_tree[$count] );
+ @new_ldap_starttls = ( @new_ldap_starttls, $ldap_starttls[$count] );
+ }
+ $count++;
+ }
+ @ldap_host = @new_ldap_host;
+ @ldap_base = @new_ldap_base;
+ @ldap_port = @new_ldap_port;
+ @ldap_name = @new_ldap_name;
+ @ldap_charset = @new_ldap_charset;
+ @ldap_maxrows = @new_ldap_maxrows;
+ @ldap_filter = @new_ldap_filter;
+ @ldap_binddn = @new_ldap_binddn;
+ @ldap_bindpw = @new_ldap_bindpw;
+ @ldap_protocol = @new_ldap_protocol;
+ @ldap_limit_scope = @new_ldap_limit_scope;
+ @ldap_listing = @new_ldap_listing;
+ @ldap_writeable = @new_ldap_writeable;
+ @ldap_search_tree = @new_ldap_search_tree;
+ @ldap_starttls = @new_ldap_starttls;
+
+ } elsif ( $input =~ /^\s*\?\s*/ ) {
+ print ".-------------------------.\n";
+ print "| + (add host) |\n";
+ print "| - N (remove host) |\n";
+ print "| l (list hosts) |\n";
+ print "| d (done) |\n";
+ print "`-------------------------'\n";
+ }
+ print "[ldap] command (?=help) > ";
+ $input = <STDIN>;
+ $input =~ s/[\r\n]//g;
+ }
+}
+
+sub command62 {
+ print "Some of our developers have come up with very good javascript interface\n";
+ print "for searching through address books, however, our original goals said\n";
+ print "that we would be 100% HTML. In order to make it possible to use their\n";
+ print "interface, and yet stick with our goals, we have also written a plain\n";
+ print "HTML version of the search. Here, you can choose which version to use.\n";
+ print "\n";
+ print "This is just the default value. It is also a user option that each\n";
+ print "user can configure individually\n";
+ print "\n";
+
+ if ( lc($default_use_javascript_addr_book) eq 'true' ) {
+ $default_value = "y";
+ } else {
+ $default_use_javascript_addr_book = 'false';
+ $default_value = "n";
+ }
+ print "Use javascript version by default (y/n) [$WHT$default_value$NRM]: $WHT";
+ $new_show = <STDIN>;
+ if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+ $default_use_javascript_addr_book = 'true';
+ } else {
+ $default_use_javascript_addr_book = 'false';
+ }
+ return $default_use_javascript_addr_book;
+}
+
+# global filebased address book
+sub command63 {
+ print "If you want to use global file address book, then you\n";
+ print "must set this option to a valid value. If option does\n";
+ print "not have path elements, system assumes that file is\n";
+ print "stored in data directory. If relative path is set, it is\n";
+ print "relative to main SquirrelMail directory. If value is empty,\n";
+ print "address book is not enabled.\n";
+ print "\n";
+
+ print "[$WHT$abook_global_file$NRM]: $WHT";
+ $new_abook_global_file = <STDIN>;
+ if ( $new_abook_global_file eq "\n" ) {
+ $new_abook_global_file = $abook_global_file;
+ } else {
+ $new_abook_global_file =~ s/[\r\n]//g;
+ }
+ return $new_abook_global_file;
+}
+
+# writing into global filebased abook control
+sub command64 {
+ print "This setting controls writing into global file address\n";
+ print "book options. Address book file must be writeable by\n";
+ print "webserver's user, if you want to enable this option.\n";
+ print "\n";
+
+ if ( lc($abook_global_file_writeable) eq 'true' ) {
+ $default_value = "y";
+ } else {
+ $abook_global_file_writeable = 'false';
+ $default_value = "n";
+ }
+ print "Allow writing into global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
+ $new_show = <STDIN>;
+ if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+ $abook_global_file_writeable = 'true';
+ } else {
+ $abook_global_file_writeable = 'false';
+ }
+ return $abook_global_file_writeable;
+}
+
+# listing of global filebased abook control
+sub command65 {
+ print "This setting controls listing of global file address\n";
+ print "book in addresses page.\n";
+ print "\n";
+
+ if ( lc($abook_global_file_listing) eq 'true' ) {
+ $default_value = "y";
+ } else {
+ $abook_global_file_listing = 'false';
+ $default_value = "n";
+ }
+ print "Allow listing of global file address book (y/n) [$WHT$default_value$NRM]: $WHT";
+ $new_show = <STDIN>;
+ if ( ( $new_show =~ /^y\n/i ) || ( ( $new_show =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+ $abook_global_file_listing = 'true';
+ } else {
+ $abook_global_file_listing = 'false';
+ }
+ return $abook_global_file_listing;
+}
+
+sub command91 {
+ print "If you want to store your users address book details in a database then\n";
+ print "you need to set this DSN to a valid value. The format for this is:\n";
+ print "mysql://user:pass\@hostname/dbname\n";
+ print "Where mysql can be one of the databases PHP supports, the most common\n";
+ print "of these are mysql, msql and pgsql\n";
+ print "If the DSN is left empty (hit space and then return) the database\n";
+ print "related code for address books will not be used\n";
+ print "\n";
+
+ if ( $addrbook_dsn eq "" ) {
+ $default_value = "Disabled";
+ } else {
+ $default_value = $addrbook_dsn;
+ }
+ print "[$WHT$addrbook_dsn$NRM]: $WHT";
+ $new_dsn = <STDIN>;
+ if ( $new_dsn eq "\n" ) {
+ $new_dsn = "";
+ } else {
+ $new_dsn =~ s/[\r\n]//g;
+ $new_dsn =~ s/^\s+$//g;
+ }
+ return $new_dsn;
+}
+
+sub command92 {
+ print "This is the name of the table you want to store the address book\n";
+ print "data in, it defaults to 'address'\n";
+ print "\n";
+ print "[$WHT$addrbook_table$NRM]: $WHT";
+ $new_table = <STDIN>;
+ if ( $new_table eq "\n" ) {
+ $new_table = $addrbook_table;
+ } else {
+ $new_table =~ s/[\r\n]//g;
+ }
+ return $new_table;
+}
+
+sub command93 {
+ print "If you want to store your users preferences in a database then\n";
+ print "you need to set this DSN to a valid value. The format for this is:\n";
+ print "mysql://user:pass\@hostname/dbname\n";
+ print "Where mysql can be one of the databases PHP supports, the most common\n";
+ print "of these are mysql, msql and pgsql\n";
+ print "If the DSN is left empty (hit space and then return) the database\n";
+ print "related code for address books will not be used\n";
+ print "\n";
+
+ if ( $prefs_dsn eq "" ) {
+ $default_value = "Disabled";
+ } else {
+ $default_value = $prefs_dsn;
+ }
+ print "[$WHT$prefs_dsn$NRM]: $WHT";
+ $new_dsn = <STDIN>;
+ if ( $new_dsn eq "\n" ) {
+ $new_dsn = "";
+ } else {
+ $new_dsn =~ s/[\r\n]//g;
+ $new_dsn =~ s/^\s+$//g;
+ }
+ return $new_dsn;
+}
+
+sub command94 {
+ print "This is the name of the table you want to store the preferences\n";
+ print "data in, it defaults to 'userprefs'\n";
+ print "\n";
+ print "[$WHT$prefs_table$NRM]: $WHT";
+ $new_table = <STDIN>;
+ if ( $new_table eq "\n" ) {
+ $new_table = $prefs_table;
+ } else {
+ $new_table =~ s/[\r\n]//g;
+ }
+ return $new_table;
+}
+
+sub command95 {
+ print "This is the name of the field in which you want to store the\n";
+ print "username of the person the prefs are for. It default to 'user'\n";
+ print "which clashes with a reserved keyword in PostgreSQL so this\n";
+ print "will need to be changed for that database at least\n";
+ print "\n";
+ print "[$WHT$prefs_user_field$NRM]: $WHT";
+ $new_field = <STDIN>;
+ if ( $new_field eq "\n" ) {
+ $new_field = $prefs_user_field;
+ } else {
+ $new_field =~ s/[\r\n]//g;
+ }
+ $prefs_user_size = db_pref_size($prefs_user_size);
+ return $new_field;
+}
+
+sub command96 {
+ print "This is the name of the field in which you want to store the\n";
+ print "preferences keyword. It defaults to 'prefkey'\n";
+ print "\n";
+ print "[$WHT$prefs_key_field$NRM]: $WHT";
+ $new_field = <STDIN>;
+ if ( $new_field eq "\n" ) {
+ $new_field = $prefs_key_field;
+ } else {
+ $new_field =~ s/[\r\n]//g;
+ }
+ $prefs_key_size = db_pref_size($prefs_key_size);
+ return $new_field;
+}
+
+sub command97 {
+ print "This is the name of the field in which you want to store the\n";
+ print "preferences value. It defaults to 'prefval'\n";
+ print "\n";
+ print "[$WHT$prefs_val_field$NRM]: $WHT";
+ $new_field = <STDIN>;
+ if ( $new_field eq "\n" ) {
+ $new_field = $prefs_val_field;
+ } else {
+ $new_field =~ s/[\r\n]//g;
+ }
+ $prefs_val_size = db_pref_size($prefs_val_size);
+ return $new_field;
+}
+
+# routine is used to set database field limits
+# it needs one argument
+sub db_pref_size() {
+ my ($size) = $_[0];
+ print "\nDatabase fields have size limits.\n";
+ print "\n";
+ print "What limit is set for this field? [$WHT$size$NRM]: $WHT";
+ $new_size = <STDIN>;
+ if ( $new_size eq "\n" ) {
+ $new_size = $size;
+ } else {
+ $new_size =~ s/[\r\n]//g;
+ }
+ return $new_size;
+}
+
+sub command98 {
+ print "If you want to store your global address book in a database then\n";
+ print "you need to set this DSN to a valid value. The format for this is:\n";
+ print "mysql://user:pass\@hostname/dbname\n";
+ print "Where mysql can be one of the databases PHP supports, the most common\n";
+ print "of these are mysql, msql and pgsql\n";
+ print "If the DSN is left empty (hit space and then return) the database\n";
+ print "related code for global SQL address book will not be used\n";
+ print "\n";
+
+ if ( $addrbook_global_dsn eq "" ) {
+ $default_value = "Disabled";
+ } else {
+ $default_value = $addrbook_global_dsn;
+ }
+ print "[$WHT$addrbook_global_dsn$NRM]: $WHT";
+ $new_dsn = <STDIN>;
+ if ( $new_dsn eq "\n" ) {
+ $new_dsn = "";
+ } else {
+ $new_dsn =~ s/[\r\n]//g;
+ $new_dsn =~ s/^\s+$//g;
+ }
+ return $new_dsn;