Kaynağa Gözat

Fix: Login mechanisms other than "login" were broken if server returned untagged data before login response (#2854)

pdontthink 3 yıl önce
ebeveyn
işleme
ed0e93752b
1 değiştirilmiş dosya ile 11 ekleme ve 1 silme
  1. 11 1
      functions/imap_general.php

+ 11 - 1
functions/imap_general.php

@@ -908,6 +908,11 @@ function sqimap_login ($username, $password, $imap_server_address,
                     $read=sqimap_fgets($imap_stream);
                     $read=sqimap_fgets($imap_stream);
                 }
                 }
             }
             }
+            // IMAP server might return some untagged info before
+            // the tagged login command response - skip over that
+            while ($read[0] === '*') {
+                $read = sqimap_fgets($imap_stream);
+            }
             $results=explode(" ",$read,3);
             $results=explode(" ",$read,3);
             $response=$results[1];
             $response=$results[1];
             $message=$results[2];
             $message=$results[2];
@@ -936,7 +941,7 @@ function sqimap_login ($username, $password, $imap_server_address,
          * credentials and use that as the authorization identity.
          * credentials and use that as the authorization identity.
          */
          */
         $tag=sqimap_session_id(false);
         $tag=sqimap_session_id(false);
-        $sasl = (isset($sqimap_capabilities['SASL-IR']) && $sqimap_capabilities['SASL-IR']) ? true : false;
+        $sasl = sqimap_capability($imap_stream, 'SASL-IR');
         if(!empty($authz)) {
         if(!empty($authz)) {
             $auth = base64_encode("$username\0$authz\0$password");
             $auth = base64_encode("$username\0$authz\0$password");
         } else {
         } else {
@@ -957,6 +962,11 @@ function sqimap_login ($username, $password, $imap_server_address,
                 $read = sqimap_fgets($imap_stream);
                 $read = sqimap_fgets($imap_stream);
             }
             }
         }
         }
+        // IMAP server might return some untagged info before
+        // the tagged login command response - skip over that
+        while ($read[0] === '*') {
+            $read = sqimap_fgets($imap_stream);
+        }
         $results=explode(" ",$read,3);
         $results=explode(" ",$read,3);
         $response=$results[1];
         $response=$results[1];
         $message=$results[2];
         $message=$results[2];