tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From cos...@apache.org
Subject cvs commit: jakarta-tomcat-connectors/jk/native/common jk_ajp14_worker.c
Date Mon, 26 Nov 2001 17:06:05 GMT
costin      01/11/26 09:06:05

  Modified:    jk/native/common jk_ajp14_worker.c
  Log:
  Move discovery to the separate handler.
  
  Make sure it works in 'backward compatibility' mode if no secret is set.
  
  Revision  Changes    Path
  1.15      +135 -298  jakarta-tomcat-connectors/jk/native/common/jk_ajp14_worker.c
  
  Index: jk_ajp14_worker.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_ajp14_worker.c,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- jk_ajp14_worker.c	2001/11/20 16:58:46	1.14
  +++ jk_ajp14_worker.c	2001/11/26 17:06:05	1.15
  @@ -55,12 +55,15 @@
    *                                                                           *
    * ========================================================================= */
   
  -/***************************************************************************
  - * Description: AJP14 next generation Bi-directional protocol.             *
  - * Author:      Henri Gomez <hgomez@slib.fr>                               *
  - * Version:     $Revision: 1.14 $                                           *
  - ***************************************************************************/
  +/**
  + * Description: AJP14 next generation Bi-directional protocol.
  + *              Backward compatible with Ajp13
  + * Author:      Henri Gomez <hgomez@slib.fr>
  + * Author:      Costin <costin@costin.dnt.ro>                              
  + * Author:      Gal Shachor <shachor@il.ibm.com>                           
  + */
   
  +#include "jk_global.h"
   #include "jk_context.h"
   #include "jk_pool.h"
   #include "jk_util.h"
  @@ -74,237 +77,55 @@
                                      const char *name,
                                      jk_logger_t *l);
   
  -#ifdef WIN32
  -/* define snprint to match windows version */
  -#define snprintf _snprintf
  -#endif
  -
  -/*
  - * AJP14 Autoconf Phase
  - *
  - * CONTEXT QUERY / REPLY
  - */
  -
  -#define MAX_URI_SIZE    512
  -
  -static int handle_discovery(ajp_endpoint_t  *ae,
  -                            jk_worker_env_t *we,
  -                            jk_msg_buf_t    *msg,
  -                            jk_logger_t     *l)
  -{
  -    int                 cmd;
  -    int                 i,j;
  -    jk_login_service_t  *jl = ae->worker->login;
  -    jk_context_item_t   *ci;
  -    jk_context_t        *c;  
  -    char                *buf;
  -
  -#ifndef TESTME
  -
  -    ajp14_marshal_context_query_into_msgb(msg, we->virtual, l);
  -
  -    jk_log(l, JK_LOG_DEBUG, "Into ajp14:discovery - send query\n");
  -
  -    if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE)
  -        return JK_FALSE;
  -
  -    jk_log(l, JK_LOG_DEBUG, "Into ajp14:discovery - wait context reply\n");
  -
  -    jk_b_reset(msg);
  -
  -    if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE)
  -        return JK_FALSE;
  -
  -    if ((cmd = jk_b_get_byte(msg)) != AJP14_CONTEXT_INFO_CMD) {
  -        jk_log(l, JK_LOG_ERROR, "Error ajp14:discovery - awaited command %d, received %d\n",
AJP14_CONTEXT_INFO_CMD, cmd);
  -        return JK_FALSE;
  -    }
  -
  -    if (context_alloc(&c, we->virtual) != JK_TRUE) {
  -        jk_log(l, JK_LOG_ERROR, "Error ajp14:discovery - can't allocate context room\n");
  -        return JK_FALSE;
  -    }
  - 
  -    if (ajp14_unmarshal_context_info(msg, c, l) != JK_TRUE) {
  -        jk_log(l, JK_LOG_ERROR, "Error ajp14:discovery - can't get context reply\n");
  -        return JK_FALSE;
  -    }
  -
  -    jk_log(l, JK_LOG_DEBUG, "Into ajp14:discovery - received context\n");
  -
  -    buf = malloc(MAX_URI_SIZE);      /* Really a very long URI */
  -
  -    if (! buf) {
  -        jk_log(l, JK_LOG_ERROR, "Error ajp14:discovery - can't alloc buf\n");
  -        return JK_FALSE;
  -    }
  -
  -    for (i = 0; i < c->size; i++) {
  -        ci = c->contexts[i];
  -        for (j = 0; j < ci->size; j++) {
  -
  -#ifndef USE_SPRINTF
  -            snprintf(buf, MAX_URI_SIZE - 1, "/%s/%s", ci->cbase, ci->uris[j]);
  -#else
  -            sprintf(buf, "/%s/%s", ci->cbase, ci->uris[j]);
  -#endif
  -
  -            jk_log(l, JK_LOG_INFO, "Into ajp14:discovery - worker %s will handle uri %s
in context %s [%s]\n",
  -                    ae->worker->name, ci->uris[j], ci->cbase, buf);
  -
  -            uri_worker_map_add(we->uri_to_worker, buf, ae->worker->name, l);
  -        }
  -    }
  -
  -    free(buf);
  -    context_free(&c);
  -
  -#else 
  -
  -    uri_worker_map_add(we->uri_to_worker, "/examples/servlet/*", ae->worker->name,
l);
  -    uri_worker_map_add(we->uri_to_worker, "/examples/*.jsp", ae->worker->name,
l);
  -    uri_worker_map_add(we->uri_to_worker, "/examples/*.gif", ae->worker->name,
l);
  -
  -#endif 
  -
  -    return JK_TRUE;
  -}
  -
  -/* 
  - * AJP14 Logon Phase 
  - *
  - * INIT + REPLY / NEGO + REPLY 
  - */
  -
  -static int handle_logon(ajp_endpoint_t *ae,
  -					   jk_msg_buf_t	   *msg,
  -					   jk_logger_t     *l)
  -{
  -	int	cmd;
  -
  -	jk_login_service_t *jl = ae->worker->login;
  -
  -	ajp14_marshal_login_init_into_msgb(msg, jl, l);
  -
  -	jk_log(l, JK_LOG_DEBUG, "Into ajp14:logon - send init\n");
  -
  -	if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE)	
  -		return JK_FALSE;
  - 
  -	jk_log(l, JK_LOG_DEBUG, "Into ajp14:logon - wait init reply\n");
  -
  -	jk_b_reset(msg);
  -
  -	if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE)
  -		return JK_FALSE;
  -
  -	if ((cmd = jk_b_get_byte(msg)) != AJP14_LOGSEED_CMD) {
  -		jk_log(l, JK_LOG_ERROR, "Error ajp14:logon: awaited command %d, received %d\n", AJP14_LOGSEED_CMD,
cmd);
  -		return JK_FALSE;
  -	}
  -
  -	if (ajp14_unmarshal_login_seed(msg, jl, l) != JK_TRUE)
  -		return JK_FALSE;
  -				
  -	jk_log(l, JK_LOG_DEBUG, "Into ajp14:logon - received entropy %s\n", jl->entropy);
  -
  -	ajp14_compute_md5(jl, l);
  -
  -	if (ajp14_marshal_login_comp_into_msgb(msg, jl, l) != JK_TRUE)
  -		return JK_FALSE;
  -  	
  -	if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) 
  -		return JK_FALSE;
  -
  -	jk_b_reset(msg);
  -
  -	if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE)
  -		return JK_FALSE;
  -
  -	switch (jk_b_get_byte(msg)) {
  -
  -	case AJP14_LOGOK_CMD  :	
  -		if (ajp14_unmarshal_log_ok(msg, jl, l) == JK_TRUE) {
  -			jk_log(l, JK_LOG_DEBUG, "Successfully connected to servlet-engine %s\n", jl->servlet_engine_name);
  -			return JK_TRUE;
  -		}
  -		break;
  -		
  -	case AJP14_LOGNOK_CMD :
  -		ajp14_unmarshal_log_nok(msg, l);
  -		break;
  -	}
  -
  -	return JK_FALSE;
  -}
  -
  -static int logon(ajp_endpoint_t *ae,
  -                jk_logger_t    *l)
  -{
  -	jk_pool_t          *p = &ae->pool;
  -	jk_msg_buf_t	   *msg;
  -	int					rc;
  -
  -	jk_log(l, JK_LOG_DEBUG, "Into ajp14:logon\n");
  -
  -	msg = jk_b_new(p);
  -	jk_b_set_buffer_size(msg, DEF_BUFFER_SZ);
  -	
  -	if ((rc = handle_logon(ae, msg, l)) == JK_FALSE) 
  -		ajp_close_endpoint(ae, l);
  -
  -	return rc;
  -}
  -
  -static int discovery(ajp_endpoint_t *ae,
  -                     jk_worker_env_t *we,
  -                     jk_logger_t    *l)
  -{
  -    jk_pool_t          *p = &ae->pool;
  -    jk_msg_buf_t       *msg;
  -    int                 rc;
   
  -    jk_log(l, JK_LOG_DEBUG, "Into ajp14:discovery\n");
  +/* Ajp14 methods - XXX move to handler abstraction */
  +int logon(ajp_endpoint_t *ae,
  +          jk_logger_t    *l);
  +
  +int discovery(ajp_endpoint_t *ae,
  +              jk_worker_env_t *we,
  +              jk_logger_t    *l);
   
  -    msg = jk_b_new(p);
  -    jk_b_set_buffer_size(msg, DEF_BUFFER_SZ);
  -
  -    if ((rc = handle_discovery(ae, we, msg, l)) == JK_FALSE)
  -        ajp_close_endpoint(ae, l);
  -
  -    return rc;
  -}
  -
   /* -------------------- Method -------------------- */
   static int JK_METHOD validate(jk_worker_t *pThis,
                                 jk_map_t    *props,
                                 jk_worker_env_t *we,
                                 jk_logger_t *l)
   {   
  -	ajp_worker_t *aw;
  -	char * secret_key;
  -
  -    if (ajp_validate(pThis, props, we, l, AJP14_PROTO) == JK_FALSE)
  -		return JK_FALSE;
  +    ajp_worker_t *aw;
  +    char * secret_key;
  +    int proto=AJP14_PROTO;
   
  -   aw = pThis->worker_private;
  -
  -   secret_key = jk_get_worker_secret_key(props, aw->name);
  -
  -   if ((!secret_key) || (!strlen(secret_key))) {
  -		jk_log(l, JK_LOG_ERROR, "validate error, empty or missing secretkey\n");
  -		return JK_FALSE;
  -	}
  -
  -	/* jk_log(l, JK_LOG_DEBUG, "Into ajp14:validate - secret_key=%s\n", secret_key); */
  -	return JK_TRUE;
  +    aw = pThis->worker_private;
  +    secret_key = jk_get_worker_secret_key(props, aw->name);
  +    
  +    if ((!secret_key) || (!strlen(secret_key))) {
  +        jk_log(l, JK_LOG_ERROR,
  +               "No secretkey, defaulting to unauthenticated AJP13\n");
  +        proto=AJP13_PROTO;
  +        aw->proto= AJP13_PROTO;
  +        aw->logon= NULL; 
  +    }
  +    
  +    if (ajp_validate(pThis, props, we, l, proto) == JK_FALSE)
  +        return JK_FALSE;
  +    
  +    /* jk_log(l, JK_LOG_DEBUG,
  +       "Into ajp14:validate - secret_key=%s\n", secret_key); */
  +    return JK_TRUE;
   }
   
   static int JK_METHOD get_endpoint(jk_worker_t    *pThis,
                                     jk_endpoint_t **pend,
                                     jk_logger_t    *l)
   {
  -    return (ajp_get_endpoint(pThis, pend, l, AJP14_PROTO));
  +    ajp_worker_t *aw=pThis->worker_private;
  +
  +    if( aw->login->secret_key ==NULL ) {
  +        return (ajp_get_endpoint(pThis, pend, l, AJP13_PROTO));
  +    } else {
  +        return (ajp_get_endpoint(pThis, pend, l, AJP14_PROTO));
  +    }
   }
   
   static int JK_METHOD init(jk_worker_t *pThis,
  @@ -312,73 +133,85 @@
                             jk_worker_env_t *we,
                             jk_logger_t *l)
   {
  -	ajp_worker_t   *aw;
  -	ajp_endpoint_t *ae;
  -	jk_endpoint_t  *je;
  +    ajp_worker_t   *aw=pThis->worker_private;
  +    ajp_endpoint_t *ae;
  +    jk_endpoint_t  *je;
       int             rc;
  -
  -   	if (ajp_init(pThis, props, we, l, AJP14_PROTO) == JK_FALSE)
  -		return JK_FALSE;
  -
  -   	aw = pThis->worker_private;
  -
  -	/* Set Secret Key (used at logon time) */	
  -	aw->login->secret_key = strdup(jk_get_worker_secret_key(props, aw->name));
  -
  -	if (aw->login->secret_key == NULL) {
  -		jk_log(l, JK_LOG_ERROR, "can't malloc secret_key\n");
  -		return JK_FALSE;
  -	}
  -
  -	/* Set WebServerName (used at logon time) */
  -	aw->login->web_server_name = strdup(we->server_name);
  -
  -	if (aw->login->web_server_name == NULL) {
  -		jk_log(l, JK_LOG_ERROR, "can't malloc web_server_name\n");
  -		return JK_FALSE;
  -	}
  -
  -	if (get_endpoint(pThis, &je, l) == JK_FALSE)
  -		return JK_FALSE;
  -	
  -	ae = je->endpoint_private;
  +    char * secret_key;
  +    int proto=AJP14_PROTO;
  +    
  +    secret_key = jk_get_worker_secret_key(props, aw->name);
  +    
  +    if( secret_key==NULL ) {
  +        proto=AJP13_PROTO;
  +        aw->proto= AJP13_PROTO;
  +        aw->logon= NULL; 
  +    } else {
  +        /* Set Secret Key (used at logon time) */	
  +        aw->login->secret_key = strdup(secret_key);
  +    }
   
  -	if (ajp_connect_to_endpoint(ae, l) == JK_TRUE) {
  +    if (ajp_init(pThis, props, we, l, proto) == JK_FALSE)
  +        return JK_FALSE;
  +    
  +    if (aw->login->secret_key == NULL) {
  +        /* No extra initialization for AJP13 */
  +        return JK_TRUE;
  +    }
   
  +    /* -------------------- Ajp14 discovery -------------------- */
  +    
  +    /* Set WebServerName (used at logon time) */
  +    aw->login->web_server_name = strdup(we->server_name);
  +    
  +    if (aw->login->web_server_name == NULL) {
  +        jk_log(l, JK_LOG_ERROR, "can't malloc web_server_name\n");
  +        return JK_FALSE;
  +    }
  +    
  +    if (get_endpoint(pThis, &je, l) == JK_FALSE)
  +        return JK_FALSE;
  +    
  +    ae = je->endpoint_private;
  +    
  +    if (ajp_connect_to_endpoint(ae, l) == JK_TRUE) {
  +        
   	/* connection stage passed - try to get context info
   	 * this is the long awaited autoconf feature :)
   	 */
           rc = discovery(ae, we, l);
  -		ajp_close_endpoint(ae, l);
  +        ajp_close_endpoint(ae, l);
           return rc;
  -	}
  -
  -	return JK_TRUE;
  -}
  +    }
       
  +    return JK_TRUE;
  +}
  +
   
   static int JK_METHOD destroy(jk_worker_t **pThis,
                                jk_logger_t *l)
   {
  -	ajp_worker_t *aw = (*pThis)->worker_private;
  -
  -	if (aw->login) {
  -
  -		if (aw->login->web_server_name) {
  -			free(aw->login->web_server_name);
  -			aw->login->web_server_name = NULL;
  -		}
  -
  -		if (aw->login->secret_key) {
  -			free(aw->login->secret_key);
  -			aw->login->secret_key = NULL;
  -		}
  -
  -		free(aw->login);
  -		aw->login = NULL;
  -	}
  -
  -    return (ajp_destroy(pThis, l, AJP14_PROTO));
  +    ajp_worker_t *aw = (*pThis)->worker_private;
  +    
  +    if (aw->login != NULL &&
  +        aw->login->secret_key != NULL ) {
  +        /* Ajp14-specific initialization */
  +        if (aw->login->web_server_name) {
  +            free(aw->login->web_server_name);
  +            aw->login->web_server_name = NULL;
  +        }
  +        
  +        if (aw->login->secret_key) {
  +            free(aw->login->secret_key);
  +            aw->login->secret_key = NULL;
  +        }
  +        
  +        free(aw->login);
  +        aw->login = NULL;
  +        return (ajp_destroy(pThis, l, AJP14_PROTO));
  +    } else {
  +        return (ajp_destroy(pThis, l, AJP13_PROTO));
  +    }    
   }
   
   int JK_METHOD ajp14_worker_factory(jk_worker_t **w,
  @@ -395,43 +228,47 @@
       }
   
       if (! aw) {
  -        jk_log(l, JK_LOG_ERROR, "In ajp14_worker_factory, malloc of private data failed\n");
  +        jk_log(l, JK_LOG_ERROR,
  +               "In ajp14_worker_factory, malloc of private data failed\n");
           return JK_FALSE;
       }
   
       aw->name = strdup(name);
  -   
  +    
       if (! aw->name) {
           free(aw);
  -        jk_log(l, JK_LOG_ERROR, "In ajp14_worker_factory, malloc failed for name\n");
  +        jk_log(l, JK_LOG_ERROR,
  +               "In ajp14_worker_factory, malloc failed for name\n");
           return JK_FALSE;
       }
   
  -    aw->proto                  = AJP14_PROTO;
  +    aw->proto= AJP14_PROTO;
   
  -    aw->login                  = (jk_login_service_t *)malloc(sizeof(jk_login_service_t));
  +    aw->login= (jk_login_service_t *)malloc(sizeof(jk_login_service_t));
   
  -	if (aw->login == NULL) {
  -		jk_log(l, JK_LOG_ERROR, "In ajp14_worker_factory, malloc failed for login area\n");
  -		return JK_FALSE;
  -	}
  +    if (aw->login == NULL) {
  +        jk_log(l, JK_LOG_ERROR,
  +               "In ajp14_worker_factory, malloc failed for login area\n");
  +        return JK_FALSE;
  +    }
   	
  -	memset(aw->login, 0, sizeof(jk_login_service_t));
  -
  -	aw->login->negociation	    = (AJP14_CONTEXT_INFO_NEG | AJP14_PROTO_SUPPORT_AJP14_NEG);
  -	aw->login->web_server_name  = NULL; /* must be set in init */
  -
  -    aw->ep_cache_sz            = 0;
  -    aw->ep_cache               = NULL;
  -    aw->connect_retry_attempts = AJP_DEF_RETRY_ATTEMPTS;
  -    aw->worker.worker_private  = aw;
  +    memset(aw->login, 0, sizeof(jk_login_service_t));
  +    
  +    aw->login->negociation=
  +        (AJP14_CONTEXT_INFO_NEG | AJP14_PROTO_SUPPORT_AJP14_NEG);
  +    aw->login->web_server_name=NULL; /* must be set in init */
  +    
  +    aw->ep_cache_sz= 0;
  +    aw->ep_cache= NULL;
  +    aw->connect_retry_attempts= AJP_DEF_RETRY_ATTEMPTS;
  +    aw->worker.worker_private= aw;
      
  -    aw->worker.validate        = validate;
  -    aw->worker.init            = init;
  -    aw->worker.get_endpoint    = get_endpoint;
  -    aw->worker.destroy         = destroy;
  +    aw->worker.validate= validate;
  +    aw->worker.init= init;
  +    aw->worker.get_endpoint= get_endpoint;
  +    aw->worker.destroy=destroy;
  +    aw->logon= logon; 
   
  -	aw->logon				   = logon; /* LogOn Handler for AJP14 */
       *w = &aw->worker;
       return JK_TRUE;
   }
  
  
  

--
To unsubscribe, e-mail:   <mailto:tomcat-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:tomcat-dev-help@jakarta.apache.org>


Mime
View raw message