hgomez 2004/07/29 00:59:37 Added: ajp/ajplib/test ajp_logon.c ajp_logon.h Log: AJP14 logon phase Revision Changes Path 1.1 jakarta-tomcat-connectors/ajp/ajplib/test/ajp_logon.c Index: ajp_logon.c =================================================================== /*
* Copyright 1999-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ajp_logon.h" #include "ajp.h" /** * Binary to hex C String (null terminated) * * @param org byte array to transform * @param dst string result * @param n len of byte array * @return APR_SUCCESS or error */ static char * hextocstr(apr_byte_t *org, char *dst, int n) { char *os = dst; apr_byte_t v; static char zitohex[] = "0123456789ABCDEF"; while (--n >= 0) { v = *org++; *dst++ = zitohex[v >> 4]; *dst++ = zitohex[v & 0x0f]; } *dst = 0; return (os); } /** * Compute the MD5 of org and (if not null org2) string * * @param org First String to compute MD5 from * @param org2 Second String to compute MD5 from (if null no action) * @param dst Destination MD5 Hex CString * @return APR_SUCCESS or error */ apr_status_t comp_md5(char *org, char *org2, char *dst) { apr_md5_ctx_t ctx; unsigned char buf[AJP14_MD5_DIGESTSIZE + 1]; apr_md5_init(&ctx); apr_md5_update(&ctx, org, (apr_size_t)strlen(org)); if (org2 != NULL) apr_md5_update(&ctx, org2, (apr_size_t)strlen(org2)); apr_md5_final(buf, &ctx); hextocstr(buf, dst, AJP14_MD5_DIGESTSIZE); return APR_SUCCESS; } /** * Decode the Incoming Login Command and build reply * * @param msg AJP Message to be decoded and then filled * @param secret secret string to be used in logon phase * @param servername local server name (ie: Apache 2.0.50) * @return APR_SUCCESS or error */ apr_status_t ajp_handle_login(ajp_msg *msg, char *secret, char *servername) { int status; char *entropy; char computedKey[AJP14_COMPUTED_KEY_LEN]; status = ajp_msg_get_string(msg, &entropy); if (status != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, NULL, "ajp_handle_login(): can't get seed"); return AJP_ELOGFAIL; } ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "ajp_handle_login(): received entropy %s", entropy); comp_md5(entropy, secret, computedKey); ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "ajp_handle_login(): computed md5 (%s/%s) -> (%s)", entropy, secret, computedKey); ajp_msg_reset(msg); /* LOGCOMP CMD */ status = ajp_msg_append_uint8(msg, AJP14_LOGCOMP_CMD); if (status != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, NULL, "ajp_handle_login(): can't log command"); return AJP_ELOGFAIL; } /* COMPUTED-SEED */ status = ajp_msg_append_string(msg, computedKey); if (status != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, NULL, "ajp_handle_login(): can't serialize computed secret"); return AJP_ELOGFAIL; } /* NEGOCIATION OPTION */ status = ajp_msg_append_uint32(msg, AJP14_CONTEXT_INFO_NEG | AJP14_PROTO_SUPPORT_AJP14_NEG); if (status != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, NULL, "ajp_handle_login(): can't append negociation header"); return AJP_ELOGFAIL; } /* SERVER NAME */ status = ajp_msg_append_string(msg, servername); if (status != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, NULL, "ajp_handle_login(): can't serialize server name"); return AJP_ELOGFAIL; } return APR_SUCCESS; } /** * Decode the LogOk Command. After that we're done, the connection is * perfect and ready. * * @param msg AJP Message to be decoded * @return APR_SUCCESS or error */ apr_status ajp_handle_logok(ajp_msg_t *msg) { apr_status_t status; apr_uint32_t negociation; char *server_name; status = ajp_msg_get_uint32(msg, &negociation); nego = msg->getLong(env, msg); if (status != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, NULL, "ajp_handle_logok(): can't get negociation header"); return AJP_ELOGFAIL; } status = ajp_msg_get_string(msg, &server_name); if (status != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, NULL, "ajp_handle_logok(): can't get servlet engine name"); return AJP_ELOGFAIL; } ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "ajp_handle_logok(): Successfully logged to %s", server_name); return APR_SUCCESS; } /** * Decode the Log Nok Command * * @param msg AJP Message to be decoded */ apr_status_t ajp_handle_lognok(ajp_msg_t *msg) { apr_status_t status; apr_uint32_t failurecode; status = ajp_msg_get_uint32(msg, &failurecode); if (status != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, NULL, "ajp_handle_lognok(): can't get failure code"); return AJP_ELOGFAIL; } ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "ajp_handle_logok(): logon failure code is %08lx", (long)failurecode); return APR_SUCCESS; } 1.1 jakarta-tomcat-connectors/ajp/ajplib/test/ajp_logon.h Index: ajp_logon.h =================================================================== /* * Copyright 1999-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * +-------------------------+-------------------------+ * | LOGIN SEED CMD (1 byte) | MD5 of entropy (String) | * +-------------------------+-------------------------+ * * +--------------------+------------------------+------------------------------+ * | LOGOK CMD (1 byte) | NEGOCIED DATA (32bits) | SERVLET ENGINE INFO(CString) | * +--------------------+------------------------+------------------------------+ * * * +---------------------+-----------------------+ * | LOGNOK CMD (1 byte) | FAILURE CODE (32bits) | * +---------------------+-----------------------+ */ /* * Third Login Phase (web server -> servlet engine), md5 of seed + secret is sent */ #define AJP14_LOGCOMP_CMD (apr_byte_t)0x12 /* web-server want context info after login */ #define AJP14_CONTEXT_INFO_NEG 0x80000000 /* web-server want context updates */ #define AJP14_CONTEXT_UPDATE_NEG 0x40000000 /* communication could use AJP14 */ #define AJP14_PROTO_SUPPORT_AJP14_NEG 0x00010000 #define AJP14_ENTROPY_SEED_LEN 32 /* we're using MD5 => 32 chars */ #define AJP14_COMPUTED_KEY_LEN 32 /* we're using MD5 also */ #define AJP14_MD5_DIGESTSIZE 16 --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]