hgomez      01/09/05 02:34:44

  Modified:    src/native/mod_jk/apache2.0 mod_jk.c
  Log:
  workers.properties and log files could be
  defined in relative mode
  SSL support added, using mod_ssl port
  
  Revision  Changes    Path
  1.16      +228 -35   jakarta-tomcat/src/native/mod_jk/apache2.0/mod_jk.c
  
  Index: mod_jk.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/native/mod_jk/apache2.0/mod_jk.c,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- mod_jk.c  2001/09/03 12:03:45     1.15
  +++ mod_jk.c  2001/09/05 09:34:44     1.16
  @@ -120,8 +120,15 @@
       char *cipher_indicator;
       char *sesion_indicator;
   
  +    /*
  +     * Environment variables support
  +     */
  +    int envvars_in_use;
  +    apr_table_t *envvars;
  +
       int was_initialized;
       server_rec *s;
  +
   } jk_server_conf_t;
   
   /*
  @@ -396,10 +403,14 @@
    * of these fields mean.
    */
   static int init_ws_service(apache_private_data_t *private_data,
  -                           jk_ws_service_t *s)
  +                           jk_ws_service_t *s,
  +                           jk_server_conf_t *conf)
   {
       request_rec *r      = private_data->r;
  -    s->jvm_route        = NULL;
  +    char *ssl_temp      = NULL;
  +    s->jvm_route        = NULL; /* Used for sticky session routing */
  +
  +    /* Copy in function pointers (which are really methods) */
       s->start_response   = ws_start_response;
       s->read             = ws_read;
       s->write            = ws_write;
  @@ -422,36 +433,8 @@
                                r->server->port
                                );
   
  -#ifdef NOTNEEDEDFORNOW
  -    /* Wrong:    s->server_name  = (char *)ap_get_server_name( r ); */
  -    s->server_name= (char *)(r->hostname ? r->hostname :
  -                 r->server->server_hostname);
  -
  -
  -    s->server_port= htons( r->connection->local_addr.sin_port );
  -    /* Wrong: s->server_port  = r->server->port; */
  -
  -   
  -    /*    Winners:  htons( r->connection->local_addr.sin_port )
  -                      (r->hostname ? r->hostname :
  -                             r->server->server_hostname),
  -    */
  -    /* printf( "Port %u %u %u %s %s %s %d %d \n",
  -        ap_get_server_port( r ),
  -        htons( r->connection->local_addr.sin_port ),
  -        ntohs( r->connection->local_addr.sin_port ),
  -        ap_get_server_name( r ),
  -        (r->hostname ? r->hostname : r->server->server_hostname),
  -        r->hostname,
  -        r->connection->base_server->port,
  -        r->server->port
  -        );
  -    */
  -#else
        s->server_name  = (char *)ap_get_server_name( r );
        s->server_port  = r->server->port;
  -#endif
  -
       s->server_software = ap_get_server_version();
   
       s->method       = (char *)r->method;
  @@ -467,6 +450,48 @@
       s->ssl_cipher   = NULL;
       s->ssl_session  = NULL;
   
  +    if(conf->ssl_enable || conf->envvars_in_use) {
  +        ap_add_common_vars(r);
  +
  +        if(conf->ssl_enable) {
  +            ssl_temp = (char *)apr_table_get(r->subprocess_env,
  +                                             conf->https_indicator);
  +            if(ssl_temp && !strcasecmp(ssl_temp, "on")) {
  +                s->is_ssl       = JK_TRUE;
  +                s->ssl_cert     = (char *)apr_table_get(r->subprocess_env,
  +                                                        conf->certs_indicator);
  +                if(s->ssl_cert) {
  +                    s->ssl_cert_len = strlen(s->ssl_cert);
  +                }
  +                s->ssl_cipher   = (char *)apr_table_get(r->subprocess_env,
  +                                                        conf->cipher_indicator);
  +                s->ssl_session  = (char *)apr_table_get(r->subprocess_env,
  +                                                        conf->sesion_indicator);
  +            }
  +        }
  +
  +        if(conf->envvars_in_use) {
  +            apr_array_header_t *t = ap_table_elts(conf->envvars);
  +            if(t && t->nelts) {
  +                int i;
  +                apr_table_entry_t *elts = (apr_table_entry_t *)t->elts;
  +                s->attributes_names = ap_palloc(r->pool, sizeof(char *) * t->nelts);
  +                s->attributes_values = ap_palloc(r->pool, sizeof(char *) * 
t->nelts);
  +
  +                for(i = 0 ; i < t->nelts ; i++) {
  +                    s->attributes_names[i] = elts[i].key;
  +                    s->attributes_values[i] = (char 
*)apr_table_get(r->subprocess_env,
  +                                                                   elts[i].key);
  +                    if(!s->attributes_values[i]) {
  +                        s->attributes_values[i] = elts[i].val;
  +                    }
  +                }
  +
  +                s->num_attributes = t->nelts;
  +            }
  +        }
  +    }
  +
       s->headers_names    = NULL;
       s->headers_values   = NULL;
       s->num_headers      = 0;
  @@ -572,10 +597,14 @@
   
       jk_server_conf_t *conf =
           (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module);
  -
  -    conf->worker_file = worker_file;
   
  -    if (stat(worker_file, &statbuf) == -1)
  +    /* we need an absolute path (ap_server_root_relative does the ap_pstrdup) */
  +    conf->worker_file = ap_server_root_relative(cmd->pool,worker_file);
  + 
  +    if (conf->worker_file == NULL)
  +        return "JkWorkersFile file_name invalid";
  + 
  +    if (stat(conf->worker_file, &statbuf) == -1)
           return "Can't find the workers file specified";
   
       return NULL;
  @@ -589,7 +618,11 @@
       jk_server_conf_t *conf =
           (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module);
   
  -    conf->log_file = log_file;
  +    /* we need an absolute path */
  +    conf->log_file = ap_server_root_relative(cmd->pool,log_file);
  + 
  +    if (conf->log_file == NULL)
  +        return "JkLogFile file_name invalid";
   
       return NULL;
   }
  @@ -615,20 +648,149 @@
        return NULL;
   }
        
  +static const char *jk_set_enable_ssl(cmd_parms *cmd,
  +                                     void *dummy,
  +                                     int flag)
  +{
  +    server_rec *s = cmd->server;
  +    jk_server_conf_t *conf =
  +        (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module);
  +
  +    /* Set up our value */
  +    conf->ssl_enable = flag ? JK_TRUE : JK_FALSE;
  +
  +    return NULL;
  +}
  +
  +static const char *jk_set_https_indicator(cmd_parms *cmd,
  +                                          void *dummy,
  +                                          char *indicator)
  +{
  +    server_rec *s = cmd->server;
  +    jk_server_conf_t *conf =
  +        (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module);
  +
  +    conf->https_indicator = indicator;
  +
  +    return NULL;
  +}
  +
  +static const char *jk_set_certs_indicator(cmd_parms *cmd,
  +                                          void *dummy,
  +                                          char *indicator)
  +{
  +    server_rec *s = cmd->server;
  +    jk_server_conf_t *conf =
  +        (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module);
  +
  +    conf->certs_indicator = indicator;
  +
  +    return NULL;
  +}
  +
  +static const char *jk_set_cipher_indicator(cmd_parms *cmd,
  +                                           void *dummy,
  +                                           char *indicator)
  +{
  +    server_rec *s = cmd->server;
  +    jk_server_conf_t *conf =
  +        (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module);
  +
  +    conf->cipher_indicator = indicator;
  +
  +    return NULL;
  +}
  +
  +static const char *jk_set_session_indicator(cmd_parms *cmd,
  +                                            void *dummy,
  +                                            char *indicator)
  +{
  +    server_rec *s = cmd->server;
  +    jk_server_conf_t *conf =
  +        (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module);
  +
  +    conf->sesion_indicator = indicator;
  +
  +    return NULL;
  +}
  +
  +static const char *jk_add_env_var(cmd_parms *cmd,
  +                                  void *dummy,
  +                                  char *env_name,
  +                                  char *default_value)
  +{
  +    server_rec *s = cmd->server;
  +    jk_server_conf_t *conf =
  +        (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module);
  +
  +    conf->envvars_in_use = JK_TRUE;
  +
  +    ap_table_add(conf->envvars, env_name, default_value);
  +
  +    return NULL;
  +}
  +
  +
   static const command_rec jk_cmds[] =
   {
  +    /*
  +     * JkWorkersFile specifies a full path to the location of the worker
  +     * properties file.
  +     *
  +     * This file defines the different workers used by apache to redirect
  +     * servlet requests.
  +     */
       {"JkWorkersFile", jk_set_worker_file, NULL, RSRC_CONF, TAKE1,
        "the name of a worker file for the Jakarta servlet containers"},
  +    /*
  +     * JkMount mounts a url prefix to a worker (the worker need to be
  +     * defined in the worker properties file.
  +     */
       {"JkMount", jk_mount_context, NULL, RSRC_CONF, TAKE23,
        "A mount point from a context to a Tomcat worker"},
  +    /*
  +     * JkMountCopy specifies if mod_jk should copy the mount points
  +     * from the main server to the virtual servers.
  +     */
       {"JkMountCopy", jk_set_mountcopy, NULL, RSRC_CONF, FLAG,
        "Should the base server mounts be copied to the virtual server"},
  +    /*
  +     * JkLogFile & JkLogLevel specifies to where should the plugin log
  +     * its information and how much.
  +     */
       {"JkLogFile", jk_set_log_file, NULL, RSRC_CONF, TAKE1,
        "Full path to the Jakarta Tomcat module log file"},
       {"JkLogLevel", jk_set_log_level, NULL, RSRC_CONF, TAKE1,
        "The Jakarta Tomcat module log level, can be debug, info, error or emerg"},
       {"JkLogStampFormat", jk_set_log_fmt, NULL, RSRC_CONF, TAKE1,
        "The Jakarta Tomcat module log format, follow strftime synthax"},
  +    /*
  +     * Apache 1.3 used to have multiple SSL modules (for example apache_ssl, 
stronghold
  +     * IHS ...). 
  +     * in Apache 2.0, we've got now mod_ssl and mod_tls.
  +     * Each of these can have a different SSL environment names
  +     * The following properties let the administrator specify the envoiroment
  +     * variables names.
  +     *
  +     * HTTPS - indication for SSL
  +     * CERTS - Base64-Der-encoded client certificates.
  +     * CIPHER - A string specifing the ciphers suite in use.
  +     * SESSION - A string specifing the current SSL session.
  +     */
  +    {"JkHTTPSIndicator", jk_set_https_indicator, NULL, RSRC_CONF, TAKE1,
  +     "Name of the Apache environment that contains SSL indication"},
  +    {"JkCERTSIndicator", jk_set_certs_indicator, NULL, RSRC_CONF, TAKE1,
  +     "Name of the Apache environment that contains SSL client certificates"},
  +    {"JkCIPHERIndicator", jk_set_cipher_indicator, NULL, RSRC_CONF, TAKE1,
  +     "Name of the Apache environment that contains SSL client cipher"},
  +    {"JkSESSIONIndicator", jk_set_session_indicator, NULL, RSRC_CONF, TAKE1,
  +     "Name of the Apache environment that contains SSL session"},
  +    {"JkExtractSSL", jk_set_enable_ssl, NULL, RSRC_CONF, FLAG,
  +     "Turns on SSL processing and information gathering by mod_jk"},
  +
  +    {"JkEnvVar", jk_add_env_var, NULL, RSRC_CONF, TAKE2,
  +    "Adds a name of environment variable that should be sent to Tomcat"},
  +
       {NULL}
   };
   
  @@ -696,7 +858,7 @@
               s.ws_private = &private_data;
               s.pool = &private_data.p;            
               
  -            if(init_ws_service(&private_data, &s)) {
  +            if(init_ws_service(&private_data, &s, conf)) {
                   jk_endpoint_t *end = NULL;
   
                /* Use per/thread pool ( or "context" ) to reuse the 
  @@ -761,11 +923,42 @@
       c->mountcopy   = JK_FALSE;
       c->was_initialized = JK_FALSE;
   
  +    /*
  +     * By default we will try to gather SSL info.
  +     * Disable this functionality through JkExtractSSL
  +     */
  +    c->ssl_enable  = JK_TRUE;
  +    /*
  +     * The defaults ssl indicators match those in mod_ssl (seems
  +     * to be in more use).
  +     */
  +    c->https_indicator  = "HTTPS";
  +    c->certs_indicator  = "SSL_CLIENT_CERT";
  +   
  +    /*
  +     * The following (comented out) environment variables match apache_ssl!
  +     * If you are using apache_sslapache_ssl uncomment them (or use the
  +     * configuration directives to set them.
  +     *
  +    c->cipher_indicator = "HTTPS_CIPHER";
  +    c->sesion_indicator = NULL;
  +     */
  +
  +    /*
  +     * The following environment variables match mod_ssl! If you
  +     * are using another module (say apache_ssl) comment them out.
  +     */
  +    c->cipher_indicator = "SSL_CIPHER";
  +    c->sesion_indicator = "SSL_SESSION_ID";
  +
       if(!map_alloc(&(c->uri_to_context))) {
           jk_error_exit(APLOG_MARK, APLOG_EMERG, s, "Memory error");
       }
       c->uw_map = NULL;
       c->s = s;
  +
  +    c->envvars_in_use = JK_FALSE;
  +    c->envvars = apr_table_make(p, 0);
   
       return c;
   }
  
  
  

Reply via email to