#include "sm.h"
xht aci_load(sm_t sm)
{
xht acls;
int aelem, jelem, attr;
char type[33];
jid_t list, jid;
log_debug(ZONE, "loading aci");
acls = xhash_new(51);
if((aelem = nad_find_elem(sm->config->nad, 0, -1, "aci", 1)) < 0)
return acls;
aelem = nad_find_elem(sm->config->nad, aelem, -1, "acl", 1);
while(aelem >= 0)
{
list = NULL;
if((attr = nad_find_attr(sm->config->nad, aelem, -1, "type", NULL)) < 0)
{
aelem = nad_find_elem(sm->config->nad, aelem, -1, "acl", 0);
continue;
}
snprintf(type, 33, "%.*s", NAD_AVAL_L(sm->config->nad, attr), NAD_AVAL(sm->config->nad, attr));
log_debug(ZONE, "building list for '%s'", type);
jelem = nad_find_elem(sm->config->nad, aelem, -1, "jid", 1);
while(jelem >= 0)
{
if(NAD_CDATA_L(sm->config->nad, jelem) > 0)
{
jid = jid_new(sm->pc, NAD_CDATA(sm->config->nad, jelem), NAD_CDATA_L(sm->config->nad, jelem));
list = jid_append(list, jid);
log_debug(ZONE, "added '%s'", jid_user(jid));
jid_free(jid);
}
jelem = nad_find_elem(sm->config->nad, jelem, -1, "jid", 0);
}
if(list != NULL) {
xhash_put(acls, pstrdup(xhash_pool(acls), type), (void *) list);
}
aelem = nad_find_elem(sm->config->nad, aelem, -1, "acl", 0);
}
return acls;
}
int aci_check(xht acls, char *type, jid_t jid)
{
jid_t list, dup;
dup = jid_dup(jid);
dup->resource[0] = '\0'; dup->dirty = 1;
log_debug(ZONE, "checking for '%s' in acl 'all'", jid_full(jid));
list = (jid_t) xhash_get(acls, "all");
if(jid_search(list, jid)) {
jid_free(dup);
return 1;
}
log_debug(ZONE, "checking for '%s' in acl 'all'", jid_user(dup));
if(jid_search(list, dup)) {
jid_free(dup);
return 1;
}
if(type != NULL) {
log_debug(ZONE, "checking for '%s' in acl '%s'", jid_full(jid), type);
list = (jid_t) xhash_get(acls, type);
if(jid_search(list, jid)) {
jid_free(dup);
return 1;
}
log_debug(ZONE, "checking for '%s' in acl '%s'", jid_user(dup), type);
if(jid_search(list, dup)) {
jid_free(dup);
return 1;
}
}
jid_free(dup);
return 0;
}
void aci_unload(xht acls)
{
jid_t list, jid;
log_debug(ZONE, "unloading acls");
if(xhash_iter_first(acls))
do {
xhash_iter_get(acls, NULL, (void *) &list);
while (list != NULL) {
jid = list;
list = list->next;
jid_free(jid);
}
} while(xhash_iter_next(acls));
return;
}