34module AP_MODULE_DECLARE_DATA authnz_fcgi_module;
66#define FCGI_IO_TIMEOUT apr_time_from_sec(30)
68#ifndef NON200_RESPONSE_BUF_LEN
69#define NON200_RESPONSE_BUF_LEN 8192
73#define FCGI_BACKEND_REGEX_STR "m%^fcgi://(.*):(\\d{1,5})/?$%"
91 while (
addr && !connected) {
97 APLOGNO(02494)
"error creating family %d socket "
112 APLOGNO(02495)
"attempt to connect to %pI (%s) "
128 APLOGNO(02496)
"name %s, backend %s, host %s, port %d, "
129 "first address %pI, %c%c",
179 APLOGNO(02497)
"Couldn't read from backend %s",
184#if AP_MODULE_MAGIC_AT_LEAST(20130702,2)
226#if AP_MODULE_MAGIC_AT_LEAST(20130702,2)
238 APLOGNO(02498)
"Sending data to %s failed",
249 n -=
vec[
i++].iov_len;
285 vec[1].iov_base = (
void *)
abrb;
296 const char *fn =
"send_environment";
320 "XXXXXXXX" : elts[
i].
val);
340 APLOGNO(02499)
"couldn't encode envvar '%s' in %"
352 APLOGNO(02500)
"required len for encoding envvars: %"
370 vec[1].iov_base = body;
426 else if (*
itr ==
'\n') {
476 const char *fn =
"handle_response";
498 unsigned char version;
503 APLOGNO(02501)
"%s: Error occurred before reading "
504 "entire header", fn);
513 APLOGNO(02502)
"%s: Got bogus FastCGI header "
514 "version %d", fn, (
int)version);
521 APLOGNO(02503)
"%s: Got bogus FastCGI header "
522 "request id %d, expected %d",
570 APLOGNO(02504)
"%s: script header "
597 "flattening response body",
605 APLOGNO(02506)
"%s: Error parsing "
606 "script headers from %s",
633 APLOGNO(02507)
"%s: Logged from %s: '%s'",
649 APLOGNO(02508)
"%s: Got bogus FastCGI record type "
665 APLOGNO(02509)
"%s: Error occurred reading "
678 APLOGNO(02510)
"%s: Never reached end of script headers",
687 const char *
key,
const char *
val)
711 const char *fn =
"req_rsp";
737 APLOGNO(02511)
"%s: Failed writing request to %s",
745 APLOGNO(02512)
"%s: Failed writing environment "
767 APLOGNO(02514)
"%s: Failed handling response "
781 APLOGNO(02515)
"%s: Received HTTP status %d",
808 const char *fn =
"fcgi_check_authn";
810 &authnz_fcgi_module);
828 APLOGNO(02516)
"%s, prov %s, authoritative %s, "
829 "require-basic %s, user expr? %s type %s",
839 APLOGNO(02517)
"%s: couldn't retrieve basic auth "
851 APLOGNO(02518)
"%s: can't find config for provider %s",
868 if (user && strlen(user)) {
871 APLOGNO(02519)
"%s: Setting user to '%s'",
879 APLOGNO(02520)
"%s: Failure extracting user "
880 "after calling authorizer: user expression "
881 "yielded empty string (variable not set?)",
888 APLOGNO(02521)
"%s: Failure extracting user "
889 "after calling authorizer: %s",
901 rnotes->successful_authnz_provider = conf->
name;
916 APLOGNO(02522)
"%s: Ignoring response body from non-"
917 "authoritative authorizer", fn);
923 APLOGNO(02523)
"%s: possible overflow handling "
924 "response body", fn);
938 const char *fn =
"fcgi_check_password";
943 APLOGNO(02524)
"%s(%s, XXX): provider %s",
948 APLOGNO(02525)
"%s: provider note isn't set", fn);
955 APLOGNO(02526)
"%s: can't find config for provider %s",
977 rnotes->successful_authnz_provider = conf->
name;
1000 const char *fn =
"fcgi_authz_check";
1009 APLOGNO(02528)
"%s: provider note isn't set", fn);
1016 APLOGNO(02529)
"%s: can't find config for provider %s",
1036 &authnz_fcgi_module);
1038 &&
rnotes->successful_authnz_provider
1067 return "mod_authnz_fcgi doesn't support restrictions on providers "
1068 "(i.e., multiple require args)";
1084 const char *
dname =
"AuthnzFcgiCheckAuthnProvider";
1097 return "Options aren't supported with \"None\"";
1110 "needs an argument",
NULL);
1174 const char *
dname =
"AuthnzFcgiDefineProvider";
1185 "%s: failed to compile regexec '%s'",
1212 ": Invalid provider type ",
1231 dname,
": backend-address '",
1233 "' has invalid form",
1246 dname,
": backend-address '",
1248 "' has invalid port",
1261 APLOGNO(02530)
"Address %s could not be resolved",
1265 ": Error resolving backend address",
1272 ": Unexpected parameter ",
1305 "Define a FastCGI authn and/or authz provider"),
1311 "Enable/disable a FastCGI authorizer to handle "
1312 "check_authn phase"),
1329 {
"mod_auth_basic.c",
NULL};
#define ap_rxplus_nmatch(rx)
const char apr_size_t len
APR general purpose library routines.
apr_size_t const unsigned char unsigned int unsigned int d
static apr_pool_t * pconf
#define ap_get_module_config(v, m)
#define AP_INIT_TAKE_ARGV(directive, func, mconfig, where, help)
#define AP_DECLARE_MODULE(foo)
#define ap_set_module_config(v, m, val)
void ap_hook_pre_config(ap_HOOK_pre_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define AP_FCGI_APACHE_ROLE_AUTHENTICATOR_STR
void ap_fcgi_fill_in_header(ap_fcgi_header *header, unsigned char type, apr_uint16_t request_id, apr_uint16_t content_len, unsigned char padding_len)
#define AP_FCGI_AUTHORIZER
apr_size_t ap_fcgi_encoded_env_len(apr_table_t *env, apr_size_t maxlen, int *starting_elem)
#define AP_FCGI_VERSION_1
void ap_fcgi_fill_in_request_body(ap_fcgi_begin_request_body *brb, int role, unsigned char flags)
void ap_fcgi_header_fields_from_array(unsigned char *version, unsigned char *type, apr_uint16_t *request_id, apr_uint16_t *content_len, unsigned char *padding_len, unsigned char a[])
#define AP_FCGI_HEADER_LEN
void ap_fcgi_header_to_array(ap_fcgi_header *h, unsigned char a[])
#define AP_FCGI_END_REQUEST
apr_status_t ap_fcgi_encode_env(request_rec *r, apr_table_t *env, void *buffer, apr_size_t buflen, int *starting_elem)
#define AP_FCGI_APACHE_ROLE_AUTHORIZER_STR
#define AP_FCGI_AUTHORIZER_STR
#define AP_FCGI_BEGIN_REQUEST
void ap_fcgi_begin_request_body_to_array(ap_fcgi_begin_request_body *h, unsigned char a[])
void ap_custom_response(request_rec *r, int status, const char *string)
const char * ap_auth_type(request_rec *r)
#define AP_LOG_DATA_SHOW_OFFSET
#define APLOG_R_IS_LEVEL(r, level)
#define APLOG_MODULE_INDEX
const unsigned char * buf
int ap_get_basic_auth_pw(request_rec *r, const char **pw)
apr_status_t ap_register_auth_provider(apr_pool_t *pool, const char *provider_group, const char *provider_name, const char *provider_version, const void *provider, int type)
#define AP_AUTH_INTERNAL_PER_CONF
void ap_hook_check_authn(ap_HOOK_check_user_id_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder, int type)
void ap_add_common_vars(request_rec *r)
int ap_scan_script_header_err_brigade_ex(request_rec *r, apr_bucket_brigade *bb, char *buffer, int module_index)
void ap_add_cgi_vars(request_rec *r)
#define AP_TRUST_CGILIKE_CL_ENVVAR
const char apr_port_t port
#define APR_BRIGADE_INSERT_TAIL(b, e)
#define apr_bucket_setaside(e, p)
apr_bucket apr_bucket_brigade * a
apr_pool_t apr_dbd_t apr_dbd_results_t ** res
const char apr_ssize_t int flags
#define AP_EXPR_FLAG_DONT_VARY
#define AP_EXPR_FLAG_STRING_RESULT
#define ap_expr_parse_cmd(cmd, expr, flags, err, lookup_fn)
const char * ap_expr_str_exec(request_rec *r, const ap_expr_info_t *expr, const char **err)
#define AP_EXPR_FLAG_RESTRICTED
#define HTTP_INTERNAL_SERVER_ERROR
#define STANDARD20_MODULE_STUFF
int ap_cstr_casecmp(const char *s1, const char *s2)
int ap_cstr_casecmpn(const char *s1, const char *s2, apr_size_t n)
const char * ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden)
apr_seek_where_t apr_off_t * offset
const struct iovec apr_size_t nvec
int strcasecmp(const char *a, const char *b)
#define APR_HASH_KEY_STRING
#define apr_pool_create(newpool, parent)
#define apr_pcalloc(p, size)
const char const char * password
apr_int32_t apr_int32_t apr_int32_t err
apr_int64_t apr_interval_time_t
Authentication and Authorization Extension for Apache.
#define AUTHN_PROVIDER_NAME_NOTE
#define AUTHN_PROVIDER_VERSION
#define AUTHN_PROVIDER_GROUP
#define AUTHZ_PROVIDER_NAME_NOTE
#define AUTHZ_PROVIDER_VERSION
#define AUTHZ_PROVIDER_GROUP
static int handle_headers(request_rec *r, int *state, const char *readbuf, apr_size_t readlen)
static const char * fcgi_define_provider(cmd_parms *cmd, void *d, int argc, char *const argv[])
static const char * fcgi_authz_parse(cmd_parms *cmd, const char *require_line, const void **parsed_require_line)
static void * merge_dir_conf(apr_pool_t *p, void *basev, void *overridesv)
static authz_status fcgi_authz_check(request_rec *r, const char *require_line, const void *parsed_require_line)
#define NON200_RESPONSE_BUF_LEN
#define FCGI_BACKEND_REGEX_STR
static int fix_auth_header(void *vr, const char *key, const char *val)
static int mod_fcgid_modify_auth_header(void *vars, const char *key, const char *val)
static void setupenv(request_rec *r, const char *password, const char *apache_role)
static int fcgi_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
static void log_provider_info(const fcgi_provider_conf *conf, request_rec *r)
static apr_status_t send_begin_request(request_rec *r, const fcgi_provider_conf *conf, apr_socket_t *s, int role, apr_uint16_t request_id)
static const authz_provider fcgi_authz_provider
static const command_rec fcgi_cmds[]
static const char * fcgi_check_authn_provider(cmd_parms *cmd, void *d, int argc, char *const argv[])
static int fcgi_check_authn(request_rec *r)
static apr_status_t connect_to_peer(apr_socket_t **newsock, request_rec *r, apr_sockaddr_t *backend_addrs, const char *backend_name, apr_interval_time_t timeout)
static void fcgi_register_hooks(apr_pool_t *p)
static void * create_dir_conf(apr_pool_t *p, char *dummy)
static apr_status_t handle_response(const fcgi_provider_conf *conf, request_rec *r, apr_socket_t *s, apr_pool_t *temp_pool, apr_uint16_t request_id, char *rspbuf, apr_size_t *rspbuflen)
static void req_rsp(request_rec *r, const fcgi_provider_conf *conf, const char *password, const char *apache_role, char *rspbuf, apr_size_t *rspbuflen)
@ HDR_STATE_READING_HEADERS
@ HDR_STATE_DONE_WITH_HEADERS
static apr_status_t sendv_data(const fcgi_provider_conf *conf, request_rec *r, apr_socket_t *s, struct iovec *vec, int nvec, apr_size_t *len)
static apr_status_t send_environment(apr_socket_t *s, const fcgi_provider_conf *conf, request_rec *r, apr_uint16_t request_id, apr_pool_t *temp_pool)
static authn_status fcgi_check_password(request_rec *r, const char *user, const char *password)
static apr_status_t recv_data(const fcgi_provider_conf *conf, request_rec *r, apr_socket_t *s, char *buf, apr_size_t *buflen)
static const authn_provider fcgi_authn_provider
static apr_hash_t * fcgi_authz_providers
static apr_hash_t * fcgi_authn_providers
static apr_status_t recv_data_full(const fcgi_provider_conf *conf, request_rec *r, apr_socket_t *s, char *buf, apr_size_t buflen)
This represents the content data of the FastCGI record when the type is AP_FCGI_BEGIN_REQUEST.
struct apr_bucket_alloc_t * bucket_alloc
const char * default_user
ap_expr_info_t * user_expr
apr_sockaddr_t * backend_addrs
const char * successful_authnz_provider
A structure that represents the current request.
apr_table_t * err_headers_out
struct ap_conf_vector_t * request_config
apr_table_t * subprocess_env
struct ap_conf_vector_t * per_dir_config
apr_table_t * headers_out
A structure to keep track of authorization requirements.
apr_interval_time_t timeout
apr_status_t apr_socket_sendv(apr_socket_t *sock, const struct iovec *vec, apr_int32_t nvec, apr_size_t *len)
apr_status_t apr_socket_recv(apr_socket_t *sock, char *buf, apr_size_t *len)
apr_status_t apr_socket_close(apr_socket_t *thesocket)
apr_status_t apr_socket_connect(apr_socket_t *sock, apr_sockaddr_t *sa)
apr_status_t apr_socket_create(apr_socket_t **new, int ofamily, int type, int protocol, apr_pool_t *cont)
apr_status_t apr_socket_opt_set(apr_socket_t *sock, apr_int32_t opt, apr_int32_t on)
apr_status_t apr_socket_timeout_set(apr_socket_t *sock, apr_interval_time_t t)
FastCGI protocol definitions and support routines.
int ap_rxplus_exec(apr_pool_t *pool, ap_rxplus_t *rx, const char *pattern, char **newpattern)
char * ap_rxplus_pmatch(apr_pool_t *pool, ap_rxplus_t *rx, int n)
ap_rxplus_t * ap_rxplus_compile(apr_pool_t *pool, const char *pattern)