예제 #1
0
END_TEST

START_TEST (uri_parse_params_test) {
  int res;
  const char *uri;
  char *host = NULL, *path = NULL, *username, *password;
  unsigned int port = 0;
  pr_table_t *params = NULL;

  params = pr_table_alloc(p, 1);

  mark_point();
  uri = "sql://castaglia.org?foo";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res < 0, "Failed to handle invalid URI '%s'", uri);
  fail_unless(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
    strerror(errno), errno);

  mark_point();
  pr_table_empty(params);
  uri = "sql://castaglia.org?foo=";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno));
  res = pr_table_count(params);
  fail_unless(res == 1, "Expected 1 parameter, got %d", res);

  mark_point();
  uri = "sql://castaglia.org?foo=&";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res < 0, "Failed to handle invalid URI '%s'", uri);
  fail_unless(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
    strerror(errno), errno);

  mark_point();
  uri = "sql://castaglia.org?foo=bar&foo=baz";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno));
  res = pr_table_count(params);
  fail_unless(res == 1, "Expected 1 parameter, got %d", res);

  mark_point();
  uri = "sql://castaglia.org?foo=bar&baz=quxx&foo=baz";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno));
  res = pr_table_count(params);
  fail_unless(res == 2, "Expected 2 parameters, got %d", res);

  pr_table_empty(params);
  pr_table_free(params);
}
예제 #2
0
int vroot_fsio_closedir(pr_fs_t *fs, void *dirh) {
  int res;

  res = closedir((DIR *) dirh);

  if (vroot_dirtab != NULL) {
    unsigned long lookup_dirh;
    int count;

    lookup_dirh = (unsigned long) dirh;
    (void) pr_table_kremove(vroot_dirtab, &lookup_dirh, sizeof(unsigned long),
      NULL);

    /* If the dirtab table is empty, destroy the table. */
    count = pr_table_count(vroot_dirtab);
    if (count == 0) {
      pr_table_empty(vroot_dirtab);
      destroy_pool(vroot_dir_pool);
      vroot_dir_pool = NULL;
      vroot_dirtab = NULL;
      vroot_dir_aliases = NULL;
      vroot_dir_idx = -1;
    }
  }

  return res;
}
예제 #3
0
END_TEST

START_TEST (uri_parse_path_test) {
  int res;
  const char *uri;
  char *expected, *host = NULL, *path = NULL, *username, *password;
  unsigned int port = 0;
  pr_table_t *params = NULL;

  params = pr_table_alloc(p, 1);

  mark_point();
  uri = "sql://castaglia.org";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno));
  fail_unless(path == NULL, "Expected null path, got %s", path);

  mark_point();
  uri = "sql://castaglia.org/path";
  expected = "/path";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno));
  fail_unless(path != NULL, "Expected path, got null");
  fail_unless(strcmp(path, expected) == 0, "Expected '%s', got '%s'", expected,
    path);

  mark_point();
  uri = "sql://castaglia.org:1234/path/to/resource";
  expected = "/path/to/resource";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno));
  fail_unless(path != NULL, "Expected path, got null");
  fail_unless(strcmp(path, expected) == 0, "Expected '%s', got '%s'", expected,
    path);

  mark_point();
  uri = "sql://castaglia.org:1234/path/to/resource?key=val";
  expected = "/path/to/resource";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno));
  fail_unless(path != NULL, "Expected path, got null");
  fail_unless(strcmp(path, expected) == 0, "Expected '%s', got '%s'", expected,
    path);

  pr_table_empty(params);
  pr_table_free(params);
}
예제 #4
0
파일: var.c 프로젝트: Nakor78/proftpd
int var_free(void) {
  if (var_pool) {
    if (var_tab) {
      pr_table_empty(var_tab);
      pr_table_free(var_tab);
    }

    destroy_pool(var_pool);
    var_pool = NULL;
    var_tab = NULL;
  }

  return 0;
}
예제 #5
0
파일: auth.c 프로젝트: Distrotech/proftpd
void pr_auth_endpwent(pool *p) {
  cmd_rec *cmd = NULL;

  cmd = make_cmd(p, 0);
  (void) dispatch_auth(cmd, "endpwent", NULL);

  if (cmd->tmp_pool) {
    destroy_pool(cmd->tmp_pool);
    cmd->tmp_pool = NULL;
  }

  if (auth_tab) {
    pr_trace_msg(trace_channel, 5, "emptying authcache");
    (void) pr_table_empty(auth_tab);
    (void) pr_table_free(auth_tab);
    auth_tab = NULL;
  }

  return;
}
예제 #6
0
파일: memcache.c 프로젝트: laoflch/proftpd
int pr_memcache_conn_close(pr_memcache_t *mcache) {
  if (mcache == NULL) {
    errno = EINVAL;
    return -1;
  }

  mcache->refcount--;

  if (mcache->refcount == 0) {
    memcached_free(mcache->mc);

    if (mcache->namespace_tab != NULL) {
      (void) pr_table_empty(mcache->namespace_tab);
      (void) pr_table_free(mcache->namespace_tab);
      mcache->namespace_tab = NULL;
    }
  }

  return 0;
}
예제 #7
0
END_TEST

START_TEST (uri_parse_real_uris_test) {
  int res;
  const char *uri;
  char *host = NULL, *path = NULL, *username = NULL, *password = NULL;
  char *expected;
  unsigned int port = 0;
  pr_table_t *params = NULL;

  params = pr_table_alloc(p, 1);

  mark_point();
  host = path = username = password = NULL;
  port = 0;
  pr_table_empty(params);
  uri = "sql://*****:*****@server:12345/dbname";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno));
  expected = "server";
  fail_unless(host != NULL, "Expected host, got null");
  fail_unless(strcmp(host, expected) == 0, "Expected '%s', got '%s'",
    expected, host);
  expected = "/dbname";
  fail_unless(path != NULL, "Expected path, got null");
  fail_unless(strcmp(path, expected) == 0, "Expected '%s', got '%s'",
    expected, path);
  expected = "user";
  fail_unless(username != NULL, "Expected username, got null");
  fail_unless(strcmp(username, expected) == 0, "Expected '%s', got '%s'",
    expected, username);
  expected = "pass";
  fail_unless(password != NULL, "Expected password, got null");
  fail_unless(strcmp(password, expected) == 0, "Expected '%s', got '%s'",
    expected, password);
  fail_unless(port == 12345, "Expected 12345, got %u", port);
  res = pr_table_count(params);
  fail_unless(res == 0, "Expected 0 parameters, got %d", res);

  mark_point();
  host = path = username = password = NULL;
  port = 0;
  pr_table_empty(params);
  uri = "sql:///path/to/sqlite.db?database=dbname";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno));
  expected = "/path/to/sqlite.db";
  fail_unless(host != NULL, "Expected host, got null");
  fail_unless(strcmp(host, expected) == 0, "Expected '%s', got '%s'",
    expected, host);
  fail_unless(path == NULL, "Expected null, got path '%s'", path);
  fail_unless(username == NULL, "Expected null, got username '%s'", username);
  fail_unless(password == NULL, "Expected null, got password '%s'", password);
  fail_unless(port == 0, "Expected 0, got %u", port);
  res = pr_table_count(params);
  fail_unless(res == 1, "Expected 1 parameter, got %d", res);

  /* Note that this will not parse as expected.  Using an absolute path as
   * the hostname makes it hard to determine the URL path, as the same
   * path separators are used.
   */
  mark_point();
  host = path = username = password = NULL;
  port = 0;
  pr_table_empty(params);
  uri = "sql:///path/to/sqlite.db/dbname";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno));
  expected = "/path/to/sqlite.db/dbname";
  fail_unless(host != NULL, "Expected host, got null");
  fail_unless(strcmp(host, expected) == 0, "Expected '%s', got '%s'",
    expected, host);
  fail_unless(path == NULL, "Expected null, got path '%s'", path);
  fail_unless(username == NULL, "Expected null, got username '%s'", username);
  fail_unless(password == NULL, "Expected null, got password '%s'", password);
  fail_unless(port == 0, "Expected 0, got %u", port);
  res = pr_table_count(params);
  fail_unless(res == 0, "Expected 0 parameters, got %d", res);

  mark_point();
  host = path = username = password = NULL;
  port = 0;
  pr_table_empty(params);
  uri = "sql://*****:*****@localhost?database=proftpd&ctx=vhostctx&conf=vhostconf&map=vhostmap&base_id=7";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno));
  expected = "localhost";
  fail_unless(host != NULL, "Expected host, got null");
  fail_unless(strcmp(host, expected) == 0, "Expected '%s', got '%s'",
    expected, host);
  fail_unless(path == NULL, "Expected null, got path '%s'", path);
  expected = "foo";
  fail_unless(username != NULL, "Expected username, got null");
  fail_unless(strcmp(username, expected) == 0, "Expected '%s', got '%s'",
    expected, username);
  expected = "bar";
  fail_unless(password != NULL, "Expected password, got null");
  fail_unless(strcmp(password, expected) == 0, "Expected '%s', got '%s'",
    expected, password);
  fail_unless(port == 0, "Expected 0, got %u", port);
  res = pr_table_count(params);
  fail_unless(res == 5, "Expected 5 parameters, got %d", res);

  mark_point();
  host = path = username = password = NULL;
  port = 0;
  pr_table_empty(params);
  uri = "sql:///Users/tj/git/proftpd-mod_conf_sql/proftpd.db?ctx=ftpctx:id,parent_id,name,type,value&conf=ftpconf:id,type,value";
  res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password,
    params);
  fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno));
  expected = "/Users/tj/git/proftpd-mod_conf_sql/proftpd.db";
  fail_unless(host != NULL, "Expected host, got null");
  fail_unless(strcmp(host, expected) == 0, "Expected '%s', got '%s'",
    expected, host);
  fail_unless(path == NULL, "Expected null, got path '%s'", path);
  fail_unless(username == NULL, "Expected null, got username");
  fail_unless(password == NULL, "Expected null, got password");
  fail_unless(port == 0, "Expected 0, got %u", port);
  res = pr_table_count(params);
  fail_unless(res == 2, "Expected 2 parameters, got %d", res);

  pr_table_empty(params);
  pr_table_free(params);
}
예제 #8
0
int proxy_db_close(pool *p, const char *schema_name) {
  if (p == NULL) {
    errno = EINVAL;
    return -1;
  }

  if (proxy_dbh != NULL) {
    pool *tmp_pool;
    sqlite3_stmt *pstmt;
    int res;

    tmp_pool = make_sub_pool(p);

    /* If we're given a schema name, then just detach that schema from the
     * database handle.
     */
    if (schema_name != NULL) {
      const char *stmt;

      stmt = pstrcat(tmp_pool, "DETACH DATABASE ", schema_name, ";", NULL);
      res = sqlite3_exec(proxy_dbh, stmt, NULL, NULL, NULL);
      if (res != SQLITE_OK) {
        pr_trace_msg(trace_channel, 2,
          "error detaching '%s' from existing SQLite handle using '%s': %s",
          schema_name, stmt, sqlite3_errmsg(proxy_dbh));
        destroy_pool(tmp_pool);
        errno = EPERM;
        return -1;
      }

      destroy_pool(tmp_pool);
      return 0;
    }

    /* Make sure to close/finish any prepared statements associated with
     * the database.
     */
    pstmt = sqlite3_next_stmt(proxy_dbh, NULL);
    while (pstmt != NULL) {
      sqlite3_stmt *next;
      const char *sql;

      pr_signals_handle();

      next = sqlite3_next_stmt(proxy_dbh, pstmt);
      sql = pstrdup(tmp_pool, sqlite3_sql(pstmt));

      res = sqlite3_finalize(pstmt);
      if (res != SQLITE_OK) {
        pr_trace_msg(trace_channel, 2,
          "error finishing prepared statement '%s': %s", sql,
          sqlite3_errmsg(proxy_dbh));

      } else {
        pr_trace_msg(trace_channel, 18,
          "finished prepared statement '%s'", sql);
      }

      pstmt = next;
    }

    destroy_pool(tmp_pool);

    res = sqlite3_close(proxy_dbh);
    if (res != SQLITE_OK) {
      pr_trace_msg(trace_channel, 2,
        "error closing SQLite database: %s", sqlite3_errmsg(proxy_dbh));
      errno = EPERM;
      return -1;
    }

    pr_trace_msg(trace_channel, 18, "%s", "closed SQLite database");
    proxy_dbh = NULL;
  }

  pr_table_empty(prepared_stmts);
  pr_table_free(prepared_stmts);
  prepared_stmts = NULL;

  return 0;
}