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>