mod_lua.c revision fc251eb7714d158c2952bc2ddbbcfb9169098212
842ae4bd224140319ae7feec1872b93dfd491143fielding * Licensed to the Apache Software Foundation (ASF) under one or more
842ae4bd224140319ae7feec1872b93dfd491143fielding * contributor license agreements. See the NOTICE file distributed with
842ae4bd224140319ae7feec1872b93dfd491143fielding * this work for additional information regarding copyright ownership.
842ae4bd224140319ae7feec1872b93dfd491143fielding * The ASF licenses this file to You under the Apache License, Version 2.0
842ae4bd224140319ae7feec1872b93dfd491143fielding * (the "License"); you may not use this file except in compliance with
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * the License. You may obtain a copy of the License at
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * Unless required by applicable law or agreed to in writing, software
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * distributed under the License is distributed on an "AS IS" BASIS,
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * See the License for the specific language governing permissions and
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * limitations under the License.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbAPR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ap_lua, AP_LUA, int, lua_open,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbAPR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ap_lua, AP_LUA, int, lua_request,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic APR_OPTIONAL_FN_TYPE(ssl_var_lookup) *lua_ssl_val = NULL;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic APR_OPTIONAL_FN_TYPE(ssl_is_https) *lua_ssl_is_https = NULL;
82632a19f2f9c346fee2b28a65920ba9737b3973minfrintypedef struct {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const char *name;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const char *file_name;
36ef8f77bffe75d1aa327882be1b5bdbe2ff567asf * error reporting if lua has an error.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * Extracts the error from lua stack and prints
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantzstatic void report_lua_error(lua_State *L, request_rec *r)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ap_log_perror(APLOG_MARK, APLOG_WARNING, 0, r->pool, APLOGNO(01471) "Lua error: %s",
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerstatic void lua_open_callback(lua_State *L, apr_pool_t *p, void *ctx)
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe return "once";
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe return "request";
185aa71728867671e105178b4c66fbc22b65ae26sf return "conn";
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe return "thread";
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowestatic ap_lua_vm_spec *create_vm_spec(apr_pool_t **lifecycle_pool,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe const char *filename,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe const char *bytecode,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe const char *function,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe const char *what)
efd83d1dd1a25688a3093c5a542ae16bacef62ddsf ap_lua_vm_spec *spec = apr_pcalloc(r->pool, sizeof(ap_lua_vm_spec));
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r, APLOGNO(02313)
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz "%s details: scope: %s, file: %s, func: %s",
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf pool = apr_thread_pool_get(r->connection->current_thread);
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, APLOGNO(01472)
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe /* XXX: This seems wrong because it may generate wrong headers for HEAD requests */
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe const ap_lua_dir_cfg *cfg = ap_get_module_config(r->per_dir_config,
efd83d1dd1a25688a3093c5a542ae16bacef62ddsf ap_lua_vm_spec *spec = create_vm_spec(&pool, r, cfg, NULL, NULL, NULL,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe /* TODO annotate spec with failure reason */
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe ap_log_rerror(APLOG_MARK, APLOG_TRACE3, 0, r, APLOGNO(01474) "got a vm!");
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r, APLOGNO(01475)
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe "lua: Unable to find function %s in %s",
18b5268e013574026b2503b1641baf3299045f45sf/* ---------------- Configury stuff --------------- */
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes/** harnesses for magic hooks **/
18b5268e013574026b2503b1641baf3299045f45sfstatic int lua_request_rec_hook_harness(request_rec *r, const char *name, int apr_hook_when)
18b5268e013574026b2503b1641baf3299045f45sf ap_lua_server_cfg *server_cfg = ap_get_module_config(r->server->module_config,
18b5268e013574026b2503b1641baf3299045f45sf const ap_lua_dir_cfg *cfg = ap_get_module_config(r->per_dir_config,
18b5268e013574026b2503b1641baf3299045f45sf const char *key = apr_psprintf(r->pool, "%s_%d", name, apr_hook_when);
404381a78d109fd3a4a7702e69815e4d7ff6d93asf apr_array_header_t *hook_specs = apr_hash_get(cfg->hooks, key,
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes "request hook");
18b5268e013574026b2503b1641baf3299045f45sf ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r, APLOGNO(01477)
18b5268e013574026b2503b1641baf3299045f45sf "lua: Failed to obtain lua interpreter for %s %s",
d9cc5de428947d5c7221d7d42ceefea649bcab48sf ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r, APLOGNO(01478)
18b5268e013574026b2503b1641baf3299045f45sf "lua: Unable to find function %s in %s",
4760b58cc9fe170e4ad4648ed4ff7a422a2cef38sfstatic apr_size_t config_getstr(ap_configfile_t *cfg, char *buf,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe apr_status_t rc = (cfg->getstr) (buf, bufsiz, cfg->param);
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe while (i < bufsiz) {
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowetypedef struct cr_ctx
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd const char *endstr;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd/* Okay, this deserves a little explaination -- in order for the errors that lua
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd * generates to be 'accuarate', including line numbers, we basically inject
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd * N line number new lines into the 'top' of the chunk reader.....
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe * be happy. this is cool.
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerstatic const char *lf =
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisdstatic const char *direct_chunkreader(lua_State *lvm, void *udata,
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd const char *p;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd *plen = ctx->startline > N_LF ? N_LF : ctx->startline;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd *plen = config_getstr(ctx->cfp, ctx->buf, HUGE_STRING_LEN);
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd /*fprintf(stderr, "buf read: %s\n", ctx->buf); */
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisdstatic int ldump_writer(lua_State *L, const void *b, size_t size, void *B)
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe luaL_addlstring((luaL_Buffer *) B, (const char *) b, size);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const char *name;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb/* You can be unhappy now.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * This is uncool.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * When you create a <Section handler in httpd, the only 'easy' way to create
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * a directory context is to parse the section, and convert it into a 'normal'
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe * Configureation option, and then collapse the entire section, in memory,
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe * back into the parent section -- from which you can then get the new directive
4f9c22c4f27571d54197be9674e1fc0d528192aestriker * invoked.... anyways. evil. Rici taught me how to do this hack :-)
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowestatic const char *hack_section_handler(cmd_parms *cmd, void *_cfg,
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe const char *arg)
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe const char *key = apr_psprintf(cmd->pool, "%s_%d", baton->name, baton->apr_hook_when);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe apr_array_header_t *hook_specs = apr_hash_get(cfg->hooks, key,
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz *(ap_lua_mapped_handler_spec **) apr_array_push(hook_specs) = baton->spec;
c3e233736c4a453cbb2166a041f779e86230630asfstatic const char *register_named_block_function_hook(const char *name,
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe const char *line)
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe line = apr_pstrndup(cmd->temp_pool, line, endp - line);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe const char *word;
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz spec = apr_pcalloc(cmd->pool, sizeof(ap_lua_mapped_handler_spec));
700b96db75e7cfadb5219978c1735b710d583763wrowe tmp = apr_pstrdup(cmd->pool, cmd->err_directive->directive + 1);
700b96db75e7cfadb5219978c1735b710d583763wrowe /* This lua State is used only to compile the input strings -> bytecode, so we don't need anything extra. */
700b96db75e7cfadb5219978c1735b710d583763wrowe rv = lua_load(lvm, direct_chunkreader, &ctx, spec->file_name);
700b96db75e7cfadb5219978c1735b710d583763wrowe if (rv != 0) {
700b96db75e7cfadb5219978c1735b710d583763wrowe const char *errstr = apr_pstrcat(cmd->pool, "Lua Error:",
700b96db75e7cfadb5219978c1735b710d583763wrowe spec->bytecode = apr_pstrmemdup(cmd->pool, lua_tostring(lvm, -1),
103a93c625bcde1a6a7a5155b64dcda36f612180pquerna /* Here, we have to replace our current config node for the next pass */
113961f0559eb026ea0d379cb7350f82bc09d710druggeri *current = apr_pcalloc(cmd->pool, sizeof(**current));
113961f0559eb026ea0d379cb7350f82bc09d710druggeri baton = apr_pcalloc(cmd->pool, sizeof(hack_section_baton));
8aefbd756763807188d2e3ce336a8680e4893066wrowe (*current)->directive = apr_pstrdup(cmd->pool, "Lua_____ByteCodeHack");
8aefbd756763807188d2e3ce336a8680e4893066wrowestatic const char *register_named_file_function_hook(const char *name,
8aefbd756763807188d2e3ce336a8680e4893066wrowe const char *file,
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe const char *function,
2fa5b5878e7567e2875807c3e2a2b3b0d3ef74bewrowe const char *key = apr_psprintf(cmd->pool, "%s_%d", name, apr_hook_when);
2fa5b5878e7567e2875807c3e2a2b3b0d3ef74bewrowe apr_array_header_t *hook_specs = apr_hash_get(cfg->hooks, key,
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe apr_hash_set(cfg->hooks, key, APR_HASH_KEY_STRING, hook_specs);
23c6309e36a63b13b61c35999c978017521993d6wrowe spec = apr_pcalloc(cmd->pool, sizeof(ap_lua_mapped_handler_spec));
4f9c22c4f27571d54197be9674e1fc0d528192aestriker spec->function_name = apr_pstrdup(cmd->pool, function);
23c6309e36a63b13b61c35999c978017521993d6wrowe *(ap_lua_mapped_handler_spec **) apr_array_push(hook_specs) = spec;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowestatic int lua_check_user_id_harness_first(request_rec *r)
8aefbd756763807188d2e3ce336a8680e4893066wrowe return lua_request_rec_hook_harness(r, "check_user_id", AP_LUA_HOOK_FIRST);
8aefbd756763807188d2e3ce336a8680e4893066wrowe return lua_request_rec_hook_harness(r, "check_user_id", APR_HOOK_MIDDLE);
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerstatic int lua_check_user_id_harness_last(request_rec *r)
185aa71728867671e105178b4c66fbc22b65ae26sf return lua_request_rec_hook_harness(r, "check_user_id", AP_LUA_HOOK_LAST);
a8d11d78181478da6a672f7fbc58b8d523351f49wrowestatic int lua_translate_name_harness_first(request_rec *r)
8aefbd756763807188d2e3ce336a8680e4893066wrowe return lua_request_rec_hook_harness(r, "translate_name", AP_LUA_HOOK_FIRST);
cf6ef072483172309861d06e85b1aeff4573c060wrowe return lua_request_rec_hook_harness(r, "translate_name", APR_HOOK_MIDDLE);
cf6ef072483172309861d06e85b1aeff4573c060wrowestatic int lua_translate_name_harness_last(request_rec *r)
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp return lua_request_rec_hook_harness(r, "translate_name", AP_LUA_HOOK_LAST);
cf6ef072483172309861d06e85b1aeff4573c060wrowe return lua_request_rec_hook_harness(r, "fixups", APR_HOOK_MIDDLE);
cf6ef072483172309861d06e85b1aeff4573c060wrowe return lua_request_rec_hook_harness(r, "map_to_storage", APR_HOOK_MIDDLE);
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick return lua_request_rec_hook_harness(r, "type_checker", APR_HOOK_MIDDLE);
d75626f0952c6152a99acd013a4f127d46f0f9edtrawickstatic int lua_access_checker_harness_first(request_rec *r)
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick return lua_request_rec_hook_harness(r, "access_checker", AP_LUA_HOOK_FIRST);
d75626f0952c6152a99acd013a4f127d46f0f9edtrawickstatic int lua_access_checker_harness(request_rec *r)
ecde48c75338ff5712f2036711f813c6dedca28ewrowe return lua_request_rec_hook_harness(r, "access_checker", APR_HOOK_MIDDLE);
ecde48c75338ff5712f2036711f813c6dedca28ewrowestatic int lua_access_checker_harness_last(request_rec *r)
ecde48c75338ff5712f2036711f813c6dedca28ewrowe return lua_request_rec_hook_harness(r, "access_checker", AP_LUA_HOOK_LAST);
d75626f0952c6152a99acd013a4f127d46f0f9edtrawickstatic int lua_auth_checker_harness_first(request_rec *r)
cf6ef072483172309861d06e85b1aeff4573c060wrowe return lua_request_rec_hook_harness(r, "auth_checker", AP_LUA_HOOK_FIRST);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar return lua_request_rec_hook_harness(r, "auth_checker", APR_HOOK_MIDDLE);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoarstatic int lua_auth_checker_harness_last(request_rec *r)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return lua_request_rec_hook_harness(r, "auth_checker", AP_LUA_HOOK_LAST);
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd /* ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, "LuaHookInsertFilter not yet implemented"); */
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerstatic int lua_quick_harness(request_rec *r, int lookup)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return lua_request_rec_hook_harness(r, "quick", APR_HOOK_MIDDLE);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowestatic const char *register_translate_name_hook(cmd_parms *cmd, void *_cfg,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *file,
a9a4544168a37b43bd180b3703ccee995f27a80awrowe const char *function,
170476518c96db46fff6fdce7cb9a3f24abfaea7rpluem const char *when)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const char *err = ap_check_cmd_context(cmd, NOT_IN_DIRECTORY|NOT_IN_FILES|
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem return "Third argument must be 'early' or 'late'";
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem return register_named_file_function_hook("translate_name", cmd, _cfg,
eb12400ff685a3b69476736ca4b5389f348b9d63rpluemstatic const char *register_translate_name_block(cmd_parms *cmd, void *_cfg,
eb12400ff685a3b69476736ca4b5389f348b9d63rpluem const char *line)
eb12400ff685a3b69476736ca4b5389f348b9d63rpluem return register_named_block_function_hook("translate_name", cmd, _cfg,
ad099b4d62597be19f8dba650663e796cbaa8d28rpluemstatic const char *register_fixups_hook(cmd_parms *cmd, void *_cfg,
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem const char *file,
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem const char *function)
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem return register_named_file_function_hook("fixups", cmd, _cfg, file,
185aa71728867671e105178b4c66fbc22b65ae26sfstatic const char *register_fixups_block(cmd_parms *cmd, void *_cfg,
75c02648f9afe9a1da5d5482703fcbca306ffcdcpquerna const char *line)
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem return register_named_block_function_hook("fixups", cmd, _cfg, line);
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluemstatic const char *register_map_to_storage_hook(cmd_parms *cmd, void *_cfg,
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem const char *file,
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem const char *function)
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem return register_named_file_function_hook("map_to_storage", cmd, _cfg,
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluemstatic const char *register_map_to_storage_block(cmd_parms *cmd, void *_cfg,
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem const char *line)
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem return register_named_block_function_hook("map_to_storage", cmd, _cfg,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoarstatic const char *register_check_user_id_hook(cmd_parms *cmd, void *_cfg,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *file,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar const char *function,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar const char *when)
cf6ef072483172309861d06e85b1aeff4573c060wrowe return "Third argument must be 'early' or 'late'";
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return register_named_file_function_hook("check_user_id", cmd, _cfg, file,
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantzstatic const char *register_check_user_id_block(cmd_parms *cmd, void *_cfg,
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz const char *line)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return register_named_block_function_hook("check_user_id", cmd, _cfg,
3dcf67a5060400edb8ccef3fb4a2024388965af9martinstatic const char *register_type_checker_hook(cmd_parms *cmd, void *_cfg,
3dcf67a5060400edb8ccef3fb4a2024388965af9martin const char *file,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *function)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return register_named_file_function_hook("type_checker", cmd, _cfg, file,
8aefbd756763807188d2e3ce336a8680e4893066wrowestatic const char *register_type_checker_block(cmd_parms *cmd, void *_cfg,
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf const char *line)
700b96db75e7cfadb5219978c1735b710d583763wrowe return register_named_block_function_hook("type_checker", cmd, _cfg,
113961f0559eb026ea0d379cb7350f82bc09d710druggeristatic const char *register_access_checker_hook(cmd_parms *cmd, void *_cfg,
8aefbd756763807188d2e3ce336a8680e4893066wrowe const char *file,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *function,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const char *when)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return "Third argument must be 'early' or 'late'";
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return register_named_file_function_hook("access_checker", cmd, _cfg,
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerstatic const char *register_access_checker_block(cmd_parms *cmd, void *_cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *line)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return register_named_block_function_hook("access_checker", cmd, _cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowestatic const char *register_auth_checker_hook(cmd_parms *cmd, void *_cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *file,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const char *function,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *when)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return "Third argument must be 'early' or 'late'";
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return register_named_file_function_hook("auth_checker", cmd, _cfg, file,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowestatic const char *register_auth_checker_block(cmd_parms *cmd, void *_cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *line)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return register_named_block_function_hook("auth_checker", cmd, _cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowestatic const char *register_insert_filter_hook(cmd_parms *cmd, void *_cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *file,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *function)
cf6ef072483172309861d06e85b1aeff4573c060wrowe return "LuaHookInsertFilter not yet implemented";
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowestatic const char *register_quick_hook(cmd_parms *cmd, void *_cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *err = ap_check_cmd_context(cmd, NOT_IN_DIRECTORY|NOT_IN_FILES|
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return register_named_file_function_hook("quick", cmd, _cfg, file,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowestatic const char *register_quick_block(cmd_parms *cmd, void *_cfg,
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz const char *line)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return register_named_block_function_hook("quick", cmd, _cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowestatic const char *register_package_helper(cmd_parms *cmd,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *arg,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_get_module_config(cmd->server->module_config, &lua_module);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe *(const char **) apr_array_push(dir_array) = fixed_filename;
cf6ef072483172309861d06e85b1aeff4573c060wrowe * Called for config directive which looks like
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * LuaPackagePath /lua/package/path/mapped/thing/like/this/?.lua
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowestatic const char *register_package_dir(cmd_parms *cmd, void *_cfg,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *arg)
548b2980e83f609186a76e98fb245d02e8547bc3jerenkrantz return register_package_helper(cmd, arg, cfg->package_paths);
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz * Called for config directive which looks like
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz * LuaPackageCPath /lua/package/path/mapped/thing/like/this/?.so
8aefbd756763807188d2e3ce336a8680e4893066wrowestatic const char *register_package_cdir(cmd_parms *cmd,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *arg)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return register_package_helper(cmd, arg, cfg->package_cpaths);
8aefbd756763807188d2e3ce336a8680e4893066wrowestatic const char *register_lua_inherit(cmd_parms *cmd,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *arg)
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick "LuaInherit type of '%s' not recognized, valid "
f08810eff40a2bddd2bc0103453c4ae775ea62bewrowe "options are 'none', 'parent-first', and 'parent-last'",
700b96db75e7cfadb5219978c1735b710d583763wrowe const char *scope,
700b96db75e7cfadb5219978c1735b710d583763wrowe const char *min,
700b96db75e7cfadb5219978c1735b710d583763wrowe const char *max)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Scope type of '%s' cannot be used because this "
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd "server does not have threading support "
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "(APR_HAS_THREADS)"
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar "Invalid value for LuaScope, '%s', acceptable "
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "values are: 'once', 'request', 'conn', 'server'"
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ", 'thread'"
700b96db75e7cfadb5219978c1735b710d583763wrowestatic const char *register_lua_root(cmd_parms *cmd, void *_cfg,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *root)
e8f95a682820a599fe41b22977010636be5c2717jim /* ap_lua_dir_cfg* cfg = (ap_lua_dir_cfg*)_cfg; */
e8f95a682820a599fe41b22977010636be5c2717jim ap_lua_server_cfg *cfg = ap_get_module_config(cmd->server->module_config,
113961f0559eb026ea0d379cb7350f82bc09d710druggeriAP_LUA_DECLARE(const char *) ap_lua_ssl_val(apr_pool_t *p, server_rec *s, conn_rec *c, request_rec *r, const char *var)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return (const char *)lua_ssl_val(p, s, c, r, (char *)var);
700b96db75e7cfadb5219978c1735b710d583763wrowe/*******************************/
700b96db75e7cfadb5219978c1735b710d583763wrowestatic const char *lua_authz_parse(cmd_parms *cmd, const char *require_line,
700b96db75e7cfadb5219978c1735b710d583763wrowe apr_pool_userdata_get((void**)&provider_name, AUTHZ_PROVIDER_NAME_NOTE,
700b96db75e7cfadb5219978c1735b710d583763wrowe spec = apr_hash_get(lua_authz_providers, provider_name, APR_HASH_KEY_STRING);
700b96db75e7cfadb5219978c1735b710d583763wrowe const char *arg;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar spec->args = apr_array_make(cmd->pool, 2, sizeof(const char *));
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe while ((arg = ap_getword_conf(cmd->pool, &require_line)) && *arg) {
700b96db75e7cfadb5219978c1735b710d583763wrowestatic authz_status lua_authz_check(request_rec *r, const char *require_line,
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_lua_server_cfg *server_cfg = ap_get_module_config(r->server->module_config,
700b96db75e7cfadb5219978c1735b710d583763wrowe const ap_lua_dir_cfg *cfg = ap_get_module_config(r->per_dir_config,
700b96db75e7cfadb5219978c1735b710d583763wrowe const lua_authz_provider_spec *prov_spec = parsed_require_line;
700b96db75e7cfadb5219978c1735b710d583763wrowe spec = create_vm_spec(&pool, r, cfg, server_cfg, prov_spec->file_name,
2520f59894a3e07fefa881ef68aaded763a8d447ben if (L == NULL) {
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02314)
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar "Unable to compile VM for authz provider %s", prov_spec->name);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r, APLOGNO(02319)
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar "Unable to find function %s in %s",
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz if (!lua_checkstack(L, prov_spec->args->nelts)) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02315)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Error: authz provider %s: too many arguments", prov_spec->name);
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz const char *arg = APR_ARRAY_IDX(prov_spec->args, i, const char *);
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02316)
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz "Error executing authz provider %s: %s", prov_spec->name, err);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02317)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Error: authz provider %s did not return integer", prov_spec->name);
cf6ef072483172309861d06e85b1aeff4573c060wrowe ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02318)
2d4ea77e21ef7f3707d2c27f6117cc0a36e99b83trawick "Error: authz provider %s: invalid return value %d",
e8f95a682820a599fe41b22977010636be5c2717jimstatic const char *register_authz_provider(cmd_parms *cmd, void *_cfg,
e8f95a682820a599fe41b22977010636be5c2717jim const char *function)
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE);
8aefbd756763807188d2e3ce336a8680e4893066wrowe apr_hash_set(lua_authz_providers, name, APR_HASH_KEY_STRING, spec);
cf6ef072483172309861d06e85b1aeff4573c060wrowe ap_register_auth_provider(cmd->pool, AUTHZ_PROVIDER_GROUP, name,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker AP_INIT_TAKE1("LuaRoot", register_lua_root, NULL, OR_ALL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Specify the base path for resolving relative paths for mod_lua directives"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe AP_INIT_TAKE1("LuaPackagePath", register_package_dir, NULL, OR_ALL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Add a directory to lua's package.path"),
44761f3e3072cf78a4997a88bb9a515ca101a1f4covener AP_INIT_TAKE1("LuaPackageCPath", register_package_cdir, NULL, OR_ALL,
44761f3e3072cf78a4997a88bb9a515ca101a1f4covener "Add a directory to lua's package.cpath"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe AP_INIT_TAKE3("LuaAuthzProvider", register_authz_provider, NULL, RSRC_CONF|EXEC_ON_READ,
69adb3d949e3dd17c0492a01fc2cf298832c7eefwrowe "Provide an authorization provider"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe AP_INIT_TAKE23("LuaHookTranslateName", register_translate_name_hook, NULL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Provide a hook for the translate name phase of request processing"),
cadddb2c31d24d48f4017db4df0a29687432326cwrowe AP_INIT_RAW_ARGS("<LuaHookTranslateName", register_translate_name_block,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Provide a hook for the translate name phase of request processing"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe AP_INIT_TAKE2("LuaHookFixups", register_fixups_hook, NULL, OR_ALL,
8aefbd756763807188d2e3ce336a8680e4893066wrowe "Provide a hook for the fixups phase of request processing"),
cf6ef072483172309861d06e85b1aeff4573c060wrowe AP_INIT_RAW_ARGS("<LuaHookFixups", register_fixups_block, NULL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Provide a inline hook for the fixups phase of request processing"),
700b96db75e7cfadb5219978c1735b710d583763wrowe /* todo: test */
185aa71728867671e105178b4c66fbc22b65ae26sf AP_INIT_TAKE2("LuaHookMapToStorage", register_map_to_storage_hook, NULL,
71fe373d064756fb261876443806ece033ee3309slive "Provide a hook for the map_to_storage phase of request processing"),
c2cf53a40a9814eb91db2cdf820f97d943f21628coar AP_INIT_RAW_ARGS("<LuaHookMapToStorage", register_map_to_storage_block,
ecde48c75338ff5712f2036711f813c6dedca28ewrowe "Provide a hook for the map_to_storage phase of request processing"),
ecde48c75338ff5712f2036711f813c6dedca28ewrowe /* todo: test */
ecde48c75338ff5712f2036711f813c6dedca28ewrowe AP_INIT_TAKE23("LuaHookCheckUserID", register_check_user_id_hook, NULL,
ecde48c75338ff5712f2036711f813c6dedca28ewrowe "Provide a hook for the check_user_id phase of request processing"),
ecde48c75338ff5712f2036711f813c6dedca28ewrowe AP_INIT_RAW_ARGS("<LuaHookCheckUserID", register_check_user_id_block,
ecde48c75338ff5712f2036711f813c6dedca28ewrowe "Provide a hook for the check_user_id phase of request processing"),
185aa71728867671e105178b4c66fbc22b65ae26sf /* todo: test */
ecde48c75338ff5712f2036711f813c6dedca28ewrowe AP_INIT_TAKE2("LuaHookTypeChecker", register_type_checker_hook, NULL,
ecde48c75338ff5712f2036711f813c6dedca28ewrowe "Provide a hook for the type_checker phase of request processing"),
ecde48c75338ff5712f2036711f813c6dedca28ewrowe AP_INIT_RAW_ARGS("<LuaHookTypeChecker", register_type_checker_block, NULL,
8aefbd756763807188d2e3ce336a8680e4893066wrowe "Provide a hook for the type_checker phase of request processing"),
cf6ef072483172309861d06e85b1aeff4573c060wrowe /* todo: test */
cf6ef072483172309861d06e85b1aeff4573c060wrowe AP_INIT_TAKE23("LuaHookAccessChecker", register_access_checker_hook, NULL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Provide a hook for the access_checker phase of request processing"),
cf6ef072483172309861d06e85b1aeff4573c060wrowe AP_INIT_RAW_ARGS("<LuaHookAccessChecker", register_access_checker_block,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Provide a hook for the access_checker phase of request processing"),
cf6ef072483172309861d06e85b1aeff4573c060wrowe /* todo: test */
cf6ef072483172309861d06e85b1aeff4573c060wrowe AP_INIT_TAKE23("LuaHookAuthChecker", register_auth_checker_hook, NULL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Provide a hook for the auth_checker phase of request processing"),
4f9c22c4f27571d54197be9674e1fc0d528192aestriker AP_INIT_RAW_ARGS("<LuaHookAuthChecker", register_auth_checker_block, NULL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Provide a hook for the auth_checker phase of request processing"),
cf6ef072483172309861d06e85b1aeff4573c060wrowe /* todo: test */
cf6ef072483172309861d06e85b1aeff4573c060wrowe AP_INIT_TAKE2("LuaHookInsertFilter", register_insert_filter_hook, NULL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Provide a hook for the insert_filter phase of request processing"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe AP_INIT_TAKE123("LuaScope", register_lua_scope, NULL, OR_ALL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "One of once, request, conn, server -- default is once"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe AP_INIT_TAKE1("LuaInherit", register_lua_inherit, NULL, OR_ALL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Controls how Lua scripts in parent contexts are merged with the current "
4f9c22c4f27571d54197be9674e1fc0d528192aestriker " context: none|parent-last|parent-first (default: parent-first) "),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe AP_INIT_TAKE2("LuaQuickHandler", register_quick_hook, NULL, OR_ALL,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar "Provide a hook for the quick handler of request processing"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe AP_INIT_RAW_ARGS("<LuaQuickHandler", register_quick_block, NULL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Provide a hook for the quick handler of request processing"),
fa1c7ce09927decc1eecd1e9a35cc5331078a052covener AP_INIT_RAW_ARGS("Lua_____ByteCodeHack", hack_section_handler, NULL,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar "(internal) Byte code handler"),
700b96db75e7cfadb5219978c1735b710d583763wrowestatic void *create_dir_config(apr_pool_t *p, char *dir)
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_lua_dir_cfg *cfg = apr_pcalloc(p, sizeof(ap_lua_dir_cfg));
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cfg->package_paths = apr_array_make(p, 2, sizeof(char *));
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cfg->package_cpaths = apr_array_make(p, 2, sizeof(char *));
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe apr_array_make(p, 1, sizeof(ap_lua_mapped_handler_spec *));
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_lua_request_cfg *cfg = apr_palloc(r->pool, sizeof(ap_lua_request_cfg));
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_set_module_config(r->request_config, &lua_module, cfg);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowestatic void *create_server_config(apr_pool_t *p, server_rec *s)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_lua_server_cfg *cfg = apr_pcalloc(p, sizeof(ap_lua_server_cfg));
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisdstatic int lua_request_hook(lua_State *L, request_rec *r)
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisdstatic int lua_post_config(apr_pool_t *pconf, apr_pool_t *plog,
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd lua_ssl_val = APR_RETRIEVE_OPTIONAL_FN(ssl_var_lookup);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar lua_ssl_is_https = APR_RETRIEVE_OPTIONAL_FN(ssl_is_https);
c2cf53a40a9814eb91db2cdf820f97d943f21628coar const void *key,
c2cf53a40a9814eb91db2cdf820f97d943f21628coar const void *overlay_val,
8aefbd756763807188d2e3ce336a8680e4893066wrowe const void *data)
8aefbd756763807188d2e3ce336a8680e4893066wrowe const apr_array_header_t *overlay_info = (const apr_array_header_t*)overlay_val;
8aefbd756763807188d2e3ce336a8680e4893066wrowe const apr_array_header_t *base_info = (const apr_array_header_t*)base_val;
8aefbd756763807188d2e3ce336a8680e4893066wrowestatic void *merge_dir_config(apr_pool_t *p, void *basev, void *overridesv)
c2cf53a40a9814eb91db2cdf820f97d943f21628coar a = (ap_lua_dir_cfg *)apr_pcalloc(p, sizeof(ap_lua_dir_cfg));
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe a->vm_scope = (overrides->vm_scope == AP_LUA_SCOPE_UNSET) ? base->vm_scope: overrides->vm_scope;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe a->inherit = (overrides->inherit== AP_LUA_INHERIT_UNSET) ? base->inherit : overrides->inherit;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe if (a->inherit == AP_LUA_INHERIT_UNSET || a->inherit == AP_LUA_INHERIT_PARENT_FIRST) {
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe a->package_paths = apr_array_append(p, base->package_paths, overrides->package_paths);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe a->package_cpaths = apr_array_append(p, base->package_cpaths, overrides->package_cpaths);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar a->mapped_handlers = apr_array_append(p, base->mapped_handlers, overrides->mapped_handlers);
0540a0b469147b52e858587270dba31c2aaa9e09wrowe a->hooks = apr_hash_merge(p, overrides->hooks, base->hooks, overlay_hook_specs, NULL);
0540a0b469147b52e858587270dba31c2aaa9e09wrowe a->package_paths = apr_array_append(p, overrides->package_paths, base->package_paths);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar a->package_cpaths = apr_array_append(p, overrides->package_cpaths, base->package_cpaths);
0540a0b469147b52e858587270dba31c2aaa9e09wrowe a->mapped_handlers = apr_array_append(p, overrides->mapped_handlers, base->mapped_handlers);
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd a->hooks = apr_hash_merge(p, base->hooks, overrides->hooks, overlay_hook_specs, NULL);
0540a0b469147b52e858587270dba31c2aaa9e09wrowe /* ap_register_output_filter("luahood", luahood, NULL, AP_FTYPE_RESOURCE); */
0540a0b469147b52e858587270dba31c2aaa9e09wrowe ap_hook_handler(lua_handler, NULL, NULL, APR_HOOK_MIDDLE);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar ap_hook_create_request(create_request_config, NULL, NULL,
8aefbd756763807188d2e3ce336a8680e4893066wrowe ap_hook_translate_name(lua_translate_name_harness_first, NULL, NULL,
0540a0b469147b52e858587270dba31c2aaa9e09wrowe ap_hook_translate_name(lua_translate_name_harness, NULL, NULL,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_hook_translate_name(lua_translate_name_harness_last, NULL, NULL,
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf ap_hook_fixups(lua_fixup_harness, NULL, NULL, APR_HOOK_MIDDLE);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ap_hook_map_to_storage(lua_map_to_storage_harness, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_check_user_id(lua_check_user_id_harness_first, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_check_user_id(lua_check_user_id_harness, NULL, NULL,
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe ap_hook_check_user_id(lua_check_user_id_harness_last, NULL, NULL,
0540a0b469147b52e858587270dba31c2aaa9e09wrowe ap_hook_type_checker(lua_type_checker_harness, NULL, NULL,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_hook_access_checker(lua_access_checker_harness_first, NULL, NULL,
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd ap_hook_access_checker(lua_access_checker_harness, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_access_checker(lua_access_checker_harness_last, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_auth_checker(lua_auth_checker_harness_first, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_auth_checker(lua_auth_checker_harness, NULL, NULL,
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz ap_hook_auth_checker(lua_auth_checker_harness_last, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_insert_filter(lua_insert_filter_harness, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_quick_handler(lua_quick_harness, NULL, NULL, APR_HOOK_FIRST);
053497224246c4dbef9af594cacf5c00ed271e6cwrowe ap_hook_post_config(lua_post_config, NULL, NULL, APR_HOOK_MIDDLE);
948096a99010fccf648814fecf38f75c689172d7wrowe APR_OPTIONAL_HOOK(ap_lua, lua_open, lua_open_hook, NULL, NULL,
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd APR_OPTIONAL_HOOK(ap_lua, lua_request, lua_request_hook, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe /* providers */
948096a99010fccf648814fecf38f75c689172d7wrowe create_dir_config, /* create per-dir config structures */
a9a4544168a37b43bd180b3703ccee995f27a80awrowe merge_dir_config, /* merge per-dir config structures */
4f9c22c4f27571d54197be9674e1fc0d528192aestriker create_server_config, /* create per-server config structures */