mod_lua.c revision fc251eb7714d158c2952bc2ddbbcfb9169098212
842ae4bd224140319ae7feec1872b93dfd491143fielding/**
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 *
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * http://www.apache.org/licenses/LICENSE-2.0
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd *
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.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianh#include "mod_lua.h"
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianh#include <string.h>
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include <stdlib.h>
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianh#include <ctype.h>
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include "lua_apr.h"
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include "lua_config.h"
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include "apr_optional.h"
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include "mod_ssl.h"
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include "mod_auth.h"
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#ifdef APR_HAS_THREADS
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include "apr_thread_proc.h"
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#endif
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbAPR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ap_lua, AP_LUA, int, lua_open,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb (lua_State *L, apr_pool_t *p),
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb (L, p), OK, DECLINED)
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbAPR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ap_lua, AP_LUA, int, lua_request,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb (lua_State *L, request_rec *r),
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb (L, r), OK, DECLINED)
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;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbmodule AP_MODULE_DECLARE_DATA lua_module;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#define AP_LUA_HOOK_FIRST (APR_HOOK_FIRST - 1)
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames#define AP_LUA_HOOK_LAST (APR_HOOK_LAST + 1)
750d12c59545dbbac70390988de94f7e901b08f2niq
82632a19f2f9c346fee2b28a65920ba9737b3973minfrintypedef struct {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const char *name;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const char *file_name;
db455cbc662c98dbbf53175393c50086ff63370cchrisd const char *function_name;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_lua_vm_spec *spec;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb apr_array_header_t *args;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb} lua_authz_provider_spec;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbapr_hash_t *lua_authz_providers;
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf/**
36ef8f77bffe75d1aa327882be1b5bdbe2ff567asf * error reporting if lua has an error.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * Extracts the error from lua stack and prints
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz */
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantzstatic void report_lua_error(lua_State *L, request_rec *r)
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz{
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz const char *lua_response;
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz r->status = HTTP_INTERNAL_SERVER_ERROR;
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz r->content_type = "text/html";
18b5268e013574026b2503b1641baf3299045f45sf
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz ap_rputs("<b>Error!</b>\n", r);
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz ap_rputs("<p>", r);
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz lua_response = lua_tostring(L, -1);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_rputs(lua_response, r);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_rputs("</p>\n", r);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ap_log_perror(APLOG_MARK, APLOG_WARNING, 0, r->pool, APLOGNO(01471) "Lua error: %s",
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe lua_response);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerstatic void lua_open_callback(lua_State *L, apr_pool_t *p, void *ctx)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ap_lua_init(L, p);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_lua_load_apache2_lmodule(L);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ap_lua_load_request_lmodule(L, p);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_lua_load_config_lmodule(L);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
18b5268e013574026b2503b1641baf3299045f45sf
18b5268e013574026b2503b1641baf3299045f45sfstatic int lua_open_hook(lua_State *L, apr_pool_t *p)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker lua_open_callback(L, p, NULL);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb return OK;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic const char *scope_to_string(unsigned int scope)
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd{
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd switch (scope) {
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd case AP_LUA_SCOPE_ONCE:
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd case AP_LUA_SCOPE_UNSET:
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe return "once";
963f8b44ac95132458ea3b6aaa8ebc135188e473takashi case AP_LUA_SCOPE_REQUEST:
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe return "request";
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe case AP_LUA_SCOPE_CONN:
185aa71728867671e105178b4c66fbc22b65ae26sf return "conn";
c2cf53a40a9814eb91db2cdf820f97d943f21628coar#if APR_HAS_THREADS
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe case AP_LUA_SCOPE_THREAD:
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe return "thread";
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar#endif
4760b58cc9fe170e4ad4648ed4ff7a422a2cef38sf default:
4760b58cc9fe170e4ad4648ed4ff7a422a2cef38sf ap_assert(0);
4760b58cc9fe170e4ad4648ed4ff7a422a2cef38sf }
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe}
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowestatic ap_lua_vm_spec *create_vm_spec(apr_pool_t **lifecycle_pool,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe request_rec *r,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe const ap_lua_dir_cfg *cfg,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe const ap_lua_server_cfg *server_cfg,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe const char *filename,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe const char *bytecode,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe apr_size_t bytecode_len,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe const char *function,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe const char *what)
3e392a5afd51526de3cb15d57ee46d8cb160ae65gregames{
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe apr_pool_t *pool;
efd83d1dd1a25688a3093c5a542ae16bacef62ddsf ap_lua_vm_spec *spec = apr_pcalloc(r->pool, sizeof(ap_lua_vm_spec));
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe spec->scope = cfg->vm_scope;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe spec->pool = r->pool;
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf spec->package_paths = cfg->package_paths;
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar spec->package_cpaths = cfg->package_cpaths;
3770ed746d69c7a4111cba9966169bd5d7a509a6poirier spec->cb = &lua_open_callback;
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar spec->cb_arg = NULL;
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar spec->bytecode = bytecode;
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar spec->bytecode_len = bytecode_len;
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz if (filename) {
2a6e98ba4ffa30ded5d8831664c5cb2a170a56b6coar char *file;
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar apr_filepath_merge(&file, server_cfg->root_path,
185aa71728867671e105178b4c66fbc22b65ae26sf filename, APR_FILEPATH_NOTRELATIVE, r->pool);
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar spec->file = file;
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar }
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar else {
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar spec->file = r->filename;
2a6e98ba4ffa30ded5d8831664c5cb2a170a56b6coar }
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r, APLOGNO(02313)
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz "%s details: scope: %s, file: %s, func: %s",
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe what, scope_to_string(spec->scope), spec->file,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe function ? function : "-");
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe switch (spec->scope) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker case AP_LUA_SCOPE_ONCE:
4f9c22c4f27571d54197be9674e1fc0d528192aestriker case AP_LUA_SCOPE_UNSET:
3e392a5afd51526de3cb15d57ee46d8cb160ae65gregames apr_pool_create(&pool, r->pool);
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe break;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar case AP_LUA_SCOPE_REQUEST:
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe pool = r->pool;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe break;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe case AP_LUA_SCOPE_CONN:
48e4b65042d94992c50f1db6c0b0cdbd99ca77e8sf pool = r->connection->pool;
48e4b65042d94992c50f1db6c0b0cdbd99ca77e8sf break;
48e4b65042d94992c50f1db6c0b0cdbd99ca77e8sf#if APR_HAS_THREADS
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe case AP_LUA_SCOPE_THREAD:
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf pool = apr_thread_pool_get(r->connection->current_thread);
efd83d1dd1a25688a3093c5a542ae16bacef62ddsf break;
efd83d1dd1a25688a3093c5a542ae16bacef62ddsf#endif
efd83d1dd1a25688a3093c5a542ae16bacef62ddsf default:
efd83d1dd1a25688a3093c5a542ae16bacef62ddsf ap_assert(0);
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe }
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe *lifecycle_pool = pool;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe return spec;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe/**
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe * "main"
c2cf53a40a9814eb91db2cdf820f97d943f21628coar */
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowestatic int lua_handler(request_rec *r)
4775dfc34c90fada8c7c4d6a57ed8a3114d55c2dtrawick{
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe if (strcmp(r->handler, "lua-script")) {
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe return DECLINED;
11a0edf478ca9c59d80bf73491d89cf019259feeniq }
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, APLOGNO(01472)
11a0edf478ca9c59d80bf73491d89cf019259feeniq "handling [%s] in mod_lua", r->filename);
11a0edf478ca9c59d80bf73491d89cf019259feeniq
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe /* XXX: This seems wrong because it may generate wrong headers for HEAD requests */
48e4b65042d94992c50f1db6c0b0cdbd99ca77e8sf if (!r->header_only) {
48e4b65042d94992c50f1db6c0b0cdbd99ca77e8sf lua_State *L;
48e4b65042d94992c50f1db6c0b0cdbd99ca77e8sf apr_pool_t *pool;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe const ap_lua_dir_cfg *cfg = ap_get_module_config(r->per_dir_config,
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf &lua_module);
efd83d1dd1a25688a3093c5a542ae16bacef62ddsf ap_lua_vm_spec *spec = create_vm_spec(&pool, r, cfg, NULL, NULL, NULL,
efd83d1dd1a25688a3093c5a542ae16bacef62ddsf 0, "handle", "request handler");
efd83d1dd1a25688a3093c5a542ae16bacef62ddsf
efd83d1dd1a25688a3093c5a542ae16bacef62ddsf L = ap_lua_get_lua_state(pool, spec);
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe if (!L) {
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe /* TODO annotate spec with failure reason */
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe r->status = HTTP_INTERNAL_SERVER_ERROR;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe ap_rputs("Unable to compile VM, see logs", r);
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe return HTTP_INTERNAL_SERVER_ERROR;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe }
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe ap_log_rerror(APLOG_MARK, APLOG_TRACE3, 0, r, APLOGNO(01474) "got a vm!");
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe lua_getglobal(L, "handle");
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe if (!lua_isfunction(L, -1)) {
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r, APLOGNO(01475)
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe "lua: Unable to find function %s in %s",
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe "handle",
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd spec->file);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return HTTP_INTERNAL_SERVER_ERROR;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe }
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe ap_lua_run_lua_request(L, r);
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd if (lua_pcall(L, 1, 0, 0)) {
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd report_lua_error(L, r);
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd }
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd }
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar return OK;
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes}
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes
18b5268e013574026b2503b1641baf3299045f45sf/* ---------------- Configury stuff --------------- */
18b5268e013574026b2503b1641baf3299045f45sf
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes/** harnesses for magic hooks **/
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
18b5268e013574026b2503b1641baf3299045f45sfstatic int lua_request_rec_hook_harness(request_rec *r, const char *name, int apr_hook_when)
18b5268e013574026b2503b1641baf3299045f45sf{
18b5268e013574026b2503b1641baf3299045f45sf int rc;
18b5268e013574026b2503b1641baf3299045f45sf apr_pool_t *pool;
d9cc5de428947d5c7221d7d42ceefea649bcab48sf lua_State *L;
18b5268e013574026b2503b1641baf3299045f45sf ap_lua_vm_spec *spec;
18b5268e013574026b2503b1641baf3299045f45sf ap_lua_server_cfg *server_cfg = ap_get_module_config(r->server->module_config,
18b5268e013574026b2503b1641baf3299045f45sf &lua_module);
18b5268e013574026b2503b1641baf3299045f45sf const ap_lua_dir_cfg *cfg = ap_get_module_config(r->per_dir_config,
18b5268e013574026b2503b1641baf3299045f45sf &lua_module);
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,
404381a78d109fd3a4a7702e69815e4d7ff6d93asf APR_HASH_KEY_STRING);
1a7a4f8c6a312cb237e428c77da0792eb165dc7aniq if (hook_specs) {
1a7a4f8c6a312cb237e428c77da0792eb165dc7aniq int i;
185aa71728867671e105178b4c66fbc22b65ae26sf for (i = 0; i < hook_specs->nelts; i++) {
60fc37bb7b498f4bba5eaaa73a42a25daa27a9dasf ap_lua_mapped_handler_spec *hook_spec =
60fc37bb7b498f4bba5eaaa73a42a25daa27a9dasf ((ap_lua_mapped_handler_spec **) hook_specs->elts)[i];
60fc37bb7b498f4bba5eaaa73a42a25daa27a9dasf
1a7a4f8c6a312cb237e428c77da0792eb165dc7aniq if (hook_spec == NULL) {
1a7a4f8c6a312cb237e428c77da0792eb165dc7aniq continue;
1a7a4f8c6a312cb237e428c77da0792eb165dc7aniq }
1a7a4f8c6a312cb237e428c77da0792eb165dc7aniq spec = create_vm_spec(&pool, r, cfg, server_cfg,
18b5268e013574026b2503b1641baf3299045f45sf hook_spec->file_name,
18b5268e013574026b2503b1641baf3299045f45sf hook_spec->bytecode,
18b5268e013574026b2503b1641baf3299045f45sf hook_spec->bytecode_len,
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes hook_spec->function_name,
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes "request hook");
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes
18b5268e013574026b2503b1641baf3299045f45sf L = ap_lua_get_lua_state(pool, spec);
18b5268e013574026b2503b1641baf3299045f45sf
18b5268e013574026b2503b1641baf3299045f45sf if (!L) {
18b5268e013574026b2503b1641baf3299045f45sf ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r, APLOGNO(01477)
18b5268e013574026b2503b1641baf3299045f45sf "lua: Failed to obtain lua interpreter for %s %s",
18b5268e013574026b2503b1641baf3299045f45sf hook_spec->function_name, hook_spec->file_name);
18b5268e013574026b2503b1641baf3299045f45sf return HTTP_INTERNAL_SERVER_ERROR;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
18b5268e013574026b2503b1641baf3299045f45sf
18b5268e013574026b2503b1641baf3299045f45sf if (hook_spec->function_name != NULL) {
18b5268e013574026b2503b1641baf3299045f45sf lua_getglobal(L, hook_spec->function_name);
18b5268e013574026b2503b1641baf3299045f45sf if (!lua_isfunction(L, -1)) {
d9cc5de428947d5c7221d7d42ceefea649bcab48sf ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r, APLOGNO(01478)
18b5268e013574026b2503b1641baf3299045f45sf "lua: Unable to find function %s in %s",
18b5268e013574026b2503b1641baf3299045f45sf hook_spec->function_name,
18b5268e013574026b2503b1641baf3299045f45sf hook_spec->file_name);
18b5268e013574026b2503b1641baf3299045f45sf return HTTP_INTERNAL_SERVER_ERROR;
18b5268e013574026b2503b1641baf3299045f45sf }
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes
18b5268e013574026b2503b1641baf3299045f45sf ap_lua_run_lua_request(L, r);
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes }
69bbd0a9d1892949e1d4e454c10e8ad24b37c759sf else {
69bbd0a9d1892949e1d4e454c10e8ad24b37c759sf int t;
185aa71728867671e105178b4c66fbc22b65ae26sf ap_lua_run_lua_request(L, r);
60fc37bb7b498f4bba5eaaa73a42a25daa27a9dasf
60fc37bb7b498f4bba5eaaa73a42a25daa27a9dasf t = lua_gettop(L);
60fc37bb7b498f4bba5eaaa73a42a25daa27a9dasf lua_setglobal(L, "r");
69bbd0a9d1892949e1d4e454c10e8ad24b37c759sf lua_settop(L, t);
69bbd0a9d1892949e1d4e454c10e8ad24b37c759sf }
69bbd0a9d1892949e1d4e454c10e8ad24b37c759sf
69bbd0a9d1892949e1d4e454c10e8ad24b37c759sf if (lua_pcall(L, 1, 1, 0)) {
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes report_lua_error(L, r);
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes return HTTP_INTERNAL_SERVER_ERROR;
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes }
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes rc = DECLINED;
0d26b42fc1735e110c6dc83b114c56257b20070bbnicholes if (lua_isnumber(L, -1)) {
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe rc = lua_tointeger(L, -1);
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe }
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe if (rc != DECLINED) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return rc;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe }
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe }
d176cb9e596e4603f76490f9211f62b5581b3091rooneg }
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz return DECLINED;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe}
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
d176cb9e596e4603f76490f9211f62b5581b3091rooneg
4760b58cc9fe170e4ad4648ed4ff7a422a2cef38sfstatic apr_size_t config_getstr(ap_configfile_t *cfg, char *buf,
4760b58cc9fe170e4ad4648ed4ff7a422a2cef38sf size_t bufsiz)
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe{
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe apr_size_t i = 0;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe if (cfg->getstr) {
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe apr_status_t rc = (cfg->getstr) (buf, bufsiz, cfg->param);
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe if (rc == APR_SUCCESS) {
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe i = strlen(buf);
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe if (i && buf[i - 1] == '\n')
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe ++cfg->line_number;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe }
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe else {
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe buf[0] = '\0';
4f9c22c4f27571d54197be9674e1fc0d528192aestriker i = 0;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe }
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe }
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe else {
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe while (i < bufsiz) {
0540a0b469147b52e858587270dba31c2aaa9e09wrowe char ch;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe apr_status_t rc = (cfg->getch) (&ch, cfg->param);
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe if (rc != APR_SUCCESS)
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe break;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe buf[i++] = ch;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe if (ch == '\n') {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ++cfg->line_number;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker break;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd return i;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd}
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowetypedef struct cr_ctx
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp{
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe cmd_parms *cmd;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd ap_configfile_t *cfp;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd size_t startline;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd const char *endstr;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd char buf[HUGE_STRING_LEN];
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd} cr_ctx;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd
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.....
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd *
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe * be happy. this is cool.
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp *
f46cb698a1b32d16a0107566568f67d8c3f8ee9csf */
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";
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd#define N_LF 32
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisdstatic const char *direct_chunkreader(lua_State *lvm, void *udata,
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd size_t *plen)
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd{
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd const char *p;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd struct cr_ctx *ctx = udata;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd if (ctx->startline) {
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd *plen = ctx->startline > N_LF ? N_LF : ctx->startline;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd ctx->startline -= *plen;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd return lf;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe }
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd *plen = config_getstr(ctx->cfp, ctx->buf, HUGE_STRING_LEN);
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe for (p = ctx->buf; isspace(*p); ++p);
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd if (p[0] == '<' && p[1] == '/') {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker apr_size_t i = 0;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd while (i < strlen(ctx->endstr)) {
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd if (tolower(p[i + 2]) != ctx->endstr[i])
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd return ctx->buf;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd ++i;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd }
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd *plen = 0;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd return NULL;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd }
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd /*fprintf(stderr, "buf read: %s\n", ctx->buf); */
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe return ctx->buf;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd}
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisdstatic int ldump_writer(lua_State *L, const void *b, size_t size, void *B)
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe{
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe (void) L;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe luaL_addlstring((luaL_Buffer *) B, (const char *) b, size);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb return 0;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb}
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbtypedef struct hack_section_baton
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb{
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const char *name;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_lua_mapped_handler_spec *spec;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb int apr_hook_when;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb} hack_section_baton;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb/* You can be unhappy now.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb *
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * This is uncool.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb *
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 :-)
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe */
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowestatic const char *hack_section_handler(cmd_parms *cmd, void *_cfg,
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe const char *arg)
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe{
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe ap_lua_dir_cfg *cfg = (ap_lua_dir_cfg *) _cfg;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe ap_directive_t *directive = cmd->directive;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe hack_section_baton *baton = directive->data;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe const char *key = apr_psprintf(cmd->pool, "%s_%d", baton->name, baton->apr_hook_when);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe apr_array_header_t *hook_specs = apr_hash_get(cfg->hooks, key,
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe APR_HASH_KEY_STRING);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe if (!hook_specs) {
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe hook_specs = apr_array_make(cmd->pool, 2,
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe sizeof(ap_lua_mapped_handler_spec *));
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz apr_hash_set(cfg->hooks, key,
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe APR_HASH_KEY_STRING, hook_specs);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar baton->spec->scope = cfg->vm_scope;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz *(ap_lua_mapped_handler_spec **) apr_array_push(hook_specs) = baton->spec;
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz return NULL;
1e911973bcb9df6701a4c16c037771ecf25ade13niq}
1e911973bcb9df6701a4c16c037771ecf25ade13niq
c3e233736c4a453cbb2166a041f779e86230630asfstatic const char *register_named_block_function_hook(const char *name,
c3e233736c4a453cbb2166a041f779e86230630asf cmd_parms *cmd,
c3e233736c4a453cbb2166a041f779e86230630asf void *mconfig,
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe const char *line)
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar{
11fb2f3611e6ff9a541e10b13e3108934f828141gregames const char *function = NULL;
11fb2f3611e6ff9a541e10b13e3108934f828141gregames ap_lua_mapped_handler_spec *spec;
11fb2f3611e6ff9a541e10b13e3108934f828141gregames int when = APR_HOOK_MIDDLE;
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz const char *endp = ap_strrchr_c(line, '>');
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz if (endp == NULL) {
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz return apr_pstrcat(cmd->pool, cmd->cmd->name,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker "> directive missing closing '>'", NULL);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe }
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe line = apr_pstrndup(cmd->temp_pool, line, endp - line);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe if (line[0]) {
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe const char *word;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe word = ap_getword_conf(cmd->temp_pool, &line);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar if (word && *word) {
c3e233736c4a453cbb2166a041f779e86230630asf function = apr_pstrdup(cmd->pool, word);
c3e233736c4a453cbb2166a041f779e86230630asf }
c3e233736c4a453cbb2166a041f779e86230630asf word = ap_getword_conf(cmd->temp_pool, &line);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe if (word && *word) {
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar if (!strcasecmp("early", word)) {
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar when = AP_LUA_HOOK_FIRST;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe }
c3e233736c4a453cbb2166a041f779e86230630asf else if (!strcasecmp("late", word)) {
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe when = AP_LUA_HOOK_LAST;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe else {
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick return apr_pstrcat(cmd->pool, cmd->cmd->name,
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe "> 2nd argument must be 'early' or 'late'", NULL);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe }
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe }
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz spec = apr_pcalloc(cmd->pool, sizeof(ap_lua_mapped_handler_spec));
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz {
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz cr_ctx ctx;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker lua_State *lvm;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe char *tmp;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe int rv;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_directive_t **current;
8aefbd756763807188d2e3ce336a8680e4893066wrowe hack_section_baton *baton;
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe spec->file_name = apr_psprintf(cmd->pool, "%s:%u",
700b96db75e7cfadb5219978c1735b710d583763wrowe cmd->config_file->name,
700b96db75e7cfadb5219978c1735b710d583763wrowe cmd->config_file->line_number);
700b96db75e7cfadb5219978c1735b710d583763wrowe if (function) {
700b96db75e7cfadb5219978c1735b710d583763wrowe spec->function_name = (char *) function;
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe else {
700b96db75e7cfadb5219978c1735b710d583763wrowe function = NULL;
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe ctx.cmd = cmd;
700b96db75e7cfadb5219978c1735b710d583763wrowe tmp = apr_pstrdup(cmd->pool, cmd->err_directive->directive + 1);
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_str_tolower(tmp);
700b96db75e7cfadb5219978c1735b710d583763wrowe ctx.endstr = tmp;
700b96db75e7cfadb5219978c1735b710d583763wrowe ctx.cfp = cmd->config_file;
103a93c625bcde1a6a7a5155b64dcda36f612180pquerna ctx.startline = cmd->config_file->line_number;
113961f0559eb026ea0d379cb7350f82bc09d710druggeri
700b96db75e7cfadb5219978c1735b710d583763wrowe /* This lua State is used only to compile the input strings -> bytecode, so we don't need anything extra. */
700b96db75e7cfadb5219978c1735b710d583763wrowe lvm = luaL_newstate();
6964758306167dd898baedd21048bd1515dd9d30trawick
700b96db75e7cfadb5219978c1735b710d583763wrowe lua_settop(lvm, 0);
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf
700b96db75e7cfadb5219978c1735b710d583763wrowe rv = lua_load(lvm, direct_chunkreader, &ctx, spec->file_name);
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe if (rv != 0) {
700b96db75e7cfadb5219978c1735b710d583763wrowe const char *errstr = apr_pstrcat(cmd->pool, "Lua Error:",
700b96db75e7cfadb5219978c1735b710d583763wrowe lua_tostring(lvm, -1), NULL);
700b96db75e7cfadb5219978c1735b710d583763wrowe lua_close(lvm);
700b96db75e7cfadb5219978c1735b710d583763wrowe return errstr;
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe else {
700b96db75e7cfadb5219978c1735b710d583763wrowe luaL_Buffer b;
700b96db75e7cfadb5219978c1735b710d583763wrowe luaL_buffinit(lvm, &b);
700b96db75e7cfadb5219978c1735b710d583763wrowe lua_dump(lvm, ldump_writer, &b);
700b96db75e7cfadb5219978c1735b710d583763wrowe luaL_pushresult(&b);
700b96db75e7cfadb5219978c1735b710d583763wrowe spec->bytecode_len = lua_strlen(lvm, -1);
700b96db75e7cfadb5219978c1735b710d583763wrowe spec->bytecode = apr_pstrmemdup(cmd->pool, lua_tostring(lvm, -1),
700b96db75e7cfadb5219978c1735b710d583763wrowe spec->bytecode_len);
700b96db75e7cfadb5219978c1735b710d583763wrowe lua_close(lvm);
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe current = mconfig;
103a93c625bcde1a6a7a5155b64dcda36f612180pquerna
103a93c625bcde1a6a7a5155b64dcda36f612180pquerna /* Here, we have to replace our current config node for the next pass */
113961f0559eb026ea0d379cb7350f82bc09d710druggeri if (!*current) {
113961f0559eb026ea0d379cb7350f82bc09d710druggeri *current = apr_pcalloc(cmd->pool, sizeof(**current));
113961f0559eb026ea0d379cb7350f82bc09d710druggeri }
113961f0559eb026ea0d379cb7350f82bc09d710druggeri
113961f0559eb026ea0d379cb7350f82bc09d710druggeri baton = apr_pcalloc(cmd->pool, sizeof(hack_section_baton));
700b96db75e7cfadb5219978c1735b710d583763wrowe baton->name = name;
700b96db75e7cfadb5219978c1735b710d583763wrowe baton->spec = spec;
700b96db75e7cfadb5219978c1735b710d583763wrowe baton->apr_hook_when = when;
8aefbd756763807188d2e3ce336a8680e4893066wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe (*current)->filename = cmd->config_file->name;
8aefbd756763807188d2e3ce336a8680e4893066wrowe (*current)->line_num = cmd->config_file->line_number;
8aefbd756763807188d2e3ce336a8680e4893066wrowe (*current)->directive = apr_pstrdup(cmd->pool, "Lua_____ByteCodeHack");
8aefbd756763807188d2e3ce336a8680e4893066wrowe (*current)->args = NULL;
8aefbd756763807188d2e3ce336a8680e4893066wrowe (*current)->data = baton;
8aefbd756763807188d2e3ce336a8680e4893066wrowe }
8aefbd756763807188d2e3ce336a8680e4893066wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe return NULL;
8aefbd756763807188d2e3ce336a8680e4893066wrowe}
8aefbd756763807188d2e3ce336a8680e4893066wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowestatic const char *register_named_file_function_hook(const char *name,
8aefbd756763807188d2e3ce336a8680e4893066wrowe cmd_parms *cmd,
8aefbd756763807188d2e3ce336a8680e4893066wrowe void *_cfg,
8aefbd756763807188d2e3ce336a8680e4893066wrowe const char *file,
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe const char *function,
8aefbd756763807188d2e3ce336a8680e4893066wrowe int apr_hook_when)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe{
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf ap_lua_mapped_handler_spec *spec;
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf ap_lua_dir_cfg *cfg = (ap_lua_dir_cfg *) _cfg;
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,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe APR_HASH_KEY_STRING);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe if (!hook_specs) {
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd hook_specs = apr_array_make(cmd->pool, 2,
8aefbd756763807188d2e3ce336a8680e4893066wrowe sizeof(ap_lua_mapped_handler_spec *));
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe apr_hash_set(cfg->hooks, key, APR_HASH_KEY_STRING, hook_specs);
a8d11d78181478da6a672f7fbc58b8d523351f49wrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
23c6309e36a63b13b61c35999c978017521993d6wrowe spec = apr_pcalloc(cmd->pool, sizeof(ap_lua_mapped_handler_spec));
23c6309e36a63b13b61c35999c978017521993d6wrowe spec->file_name = apr_pstrdup(cmd->pool, file);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker spec->function_name = apr_pstrdup(cmd->pool, function);
23c6309e36a63b13b61c35999c978017521993d6wrowe spec->scope = cfg->vm_scope;
8aefbd756763807188d2e3ce336a8680e4893066wrowe
23c6309e36a63b13b61c35999c978017521993d6wrowe *(ap_lua_mapped_handler_spec **) apr_array_push(hook_specs) = spec;
185aa71728867671e105178b4c66fbc22b65ae26sf return NULL;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
23c6309e36a63b13b61c35999c978017521993d6wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowestatic int lua_check_user_id_harness_first(request_rec *r)
8aefbd756763807188d2e3ce336a8680e4893066wrowe{
8aefbd756763807188d2e3ce336a8680e4893066wrowe return lua_request_rec_hook_harness(r, "check_user_id", AP_LUA_HOOK_FIRST);
cf6ef072483172309861d06e85b1aeff4573c060wrowe}
cf6ef072483172309861d06e85b1aeff4573c060wrowestatic int lua_check_user_id_harness(request_rec *r)
cf6ef072483172309861d06e85b1aeff4573c060wrowe{
8aefbd756763807188d2e3ce336a8680e4893066wrowe return lua_request_rec_hook_harness(r, "check_user_id", APR_HOOK_MIDDLE);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerstatic int lua_check_user_id_harness_last(request_rec *r)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe{
185aa71728867671e105178b4c66fbc22b65ae26sf return lua_request_rec_hook_harness(r, "check_user_id", AP_LUA_HOOK_LAST);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
a8d11d78181478da6a672f7fbc58b8d523351f49wrowestatic int lua_translate_name_harness_first(request_rec *r)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe{
8aefbd756763807188d2e3ce336a8680e4893066wrowe return lua_request_rec_hook_harness(r, "translate_name", AP_LUA_HOOK_FIRST);
8aefbd756763807188d2e3ce336a8680e4893066wrowe}
cf6ef072483172309861d06e85b1aeff4573c060wrowestatic int lua_translate_name_harness(request_rec *r)
cf6ef072483172309861d06e85b1aeff4573c060wrowe{
cf6ef072483172309861d06e85b1aeff4573c060wrowe return lua_request_rec_hook_harness(r, "translate_name", APR_HOOK_MIDDLE);
8aefbd756763807188d2e3ce336a8680e4893066wrowe}
cf6ef072483172309861d06e85b1aeff4573c060wrowestatic int lua_translate_name_harness_last(request_rec *r)
cf6ef072483172309861d06e85b1aeff4573c060wrowe{
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp return lua_request_rec_hook_harness(r, "translate_name", AP_LUA_HOOK_LAST);
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd}
cf6ef072483172309861d06e85b1aeff4573c060wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerstatic int lua_fixup_harness(request_rec *r)
cf6ef072483172309861d06e85b1aeff4573c060wrowe{
cf6ef072483172309861d06e85b1aeff4573c060wrowe return lua_request_rec_hook_harness(r, "fixups", APR_HOOK_MIDDLE);
cf6ef072483172309861d06e85b1aeff4573c060wrowe}
cf6ef072483172309861d06e85b1aeff4573c060wrowe
cf6ef072483172309861d06e85b1aeff4573c060wrowestatic int lua_map_to_storage_harness(request_rec *r)
cf6ef072483172309861d06e85b1aeff4573c060wrowe{
cf6ef072483172309861d06e85b1aeff4573c060wrowe return lua_request_rec_hook_harness(r, "map_to_storage", APR_HOOK_MIDDLE);
cf6ef072483172309861d06e85b1aeff4573c060wrowe}
cf6ef072483172309861d06e85b1aeff4573c060wrowe
2d4ea77e21ef7f3707d2c27f6117cc0a36e99b83trawickstatic int lua_type_checker_harness(request_rec *r)
ecde48c75338ff5712f2036711f813c6dedca28ewrowe{
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick return lua_request_rec_hook_harness(r, "type_checker", APR_HOOK_MIDDLE);
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick}
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick
d75626f0952c6152a99acd013a4f127d46f0f9edtrawickstatic int lua_access_checker_harness_first(request_rec *r)
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick{
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick return lua_request_rec_hook_harness(r, "access_checker", AP_LUA_HOOK_FIRST);
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick}
d75626f0952c6152a99acd013a4f127d46f0f9edtrawickstatic int lua_access_checker_harness(request_rec *r)
ecde48c75338ff5712f2036711f813c6dedca28ewrowe{
ecde48c75338ff5712f2036711f813c6dedca28ewrowe return lua_request_rec_hook_harness(r, "access_checker", APR_HOOK_MIDDLE);
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick}
ecde48c75338ff5712f2036711f813c6dedca28ewrowestatic int lua_access_checker_harness_last(request_rec *r)
2d4ea77e21ef7f3707d2c27f6117cc0a36e99b83trawick{
ecde48c75338ff5712f2036711f813c6dedca28ewrowe return lua_request_rec_hook_harness(r, "access_checker", AP_LUA_HOOK_LAST);
ecde48c75338ff5712f2036711f813c6dedca28ewrowe}
2d4ea77e21ef7f3707d2c27f6117cc0a36e99b83trawick
d75626f0952c6152a99acd013a4f127d46f0f9edtrawickstatic int lua_auth_checker_harness_first(request_rec *r)
cf6ef072483172309861d06e85b1aeff4573c060wrowe{
cf6ef072483172309861d06e85b1aeff4573c060wrowe return lua_request_rec_hook_harness(r, "auth_checker", AP_LUA_HOOK_FIRST);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar}
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowestatic int lua_auth_checker_harness(request_rec *r)
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar{
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar return lua_request_rec_hook_harness(r, "auth_checker", APR_HOOK_MIDDLE);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe}
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoarstatic int lua_auth_checker_harness_last(request_rec *r)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe{
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return lua_request_rec_hook_harness(r, "auth_checker", AP_LUA_HOOK_LAST);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowestatic void lua_insert_filter_harness(request_rec *r)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe{
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd /* ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, "LuaHookInsertFilter not yet implemented"); */
23c6309e36a63b13b61c35999c978017521993d6wrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerstatic int lua_quick_harness(request_rec *r, int lookup)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker{
c2cf53a40a9814eb91db2cdf820f97d943f21628coar if (lookup) {
170476518c96db46fff6fdce7cb9a3f24abfaea7rpluem return DECLINED;
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return lua_request_rec_hook_harness(r, "quick", APR_HOOK_MIDDLE);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowestatic const char *register_translate_name_hook(cmd_parms *cmd, void *_cfg,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *file,
a9a4544168a37b43bd180b3703ccee995f27a80awrowe const char *function,
170476518c96db46fff6fdce7cb9a3f24abfaea7rpluem const char *when)
a9a4544168a37b43bd180b3703ccee995f27a80awrowe{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const char *err = ap_check_cmd_context(cmd, NOT_IN_DIRECTORY|NOT_IN_FILES|
a9a4544168a37b43bd180b3703ccee995f27a80awrowe NOT_IN_HTACCESS);
a9a4544168a37b43bd180b3703ccee995f27a80awrowe int apr_hook_when = APR_HOOK_MIDDLE;
170476518c96db46fff6fdce7cb9a3f24abfaea7rpluem if (err) {
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem return err;
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem }
170476518c96db46fff6fdce7cb9a3f24abfaea7rpluem
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem if (when) {
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem if (!strcasecmp(when, "early")) {
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem apr_hook_when = AP_LUA_HOOK_FIRST;
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem }
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem else if (!strcasecmp(when, "late")) {
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf apr_hook_when = AP_LUA_HOOK_LAST;
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem }
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem else {
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem return "Third argument must be 'early' or 'late'";
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem }
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem }
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem return register_named_file_function_hook("translate_name", cmd, _cfg,
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem file, function, apr_hook_when);
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem}
eb12400ff685a3b69476736ca4b5389f348b9d63rpluem
eb12400ff685a3b69476736ca4b5389f348b9d63rpluemstatic const char *register_translate_name_block(cmd_parms *cmd, void *_cfg,
eb12400ff685a3b69476736ca4b5389f348b9d63rpluem const char *line)
eb12400ff685a3b69476736ca4b5389f348b9d63rpluem{
eb12400ff685a3b69476736ca4b5389f348b9d63rpluem return register_named_block_function_hook("translate_name", cmd, _cfg,
eb12400ff685a3b69476736ca4b5389f348b9d63rpluem line);
eb12400ff685a3b69476736ca4b5389f348b9d63rpluem}
eb12400ff685a3b69476736ca4b5389f348b9d63rpluem
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem
ad099b4d62597be19f8dba650663e796cbaa8d28rpluemstatic const char *register_fixups_hook(cmd_parms *cmd, void *_cfg,
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem const char *file,
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem const char *function)
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem{
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem return register_named_file_function_hook("fixups", cmd, _cfg, file,
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem function, APR_HOOK_MIDDLE);
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem}
185aa71728867671e105178b4c66fbc22b65ae26sfstatic const char *register_fixups_block(cmd_parms *cmd, void *_cfg,
75c02648f9afe9a1da5d5482703fcbca306ffcdcpquerna const char *line)
75c02648f9afe9a1da5d5482703fcbca306ffcdcpquerna{
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem return register_named_block_function_hook("fixups", cmd, _cfg, line);
ad099b4d62597be19f8dba650663e796cbaa8d28rpluem}
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluemstatic const char *register_map_to_storage_hook(cmd_parms *cmd, void *_cfg,
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem const char *file,
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem const char *function)
185aa71728867671e105178b4c66fbc22b65ae26sf{
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem return register_named_file_function_hook("map_to_storage", cmd, _cfg,
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem file, function, APR_HOOK_MIDDLE);
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem}
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluemstatic const char *register_map_to_storage_block(cmd_parms *cmd, void *_cfg,
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem const char *line)
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem{
534611d341a1a48b93c7a1fd5e333dbd261527d3rpluem return register_named_block_function_hook("map_to_storage", cmd, _cfg,
a9a4544168a37b43bd180b3703ccee995f27a80awrowe line);
a9a4544168a37b43bd180b3703ccee995f27a80awrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
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)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe{
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe int apr_hook_when = APR_HOOK_MIDDLE;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (when) {
8aefbd756763807188d2e3ce336a8680e4893066wrowe if (!strcasecmp(when, "early")) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe apr_hook_when = AP_LUA_HOOK_FIRST;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd else if (!strcasecmp(when, "late")) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe apr_hook_when = AP_LUA_HOOK_LAST;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe else {
cf6ef072483172309861d06e85b1aeff4573c060wrowe return "Third argument must be 'early' or 'late'";
cf6ef072483172309861d06e85b1aeff4573c060wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return register_named_file_function_hook("check_user_id", cmd, _cfg, file,
8aefbd756763807188d2e3ce336a8680e4893066wrowe function, apr_hook_when);
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz}
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantzstatic const char *register_check_user_id_block(cmd_parms *cmd, void *_cfg,
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz const char *line)
cf6ef072483172309861d06e85b1aeff4573c060wrowe{
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return register_named_block_function_hook("check_user_id", cmd, _cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe line);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
3dcf67a5060400edb8ccef3fb4a2024388965af9martinstatic const char *register_type_checker_hook(cmd_parms *cmd, void *_cfg,
3dcf67a5060400edb8ccef3fb4a2024388965af9martin const char *file,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *function)
2fd8d1e14fc47762d1e01660b544d5e2a75c825dtrawick{
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return register_named_file_function_hook("type_checker", cmd, _cfg, file,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe function, APR_HOOK_MIDDLE);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe}
8aefbd756763807188d2e3ce336a8680e4893066wrowestatic const char *register_type_checker_block(cmd_parms *cmd, void *_cfg,
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf const char *line)
700b96db75e7cfadb5219978c1735b710d583763wrowe{
700b96db75e7cfadb5219978c1735b710d583763wrowe return register_named_block_function_hook("type_checker", cmd, _cfg,
700b96db75e7cfadb5219978c1735b710d583763wrowe line);
700b96db75e7cfadb5219978c1735b710d583763wrowe}
e0c4ebfec83bb3b424184984e5788f31297fe429sctemme
113961f0559eb026ea0d379cb7350f82bc09d710druggeristatic const char *register_access_checker_hook(cmd_parms *cmd, void *_cfg,
8aefbd756763807188d2e3ce336a8680e4893066wrowe const char *file,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *function,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const char *when)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe{
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe int apr_hook_when = APR_HOOK_MIDDLE;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe if (when) {
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe if (!strcasecmp(when, "early")) {
59513b1275fdc2021d4949ee03ae8229469abb86wrowe apr_hook_when = AP_LUA_HOOK_FIRST;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe else if (!strcasecmp(when, "late")) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker apr_hook_when = AP_LUA_HOOK_LAST;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe else {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return "Third argument must be 'early' or 'late'";
185aa71728867671e105178b4c66fbc22b65ae26sf }
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return register_named_file_function_hook("access_checker", cmd, _cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe file, function, apr_hook_when);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerstatic const char *register_access_checker_block(cmd_parms *cmd, void *_cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *line)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe{
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return register_named_block_function_hook("access_checker", cmd, _cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe line);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe}
cf6ef072483172309861d06e85b1aeff4573c060wrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowestatic const char *register_auth_checker_hook(cmd_parms *cmd, void *_cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *file,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const char *function,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *when)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker int apr_hook_when = APR_HOOK_MIDDLE;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe if (when) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (!strcasecmp(when, "early")) {
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe apr_hook_when = AP_LUA_HOOK_FIRST;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe else if (!strcasecmp(when, "late")) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker apr_hook_when = AP_LUA_HOOK_LAST;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe else {
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return "Third argument must be 'early' or 'late'";
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return register_named_file_function_hook("auth_checker", cmd, _cfg, file,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker function, apr_hook_when);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe}
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowestatic const char *register_auth_checker_block(cmd_parms *cmd, void *_cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *line)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return register_named_block_function_hook("auth_checker", cmd, _cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe line);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe}
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowestatic const char *register_insert_filter_hook(cmd_parms *cmd, void *_cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *file,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *function)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe{
cf6ef072483172309861d06e85b1aeff4573c060wrowe return "LuaHookInsertFilter not yet implemented";
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowestatic const char *register_quick_hook(cmd_parms *cmd, void *_cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *file, const char *function)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe{
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *err = ap_check_cmd_context(cmd, NOT_IN_DIRECTORY|NOT_IN_FILES|
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe NOT_IN_HTACCESS);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe if (err) {
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return err;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe }
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return register_named_file_function_hook("quick", cmd, _cfg, file,
38bcc87d9a06e8ba81165421403f275eca4e313btrawick function, APR_HOOK_MIDDLE);
38bcc87d9a06e8ba81165421403f275eca4e313btrawick}
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowestatic const char *register_quick_block(cmd_parms *cmd, void *_cfg,
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz const char *line)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe{
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return register_named_block_function_hook("quick", cmd, _cfg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe line);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe}
185aa71728867671e105178b4c66fbc22b65ae26sf
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowestatic const char *register_package_helper(cmd_parms *cmd,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *arg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe apr_array_header_t *dir_array)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe{
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe apr_status_t rv;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz ap_lua_server_cfg *server_cfg =
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_get_module_config(cmd->server->module_config, &lua_module);
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe char *fixed_filename;
cf6ef072483172309861d06e85b1aeff4573c060wrowe rv = apr_filepath_merge(&fixed_filename,
cf6ef072483172309861d06e85b1aeff4573c060wrowe server_cfg->root_path,
8aefbd756763807188d2e3ce336a8680e4893066wrowe arg,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe APR_FILEPATH_NOTRELATIVE,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cmd->pool);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (rv != APR_SUCCESS) {
700b96db75e7cfadb5219978c1735b710d583763wrowe return apr_psprintf(cmd->pool,
700b96db75e7cfadb5219978c1735b710d583763wrowe "Unable to build full path to file, %s", arg);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe *(const char **) apr_array_push(dir_array) = fixed_filename;
cf6ef072483172309861d06e85b1aeff4573c060wrowe return NULL;
cf6ef072483172309861d06e85b1aeff4573c060wrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz/**
cf6ef072483172309861d06e85b1aeff4573c060wrowe * Called for config directive which looks like
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * LuaPackagePath /lua/package/path/mapped/thing/like/this/?.lua
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowestatic const char *register_package_dir(cmd_parms *cmd, void *_cfg,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *arg)
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ap_lua_dir_cfg *cfg = (ap_lua_dir_cfg *) _cfg;
548b2980e83f609186a76e98fb245d02e8547bc3jerenkrantz
548b2980e83f609186a76e98fb245d02e8547bc3jerenkrantz return register_package_helper(cmd, arg, cfg->package_paths);
4fca95918a9c0ae93593806544b425d0adc2fcc3wrowe}
548b2980e83f609186a76e98fb245d02e8547bc3jerenkrantz
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz/**
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz * Called for config directive which looks like
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz * LuaPackageCPath /lua/package/path/mapped/thing/like/this/?.so
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar */
8aefbd756763807188d2e3ce336a8680e4893066wrowestatic const char *register_package_cdir(cmd_parms *cmd,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe void *_cfg,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *arg)
4fca95918a9c0ae93593806544b425d0adc2fcc3wrowe{
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_lua_dir_cfg *cfg = (ap_lua_dir_cfg *) _cfg;
8aefbd756763807188d2e3ce336a8680e4893066wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return register_package_helper(cmd, arg, cfg->package_cpaths);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe}
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf
8aefbd756763807188d2e3ce336a8680e4893066wrowestatic const char *register_lua_inherit(cmd_parms *cmd,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker void *_cfg,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *arg)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe{
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar ap_lua_dir_cfg *cfg = (ap_lua_dir_cfg *) _cfg;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar if (strcasecmp("none", arg) == 0) {
8aefbd756763807188d2e3ce336a8680e4893066wrowe cfg->inherit = AP_LUA_INHERIT_NONE;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker else if (strcasecmp("parent-first", arg) == 0) {
4a13940dc2990df0a798718d3a3f9cf1566c2217bjh cfg->inherit = AP_LUA_INHERIT_PARENT_FIRST;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe else if (strcasecmp("parent-last", arg) == 0) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cfg->inherit = AP_LUA_INHERIT_PARENT_LAST;
f08810eff40a2bddd2bc0103453c4ae775ea62bewrowe }
f08810eff40a2bddd2bc0103453c4ae775ea62bewrowe else {
f08810eff40a2bddd2bc0103453c4ae775ea62bewrowe return apr_psprintf(cmd->pool,
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick "LuaInherit type of '%s' not recognized, valid "
f08810eff40a2bddd2bc0103453c4ae775ea62bewrowe "options are 'none', 'parent-first', and 'parent-last'",
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe arg);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
8aefbd756763807188d2e3ce336a8680e4893066wrowe return NULL;
700b96db75e7cfadb5219978c1735b710d583763wrowe}
700b96db75e7cfadb5219978c1735b710d583763wrowestatic const char *register_lua_scope(cmd_parms *cmd,
700b96db75e7cfadb5219978c1735b710d583763wrowe void *_cfg,
700b96db75e7cfadb5219978c1735b710d583763wrowe const char *scope,
700b96db75e7cfadb5219978c1735b710d583763wrowe const char *min,
700b96db75e7cfadb5219978c1735b710d583763wrowe const char *max)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe{
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_lua_dir_cfg *cfg = (ap_lua_dir_cfg *) _cfg;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (strcmp("once", scope) == 0) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cfg->vm_scope = AP_LUA_SCOPE_ONCE;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe else if (strcmp("request", scope) == 0) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cfg->vm_scope = AP_LUA_SCOPE_REQUEST;
700b96db75e7cfadb5219978c1735b710d583763wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe else if (strcmp("conn", scope) == 0) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker cfg->vm_scope = AP_LUA_SCOPE_CONN;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe else if (strcmp("thread", scope) == 0) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe#if !APR_HAS_THREADS
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return apr_psprintf(cmd->pool,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Scope type of '%s' cannot be used because this "
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd "server does not have threading support "
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "(APR_HAS_THREADS)"
8aefbd756763807188d2e3ce336a8680e4893066wrowe scope);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar#endif
4f9c22c4f27571d54197be9674e1fc0d528192aestriker cfg->vm_scope = AP_LUA_SCOPE_THREAD;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe else {
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar return apr_psprintf(cmd->pool,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar "Invalid value for LuaScope, '%s', acceptable "
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "values are: 'once', 'request', 'conn', 'server'"
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar#if APR_HAS_THREADS
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ", 'thread'"
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe#endif
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ,scope);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe return NULL;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe}
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowestatic const char *register_lua_root(cmd_parms *cmd, void *_cfg,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *root)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe{
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,
700b96db75e7cfadb5219978c1735b710d583763wrowe &lua_module);
113961f0559eb026ea0d379cb7350f82bc09d710druggeri
700b96db75e7cfadb5219978c1735b710d583763wrowe cfg->root_path = root;
700b96db75e7cfadb5219978c1735b710d583763wrowe return NULL;
700b96db75e7cfadb5219978c1735b710d583763wrowe}
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)
700b96db75e7cfadb5219978c1735b710d583763wrowe{
113961f0559eb026ea0d379cb7350f82bc09d710druggeri if (lua_ssl_val) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return (const char *)lua_ssl_val(p, s, c, r, (char *)var);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar return NULL;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe}
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
e4a3f3c2f080cac75a15a6454cca429b8161c050wroweAP_LUA_DECLARE(int) ap_lua_ssl_is_https(conn_rec *c)
700b96db75e7cfadb5219978c1735b710d583763wrowe{
700b96db75e7cfadb5219978c1735b710d583763wrowe return lua_ssl_is_https ? lua_ssl_is_https(c) : 0;
700b96db75e7cfadb5219978c1735b710d583763wrowe}
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe/*******************************/
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowestatic const char *lua_authz_parse(cmd_parms *cmd, const char *require_line,
700b96db75e7cfadb5219978c1735b710d583763wrowe const void **parsed_require_line)
700b96db75e7cfadb5219978c1735b710d583763wrowe{
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *provider_name;
700b96db75e7cfadb5219978c1735b710d583763wrowe lua_authz_provider_spec *spec;
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe apr_pool_userdata_get((void**)&provider_name, AUTHZ_PROVIDER_NAME_NOTE,
700b96db75e7cfadb5219978c1735b710d583763wrowe cmd->temp_pool);
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_assert(provider_name != NULL);
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe spec = apr_hash_get(lua_authz_providers, provider_name, APR_HASH_KEY_STRING);
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_assert(spec != NULL);
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe if (require_line && *require_line) {
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) {
700b96db75e7cfadb5219978c1735b710d583763wrowe APR_ARRAY_PUSH(spec->args, const char *) = arg;
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe *parsed_require_line = spec;
700b96db75e7cfadb5219978c1735b710d583763wrowe return NULL;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd}
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowestatic authz_status lua_authz_check(request_rec *r, const char *require_line,
700b96db75e7cfadb5219978c1735b710d583763wrowe const void *parsed_require_line)
700b96db75e7cfadb5219978c1735b710d583763wrowe{
700b96db75e7cfadb5219978c1735b710d583763wrowe apr_pool_t *pool;
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_lua_vm_spec *spec;
700b96db75e7cfadb5219978c1735b710d583763wrowe lua_State *L;
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_lua_server_cfg *server_cfg = ap_get_module_config(r->server->module_config,
700b96db75e7cfadb5219978c1735b710d583763wrowe &lua_module);
700b96db75e7cfadb5219978c1735b710d583763wrowe const ap_lua_dir_cfg *cfg = ap_get_module_config(r->per_dir_config,
700b96db75e7cfadb5219978c1735b710d583763wrowe &lua_module);
700b96db75e7cfadb5219978c1735b710d583763wrowe const lua_authz_provider_spec *prov_spec = parsed_require_line;
700b96db75e7cfadb5219978c1735b710d583763wrowe int result;
700b96db75e7cfadb5219978c1735b710d583763wrowe int nargs = 0;
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe spec = create_vm_spec(&pool, r, cfg, server_cfg, prov_spec->file_name,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe NULL, 0, prov_spec->function_name, "authz provider");
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe L = ap_lua_get_lua_state(pool, spec);
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);
8aefbd756763807188d2e3ce336a8680e4893066wrowe return AUTHZ_GENERAL_ERROR;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
8aefbd756763807188d2e3ce336a8680e4893066wrowe lua_getglobal(L, prov_spec->function_name);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar if (!lua_isfunction(L, -1)) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r, APLOGNO(02319)
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar "Unable to find function %s in %s",
8aefbd756763807188d2e3ce336a8680e4893066wrowe prov_spec->function_name, prov_spec->file_name);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return AUTHZ_GENERAL_ERROR;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_lua_run_lua_request(L, r);
8aefbd756763807188d2e3ce336a8680e4893066wrowe if (prov_spec->args) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker int i;
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);
b02dfdb611f84136664b3c05e4d4d704aeabbf63wrowe return AUTHZ_GENERAL_ERROR;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz for (i = 0; i < prov_spec->args->nelts; i++) {
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz const char *arg = APR_ARRAY_IDX(prov_spec->args, i, const char *);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe lua_pushstring(L, arg);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe nargs = prov_spec->args->nelts;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
b02dfdb611f84136664b3c05e4d4d704aeabbf63wrowe if (lua_pcall(L, 1 + nargs, 1, 0)) {
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz const char *err = lua_tostring(L, -1);
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02316)
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz "Error executing authz provider %s: %s", prov_spec->name, err);
8aefbd756763807188d2e3ce336a8680e4893066wrowe return AUTHZ_GENERAL_ERROR;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (!lua_isnumber(L, -1)) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02317)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Error: authz provider %s did not return integer", prov_spec->name);
ecde48c75338ff5712f2036711f813c6dedca28ewrowe return AUTHZ_GENERAL_ERROR;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe result = lua_tointeger(L, -1);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar switch (result) {
8aefbd756763807188d2e3ce336a8680e4893066wrowe case AUTHZ_DENIED:
cf6ef072483172309861d06e85b1aeff4573c060wrowe case AUTHZ_GRANTED:
cf6ef072483172309861d06e85b1aeff4573c060wrowe case AUTHZ_NEUTRAL:
cf6ef072483172309861d06e85b1aeff4573c060wrowe case AUTHZ_GENERAL_ERROR:
cf6ef072483172309861d06e85b1aeff4573c060wrowe case AUTHZ_DENIED_NO_USER:
cf6ef072483172309861d06e85b1aeff4573c060wrowe return result;
cf6ef072483172309861d06e85b1aeff4573c060wrowe default:
cf6ef072483172309861d06e85b1aeff4573c060wrowe ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02318)
2d4ea77e21ef7f3707d2c27f6117cc0a36e99b83trawick "Error: authz provider %s: invalid return value %d",
cf6ef072483172309861d06e85b1aeff4573c060wrowe prov_spec->name, result);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe }
cf6ef072483172309861d06e85b1aeff4573c060wrowe return AUTHZ_GENERAL_ERROR;
700b96db75e7cfadb5219978c1735b710d583763wrowe}
69adb3d949e3dd17c0492a01fc2cf298832c7eefwrowe
69adb3d949e3dd17c0492a01fc2cf298832c7eefwrowestatic const authz_provider lua_authz_provider =
cf6ef072483172309861d06e85b1aeff4573c060wrowe{
cf6ef072483172309861d06e85b1aeff4573c060wrowe &lua_authz_check,
cf6ef072483172309861d06e85b1aeff4573c060wrowe &lua_authz_parse,
cf6ef072483172309861d06e85b1aeff4573c060wrowe};
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e8f95a682820a599fe41b22977010636be5c2717jimstatic const char *register_authz_provider(cmd_parms *cmd, void *_cfg,
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick const char *name, const char *file,
e8f95a682820a599fe41b22977010636be5c2717jim const char *function)
e8f95a682820a599fe41b22977010636be5c2717jim{
e8f95a682820a599fe41b22977010636be5c2717jim lua_authz_provider_spec *spec;
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (err)
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick return err;
e8f95a682820a599fe41b22977010636be5c2717jim
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick spec = apr_pcalloc(cmd->pool, sizeof(*spec));
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe spec->name = name;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe spec->file_name = file;
c2cf53a40a9814eb91db2cdf820f97d943f21628coar spec->function_name = function;
c2cf53a40a9814eb91db2cdf820f97d943f21628coar
8aefbd756763807188d2e3ce336a8680e4893066wrowe apr_hash_set(lua_authz_providers, name, APR_HASH_KEY_STRING, spec);
cf6ef072483172309861d06e85b1aeff4573c060wrowe ap_register_auth_provider(cmd->pool, AUTHZ_PROVIDER_GROUP, name,
8aefbd756763807188d2e3ce336a8680e4893066wrowe AUTHZ_PROVIDER_VERSION,
8aefbd756763807188d2e3ce336a8680e4893066wrowe &lua_authz_provider,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe AP_AUTH_INTERNAL_PER_CONF);
185aa71728867671e105178b4c66fbc22b65ae26sf return NULL;
44761f3e3072cf78a4997a88bb9a515ca101a1f4covener}
44761f3e3072cf78a4997a88bb9a515ca101a1f4covener
44761f3e3072cf78a4997a88bb9a515ca101a1f4covener
8aefbd756763807188d2e3ce336a8680e4893066wrowecommand_rec lua_commands[] = {
8aefbd756763807188d2e3ce336a8680e4893066wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker AP_INIT_TAKE1("LuaRoot", register_lua_root, NULL, OR_ALL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Specify the base path for resolving relative paths for mod_lua directives"),
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe AP_INIT_TAKE1("LuaPackagePath", register_package_dir, NULL, OR_ALL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Add a directory to lua's package.path"),
185aa71728867671e105178b4c66fbc22b65ae26sf
44761f3e3072cf78a4997a88bb9a515ca101a1f4covener AP_INIT_TAKE1("LuaPackageCPath", register_package_cdir, NULL, OR_ALL,
44761f3e3072cf78a4997a88bb9a515ca101a1f4covener "Add a directory to lua's package.cpath"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe AP_INIT_TAKE3("LuaAuthzProvider", register_authz_provider, NULL, RSRC_CONF|EXEC_ON_READ,
69adb3d949e3dd17c0492a01fc2cf298832c7eefwrowe "Provide an authorization provider"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe AP_INIT_TAKE23("LuaHookTranslateName", register_translate_name_hook, NULL,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker OR_ALL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Provide a hook for the translate name phase of request processing"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
cadddb2c31d24d48f4017db4df0a29687432326cwrowe AP_INIT_RAW_ARGS("<LuaHookTranslateName", register_translate_name_block,
cadddb2c31d24d48f4017db4df0a29687432326cwrowe NULL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe EXEC_ON_READ | OR_ALL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Provide a hook for the translate name phase of request processing"),
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz
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,
cf6ef072483172309861d06e85b1aeff4573c060wrowe EXEC_ON_READ | OR_ALL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Provide a inline hook for the fixups phase of request processing"),
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
700b96db75e7cfadb5219978c1735b710d583763wrowe /* todo: test */
185aa71728867671e105178b4c66fbc22b65ae26sf AP_INIT_TAKE2("LuaHookMapToStorage", register_map_to_storage_hook, NULL,
71fe373d064756fb261876443806ece033ee3309slive OR_ALL,
71fe373d064756fb261876443806ece033ee3309slive "Provide a hook for the map_to_storage phase of request processing"),
c2cf53a40a9814eb91db2cdf820f97d943f21628coar AP_INIT_RAW_ARGS("<LuaHookMapToStorage", register_map_to_storage_block,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe NULL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe EXEC_ON_READ | OR_ALL,
ecde48c75338ff5712f2036711f813c6dedca28ewrowe "Provide a hook for the map_to_storage phase of request processing"),
8aefbd756763807188d2e3ce336a8680e4893066wrowe
ecde48c75338ff5712f2036711f813c6dedca28ewrowe /* todo: test */
ecde48c75338ff5712f2036711f813c6dedca28ewrowe AP_INIT_TAKE23("LuaHookCheckUserID", register_check_user_id_hook, NULL,
e8f95a682820a599fe41b22977010636be5c2717jim OR_ALL,
ecde48c75338ff5712f2036711f813c6dedca28ewrowe "Provide a hook for the check_user_id phase of request processing"),
ecde48c75338ff5712f2036711f813c6dedca28ewrowe AP_INIT_RAW_ARGS("<LuaHookCheckUserID", register_check_user_id_block,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe NULL,
ecde48c75338ff5712f2036711f813c6dedca28ewrowe EXEC_ON_READ | OR_ALL,
ecde48c75338ff5712f2036711f813c6dedca28ewrowe "Provide a hook for the check_user_id phase of request processing"),
ecde48c75338ff5712f2036711f813c6dedca28ewrowe
185aa71728867671e105178b4c66fbc22b65ae26sf /* todo: test */
ecde48c75338ff5712f2036711f813c6dedca28ewrowe AP_INIT_TAKE2("LuaHookTypeChecker", register_type_checker_hook, NULL,
ecde48c75338ff5712f2036711f813c6dedca28ewrowe OR_ALL,
ecde48c75338ff5712f2036711f813c6dedca28ewrowe "Provide a hook for the type_checker phase of request processing"),
ecde48c75338ff5712f2036711f813c6dedca28ewrowe AP_INIT_RAW_ARGS("<LuaHookTypeChecker", register_type_checker_block, NULL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe EXEC_ON_READ | OR_ALL,
8aefbd756763807188d2e3ce336a8680e4893066wrowe "Provide a hook for the type_checker phase of request processing"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
cf6ef072483172309861d06e85b1aeff4573c060wrowe /* todo: test */
cf6ef072483172309861d06e85b1aeff4573c060wrowe AP_INIT_TAKE23("LuaHookAccessChecker", register_access_checker_hook, NULL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe OR_ALL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Provide a hook for the access_checker phase of request processing"),
cf6ef072483172309861d06e85b1aeff4573c060wrowe AP_INIT_RAW_ARGS("<LuaHookAccessChecker", register_access_checker_block,
2d4ea77e21ef7f3707d2c27f6117cc0a36e99b83trawick NULL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe EXEC_ON_READ | OR_ALL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Provide a hook for the access_checker phase of request processing"),
cf6ef072483172309861d06e85b1aeff4573c060wrowe
cf6ef072483172309861d06e85b1aeff4573c060wrowe /* todo: test */
cf6ef072483172309861d06e85b1aeff4573c060wrowe AP_INIT_TAKE23("LuaHookAuthChecker", register_auth_checker_hook, NULL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe OR_ALL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Provide a hook for the auth_checker phase of request processing"),
4f9c22c4f27571d54197be9674e1fc0d528192aestriker AP_INIT_RAW_ARGS("<LuaHookAuthChecker", register_auth_checker_block, NULL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe EXEC_ON_READ | OR_ALL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Provide a hook for the auth_checker phase of request processing"),
cf6ef072483172309861d06e85b1aeff4573c060wrowe
cf6ef072483172309861d06e85b1aeff4573c060wrowe /* todo: test */
cf6ef072483172309861d06e85b1aeff4573c060wrowe AP_INIT_TAKE2("LuaHookInsertFilter", register_insert_filter_hook, NULL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe OR_ALL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Provide a hook for the insert_filter phase of request processing"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe AP_INIT_TAKE123("LuaScope", register_lua_scope, NULL, OR_ALL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "One of once, request, conn, server -- default is once"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
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) "),
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf
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,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar EXEC_ON_READ | OR_ALL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Provide a hook for the quick handler of request processing"),
fa1c7ce09927decc1eecd1e9a35cc5331078a052covener AP_INIT_RAW_ARGS("Lua_____ByteCodeHack", hack_section_handler, NULL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe OR_ALL,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar "(internal) Byte code handler"),
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe {NULL}
700b96db75e7cfadb5219978c1735b710d583763wrowe};
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowestatic void *create_dir_config(apr_pool_t *p, char *dir)
700b96db75e7cfadb5219978c1735b710d583763wrowe{
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 cfg->mapped_handlers =
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe apr_array_make(p, 1, sizeof(ap_lua_mapped_handler_spec *));
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cfg->pool = p;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cfg->hooks = apr_hash_make(p);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cfg->dir = apr_pstrdup(p, dir);
700b96db75e7cfadb5219978c1735b710d583763wrowe cfg->vm_scope = AP_LUA_SCOPE_UNSET;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return cfg;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe}
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowestatic int create_request_config(request_rec *r)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe{
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_lua_request_cfg *cfg = apr_palloc(r->pool, sizeof(ap_lua_request_cfg));
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd cfg->mapped_request_details = NULL;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cfg->request_scoped_vms = apr_hash_make(r->pool);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_set_module_config(r->request_config, &lua_module, cfg);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar return OK;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowestatic void *create_server_config(apr_pool_t *p, server_rec *s)
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar{
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_lua_server_cfg *cfg = apr_pcalloc(p, sizeof(ap_lua_server_cfg));
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar cfg->vm_reslists = apr_hash_make(p);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe apr_thread_rwlock_create(&cfg->vm_reslists_lock, p);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cfg->root_path = NULL;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return cfg;
8aefbd756763807188d2e3ce336a8680e4893066wrowe}
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisdstatic int lua_request_hook(lua_State *L, request_rec *r)
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd{
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd ap_lua_push_request(L, r);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return OK;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar}
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisdstatic int lua_post_config(apr_pool_t *pconf, apr_pool_t *plog,
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd apr_pool_t *ptemp, server_rec *s)
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd{
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd lua_ssl_val = APR_RETRIEVE_OPTIONAL_FN(ssl_var_lookup);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar lua_ssl_is_https = APR_RETRIEVE_OPTIONAL_FN(ssl_is_https);
8aefbd756763807188d2e3ce336a8680e4893066wrowe return OK;
8aefbd756763807188d2e3ce336a8680e4893066wrowe}
c2cf53a40a9814eb91db2cdf820f97d943f21628coarstatic void *overlay_hook_specs(apr_pool_t *p,
c2cf53a40a9814eb91db2cdf820f97d943f21628coar const void *key,
c2cf53a40a9814eb91db2cdf820f97d943f21628coar apr_ssize_t klen,
c2cf53a40a9814eb91db2cdf820f97d943f21628coar const void *overlay_val,
0ec08ecdcb42129d147888bda504787b164da39cerikabele const void *base_val,
8aefbd756763807188d2e3ce336a8680e4893066wrowe const void *data)
8aefbd756763807188d2e3ce336a8680e4893066wrowe{
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;
8aefbd756763807188d2e3ce336a8680e4893066wrowe return apr_array_append(p, base_info, overlay_info);
8aefbd756763807188d2e3ce336a8680e4893066wrowe}
5bb29f57ae0184d2b3c1cdf35132f8ceb011f882wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowestatic void *merge_dir_config(apr_pool_t *p, void *basev, void *overridesv)
8aefbd756763807188d2e3ce336a8680e4893066wrowe{
8aefbd756763807188d2e3ce336a8680e4893066wrowe ap_lua_dir_cfg *a, *base, *overrides;
c2cf53a40a9814eb91db2cdf820f97d943f21628coar
c2cf53a40a9814eb91db2cdf820f97d943f21628coar a = (ap_lua_dir_cfg *)apr_pcalloc(p, sizeof(ap_lua_dir_cfg));
2d399cd7535887fceaa9f8f116eb98ce68ddd602trawick base = (ap_lua_dir_cfg*)basev;
c2cf53a40a9814eb91db2cdf820f97d943f21628coar overrides = (ap_lua_dir_cfg*)overridesv;
8aefbd756763807188d2e3ce336a8680e4893066wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe a->pool = overrides->pool;
8aefbd756763807188d2e3ce336a8680e4893066wrowe a->dir = apr_pstrdup(p, overrides->dir);
8aefbd756763807188d2e3ce336a8680e4893066wrowe
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
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);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar else if (a->inherit == AP_LUA_INHERIT_PARENT_LAST) {
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);
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd }
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd else {
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd a->package_paths = overrides->package_paths;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd a->package_cpaths = overrides->package_cpaths;
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd a->mapped_handlers= overrides->mapped_handlers;
0540a0b469147b52e858587270dba31c2aaa9e09wrowe a->hooks= overrides->hooks;
a9a4544168a37b43bd180b3703ccee995f27a80awrowe }
0540a0b469147b52e858587270dba31c2aaa9e09wrowe
0540a0b469147b52e858587270dba31c2aaa9e09wrowe return a;
0540a0b469147b52e858587270dba31c2aaa9e09wrowe}
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoarstatic void lua_register_hooks(apr_pool_t *p)
0540a0b469147b52e858587270dba31c2aaa9e09wrowe{
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,
0540a0b469147b52e858587270dba31c2aaa9e09wrowe APR_HOOK_MIDDLE);
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe
0540a0b469147b52e858587270dba31c2aaa9e09wrowe /* http_request.h hooks */
8aefbd756763807188d2e3ce336a8680e4893066wrowe ap_hook_translate_name(lua_translate_name_harness_first, NULL, NULL,
8aefbd756763807188d2e3ce336a8680e4893066wrowe AP_LUA_HOOK_FIRST);
0540a0b469147b52e858587270dba31c2aaa9e09wrowe ap_hook_translate_name(lua_translate_name_harness, NULL, NULL,
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe APR_HOOK_MIDDLE);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_hook_translate_name(lua_translate_name_harness_last, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe AP_LUA_HOOK_LAST);
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf
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,
0540a0b469147b52e858587270dba31c2aaa9e09wrowe APR_HOOK_MIDDLE);
948096a99010fccf648814fecf38f75c689172d7wrowe
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_check_user_id(lua_check_user_id_harness_first, NULL, NULL,
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd AP_LUA_HOOK_FIRST);
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_check_user_id(lua_check_user_id_harness, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe APR_HOOK_MIDDLE);
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe ap_hook_check_user_id(lua_check_user_id_harness_last, NULL, NULL,
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe AP_LUA_HOOK_LAST);
053497224246c4dbef9af594cacf5c00ed271e6cwrowe
0540a0b469147b52e858587270dba31c2aaa9e09wrowe ap_hook_type_checker(lua_type_checker_harness, NULL, NULL,
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz APR_HOOK_MIDDLE);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_hook_access_checker(lua_access_checker_harness_first, NULL, NULL,
42da244268b11ec661b528510f80a18b73c51727brianp AP_LUA_HOOK_FIRST);
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd ap_hook_access_checker(lua_access_checker_harness, NULL, NULL,
42da244268b11ec661b528510f80a18b73c51727brianp APR_HOOK_MIDDLE);
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_access_checker(lua_access_checker_harness_last, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe AP_LUA_HOOK_LAST);
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_auth_checker(lua_auth_checker_harness_first, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe AP_LUA_HOOK_FIRST);
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_auth_checker(lua_auth_checker_harness, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe APR_HOOK_MIDDLE);
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz ap_hook_auth_checker(lua_auth_checker_harness_last, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe AP_LUA_HOOK_LAST);
948096a99010fccf648814fecf38f75c689172d7wrowe
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_insert_filter(lua_insert_filter_harness, NULL, NULL,
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz APR_HOOK_MIDDLE);
948096a99010fccf648814fecf38f75c689172d7wrowe ap_hook_quick_handler(lua_quick_harness, NULL, NULL, APR_HOOK_FIRST);
948096a99010fccf648814fecf38f75c689172d7wrowe
053497224246c4dbef9af594cacf5c00ed271e6cwrowe ap_hook_post_config(lua_post_config, NULL, NULL, APR_HOOK_MIDDLE);
948096a99010fccf648814fecf38f75c689172d7wrowe
948096a99010fccf648814fecf38f75c689172d7wrowe APR_OPTIONAL_HOOK(ap_lua, lua_open, lua_open_hook, NULL, NULL,
948096a99010fccf648814fecf38f75c689172d7wrowe APR_HOOK_REALLY_FIRST);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
a72211e92bab814bfa28ee086ca9b2a1a6095c92chrisd APR_OPTIONAL_HOOK(ap_lua, lua_request, lua_request_hook, NULL, NULL,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker APR_HOOK_REALLY_FIRST);
c2cf53a40a9814eb91db2cdf820f97d943f21628coar
948096a99010fccf648814fecf38f75c689172d7wrowe /* providers */
4f9c22c4f27571d54197be9674e1fc0d528192aestriker lua_authz_providers = apr_hash_make(p);
948096a99010fccf648814fecf38f75c689172d7wrowe}
948096a99010fccf648814fecf38f75c689172d7wrowe
053497224246c4dbef9af594cacf5c00ed271e6cwroweAP_DECLARE_MODULE(lua) = {
a9a4544168a37b43bd180b3703ccee995f27a80awrowe STANDARD20_MODULE_STUFF,
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 */
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar NULL, /* merge per-server config structures */
948096a99010fccf648814fecf38f75c689172d7wrowe lua_commands, /* table of config file commands */
948096a99010fccf648814fecf38f75c689172d7wrowe lua_register_hooks /* register hooks */
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar};
948096a99010fccf648814fecf38f75c689172d7wrowe