[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kmail-devel
Subject:    [Bug 74017] grave imap  bug : All messages of inbox lost
From:       Till Adam <adam () kde ! org>
Date:       2004-02-04 8:26:11
Message-ID: 20040204082611.31045.qmail () ktown ! kde ! org
[Download RAW message or body]

------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
      
http://bugs.kde.org/show_bug.cgi?id=74017      




------- Additional Comments From adam@kde.org  2004-02-04 09:26 -------
Subject: kdepim/kmail

CVS commit by tilladam: 

Don't do an expunge Folder, thereby removing all mails in an imap folder,
when the deleteMessage method is called on a message that does not have
a UID, for whatever reason.

Ouch.

Now we need to find out why the message has no uid.

Ingo, backport, I assume?

CCMAIL: 74017@bugs.kde.org


  M +15 -2     kmfolderimap.cpp   1.170


--- kdepim/kmail/kmfolderimap.cpp  #1.169:1.170
@@ -1213,5 +1213,14 @@ void KMFolderImap::deleteMessage(KMMessa
   KURL url = mAccount->getUrl();
   KMFolderImap *msg_parent = static_cast<KMFolderImap*>(msg->storage());
-  url.setPath(msg_parent->imapPath() + ";UID=" + msg->headerField("X-UID"));
+  QString uid = msg->headerField("X-UID");
+  /* If the uid is empty the delete job below will nuke all mail in the 
+     folder, so we better safeguard against that. See ::expungeFolder, as
+     to why. :( */
+  if ( uid.isEmpty() ) {
+     kdDebug( 5006 ) << "KMFolderImap::deleteMessage: Attempt to delete "
+                        "an empty UID. Aborting."  << endl;
+     return;
+  }
+  url.setPath(msg_parent->imapPath() + ";UID=" + uid );
   if ( mAccount->makeConnection() != ImapAccountBase::Connected )
     return;
@@ -1234,5 +1243,9 @@ void KMFolderImap::deleteMessage(QPtrLis
   for ( QStringList::Iterator it = sets.begin(); it != sets.end(); ++it )
   {
-    url.setPath(msg_parent->imapPath() + ";UID=" + *it);
+    QString uid = *it;
+    // Don't delete with no uid, that nukes the folder. Should not happen, but
+    // better safe than sorry.
+    if ( uid.isEmpty() ) continue; 
+    url.setPath(msg_parent->imapPath() + ";UID=" + uid);
     if ( mAccount->makeConnection() != ImapAccountBase::Connected )
       return;
_______________________________________________
KMail developers mailing list
KMail-devel@kde.org
https://mail.kde.org/mailman/listinfo/kmail-devel
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic