Mercurial > dovecot > original-hg > dovecot-1.2
changeset 9247:7168ca62c556 HEAD
acl: Support spaces in user/group identifiers.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 26 Jul 2009 15:03:30 -0400 |
parents | 25650d7f6b85 |
children | ea84eb708efc |
files | src/plugins/acl/acl-backend-vfile.c |
diffstat | 1 files changed, 33 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/plugins/acl/acl-backend-vfile.c Sun Jul 26 14:21:49 2009 -0400 +++ b/src/plugins/acl/acl-backend-vfile.c Sun Jul 26 15:03:30 2009 -0400 @@ -5,6 +5,7 @@ #include "array.h" #include "bsearch-insert-pos.h" #include "str.h" +#include "strescape.h" #include "istream.h" #include "ostream.h" #include "file-dotlock.h" @@ -363,12 +364,29 @@ return 0; /* <id> [<imap acls>] [:<named acls>] */ - p = strchr(line, ' '); - if (p == NULL) - p = ""; - else { - line = t_strdup_until(line, p); + if (*line == '"') { + for (p = line + 1; *p != '\0'; p++) { + if (*p == '\\' && p[1] != '\0') + p++; + else if (*p == '"') + break; + } + if (p[0] != '"' || (p[1] != ' ' && p[1] != '\0')) { + i_error("ACL file %s line %u: Invalid quoted ID", + path, linenum); + return -1; + } + line = t_strdup_until(line + 1, p); + line = str_unescape(t_strdup_noconst(line)); p++; + } else { + p = strchr(line, ' '); + if (p == NULL) + p = ""; + else { + line = t_strdup_until(line, p); + p++; + } } memset(&rights, 0, sizeof(rights)); @@ -1017,6 +1035,14 @@ if (neg) str_append_c(dest,'-'); acl_rights_write_id(dest, right); + + if (strchr(str_c(dest), ' ') != NULL) T_BEGIN { + /* need to escape it */ + const char *escaped = t_strdup(str_escape(str_c(dest))); + str_truncate(dest, 0); + str_printfa(dest, "\"%s\"", escaped); + } T_END; + str_append_c(dest, ' '); vfile_write_rights_list(dest, rights); str_append_c(dest, '\n'); @@ -1035,7 +1061,7 @@ output = o_stream_create_fd_file(fd, 0, FALSE); o_stream_cork(output); - str = t_str_new(256); + str = str_new(default_pool, 256); /* rights are sorted with globals at the end, so we can stop at the first global */ rights = array_get(&aclobj->rights, &count); @@ -1047,6 +1073,7 @@ o_stream_send(output, str_data(str), str_len(str)); str_truncate(str, 0); } + str_free(&str); if (o_stream_flush(output) < 0) { i_error("write(%s) failed: %m", path); ret = -1;