]> code.delx.au - offlineimap/blobdiff - offlineimap/folder/IMAP.py
completed: * fixes behaviour when changing flags, without corresp. rights (s,d,w)
[offlineimap] / offlineimap / folder / IMAP.py
index 12a9660894405b40c668babc56cfa66964915892..9ed75ef47557a4433342a2df8415d28924d7ca8f 100644 (file)
@@ -365,11 +365,30 @@ class IMAPFolder(BaseFolder):
         
         imapobj = self.imapserver.acquireconnection()
         try:
+            # Making sure, that we have the necessary rights
+            # ensuring that we access readonly: python's braindead imaplib.py
+            # otherwise might raise an exception during the myrights() call
+            imapobj.select(self.getfullname(),readonly=1)
+            myrights = imapobj.myrights(self.getfullname())[1][0].split()[1]
+           if 'T' in flags and not 'd' in myrights or \
+                   'S' in flags and not 's' in myrights or \
+                   filter(lambda x: x not in 'TS', flags) and not 'w' in myrights:
+               # no delete/expunge right, but needed or
+               # no store seen right, but needed or
+               # no write right, but needed
+                UIBase.getglobalui().flagstoreadonly(self, uidlist, flags)
+                return
+
             try:
                 imapobj.select(self.getfullname())
             except imapobj.readonly:
-                UIBase.getglobalui().flagstoreadonly(self, uidlist, flags)
-                return
+                # Above we made sure, we have the necessary rights.
+                # Ugly hack, to prevent an unnecessary exception:
+                #  readonly: mailbox status changed to READ-ONLY
+                # imaplib should take care of that itself.
+                # The connection is anyway released below, so we dont need to
+                # undo the hack.
+                imapobj.is_readonly = True
             r = imapobj.uid('store',
                             imaputil.listjoin(uidlist),
                             operation + 'FLAGS',
@@ -424,12 +443,17 @@ class IMAPFolder(BaseFolder):
         self.addmessagesflags_noconvert(uidlist, ['T'])
         imapobj = self.imapserver.acquireconnection()
         try:
-            try:
-                imapobj.select(self.getfullname())
-            except imapobj.readonly:
+            # Making sure, that we have the necessary rights
+            # ensuring that we access readonly: python's braindead imaplib.py
+            # otherwise might raise an exception during the myrights() call
+            imapobj.select(self.getfullname(),readonly=1)
+            if not 'd' in imapobj.myrights(self.getfullname())[1][0].split()[1]:
+                # no delete/expunge rights
                 UIBase.getglobalui().deletereadonly(self, uidlist)
                 return
+
             if self.expunge:
+                imapobj.select(self.getfullname())
                 assert(imapobj.expunge()[0] == 'OK')
         finally:
             self.imapserver.releaseconnection(imapobj)