static void acl_details(CXmlNodePtr acl,const char *type) { CXmlNodePtr h=fileattr_find(acl,type); const char *d,*i; if(h) { d=fileattr_getvalue(h,"@deny"); i=fileattr_getvalue(h,"@inherit"); if(!strcmp(type,"all") && (d && atoi(d))) { type="none"; d=NULL; } printf("\t%s",type); if((d && atoi(d)) || (i && !atoi(i))) { printf("("); if(d && atoi(d)) { printf("deny"); if(i && atoi(i)) printf(","); } if(i&&!atoi(i)) { printf("noinherit"); } printf(")"); } printf("\n"); } }
static void show_acl(CXmlNodePtr acl) { while(acl) { const char *user = fileattr_getvalue(acl,"@user"); const char *branch = fileattr_getvalue(acl,"@branch"); const char *merge = fileattr_getvalue(acl,"@merge"); const char *priority = fileattr_getvalue(acl,"@priority"); const char *message = fileattr_getvalue(acl,"message"); const char *comma=""; printf("\n"); if(user) { printf("user=%s",user); comma=","; } if(branch) { printf("%sbranch=%s",comma,branch); comma=","; } if(merge) { printf("%smerge=%s",comma,merge); } if(!user && !branch && !merge) printf("<default>"); if(priority) printf(",priority=%s",priority); if(message) printf(",message=%s",message); printf("\n"); acl_details(acl,"all"); acl_details(acl,"read"); acl_details(acl,"write"); acl_details(acl,"create"); acl_details(acl,"tag"); acl_details(acl,"control"); acl = fileattr_next(acl); } }
/* * Show file ACL */ static Dtype lsacl_dirproc (void *callerdat, char *dir, char *repos, char *update_dir, List *entries, const char *virtual_repository, Dtype hint) { const char *owner; CXmlNodePtr acl; if(hint!=R_PROCESS) return hint; owner = fileattr_getvalue(NULL,"directory/owner"); if(is_rlsacl && !strcmp(update_dir,".")) update_dir="<root>"; printf("Directory: %s\n",update_dir); printf("Owner: %s\n",(owner&&*owner)?owner:"<not set>"); acl = fileattr_find(NULL,"directory/acl"); show_acl(acl); return R_PROCESS; }
static void set_acl(CXmlNodePtr base) { CXmlNodePtr acl, acl_to_set = NULL; acl = fileattr_find(base,"acl"); while(acl) { const char *user = fileattr_getvalue(acl,"@user"); const char *branch = fileattr_getvalue(acl,"@branch"); const char *merge = fileattr_getvalue(acl,"@merge"); if(((!user && !parms.user) || (user && parms.user && !usercmp(user,parms.user))) && ((!branch && !parms.branch) || (branch && parms.branch && !strcmp(branch,parms.branch))) && ((!merge && !parms.merge) || (merge && parms.merge && !strcmp(merge,parms.merge)))) { acl_to_set = acl; break; } acl = fileattr_next(acl); } if(acl_to_set) fileattr_batch_delete(acl_to_set); if(!parms.del) { char *parm = xstrdup(parms.access); char *acc = parm?strtok(parm,","):NULL; base->NewNode("acl"); fileattr_modified(); if(parms.user) base->NewAttribute("user",parms.user); if(parms.branch) base->NewAttribute("branch",parms.branch); if(parms.merge) base->NewAttribute("merge",parms.merge); if(parms.priority && atoi(parms.priority)) base->NewAttribute("priority",parms.priority); if(parms.message) base->NewNode("message",parms.message,false); base->NewNode("modified_by",getcaller(),false); base->NewNode("modified_date",current_date,false); while(acc) { int deny=0; if(!strncmp(acc,"no",2) && strcmp(acc,"none")) { deny=1; acc+=2; } if(!strcmp(acc,"all")) set_attrs(base,"all",deny,parms.noinherit); else if(!strcmp(acc,"none")) set_attrs(base,"all",!deny,parms.noinherit); else if(!strcmp(acc,"read")) set_attrs(base,"read",deny,parms.noinherit); else if(!strcmp(acc,"write")) set_attrs(base,"write",deny,parms.noinherit); else if(!strcmp(acc,"create")) set_attrs(base,"create",deny,parms.noinherit); else if(!strcmp(acc,"tag")) set_attrs(base,"tag",deny,parms.noinherit); else if(!strcmp(acc,"control")) set_attrs(base,"control",deny,parms.noinherit); else error(1,0,"Invalid access control attribute '%s'",acc); acc = strtok(NULL,","); } base->GetParent(); fileattr_prune(base); xfree(parm); } else { if(acl_to_set) fileattr_prune(acl_to_set); } }