1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
/*----------------------------------------------------------------------------*/
/* Xymon monitor library. */
/* */
/* This is a library module, part of libxymon. */
/* It contains routines for web access control. */
/* */
/* Copyright (C) 2011 Henrik Storner <henrik@storner.dk> */
/* */
/* This program is released under the GNU General Public License (GPL), */
/* version 2. See the file "COPYING" for details. */
/* */
/*----------------------------------------------------------------------------*/
static char rcsid[] = "$Id: misc.c 6712 2011-07-31 21:01:52Z storner $";
#include <string.h>
#include "config.h"
#include "libxymon.h"
void *acctree = NULL;
void *load_web_access_config(char *accessfn)
{
FILE *fd;
strbuffer_t *buf;
if (acctree) return 0;
acctree = xtreeNew(strcasecmp);
fd = stackfopen(accessfn, "r", NULL);
if (fd == NULL) return NULL;
buf = newstrbuffer(0);
while (stackfgets(buf, NULL)) {
char *group, *member;
SBUF_DEFINE(key);
group = strtok(STRBUF(buf), ": \n");
if (!group) continue;
member = strtok(NULL, ", \n");
while (member) {
SBUF_MALLOC(key, strlen(group) + strlen(member) + 2);
snprintf(key, key_buflen, "%s %s", group, member);
xtreeAdd(acctree, key, NULL);
member = strtok(NULL, ", \n");
}
}
stackfclose(fd);
return acctree;
}
int web_access_allowed(char *username, char *hostname, char *testname, web_access_type_t acc)
{
void *hinfo;
char *pages, *onepg;
SBUF_DEFINE(key);
hinfo = hostinfo(hostname);
if (!hinfo || !acctree || !username) return 0;
/* Check for "root" access first */
SBUF_MALLOC(key, strlen(username) + 6);
snprintf(key, key_buflen, "root %s", username);
if (xtreeFind(acctree, key) != xtreeEnd(acctree)) {
xfree(key);
return 1;
}
xfree(key);
pages = strdup(xmh_item(hinfo, XMH_ALLPAGEPATHS));
onepg = strtok(pages, ",");
while (onepg) {
char *p;
p = strchr(onepg, '/'); if (p) *p = '\0'; /* Will only look at the top-level path element */
SBUF_MALLOC(key, strlen(onepg) + strlen(username) + 2);
snprintf(key, key_buflen, "%s %s", onepg, username);
if (xtreeFind(acctree, key) != xtreeEnd(acctree)) {
xfree(key);
xfree(pages);
return 1;
}
xfree(key);
onepg = strtok(NULL, ",");
}
xfree(pages);
if (hostname) {
/* See if user is a member of a group named by the hostname */
SBUF_MALLOC(key, strlen(hostname) + strlen(username) + 2);
snprintf(key, key_buflen, "%s %s", hostname, username);
if (xtreeFind(acctree, key) != xtreeEnd(acctree)) {
xfree(key);
return 1;
}
xfree(key);
}
if (testname) {
/* See if user is a member of a group named by the testname */
SBUF_MALLOC(key, strlen(testname) + strlen(username) + 2);
snprintf(key, key_buflen, "%s %s", testname, username);
if (xtreeFind(acctree, key) != xtreeEnd(acctree)) {
xfree(key);
return 1;
}
xfree(key);
}
return 0;
}
|