/* get a map of the cookie */ CBMAP *getcookie(void){ CBMAP *params; CBLIST *pairs; char *rbuf, *buf, *key, *val, *dkey, *dval; int i; params = cbmapopen(); rbuf = NULL; buf = NULL; buf = getenv("HTTP_COOKIE"); if(buf != NULL){ buf = cbmemdup(buf, -1); pairs = cbsplit(buf, -1, ";"); for(i = 0; i < cblistnum(pairs); i++){ key = cbmemdup(cblistval(pairs, i, NULL), -1); if((val = strchr(key, '=')) != NULL){ *(val++) = '\0'; dkey = cburldecode(key, NULL); dval = cburldecode(val, NULL); cbmapput(params, dkey, -1, dval, -1, FALSE); free(dval); free(dkey); } free(key); } cblistclose(pairs); free(buf); } else { return NULL; } return params; }
/* Clear registered documents in a node in a node manager object. */ int nmgr_clear(NMGR *nmgr, const char *name, int options){ NODE *node; CBMAP *admins, *users, *links; const char *vbuf; char *label; if(!(vbuf = cbmapget(nmgr->nodes, name, -1, NULL))) return FALSE; node = (NODE *)vbuf; label = cbmemdup(node->label, -1); admins = cbmapdup(node->admins); users = cbmapdup(node->users); links = cbmapdup(node->links); if(!nmgr_out(nmgr, name) || !nmgr_put(nmgr, name, TRUE, options)){ cbmapclose(links); cbmapclose(users); cbmapclose(admins); free(label); return FALSE; } if(!(vbuf = cbmapget(nmgr->nodes, name, -1, NULL))) return FALSE; node = (NODE *)vbuf; cbmapclose(node->links); cbmapclose(node->users); cbmapclose(node->admins); free(node->label); node->label = label; node->admins = admins; node->users = users; node->links = links; return TRUE; }
/* Create a user manager object. */ UMGR *umgr_new(const char *rootdir){ UMGR *umgr; assert(rootdir); log_print(LL_INFO, "starting the user manager"); umgr = cbmalloc(sizeof(UMGR)); umgr->rootdir = cbmemdup(rootdir, -1); umgr->users = cbmapopen(); return umgr; }
/* Create a node manager object. */ NMGR *nmgr_new(const char *rootdir){ NMGR *nmgr; assert(rootdir); log_print(LL_INFO, "starting the node manager"); nmgr = cbmalloc(sizeof(NMGR)); nmgr->rootdir = cbmemdup(rootdir, -1); nmgr->nodes = cbmapopenex(MINIBNUM); nmgr->aidxs = cbmapopenex(MINIBNUM); return nmgr; }
/* Get the value of a session variable of a user object. */ char *user_sess_val(USER *user, const char *name){ const char *value; char *rv; assert(user && name); if(pthread_mutex_lock(&(user->mutex)) != 0) return NULL; value = user->sess ? cbmapget(user->sess, name, -1, NULL) : NULL; rv = value ? cbmemdup(value, -1) : NULL; pthread_mutex_unlock(&(user->mutex)); return rv; }
/* get a map of the CGI parameters */ CBMAP *getparams(void){ CBMAP *params; CBLIST *pairs; char *rbuf, *buf, *key, *val, *dkey, *dval; const char *tmp; int i, len, c; params = cbmapopen(); rbuf = NULL; buf = NULL; if((tmp = getenv("CONTENT_LENGTH")) != NULL && (len = atoi(tmp)) > 0 && len <= RDATAMAX){ rbuf = cbmalloc(len + 1); for(i = 0; i < len && (c = getchar()) != EOF; i++){ rbuf[i] = c; } rbuf[i] = '\0'; if(i == len) buf = rbuf; } else { buf = getenv("QUERY_STRING"); } if(buf != NULL){ buf = cbmemdup(buf, -1); pairs = cbsplit(buf, -1, "&"); for(i = 0; i < cblistnum(pairs); i++){ key = cbmemdup(cblistval(pairs, i, NULL), -1); if((val = strchr(key, '=')) != NULL){ *(val++) = '\0'; dkey = cburldecode(key, NULL); dval = cburldecode(val, NULL); cbmapput(params, dkey, -1, dval, -1, FALSE); free(dval); free(dkey); } free(key); } cblistclose(pairs); free(buf); } free(rbuf); return params; }
/* Add a user to a user manager object. */ int umgr_put(UMGR *umgr, const char *name, const char *passwd, const char *flags, const char *fname, const char *misc){ USER user; assert(umgr && name && passwd && flags && fname && misc); log_print(LL_DEBUG, "umgr_put: %s:%s:%s:%s:%s", name, passwd, flags, fname, misc); if(name[0] == '\0' || cbmapget(umgr->users, name, -1, NULL)){ log_print(LL_WARN, "duplicated or empty user name: %s", name); return FALSE; } if(!check_alnum_name(name)){ log_print(LL_WARN, "invalid user name: %s", name); return FALSE; } user.name = cbmemdup(name, -1); user.passwd = cbmemdup(passwd, -1); user.flags = cbmemdup(flags, -1); user.fname = cbmemdup(fname, -1); user.misc = cbmemdup(misc, -1); user.atime = 0; user.sess = NULL; pthread_mutex_init(&(user.mutex), NULL); cbmapput(umgr->users, name, -1, (char *)&user, sizeof(USER), FALSE); return TRUE; }
/* Add a node to a node manager object. */ int nmgr_put(NMGR *nmgr, const char *name, int wmode, int options){ NODE node; ESTMTDB *db; CBLIST *list; const char *cbuf, *pv; char pbuf[URIBUFSIZ], *vbuf; int i, ecode, csiz; assert(nmgr && name); log_print(LL_DEBUG, "nmgr_put: %s", name); if(name[0] == '\0' || cbmapget(nmgr->nodes, name, -1, NULL)){ log_print(LL_WARN, "duplicated or empty node name: %s", name); return FALSE; } if(strlen(name) >= NODENAMEMAX || !check_alnum_name(name)){ log_print(LL_WARN, "invalid node name: %s", name); return FALSE; } log_print(LL_INFO, "opening a node (%s): %s", wmode ? "WRITER" : "READER", name); sprintf(pbuf, "%s%c%s%c%s", nmgr->rootdir, ESTPATHCHR, NODEDIR, ESTPATHCHR, name); if(!(db = est_mtdb_open(pbuf, wmode ? ESTDBWRITER | ESTDBCREAT | options : ESTDBREADER, &ecode))){ log_print(LL_ERROR, "DB-ERROR: %s", est_err_msg(ecode)); return FALSE; } est_mtdb_set_informer(db, db_informer, NULL); cbmapiterinit(nmgr->aidxs); while((cbuf = cbmapiternext(nmgr->aidxs, NULL)) != NULL){ est_mtdb_add_attr_index(db, cbuf, *(int *)cbmapiterval(cbuf, NULL)); } node.db = db; est_mtdb_add_meta(db, NMKNAME, name); node.name = cbmemdup(name, -1); vbuf = est_mtdb_meta(db, NMKLABEL); node.label = vbuf ? vbuf : cbmemdup(name, -1); if((vbuf = est_mtdb_meta(db, NMKADMINS)) != NULL){ list = cbsplit(vbuf, -1, "\n"); node.admins = cbmapopenex(cblistnum(list) + MINIBNUM); for(i = 0; i < cblistnum(list); i++){ cbuf = cblistval(list, i, &csiz); if(csiz < 1) continue; cbmapput(node.admins, cbuf, csiz, "", 0, FALSE); } cblistclose(list); free(vbuf); } else { node.admins = cbmapopenex(MINIBNUM); } if((vbuf = est_mtdb_meta(db, NMKUSERS)) != NULL){ list = cbsplit(vbuf, -1, "\n"); node.users = cbmapopenex(cblistnum(list) + MINIBNUM); for(i = 0; i < cblistnum(list); i++){ cbuf = cblistval(list, i, &csiz); if(csiz < 1) continue; cbmapput(node.users, cbuf, csiz, "", 0, FALSE); } cblistclose(list); free(vbuf); } else { node.users = cbmapopenex(MINIBNUM); } if((vbuf = est_mtdb_meta(db, NMKLINKS)) != NULL){ list = cbsplit(vbuf, -1, "\n"); node.links = cbmapopenex(cblistnum(list) + MINIBNUM); for(i = 0; i < cblistnum(list); i++){ cbuf = cblistval(list, i, NULL); if(!(pv = strchr(cbuf, '\t'))) continue; cbmapput(node.links, cbuf, pv - cbuf, pv + 1, -1, FALSE); } cblistclose(list); free(vbuf); } else { node.links = cbmapopenex(MINIBNUM); } node.mtime = time(NULL); node.dirty = FALSE; pthread_mutex_init(&(node.mutex), NULL); cbmapput(nmgr->nodes, name, -1, (char *)&node, sizeof(NODE), FALSE); return TRUE; }