Ejemplo n.º 1
0
Archivo: qutil.c Proyecto: Piro77/qupl
/* 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;
}
Ejemplo n.º 2
0
/* 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;
}
Ejemplo n.º 3
0
/* 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;
}
Ejemplo n.º 4
0
/* 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;
}
Ejemplo n.º 5
0
/* 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;
}
Ejemplo n.º 6
0
Archivo: qutil.c Proyecto: Piro77/qupl
/* 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;
}
Ejemplo n.º 7
0
/* 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;
}
Ejemplo n.º 8
0
/* 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;
}