]> granicus.if.org Git - neomutt/commitdiff
Generic ACL support.
authorRocco Rutte <pdmef@gmx.net>
Tue, 15 Aug 2006 17:08:32 +0000 (17:08 +0000)
committerRocco Rutte <pdmef@gmx.net>
Tue, 15 Aug 2006 17:08:32 +0000 (17:08 +0000)
curs_main.c
flags.c
imap/command.c
imap/imap.c
imap/imap_private.h
mutt.h
mx.c
pager.c
pop.c

index 00a00a456ca30954387bcdf46c75962b344c6339..2e2750577487a9da7531a46dda83818321f4699c 100644 (file)
@@ -90,18 +90,12 @@ static const char *No_visible = N_("No visible messages.");
                                break; \
                        }
 
-#ifdef USE_IMAP 
-/* the error message returned here could be better. */
-#define CHECK_IMAP_ACL(aclbit) if (Context->magic == M_IMAP) \
-               if (mutt_bit_isset (((IMAP_DATA *)Context->data)->capabilities, ACL) \
-               && !mutt_bit_isset(((IMAP_DATA *)Context->data)->rights,aclbit)){ \
+#define CHECK_ACL(aclbit,action) \
+               if (!mutt_bit_isset(Context->rights,aclbit)) { \
                        mutt_flushinp(); \
-                       mutt_error ("Operation not permitted by the IMAP ACL for this mailbox"); \
+                       mutt_error (_("Cannot %s: Operation not permitted by ACL"), action); \
                        break; \
                }
-#else
-#define CHECK_IMAP_ACL(aclbit) /**/
-#endif
 
 #define CHECK_ATTACH if(option(OPTATTACHMSG)) \
                     {\
@@ -805,7 +799,7 @@ int mutt_index_menu (void)
        CHECK_MSGCOUNT;
         CHECK_VISIBLE;
        CHECK_READONLY;
-       CHECK_IMAP_ACL(IMAP_ACL_DELETE);
+       CHECK_ACL(M_ACL_DELETE, _("delete message(s)"));
 
        CHECK_ATTACH;
        mutt_pattern_func (M_DELETE, _("Delete messages matching: "));
@@ -972,7 +966,7 @@ int mutt_index_menu (void)
        CHECK_MSGCOUNT;
         CHECK_VISIBLE;
        CHECK_READONLY;
-       CHECK_IMAP_ACL(IMAP_ACL_DELETE);
+       CHECK_ACL(M_ACL_DELETE, _("undelete message(s)"));
 
        if (mutt_pattern_func (M_UNDELETE, _("Undelete messages matching: ")) == 0)
          menu->redraw = REDRAW_INDEX | REDRAW_STATUS;
@@ -1230,7 +1224,7 @@ int mutt_index_menu (void)
        CHECK_MSGCOUNT;
         CHECK_VISIBLE;
        CHECK_READONLY;
-       CHECK_IMAP_ACL(IMAP_ACL_DELETE);
+       CHECK_ACL(M_ACL_DELETE, _("link threads"));
 
         if ((Sort & SORT_MASK) != SORT_THREADS)
          mutt_error _("Threading is not enabled.");
@@ -1498,16 +1492,7 @@ int mutt_index_menu (void)
        CHECK_MSGCOUNT;
         CHECK_VISIBLE;
        CHECK_READONLY;
-       CHECK_IMAP_ACL(IMAP_ACL_WRITE);
-
-#ifdef USE_POP
-       if (Context->magic == M_POP)
-       {
-         mutt_flushinp ();
-         mutt_error _("Can't change 'important' flag on POP server.");
-         break;
-       }
-#endif
+       CHECK_ACL(M_ACL_WRITE, _("flag message"));
 
         if (tag)
         {
@@ -1544,7 +1529,7 @@ int mutt_index_menu (void)
        CHECK_MSGCOUNT;
         CHECK_VISIBLE;
        CHECK_READONLY;
-       CHECK_IMAP_ACL(IMAP_ACL_SEEN);
+       CHECK_ACL(M_ACL_SEEN, _("toggle new"));
 
        if (tag)
        {
@@ -1658,7 +1643,7 @@ int mutt_index_menu (void)
        CHECK_MSGCOUNT;
         CHECK_VISIBLE;
        CHECK_READONLY;
-       /* CHECK_IMAP_ACL(IMAP_ACL_WRITE); */
+       /* CHECK_ACL(M_ACL_WRITE); */
 
        if (mutt_change_flag (tag ? NULL : CURHDR, (op == OP_MAIN_SET_FLAG)) == 0)
        {
@@ -1798,7 +1783,7 @@ int mutt_index_menu (void)
        CHECK_MSGCOUNT;
         CHECK_VISIBLE;
        CHECK_READONLY;
-       CHECK_IMAP_ACL(IMAP_ACL_DELETE);
+       CHECK_ACL(M_ACL_DELETE, _("delete message"));
 
        if (tag)
        {
@@ -1839,7 +1824,7 @@ int mutt_index_menu (void)
        CHECK_MSGCOUNT;
         CHECK_VISIBLE;
        CHECK_READONLY;
-       CHECK_IMAP_ACL(IMAP_ACL_DELETE);
+       CHECK_ACL(M_ACL_DELETE, _("delete message(s)"));
 
        rc = mutt_thread_set_flag (CURHDR, M_DELETE, 1,
                                   op == OP_DELETE_THREAD ? 0 : 1);
@@ -1880,16 +1865,7 @@ int mutt_index_menu (void)
         CHECK_VISIBLE;
        CHECK_READONLY;
        CHECK_ATTACH;
-       CHECK_IMAP_ACL(IMAP_ACL_INSERT);
-
-#ifdef USE_POP
-       if (Context->magic == M_POP)
-       {
-         mutt_flushinp ();
-         mutt_error _("Can't edit message on POP server.");
-         break;
-       }
-#endif
+       CHECK_ACL(M_ACL_INSERT, _("edit message"));
 
        if (option (OPTPGPAUTODEC) && (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED))) 
          mutt_check_traditional_pgp (tag ? NULL : CURHDR, &menu->redraw);
@@ -2020,7 +1996,7 @@ int mutt_index_menu (void)
        CHECK_MSGCOUNT;
        CHECK_VISIBLE;
        CHECK_READONLY;
-       CHECK_IMAP_ACL(IMAP_ACL_SEEN);
+       CHECK_ACL(M_ACL_SEEN, _("mark message(s) as read"));
 
        rc = mutt_thread_set_flag (CURHDR, M_READ, 1,
                                   op == OP_MAIN_READ_THREAD ? 0 : 1);
@@ -2107,7 +2083,7 @@ int mutt_index_menu (void)
        CHECK_MSGCOUNT;
         CHECK_VISIBLE;
        CHECK_READONLY;
-       CHECK_IMAP_ACL(IMAP_ACL_DELETE);
+       CHECK_ACL(M_ACL_DELETE, _("undelete message"));
        
        if (tag)
        {
@@ -2134,7 +2110,7 @@ int mutt_index_menu (void)
        CHECK_MSGCOUNT;
         CHECK_VISIBLE;
        CHECK_READONLY;
-       CHECK_IMAP_ACL(IMAP_ACL_DELETE);
+       CHECK_ACL(M_ACL_DELETE, _("undelete message(s)"));
 
        rc = mutt_thread_set_flag (CURHDR, M_DELETE, 0,
                                   op == OP_UNDELETE_THREAD ? 0 : 1);
diff --git a/flags.c b/flags.c
index 9e0acc7010c73cb37381f36d5e041803b20c953f..6d49c7bd6cb684a8456278a5f8edceef5e9d64b3 100644 (file)
--- a/flags.c
+++ b/flags.c
@@ -43,12 +43,8 @@ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx)
   {
     case M_DELETE:
 
-#ifdef USE_IMAP
-       if (ctx && ctx->magic == M_IMAP)
-               if (mutt_bit_isset (((IMAP_DATA *)ctx->data)->capabilities, ACL) \
-               && !mutt_bit_isset(((IMAP_DATA *)ctx->data)->rights,IMAP_ACL_DELETE))
-                       return;
-#endif
+      if (!mutt_bit_isset(ctx->rights,M_ACL_DELETE))
+       return;
 
       if (bf)
       {
@@ -94,12 +90,8 @@ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx)
 
     case M_NEW:
 
-#ifdef USE_IMAP
-       if (ctx && ctx->magic == M_IMAP)
-               if (mutt_bit_isset (((IMAP_DATA *)ctx->data)->capabilities, ACL) \
-               && !mutt_bit_isset(((IMAP_DATA *)ctx->data)->rights,IMAP_ACL_SEEN))
-                       return;
-#endif
+      if (!mutt_bit_isset(ctx->rights,M_ACL_SEEN))
+       return;
 
       if (bf)
       {
@@ -129,12 +121,8 @@ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx)
 
     case M_OLD:
 
-#ifdef USE_IMAP
-       if (ctx && ctx->magic == M_IMAP)
-               if (mutt_bit_isset (((IMAP_DATA *)ctx->data)->capabilities, ACL) \
-               && !mutt_bit_isset(((IMAP_DATA *)ctx->data)->rights,IMAP_ACL_SEEN))
-                       return;
-#endif
+      if (!mutt_bit_isset(ctx->rights,M_ACL_SEEN))
+       return;
 
       if (bf)
       {
@@ -159,12 +147,8 @@ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx)
 
     case M_READ:
 
-#ifdef USE_IMAP
-       if (ctx && ctx->magic == M_IMAP)
-               if (mutt_bit_isset (((IMAP_DATA *)ctx->data)->capabilities, ACL) \
-               && !mutt_bit_isset(((IMAP_DATA *)ctx->data)->rights,IMAP_ACL_SEEN))
-                       return;
-#endif
+      if (!mutt_bit_isset(ctx->rights,M_ACL_SEEN))
+       return;
 
       if (bf)
       {
@@ -191,12 +175,8 @@ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx)
 
     case M_REPLIED:
 
-#ifdef USE_IMAP
-       if (ctx && ctx->magic == M_IMAP)
-               if (mutt_bit_isset (((IMAP_DATA *)ctx->data)->capabilities, ACL) \
-               && !mutt_bit_isset(((IMAP_DATA *)ctx->data)->rights,IMAP_ACL_WRITE))
-                       return;
-#endif
+      if (!mutt_bit_isset(ctx->rights,M_ACL_WRITE))
+       return;
 
       if (bf)
       {
@@ -224,12 +204,8 @@ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx)
 
     case M_FLAG:
 
-#ifdef USE_IMAP
-       if (ctx && ctx->magic == M_IMAP)
-               if (mutt_bit_isset (((IMAP_DATA *)ctx->data)->capabilities, ACL) \
-               && !mutt_bit_isset(((IMAP_DATA *)ctx->data)->rights,IMAP_ACL_WRITE))
-                       return;
-#endif
+      if (!mutt_bit_isset(ctx->rights,M_ACL_WRITE))
+       return;
 
       if (bf)
       {
index 398a932e181b65614b2e6e1176d01fccb1538bfd..faf6ae4baee7827497af19cbddf0464b6796b16f 100644 (file)
@@ -722,38 +722,38 @@ static void cmd_parse_myrights (IMAP_DATA* idata, const char* s)
   s = imap_next_word ((char*)s);
 
   /* zero out current rights set */
-  memset (idata->rights, 0, sizeof (idata->rights));
+  memset (idata->ctx->rights, 0, sizeof (idata->ctx->rights));
 
   while (*s && !isspace((unsigned char) *s))
   {
     switch (*s) 
     {
       case 'l':
-       mutt_bit_set (idata->rights, IMAP_ACL_LOOKUP);
+       mutt_bit_set (idata->ctx->rights, M_ACL_LOOKUP);
        break;
       case 'r':
-       mutt_bit_set (idata->rights, IMAP_ACL_READ);
+       mutt_bit_set (idata->ctx->rights, M_ACL_READ);
        break;
       case 's':
-       mutt_bit_set (idata->rights, IMAP_ACL_SEEN);
+       mutt_bit_set (idata->ctx->rights, M_ACL_SEEN);
        break;
       case 'w':
-       mutt_bit_set (idata->rights, IMAP_ACL_WRITE);
+       mutt_bit_set (idata->ctx->rights, M_ACL_WRITE);
        break;
       case 'i':
-       mutt_bit_set (idata->rights, IMAP_ACL_INSERT);
+       mutt_bit_set (idata->ctx->rights, M_ACL_INSERT);
        break;
       case 'p':
-       mutt_bit_set (idata->rights, IMAP_ACL_POST);
+       mutt_bit_set (idata->ctx->rights, M_ACL_POST);
        break;
       case 'c':
-       mutt_bit_set (idata->rights, IMAP_ACL_CREATE);
+       mutt_bit_set (idata->ctx->rights, M_ACL_CREATE);
        break;
       case 'd':
-       mutt_bit_set (idata->rights, IMAP_ACL_DELETE);
+       mutt_bit_set (idata->ctx->rights, M_ACL_DELETE);
        break;
       case 'a':
-       mutt_bit_set (idata->rights, IMAP_ACL_ADMIN);
+       mutt_bit_set (idata->ctx->rights, M_ACL_ADMIN);
        break;
     }
     s++;
index cbec5cbfcc852b596e3408fc2e7a68b455c2bcb2..6a723516c0e4d5ab17838250a8a71ddd1ef2e272 100644 (file)
@@ -573,7 +573,7 @@ int imap_open_mailbox (CONTEXT* ctx)
 
   /* clear mailbox status */
   idata->status = 0;
-  memset (idata->rights, 0, (RIGHTSMAX+7)/8);
+  memset (idata->ctx->rights, 0, sizeof (idata->ctx->rights));
   idata->newMailCount = 0;
 
   mutt_message (_("Selecting %s..."), idata->mailbox);
@@ -588,14 +588,14 @@ int imap_open_mailbox (CONTEXT* ctx)
   /* assume we have all rights if ACL is unavailable */
   else
   {
-    mutt_bit_set (idata->rights, IMAP_ACL_LOOKUP);
-    mutt_bit_set (idata->rights, IMAP_ACL_READ);
-    mutt_bit_set (idata->rights, IMAP_ACL_SEEN);
-    mutt_bit_set (idata->rights, IMAP_ACL_WRITE);
-    mutt_bit_set (idata->rights, IMAP_ACL_INSERT);
-    mutt_bit_set (idata->rights, IMAP_ACL_POST);
-    mutt_bit_set (idata->rights, IMAP_ACL_CREATE);
-    mutt_bit_set (idata->rights, IMAP_ACL_DELETE);
+    mutt_bit_set (idata->ctx->rights, M_ACL_LOOKUP);
+    mutt_bit_set (idata->ctx->rights, M_ACL_READ);
+    mutt_bit_set (idata->ctx->rights, M_ACL_SEEN);
+    mutt_bit_set (idata->ctx->rights, M_ACL_WRITE);
+    mutt_bit_set (idata->ctx->rights, M_ACL_INSERT);
+    mutt_bit_set (idata->ctx->rights, M_ACL_POST);
+    mutt_bit_set (idata->ctx->rights, M_ACL_CREATE);
+    mutt_bit_set (idata->ctx->rights, M_ACL_DELETE);
   }
   /* pipeline the postponed count if possible */
   pmx.mbox = NULL;
@@ -724,10 +724,10 @@ int imap_open_mailbox (CONTEXT* ctx)
   }
 #endif
 
-  if (!(mutt_bit_isset(idata->rights, IMAP_ACL_DELETE) ||
-        mutt_bit_isset(idata->rights, IMAP_ACL_SEEN) ||
-        mutt_bit_isset(idata->rights, IMAP_ACL_WRITE) ||
-        mutt_bit_isset(idata->rights, IMAP_ACL_INSERT)))
+  if (!(mutt_bit_isset(idata->ctx->rights, M_ACL_DELETE) ||
+        mutt_bit_isset(idata->ctx->rights, M_ACL_SEEN) ||
+        mutt_bit_isset(idata->ctx->rights, M_ACL_WRITE) ||
+        mutt_bit_isset(idata->ctx->rights, M_ACL_INSERT)))
      ctx->readonly = 1;
 
   ctx->hdrmax = count;
@@ -815,7 +815,7 @@ void imap_logout (IMAP_DATA* idata)
 static void imap_set_flag (IMAP_DATA* idata, int aclbit, int flag,
   const char *str, char *flags, size_t flsize)
 {
-  if (mutt_bit_isset (idata->rights, aclbit))
+  if (mutt_bit_isset (idata->ctx->rights, aclbit))
     if (flag && imap_has_flag (idata->flags, str))
       safe_strcat (flags, flsize, str);
 }
@@ -985,19 +985,19 @@ int imap_sync_message (IMAP_DATA *idata, HEADER *hdr, BUFFER *cmd,
 
   flags[0] = '\0';
       
-  imap_set_flag (idata, IMAP_ACL_SEEN, hdr->read, "\\Seen ",
+  imap_set_flag (idata, M_ACL_SEEN, hdr->read, "\\Seen ",
                 flags, sizeof (flags));
-  imap_set_flag (idata, IMAP_ACL_WRITE, hdr->old,
+  imap_set_flag (idata, M_ACL_WRITE, hdr->old,
                  "Old ", flags, sizeof (flags));
-  imap_set_flag (idata, IMAP_ACL_WRITE, hdr->flagged,
+  imap_set_flag (idata, M_ACL_WRITE, hdr->flagged,
                 "\\Flagged ", flags, sizeof (flags));
-  imap_set_flag (idata, IMAP_ACL_WRITE, hdr->replied,
+  imap_set_flag (idata, M_ACL_WRITE, hdr->replied,
                 "\\Answered ", flags, sizeof (flags));
-  imap_set_flag (idata, IMAP_ACL_DELETE, hdr->deleted,
+  imap_set_flag (idata, M_ACL_DELETE, hdr->deleted,
                 "\\Deleted ", flags, sizeof (flags));
 
   /* now make sure we don't lose custom tags */
-  if (mutt_bit_isset (idata->rights, IMAP_ACL_WRITE))
+  if (mutt_bit_isset (idata->ctx->rights, M_ACL_WRITE))
     imap_add_keywords (flags, hdr, idata->flags, sizeof (flags));
 
   mutt_remove_trailing_ws (flags);
@@ -1006,11 +1006,11 @@ int imap_sync_message (IMAP_DATA *idata, HEADER *hdr, BUFFER *cmd,
    * explicitly revoke all system flags (if we have permission) */
   if (!*flags)
   {
-    imap_set_flag (idata, IMAP_ACL_SEEN, 1, "\\Seen ", flags, sizeof (flags));
-    imap_set_flag (idata, IMAP_ACL_WRITE, 1, "Old ", flags, sizeof (flags));
-    imap_set_flag (idata, IMAP_ACL_WRITE, 1, "\\Flagged ", flags, sizeof (flags));
-    imap_set_flag (idata, IMAP_ACL_WRITE, 1, "\\Answered ", flags, sizeof (flags));
-    imap_set_flag (idata, IMAP_ACL_DELETE, 1, "\\Deleted ", flags, sizeof (flags));
+    imap_set_flag (idata, M_ACL_SEEN, 1, "\\Seen ", flags, sizeof (flags));
+    imap_set_flag (idata, M_ACL_WRITE, 1, "Old ", flags, sizeof (flags));
+    imap_set_flag (idata, M_ACL_WRITE, 1, "\\Flagged ", flags, sizeof (flags));
+    imap_set_flag (idata, M_ACL_WRITE, 1, "\\Answered ", flags, sizeof (flags));
+    imap_set_flag (idata, M_ACL_DELETE, 1, "\\Deleted ", flags, sizeof (flags));
 
     mutt_remove_trailing_ws (flags);
 
@@ -1046,10 +1046,10 @@ static int sync_helper (IMAP_DATA* idata, BUFFER* buf, int right, int flag,
 {
   int rc = 0;
 
-  if (!mutt_bit_isset (idata->rights, right))
+  if (!mutt_bit_isset (idata->ctx->rights, right))
     return 0;
   
-  if (right == IMAP_ACL_WRITE && !imap_has_flag (idata->flags, name))
+  if (right == M_ACL_WRITE && !imap_has_flag (idata->flags, name))
     return 0;
 
   buf->dptr = buf->data;
@@ -1111,7 +1111,7 @@ int imap_sync_mailbox (CONTEXT* ctx, int expunge, int* index_hint)
   memset (&cmd, 0, sizeof (cmd));
 
   /* if we are expunging anyway, we can do deleted messages very quickly... */
-  if (expunge && mutt_bit_isset (idata->rights, IMAP_ACL_DELETE))
+  if (expunge && mutt_bit_isset (idata->ctx->rights, M_ACL_DELETE))
   {
     mutt_buffer_addstr (&cmd, "UID STORE ");
     deleted = imap_make_msg_set (idata, &cmd, M_DELETED, 1, 0);
@@ -1194,11 +1194,11 @@ int imap_sync_mailbox (CONTEXT* ctx, int expunge, int* index_hint)
            mutt_get_sort_func (SORT_ORDER));
   }
 
-  rc += sync_helper (idata, &cmd, IMAP_ACL_DELETE, M_DELETED, "\\Deleted");
-  rc += sync_helper (idata, &cmd, IMAP_ACL_WRITE, M_FLAG, "\\Flagged");
-  rc += sync_helper (idata, &cmd, IMAP_ACL_WRITE, M_OLD, "Old");
-  rc += sync_helper (idata, &cmd, IMAP_ACL_SEEN, M_READ, "\\Seen");
-  rc += sync_helper (idata, &cmd, IMAP_ACL_WRITE, M_REPLIED, "\\Answered");
+  rc += sync_helper (idata, &cmd, M_ACL_DELETE, M_DELETED, "\\Deleted");
+  rc += sync_helper (idata, &cmd, M_ACL_WRITE, M_FLAG, "\\Flagged");
+  rc += sync_helper (idata, &cmd, M_ACL_WRITE, M_OLD, "Old");
+  rc += sync_helper (idata, &cmd, M_ACL_SEEN, M_READ, "\\Seen");
+  rc += sync_helper (idata, &cmd, M_ACL_WRITE, M_REPLIED, "\\Answered");
 
   if (oldsort != Sort)
   {
@@ -1231,7 +1231,7 @@ int imap_sync_mailbox (CONTEXT* ctx, int expunge, int* index_hint)
 
   /* We must send an EXPUNGE command if we're not closing. */
   if (expunge && !(ctx->closing) &&
-      mutt_bit_isset(idata->rights, IMAP_ACL_DELETE))
+      mutt_bit_isset(idata->ctx->rights, M_ACL_DELETE))
   {
     mutt_message _("Expunging messages from server...");
     /* Set expunge bit so we don't get spurious reopened messages */
index ecae3c346c53d1c9cd7fe27aa51fd90672cf999a..4608ce15ed933e7643ca2816b16a2e807f57c455 100644 (file)
@@ -94,22 +94,6 @@ enum
   IMAP_NS_SHARED
 };
 
-/* ACL Rights */
-enum
-{
-  IMAP_ACL_LOOKUP = 0,
-  IMAP_ACL_READ,
-  IMAP_ACL_SEEN,
-  IMAP_ACL_WRITE,
-  IMAP_ACL_INSERT,
-  IMAP_ACL_POST,
-  IMAP_ACL_CREATE,
-  IMAP_ACL_DELETE,
-  IMAP_ACL_ADMIN,
-
-  RIGHTSMAX
-};
-
 /* Capabilities we are interested in */
 enum
 {
@@ -228,7 +212,6 @@ typedef struct
   char *mailbox;
   unsigned short check_status;
   unsigned char reopen;
-  unsigned char rights[(RIGHTSMAX + 7)/8];
   unsigned int newMailCount;
   IMAP_CACHE cache[IMAP_CACHE_LEN];
   unsigned int uid_validity;
diff --git a/mutt.h b/mutt.h
index bb2a404863dc62f6dae7c992d1a299f52f98ffed..72a9d57ed113125b1fff6099f053899e9954ef15 100644 (file)
--- a/mutt.h
+++ b/mutt.h
@@ -831,6 +831,22 @@ typedef struct pattern_t
   } p;
 } pattern_t;
 
+/* ACL Rights */
+enum
+{
+  M_ACL_LOOKUP = 0,
+  M_ACL_READ,
+  M_ACL_SEEN,
+  M_ACL_WRITE,
+  M_ACL_INSERT,
+  M_ACL_POST,
+  M_ACL_CREATE,
+  M_ACL_DELETE,
+  M_ACL_ADMIN,
+
+  RIGHTSMAX
+};
+
 typedef struct
 {
   char *path;
@@ -863,6 +879,8 @@ typedef struct
 
   short magic;                 /* mailbox type */
 
+  unsigned char rights[(RIGHTSMAX + 7)/8];     /* ACL bits */
+
   unsigned int locked : 1;     /* is the mailbox locked? */
   unsigned int changed : 1;    /* mailbox has been modified */
   unsigned int readonly : 1;    /* don't allow changes to the mailbox */
diff --git a/mx.c b/mx.c
index e12f875bfb3406ee1ed0950ce48f52787292d8bf..87c15b8453ceee76fa4845262f1e60df07ab9e35 100644 (file)
--- a/mx.c
+++ b/mx.c
@@ -634,7 +634,10 @@ CONTEXT *mx_open_mailbox (const char *path, int flags, CONTEXT *pctx)
 
   ctx->msgnotreadyet = -1;
   ctx->collapsed = 0;
-  
+
+  for (rc=0; rc < RIGHTSMAX; rc++)
+    mutt_bit_set(ctx->rights,rc);
+
   if (flags & M_QUIET)
     ctx->quiet = 1;
   if (flags & M_READONLY)
diff --git a/pager.c b/pager.c
index 9231877b10f3361515c97dcbe68241b0a2244074..0a1009e79b7a03aa63e8b33eb4dbe90994f80fbd 100644 (file)
--- a/pager.c
+++ b/pager.c
@@ -83,16 +83,12 @@ static HEADER *OldHdr = NULL;
                        break; \
                     }
 
-#ifdef USE_IMAP 
-/* the error message returned here could be better. */
-#define CHECK_IMAP_ACL(aclbit) if (Context->magic == M_IMAP) \
-               if (mutt_bit_isset (((IMAP_DATA *)Context->data)->capabilities, ACL) \
-               && !mutt_bit_isset(((IMAP_DATA *)Context->data)->rights,aclbit)){ \
+#define CHECK_ACL(aclbit,action) \
+               if (!mutt_bit_isset(Context->rights,aclbit)) { \
                        mutt_flushinp(); \
-                       mutt_error ("Operation not permitted by the IMAP ACL for this mailbox"); \
+                       mutt_error (_("Cannot %s: Operation not permitted by ACL"), action); \
                        break; \
                }
-#endif
 
 struct q_class_t
 {
@@ -2261,10 +2257,7 @@ search_next:
       case OP_DELETE:
        CHECK_MODE(IsHeader (extra));
        CHECK_READONLY;
-
-#ifdef USE_IMAP
-CHECK_IMAP_ACL(IMAP_ACL_DELETE);
-#endif
+       CHECK_ACL(M_ACL_DELETE, _("delete message"));
 
        mutt_set_flag (Context, extra->hdr, M_DELETE, 1);
         if (option (OPTDELETEUNTAG))
@@ -2281,10 +2274,7 @@ CHECK_IMAP_ACL(IMAP_ACL_DELETE);
       case OP_DELETE_SUBTHREAD:
        CHECK_MODE(IsHeader (extra));
        CHECK_READONLY;
-
-#ifdef USE_IMAP
-CHECK_IMAP_ACL(IMAP_ACL_DELETE);
-#endif
+       CHECK_ACL(M_ACL_DELETE, _("delete message(s)"));
 
        r = mutt_thread_set_flag (extra->hdr, M_DELETE, 1,
                                  ch == OP_DELETE_THREAD ? 0 : 1);
@@ -2404,19 +2394,7 @@ CHECK_IMAP_ACL(IMAP_ACL_DELETE);
       case OP_FLAG_MESSAGE:
        CHECK_MODE(IsHeader (extra));
        CHECK_READONLY;
-
-#ifdef USE_POP
-       if (Context->magic == M_POP)
-       {
-         mutt_flushinp ();
-         mutt_error _("Can't change 'important' flag on POP server.");
-         break;
-       }
-#endif
-
-#ifdef USE_IMAP
-CHECK_IMAP_ACL(IMAP_ACL_WRITE);
-#endif
+       CHECK_ACL(M_ACL_WRITE, "flag message");
 
        mutt_set_flag (Context, extra->hdr, M_FLAG, !extra->hdr->flagged);
        redraw = REDRAW_STATUS | REDRAW_INDEX;
@@ -2572,10 +2550,7 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE);
       case OP_TOGGLE_NEW:
        CHECK_MODE(IsHeader (extra));
        CHECK_READONLY;
-
-#ifdef USE_IMAP
-CHECK_IMAP_ACL(IMAP_ACL_SEEN);
-#endif
+       CHECK_ACL(M_ACL_SEEN, _("toggle new"));
 
        if (extra->hdr->read || extra->hdr->old)
          mutt_set_flag (Context, extra->hdr, M_NEW, 1);
@@ -2594,10 +2569,7 @@ CHECK_IMAP_ACL(IMAP_ACL_SEEN);
       case OP_UNDELETE:
        CHECK_MODE(IsHeader (extra));
        CHECK_READONLY;
-
-#ifdef USE_IMAP
-CHECK_IMAP_ACL(IMAP_ACL_DELETE);
-#endif
+       CHECK_ACL(M_ACL_DELETE, _("undelete message"));
 
        mutt_set_flag (Context, extra->hdr, M_DELETE, 0);
        redraw = REDRAW_STATUS | REDRAW_INDEX;
@@ -2612,10 +2584,7 @@ CHECK_IMAP_ACL(IMAP_ACL_DELETE);
       case OP_UNDELETE_SUBTHREAD:
        CHECK_MODE(IsHeader (extra));
        CHECK_READONLY;
-
-#ifdef USE_IMAP
-CHECK_IMAP_ACL(IMAP_ACL_DELETE);
-#endif
+       CHECK_ACL(M_ACL_DELETE, _("undelete message(s)"));
 
        r = mutt_thread_set_flag (extra->hdr, M_DELETE, 0,
                                  ch == OP_UNDELETE_THREAD ? 0 : 1);
diff --git a/pop.c b/pop.c
index bdd5360b90e3a39a3711ad8a8b155ffd185f5dc9..374126acd1470fe292727dd3717c23f5cb5c63a6 100644 (file)
--- a/pop.c
+++ b/pop.c
@@ -376,6 +376,11 @@ int pop_open_mailbox (CONTEXT *ctx)
   conn->data = pop_data;
   pop_data->bcache = mutt_bcache_open (&acct, NULL);
 
+  /* init (hard-coded) ACL rights */
+  memset (ctx->rights, 0, sizeof (ctx->rights));
+  mutt_bit_set (ctx->rights, M_ACL_SEEN);
+  mutt_bit_set (ctx->rights, M_ACL_DELETE);
+
   FOREVER
   {
     if (pop_reconnect (ctx) < 0)