aboutsummaryrefslogtreecommitdiff
path: root/www/apache22/files/mpm-itk-perdir-regex
diff options
context:
space:
mode:
Diffstat (limited to 'www/apache22/files/mpm-itk-perdir-regex')
-rw-r--r--www/apache22/files/mpm-itk-perdir-regex160
1 files changed, 0 insertions, 160 deletions
diff --git a/www/apache22/files/mpm-itk-perdir-regex b/www/apache22/files/mpm-itk-perdir-regex
deleted file mode 100644
index cbe5d2cd6a8b..000000000000
--- a/www/apache22/files/mpm-itk-perdir-regex
+++ /dev/null
@@ -1,160 +0,0 @@
-vim: syntax=diff
-
-This patch is a supplement for the MPM-ITK patchset, adding the per-directory
-setting AssignUserFromPath <path-regex> <user-pattern> <group-pattern>
-
-Using a regex for setting the user and/or group name might seem scary, but
-it has a number of uses in cases where a hard-coded list of <Directory>
-clauses would be implactical:
-
- For personal home pages, either using mod_userdir or simply
- subdirectories named like the user name
- For vhosts using mod_vhost_alias
-
-This patch is against MPM-ITK version 2.2.11-02. You might have to kneed it
-a little if you are using a later version of MPM-ITK.
-
-Please Note: This patch has only been briefly tested. Remember to test it
-rigorously before applying it in a production environment!
-
-Examples
-
- <Directory /home>
- AssignUserFromPath "^/home/([^/]+)" www-data $1-web
- </Directory>
-
- WWW: http://www.pvv.ntnu.no/~knuta/mpm-itk/
-
- To apply this additional diff to apache22-mpm-itk use
- make -DWITH_ITK_PERDIR_REGEX
-
-===========================================================================
---- server/mpm/experimental/itk/itk.c 2011-03-05 18:12:47.000000000 +0100
-+++ server/mpm/experimental/itk/itk.c 2011-03-06 23:28:49.000000000 +0100
-@@ -60,6 +60,7 @@
- #include "ap_listen.h"
- #include "ap_mmn.h"
- #include "apr_poll.h"
-+#include "ap_regex.h"
-
- #ifdef HAVE_BSTRING_H
- #include <bstring.h> /* for IRIX, FD_SET calls bzero() */
-@@ -164,6 +165,10 @@
- gid_t gid;
- char *username;
- int nice_value;
-+ char *user_regex_string;
-+ ap_regex_t *user_regex;
-+ char *user_pattern;
-+ char *group_pattern;
- } itk_per_dir_conf;
-
- typedef struct
-@@ -1421,6 +1426,7 @@
- gid_t wanted_gid;
- const char *wanted_username;
- int err = 0;
-+ int retval = OK;
-
- itk_server_conf *sconf =
- (itk_server_conf *) ap_get_module_config(r->server->module_config, &mpm_itk_module);
-@@ -1458,6 +1464,35 @@
- wanted_gid = dconf->gid;
- wanted_username = dconf->username;
-
-+ /* Determine uid and gid from regex, if available */
-+ if (dconf->user_regex != NULL) {
-+ apr_size_t nmatch = 10;
-+ ap_regmatch_t pmatch[10];
-+ char *user_string;
-+ char *group_string;
-+ struct passwd *user_struct;
-+ struct group *group_struct;
-+
-+ if (ap_regexec(dconf->user_regex, r->filename, nmatch, pmatch, 0) == 0) {
-+ user_string = ap_pregsub(r->pool, dconf->user_pattern, r->filename, nmatch, pmatch);
-+ group_string = ap_pregsub(r->pool, dconf->group_pattern, r->filename, nmatch, pmatch);
-+
-+ if (!(user_struct = getpwnam(user_string))) {
-+ _DBG("%s: No such user: '%s' (regex: '%s', pattern: '%s')",
-+ r->filename, user_string, dconf->user_regex_string, dconf->user_pattern);
-+ retval = HTTP_INTERNAL_SERVER_ERROR;
-+ } else if (!(group_struct = getgrnam(group_string))) {
-+ _DBG("%s: No such group: '%s' (regex: '%s', pattern: '%s')",
-+ r->filename, group_string, dconf->user_regex_string, dconf->group_pattern);
-+ retval = HTTP_INTERNAL_SERVER_ERROR;
-+ } else {
-+ wanted_username = user_string;
-+ wanted_uid = user_struct->pw_uid;
-+ wanted_gid = group_struct->gr_gid;
-+ }
-+ }
-+ }
-+
- if (wanted_uid == -1 || wanted_gid == -1) {
- wanted_uid = unixd_config.user_id;
- wanted_gid = unixd_config.group_id;
-@@ -1488,7 +1523,7 @@
- ap_lingering_close(r->connection);
- exit(0);
- }
-- return OK;
-+ return retval;
- }
-
- static void itk_hooks(apr_pool_t *p)
-@@ -1632,6 +1667,24 @@
- return NULL;
- }
-
-+static const char *assign_user_id_regex (cmd_parms *cmd, itk_per_dir_conf *dconf, const char *regex, const char *user_string, const char *group_string)
-+{
-+ ap_regex_t *compiled_regexp;
-+
-+ compiled_regexp = ap_pregcomp(cmd->pool, regex, AP_REG_EXTENDED);
-+ if (!compiled_regexp) {
-+ return apr_pstrcat(cmd->pool,
-+ "AssignUserFromPath: cannot compile regular expression '",
-+ regex, "'", NULL);
-+ }
-+
-+ dconf->user_regex_string = apr_pstrdup(cmd->pool, regex);
-+ dconf->user_regex = compiled_regexp;
-+ dconf->user_pattern = apr_pstrdup(cmd->pool, user_string);
-+ dconf->group_pattern = apr_pstrdup(cmd->pool, group_string);
-+ return NULL;
-+}
-+
- static const char *set_max_clients_vhost (cmd_parms *cmd, void *dummy, const char *arg)
- {
- itk_server_conf *sconf =
-@@ -1676,6 +1729,8 @@
- "Maximum value of MaxClients for this run of Apache"),
- AP_INIT_TAKE2("AssignUserID", assign_user_id, NULL, RSRC_CONF|ACCESS_CONF,
- "Tie a virtual host to a specific child process."),
-+AP_INIT_TAKE3("AssignUserFromPath", assign_user_id_regex, NULL, RSRC_CONF|ACCESS_CONF,
-+ "Use a regex to determine the user ID from a path in the file system. Use with care!"),
- AP_INIT_TAKE1("MaxClientsVHost", set_max_clients_vhost, NULL, RSRC_CONF,
- "Maximum number of children alive at the same time for this virtual host."),
- AP_INIT_TAKE1("NiceValue", set_nice_value, NULL, RSRC_CONF|ACCESS_CONF,
-@@ -1716,6 +1771,20 @@
- } else {
- c->nice_value = parent->nice_value;
- }
-+ // The test for username != NULL means that we clear the regex settings if an
-+ // explicit username is specified in a subdirectory, which is what I believe
-+ // most people would expect.
-+ if (child->user_regex_string != NULL || child->username != NULL) {
-+ c->user_regex_string = child->user_regex_string;
-+ c->user_regex = child->user_regex;
-+ c->user_pattern = child->user_pattern;
-+ c->group_pattern = child->group_pattern;
-+ } else {
-+ c->user_regex_string = parent->user_regex_string;
-+ c->user_regex = parent->user_regex;
-+ c->user_pattern = parent->user_pattern;
-+ c->group_pattern = parent->group_pattern;
-+ }
- return c;
- }
-