Author: wrowe
Date: Wed Sep 14 09:50:41 2005
New Revision: 280884
URL: http://svn.apache.org/viewcvs?rev=280884&view=rev
Log:
Introduce the AspNet directive, to replace the test of Options ExecCGI.
Now, to actually permit ASP.NET content, we need to test the following;
To serve a real file AspNet files
To serve a directory AspNet directories (or simply dirs)
To serve not-a-file AspNet virtual
To serve any URL AspNet all (or simply on)
These can be combined, e.g. 'AspNet files virtual' would be valid, and
Apache would continue to serve directories.
Modified:
httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp
Modified: httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp
URL:
http://svn.apache.org/viewcvs/httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp?rev=280884&r1=280883&r2=280884&view=diff
==============================================================================
--- httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp (original)
+++ httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp Wed Sep 14 09:50:41 2005
@@ -184,8 +184,75 @@
return NULL;
}
+
+typedef enum {
+ ASPNET_OFF = 0,
+ ASPNET_UNSET = 2^0, // Must be a value, better to avoid legal bits
+ ASPNET_FILES = 2^1,
+ ASPNET_DIRS = 2^2,
+ ASPNET_VIRTUAL = 2^3
+} asp_net_enable_t;
+
+typedef struct asp_net_dirconf_t {
+ int enable; // Bit flags of asp_net_enable_t values
+} asp_net_dirconf_t;
+
+static void *create_asp_net_dirconf(apr_pool_t *p, char *dummy)
+{
+ asp_net_dirconf_t *dirconf;
+ dirconf = (asp_net_dirconf_t*)apr_palloc(p, sizeof(asp_net_dirconf_t));
+ dirconf->enable = ASPNET_UNSET;
+ return dirconf;
+}
+
+static void *merge_asp_net_dirconf(apr_pool_t *p, void *basev, void *addv)
+{
+ asp_net_dirconf_t *base = (asp_net_dirconf_t*)basev;
+ asp_net_dirconf_t *add = (asp_net_dirconf_t*)addv;
+ asp_net_dirconf_t *res =
+ (asp_net_dirconf_t*)apr_palloc(p, sizeof(asp_net_dirconf_t));
+ res->enable = (add->enable == ASPNET_UNSET) ? base->enable
+ : add->enable;
+ return add;
+}
+
+static const char *set_aspnet_enable(cmd_parms *cmd, void *dirconf_,
+ const char *enables)
+{
+ asp_net_dirconf_t *dirconf = (asp_net_dirconf_t *)dirconf_;
+
+ // Unset the AspNet flags before we toggle specific choices
+ dirconf->enable = ASPNET_OFF;
+
+ while (*enables) {
+ const char *enable = ap_getword_conf(cmd->pool, &enables);
+
+ if (!strcasecmp(enable, "on")
+ || !strcasecmp(enable, "all"))
+ dirconf->enable = ASPNET_FILES | ASPNET_DIRS | ASPNET_VIRTUAL;
+ else if (!strcasecmp(enable, "off")
+ || !strcasecmp(enable, "none"))
+ dirconf->enable = ASPNET_OFF;
+ else if (!strcasecmp(enable, "files"))
+ dirconf->enable |= ASPNET_FILES;
+ else if (!strcasecmp(enable, "dirs")
+ || !strcasecmp(enable, "directories"))
+ dirconf->enable |= ASPNET_DIRS;
+ else if (!strcasecmp(enable, "virtual"))
+ dirconf->enable |= ASPNET_VIRTUAL;
+ else {
+ return apr_pstrcat(cmd->pool, "Unrecognized AspNet option ",
+ enable, NULL);
+ }
+ }
+ return NULL;
+}
+
+
static const command_rec asp_net_cmds[] =
{
+ AP_INIT_RAW_ARGS("AspNet", (cmd_func)set_aspnet_enable, NULL, OR_OPTIONS,
+ "Allow ASP.NET to serve 'Files', 'Dirs', 'Virtual', 'All', or 'None'"),
AP_INIT_TAKE1("AspNetVersion", (cmd_func)version_cmd, NULL, RSRC_CONF,
"Select a specific ASP.NET version in the format v#.#.####"),
AP_INIT_TAKE2("AspNetMount", (cmd_func)mount_cmd, NULL, RSRC_CONF,
@@ -433,13 +500,6 @@
return DECLINED;
}
- if (r->finfo.filetype != APR_REG) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r,
- "mod_aspdotnet: File not found or unable to stat: %s",
- r->filename);
- return HTTP_NOT_FOUND;
- }
-
if (!r->uri || (r->uri[0] != '/')) {
ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r,
"mod_aspdotnet: Forbidden, request URI was not absolute: %s",
@@ -447,12 +507,48 @@
return HTTP_FORBIDDEN;
}
- if (!(ap_allow_options(r) & OPT_EXECCGI))
- {
+ asp_net_dirconf_t *dirconf =
+ (asp_net_dirconf_t *)ap_get_module_config(r->per_dir_config,
+ &aspdotnet_module);
+
+ if (r->finfo.filetype == APR_REG) {
+ if (!(dirconf->enable & ASPNET_FILES))
+ {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r,
+ "mod_aspdotnet: Forbidden, 'AspNet Files' is not enabled for: %s"
+ " (file %s)", r->uri, r->filename);
+ return HTTP_FORBIDDEN;
+ }
+ }
+ else if (r->finfo.filetype == APR_DIR) {
+ if (!(dirconf->enable & ASPNET_DIRS))
+ {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r,
+ "mod_aspdotnet: Forbidden, 'AspNet Dirs' is not enabled for: %s"
+ " (directory %s)", r->uri, r->filename);
+ return HTTP_FORBIDDEN;
+ }
+ }
+ else if (!r->finfo.filetype) {
+ if (!(dirconf->enable & ASPNET_VIRTUAL))
+ {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r,
+ "mod_aspdotnet: Forbidden, 'AspNet Virtual'"
+ "is not enabled for: %s", r->uri);
+ if (dirconf->enable & (ASPNET_FILES | ASPNET_DIRS))
+ {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r,
+ "mod_aspdotnet: File not found or unable to stat: %s",
+ r->filename);
+ }
+ return HTTP_NOT_FOUND;
+ }
+ }
+ else {
ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r,
- "mod_aspdotnet: Forbidden, Options ExecCGI is not set for: %s",
- r->filename);
- return HTTP_FORBIDDEN;
+ "mod_aspdotnet: Invalid file type for: %s (it is not "
+ "a recognized file or directory)", r->filename);
+ return HTTP_NOT_FOUND;
}
if ((r->used_path_info == AP_REQ_REJECT_PATH_INFO) &&
@@ -705,10 +801,10 @@
module AP_MODULE_DECLARE_DATA ::aspdotnet_module =
{
STANDARD20_MODULE_STUFF,
- NULL, /* dir config */
- NULL, /* merge dir config */
- create_asp_net_srvconf, /* server config */
- merge_asp_net_srvconf, /* merge server config */
+ create_asp_net_dirconf, /* dir config */
+ merge_asp_net_dirconf, /* merge dir config */
+ create_asp_net_srvconf, /* server config */
+ merge_asp_net_srvconf, /* merge server config */
asp_net_cmds, /* command apr_table_t */
register_hooks /* register hooks */
};