]> oss.titaniummirror.com Git - repo_shell.git/blobdiff - git_acl.c
gitcreate: add option to set description
[repo_shell.git] / git_acl.c
index ea171feedf2ba521cf9cf9995961e3b4769cacdf..8783874b8472310f923ef85377b96fde0e35ee34 100644 (file)
--- a/git_acl.c
+++ b/git_acl.c
  */
 
 #include <stdbool.h>
-//#include <stdio.h>
-//#include <errno.h>
-//#include <stdlib.h>
-//#include <sys/types.h>
-//#include <fcntl.h>
-//#include <unistd.h>
-//#include <pwd.h>
+#include <stdlib.h>
 #include <string.h>
+#include <strings.h>
 #include "ini.h"
 #include "utility.h"
-#include "mystrtok.h"
+#include "stringutils.h"
 #include "stra.h"
 #include "git_acl.h"
 
-#define ANYID   "*"
-
 enum {
   DFLT_IDS_SZ = 32
 };
@@ -44,9 +37,7 @@ typedef struct {
   perms_t perms;
 } acl_t;
 
-const char* perm_str[PERMS_COUNT] = {
-  "NOTFOUND", "NONE", "READ", "READ_WRITE"
-};
+const char* perms_str[PERMS_COUNT] = { "", "", "r", "rw" };
 
 const char* lm_none = "<none>";
 static char *lm_repoid = NULL;
@@ -83,7 +74,7 @@ static const char *perms_as_str(perms_t p)
 {
   if (p < PERMS_NOTFOUND || p >= PERMS_COUNT)
     die("perms_as_str: invalid perm %u", p);
-  return perm_str[p];
+  return perms_str[p];
 }
 
 static perms_t perms_from_str(const char *str)
@@ -92,11 +83,11 @@ static perms_t perms_from_str(const char *str)
 
   if (!str)
     return PERMS_NOTFOUND;
-  else if (!*str)
+  else if (!strcmp(str, perms_str[PERMS_NONE]))
     return PERMS_NONE;
-  else if (!strcmp(str, "r"))
+  else if (!strcmp(str, perms_str[PERMS_READ]))
     return PERMS_READ;
-  else if (!strcmp(str, "rw"))
+  else if (!strcmp(str, perms_str[PERMS_READ_WRITE]))
     return PERMS_READ_WRITE;
   else
     die("Invalid perms value '%s'", str);
@@ -116,23 +107,6 @@ static acl_clear(acl_t *acl)
   stra_destroy(&acl->userids);
 }
 
-static bool str_has_word(const char* string, const char* word)
-{
-  char *_s = xstrdup(string);
-  char *s = _s;
-  char *p = my_strtok(&s, " \t\n");
-
-  while (p) {
-    if (!strcmp(p, word) || !strcmp(p, ANYID)) {
-      free(_s);
-      return true;
-    }
-    p = my_strtok(&s, " \t\n");
-  }
-  free(_s);
-  return false;
-}
-
 static int acl_handler(void* user, const char* section, const char* name,
     const char* value)
 {
@@ -149,20 +123,20 @@ static int acl_handler(void* user, const char* section, const char* name,
       stra_add(&acl->userids, name);
     }
   } else if (!strcmp(section, "repo_groups")) {
-    if (str_has_word(value, acl->repo)) {
+    if (str_has_repo(value, acl->repo)) {
       //debug("repoids += '%s'", name);
       stra_add(&acl->repoids, name);
     }
   } else if (!strncmp(section, "repo", 4)) {
     char *_p = xstrdup(section + 4);
     char *p = _p;
-    char *repo = my_strtok(&p, " \t\n");
+    char *repo = strip_repo(my_strtok(&p, " \t\n"));
 
     if (!repo || my_strtok(&p, " \t\n"))
       die("acl_handler: badly formatted section '%s'", section);
     /* repo is repo name, name is userid, value is permission */
-    if ((!strcmp(repo, ANYID) || stra_find(&acl->repoids, repo) >= 0) &&
-        (!strcmp(name, ANYID) || stra_find(&acl->userids, name) >= 0)) {
+    if (stra_match(&acl->repoids, repo) >= 0 &&
+        stra_match(&acl->userids, name) >= 0) {
       acl->perms = perms_from_str(value);
       set_lm_repoid(repo);
       set_lm_userid(name);
@@ -170,6 +144,7 @@ static int acl_handler(void* user, const char* section, const char* name,
       //debug("match: repoid='%s', userid='%s', perms='%s'(%u)", repo, name,
       //    value, acl->perms);
     }
+    free(repo);
     free(_p);
   } else
     die("acl_handler: unknown section='%s' name='%s'", section, name);
@@ -179,6 +154,7 @@ static int acl_handler(void* user, const char* section, const char* name,
 int git_acl(const char *user, const char *repo, const char *file)
 {
   acl_t acl;
+  char *r;
 
   if (!file || !*file || !user || !*user || !repo || !*repo) {
     die("git_acl: invalid args user='%s', repo='%s', file='%s'", user, repo,
@@ -192,7 +168,9 @@ int git_acl(const char *user, const char *repo, const char *file)
   acl.user = (char*)user;
   acl.repo = (char*)repo;
   stra_add(&acl.userids, acl.user);
-  stra_add(&acl.repoids, acl.repo);
+  r = strip_repo(acl.repo);
+  stra_add(&acl.repoids, r);
+  free(r);
 
   //debug("Searching for '%s'@'%s'", acl.user, acl.repo);
   if (ini_parse(file, acl_handler, &acl) < 0)