OSDN Git Service

* Changed Feature
[modchxj/mod_chxj.git] / src / chxj_cookie.c
index f7fd1bc..f212eec 100644 (file)
@@ -159,7 +159,7 @@ chxj_save_cookie(request_rec *r)
 
   for (ii=0; ii<headers->nelts; ii++) {
     if (strcasecmp(hentryp[ii].key, "Set-Cookie") == 0) {
-      DBG(r, "REQ[%X] cookie=[%s:%s]", (unsigned int)(apr_size_t)r, hentryp[ii].key, hentryp[ii].val);
+      DBG(r, "REQ[%X] cookie=[%s:%s]", TO_ADDR(r), hentryp[ii].key, hentryp[ii].val);
 
       char* key;
       char* val;
@@ -181,7 +181,7 @@ chxj_save_cookie(request_rec *r)
   }
   for (ii=0; ii<err_headers->nelts; ii++) {
     if (strcasecmp(err_hentryp[ii].key, "Set-Cookie") == 0) {
-      DBG(r, "REQ[%X] cookie=[%s:%s]", (unsigned int)(apr_size_t)r, err_hentryp[ii].key, err_hentryp[ii].val);
+      DBG(r, "REQ[%X] cookie=[%s:%s]", TO_ADDR(r), err_hentryp[ii].key, err_hentryp[ii].val);
 
       char* key;
       char* val;
@@ -465,7 +465,7 @@ chxj_load_cookie(request_rec *r, char *cookie_id)
   char                    *pair;
   char                    *header_cookie;
 
-  DBG(r, "start chxj_load_cookie() cookie_id=[%s]", cookie_id);
+  DBG(r, "REQ[%X] start chxj_load_cookie() cookie_id=[%s]", TO_ADDR(r), cookie_id);
   chxj_cookie_expire_gc(r);
 
   cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
@@ -477,11 +477,11 @@ chxj_load_cookie(request_rec *r, char *cookie_id)
   dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
   entryp = chxj_apply_convrule(r, dconf->convrules);
   if (! entryp) {
-    DBG(r, "end chxj_load_cookie() no pattern");
+    DBG(r, "REQ[%X] end chxj_load_cookie() no pattern", TO_ADDR(r));
     goto on_error0;
   }
   if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
-    DBG(r, "end chxj_load_cookie() CookieOff");
+    DBG(r, "REQ[%X] end chxj_load_cookie() CookieOff", TO_ADDR(r));
     goto on_error0;
   }
   load_cookie_table = apr_table_make(r->pool, 0);
@@ -515,7 +515,7 @@ chxj_load_cookie(request_rec *r, char *cookie_id)
   }
 
   if (load_string) {
-    DBG(r, "load_string=[%s]", load_string);
+    DBG(r, "REQ[%X] load_string=[%s]", TO_ADDR(r), load_string);
     header_cookie = apr_palloc(r->pool, 1);
     header_cookie[0] = 0;
     for (;;) {
@@ -525,7 +525,7 @@ chxj_load_cookie(request_rec *r, char *cookie_id)
       load_string = NULL;
       if (!pair) break;
 
-      DBG(r, "Cookie:[%s]", pair);
+      DBG(r, "REQ[%X] Cookie:[%s]", TO_ADDR(r), pair);
 
       tmp_pair = apr_pstrdup(r->pool, pair);
       val = strchr(tmp_pair, '=');
@@ -533,7 +533,7 @@ chxj_load_cookie(request_rec *r, char *cookie_id)
         key = tmp_pair;
         *val++ = 0;
         apr_table_add(load_cookie_table, key, val);
-        DBG(r, "ADD key:[%s] val:[%s]", key, val);
+        DBG(r, "REQ[%X] ADD key:[%s] val:[%s]", TO_ADDR(r), key, val);
       }
       tmp_pair = apr_pstrdup(r->pool, pair);
       tmp_sem = strchr(tmp_pair, ';'); 
@@ -548,7 +548,7 @@ chxj_load_cookie(request_rec *r, char *cookie_id)
       }
     }
     if (strlen(header_cookie)) {
-      DBG(r, "ADD COOKIE to REQUEST HEADER:[%s]", header_cookie);
+      DBG(r, "REQ[%X] ADD COOKIE to REQUEST HEADER:[%s]", TO_ADDR(r), header_cookie);
       apr_table_add(r->headers_in, "Cookie", header_cookie);
     }
   
@@ -566,13 +566,13 @@ chxj_load_cookie(request_rec *r, char *cookie_id)
     apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id);
   }
 
-  DBG(r, "end   chxj_load_cookie()");
+  DBG(r, "REQ[%X] end   chxj_load_cookie()", TO_ADDR(r));
   return cookie;
 
 
 on_error0:
 
-  DBG(r, "end   chxj_load_cookie()");
+  DBG(r, "REQ[%X] end   chxj_load_cookie()", TO_ADDR(r));
   return NULL;
 }
 
@@ -688,12 +688,16 @@ valid_domain(request_rec *r, const char *value)
   char *val;
   char *pstat;
   char *p = apr_pstrdup(r->pool, value);
-  const char *host = apr_table_get(r->headers_in, HTTP_HOST);
+  char *host = (char *)apr_table_get(r->headers_in, HTTP_HOST);
 
-  DBG(r, "start valid_domain() value:[%s]", value);
-  DBG(r, "host:[%s]", host);
-  if (!host)
+  DBG(r, "REQ[%X] start valid_domain() value:[%s]", TO_ADDR(r), value);
+  if (!host) {
+    DBG(r, "REQ[%X] end valid_domain() value:[%s]", TO_ADDR(r), value);
     return CHXJ_TRUE;
+  }
+  DBG(r, "REQ[%X] host:[%s]", TO_ADDR(r), host);
+  host = s_cut_until_end_hostname(r, apr_pstrdup(r->pool, host));
+  DBG(r, "REQ[%X] host:[%s](after s_cut_until_end_hostname())", TO_ADDR(r), host);
 
   name = apr_strtok(p,"=", &pstat);
   name = qs_trim_string(r->pool, name);
@@ -702,11 +706,12 @@ valid_domain(request_rec *r, const char *value)
   len = strlen(host);
   if (len) {
     if (chxj_strcasenrcmp(r->pool, host, val, strlen(val))) {
-      DBG(r, "not match domain. host domain:[%s] vs value:[%s]", host, val);
+      DBG(r, "REQ[%X] not match domain. host domain:[%s] vs value:[%s]", TO_ADDR(r), host, val);
+      DBG(r, "REQ[%X] end valid_domain() value:[%s]", TO_ADDR(r), value);
       return CHXJ_FALSE;
     }
   }
-  DBG(r, "end valid_domain() value:[%s]", value);
+  DBG(r, "REQ[%X] end valid_domain() value:[%s]", TO_ADDR(r), value);
   return CHXJ_TRUE;
 }
 
@@ -809,7 +814,7 @@ chxj_add_cookie_parameter(request_rec *r, char *value, cookie_t *cookie)
   char *dst;
   char *name = "";
 
-  DBG(r, "start chxj_add_cookie_parameter() cookie_id=[%s]", (cookie) ? cookie->cookie_id : NULL);
+  DBG(r, "REQ[%X] start chxj_add_cookie_parameter() cookie_id=[%s]", TO_ADDR(r), (cookie) ? cookie->cookie_id : NULL);
 
   dst = apr_pstrdup(r->pool, value);
 
@@ -820,7 +825,7 @@ chxj_add_cookie_parameter(request_rec *r, char *value, cookie_t *cookie)
     goto on_error;
 
   if (chxj_cookie_check_host(r, value) != 0) {
-    DBG(r, "end chxj_add_cookie_parameter()(check host)");
+    DBG(r, "REQ[%X] end chxj_add_cookie_parameter()(check host)", TO_ADDR(r));
     goto on_error;
   }
 
@@ -832,18 +837,27 @@ chxj_add_cookie_parameter(request_rec *r, char *value, cookie_t *cookie)
 
   qs = strchr(dst, '?');
   if (qs) {
+    char *sv_qs = qs;
+    qs = chxj_delete_chxj_cc_param(r, ++qs);
+    DBG(r, "REQ[%X] qs:[%s]",TO_ADDR(r), qs);
+    *sv_qs = 0;
+    if (qs && strlen(qs)) {
+      dst = apr_psprintf(r->pool, "%s?%s", dst, qs);
+    }
+  }
+  if (qs) {
     dst = apr_psprintf(r->pool, "%s&%s=%s%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id, name);
   }
   else {
     dst = apr_psprintf(r->pool, "%s?%s=%s%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id, name);
   }
 
-  DBG(r, "end   chxj_add_cookie_parameter() dst=[%s]", dst);
+  DBG(r, "REQ[%X] end   chxj_add_cookie_parameter() dst=[%s]", TO_ADDR(r), dst);
 
   return dst;
 
 on_error:
-  DBG(r, "end   chxj_add_cookie_parameter() (on_error)");
+  DBG(r, "REQ[%X] end   chxj_add_cookie_parameter() (on_error)", TO_ADDR(r));
   return dst;
 }
 
@@ -887,20 +901,36 @@ on_error:
 int
 chxj_cookie_check_host(request_rec *r, char *value) 
 {
-  char* hostnm;
+  char *hostnm;
+  mod_chxj_config *dconf;
 
   DBG(r, "REQ[%X] start chxj_cookie_check_host()", (unsigned int)(apr_size_t)r);
-  DBG(r, "hostname=[%s] vs Location:[%s]", r->hostname, value);
+  DBG(r, "REQ[%X] hostname=[%s] vs Location:[%s]", (unsigned int)(apr_size_t)r, r->hostname, value);
+
+  dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
 
   hostnm = s_get_hostname_from_url(r, value);
   if (hostnm) {
-    if (strcasecmp(hostnm, r->hostname) == 0) {
-      DBG(r, "REQ[%X] end chxj_cookie_check_host() (true)", (unsigned int)(apr_size_t)r);
-      return 0;
+    if (dconf->allowed_cookie_domain) {
+      DBG(r, "REQ[%X] allowed_domain[%s] vs Location:[%s]", (unsigned int)(apr_size_t)r, dconf->allowed_cookie_domain, value);
+      if (chxj_strcasenrcmp(r->pool, hostnm, dconf->allowed_cookie_domain, strlen(dconf->allowed_cookie_domain))) {
+        DBG(r, "REQ[%X] end chxj_cookie_check_host() (false/allowed_domain)", (unsigned int)(apr_size_t)r);
+        return 1;
+      }
+      else {
+        DBG(r, "REQ[%X] end chxj_cookie_check_host() (true/allowed_domain)", (unsigned int)(apr_size_t)r);
+        return 0;
+      }
     }
     else {
-      DBG(r, "REQ[%X] end chxj_cookie_check_host() (false)", (unsigned int)(apr_size_t)r);
-      return 1;
+      if (strcasecmp(hostnm, r->hostname) == 0) {
+        DBG(r, "REQ[%X] end chxj_cookie_check_host() (true)", (unsigned int)(apr_size_t)r);
+        return 0;
+      }
+      else {
+        DBG(r, "REQ[%X] end chxj_cookie_check_host() (false)", (unsigned int)(apr_size_t)r);
+        return 1;
+      }
     }
   }
   DBG(r, "REQ[%X] end chxj_cookie_check_host() (true)", (unsigned int)(apr_size_t)r);