]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap-acl: Handle obsolete 'c' and 'd' rights.
authorTimo Sirainen <tss@iki.fi>
Fri, 20 Feb 2009 20:47:39 +0000 (15:47 -0500)
committerTimo Sirainen <tss@iki.fi>
Fri, 20 Feb 2009 20:47:39 +0000 (15:47 -0500)
Patch by Sascha Wilde.

--HG--
branch : HEAD

src/plugins/imap-acl/imap-acl-plugin.c

index a9d8a74f53ba3c5457ba3d36efe057f68cc72624..5a2f5b1c86b1397530faa76f44bb62b9d1ffb7b7 100644 (file)
@@ -305,6 +305,10 @@ static int
 imap_acl_letters_parse(const char *letters, const char *const **rights_r,
                       const char **error_r)
 {
+       static const char *acl_k = MAIL_ACL_CREATE;
+       static const char *acl_x = MAIL_ACL_DELETE;
+       static const char *acl_e = MAIL_ACL_EXPUNGE;
+       static const char *acl_t = MAIL_ACL_WRITE_DELETED;
        ARRAY_TYPE(const_string) rights;
        unsigned int i;
 
@@ -318,9 +322,22 @@ imap_acl_letters_parse(const char *letters, const char *const **rights_r,
                        }
                }
                if (imap_acl_letter_map[i].name == NULL) {
-                       *error_r = t_strdup_printf("Invalid ACL right: %c",
-                                                  *letters);
-                       return -1;
+                       /* Handling of obsolete rights as virtual
+                          rights according to RFC 4314 */
+                       switch (*letters) {
+                       case 'c':
+                               array_append(&rights, &acl_k, 1);
+                               array_append(&rights, &acl_x, 1);
+                               break;
+                       case 'd':
+                               array_append(&rights, &acl_e, 1);
+                               array_append(&rights, &acl_t, 1);
+                               break;
+                       default:
+                               *error_r = t_strdup_printf(
+                                       "Invalid ACL right: %c", *letters);
+                               return -1;
+                       }
                }
        }
        (void)array_append_space(&rights);