Added patch 717651
[squirrelmail.git] / config / conf.pl
index dc9f20c9a5a933bd80ef5bcc3f0693392e2e1b68..ac66f4206bab1f2d77a785eaf36b6edff2ac16de 100755 (executable)
@@ -40,6 +40,7 @@ if ( defined( $ENV{'PATH_INFO'} )
 ############################################################
 use Cwd;
 $dir = cwd();
+  
 
 ############################################################              
 # First, lets read in the data already in there...
@@ -68,7 +69,7 @@ if ( -e "config.php" ) {
     close(FILE);
 
     if ( $config_version ne $conf_pl_version ) {
-        system "clear";
+        clear_screen();
         print $WHT. "WARNING:\n" . $NRM;
         print "  The file \"config/config.php\" was found, but it is for\n";
         print "  an older version of SquirrelMail. It is possible to still\n";
@@ -121,7 +122,7 @@ if ( -e "config.php" ) {
     close(FILE);
 
     if ( $config_version ne $conf_pl_version ) {
-        system "clear";
+        clear_screen();
         print $WHT. "WARNING:\n" . $NRM;
         print "  You are trying to use a 'config_default.php' from an older\n";
         print "  version of SquirrelMail. This is HIGHLY unrecommended. You\n";
@@ -346,7 +347,7 @@ if ( !$use_imap_tls ) {
 }
 
 if ( !$imap_auth_mech ) {
-    $imap_auth_mech = 'plain';
+    $imap_auth_mech = 'login';
 }
 
 if (!$session_name ) {
@@ -381,7 +382,7 @@ if ( $config_use_color == 1 ) {
 }
 
 while ( ( $command ne "q" ) && ( $command ne "Q" ) ) {
-    system "clear";
+    clear_screen();
     print $WHT. "SquirrelMail Configuration : " . $NRM;
     if    ( $config == 1 ) { print "Read: config.php"; }
     elsif ( $config == 2 ) { print "Read: config_default.php"; }
@@ -498,7 +499,7 @@ while ( ( $command ne "q" ) && ( $command ne "Q" ) ) {
         print "14. Default Unseen Notify         : $WHT$default_unseen_notify$NRM\n";
         print "15. Default Unseen Type           : $WHT$default_unseen_type$NRM\n";
         print "16. Auto Create Special Folders   : $WHT$auto_create_special$NRM\n";
-        print "17. Don't move folders into Trash : $WHT$delete_folder$NRM\n";
+        print "17. Folder Delete Bypasses Trash  : $WHT$delete_folder$NRM\n";
         print "18. Enable /NoSelect folder fix   : $WHT$noselect_fix_enable$NRM\n";
         print "\n";
         print "R   Return to Main Menu\n";
@@ -513,22 +514,22 @@ while ( ( $command ne "q" ) && ( $command ne "Q" ) ) {
         print "7.  Allow use of priority       : $WHT$default_use_priority$NRM\n";
         print "8.  Hide SM attributions        : $WHT$hide_sm_attributions$NRM\n";
         print "9.  Allow use of receipts       : $WHT$default_use_mdn$NRM\n";
-        print "10. Allow editing of identity   : $WHT$edit_identity$NRM\n";
+        print "10. Allow editing of identity   : $WHT$edit_identity$NRM/$WHT$edit_name$NRM\n";
         print "11. Allow server thread sort    : $WHT$allow_thread_sort$NRM\n";
         print "12. Allow server-side sorting   : $WHT$allow_server_sort$NRM\n";
-        if ( lc($edit_identity) eq "false" ) {
-            print "13. Allow editing of name     : $WHT$edit_name$NRM\n";
-        }
-        print "14. Allow server charset search : $WHT$allow_charset_search$NRM\n";
-        print "15. Enable UID support          : $WHT$uid_support$NRM\n";
-               print "16. PHP session name            : $WHT$session_name$NRM\n";
+        print "13. Allow server charset search : $WHT$allow_charset_search$NRM\n";
+        print "14. Enable UID support          : $WHT$uid_support$NRM\n";
+               print "15. PHP session name            : $WHT$session_name$NRM\n";
         print "\n";
         print "R   Return to Main Menu\n";
     } elsif ( $menu == 5 ) {
         print $WHT. "Themes\n" . $NRM;
         print "1.  Change Themes\n";
-        for ( $count = 0 ; $count <= $#theme_name ; $count++ ) {
-            print "    >  $theme_name[$count]\n";
+        for ( $count = 0 ; $count <= $#theme_name/2 ; $count++ ) {
+            $temp_name = $theme_name[$count*2];
+            printf "     %s%*s    %s\n", $temp_name, 
+                   40 - length($temp_name), " ",
+                   $theme_name[($count*2)+1];
         }
         print "2.  CSS File : $WHT$theme_css$NRM\n";
         print "\n";
@@ -715,10 +716,9 @@ while ( ( $command ne "q" ) && ( $command ne "Q" ) ) {
             elsif ( $command == 10 ) { $edit_identity            = command310(); }
             elsif ( $command == 11 ) { $allow_thread_sort        = command312(); }
             elsif ( $command == 12 ) { $allow_server_sort        = command313(); }
-            elsif ( $command == 13 ) { $edit_name                = command311(); }
-            elsif ( $command == 14 ) { $allow_charset_search     = command314(); }
-            elsif ( $command == 15 ) { $uid_support              = command315(); }
-                       elsif ( $command == 16 ) { $session_name             = command316(); }
+            elsif ( $command == 13 ) { $allow_charset_search     = command314(); }
+            elsif ( $command == 14 ) { $uid_support              = command315(); }
+                       elsif ( $command == 15 ) { $session_name             = command316(); }
         } elsif ( $menu == 5 ) {
             if ( $command == 1 ) { command41(); }
             elsif ( $command == 2 ) { $theme_css = command42(); }
@@ -769,11 +769,14 @@ sub command1 {
 # org_logo
 sub command2 {
     print "Your organization's logo is an image that will be displayed at\n";
-    print "different times throughout SquirrelMail.  This is asking for the\n";
-    print "literal (/usr/local/squirrelmail/images/logo.png) or relative\n";
-    print "(../images/logo.png) path from the config directory to your logo.\n";
-    print "Relative paths to files outside the SquirrelMail distribution\n";
-    print "will be converted to their absolute path equivalents in config.php.\n";
+    print "different times throughout SquirrelMail. ";
+    print "\n";
+    print "Please be aware of the following: \n";
+    print "  - Relative URLs are relative to the config dir\n";
+    print "    to use the default logo, use ../images/sm_logo.png\n";
+    print "  - To specify a logo 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/images/mylogo.gif or /images/mylogo.jpg\n";
     print "\n";
     print "[$WHT$org_logo$NRM]: $WHT";
     $new_org_logo = <STDIN>;
@@ -1130,14 +1133,14 @@ sub command111 {
     return $new_optional_delimiter;
 }
 # IMAP authentication type
-# Possible values: plain, cram-md5, digest-md5
+# Possible values: login, cram-md5, digest-md5
 # Now offers to detect supported mechs, assuming server & port are set correctly
 
 sub command112a {
        print "If you have already set the hostname and port number, I can try to\n";
        print "detect the mechanisms your IMAP server supports.\n";
        print "I will try to detect CRAM-MD5 and DIGEST-MD5 support.  I can't test\n";
-       print "for \"plain\" without knowing a username and password.\n";
+       print "for \"login\" without knowing a username and password.\n";
        print "Auto-detecting is optional - you can safely say \"n\" here.\n";
        print "\nTry to detect supported mechanisms? [y/N]: ";
        $inval=<STDIN>;
@@ -1172,15 +1175,15 @@ sub command112a {
          
        } 
          print "\nWhat authentication mechanism do you want to use for IMAP connections?\n\n";
-         print $WHT . "plain" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
-         print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext.\n";
+         print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
+         print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext methods.\n";
          print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
          print "\n*** YOUR IMAP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n";
-         print "If you don't understand or are unsure, you probably want \"plain\"\n\n";
-         print "plain, cram-md5, or digest-md5 [$WHT$imap_auth_mech$NRM]: $WHT";
+         print "If you don't understand or are unsure, you probably want \"login\"\n\n";
+         print "login, cram-md5, or digest-md5 [$WHT$imap_auth_mech$NRM]: $WHT";
       $inval=<STDIN>;
       chomp($inval);
-      if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || ($inval =~ /^plain\b/i)) {
+      if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || ($inval =~ /^login\b/i)) {
         return lc($inval);
       } else {
         # user entered garbage or default value so nothing needs to be set
@@ -1203,7 +1206,7 @@ sub command112b {
                print "Trying to detect supported methods (SMTP)...\n";
                
                # Special case!
-               # Check none by trying to relay to junk@birdbrained.org
+               # Check none by trying to relay to junk@microsoft.com
                $host = $smtpServerAddress . ':' . $smtpPort;
                use IO::Socket;
                my $sock = IO::Socket::INET->new($host);
@@ -1214,7 +1217,7 @@ sub command112b {
                } else {
                        print $sock "mail from: tester\@squirrelmail.org\n";
                        $got = <$sock>;  # Discard
-                       print $sock "rcpt to: junk\@birdbrained.org\n";
+                       print $sock "rcpt to: junk\@microsoft.com\n";
                        $got = <$sock>;  # This is the important line
                        if ($got =~ /^250\b/) {  # SMTP will relay without auth
                                print "SUPPORTED$NRM\n";
@@ -1225,8 +1228,8 @@ sub command112b {
                        print $sock "quit\n";
                        close $sock;
                }
-               # Try plain (SquirrelMail default)
-               print "Testing plain:\t\t";
+               # Try login (SquirrelMail default)
+               print "Testing login:\t\t";
                $tmp=detect_auth_support('SMTP',$host,'LOGIN');
                if (defined($tmp)) {
                if ($tmp eq 'YES') {
@@ -1266,12 +1269,12 @@ sub command112b {
     } 
     print "\tWhat authentication mechanism do you want to use for SMTP connections?\n";
     print $WHT . "none" . $NRM . " - Your SMTP server does not require authorization.\n";
-    print $WHT . "plain" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
+    print $WHT . "login" . $NRM . " - Plaintext. If you can do better, you probably should.\n";
     print $WHT . "cram-md5" . $NRM . " - Slightly better than plaintext.\n";
     print $WHT . "digest-md5" . $NRM . " - Privacy protection - better than cram-md5.\n";
-    print "\n*** YOUR SMTP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n";
+    print $WHT . "\n*** YOUR SMTP SERVER MUST SUPPORT THE MECHANISM YOU CHOOSE HERE ***\n" . $NRM;
     print "If you don't understand or are unsure, you probably want \"none\"\n\n";
-    print "none, plain, cram-md5, or digest-md5 [$WHT$smtp_auth_mech$NRM]: $WHT";
+    print "none, login, cram-md5, or digest-md5 [$WHT$smtp_auth_mech$NRM]: $WHT";
     $inval=<STDIN>;
     chomp($inval);
     if ($inval =~ /^none\b/i) {
@@ -1279,7 +1282,7 @@ sub command112b {
       return "none";
     }
     if ( ($inval =~ /^cram-md5\b/i) || ($inval =~ /^digest-md5\b/i) || 
-    ($inval =~ /^plain\b/i)) {
+    ($inval =~ /^login\b/i)) {
       return lc($inval);
     } else {
       # user entered garbage, or default value so nothing needs to be set
@@ -1759,24 +1762,42 @@ sub command214 {
     return $auto_create_special;
 }
 
-# Auto create special folders
+# Automatically delete folders 
 sub command215 {
-    print "Would you like to automatically completely delete any deleted\n";
-    print "folders? If not then they will be moved to the Trash folder\n";
-    print "and can be deleted from there\n";
-    print "\n";
-
-    if ( lc($delete_folder) eq "true" ) {
-        $default_value = "y";
-    } else {
-        $default_value = "n";
-    }
-    print "Auto delete folders? (y/n) [$WHT$default_value$NRM]: $WHT";
-    $new_delete = <STDIN>;
-    if ( ( $new_delete =~ /^y\n/i ) || ( ( $new_delete =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+    if ( $imap_server_type == "courier" ) {
+        print "Courier(or Courier-IMAP) IMAP servers do not support ";
+        print "subfolders of Trash. \n";
+        print "Deleting folders will bypass the trash folder and ";
+        print "be immediately deleted.\n\n";
+        print "If this is not the correct value for your server,\n";
+        print "please use option D on the Main Menu to configure your server correctly.\n\n";
+        print "Press any key to continue...\n";
+        $new_delete = <STDIN>;
         $delete_folder = "true";
-    } else {
-        $delete_folder = "false";
+    } elsif ( $imap_server_type == "uw" ) {
+        print "UW IMAP servers will not allow folders containing";
+        print "mail to also contain folders.\n";
+        print "Deleting folders will bypass the trash folder and";
+        print "be immediately deleted\n\n";
+        print "If this is not the correct value for your server,\n";
+        print "please use option D on the Main Menu to configure your server correctly.\n\n";
+        print "Press any key to continue...\n";
+        $new_delete = <STDIN>;
+        $delete_folder = "true";
+    } else { 
+        print "Should folders selected for deletion bypass the Trash folder?\n\n";
+        if ( lc($delete_folder) eq "true" ) {
+            $default_value = "y";
+        } else {
+            $default_value = "n";
+        }
+        print "Auto delete folders? (y/n) [$WHT$default_value$NRM]: $WHT";
+        $new_delete = <STDIN>;
+        if ( ( $new_delete =~ /^y\n/i ) || ( ( $new_delete =~ /^\n/ ) && ( $default_value eq "y" ) ) ) {
+            $delete_folder = "true";
+        } else {
+            $delete_folder = "false";
+        }
     }
     return $delete_folder;
 }
@@ -2020,8 +2041,8 @@ sub command39 {
 }
 
 sub command310 {
-    print "This allows you to prevent the editing of the users name and";
-    print "email address. This is mainly useful when used with the";
+    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";
 
@@ -2030,19 +2051,22 @@ sub command310 {
     } else {
         $default_value = "n";
     }
-    print "Allow editing? (y/n) [$WHT$default_value$NRM]: $WHT";
+    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";
     } else {
         $edit_identity = "false";
+        $edit_name = command311();
     }
     return $edit_identity;
 }
 
 sub command311 {
-    print "This option allows you to choose if the user can edit their full name";
-    print "even when you don't want them to change their username\n";
+    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";
 
     if ( lc($edit_name) eq "true" ) {
@@ -2156,8 +2180,8 @@ sub command316 {
 
 
 sub command41 {
-    print "\nNow we will define the themes that you wish to use.  If you have added\n";
-    print "a theme of your own, just follow the instructions (?) about how to add\n";
+    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>;
@@ -2171,8 +2195,11 @@ sub command41 {
                 } else {
                     print "  ";
                 }
+                if ( $count < 10 ) {
+                    print " ";
+                }
                 $name       = $theme_name[$count];
-                $num_spaces = 25 - length($name);
+                $num_spaces = 35 - length($name);
                 for ( $i = 0 ; $i < $num_spaces ; $i++ ) {
                     $name = $name . " ";
                 }
@@ -2305,8 +2332,12 @@ sub command42 {
     print "\n";
     print "To clear out an existing value, just type a space for the input.\n";
     print "\n";
-    print "Relative links to files outside the SquirrelMail distribution\n";
-    print "will be converted to their absolute path equivalents in config.php.\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>;
@@ -2852,7 +2883,7 @@ sub save_data {
 }
 
 sub set_defaults {
-    system "clear";
+    clear_screen();
     print $WHT. "SquirrelMail Configuration : " . $NRM;
     if    ( $config == 1 ) { print "Read: config.php"; }
     elsif ( $config == 2 ) { print "Read: config_default.php"; }
@@ -2907,7 +2938,8 @@ sub set_defaults {
             $show_contain_subfolders_option = true;
             $optional_delimiter             = "/";
             $disp_default_folder_prefix     = $default_folder_prefix;
-
+            $delete_folder                  = true;
+            
             $continue = 1;
         } elsif ( $server eq "exchange" ) {
             $imap_server_type               = "exchange";
@@ -2933,7 +2965,8 @@ sub set_defaults {
             $show_contain_subfolders_option = false;
             $optional_delimiter             = ".";
             $disp_default_folder_prefix     = $default_folder_prefix;
-
+            $delete_folder                  = true;
+            
             $continue = 1;
         } elsif ( $server eq "macosx" ) {
             $imap_server_type               = "macosx";
@@ -2966,6 +2999,7 @@ sub set_defaults {
         print "          default_sub_of_inbox = $default_sub_of_inbox\n";
         print "show_contain_subfolders_option = $show_contain_subfolders_option\n";
         print "            optional_delimiter = $optional_delimiter\n";
+        print "                 delete_folder = $delete_folder\n";
     }
     print "\nPress any key to continue...";
     $tmp = <STDIN>;
@@ -2977,9 +3011,11 @@ sub set_defaults {
 # prepended to the path, if not, then the path will be
 # converted to an absolute path, e.g.
 #   '../images/logo.gif'      --> SM_PATH . 'images/logo.gif'
+#   '../../someplace/data'    --> '/absolute/path/someplace/data'
 #   'images/logo.gif'         --> SM_PATH . 'config/images/logo.gif'
 #   '/absolute/path/logo.gif' --> '/absolute/path/logo.gif'
 #   'http://whatever/'        --> 'http://whatever'
+#   $some_var/path            --> "$some_var/path"
 sub change_to_SM_path() {
     my ($old_path) = @_;
     my $new_path = '';
@@ -2989,10 +3025,23 @@ sub change_to_SM_path() {
 
     # If the path is absolute, don't bother.
     return "\'" . $old_path . "\'"  if ( $old_path eq '');
-    return "\'" . $old_path . "\'"  if ( $old_path =~ /^\// );
-    return "\'" . $old_path . "\'"  if ( $old_path =~ /^http/ );
-    return $old_path                if ( $old_path =~ /^\$/);
-    return $old_path                if ( $old_path =~ /^SM_PATH/ );
+    return "\'" . $old_path . "\'"  if ( $old_path =~ /^(\/|http)/ );
+    return "\'" . $old_path . "\'"  if ( $old_path =~ /^\w:\// );
+    return $old_path                if ( $old_path =~ /^\'(\/|http)/ );
+    return $old_path                if ( $old_path =~ /^\'\w:\// );
+    return $old_path                if ( $old_path =~ /^SM_PATH/);
+   
+    if ( $old_path =~ /^\$/ ) {
+        # check if it's a single var, or a $var/path combination
+        # if it's $var/path, enclose in ""
+        if ( $old_path =~ /\// ) {
+            return '"'.$old_path.'"';
+        }
+        return $old_path;
+    }
+    
+    # Remove remaining '
+    $old_path =~ s/\'//g;
     
     # For relative paths, split on '../'
     @rel_path = split(/\.\.\//, $old_path);
@@ -3000,28 +3049,25 @@ sub change_to_SM_path() {
     if ( $#rel_path > 1 ) {
         # more than two levels away. Make it absolute.
         @abs_path = split(/\//, $dir);
-        foreach $subdir (@rel_path) {
-            if ($subdir eq '') {
-                pop @abs_path;
-            } else {
-                push @abs_path, $subdir;
-            }
-        }
-        foreach $subdir (@abs_path) {
-            $new_path .= $subdir . '/';
+        
+        # Lop off the relative pieces of the absolute path..
+        for ( $i = 0; $i <= $#rel_path; $i++ ) {
+            pop @abs_path;
+            shift @rel_path;
         }
+        push @abs_path, @rel_path;
+        $new_path = "\'" . join('/', @abs_path) . "\'";
     } elsif ( $#rel_path > 0 ) {
         # it's within the SM tree, prepend SM_PATH
         $new_path = $old_path;
         $new_path =~ s/^\.\.\//SM_PATH . \'/;
-        $new_path .= '\'';
+        $new_path .= "\'";
     } else {
         # Last, it's a relative path without any leading '.'
        # Prepend SM_PATH and config, since the paths are 
        # relative to the config directory
         $new_path = "SM_PATH . \'config/" . $old_path . "\'";
     }
-
   return $new_path;
 }
 
@@ -3037,7 +3083,7 @@ sub change_to_rel_path() {
 
     if ( $old_path =~ /^SM_PATH/ ) {
         $new_path =~ s/^SM_PATH . \'/\.\.\//;
-       $new_path =~ s/\.\.\/config\///;
+        $new_path =~ s/\.\.\/config\///;
     }
 
     return $new_path;
@@ -3078,9 +3124,16 @@ sub detect_auth_support {
         return undef;
     }
        my $discard = <$sock>; # Server greeting/banner - who cares..
+
+       if ($service eq 'SMTP') {
+               # Say hello first..
+               print $sock "helo $domain\n";
+               $discard = <$sock>; # Yeah yeah, you're happy to see me..
+       }
        print $sock $cmd;
 
        my $response = <$sock>;
+       chomp($response);
        if (!defined($response)) {
                return undef;
        }
@@ -3091,6 +3144,9 @@ sub detect_auth_support {
                        # Not supported
                        close $sock;
                        return 'NO';
+               } elsif ($response =~ /^503/) {
+                       #Something went wrong
+                       return undef;
                }
        } elsif ($service eq 'IMAP') {
                if ($response =~ /^A01/) {
@@ -3110,3 +3166,11 @@ sub detect_auth_support {
        close $sock;
        return 'YES';
 }
+
+sub clear_screen() {
+    if ( $^O =~ /^mswin/i) {
+        system "cls";
+    } else {
+        system "clear";
+    }
+}