imap: Added verification of UIDVALIDITY mailbox attribute
authorJiri Hruska <jirka@fud.cz>
Tue, 26 Feb 2013 21:12:24 +0000 (22:12 +0100)
committerSteve Holme <steve_holme@hotmail.com>
Tue, 26 Feb 2013 22:09:21 +0000 (22:09 +0000)
Added support for checking the UIDVALIDITY, and aborting the request, if
it has been specified in the URL and the server response is different.

lib/imap.c

index b7c92ef..9f0e6cb 100644 (file)
@@ -1216,6 +1216,7 @@ static CURLcode imap_state_select_resp(struct connectdata *conn,
 {
   CURLcode result = CURLE_OK;
   struct SessionHandle *data = conn->data;
+  struct IMAP *imap = conn->data->state.proto.imap;
   struct imap_conn *imapc = &conn->proto.imapc;
   const char *line = data->state.buffer;
   char tmp[20];
@@ -1233,8 +1234,16 @@ static CURLcode imap_state_select_resp(struct connectdata *conn,
     failf(data, "Select failed");
     result = CURLE_LOGIN_DENIED;
   }
-  else
-    result = imap_fetch(conn);
+  else {
+    /* Check if the UIDVALIDITY has been specified and matches */
+    if(imap->uidvalidity && imapc->mailbox_uidvalidity &&
+       strcmp(imap->uidvalidity, imapc->mailbox_uidvalidity)) {
+      failf(conn->data, "Mailbox UIDVALIDITY has changed");
+      result = CURLE_REMOTE_FILE_NOT_FOUND;
+    }
+    else
+      result = imap_fetch(conn);
+  }
 
   return result;
 }