⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jk_handler_logon.c

📁 Tomcat 4.1与WebServer集成组件的源代码包.
💻 C
字号:
/* ========================================================================= * *                                                                           * *                 The Apache Software License,  Version 1.1                 * *                                                                           * *          Copyright (c) 1999-2002 The Apache Software Foundation.          * *                           All rights reserved.                            * *                                                                           * * ========================================================================= * *                                                                           * * Redistribution and use in source and binary forms,  with or without modi- * * fication, are permitted provided that the following conditions are met:   * *                                                                           * * 1. Redistributions of source code  must retain the above copyright notice * *    notice, this list of conditions and the following disclaimer.          * *                                                                           * * 2. Redistributions  in binary  form  must  reproduce the  above copyright * *    notice,  this list of conditions  and the following  disclaimer in the * *    documentation and/or other materials provided with the distribution.   * *                                                                           * * 3. The end-user documentation  included with the redistribution,  if any, * *    must include the following acknowlegement:                             * *                                                                           * *       "This product includes  software developed  by the Apache  Software * *        Foundation <http://www.apache.org/>."                              * *                                                                           * *    Alternately, this acknowlegement may appear in the software itself, if * *    and wherever such third-party acknowlegements normally appear.         * *                                                                           * * 4. The names  "The  Jakarta  Project",  "Jk",  and  "Apache  Software     * *    Foundation"  must not be used  to endorse or promote  products derived * *    from this  software without  prior  written  permission.  For  written * *    permission, please contact <apache@apache.org>.                        * *                                                                           * * 5. Products derived from this software may not be called "Apache" nor may * *    "Apache" appear in their names without prior written permission of the * *    Apache Software Foundation.                                            * *                                                                           * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES * * INCLUDING, BUT NOT LIMITED TO,  THE IMPLIED WARRANTIES OF MERCHANTABILITY * * AND FITNESS FOR  A PARTICULAR PURPOSE  ARE DISCLAIMED.  IN NO EVENT SHALL * * THE APACHE  SOFTWARE  FOUNDATION OR  ITS CONTRIBUTORS  BE LIABLE  FOR ANY * * DIRECT,  INDIRECT,   INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR  CONSEQUENTIAL * * DAMAGES (INCLUDING,  BUT NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE GOODS * * OR SERVICES;  LOSS OF USE,  DATA,  OR PROFITS;  OR BUSINESS INTERRUPTION) * * HOWEVER CAUSED AND  ON ANY  THEORY  OF  LIABILITY,  WHETHER IN  CONTRACT, * * STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * * ANY  WAY  OUT OF  THE  USE OF  THIS  SOFTWARE,  EVEN  IF  ADVISED  OF THE * * POSSIBILITY OF SUCH DAMAGE.                                               * *                                                                           * * ========================================================================= * *                                                                           * * This software  consists of voluntary  contributions made  by many indivi- * * duals on behalf of the  Apache Software Foundation.  For more information * * on the Apache Software Foundation, please see <http://www.apache.org/>.   * *                                                                           * * ========================================================================= *//** * Description: AJP14 Login handler * Author:      Henri Gomez <hgomez@slib.fr> * Version:     $Revision: 1.19 $                                           */#include "jk_global.h"#include "jk_pool.h"#include "jk_msg.h"#include "jk_md5.h"#include "jk_logger.h"#include "jk_service.h"#include "jk_env.h"#include "jk_handler.h"#include "jk_registry.h"/* Private definitions *//* * Third Login Phase (web server -> servlet engine), md5 of seed + secret is sent */#define AJP14_LOGCOMP_CMD	(unsigned char)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 *//* * Decode the Login Command * * +-------------------------+---------------------------+ * | LOGIN SEED CMD (1 byte) | MD5 of entropy (String) | * +-------------------------+---------------------------+ * * Build the reply:  *   byte    LOGCOMP *   String  MD5 of random + Secret key *   long    negotiation *   String  serverName * */static int JK_METHOD jk2_handler_login(jk_env_t *env, void *target,                                        jk_endpoint_t *ae, jk_msg_t   *msg ){    int rc;    char *entropy;    char computedKey[AJP14_COMPUTED_KEY_LEN];    char *secret=ae->worker->secret;    long negociation;        entropy= msg->getString( env, msg );    if( entropy==NULL ) {        env->l->jkLog(env, env->l, JK_LOG_ERROR,                      "Error ajp14_unmarshal_login_seed - can't get seed\n");        return JK_HANDLER_FATAL;    }    env->l->jkLog(env, env->l, JK_LOG_INFO,                  "handle.logseed() received entropy %s\n", entropy);        jk2_md5((const unsigned char *)entropy,           (const unsigned char *)secret, computedKey);    env->l->jkLog(env, env->l, JK_LOG_DEBUG,                  "Into ajp14_compute_md5 (%s/%s) -> (%s)\n",                  entropy, secret, computedKey);        msg->reset( env, msg );    env->l->jkLog(env, env->l, JK_LOG_DEBUG,                  "Into ajp14_marshal_login_comp_into_msgb\n");    rc=msg->appendByte( env, msg, AJP14_LOGCOMP_CMD);    if (rc!=JK_OK )        return JK_HANDLER_FATAL;    /* COMPUTED-SEED */    rc= msg->appendString( env, msg, (const char *)computedKey);    if( rc!=JK_OK ) {        env->l->jkLog(env, env->l, JK_LOG_ERROR,                 "handler.loginSecret() error serializing computed secret\n");        return JK_HANDLER_FATAL;    }    negociation=        (AJP14_CONTEXT_INFO_NEG | AJP14_PROTO_SUPPORT_AJP14_NEG);    msg->appendLong(env, msg, negociation);        rc=msg->appendString(env, msg, ae->worker->workerEnv->server_name);    if ( rc != JK_OK)        return JK_HANDLER_FATAL;        return JK_HANDLER_RESPONSE;}/* * Decode the LogOk Command. After that we're done, the connection is * perfect and ready. * * +--------------------+------------------------+--------------------------- * | LOGOK CMD (1 byte) | NEGOCIED DATA (32bits) | SERVLET ENGINE INFO(CString) * +--------------------+------------------------+--------------------------- * */static int JK_METHOD jk2_handler_logok(jk_env_t *env, void *target,                                        jk_endpoint_t *ae, jk_msg_t   *msg ){    unsigned long nego;    char *sname;/*    int rc; */    nego = msg->getLong(env, msg);        if (nego == 0xFFFFFFFF) {        env->l->jkLog(env, env->l, JK_LOG_ERROR,                      "handler.log_ok()  can't get negociated data\n");        return JK_HANDLER_FATAL;    }        sname = (char *)msg->getString(env, msg);        if (! sname) {        env->l->jkLog(env, env->l, JK_LOG_ERROR,                      "handler.logon() Error getting servlet engine name\n");        return JK_HANDLER_FATAL;    }        /* take care of removing previously allocated data */    /* XXXXXXXXX NEED A SUB POOL !!!! */    /*      if (ae->servletContainerName == NULL ||       strcmp( sname, ae->servletContainerName) != 0 )  {      ae->servletContainerName=      (char *)ae->pool->pstrdup( env, ae->pool,sname );      }        env->l->jkLog(env, env->l, JK_LOG_INFO,                  "handler.logok() Successfully connected to %s\n",                  ae->servletContainerName);    */    return JK_HANDLER_LAST;}/* * Decode the Log Nok Command  * * +---------------------+-----------------------+ * | LOGNOK CMD (1 byte) | FAILURE CODE (32bits) | * +---------------------+-----------------------+ * */static int JK_METHOD jk2_handler_lognok(jk_env_t *env, void *target,                                         jk_endpoint_t *ae, jk_msg_t   *msg ){    unsigned long   status;        status = msg->getLong(env, msg);        env->l->jkLog(env, env->l, JK_LOG_INFO,                  "handler.logonFailure() code %08lx", status);        return JK_HANDLER_FATAL;}int JK_METHOD jk2_handler_logon_init( jk_env_t *env, jk_handler_t *_this,                                      jk_workerEnv_t *wEnv) {    wEnv->registerHandler( env, wEnv, "handler.logon",                           "login", JK_HANDLE_LOGON_SEED,                           jk2_handler_login, NULL );        wEnv->registerHandler( env, wEnv, "handler.logon",                           "logOk", JK_HANDLE_LOGON_OK,                            jk2_handler_logok, NULL );        wEnv->registerHandler( env, wEnv, "handler.logon",                           "logNok", JK_HANDLE_LOGON_ERR,                           jk2_handler_lognok, NULL );    return JK_OK;}/** Register handlers */int JK_METHOD jk2_handler_logon_factory( jk_env_t *env, jk_pool_t *pool,                                         jk_bean_t *result,                                         const char *type, const char *name){    jk_handler_t *h;    h=(jk_handler_t *)pool->calloc( env, pool, sizeof( jk_handler_t));    h->init=jk2_handler_logon_init;    result->object=h;        return JK_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -