You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Randy Terbush <ra...@zyzzyva.com> on 1997/06/22 21:06:29 UTC
Re: [PATCH] to add "UserDir disabled user ..."
How about extending this to allow "enable" of specific userdirs and
changing "disabled" to "disable" (or allowing both).
+1 otherwise
> This was originally generated against the HEAD pre-NT import;
> redone. Two files involved, src/mod_userdir.c (first patch) and
> htdocs/manual/mod/mod_userdir.html (second patch).
>
> Extends UserDir to allow "UserDir <pattern>", "UserDir disabled"
> (disables *all* userdir translations), and the new form:
> "UserDir disabled user1 user2 ...", which disables translations for
> only those usernames.
>
> #ken :-)}
>
> Index: mod_userdir.c
> ===================================================================
> RCS file: /export/home/cvs/apache/src/mod_userdir.c,v
> retrieving revision 1.15
> diff -c -r1.15 mod_userdir.c
> *** mod_userdir.c 1997/06/15 19:22:32 1.15
> --- mod_userdir.c 1997/06/16 23:49:29
> ***************
> *** 76,81 ****
> --- 76,87 ----
> *
> * UserDir public_html /usr/web http://www.xyz.com/users
> *
> + * Modified by Ken Coar to provide for the following:
> + *
> + * UserDir disabled root user1
> + *
> + * If "disabled" has no other arguments, *all* ~<username> references are
> + * disabled.
> */
>
> #include "httpd.h"
> ***************
> *** 83,121 ****
>
> module userdir_module;
>
> /*
> ! * Sever config for this module is a little unconventional...
> ! * It's just one string anyway, so why pretend?
> */
>
> ! void *create_userdir_config (pool *dummy, server_rec *s) {
> ! return (void*)DEFAULT_USER_DIR;
> }
>
> const char *set_user_dir (cmd_parms *cmd, void *dummy, char *arg)
> {
> ! void *server_conf = cmd->server->module_config;
> !
> ! set_module_config (server_conf, &userdir_module, pstrdup (cmd->pool, arg));
> return NULL;
> }
>
> command_rec userdir_cmds[] = {
> { "UserDir", set_user_dir, NULL, RSRC_CONF, RAW_ARGS,
> ! "the public subdirectory in users' home directories, or 'disabled'" },
> { NULL }
> };
>
> int translate_userdir (request_rec *r)
> {
> void *server_conf = r->server->module_config;
> ! const char *userdirs = (char *)get_module_config(server_conf,
> ! &userdir_module);
> char *name = r->uri;
> const char *w, *dname, *redirect;
> char *x = NULL;
>
> ! if (userdirs == NULL || !strcasecmp(userdirs, "disabled") ||
> (name[0] != '/') || (name[1] != '~')) {
> return DECLINED;
> }
> --- 89,179 ----
>
> module userdir_module;
>
> + typedef struct userdir_config {
> + int globally_disabled;
> + char *userdir;
> + table *disabled_users;
> + } userdir_config;
> +
> /*
> ! * Server config for this module: global disablement flag, a list of usernames
> ! * ineligible for UserDir access, and the replacement string for all others.
> */
>
> ! void *create_userdir_config (pool *p, server_rec *s) {
> ! userdir_config
> ! *newcfg = (userdir_config *) pcalloc (p, sizeof(userdir_config));
> !
> ! newcfg->globally_disabled = 0;
> ! newcfg->userdir = DEFAULT_USER_DIR;
> ! newcfg->disabled_users = make_table (p, 4);
> ! return (void *) newcfg;
> }
>
> const char *set_user_dir (cmd_parms *cmd, void *dummy, char *arg)
> {
> ! userdir_config
> ! *s_cfg = (userdir_config *) get_module_config (cmd->server->module_config, &userdir_module);
> ! char *username;
> ! const char
> ! *args = pstrdup (cmd->pool, arg);
> !
> ! /*
> ! * Don't even bother doing anything if we've already processed a global
> ! * disable.
> ! * We *could* return an error message about the occlusion, but that would
> ! * be considered a fatal configuration error and the server wouldn't
> ! * start. If we log an error to the server's error log instead, it'll
> ! * show up on stderr during initial startup.
> ! */
> ! if (s_cfg->globally_disabled) {
> ! return NULL;
> ! }
> ! /*
> ! * If the first word isn't "disabled", this is a simple matter - just copy
> ! * what we were given into the userdir string.
> ! */
> ! if (strncasecmp (arg, "disabled", 8)) {
> ! s_cfg->userdir = pstrdup (cmd->pool, arg);
> ! return NULL;
> ! }
> ! /*
> ! * If the entire argument is the single word "disabled", we're doing a
> ! * global disablement.
> ! */
> ! if ((! strcasecmp (arg, "disabled")) && (strlen (arg) == 8)) {
> ! s_cfg->globally_disabled = 1;
> ! return NULL;
> ! }
> ! /*
> ! * All right, we have a list of usernames to disable. Let's do it.. but
> ! * throw away the "disabled" keyword first.
> ! */
> ! username = getword_conf (cmd->pool, &args);
> ! while (*args) {
> ! username = getword_conf (cmd->pool, &args);
> ! table_set (s_cfg->disabled_users, username, "disabled");
> ! }
> return NULL;
> }
>
> command_rec userdir_cmds[] = {
> { "UserDir", set_user_dir, NULL, RSRC_CONF, RAW_ARGS,
> ! "the public subdirectory in users' home directories, or 'disabled', or 'disabled username username...'" },
> { NULL }
> };
>
> int translate_userdir (request_rec *r)
> {
> void *server_conf = r->server->module_config;
> ! const userdir_config *s_cfg =
> ! (userdir_config *) get_module_config (server_conf, &userdir_module);
> char *name = r->uri;
> + const char *userdirs = pstrdup (r->pool, s_cfg->userdir);
> const char *w, *dname, *redirect;
> char *x = NULL;
>
> ! if (s_cfg->userdir == NULL || s_cfg->globally_disabled ||
> (name[0] != '/') || (name[1] != '~')) {
> return DECLINED;
> }
> ***************
> *** 182,194 ****
> return DECLINED;
> #else /* WIN32 */
> struct passwd *pw;
> ! if((pw=getpwnam(w)))
> #ifdef __EMX__
> ! /* Need to manually add user name for OS/2 */
> ! filename = pstrcat (r->pool, pw->pw_dir, w, "/", userdir, NULL);
> #else
> ! filename = pstrcat (r->pool, pw->pw_dir, "/", userdir, NULL);
> #endif
> #endif /* WIN32 */
> }
>
> --- 240,254 ----
> return DECLINED;
> #else /* WIN32 */
> struct passwd *pw;
> ! if ((pw = getpwnam(w)))
> ! if (table_get (s_cfg->disabled_users, pw->pw_name) == NULL) {
> #ifdef __EMX__
> ! /* Need to manually add user name for OS/2 */
> ! filename = pstrcat (r->pool, pw->pw_dir, w, "/", userdir, NULL);
> #else
> ! filename = pstrcat (r->pool, pw->pw_dir, "/", userdir, NULL);
> #endif
> + }
> #endif /* WIN32 */
> }
>
> Index: mod_userdir.html
> ===================================================================
> RCS file: /export/home/cvs/apache/htdocs/manual/mod/mod_userdir.html,v
> retrieving revision 1.7
> diff -c -r1.7 mod_userdir.html
> *** mod_userdir.html 1997/06/04 16:14:24 1.7
> --- mod_userdir.html 1997/06/16 23:50:14
> ***************
> *** 37,44 ****
>
> The UserDir directive sets the real directory in a user's home directory
> to use when a request for a document for a user is received.
> ! <em>Directory</em> is either <code>disabled</code>, to disable this feature,
> ! or the name of a directory, following one of the following
> patterns. If not disabled, then a request for
> <code>http://www.foo.com/~bob/one/two.html</code> will be translated to:
> <pre>
> --- 37,46 ----
>
> The UserDir directive sets the real directory in a user's home directory
> to use when a request for a document for a user is received.
> ! <em>Directory</em> is either the keyword <code>disabled</code> to disable this
> ! feature server-wide, the keyword <SAMP>disabled</SAMP> followed by a
> ! space-separated list of usernames to disable the feature for only those
> ! usernames, or the name of a directory, following one of the following
> patterns. If not disabled, then a request for
> <code>http://www.foo.com/~bob/one/two.html</code> will be translated to:
> <pre>