END_TEST START_TEST (config_add_config_param_str_test) { int res; const char *name = NULL; config_rec *c = NULL, *c2; server_rec *s = NULL; s = pr_parser_server_ctxt_open("127.0.0.1"); fail_unless(s != NULL, "Failed to open server context: %s", strerror(errno)); name = "foo"; mark_point(); c = add_config_param_str(name, 1, "bar"); fail_unless(c != NULL, "Failed to add config '%s': %s", name, strerror(errno)); fail_unless(c->config_type == CONF_PARAM, "Expected config_type %d, got %d", CONF_PARAM, c->config_type); c2 = add_config_param_str("foo2", 1, NULL); fail_unless(c2 != NULL, "Failed to add config 'foo2': %s", strerror(errno)); mark_point(); pr_config_dump(NULL, s->conf, NULL); mark_point(); res = remove_config(s->conf, name, FALSE); fail_unless(res > 0, "Failed to remove config '%s': %s", name, strerror(errno)); }
/* usage: TCPServiceName <name> */ MODRET set_tcpservicename(cmd_rec *cmd) { CHECK_ARGS(cmd, 1); CHECK_CONF(cmd, CONF_ROOT|CONF_VIRTUAL|CONF_GLOBAL); add_config_param_str(cmd->argv[0], 1, cmd->argv[1]); return HANDLED(cmd); }
/* usage: CounterFile path */ MODRET set_counterfile(cmd_rec *cmd) { config_rec *c; const char *path; CHECK_ARGS(cmd, 1); CHECK_CONF(cmd, CONF_ROOT|CONF_VIRTUAL|CONF_GLOBAL|CONF_ANON|CONF_DIR); path = cmd->argv[1]; if (*path != '/') { CONF_ERROR(cmd, "must be an absolute path"); } /* In theory, we could open a filehandle on the configured path right * here, and fail if the file couldn't be created/opened. Then we * could just stash that filehandle in the cmd_rec. Easy. * * However, that would mean that we would have open descriptors for * vhosts to which the client may not connect. We would also need to * use pr_fs_get_usable_fd() so that these filehandles don't use the wrong * fds. Instead, then, we wait to open the filehandles in sess_init(), * where we know vhost to which the client connected. */ c = add_config_param_str(cmd->argv[0], 1, path); c->flags |= CF_MERGEDOWN; return PR_HANDLED(cmd); }
/* usage: CounterLog path|"none" */ MODRET set_counterlog(cmd_rec *cmd) { CHECK_ARGS(cmd, 1); CHECK_CONF(cmd, CONF_ROOT|CONF_VIRTUAL|CONF_GLOBAL); if (pr_fs_valid_path(cmd->argv[1]) < 0) { CONF_ERROR(cmd, "must be an absolute path"); } add_config_param_str(cmd->argv[0], 1, cmd->argv[1]); return PR_HANDLED(cmd); }
MODRET add_tcpuseraccessfiles(cmd_rec *cmd) { int user_argc = 1; char **user_argv = NULL; array_header *user_acl = NULL; config_rec *c = NULL; /* assume use of the standard TCP wrappers installation locations */ char *allow_filename = NULL, *deny_filename = NULL; CHECK_ARGS(cmd, 3); CHECK_CONF(cmd, CONF_ROOT|CONF_VIRTUAL|CONF_GLOBAL); /* use the user-given files, checking to make sure that they exist and * are readable. */ allow_filename = cmd->argv[2]; deny_filename = cmd->argv[3]; /* if the filenames begin with a '~', AND this is not immediately followed * by a '/' (ie '~/'), expand it out for checking and storing for later * lookups. If the filenames DO begin with '~/', do the expansion later, * after authenication. In other words, do checking of static filenames * now, and checking of dynamic (user-authentication-based) filenames * later. */ if (allow_filename[0] == '/') { /* it's an absolute path, so the filename will be checked as is */ if (!wrap_is_usable_file(allow_filename)) return ERROR_MSG(cmd, NULL, pstrcat(cmd->tmp_pool, cmd->argv[0], ": '", allow_filename, "' must be a usable file", NULL)); } else if (allow_filename[0] == '~' && allow_filename[1] != '/') { char *allow_real_file = NULL; allow_real_file = dir_realpath(cmd->pool, allow_filename); if (allow_real_file == NULL || !wrap_is_usable_file(allow_real_file)) return ERROR_MSG(cmd, NULL, pstrcat(cmd->tmp_pool, cmd->argv[0], ": '", allow_filename, "' must be a usable file", NULL)); allow_filename = allow_real_file; } else if (allow_filename[0] != '~' && allow_filename[0] != '/') { /* no relative paths allowed */ return ERROR_MSG(cmd, NULL, pstrcat(cmd->tmp_pool, cmd->argv[0], ": '", allow_filename, "' must start with \"/\" or \"~\"", NULL)); } else { /* it's a determine-at-login-time filename -- check it later */ ; } if (deny_filename[0] == '/') { /* it's an absolute path, so the filename will be checked as is */ if (!wrap_is_usable_file(deny_filename)) return ERROR_MSG(cmd, NULL, pstrcat(cmd->tmp_pool, cmd->argv[0], ": '", deny_filename, "' must be a usable file", NULL)); } else if (deny_filename[0] == '~' && deny_filename[1] != '/') { char *deny_real_file = NULL; deny_real_file = dir_realpath(cmd->pool, deny_filename); if (deny_real_file == NULL || !wrap_is_usable_file(deny_real_file)) return ERROR_MSG(cmd, NULL, pstrcat(cmd->tmp_pool, cmd->argv[0], ": '", deny_filename, "' must be a usable file", NULL)); deny_filename = deny_real_file; } else if (deny_filename[0] != '~' && deny_filename[0] != '/') { /* no relative paths allowed */ return ERROR_MSG(cmd, NULL, pstrcat(cmd->tmp_pool, cmd->argv[0], ": '", deny_filename, "' must start with \"/\" or \"~\"", NULL)); } else { /* it's a determine-at-login-time filename -- check it later */ ; } c = add_config_param_str(cmd->argv[0], 0); user_acl = pr_expr_create(cmd->tmp_pool, &user_argc, &cmd->argv[0]); /* build the desired config_rec manually */ c->argc = user_argc + 2; c->argv = pcalloc(c->pool, (user_argc + 3) * sizeof(char *)); user_argv = (char **) c->argv; /* the access files are the first two arguments */ *user_argv++ = pstrdup(c->pool, allow_filename); *user_argv++ = pstrdup(c->pool, deny_filename); /* and the user names follow */ if (user_argc && user_acl) while (user_argc--) { *user_argv++ = pstrdup(c->pool, *((char **) user_acl->elts)); user_acl->elts = ((char **) user_acl->elts) + 1; } /* don't forget to NULL-terminate */ *user_argv = NULL; c->flags |= CF_MERGEDOWN; /* done */ return HANDLED(cmd); }
MODRET add_tcpaccessfiles(cmd_rec *cmd) { config_rec *c = NULL; /* assume use of the standard TCP wrappers installation locations */ char *allow_filename = "/etc/hosts.allow"; char *deny_filename = "/etc/hosts.deny"; CHECK_ARGS(cmd, 2); CHECK_CONF(cmd, CONF_ROOT|CONF_ANON|CONF_VIRTUAL|CONF_GLOBAL); /* use the user-given files, checking to make sure that they exist and * are readable. */ allow_filename = cmd->argv[1]; deny_filename = cmd->argv[2]; /* if the filenames begin with a '~', AND this is not immediately followed * by a '/' (ie '~/'), expand it out for checking and storing for later * lookups. If the filenames DO begin with '~/', do the expansion later, * after authenication. In other words, do checking of static filenames * now, and checking of dynamic (user-authentication-based) filenames * later. */ if (allow_filename[0] == '/') { /* it's an absolute path, so the filename will be checked as is */ if (!wrap_is_usable_file(allow_filename)) return ERROR_MSG(cmd, NULL, pstrcat(cmd->tmp_pool, cmd->argv[0], ": '", allow_filename, "' must be a usable file", NULL)); } else if (allow_filename[0] == '~' && allow_filename[1] != '/') { char *allow_real_file = NULL; allow_real_file = dir_realpath(cmd->pool, allow_filename); if (allow_real_file == NULL || !wrap_is_usable_file(allow_real_file)) return ERROR_MSG(cmd, NULL, pstrcat(cmd->tmp_pool, cmd->argv[0], ": '", allow_filename, "' must be a usable file", NULL)); allow_filename = allow_real_file; } else if (allow_filename[0] != '~' && allow_filename[0] != '/') { /* no relative paths allowed */ return ERROR_MSG(cmd, NULL, pstrcat(cmd->tmp_pool, cmd->argv[0], ": '", allow_filename, "' must start with \"/\" or \"~\"", NULL)); } else { /* it's a determine-at-login-time filename -- check it later */ ; } if (deny_filename[0] == '/') { /* it's an absolute path, so the filename will be checked as is */ if (!wrap_is_usable_file(deny_filename)) return ERROR_MSG(cmd, NULL, pstrcat(cmd->tmp_pool, cmd->argv[0], ": '", deny_filename, "' must be a usable file", NULL)); } else if (deny_filename[0] == '~' && deny_filename[1] != '/') { char *deny_real_file = NULL; deny_real_file = dir_realpath(cmd->pool, deny_filename); if (deny_real_file == NULL || !wrap_is_usable_file(deny_real_file)) return ERROR_MSG(cmd, NULL, pstrcat(cmd->tmp_pool, cmd->argv[0], ": '", deny_filename, "' must be a usable file", NULL)); deny_filename = deny_real_file; } else if (deny_filename[0] != '~' && deny_filename[0] != '/') { /* no relative paths allowed */ return ERROR_MSG(cmd, NULL, pstrcat(cmd->tmp_pool, cmd->argv[0], ": '", deny_filename, "' must start with \"/\" or \"~\"", NULL)); } else { /* it's a determine-at-login-time filename -- check it later */ ; } c = add_config_param_str(cmd->argv[0], 2, (void *) allow_filename, (void *) deny_filename); c->flags |= CF_MERGEDOWN; /* done */ return HANDLED(cmd); }