[Cvs-nserver-commits] CVS: cvs-nserver/acl branch-acl.c,1.1.2.14,1.1.2.15 check_acl.c,1.1.2.9,1.1.2.
Brought to you by:
tyranny
From: Alexey M. <ty...@us...> - 2001-11-27 00:24:51
|
Update of /cvsroot/cvs-nserver/cvs-nserver/acl In directory usw-pr-cvs1:/tmp/cvs-serv23991 Modified Files: Tag: NCLI-1-11-1 branch-acl.c check_acl.c check_acl.h check_branch_acl.c check_default_file_acl.c dir-acl.c dir-acl.h Log Message: Mostly fix branching wrt default file ACLs Index: branch-acl.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/acl/Attic/branch-acl.c,v retrieving revision 1.1.2.14 retrieving revision 1.1.2.15 diff -u -d -r1.1.2.14 -r1.1.2.15 --- branch-acl.c 2001/11/25 20:00:00 1.1.2.14 +++ branch-acl.c 2001/11/27 00:24:46 1.1.2.15 @@ -130,7 +130,7 @@ static USER_ACE * -get_inherited_user_ace (struct DIR_ACL *dir_acl, char *username) +get_inherited_user_ace (struct DIR_ACL *dir_acl, char *branch, char *username) { struct DIR_ACL **top_dirs = dir_acl->top_dirs; USER_ACE *last_user_ace = NULL; @@ -138,8 +138,9 @@ if (top_dirs != NULL) { for (; *top_dirs; top_dirs++) { struct DIR_ACL *top_dir = *top_dirs; - USER_ACE *user_ace = - get_user_ace(top_dir->default_file_acl, username); + struct USER_ACL *default_file_acl = get_default_file_user_acl(top_dir, branch); + + USER_ACE *user_ace = get_user_ace(default_file_acl, username); if (user_ace != NULL) last_user_ace = user_ace; @@ -171,9 +172,11 @@ return internal_branch_permission_granted(trunk_ace, username, perm); } - ace = get_inherited_user_ace(dir_acl, username); - if (ace == NULL) - ace = get_user_ace(dir_acl->default_file_acl, username); + ace = get_inherited_user_ace(dir_acl, branch_acl->branch, username); + if (ace == NULL) { + struct USER_ACL *default_file_acl = get_default_file_user_acl(dir_acl, branch_acl->branch); + ace = get_user_ace(default_file_acl, username); + } if (ace == NULL) return default_branch_perm & perm; return ace->perm & perm; Index: check_acl.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/acl/Attic/check_acl.c,v retrieving revision 1.1.2.9 retrieving revision 1.1.2.10 diff -u -d -r1.1.2.9 -r1.1.2.10 --- check_acl.c 2001/11/25 20:00:00 1.1.2.9 +++ check_acl.c 2001/11/27 00:24:46 1.1.2.10 @@ -50,6 +50,8 @@ check_on_branch_acl(); + check_default_dir_on_branch_acl(); + check_persistent_on_branch_acl("./test-acl"); check_reading_acl_file(); Index: check_acl.h =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/acl/Attic/check_acl.h,v retrieving revision 1.1.2.7 retrieving revision 1.1.2.8 diff -u -d -r1.1.2.7 -r1.1.2.8 --- check_acl.h 2001/11/25 20:00:00 1.1.2.7 +++ check_acl.h 2001/11/27 00:24:46 1.1.2.8 @@ -27,6 +27,7 @@ void check_parsing_branch_permissions (void); void check_on_branch_acl (void); +void check_default_dir_on_branch_acl (void); void check_persistent_on_branch_acl (char *topdir); Index: check_branch_acl.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/acl/Attic/check_branch_acl.c,v retrieving revision 1.1.2.11 retrieving revision 1.1.2.12 diff -u -d -r1.1.2.11 -r1.1.2.12 --- check_branch_acl.c 2001/11/25 20:00:00 1.1.2.11 +++ check_branch_acl.c 2001/11/27 00:24:46 1.1.2.12 @@ -134,34 +134,40 @@ assert(!branch_permission_granted(foo_ace, "vasya", branch_perm_checkout)); } +#define INTRO \ +\ + DIR_ACL *topdir_acl; \ + BRANCH_ACL *trunk_acl; \ + BRANCH_ACL *branch_acl; \ + BRANCH_ACE *foo_on_branch_ace; \ + BRANCH_ACE *foo_on_trunk_ace; \ +\ + topdir_acl = get_dir_acl("./test-acl", "BRANCH"); \ + assert(topdir_acl != NULL); \ +\ + trunk_acl = get_branch_acl(topdir_acl, "trunk"); \ + assert(trunk_acl != NULL); \ +\ + branch_acl = get_branch_acl(topdir_acl, "BRANCH"); \ + assert(branch_acl != NULL); \ +\ + foo_on_branch_ace = get_file_on_branch_ace(branch_acl, "foo"); \ + assert(foo_on_branch_ace != NULL); \ +\ + foo_on_trunk_ace = get_file_on_branch_ace(trunk_acl, "foo"); \ + assert(foo_on_trunk_ace != NULL); \ + + + void check_on_branch_acl (void) { - DIR_ACL *topdir_acl; - BRANCH_ACL *trunk_acl; - BRANCH_ACL *branch_acl; - BRANCH_ACE *foo_on_branch_ace; - BRANCH_ACE *foo_on_trunk_ace; + INTRO; /* try to set permissions on trunk and see if they are used on branch only if not re-defined on branch */ - topdir_acl = get_dir_acl("./test-acl", "BRANCH"); - assert(topdir_acl != NULL); - - trunk_acl = get_branch_acl(topdir_acl, "trunk"); - assert(trunk_acl != NULL); - - branch_acl = get_branch_acl(topdir_acl, "BRANCH"); - assert(branch_acl != NULL); - - foo_on_branch_ace = get_file_on_branch_ace(branch_acl, "foo"); - assert(foo_on_branch_ace != NULL); - - foo_on_trunk_ace = get_file_on_branch_ace(trunk_acl, "foo"); - assert(foo_on_trunk_ace != NULL); - assert(set_branch_ace(foo_on_trunk_ace, "alice", branch_perm_checkin) == branch_perm_checkin); /* check that permissions on trunk are used as default permissions on branches */ @@ -170,32 +176,30 @@ } + void -check_persistent_on_branch_acl (char *topdir) +check_default_dir_on_branch_acl (void) { - DIR_ACL *topdir_acl; - BRANCH_ACL *trunk_acl; - BRANCH_ACL *branch_acl; - BRANCH_ACE *foo_on_branch_ace; - BRANCH_ACE *foo_on_trunk_ace; + INTRO; - topdir_acl = get_dir_acl(topdir, "BRANCH"); - assert(topdir_acl != NULL); + /* set default permissions on trunk and on branch */ + assert(set_default_file_acl(topdir_acl, "trunk", "alice", branch_perm_checkout) == branch_perm_checkout); - branch_acl = get_branch_acl(topdir_acl, "BRANCH"); - assert(branch_acl != NULL); + assert(set_default_file_acl(topdir_acl, "BRANCH", "alice", branch_perm_none) == branch_perm_none); - foo_on_branch_ace = get_file_on_branch_ace(branch_acl, "foo"); - assert(foo_on_branch_ace != NULL); + /* ...and see if they work independently */ + assert(branch_permission_granted(foo_on_trunk_ace, "alice", branch_perm_checkout)); + assert(!branch_permission_granted(foo_on_trunk_ace, "alice", branch_perm_checkin)); - trunk_acl = get_branch_acl(topdir_acl, "trunk"); - assert(trunk_acl != NULL); +} +void +check_persistent_on_branch_acl (char *topdir) +{ + INTRO; + assert(branch_permission_granted(foo_on_branch_ace, "alice", branch_perm_checkin)); assert(branch_permission_granted(foo_on_branch_ace, "alice", branch_perm_checkout)); - - foo_on_trunk_ace = get_file_on_branch_ace(trunk_acl, "foo"); - assert(foo_on_trunk_ace != NULL); assert(branch_permission_granted(foo_on_trunk_ace, "alice", branch_perm_checkin)); assert(branch_permission_granted(foo_on_trunk_ace, "alice", branch_perm_checkout)); Index: check_default_file_acl.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/acl/Attic/check_default_file_acl.c,v retrieving revision 1.1.2.3 retrieving revision 1.1.2.4 diff -u -d -r1.1.2.3 -r1.1.2.4 --- check_default_file_acl.c 2001/11/21 23:07:42 1.1.2.3 +++ check_default_file_acl.c 2001/11/27 00:24:46 1.1.2.4 @@ -8,6 +8,27 @@ #include <stdlib.h> static void +check_default_file_acl_internals (void) +{ + struct DIR_ACL *topdir_acl; + struct DEFAULT_FILE_ACL *dfa; + + topdir_acl = get_dir_acl("./test-acl", "trunk"); + assert(topdir_acl != NULL); + + assert(topdir_acl->default_file_acl == NULL); + + assert(set_default_file_acl(topdir_acl, "BRANCH", "bob", branch_perm_all) == branch_perm_all); + dfa = topdir_acl->default_file_acl; + assert(dfa != NULL); + assert(strcmp(dfa->branch, "BRANCH") == 0); + assert(dfa->user_acl != NULL); + assert(dfa->user_acl->next == NULL); + assert(strcmp(dfa->user_acl->username, "bob") == 0); + assert(dfa->user_acl->perm == branch_perm_all); +} + +static void check_default_file_acl (void) { struct DIR_ACL *topdir_acl; @@ -130,6 +151,8 @@ int main (void) { + check_default_file_acl_internals(); + check_default_file_acl(); check_persistent_default_file_acl(); Index: dir-acl.c =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/acl/Attic/dir-acl.c,v retrieving revision 1.1.2.9 retrieving revision 1.1.2.10 diff -u -d -r1.1.2.9 -r1.1.2.10 --- dir-acl.c 2001/11/25 20:00:00 1.1.2.9 +++ dir-acl.c 2001/11/27 00:24:46 1.1.2.10 @@ -89,8 +89,8 @@ dir_acl->top_dirs_allocated += ALLOC_DELTA; } - top_dirs[dirs_count] = top_dir; - top_dirs[dirs_count + 1] = NULL; + top_dirs[dirs_count++] = top_dir; + top_dirs[dirs_count] = NULL; return 1; } @@ -192,9 +192,6 @@ goto err; *p++ = '\0'; - if (strcmp(branch, "trunk") != 0) - continue; - username = p; while (*p && (*p != '\t')) @@ -213,16 +210,8 @@ if (initial_char == '/') set_dir_ace(dir_acl, username, parse_dir_permissions(perm_string)); - if (initial_char == 'D') { - struct USER_ACL *new_acl; - - new_acl = set_user_ace(dir_acl->default_file_acl, username, - parse_branch_permissions(perm_string)); - if (new_acl == NULL) - goto err; - - dir_acl->default_file_acl = new_acl; - } + if (initial_char == 'D') + set_default_file_acl(dir_acl, branch, username, parse_branch_permissions(perm_string)); } fclose(acl); @@ -475,45 +464,29 @@ } static int -internal_store_default_file_acl (int fd, DIR_ACL *dir_acl) +internal_store_default_file_acl (FILE *acl_file, DIR_ACL *dir_acl) { - int retval = -1; - struct stringbuf *line = NULL; - int saved_len; - struct USER_ACL *user_acl = dir_acl->default_file_acl; - - line = new_stringbuf("D"); - if (line == NULL) - goto out; - - cat_stringbuf(line, "trunk"); - catc_stringbuf(line, '\t'); - saved_len = line->len; - while (user_acl != NULL) { - cat_stringbuf(line, user_acl->username); - catc_stringbuf(line, '\t'); - cat_stringbuf(line, branch_permissions_string(user_acl->perm)); - catc_stringbuf(line, '\n'); - - if (write(fd, line->buf, line->len) != line->len) - goto out; + struct DEFAULT_FILE_ACL *dfa = dir_acl->default_file_acl; - shrink_stringbuf(line, saved_len); + while (dfa != NULL) { + struct USER_ACL *user_acl = dfa->user_acl; + while (user_acl != NULL) { + fprintf(acl_file, "D%s\t%s\t%s\n", dfa->branch, + user_acl->username, branch_permissions_string(user_acl->perm)); - user_acl = user_acl->next; + user_acl = user_acl->next; + } + dfa = dfa->next; } - retval = 0; - out: - free_stringbuf(line); - - return retval; + return 0; } int store_dir_acl (struct DIR_ACL *dir_acl) { int fd; + FILE *acl_file; int retval = -1; struct stringbuf *filename = NULL; struct stringbuf *tmpfilename = NULL; @@ -534,13 +507,17 @@ if (fd == -1) goto out; + acl_file = fdopen(fd, "w"); + if (acl_file == NULL) + goto out; + if (internal_store_dir_acl(fd, dir_acl) != 0) goto out; - if (internal_store_default_file_acl(fd, dir_acl) != 0) + if (internal_store_default_file_acl(acl_file, dir_acl) != 0) goto out; - if (close(fd) == -1) + if (fclose(acl_file) == EOF) goto out; if (rename(tmpfilename->buf, filename->buf) == -1) @@ -623,16 +600,59 @@ } +static struct DEFAULT_FILE_ACL * +get_default_file_acl (DIR_ACL *dir_acl, char *branch) +{ + struct DEFAULT_FILE_ACL *current = dir_acl->default_file_acl; + + while (current != NULL) { + if (strcmp(current->branch, branch) == 0) + return current; + + current = current->next; + } + + return NULL; +} + +struct USER_ACL * +get_default_file_user_acl (DIR_ACL *dir_acl, char *branch) +{ + struct DEFAULT_FILE_ACL *dfa = get_default_file_acl(dir_acl, branch); + if (dfa == NULL) + return NULL; + + return dfa->user_acl; +} + int set_default_file_acl (DIR_ACL *dir_acl, char *branch, char *username, int perm) { + struct DEFAULT_FILE_ACL *dfa; struct USER_ACL *new_acls; - new_acls = set_user_ace(dir_acl->default_file_acl, username, perm); + dfa = get_default_file_acl(dir_acl, branch); + if (dfa == NULL) { + dfa = calloc(1, sizeof(struct DEFAULT_FILE_ACL)); + if (dfa == NULL) + return 0; + + dfa->branch = strdup(branch); + if (dfa->branch == NULL) { + free(dfa); + return 0; + } + + dfa->next = dir_acl->default_file_acl; + + dir_acl->default_file_acl = dfa; + } + + new_acls = set_user_ace(dfa->user_acl, username, perm); if (new_acls == NULL) - return branch_perm_none; + return 0; - dir_acl->default_file_acl = new_acls; - + dfa->user_acl = new_acls; + return perm; } Index: dir-acl.h =================================================================== RCS file: /cvsroot/cvs-nserver/cvs-nserver/acl/Attic/dir-acl.h,v retrieving revision 1.1.2.6 retrieving revision 1.1.2.7 diff -u -d -r1.1.2.6 -r1.1.2.7 --- dir-acl.h 2001/11/25 20:00:00 1.1.2.6 +++ dir-acl.h 2001/11/27 00:24:46 1.1.2.7 @@ -22,10 +22,16 @@ struct BRANCH_ACL; +struct DEFAULT_FILE_ACL { + char *branch; + struct USER_ACL *user_acl; + struct DEFAULT_FILE_ACL *next; +}; + struct DIR_ACL { stringbuf *dirname; struct USER_ACL *user_acls; - struct USER_ACL *default_file_acl; + struct DEFAULT_FILE_ACL *default_file_acl; struct DIR_ACL **top_dirs; struct BRANCH_ACL *branch_acls; int top_dirs_count; @@ -64,5 +70,7 @@ int store_dir_acl (struct DIR_ACL *dir_acl); int set_default_file_acl (DIR_ACL *dir_acl, char *branch, char *username, int perm); + +struct USER_ACL *get_default_file_user_acl(DIR_ACL *dir_acl, char *branch); #endif /* DIR_ACL_H */ |