49#define MAX_ADDRESS 512
67#ifndef SO_TLS_UNCLEAN_SHUTDOWN
68#define SO_TLS_UNCLEAN_SHUTDOWN 0
88#define strEQ(s1,s2) (strcmp(s1,s2) == 0)
89#define strNE(s1,s2) (strcmp(s1,s2) != 0)
90#define strEQn(s1,s2,n) (strncmp(s1,s2,n) == 0)
91#define strNEn(s1,s2,n) (strncmp(s1,s2,n) != 0)
93#define strcEQ(s1,s2) (strcasecmp(s1,s2) == 0)
94#define strcNE(s1,s2) (strcasecmp(s1,s2) != 0)
95#define strcEQn(s1,s2,n) (strncasecmp(s1,s2,n) == 0)
96#define strcNEn(s1,s2,n) (strncasecmp(s1,s2,n) != 0)
98#define strIsEmpty(s) (s == NULL || s[0] == NUL)
101module AP_MODULE_DECLARE_DATA nwssl_module;
145#define get_nwssl_cfg(srv) (NWSSLSrvConfigRec *) ap_get_module_config(srv->module_config, &nwssl_module)
183 if (
strcmp(w,
"*") == 0) {
202 fprintf(
stderr,
"Cannot resolve host name %s --- exiting!\n", w);
206 if (
hep->h_addr_list[1]) {
208 fprintf(
stderr,
"you must choose one explicitly for use as\n");
216 return ((
struct in_addr *) (
hep->h_addr))->s_addr;
237 if ((sl->
port == (
c->local_addr)->port) &&
276 "make_secure_socket: failed to get a socket for %s",
288 "make_secure_socket: for %s, WSAIoctl: "
289 "(SO_SSL_SET_FLAGS)",
addr);
304 "make_secure_socket: for %s, WSAIoctl: "
305 "(SO_SSL_SET_SERVER)",
addr);
316 "make_secure_socket: for %s, WSAIoctl: "
317 "(SO_SSL_SET_FLAGS)",
addr);
351 "Error: %d with WSAIoctl(flag SO_TLS_ENABLE)",
387 "Error: %d with WSAIoctl(SO_TLS_SET_CLIENT)",
409 "Error: %d with WSAIoctl(SO_TLS_SET_FLAGS, SO_TLS_ENABLE)",
421 "Error: %d with WSAIoctl(SO_TLS_SET_FLAGS, SO_TLS_SERVER)",
468 const char *
ips,
const char*
key,
488 return "Missing IP address";
489 else if (
ports[1] ==
'\0')
490 return "Address must end in :<port-number>";
499 new->local_addr.sin_family =
AF_INET;
513 return "Port must be numeric";
519 sa = (*walk)->bind_addr;
540 walk = &(*walk)->
next;
556 new->mutual = (mutual) ? 1 : 0;
564 const char *
ips,
const char*
key)
579 return "Missing IP address";
580 else if (
ports[1] ==
'\0')
581 return "Address must end in :<port-number>";
599 return "Port must be numeric";
626 if (
lr->next ==
slr) {
660 sa = (*walk)->bind_addr;
670 if ((*secwalk)->port ==
oldport &&
689 walk = &(*walk)->
next;
691 if (!
found && &(*secwalk)->next) {
807 "alloc_listener: failed to set up sockaddr for %s:%d", sl->
addr, sl->
port);
823 if (
slu->port ==
lr->bind_addr->port) {
830 "No Listen directive found for upgradeable listener %s:%d",
slu->addr,
slu->port);
995 else if (
strcEQ(
var,
"HTTP_PROXY_CONNECTION"))
1018 else if (
strcEQ(
var,
"REQUEST_FILENAME"))
1040 else if (
strcEQ(
var,
"SERVER_PROTOCOL"))
1042 else if (
strcEQ(
var,
"SCRIPT_FILENAME"))
1085 else if (
strcEQ(
var,
"SERVER_SOFTWARE"))
1097#define MKTIMESTR(format, tmfield) \
1098 apr_time_exp_lt(&tm, apr_time_now()); \
1099 result = apr_psprintf(p, format, tm.tmfield); \
1122 "%02d%02d%02d%02d%02d%02d%02d", (
tm.
tm_year / 100) + 19,
1144#define SWITCH_STATUS_LINE "HTTP/1.1 101 Switching Protocols"
1145#define UPGRADE_HEADER "Upgrade: TLS/1.0, HTTP/1.1"
1146#define CONNECTION_HEADER "Connection: Upgrade"
1152 const char *upgrade;
1203 "could not send interim 101 Upgrade response");
1221 "Upgradeable socket handle not found");
1226 "Awaiting re-negotiation handshake");
1246 "specify an address and/or port with a key pair name.\n"
1247 "Optional third parameter of MUTUAL configures the port for mutual authentication."),
1249 "specify an address and/or port with a key pair name, that can be upgraded to an SSL connection.\n"
1250 "The address and/or port must have already be defined using a Listen directive."),
1252 "Adds trusted certificates that are used to create secure connections to proxied servers"),
Apache Listeners Library.
APR-UTIL registration of functions exported by modules.
APR Portability Routines.
void ap_hook_pre_connection(ap_HOOK_pre_connection_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
static apr_pool_t * pconf
#define ap_get_module_config(v, m)
void ap_hook_post_config(ap_HOOK_post_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define AP_DECLARE_MODULE(foo)
#define AP_INIT_ITERATE(directive, func, mconfig, where, help)
#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_INIT_TAKE23(directive, func, mconfig, where, help)
#define AP_INIT_TAKE2(directive, func, mconfig, where, help)
#define ap_http_scheme(r)
#define DEFAULT_HTTPS_PORT
const char * ap_get_server_banner(void)
#define ap_fputs(f, bb, str)
apr_status_t ap_pass_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket)
ap_filter_rec_t * ap_register_output_filter(const char *name, ap_out_filter_func filter_func, ap_init_filter_func filter_init, ap_filter_type ftype)
ap_filter_t * ap_add_output_filter(const char *name, void *ctx, request_rec *r, conn_rec *c)
void ap_remove_output_filter(ap_filter_t *f)
apr_port_t ap_get_server_port(const request_rec *r)
const char * ap_document_root(request_rec *r)
const char * ap_get_remote_logname(request_rec *r)
const char * ap_get_server_name_for_url(request_rec *r)
void ap_listen_pre_config(void)
ap_listen_rec * ap_listeners
#define MODULE_MAGIC_NUMBER_MAJOR
void ap_hook_http_scheme(ap_HOOK_http_scheme_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_hook_default_port(ap_HOOK_default_port_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_hook_fixups(ap_HOOK_fixups_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_hook_insert_filter(ap_HOOK_insert_filter_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
const char apr_port_t port
#define APR_BRIGADE_INSERT_TAIL(b, e)
apr_memcache_server_t * server
#define APR_REGISTER_OPTIONAL_FN(name)
#define APR_DECLARE_OPTIONAL_FN(ret, name, args)
#define HTTP_INTERNAL_SERVER_ERROR
char * ssl_var_lookup(apr_pool_t *p, server_rec *s, conn_rec *c, request_rec *r, char *var)
#define STANDARD20_MODULE_STUFF
char * ap_getword(apr_pool_t *p, const char **line, char stop)
const char * ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden)
apr_array_header_t ** result
apr_vformatter_buff_t * c
apr_sockaddr_t * sockaddr
#define apr_pcalloc(p, size)
apr_int32_t apr_int32_t apr_int32_t err
apr_size_t apr_size_t const char apr_time_exp_t * tm
const char * ap_get_useragent_host(request_rec *req, int type, int *str_is_ip)
Apache connection library.
#define SO_TLS_UNCLEAN_SHUTDOWN
static seclisten_rec * ap_seclisteners
static unsigned long parse_addr(const char *w, unsigned short *ports)
#define get_nwssl_cfg(srv)
static int isSecureUpgraded(const request_rec *r)
static seclistenup_rec * ap_seclistenersup
static int compare_ipports(void *rec, const char *key, const char *value)
static int isSecureConnEx(const server_rec *s, const conn_rec *c, const apr_table_t *t)
static int ssl_is_https(conn_rec *c)
static ap_listen_rec * nw_old_listeners
static apr_array_header_t * certlist
static int isSecureConn(const server_rec *s, const conn_rec *c)
static int isSecureUpgradeable(const request_rec *r)
static int SSLize_Socket(SOCKET socketHnd, char *key, request_rec *r)
static int nwssl_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
static const char * set_secure_listener(cmd_parms *cmd, void *dummy, const char *ips, const char *key, const char *mutual)
static const char * set_secure_upgradeable_listener(cmd_parms *cmd, void *dummy, const char *ips, const char *key)
static unicode_t ** certarray
#define MKTIMESTR(format, tmfield)
static char * get_port_key(conn_rec *c)
static apr_status_t nwssl_socket_cleanup(void *data)
#define SWITCH_STATUS_LINE
static void * nwssl_config_server_merge(apr_pool_t *p, void *basev, void *addv)
static const char * set_trusted_certs(cmd_parms *cmd, void *dummy, char *arg)
static apr_port_t nwssl_hook_default_port(const request_rec *r)
static int nwssl_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
static int find_secure_listener(seclisten_rec *lr)
static int make_secure_socket(apr_pool_t *pconf, const struct sockaddr_in *server, char *key, int mutual, server_rec *sconf)
static void register_hooks(apr_pool_t *p)
#define strcEQn(s1, s2, n)
static int isSecure(const request_rec *r)
int ssl_proxy_enable(conn_rec *c)
static apr_status_t ssl_io_filter_Upgrade(ap_filter_t *f, apr_bucket_brigade *bb)
static int nwssl_pre_connection(conn_rec *c, void *csd)
#define CONNECTION_HEADER
int ssl_engine_disable(conn_rec *c)
static const command_rec nwssl_module_cmds[]
static const char * nwssl_hook_http_scheme(const request_rec *r)
static void * nwssl_config_server_create(apr_pool_t *p, server_rec *s)
static int convert_secure_socket(conn_rec *c, apr_socket_t *csd)
static void ssl_hook_Insert_Filter(request_rec *r)
static void build_cert_list(apr_pool_t *p)
static int isSecureConnUpgradeable(const server_rec *s, const conn_rec *c)
static int nwssl_hook_Fixup(request_rec *r)
The representation of a filter chain.
Apache's listeners record.
apr_sockaddr_t * bind_addr
Structure to store things which are per connection.
struct ap_conf_vector_t * conn_config
A structure that represents the current request.
apr_table_t * subprocess_env
apr_table_t * headers_out
struct sockaddr_in local_addr
A structure to store information for each virtual server.
apr_status_t apr_os_sock_get(apr_os_sock_t *thesock, apr_socket_t *sock)
apr_status_t apr_os_sock_make(apr_socket_t **apr_sock, apr_os_sock_info_t *os_sock_info, apr_pool_t *cont)
apr_status_t apr_socket_close(apr_socket_t *thesocket)