Hi,
Here's a patch which exposes more of the ssl_engine_ext.c code. The
ap_hook_* functionality is still not ported to the 2.0 style. Pl. let me
know if you have any comments / suggestions..
Thanks
-Madhu & Julius
<<patch_ext.txt>>
Index: mod_ssl.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/ssl/mod_ssl.h,v
retrieving revision 1.22
diff -u -r1.22 mod_ssl.h
--- mod_ssl.h 2001/07/30 22:35:33 1.22
+++ mod_ssl.h 2001/07/31 00:07:19
@@ -703,9 +701,7 @@
/* Extensions */
void ssl_ext_register(apr_pool_t *p);
-#if 0 /* XXX */
void ssl_ext_unregister(void);
-#endif
/* Utility Functions */
char *ssl_util_vhostid(apr_pool_t *, server_rec *);
Index: ssl_engine_ext.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/ssl/ssl_engine_ext.c,v
retrieving revision 1.5
diff -u -r1.5 ssl_engine_ext.c
--- ssl_engine_ext.c 2001/07/30 22:35:33 1.5
+++ ssl_engine_ext.c 2001/07/31 02:02:59
@@ -69,7 +69,6 @@
#include "..\..\modules\loggers\mod_log_config.h"
static void ssl_ext_mlc_register(apr_pool_t *p);
-#if 0 /* XXX */
static void ssl_ext_mlc_unregister(void);
static void ssl_ext_mr_register(void);
static void ssl_ext_mr_unregister(void);
@@ -77,31 +76,25 @@
static void ssl_ext_mp_unregister(void);
static void ssl_ext_ms_register(void);
static void ssl_ext_ms_unregister(void);
-#endif /* XXX */
void ssl_ext_register(apr_pool_t *p)
{
ssl_ext_mlc_register(p);
-#if 0 /* XXX */
ssl_ext_mr_register();
ssl_ext_mp_register();
ssl_ext_ms_register();
-#endif /* XXX */
return;
}
void ssl_ext_unregister(void)
{
-#if 0 /* XXX */
ssl_ext_mlc_unregister();
ssl_ext_mr_unregister();
ssl_ext_mp_unregister();
ssl_ext_ms_unregister();
-#endif /* XXX */
return;
}
-
/* _________________________________________________________________
**
** SSL Extension to mod_log_config
@@ -128,16 +121,16 @@
return;
}
-#if 0 /* XXX - We don't really need this (do we???) */
static void ssl_ext_mlc_unregister(void)
{
+#if 0 /* XXX */
ap_hook_unregister("ap::mod_log_config::log_c",
ssl_ext_mlc_log_c);
ap_hook_unregister("ap::mod_log_config::log_x",
ssl_ext_mlc_log_x);
+#endif /* XXX */
return;
}
-#endif /* XXX */
/*
* implement the %{..}c log function
@@ -189,7 +182,6 @@
** _________________________________________________________________
*/
-#if 0 /* XXX */
static char *ssl_ext_mr_lookup_variable(request_rec *r, char *var);
/*
@@ -197,15 +189,19 @@
*/
static void ssl_ext_mr_register(void)
{
+#if 0 /* XXX */
ap_hook_register("ap::mod_rewrite::lookup_variable",
ssl_ext_mr_lookup_variable, AP_HOOK_NOCTX);
+#endif /* XXX */
return;
}
static void ssl_ext_mr_unregister(void)
{
+#if 0 /* XXX */
ap_hook_unregister("ap::mod_rewrite::lookup_variable",
ssl_ext_mr_lookup_variable);
+#endif /* XXX */
return;
}
@@ -228,11 +224,11 @@
static int ssl_ext_mp_canon(request_rec *, char *);
static int ssl_ext_mp_handler(request_rec *, void *, char *, char *, int, char *);
static int ssl_ext_mp_set_destport(request_rec *);
-static char *ssl_ext_mp_new_connection(request_rec *, BUFF *, char *);
-static void ssl_ext_mp_close_connection(void *);
-static int ssl_ext_mp_write_host_header(request_rec *, BUFF *, char *, int, char *);
+static char *ssl_ext_mp_new_connection(request_rec *, char *);
+static apr_status_t ssl_ext_mp_close_connection(void *);
+static int ssl_ext_mp_write_host_header(request_rec *, char *, int, char *);
#ifdef SSL_EXPERIMENTAL_PROXY
-static void ssl_ext_mp_init(server_rec *, pool *);
+static void ssl_ext_mp_init(server_rec *, apr_pool_t *);
static int ssl_ext_mp_verify_cb(int, X509_STORE_CTX *);
static int ssl_ext_mp_clientcert_cb(SSL *, X509 **, EVP_PKEY **);
#endif
@@ -242,6 +238,7 @@
*/
static void ssl_ext_mp_register(void)
{
+#if 0 /* XXX */
#ifdef SSL_EXPERIMENTAL_PROXY
ap_hook_register("ap::mod_proxy::init",
ssl_ext_mp_init, AP_HOOK_NOCTX);
@@ -256,11 +253,13 @@
ssl_ext_mp_new_connection, AP_HOOK_NOCTX);
ap_hook_register("ap::mod_proxy::http::handler::write_host_header",
ssl_ext_mp_write_host_header, AP_HOOK_NOCTX);
+#endif /* XXX */
return;
}
static void ssl_ext_mp_unregister(void)
{
+#if 0 /* XXX */
#ifdef SSL_EXPERIMENTAL_PROXY
ap_hook_unregister("ap::mod_proxy::init", ssl_ext_mp_init);
#endif
@@ -272,6 +271,7 @@
ssl_ext_mp_new_connection);
ap_hook_unregister("ap::mod_proxy::http::handler::write_host_header",
ssl_ext_mp_write_host_header);
+#endif /* XXX */
return;
}
@@ -279,7 +279,7 @@
* SSL proxy initialization
*/
#ifdef SSL_EXPERIMENTAL_PROXY
-static void ssl_ext_mp_init(server_rec *s, pool *p)
+static void ssl_ext_mp_init(server_rec *s, apr_pool_t *p)
{
SSLSrvConfigRec *sc;
char *cpVHostID;
@@ -295,7 +295,7 @@
for (; s != NULL; s = s->next) {
sc = mySrvConfig(s);
cpVHostID = ssl_util_vhostid(p, s);
-
+
if (sc->bProxyVerify == UNSET)
sc->bProxyVerify = FALSE;
@@ -308,7 +308,7 @@
cpVHostID);
ssl_die();
}
- cp = ap_pstrcat(p, (sc->nProxyProtocol & SSL_PROTOCOL_SSLV2 ? "SSLv2, " :
""),
+ cp = apr_pstrcat(p, (sc->nProxyProtocol & SSL_PROTOCOL_SSLV2 ? "SSLv2, " :
+""),
(sc->nProxyProtocol & SSL_PROTOCOL_SSLV3 ? "SSLv3, " :
""),
(sc->nProxyProtocol & SSL_PROTOCOL_TLSV1 ? "TLSv1, " :
""), NULL);
cp[strlen(cp)-2] = NUL;
@@ -421,8 +421,10 @@
if (strcEQn(url, "https:", 6)) {
rc = OK;
+#if 0 /* XXX */
ap_hook_call("ap::mod_proxy::http::canon",
&rc, r, url+6, "https", DEFAULT_HTTPS_PORT);
+#endif /* XXX */
return rc;
}
return DECLINED;
@@ -434,26 +436,28 @@
int rc;
if (strcEQ(protocol, "https")) {
- ap_ctx_set(r->ctx, "ssl::proxy::enabled", PTRUE);
+ apr_table_setn(r->notes, "ssl::proxy::enabled", PTRUE);
+#if 0 /* XXX */
ap_hook_call("ap::mod_proxy::http::handler",
&rc, r, cr, url, proxyhost, proxyport);
+#endif /* XXX */
return rc;
}
else {
- ap_ctx_set(r->ctx, "ssl::proxy::enabled", PFALSE);
+ apr_table_setn(r->notes, "ssl::proxy::enabled", PFALSE);
}
return DECLINED;
}
static int ssl_ext_mp_set_destport(request_rec *r)
{
- if (ap_ctx_get(r->ctx, "ssl::proxy::enabled") == PTRUE)
+ if (apr_table_get(r->notes, "ssl::proxy::enabled") == PTRUE)
return DEFAULT_HTTPS_PORT;
else
return DEFAULT_HTTP_PORT;
}
-static char *ssl_ext_mp_new_connection(request_rec *r, BUFF *fb, char *peer)
+static char *ssl_ext_mp_new_connection(request_rec *r, char *peer)
{
#ifndef SSL_EXPERIMENTAL_PROXY
SSL_CTX *ssl_ctx;
@@ -461,14 +465,14 @@
SSL *ssl;
char *errmsg;
int rc;
- char *cpVHostID;
+ unsigned char *cpVHostID;
char *cpVHostMD5;
#ifdef SSL_EXPERIMENTAL_PROXY
SSLSrvConfigRec *sc;
char *cp;
#endif
- if (ap_ctx_get(r->ctx, "ssl::proxy::enabled") == PFALSE)
+ if (apr_table_get(r->notes, "ssl::proxy::enabled") == PFALSE)
return NULL;
/*
@@ -477,7 +481,7 @@
#ifdef SSL_EXPERIMENTAL_PROXY
sc = mySrvConfig(r->server);
#endif
- cpVHostID = ssl_util_vhostid(r->pool, r->server);
+ cpVHostID = (unsigned char *)ssl_util_vhostid(r->pool, r->server);
/*
* Create a SSL context and handle
@@ -489,71 +493,70 @@
ssl = SSL_new(ssl_ctx);
#endif
if (ssl == NULL) {
- errmsg = ap_psprintf(r->pool, "SSL proxy new failed (%s): peer %s: %s",
+ errmsg = apr_psprintf(r->pool, "SSL proxy new failed (%s): peer %s: %s",
cpVHostID, peer,
ERR_reason_error_string(ERR_get_error()));
- ap_ctx_set(fb->ctx, "ssl", NULL);
+ apr_table_setn(r->connection->notes, "ssl", NULL);
return errmsg;
}
SSL_clear(ssl);
- cpVHostMD5 = ap_md5(r->pool, (unsigned char *)cpVHostID);
+ cpVHostMD5 = ap_md5(r->pool, cpVHostID);
if (!SSL_set_session_id_context(ssl, (unsigned char *)cpVHostMD5,
strlen(cpVHostMD5))) {
- errmsg = ap_psprintf(r->pool, "Unable to set session id context to `%s': peer
%s: %s",
+ errmsg = apr_psprintf(r->pool, "Unable to set session id context to `%s':
+peer %s: %s",
cpVHostMD5, peer,
ERR_reason_error_string(ERR_get_error()));
- ap_ctx_set(fb->ctx, "ssl", NULL);
+ apr_table_setn(r->connection->notes, "ssl", NULL);
return errmsg;
}
+#if 0 /* XXX - Do something. It'll not work as it is now - TBD */
SSL_set_fd(ssl, fb->fd);
+#endif /* XXX */
#ifdef SSL_EXPERIMENTAL_PROXY
- SSL_set_app_data(ssl, fb->ctx);
+ SSL_set_app_data(ssl, r->connection->notes);
#endif
- ap_ctx_set(fb->ctx, "ssl", ssl);
+ apr_table_setn(r->connection->notes, "ssl", (void *)ssl);
#ifdef SSL_EXPERIMENTAL_PROXY
- ap_ctx_set(fb->ctx, "ssl::proxy::server_rec", r->server);
- ap_ctx_set(fb->ctx, "ssl::proxy::peer", peer);
- ap_ctx_set(fb->ctx, "ssl::proxy::servername", cpVHostID);
- ap_ctx_set(fb->ctx, "ssl::proxy::verifyerror", NULL);
+ apr_table_setn(r->connection->notes, "ssl::proxy::server_rec", r->server);
+ apr_table_setn(r->connection->notes, "ssl::proxy::peer", peer);
+ apr_table_setn(r->connection->notes, "ssl::proxy::servername", cpVHostID);
+ apr_table_setn(r->connection->notes, "ssl::proxy::verifyerror", NULL);
#endif
/*
* Give us a chance to gracefully close the connection
*/
- ap_register_cleanup(r->pool, (void *)fb,
- ssl_ext_mp_close_connection, ssl_ext_mp_close_connection);
+ apr_pool_cleanup_register(r->pool, (void *)ssl,
+ ssl_ext_mp_close_connection, ssl_ext_mp_close_connection);
/*
* Establish the SSL connection
*/
if ((rc = SSL_connect(ssl)) <= 0) {
#ifdef SSL_EXPERIMENTAL_PROXY
- if ((cp = (char *)ap_ctx_get(fb->ctx, "ssl::proxy::verifyerror")) != NULL) {
+ if ((cp = (char *)apr_table_get(r->connection->notes,
+"ssl::proxy::verifyerror")) != NULL) {
SSL_set_shutdown(ssl, SSL_RECEIVED_SHUTDOWN);
SSL_smart_shutdown(ssl);
SSL_free(ssl);
- ap_ctx_set(fb->ctx, "ssl", NULL);
- ap_bsetflag(fb, B_EOF|B_EOUT, 1);
+ apr_table_setn(r->connection->notes, "ssl", NULL);
return NULL;
}
#endif
- errmsg = ap_psprintf(r->pool, "SSL proxy connect failed (%s): peer %s: %s",
+ errmsg = apr_psprintf(r->pool, "SSL proxy connect failed (%s): peer %s: %s",
cpVHostID, peer,
ERR_reason_error_string(ERR_get_error()));
ssl_log(r->server, SSL_LOG_ERROR, errmsg);
SSL_free(ssl);
- ap_ctx_set(fb->ctx, "ssl", NULL);
+ apr_table_setn(r->connection->notes, "ssl", NULL);
return errmsg;
}
return NULL;
}
-static void ssl_ext_mp_close_connection(void *_fb)
+static apr_status_t ssl_ext_mp_close_connection(void *_fb)
{
- BUFF *fb = _fb;
- SSL *ssl;
+ SSL *ssl = (SSL *)_fb;
#ifndef SSL_EXPERIMENTAL_PROXY
SSL_CTX *ctx;
#endif
- ssl = ap_ctx_get(fb->ctx, "ssl");
if (ssl != NULL) {
#ifndef SSL_EXPERIMENTAL_PROXY
ctx = SSL_get_SSL_CTX(ssl);
@@ -561,23 +564,29 @@
SSL_set_shutdown(ssl, SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
SSL_smart_shutdown(ssl);
SSL_free(ssl);
- ap_ctx_set(fb->ctx, "ssl", NULL);
+#if 0 /* XXX */
+ apr_table_unset(r->connection->notes, "ssl");
+#endif /* XXX */
#ifndef SSL_EXPERIMENTAL_PROXY
if (ctx != NULL)
SSL_CTX_free(ctx);
#endif
}
- return;
+ return APR_SUCCESS;
}
static int ssl_ext_mp_write_host_header(
- request_rec *r, BUFF *fb, char *host, int port, char *portstr)
+ request_rec *r, char *host, int port, char *portstr)
{
- if (ap_ctx_get(r->ctx, "ssl::proxy::enabled") == PFALSE)
+ if (apr_table_get(r->notes, "ssl::proxy::enabled") == PFALSE)
return DECLINED;
+ /*
+ * XXX - The ap_bvputs is replaced by ap_rvputs - This is just a temporary
+ * fix. We'll have to see the implications and change it accordingly - TBD
+ */
if (portstr != NULL && port != DEFAULT_HTTPS_PORT) {
- ap_bvputs(fb, "Host: ", host, ":", portstr, "\r\n", NULL);
+ ap_rvputs(r, "Host: ", host, ":", portstr, "\r\n", NULL);
return OK;
}
return DECLINED;
@@ -599,16 +608,16 @@
char *peer;
char *servername;
server_rec *s;
- ap_ctx *pCtx;
+ apr_table_t *pCtx;
STACK_OF(X509_NAME) *sk;
STACK_OF(X509_INFO) *pcerts;
char *cp;
int i, j;
- pCtx = (ap_ctx *)SSL_get_app_data(ssl);
- s = ap_ctx_get(pCtx, "ssl::proxy::server_rec");
- peer = ap_ctx_get(pCtx, "ssl::proxy::peer");
- servername = ap_ctx_get(pCtx, "ssl::proxy::servername");
+ pCtx = (apr_table_t *)SSL_get_app_data(ssl);
+ s = apr_table_get(pCtx, "ssl::proxy::server_rec");
+ peer = apr_table_get(pCtx, "ssl::proxy::peer");
+ servername = apr_table_get(pCtx, "ssl::proxy::servername");
sc = mySrvConfig(s);
pcerts = sc->skProxyClientCerts;
@@ -690,17 +699,17 @@
int errnum;
int errdepth;
char *cp, *cp2;
- ap_ctx *pCtx;
+ apr_table_t *pCtx;
server_rec *s;
SSL *ssl;
char *peer;
char *servername;
ssl = (SSL *)X509_STORE_CTX_get_app_data(ctx);
- pCtx = (ap_ctx *)SSL_get_app_data(ssl);
- s = ap_ctx_get(pCtx, "ssl::proxy::server_rec");
- peer = ap_ctx_get(pCtx, "ssl::proxy::peer");
- servername = ap_ctx_get(pCtx, "ssl::proxy::servername");
+ pCtx = (apr_table_t *)SSL_get_app_data(ssl);
+ s = apr_table_get(pCtx, "ssl::proxy::server_rec");
+ peer = apr_table_get(pCtx, "ssl::proxy::peer");
+ servername = apr_table_get(pCtx, "ssl::proxy::servername");
sc = mySrvConfig(s);
/*
@@ -741,7 +750,7 @@
"Error (%d): %s", servername,
peer != NULL ? peer : "-unknown-",
errnum, X509_verify_cert_error_string(errnum));
- ap_ctx_set(pCtx, "ssl::proxy::verifyerror",
+ apr_table_setn(pCtx, "ssl::proxy::verifyerror",
(void *)X509_verify_cert_error_string(errnum));
return ok;
}
@@ -756,7 +765,7 @@
"Certificate Chain too long "
"(chain has %d certificates, but maximum allowed are only %d)",
servername, peer, errdepth, sc->nProxyVerifyDepth);
- ap_ctx_set(pCtx, "ssl::proxy::verifyerror",
+ apr_table_setn(pCtx, "ssl::proxy::verifyerror",
(void
*)X509_verify_cert_error_string(X509_V_ERR_CERT_CHAIN_TOO_LONG));
ok = FALSE;
}
@@ -780,13 +789,17 @@
static void ssl_ext_ms_register(void)
{
+#if 0 /* XXX */
ap_hook_register("ap::mod_status::display", ssl_ext_ms_display, AP_HOOK_NOCTX);
+#endif /* XXX */
return;
}
static void ssl_ext_ms_unregister(void)
{
+#if 0 /* XXX */
ap_hook_unregister("ap::mod_status::display", ssl_ext_ms_display);
+#endif /* XXX */
return;
}
@@ -817,6 +830,3 @@
ap_rputs("</table>\n", r);
return;
}
-
-#endif /* XXX */
-