From f41be105791abb1653bedca175ff7a0cacd6354c Mon Sep 17 00:00:00 2001 From: Andrew McNab Date: Wed, 8 Jun 2005 13:47:23 +0000 Subject: [PATCH] New directives for gsexec / disk perms --- org.gridsite.core/CHANGES | 5 + org.gridsite.core/src/gsexec.c | 4 +- org.gridsite.core/src/htcp | Bin 29747 -> 22680 bytes org.gridsite.core/src/mod_gridsite.c | 207 +++++++++++++++++++++++++++++------ 4 files changed, 181 insertions(+), 35 deletions(-) diff --git a/org.gridsite.core/CHANGES b/org.gridsite.core/CHANGES index a9a305e..6a14db8 100644 --- a/org.gridsite.core/CHANGES +++ b/org.gridsite.core/CHANGES @@ -1,3 +1,8 @@ +* Thu Jun 2 2005 Andrew McNab +- HTML improvements for Bug #4083 +- Note that GridSite currently doesn't work with SHM + SSL session cache, in httpd-*.conf and config guide. +- Add GridSiteExecMethod for use with gsexec * Thu May 26 2005 Andrew McNab - Include gsexec, a drop-in replacement for suexec, which can do suexec execution of CGI programs or diff --git a/org.gridsite.core/src/gsexec.c b/org.gridsite.core/src/gsexec.c index eeec524..b57ba4d 100644 --- a/org.gridsite.core/src/gsexec.c +++ b/org.gridsite.core/src/gsexec.c @@ -654,10 +654,10 @@ log_err("X509DN mapping type\n"); } else if (strcasecmp(mapping_type, "directory") == 0) { - map_directory = getenv("GRST_EXEC_MAP_DIR"); + map_directory = getenv("GRST_EXEC_DIRECTORY"); if (map_directory == NULL) { - log_err("No GRST_EXEC_MAP_DIR despite directory mapping\n"); + log_err("No GRST_EXEC_DIRECTORY despite directory mapping\n"); internal_server_error(); exit(153); } diff --git a/org.gridsite.core/src/htcp b/org.gridsite.core/src/htcp index 01c4eff34861e06f0fc4fd72de72621021b7f099..8a64842f5685ba9462ec46f27388593f059ae03f 100644 GIT binary patch literal 22680 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 literal 29747 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 D%m$PH diff --git a/org.gridsite.core/src/mod_gridsite.c b/org.gridsite.core/src/mod_gridsite.c index e9c7afb..b01e6f0 100644 --- a/org.gridsite.core/src/mod_gridsite.c +++ b/org.gridsite.core/src/mod_gridsite.c @@ -50,6 +50,7 @@ #include #include #include +#include #include #include @@ -78,28 +79,31 @@ module AP_MODULE_DECLARE_DATA gridsite_module; typedef struct { - int auth; - int envs; - int format; - int indexes; - char *indexheader; - int gridsitelink; - char *adminfile; - char *adminuri; - char *helpuri; - char *dnlists; - char *dnlistsuri; - char *adminlist; - int gsiproxylimit; - char *unzip; - char *methods; - char *editable; - char *headfile; - char *footfile; - int downgrade; - char *authcookiesdir; - int soap2cgi; - char *aclformat; + int auth; + int envs; + int format; + int indexes; + char *indexheader; + int gridsitelink; + char *adminfile; + char *adminuri; + char *helpuri; + char *dnlists; + char *dnlistsuri; + char *adminlist; + int gsiproxylimit; + char *unzip; + char *methods; + char *editable; + char *headfile; + char *footfile; + int downgrade; + char *authcookiesdir; + int soap2cgi; + char *aclformat; + char *execmethod; + ap_unix_identity_t execugid; + apr_fileperms_t diskmode; } mod_gridsite_cfg; /* per-directory config choices */ @@ -950,9 +954,16 @@ int http_put_method(request_rec *r, mod_gridsite_cfg *conf) (r->unparsed_uri[0] != '\0') && (r->unparsed_uri[strlen(r->unparsed_uri) - 1] == '/')) { - if (apr_dir_make(r->filename, APR_UREAD | APR_UWRITE | APR_UEXECUTE, - r->pool) != 0) return HTTP_INTERNAL_SERVER_ERROR; + if (apr_dir_make(r->filename, + conf->diskmode + | APR_UEXECUTE | APR_GEXECUTE | APR_WEXECUTE, + r->pool) != 0) return HTTP_INTERNAL_SERVER_ERROR; + /* we force the permissions, rather than accept any existing ones */ + + apr_file_perms_set(r->filename, conf->diskmode + | APR_UEXECUTE | APR_GEXECUTE | APR_WEXECUTE); + ap_set_content_length(r, 0); ap_set_content_type(r, "text/html"); return OK; @@ -961,8 +972,12 @@ int http_put_method(request_rec *r, mod_gridsite_cfg *conf) /* *** otherwise assume trying to create a regular file *** */ if (apr_file_open(&fp, r->filename, APR_WRITE | APR_CREATE | APR_BUFFERED, - APR_UREAD | APR_UWRITE, r->pool) != 0) return HTTP_INTERNAL_SERVER_ERROR; + conf->diskmode, r->pool) != 0) return HTTP_INTERNAL_SERVER_ERROR; + /* we force the permissions, rather than accept any existing ones */ + + apr_file_perms_set(r->filename, conf->diskmode); + // TODO: need to add Range: support at some point too retcode = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK); @@ -1468,6 +1483,17 @@ static void *create_gridsite_dir_config(apr_pool_t *p, char *path) /* GridSiteAuthCookiesDir dir-path */ conf->soap2cgi = 0; /* GridSiteSoap2cgi on/off */ conf->aclformat = apr_pstrdup(p, "GACL"); + /* GridSiteACLFormat gacl/xacml */ + conf->execmethod = NULL; + /* GridSiteExecMethod suexec/X509DN/directory */ + + conf->execugid.uid = 0; /* GridSiteUserGroup User Group */ + conf->execugid.gid = 0; /* ditto */ + conf->execugid.userdir = 0; /* ditto */ + + conf->diskmode = APR_UREAD | APR_UWRITE; + /* GridSiteDiskMode group-mode world-mode + GroupNone | GroupRead | GroupWrite WorldNone | WorldRead */ } else { @@ -1493,6 +1519,11 @@ static void *create_gridsite_dir_config(apr_pool_t *p, char *path) conf->authcookiesdir= NULL; /* GridSiteAuthCookiesDir dir-path */ conf->soap2cgi = UNSET; /* GridSiteSoap2cgi on/off */ conf->aclformat = NULL; /* GridSiteACLFormat gacl/xacml */ + conf->execmethod = NULL; /* GridSiteExecMethod */ + conf->execugid.uid = UNSET; /* GridSiteUserGroup User Group */ + conf->execugid.gid = UNSET; /* ditto */ + conf->execugid.userdir = UNSET; /* ditto */ + conf->diskmode = UNSET; /* GridSiteDiskMode group world */ } return conf; @@ -1573,9 +1604,24 @@ static void *merge_gridsite_dir_config(apr_pool_t *p, void *vserver, if (direct->soap2cgi != UNSET) conf->soap2cgi = direct->soap2cgi; else conf->soap2cgi = server->soap2cgi; - if (direct->aclformat !=NULL) conf->aclformat = direct->aclformat; + if (direct->aclformat != NULL) conf->aclformat = direct->aclformat; else conf->aclformat = server->aclformat; + if (direct->execmethod != NULL) conf->execmethod = direct->execmethod; + else conf->execmethod = server->execmethod; + + if (direct->execugid.uid != UNSET) + { conf->execugid.uid = direct->execugid.uid; + conf->execugid.gid = direct->execugid.gid; + conf->execugid.userdir = direct->execugid.userdir; } + else + { conf->execugid.uid = server->execugid.uid; + conf->execugid.gid = server->execugid.gid; + conf->execugid.userdir = server->execugid.userdir; } + + if (direct->diskmode != UNSET) conf->diskmode = direct->diskmode; + else conf->diskmode = server->diskmode; + return conf; } @@ -1689,18 +1735,70 @@ static const char *mod_gridsite_take1_cmds(cmd_parms *a, void *cfg, } else if (strcasecmp(a->cmd->name, "GridSiteACLFormat") == 0) { - if (strcasecmp(parm,"GACL")==0) - ((mod_gridsite_cfg *) cfg)->aclformat = - apr_pstrdup(a->pool, parm); - else if (strcasecmp(parm,"XACML")==0) - ((mod_gridsite_cfg *) cfg)->aclformat = - apr_pstrdup(a->pool, parm); - else return "GridsiteACLFormat must be either GACL or XACML"; + if ((strcasecmp(parm,"GACL") != 0) && + (strcasecmp(parm,"XACML") != 0)) + return "GridsiteACLFormat must be either GACL or XACML"; + + ((mod_gridsite_cfg *) cfg)->aclformat = apr_pstrdup(a->pool, parm); + } + else if (strcasecmp(a->cmd->name, "GridSiteExecMethod") == 0) + { + if (strcasecmp(parm, "nosetuid") == 0) + { + ((mod_gridsite_cfg *) cfg)->execmethod = NULL; + return NULL; + } + + if ((strcasecmp(parm, "suexec") != 0) && + (strcasecmp(parm, "X509DN") != 0) && + (strcasecmp(parm, "directory") != 0)) + return "GridsiteExecMethod must be nosetuid, suexec, X509DN or directory"; + + ((mod_gridsite_cfg *) cfg)->execmethod = apr_pstrdup(a->pool, parm); } return NULL; } +static const char *mod_gridsite_take2_cmds(cmd_parms *a, void *cfg, + const char *parm1, const char *parm2) +{ + if (strcasecmp(a->cmd->name, "GridSiteUserGroup") == 0) + { + if (!(unixd_config.suexec_enabled)) + return "Using GridSiteUserGroup will " + "require rebuilding Apache with suexec support!"; + + /* NB ap_uname2id/ap_gname2id are NOT thread safe - but OK + as long as not used in .htaccess, just at server start time */ + + ((mod_gridsite_cfg *) cfg)->execugid.uid = ap_uname2id(parm1); + ((mod_gridsite_cfg *) cfg)->execugid.gid = ap_gname2id(parm2); + ((mod_gridsite_cfg *) cfg)->execugid.userdir = 0; + } + else if (strcasecmp(a->cmd->name, "GridSiteDiskMode") == 0) + { + if ((strcasecmp(parm1, "GroupNone" ) != 0) && + (strcasecmp(parm1, "GroupRead" ) != 0) && + (strcasecmp(parm1, "GroupWrite") != 0)) + return "First parameter of GridSiteDiskMode must be " + "GroupNone, GroupRead or GroupWrite!"; + + if ((strcasecmp(parm2, "WorldNone" ) != 0) && + (strcasecmp(parm2, "WorldRead" ) != 0)) + return "Second parameter of GridSiteDiskMode must be " + "WorldNone or WorldRead!"; + + ((mod_gridsite_cfg *) cfg)->diskmode = + APR_UREAD | APR_UWRITE + | ( APR_GREAD * (strcasecmp(parm1, "GroupRead") == 0)) + | ((APR_GREAD | APR_GWRITE) * (strcasecmp(parm1, "GroupWrite") == 0)) + | ((APR_GREAD | APR_WREAD) * (strcasecmp(parm2, "WorldRead") == 0)); + } + + return NULL; +} + static const char *mod_gridsite_flag_cmds(cmd_parms *a, void *cfg, int flag) { @@ -1792,6 +1890,17 @@ static const command_rec mod_gridsite_cmds[] = AP_INIT_TAKE1("GridSiteACLFormat", mod_gridsite_take1_cmds, NULL, OR_FILEINFO, "format to save access control lists in"), + AP_INIT_TAKE1("GridSiteExecMethod", mod_gridsite_take1_cmds, + NULL, OR_FILEINFO, "execution strategy used by gsexec"), + + AP_INIT_TAKE2("GridSiteUserGroup", mod_gridsite_take2_cmds, + NULL, OR_FILEINFO, + "user and group of gsexec processes in suexec mode"), + + AP_INIT_TAKE2("GridSiteDiskMode", mod_gridsite_take2_cmds, + NULL, OR_FILEINFO, + "group and world file modes for new files/directories"), + {NULL} }; @@ -2064,6 +2173,14 @@ static int mod_gridsite_perm_handler(request_rec *r) if (((mod_gridsite_cfg *) cfg)->aclformat != NULL) apr_table_setn(env, "GRST_ACL_FORMAT", ((mod_gridsite_cfg *) cfg)->aclformat); + + if (((mod_gridsite_cfg *) cfg)->execmethod != NULL) + apr_table_setn(env, "GRST_EXEC_METHOD", + ((mod_gridsite_cfg *) cfg)->execmethod); + + apr_table_setn(env, "GRST_DISK_MODE", + apr_psprintf(r->pool, "0x%04x", + ((mod_gridsite_cfg *)cfg)->diskmode)); } if (((mod_gridsite_cfg *) cfg)->auth) @@ -2345,6 +2462,27 @@ static int mod_gridsite_handler(request_rec *r) return mod_gridsite_nondir_handler(r, conf); } +static ap_unix_identity_t *mod_gridsite_get_suexec_id_doer(const request_rec *r) +{ + mod_gridsite_cfg *conf; + + conf = (mod_gridsite_cfg *) + ap_get_module_config(r->per_dir_config, &gridsite_module); + + if ((conf->execugid.uid != UNSET) && + (conf->execmethod != NULL)) + { + + /* also push GRST_EXEC_DIRECTORY into request environment here too */ + + return &(conf->execugid); + } + + + + return NULL; +} + static void register_hooks(apr_pool_t *p) { /* set up the Soap2cgi input and output filters */ @@ -2369,6 +2507,9 @@ static void register_hooks(apr_pool_t *p) ap_hook_fixups(mod_gridsite_perm_handler,NULL,NULL,APR_HOOK_REALLY_LAST); ap_hook_handler(mod_gridsite_handler, NULL, NULL, APR_HOOK_FIRST); + + ap_hook_get_suexec_identity(mod_gridsite_get_suexec_id_doer, + NULL, NULL, APR_HOOK_MIDDLE); } module AP_MODULE_DECLARE_DATA gridsite_module = -- 1.8.2.3