*/
#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
};
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;
{
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)
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);
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)
{
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);
//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);
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,
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)