165 lines · 2.8 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <bio.h>#include <authacl.h> AuthAcl*acl_open(char *name){	Biobuf *b, *ba;	char *s;	char *toks[3];	AuthAcl *buf;	int top = 1;	int i = 0; 	buf = malloc(sizeof(AuthAcl));	if(buf == nil)		return nil;	b = Bopen("/adm/acls", OREAD);	if(b == nil){		free(buf);		return nil;	}	while((s = Brdline(b, '\n')) != nil){		s[Blinelen(b)-1] = 0;		if(top){			if(strncmp(s, "check", strlen(s)) == 0)				buf->gstatus = AclCheck;			else if(strncmp(s, "pass", strlen(s)) == 0)				buf->gstatus = AclPass;			else				buf->gstatus = AclFail;			top = 0;			continue;		}		if(tokenize(s, toks, 3) == 3){			if(strncmp(toks[0], "acl", strlen(toks[0])))				continue;			if(strcmp(toks[1], name) == 0){				buf->name = strdup(name);				buf->fname = strdup(toks[2]);				Bterm(b);				break;			}		}	}	if(buf->fname == nil){		free(buf);		return nil;	} 	ba = Bopen(buf->fname, OREAD);	if(ba == nil){		free(buf->name);		free(buf->fname);		free(buf);		return nil;	}	top = 0;	while((s = Brdline(ba, '\n')) != nil){		s[Blinelen(b)-1] = 0;		if(top == 0){			if(tokenize(s, toks, 2) != 2){				Bterm(ba);				free(buf->name);				free(buf->fname);				free(buf);				return nil;			}			buf->tusers = atoi(toks[1]);			buf->unames = malloc(sizeof(char*)*buf->tusers);			top++;			continue;		} else if(top == 1) {			if(strncmp(s, "check", strlen(s)) == 0)				buf->status = AclCheck;			else if(strncmp(s, "pass", strlen(s)) == 0)				buf->status = AclPass;			else				buf->status = AclFail;			top++;			continue;		} else {			if(tokenize(s, toks, 2) != 2)				continue;			if(strcmp(toks[0], "user") == 0){				if(i >= buf->tusers)					break;				buf->unames[i] = strdup(toks[1]);				i++;			}		}	}	Bterm(ba);	return buf;} intacl_write(AuthAcl *acl){	Biobuf *b; 	b = Bopen(acl->fname, OTRUNC|OWRITE);	if(b == nil)		return -1;	Bprint(b, "len %d\n", acl->tusers);	switch(acl->status){	case AclCheck:		Bprint(b, "check\n");		break;	case AclPass:		Bprint(b, "pass\n");		break;	case AclFail:	default:		Bprint(b, "fail\n");		break;	}	for(int i = 0; i < acl->tusers; i++)		Bprint(b, "user %s\n", acl->unames[i]);	Bterm(b);	return 0;} intacl_close(AuthAcl *acl){	free(acl->fname);	free(acl->name);	for(int i = 0; i < acl->tusers; i++)		free(acl->unames[i]);	free(acl->unames);	free(acl);	return 0;} intacl_check(AuthAcl *acl, char *user){	if(acl->gstatus == AclPass || acl->status == AclPass)		return 1;	else if(acl->gstatus == AclFail || acl->status == AclFail)		return 0;	else {		for(int i = 0; i < acl->tusers; i++){			if(strcmp(user, acl->unames[i]) == 0)				return 1;		}	}	return 0;} intcheckacl(char *name, char *user){	AuthAcl *a;	int st; 	a = acl_open(name);	if(a == nil)		return 0;	st = acl_check(a, user);	acl_close(a);	return st;}