You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by an...@apache.org on 2001/06/14 16:36:08 UTC
cvs commit: jakarta-tomcat-connectors/jk/native/domino jk_dsapi_plugin.c HISTORY config.h
andya 01/06/14 07:36:08
Modified: jk/native/domino jk_dsapi_plugin.c HISTORY config.h
Log:
Better SSL support, better ajp14 support
Revision Changes Path
1.6 +188 -146 jakarta-tomcat-connectors/jk/native/domino/jk_dsapi_plugin.c
Index: jk_dsapi_plugin.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/domino/jk_dsapi_plugin.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- jk_dsapi_plugin.c 2001/06/13 21:26:43 1.5
+++ jk_dsapi_plugin.c 2001/06/14 14:36:08 1.6
@@ -56,7 +56,7 @@
/***************************************************************************
* Description: DSAPI plugin for Lotus Domino *
* Author: Andy Armstrong <an...@tagish.com> *
- * Version: $Revision: 1.5 $ *
+ * Version: $Revision: 1.6 $ *
***************************************************************************/
/* Based on the IIS redirector by Gal Shachor <sh...@il.ibm.com> */
@@ -95,10 +95,11 @@
#endif
#endif
-#define VERSION "1.0.2"
+#define VERSION "1.0.3"
#define VERSION_STRING "Jakarta/DSAPI/" VERSION
/* What we call ourselves */
-#define FILTERDESC "Apache Tomcat Interceptor (" VERSION_STRING ")"
+#define FILTERDESC "Apache Tomcat Interceptor (" VERSION_STRING ")"
+#define SERVERDFLT "Lotus Domino"
/* Registry location of configuration data */
#define REGISTRY_LOCATION "Software\\Apache Software Foundation\\Jakarta Dsapi Redirector\\1.0"
/* Name of INI file relative to whatever the 'current' directory is when the filter is
@@ -117,15 +118,17 @@
static jk_logger_t *logger = NULL;
static int logLevel = JK_LOG_EMERG_LEVEL;
-static jk_pool_t cfgPool;
-
+static jk_pool_t cfgPool;
+
static const char *logFile;
static const char *workerFile;
static const char *workerMountFile;
static const char *tomcatStart;
static const char *tomcatStop;
-
-static jk_worker_env_t worker_env;
+
+#if FOR_TOMCAT >= TOMCAT400
+static jk_worker_env_t worker_env;
+#endif
static char *crlf = "\r\n";
@@ -255,6 +258,72 @@
printf("\n");
}
#endif
+
+/* Get the value of a server (CGI) variable as a string
+ */
+static int GetVariable(private_ws_t *ws, char *hdrName,
+ char *buf, DWORD bufsz, char **dest, const char *dflt)
+{
+ int errID;
+
+ if (ws->context->GetServerVariable(ws->context, hdrName, buf, bufsz, &errID))
+ *dest = jk_pool_strdup(&ws->p, buf);
+ else
+ *dest = jk_pool_strdup(&ws->p, dflt);
+
+ DEBUG(("%s = %s\n", hdrName, *dest));
+
+ return JK_TRUE;
+}
+
+/* Get the value of a server (CGI) variable as an integer
+ */
+static int GetVariableInt(private_ws_t *ws, char *hdrName,
+ char *buf, DWORD bufsz, int *dest, int dflt)
+{
+ int errID;
+
+ if (ws->context->GetServerVariable(ws->context, hdrName, buf, bufsz, &errID))
+ *dest = atoi(buf);
+ else
+ *dest = dflt;
+
+ DEBUG(("%s = %d\n", hdrName, *dest));
+
+ return JK_TRUE;
+}
+/* Get the value of a server (CGI) variable as an integer
+ */
+static int GetVariableBool(private_ws_t *ws, char *hdrName,
+ char *buf, DWORD bufsz, int *dest, int dflt)
+{
+ int errID;
+
+ if (ws->context->GetServerVariable(ws->context, hdrName, buf, bufsz, &errID))
+ {
+ if (isdigit(buf[0]))
+ *dest = atoi(buf) != 0;
+ else if (NoCaseStrCmp(buf, "yes") == 0 || NoCaseStrCmp(buf, "on") == 0)
+ *dest = 1;
+ else
+ *dest = 0;
+ }
+ else
+ {
+ *dest = dflt;
+ }
+
+ DEBUG(("%s = %d\n", hdrName, *dest));
+
+ return JK_TRUE;
+}
+
+/* A couple of utility macros to supply standard arguments to GetVariable() and
+ * GetVariableInt().
+ */
+#define GETVARIABLE(name, dest, dflt) GetVariable(ws, (name), workBuf, sizeof(workBuf), (dest), (dflt))
+#define GETVARIABLEINT(name, dest, dflt) GetVariableInt(ws, (name), workBuf, sizeof(workBuf), (dest), (dflt))
+#define GETVARIABLEBOOL(name, dest, dflt) GetVariableBool(ws, (name), workBuf, sizeof(workBuf), (dest), (dflt))
/* Return 1 iff the supplied string contains "web-inf" (in any case
* variation. We don't allow URIs containing web-inf, although
@@ -467,12 +536,12 @@
{
if (initDone)
{
- initDone = JK_FALSE;
-
uri_worker_map_free(&uw_map, logger);
wc_close(logger);
if (logger)
jk_close_file_logger(&logger);
+
+ initDone = JK_FALSE;
}
if (NULL != tomcatStop && '\0' != *tomcatStop)
@@ -487,14 +556,12 @@
return kFilterHandledEvent;
}
-
+
/* Called when Domino loads the filter. Reads a load of config data from
* the registry and elsewhere and displays a banner.
*/
-DLLEXPORT unsigned int FilterInit(FilterInitData * filterInitData)
+DLLEXPORT unsigned int FilterInit(FilterInitData *filterInitData)
{
- int rc = JK_FALSE;
- jk_map_t *map = NULL;
jk_open_pool(&cfgPool, NULL, 0); /* empty pool for config data */
@@ -510,36 +577,6 @@
RunProg(tomcatStart);
}
- if (map_alloc(&map))
- {
- if (map_read_properties(map, workerMountFile))
- if (uri_worker_map_alloc(&uw_map, map, logger))
- rc = JK_TRUE;
-
- map_free(&map);
- }
-
- if (!rc) goto initFailed;
-
- rc = JK_FALSE;
- if (map_alloc(&map))
- {
- if (map_read_properties(map, workerFile))
-#if 0
- /* we add the URI->WORKER MAP since workers using AJP14 will feed it */
- worker_env.uri_to_worker = &uw_map;
- GETVARIABLE("SERVER_SOFTWARE", &worker_env.server_name, "Lotus Domino");
-#endif
- if (wc_open(map, &worker_env, logger))
- rc = JK_TRUE;
-
- map_free(&map);
- }
-
- if (!rc) goto initFailed;
-
- initDone = JK_TRUE;
-
filterInitData->appFilterVersion = kInterfaceVersion;
filterInitData->eventFlags = kFilterParsedRequest;
strcpy(filterInitData->filterDesc, FILTERDESC);
@@ -639,15 +676,12 @@
*/
DLLEXPORT unsigned int HttpFilterProc(FilterContext *context, unsigned int eventType, void *eventData)
{
- if (initDone)
+ switch (eventType)
{
- switch (eventType)
- {
- case kFilterParsedRequest:
- return ParsedRequest(context, (FilterParsedRequest *) eventData);
- default:
- break;
- }
+ case kFilterParsedRequest:
+ return ParsedRequest(context, (FilterParsedRequest *) eventData);
+ default:
+ break;
}
return kFilterNotHandled;
}
@@ -683,65 +717,6 @@
return kFilterHandledRequest;
}
-/* Get the value of a server (CGI) variable as a string
- */
-static int GetVariable(private_ws_t *ws, char *hdrName,
- char *buf, DWORD bufsz, char **dest, const char *dflt)
-{
- int errID;
-
- if (ws->context->GetServerVariable(ws->context, hdrName, buf, bufsz, &errID))
- *dest = jk_pool_strdup(&ws->p, buf);
- else
- *dest = jk_pool_strdup(&ws->p, dflt);
-
- DEBUG(("%s = %s\n", hdrName, *dest));
-
- return JK_TRUE;
-}
-
-/* Get the value of a server (CGI) variable as an integer
- */
-static int GetVariableInt(private_ws_t *ws, char *hdrName,
- char *buf, DWORD bufsz, int *dest, int dflt)
-{
- int errID;
-
- if (ws->context->GetServerVariable(ws->context, hdrName, buf, bufsz, &errID))
- *dest = atoi(buf);
- else
- *dest = dflt;
-
- DEBUG(("%s = %d\n", hdrName, *dest));
-
- return JK_TRUE;
-}
-/* Get the value of a server (CGI) variable as an integer
- */
-static int GetVariableBool(private_ws_t *ws, char *hdrName,
- char *buf, DWORD bufsz, int *dest, int dflt)
-{
- int errID;
-
- if (ws->context->GetServerVariable(ws->context, hdrName, buf, bufsz, &errID))
- {
- if (isdigit(buf[0]))
- *dest = atoi(buf) != 0;
- else if (NoCaseStrCmp(buf, "yes") == 0 || NoCaseStrCmp(buf, "on") == 0)
- *dest = 1;
- else
- *dest = 0;
- }
- else
- {
- *dest = dflt;
- }
-
- DEBUG(("%s = %d\n", hdrName, *dest));
-
- return JK_TRUE;
-}
-
/* Allocate space for a string given a start pointer and an end pointer
* and return a pointer to the allocated, copied string.
*/
@@ -814,13 +789,6 @@
return hdrCount;
}
-/* A couple of utility macros to supply standard arguments to GetVariable() and
- * GetVariableInt().
- */
-#define GETVARIABLE(name, dest, dflt) GetVariable(ws, (name), workBuf, sizeof(workBuf), (dest), (dflt))
-#define GETVARIABLEINT(name, dest, dflt) GetVariableInt(ws, (name), workBuf, sizeof(workBuf), (dest), (dflt))
-#define GETVARIABLEBOOL(name, dest, dflt) GetVariableBool(ws, (name), workBuf, sizeof(workBuf), (dest), (dflt))
-
/* Set up all the necessary jk_* workspace based on the current HTTP request.
*/
static int InitService(private_ws_t *ws, jk_ws_service_t *s)
@@ -864,35 +832,37 @@
GETVARIABLE("REMOTE_ADDR", &s->remote_addr, "");
GETVARIABLE("SERVER_NAME", &s->server_name, "");
GETVARIABLEINT("SERVER_PORT", &s->server_port, 80);
- GETVARIABLE("SERVER_SOFTWARE", &s->server_software, "Lotus Domino");
+ GETVARIABLE("SERVER_SOFTWARE", &s->server_software, SERVERDFLT);
GETVARIABLEINT("CONTENT_LENGTH", &s->content_length, 0);
-
+
+
/* SSL Support
*/
GETVARIABLEBOOL("HTTPS", &s->is_ssl, 0);
+
+ if (ws->reqData->requestMethod < 0 ||
+ ws->reqData->requestMethod >= sizeof(methodName) / sizeof(methodName[0]))
+ return JK_FALSE;
+
+ s->method = methodName[ws->reqData->requestMethod];
+
+ s->headers_names = NULL;
+ s->headers_values = NULL;
+ s->num_headers = 0;
s->ssl_cert_len = fr.clientCertLen;
s->ssl_cert = fr.clientCert;
s->ssl_cipher = NULL; /* required by Servlet 2.3 Api */
s->ssl_session = NULL;
- s->ssl_key_size = -1; /* required by Servlet 2.3 Api, added in jtc */
-
- if (ws->reqData->requestMethod < 0 ||
- ws->reqData->requestMethod >= sizeof(methodName) / sizeof(methodName[0]))
- return JK_FALSE;
-
- s->method = methodName[ws->reqData->requestMethod];
-
- s->headers_names = NULL;
- s->headers_values = NULL;
- s->num_headers = 0;
-
- /* There's no point in doing this because Domino never seems to
- * set any of these CGI variables.
- */
+
+#if FOR_TOMCAT >= TOMCAT400
+ s->ssl_key_size = -1; /* required by Servlet 2.3 Api, added in jtc */
+#endif
+
+ if (s->is_ssl)
+ {
+ int dummy;
#if 0
- if (s->is_ssl)
- {
char *sslNames[] =
{
"CERT_ISSUER", "CERT_SUBJECT", "CERT_COOKIE", "CERT_FLAGS", "CERT_SERIALNUMBER",
@@ -904,25 +874,38 @@
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL
};
+
unsigned i, varCount = 0;
+#endif
DEBUG(("SSL request\n"));
-
+
+#if FOR_TOMCAT >= TOMCAT400
+ /* Read the variable into a dummy variable: we do this for the side effect of
+ * reading it into workBuf.
+ */
+ GETVARIABLEINT("HTTPS_KEYSIZE", &dummy, 0);
+ if (workBuf[0] == '[')
+ s->ssl_key_size = atoi(workBuf+1);
+#else
+ (void) dummy;
+#endif
+
+#if 0
for (i = 0; i < sizeof(sslNames)/sizeof(sslNames[0]); i++)
{
GETVARIABLE(sslNames[i], &sslValues[i], NULL);
if (sslValues[i]) varCount++;
}
- /* Andy, some SSL vars must be mapped directly in s->ssl_cipher,
- * ssl-session and s->ssl_key_size
- * ie:
- * Cipher could be "RC4-MD5"
- * KeySize 128 (bits)
- * SessionID a string containing the UniqID used in SSL dialogue
- */
-
+ /* Andy, some SSL vars must be mapped directly in s->ssl_cipher,
+ * ssl->session and s->ssl_key_size
+ * ie:
+ * Cipher could be "RC4-MD5"
+ * KeySize 128 (bits)
+ * SessionID a string containing the UniqID used in SSL dialogue
+ */
if (varCount > 0)
{
unsigned j;
@@ -942,8 +925,8 @@
}
s->num_attributes = varCount;
}
- }
#endif
+ }
/* Duplicate all the headers now */
@@ -980,6 +963,65 @@
{
char *uri = fr.URL;
char *workerName, *qp;
+
+ if (!initDone)
+ {
+ /* One time initialisation which is deferred so that we have the name of
+ * the server software to plug into worker_env
+ */
+ int ok = JK_FALSE;
+ jk_map_t *map = NULL;
+
+ DEBUG(("Initialising worker map\n"));
+
+ if (map_alloc(&map))
+ {
+ if (map_read_properties(map, workerMountFile))
+ if (uri_worker_map_alloc(&uw_map, map, logger))
+ ok = JK_TRUE;
+ map_free(&map);
+ }
+
+ DEBUG(("Got the URI worker map\n"));
+
+ if (ok)
+ {
+ ok = JK_FALSE;
+ DEBUG(("About to allocate map\n"));
+ if (map_alloc(&map))
+ {
+ DEBUG(("About to read %s\n", workerFile));
+ if (map_read_properties(map, workerFile))
+ {
+#if FOR_TOMCAT >= TOMCAT400
+ char server[256];
+
+ worker_env.uri_to_worker = uw_map;
+ if (context->GetServerVariable(context, "SERVER_SOFTWARE", server, sizeof(server)-1, &errID))
+ worker_env.server_name = jk_pool_strdup(&cfgPool, server);
+ else
+ worker_env.server_name = SERVERDFLT;
+
+ DEBUG(("Server name %s\n", worker_env.server_name));
+
+ if (wc_open(map, &worker_env, logger))
+ ok = JK_TRUE;
+#else
+ if (wc_open(map, logger))
+ ok = JK_TRUE;
+#endif
+ DEBUG(("OK = %d\n", ok));
+ }
+
+ DEBUG(("Read %s, OK = %d\n", workerFile, ok));
+ map_free(&map);
+ }
+ }
+
+ if (!ok) return kFilterError;
+ initDone = JK_TRUE;
+ }
+
if (qp = strchr(uri, '?'), qp != NULL) *qp = '\0';
workerName = map_uri_to_worker(uw_map, uri, logger);
1.2 +4 -0 jakarta-tomcat-connectors/jk/native/domino/HISTORY
Index: HISTORY
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/domino/HISTORY,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- HISTORY 2001/06/08 15:06:39 1.1
+++ HISTORY 2001/06/14 14:36:08 1.2
@@ -1,3 +1,10 @@
+$Log: HISTORY,v $
+Revision 1.2 2001/06/14 14:36:08 andya
+Better SSL support, better ajp14 support
+
+
+--- pre cvs log ---
+
20010608 1.0.2 AA
Banished malloc()/free() in favour of jk_pool based memory allocation for configuration data. Added syntax checking and test harness to inifile code.
1.3 +8 -2 jakarta-tomcat-connectors/jk/native/domino/config.h
Index: config.h
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/domino/config.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- config.h 2001/06/04 13:16:08 1.2
+++ config.h 2001/06/14 14:36:08 1.3
@@ -56,12 +56,18 @@
/***************************************************************************
* Description: DSAPI plugin for Lotus Domino *
* Author: Andy Armstrong <an...@tagish.com> *
- * Version: $Revision: 1.2 $ *
+ * Version: $Revision: 1.3 $ *
***************************************************************************/
#ifndef __config_h
#define __config_h
+#define TOMCAT320 320
+#define TOMCAT330 330
+#define TOMCAT400 400
+
+#define FOR_TOMCAT TOMCAT400
+
/* the _memicmp() function is available */
#if defined(WIN32)
@@ -84,6 +90,6 @@
/* #undef NO_CAPI */
#define DEBUG(args) \
- do { /*printf args ;*/ } while (0)
+ do { printf args ; } while (0)
#endif /* __config_h */