* template set selection support
[squirrelmail.git] / config / conf.pl
index aecec45af72e127fc73616ac8bcec38a340e551a..c36f3bed2a977989e292220c898b3a0605120584 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/env perl
 # conf.pl
 #
-# Copyright (c) 1999-2005 The SquirrelMail Project Team
+# Copyright (c) 1999-2006 The SquirrelMail Project Team
 # Licensed under the GNU GPL. For full terms see COPYING.
 #
 # A simple configure script to configure SquirrelMail
@@ -197,6 +197,12 @@ while ( $line = <FILE> ) {
             } else {
                $plugins[$sub] = $options[1];
             }
+        } elsif ($options[0] =~ /^fontsets\[\'[a-z]*\'\]/) {
+            # parse associative $fontsets array
+            $sub = $options[0];
+            $sub =~ s/\'\]//;
+            $sub =~ s/^fontsets\[\'//;
+            $fontsets{$sub} = $options[1];
         } elsif ( $options[0] =~ /^ldap_server\[[0-9]+\]/ ) {
             $sub = $options[0];
             $sub =~ s/\]//;
@@ -337,13 +343,17 @@ $imap_auth_mech = 'login'               if ( !$imap_auth_mech );
 $session_name = 'SQMSESSID'             if ( !$session_name );
 $skip_SM_header = 'false'               if ( !$skip_SM_header );
 $default_use_javascript_addr_book = 'false' if (! $default_use_javascript_addr_book);
+
 # since 1.5.0
 $show_alternative_names = 'false'       if ( !$show_alternative_names );
-$available_languages = 'all'            if ( !$available_languages );
+# $available_languages option available only in 1.5.0. removed due to $languages
+# implementation changes. options are provided by limit_languages plugin
+# $available_languages = 'all'            if ( !$available_languages );
 $aggressive_decoding = 'false'          if ( !$aggressive_decoding );
 $advanced_tree = 'false'                if ( !$advanced_tree );
 $use_php_recode = 'false'               if ( !$use_php_recode );
 $use_php_iconv = 'false'                if ( !$use_php_iconv );
+
 # since 1.5.1
 $use_icons = 'false'                    if ( !$use_icons );
 $use_iframe = 'false'                   if ( !$use_iframe );
@@ -358,6 +368,27 @@ $abook_global_file_listing = 'true'     if ( !$abook_global_file_listing );
 $encode_header_key = ''                 if ( !$encode_header_key );
 $hide_auth_header = 'false'             if ( !$hide_auth_header );
 $time_zone_type = '0'                   if ( !$time_zone_type );
+$prefs_user_size = 128                  if ( !$prefs_user_size );
+$prefs_key_size = 64                    if ( !$prefs_key_size );
+$prefs_val_size = 65536                 if ( !$prefs_val_size );
+
+# add qmail-inject test here for backwards compatibility
+if ( !$sendmail_args && $sendmail_path =~ /qmail-inject/ ) { 
+    $sendmail_args = '';
+} elsif ( !$sendmail_args ) {
+    $sendmail_args = '-i -t';
+}
+
+$default_fontsize = ''                  if ( !$default_fontsize);
+$default_fontset = ''                   if ( !$default_fontset);
+if ( !%fontsets) {
+    %fontsets = ('serif',     'serif',
+                 'sans',      'helvetica,arial,sans-serif',
+                 'comicsans', 'comic sans ms,sans-serif',
+                 'tahoma',    'tahoma,sans-serif',
+                 'verasans',  'bitstream vera sans,verdana,sans-serif');
+}
+
 
 if ( $ARGV[0] eq '--install-plugin' ) {
     print "Activating plugin " . $ARGV[1] . "\n";
@@ -451,7 +482,8 @@ while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
           if ( lc($useSendmail) eq 'true' ) {
             print $WHT . "Sendmail" . $NRM . "\n--------\n";
             print "4.   Sendmail Path         : $WHT$sendmail_path$NRM\n";
-            print "5.   Header encryption key : $WHT$encode_header_key$NRM\n";
+            print "5.   Sendmail arguments    : $WHT$sendmail_args$NRM\n";
+            print "6.   Header encryption key : $WHT$encode_header_key$NRM\n";
             print "\n";
           } else {
             print $WHT . "SMTP Settings" . $NRM . "\n-------------\n";
@@ -542,6 +574,8 @@ while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
                    $theme_name[($count*2)+1];
         }
         print "2.  CSS File : $WHT$theme_css$NRM\n";
+        print "3.  Default font size: $WHT$default_fontsize$NRM\n";
+        print "4.  Change available font sets\n";
         print "\n";
         print "R   Return to Main Menu\n";
     } elsif ( $menu == 6 ) {
@@ -606,9 +640,9 @@ while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
         print "\n";
         print "3.  DSN for Preferences    : $WHT$prefs_dsn$NRM\n";
         print "4.  Table for Preferences  : $WHT$prefs_table$NRM\n";
-        print "5.  Field for username     : $WHT$prefs_user_field$NRM\n";
-        print "6.  Field for prefs key    : $WHT$prefs_key_field$NRM\n";
-        print "7.  Field for prefs value  : $WHT$prefs_val_field$NRM\n";
+        print "5.  Field for username     : $WHT$prefs_user_field$NRM ($prefs_user_size)\n";
+        print "6.  Field for prefs key    : $WHT$prefs_key_field$NRM ($prefs_key_size)\n";
+        print "7.  Field for prefs value  : $WHT$prefs_val_field$NRM ($prefs_val_size)\n";
         print "\n";
         print "8.  DSN for Global Address Book            : $WHT$addrbook_global_dsn$NRM\n";
         print "9.  Table for Global Address Book          : $WHT$addrbook_global_table$NRM\n";
@@ -621,9 +655,8 @@ while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
     print "1.  Default Language                : $WHT$squirrelmail_default_language$NRM\n";
     print "2.  Default Charset                 : $WHT$default_charset$NRM\n";
     print "3.  Show alternative language names : $WHT$show_alternative_names$NRM\n";
-    print "4.  Available languages             : $WHT$available_languages$NRM\n";
-    print "5.  Enable aggressive decoding      : $WHT$aggressive_decoding$NRM\n";
-    print "6.  Enable lossy encoding           : $WHT$lossy_encoding$NRM\n";
+    print "4.  Enable aggressive decoding      : $WHT$aggressive_decoding$NRM\n";
+    print "5.  Enable lossy encoding           : $WHT$lossy_encoding$NRM\n";
     print "\n";
         print "R   Return to Main Menu\n";
     } elsif ( $menu == 11 ) {
@@ -717,7 +750,8 @@ while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
               elsif ( $command == 9 )  { $optional_delimiter     = command111(); }
             } elsif ( $show_smtp_settings && lc($useSendmail) eq 'true' ) {
               if    ( $command == 4 )  { $sendmail_path          = command15(); }
-              elsif ( $command == 5 )  { $encode_header_key      = command114(); }
+              elsif ( $command == 5 )  { $sendmail_args          = command_sendmail_args(); }
+              elsif ( $command == 6 )  { $encode_header_key      = command114(); }
             } elsif ( $show_smtp_settings ) {
               if    ( $command == 4 )  { $smtpServerAddress      = command16(); }
               elsif ( $command == 5 )  { $smtpPort               = command17(); }
@@ -764,6 +798,8 @@ while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
         } elsif ( $menu == 5 ) {
             if ( $command == 1 ) { command41(); }
             elsif ( $command == 2 ) { $theme_css = command42(); }
+            elsif ( $command == 3 ) { $default_fontsize = command_default_fontsize(); }
+            elsif ( $command == 4 ) { command_fontsets(); }
         } elsif ( $menu == 6 ) {
             if    ( $command == 1 ) { command61(); }
             elsif ( $command == 2 ) { command62(); }
@@ -788,11 +824,10 @@ while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) {
             elsif ( $command == 11 ) { $addrbook_global_listing  = command911(); }
         } elsif ( $menu == 10 ) {
             if    ( $command == 1 ) { $squirrelmail_default_language = commandA1(); }
-            elsif ( $command == 2 ) { $default_charset           = commandA2(); }
+            elsif ( $command == 2 ) { $default_charset               = commandA2(); }
             elsif ( $command == 3 ) { $show_alternative_names        = commandA3(); }
-            elsif ( $command == 4 ) { $available_languages         = commandA4(); }
-            elsif ( $command == 5 ) { $aggressive_decoding         = commandA5(); }
-            elsif ( $command == 6 ) { $lossy_encoding         = commandA6(); }
+            elsif ( $command == 4 ) { $aggressive_decoding           = commandA4(); }
+            elsif ( $command == 5 ) { $lossy_encoding                = commandA5(); }
         } elsif ( $menu == 11 ) {
             if    ( $command == 1 ) { $advanced_tree  = commandB1(); }
             if    ( $command == 2 ) { $use_iframe     = commandB2(); }
@@ -1040,9 +1075,6 @@ sub command14 {
 
 # sendmail_path
 sub command15 {
-    if ( $sendmail_path[0] !~ /./ ) {
-        $sendmail_path = "/usr/sbin/sendmail";
-    }
     print "Specify where the sendmail executable is located.  Usually /usr/sbin/sendmail\n";
     print "[$WHT$sendmail_path$NRM]: $WHT";
     $new_sendmail_path = <STDIN>;
@@ -1054,6 +1086,27 @@ sub command15 {
     return $new_sendmail_path;
 }
 
+# Extra sendmail arguments
+sub command_sendmail_args {
+    print "Specify additional sendmail program arguments.\n";
+    print "\n";
+    print "Make sure that arguments are supported by your sendmail program. -f argument \n";
+    print "is added automatically by SquirrelMail scripts. Variable defaults to standard\n";
+    print "/usr/sbin/sendmail arguments. If you use qmail-inject, nbsmtp or any other \n";
+    print "sendmail wrapper, which does not support -i and -t arguments, set variable to\n";
+    print "empty string or use arguments suitable for your mailer.\n"; 
+    print "\n";
+    print "[$WHT$sendmail_args$NRM]: $WHT";
+    $new_sendmail_args = <STDIN>;
+    if ( $new_sendmail_args eq "\n" ) {
+        $new_sendmail_args = $sendmail_args;
+    } else {
+        # strip linefeeds and crs.
+        $new_sendmail_args =~ s/[\r\n]//g;
+    }
+    return trim($new_sendmail_args);
+}
+
 # smtpServerAddress
 sub command16 {
     print "This is the hostname of your SMTP server.\n";
@@ -1425,7 +1478,7 @@ sub command71 {
             $line =~ s/  /\&nbsp;\&nbsp;/g;
             $line =~ s/\t/\&nbsp;\&nbsp;\&nbsp;\&nbsp;/g;
             $line =~ s/$/ /;
-            $line =~ s/\"/&quot;/g;
+            $line =~ s/\"/\\\"/g;
 
             $new_motd = $new_motd . $line;
         }
@@ -1921,9 +1974,10 @@ sub command216 {
 # Data directory
 sub command33a {
     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 "It doesn't matter.  Here are two examples:\n";
-    print "  Absolute:    /var/spool/data/\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";
@@ -1952,9 +2006,9 @@ sub command33a {
 # Attachment directory
 sub command33b {
     print "Path to directory used for storing attachments while a mail is\n";
-    print "being sent. The path name can be absolute or relative (to the config directory).\n";
-    print "It doesn't matter.  Here are two examples:\n";
-    print "  Absolute:    /var/spool/attach/\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";
@@ -2116,10 +2170,15 @@ sub command39 {
 
 
 sub command310 {
-    print "This allows you to prevent the editing of the user's name and ";
-    print "email address. This is mainly useful when used with the ";
-    print "retrieveuserdata plugin\n";
-    print "\n";
+    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";
@@ -2131,7 +2190,7 @@ sub command310 {
     if ( ( $new_edit =~ /^y\n/i ) || ( ( $new_edit =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
         $edit_identity = 'true';
         $edit_name = 'true';
-        $hide_auth_header = 'false';
+        $hide_auth_header = command311b();
     } else {
         $edit_identity = 'false';
         $edit_name = command311();
@@ -2141,17 +2200,17 @@ sub command310 {
 }
 
 sub command311 {
-    print "As a follow-up, this option allows you to choose if the user ";
-    print "can edit their full name even when you don't want them to ";
-    print "change their username\n";
-    print "\n";
+    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 editing of the users full name? (y/n) [$WHT$default_value$NRM]: $WHT";
+    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';
@@ -2162,16 +2221,19 @@ sub command311 {
 }
 
 sub command311b {
-    print "SquirrelMail adds username information to every sent email.";
-    print "It is done in order to prevent possible sender forging when ";
-    print "end users are allowed to change their email and name ";
-    print "information.\n";
-    print "\n";
-    print "You can disable this header, if you think that it violates ";
-    print "user's privacy or security. Please note, that setting will ";
-    print "work only when users are not allowed to change their identity.\n";
-    print "\n";
-
+    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 {
@@ -2184,7 +2246,7 @@ sub command311b {
     } else {
         $hide_auth_header = "false";
     }
-    return $edit_name;
+    return $hide_auth_header;
 }
 
 sub command312 {
@@ -2478,6 +2540,89 @@ sub command42 {
     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) > ";
@@ -2963,6 +3108,7 @@ sub command95 {
     } else {
         $new_field =~ s/[\r\n]//g;
     }
+    $prefs_user_size = db_pref_size($prefs_user_size);
     return $new_field;
 }
 
@@ -2977,6 +3123,7 @@ sub command96 {
     } else {
         $new_field =~ s/[\r\n]//g;
     }
+    $prefs_key_size = db_pref_size($prefs_key_size);
     return $new_field;
 }
 
@@ -2991,9 +3138,26 @@ sub command97 {
     } 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";
@@ -3110,9 +3274,8 @@ sub commandA2 {
 # Alternative language names
 sub commandA3 {
     print "Enable this option if you want to see localized language names in\n";
-    print "language selection box. Note, that if don't limit list of available\n";
-    print "languages, this option can trigger installation of foreign language\n";
-    print "support modules in some browsers.\n";
+    print "language selection box. Note, that this option can trigger\n";
+    print "installation of foreign language support modules in some browsers.\n";
     print "\n";
 
     if ( lc($show_alternative_names) eq 'true' ) {
@@ -3129,30 +3292,9 @@ sub commandA3 {
     }
     return $show_alternative_names;
 }
-# Available languages
-sub commandA4 {
-    print "This option allows to limit number of languages available in\n";
-    print "language selection box. You can enter as code of every language that\n";
-    print "you want to enable. Language codes should be separated by space. If you\n";
-    print "enter name unsupported by SquirrelMail, it will be ignored. If you enter\n";
-    print "special key \'all\' - all languages available in SquirrelMail will be\n";
-    print "listed. If you enter special key \'none\' - user won't be able to change";
-    print "language and interface will use language set it \"Default language\" option.\n";
-    print "\n";
-    print "You can find valid language names in doc/i18n.txt.\n";
-    print "\n";
-    print "[$WHT$available_languages$NRM]: $WHT";
-    $new_available_languages = <STDIN>;
-    if ( $new_available_languages eq "\n" ) {
-        $new_available_languages = $available_languages;
-    } else {
-        $new_available_languages =~ s/[\r\n]//g;
-        $new_available_languages =~ s/^\s+$//g;
-    }
-    return $new_available_languages;
-}
+
 # Aggressive decoding
-sub commandA5 {
+sub commandA4 {
     print "Enable this option if you want to use CPU and memory intensive decoding\n";
     print "functions. This option allows reading multibyte charset, that are used\n";
     print "in Eastern Asia. SquirrelMail will try to use recode functions here,\n";
@@ -3175,7 +3317,7 @@ sub commandA5 {
 }
 
 # Lossy encoding
-sub commandA6 {
+sub commandA5 {
     print "Enable this option if you want to allow lossy charset encoding in message\n";
     print "composition pages. This option allows charset conversions when output\n";
     print "charset does not support all symbols used in original charset. Symbols\n";
@@ -3391,8 +3533,6 @@ sub save_data {
         print CF "\$default_charset          = '$default_charset';\n";
         # boolean
         print CF "\$show_alternative_names   = $show_alternative_names;\n";
-        # string
-        print CF "\$available_languages   = '$available_languages';\n";
         # boolean
         print CF "\$aggressive_decoding   = $aggressive_decoding;\n";
         # boolean
@@ -3413,6 +3553,8 @@ sub save_data {
         print CF "\$smtpPort               = $smtpPort;\n";
         # string
         print CF "\$sendmail_path          = '$sendmail_path';\n";
+        # string
+        print CF "\$sendmail_args          = '$sendmail_args';\n";
         # boolean
 #        print CF "\$use_authenticated_smtp = $use_authenticated_smtp;\n";
         # boolean
@@ -3427,89 +3569,89 @@ sub save_data {
         print CF "\$encode_header_key      = '$encode_header_key';\n";
         print CF "\n";
 
-    # string
+        # string
         print CF "\$default_folder_prefix          = '$default_folder_prefix';\n";
-    # string
+        # string
         print CF "\$trash_folder                   = '$trash_folder';\n";
-    # string
+        # string
         print CF "\$sent_folder                    = '$sent_folder';\n";
-    # string
+        # string
         print CF "\$draft_folder                   = '$draft_folder';\n";
-    # boolean
+        # boolean
         print CF "\$default_move_to_trash          = $default_move_to_trash;\n";
-    # boolean
+        # boolean
         print CF "\$default_move_to_sent           = $default_move_to_sent;\n";
-    # boolean
+        # boolean
         print CF "\$default_save_as_draft          = $default_save_as_draft;\n";
-    # boolean
+        # boolean
         print CF "\$show_prefix_option             = $show_prefix_option;\n";
-    # boolean
+        # boolean
         print CF "\$list_special_folders_first     = $list_special_folders_first;\n";
-    # boolean
+        # boolean
         print CF "\$use_special_folder_color       = $use_special_folder_color;\n";
-    # boolean
+        # boolean
         print CF "\$auto_expunge                   = $auto_expunge;\n";
-    # boolean
+        # boolean
         print CF "\$default_sub_of_inbox           = $default_sub_of_inbox;\n";
-    # boolean
+        # boolean
         print CF "\$show_contain_subfolders_option = $show_contain_subfolders_option;\n";
-    # integer
+        # integer
         print CF "\$default_unseen_notify          = $default_unseen_notify;\n";
-    # integer
+        # integer
         print CF "\$default_unseen_type            = $default_unseen_type;\n";
-    # boolean
+        # boolean
         print CF "\$auto_create_special            = $auto_create_special;\n";
-    # boolean
+        # boolean
         print CF "\$delete_folder                  = $delete_folder;\n";
-    # boolean
+        # boolean
         print CF "\$noselect_fix_enable            = $noselect_fix_enable;\n";
 
         print CF "\n";
 
-    # string
+        # string
         print CF "\$data_dir                 = " . &change_to_SM_path($data_dir) . ";\n";
-    # string that can contain a variable
+        # string that can contain a variable
         print CF "\$attachment_dir           = " . &change_to_SM_path($attachment_dir) . ";\n";
-    # integer
+        # integer
         print CF "\$dir_hash_level           = $dir_hash_level;\n";
-    # string
+        # string
         print CF "\$default_left_size        = '$default_left_size';\n";
-    # boolean
+        # boolean
         print CF "\$force_username_lowercase = $force_username_lowercase;\n";
-    # boolean
+        # boolean
         print CF "\$default_use_priority     = $default_use_priority;\n";
-    # boolean
+        # boolean
         print CF "\$hide_sm_attributions     = $hide_sm_attributions;\n";
-    # boolean
+        # boolean
         print CF "\$default_use_mdn          = $default_use_mdn;\n";
-    # boolean
+        # boolean
         print CF "\$edit_identity            = $edit_identity;\n";
-    # boolean
+        # boolean
         print CF "\$edit_name                = $edit_name;\n";
-    # boolean
+        # boolean
         print CF "\$hide_auth_header         = $hide_auth_header;\n";
-    # boolean
+        # boolean
         print CF "\$allow_thread_sort        = $allow_thread_sort;\n";
-    # boolean
+        # boolean
         print CF "\$allow_server_sort        = $allow_server_sort;\n";
-    # boolean
+        # boolean
         print CF "\$allow_charset_search     = $allow_charset_search;\n";
-    # integer
+        # integer
         print CF "\$allow_advanced_search    = $allow_advanced_search;\n";
         print CF "\n";
         # integer
         print CF "\$time_zone_type           = $time_zone_type;\n";
         print CF "\n";
 
-    # all plugins are strings
+        # all plugins are strings
         for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
             print CF "\$plugins[] = '$plugins[$ct]';\n";
         }
         print CF "\n";
 
-    # strings
+        # strings
         print CF "\$theme_css = " . &change_to_SM_path($theme_css) . ";\n";
-    if ( $theme_default eq '' ) { $theme_default = '0'; }
+        if ( $theme_default eq '' ) { $theme_default = '0'; }
         print CF "\$theme_default = $theme_default;\n";
 
         for ( $count = 0 ; $count <= $#theme_name ; $count++ ) {
@@ -3522,33 +3664,45 @@ sub save_data {
         }
         print CF "\n";
 
+        # integer
+        print CF "\$default_fontsize = '$default_fontsize';\n";
+        # string
+        print CF "\$default_fontset = '$default_fontset';\n";
+        print CF "\n";
+        # assoc. array (maybe initial value should be set somewhere else)
+        print CF '$fontsets = array();'."\n";
+        while (($fontset_name, $fontset_value) = each(%fontsets)) {
+            print CF "\$fontsets\['$fontset_name'\] = '$fontset_value';\n";
+        }
+        print CF "\n";
+
         ## Address books
         # boolean
         print CF "\$default_use_javascript_addr_book = $default_use_javascript_addr_book;\n";
         for ( $count = 0 ; $count <= $#ldap_host ; $count++ ) {
             print CF "\$ldap_server[$count] = array(\n";
-        # string
+            # string
             print CF "    'host' => '$ldap_host[$count]',\n";
-        # string
+            # string
             print CF "    'base' => '$ldap_base[$count]'";
             if ( $ldap_name[$count] ) {
                 print CF ",\n";
-        # string
+                # string
                 print CF "    'name' => '$ldap_name[$count]'";
             }
             if ( $ldap_port[$count] ) {
                 print CF ",\n";
-        # integer
+                # integer
                 print CF "    'port' => $ldap_port[$count]";
             }
             if ( $ldap_charset[$count] ) {
                 print CF ",\n";
-        # string
+                # string
                 print CF "    'charset' => '$ldap_charset[$count]'";
             }
             if ( $ldap_maxrows[$count] ) {
                 print CF ",\n";
-        # integer
+                # integer
                 print CF "    'maxrows' => $ldap_maxrows[$count]";
             }
             # string
@@ -3596,69 +3750,75 @@ sub save_data {
             print CF "\n";
         }
 
-    # string
+        # string
         print CF "\$addrbook_dsn = '$addrbook_dsn';\n";
-    # string
+        # string
         print CF "\$addrbook_table = '$addrbook_table';\n\n";
-    # string
+        # string
         print CF "\$prefs_dsn = '$prefs_dsn';\n";
-    # string
+        # string
         print CF "\$prefs_table = '$prefs_table';\n";
-    # string
+        # string
         print CF "\$prefs_user_field = '$prefs_user_field';\n";
-    # string
+        # integer
+        print CF "\$prefs_user_size = $prefs_user_size;\n";
+        # string
         print CF "\$prefs_key_field = '$prefs_key_field';\n";
-    # string
-        print CF "\$prefs_val_field = '$prefs_val_field';\n\n";
-    # string
+        # integer
+        print CF "\$prefs_key_size = $prefs_key_size;\n";
+        # string
+        print CF "\$prefs_val_field = '$prefs_val_field';\n";
+        # integer
+        print CF "\$prefs_val_size = $prefs_val_size;\n\n";
+        # string
         print CF "\$addrbook_global_dsn = '$addrbook_global_dsn';\n";
-    # string
+        # string
         print CF "\$addrbook_global_table = '$addrbook_global_table';\n";
-    # boolean
+        # boolean
         print CF "\$addrbook_global_writeable = $addrbook_global_writeable;\n";
-    # boolean
+        # boolean
         print CF "\$addrbook_global_listing = $addrbook_global_listing;\n\n";
-    # string
+        # string
         print CF "\$abook_global_file = '$abook_global_file';\n";
-    # boolean
+        # boolean
         print CF "\$abook_global_file_writeable = $abook_global_file_writeable;\n\n";
-    # boolean
+        # boolean
         print CF "\$abook_global_file_listing = $abook_global_file_listing;\n\n";
-    # boolean
+        # boolean
         print CF "\$no_list_for_subscribe = $no_list_for_subscribe;\n";
 
-    # string
+        # string
         print CF "\$smtp_auth_mech = '$smtp_auth_mech';\n";
-    # string
+        # string
         print CF "\$imap_auth_mech = '$imap_auth_mech';\n";
-    # boolean
+        # boolean
         print CF "\$use_imap_tls = $use_imap_tls;\n";
-    # boolean
+        # boolean
         print CF "\$use_smtp_tls = $use_smtp_tls;\n";
-    # string
+        # string
         print CF "\$session_name = '$session_name';\n";
 
-    print CF "\n";
-
-    # boolean
-    print CF "\$advanced_tree = $advanced_tree;\n";
-    print CF "\n";
-    # boolean
-    print CF "\$use_iframe = $use_iframe;\n";
-    print CF "\n";
-    # boolean
-    print CF "\$use_icons = $use_icons;\n";
-    print CF "\n";
-    # boolean
-    print CF "\$use_php_recode = $use_php_recode;\n";
-    print CF "\n";
-    # boolean
-    print CF "\$use_php_iconv = $use_php_iconv;\n";
-    print CF "\n";
-    # boolean
-    print CF "\$allow_remote_configtest = $allow_remote_configtest;\n";
-    print CF "\n";
+        print CF "\n";
 
+        # boolean
+        print CF "\$advanced_tree = $advanced_tree;\n";
+        print CF "\n";
+        # boolean
+        print CF "\$use_iframe = $use_iframe;\n";
+        print CF "\n";
+        # boolean
+        print CF "\$use_icons = $use_icons;\n";
+        print CF "\n";
+        # boolean
+        print CF "\$use_php_recode = $use_php_recode;\n";
+        print CF "\n";
+        # boolean
+        print CF "\$use_php_iconv = $use_php_iconv;\n";
+        print CF "\n";
+        # boolean
+        print CF "\$allow_remote_configtest = $allow_remote_configtest;\n";
+        print CF "\n";
+        
         print CF "\@include SM_PATH . 'config/config_local.php';\n";
 
         print CF "\n/**\n";
@@ -3699,6 +3859,7 @@ sub set_defaults {
     $continue = 0;
     while ( $continue != 1 ) {
         print "Please select your IMAP server:\n";
+        print "    bincimap    = Binc IMAP server\n";
         print "    courier     = Courier IMAP server\n";
         print "    cyrus       = Cyrus IMAP server\n";
         print "    dovecot     = Dovecot Secure IMAP server\n";
@@ -3714,6 +3875,9 @@ sub set_defaults {
         $server = <STDIN>;
         $server =~ s/[\r\n]//g;
 
+        # variable is used to display additional messages.
+        $message = "";
+
         print "\n";
         if ( $server eq "cyrus" ) {
             $imap_server_type               = "cyrus";
@@ -3831,6 +3995,24 @@ sub set_defaults {
             $optional_delimiter             = "detect";
             $disp_default_folder_prefix     = "<none>";
 
+            $continue = 1;
+        } elsif ( $server eq "bincimap" ) {
+            $imap_server_type               = "bincimap";
+            $default_folder_prefix          = "INBOX/";
+            $trash_folder                   = "Trash";
+            $sent_folder                    = "Sent";
+            $draft_folder                   = "Drafts";
+            $show_prefix_option             = false;
+            $default_sub_of_inbox           = false;
+            $show_contain_subfolders_option = false;
+            $delete_folder                  = true;
+            $force_username_lowercase       = false;
+            $optional_delimiter             = "detect";
+            $disp_default_folder_prefix     = $default_folder_prefix;
+
+            # Default folder prefix depends on used depot.
+            $message = "\nIf you use IMAPdir depot, you must set default folder prefix to empty string.\n";
+
             $continue = 1;
         } elsif ( $server eq "quit" ) {
             $continue = 1;
@@ -3851,6 +4033,8 @@ sub set_defaults {
         print "            optional_delimiter = $optional_delimiter\n";
         print "                 delete_folder = $delete_folder\n";
         print "      force_username_lowercase = $force_username_lowercase\n";
+
+        print "$message";
     }
     print "\nPress enter to continue...";
     $tmp = <STDIN>;
@@ -4020,6 +4204,17 @@ sub detect_auth_support {
     return 'YES';
 }
 
+# trims whitespace
+# Example code from O'Reilly Perl Cookbook
+sub trim {
+    my @out = @_;
+    for (@out) {
+        s/^\s+//;
+        s/\s+$//;
+    }
+    return wantarray ? @out : $out[0];
+}
+
 sub clear_screen() {
     if ( $^O =~ /^mswin/i) {
         system "cls";