2 * Copyright (C) 2005-2008 Atsushi Konno All rights reserved.
3 * Copyright (C) 2005 QSDN,Inc. All rights reserved.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
20 #include "chxj_cookie.h"
21 #include "chxj_url_encode.h"
22 #include "chxj_apply_convrule.h"
23 #include "chxj_str_util.h"
25 #include "ap_release.h"
31 #include "apr_base64.h"
36 #if defined(USE_MYSQL_COOKIE)
37 # include "chxj_mysql.h"
39 #if defined(USE_MEMCACHE_COOKIE)
40 # include "chxj_memcache.h"
44 #define DUMP_HEADERS(X) do { \
46 apr_array_header_t *__headers = (apr_array_header_t*)apr_table_elts((X)); \
47 apr_table_entry_t *__hentryp = (apr_table_entry_t*)__headers->elts; \
48 for (__ii=0; __ii<__headers->nelts; __ii++) { \
49 DBG(r, "key:[%s] val:[%s]", __hentryp[__ii].key, __hentryp[__ii].val); \
55 static char* s_get_hostname_from_url(request_rec* r, char* value);
56 static char* s_cut_until_end_hostname(request_rec*, char* value);
57 static int valid_domain(request_rec *r, const char *value);
58 static int valid_path(request_rec *r, const char *value);
59 static int valid_expires(request_rec *r, const char *value);
60 static int valid_secure(request_rec *r, const char *value);
61 static int check_valid_cookie_attribute(request_rec *r, const char *pair);
63 apr_proc_mutex_t *global_cookie_mutex;
66 alloc_cookie_id(request_rec *r)
70 unsigned char *md5_value;
75 uuid_string = apr_palloc(r->pool, APR_UUID_FORMATTED_LENGTH + 1);
76 memset(uuid_string, 0, APR_UUID_FORMATTED_LENGTH + 1);
77 apr_uuid_format(uuid_string, &uuid);;
79 md5_value = (unsigned char*)apr_palloc(r->pool, APR_MD5_DIGESTSIZE + 1);
80 memset(md5_value, 0, APR_MD5_DIGESTSIZE + 1);
82 retval = apr_md5(md5_value,
83 (const char*)uuid_string,
84 APR_UUID_FORMATTED_LENGTH);
85 if (retval != APR_SUCCESS) {
86 ERR(r, "md5 failed.");
90 cookie_id = apr_palloc(r->pool, apr_base64_encode_len(APR_MD5_DIGESTSIZE)+1);
91 memset(cookie_id, 0, APR_MD5_DIGESTSIZE+1);
92 apr_base64_encode(cookie_id, (char*)md5_value, APR_MD5_DIGESTSIZE);
94 DBG(r, "cookie_id=[%s]", cookie_id);
96 cookie_id = chxj_url_encode(r->pool,cookie_id);
98 DBG(r, "cookie_id=[%s]", cookie_id);
107 chxj_save_cookie(request_rec *r)
110 apr_array_header_t *headers;
111 apr_table_entry_t *hentryp;
112 apr_array_header_t *err_headers;
113 apr_table_entry_t *err_hentryp;
116 mod_chxj_config *dconf;
117 chxjconvrule_entry *entryp;
118 apr_table_t *new_cookie_table;
121 cookie_t *old_cookie;
123 apr_uri_t parsed_uri;
128 DBG(r, "start chxj_save_cookie()");
130 apr_pool_create(&pool, r->pool);
132 cookie = (cookie_t*)apr_palloc(pool, sizeof(cookie_t));
133 cookie->cookie_id = NULL;
138 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
139 entryp = chxj_apply_convrule(r, dconf->convrules);
141 DBG(r, "end chxj_save_cookie() no pattern");
144 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
145 DBG(r, "end chxj_save_cookie() CookieOff");
151 headers = (apr_array_header_t*)apr_table_elts(r->headers_out);
152 hentryp = (apr_table_entry_t*)headers->elts;
153 err_headers = (apr_array_header_t*)apr_table_elts(r->err_headers_out);
154 err_hentryp = (apr_table_entry_t*)err_headers->elts;
157 new_cookie_table = apr_table_make(pool, 0);
159 for (ii=0; ii<headers->nelts; ii++) {
160 if (strcasecmp(hentryp[ii].key, "Set-Cookie") == 0) {
161 DBG(r, "=====================================");
162 DBG(r, "cookie=[%s:%s]", hentryp[ii].key, hentryp[ii].val);
169 buff = apr_pstrdup(pool, hentryp[ii].val);
170 val = strchr(buff, '=');
174 apr_table_add(new_cookie_table, key, val);
175 if (strcasecmp(REFERER_COOKIE_KEY, key) == 0) has_refer++;
180 DBG(r, "=====================================");
183 for (ii=0; ii<err_headers->nelts; ii++) {
184 if (strcasecmp(err_hentryp[ii].key, "Set-Cookie") == 0) {
185 DBG(r, "=====================================");
186 DBG(r, "cookie=[%s:%s]", err_hentryp[ii].key, err_hentryp[ii].val);
193 buff = apr_pstrdup(pool, err_hentryp[ii].val);
194 val = strchr(buff, '=');
198 apr_table_add(new_cookie_table, key, val);
199 if (strcasecmp(REFERER_COOKIE_KEY, key) == 0) has_refer++;
204 DBG(r, "=====================================");
207 apr_table_unset(r->headers_out, "Set-Cookie");
208 apr_table_unset(r->err_headers_out, "Set-Cookie");
211 apr_uri_parse(pool,r->uri, &parsed_uri);
212 refer_string = apr_psprintf(pool,
214 chxj_run_http_scheme(r),
216 apr_uri_unparse(pool,
218 APR_URI_UNP_OMITSITEPART));
219 if (r->args && strlen(r->args)) {
220 refer_string = apr_pstrcat(pool, refer_string, "?", r->args, NULL);
222 apr_table_setn(new_cookie_table, REFERER_COOKIE_KEY, refer_string);
223 DBG(r, "ADD REFER[%s]", refer_string);
229 * check input parameters
231 old_cookie_id = (char*)apr_table_get(r->headers_in, "CHXJ_COOKIE_ID");
233 old_cookie = chxj_load_cookie(r, old_cookie_id);
234 if (old_cookie && old_cookie->cookie_headers) {
235 hentryp = (apr_table_entry_t*)old_cookie->cookie_headers->elts;
236 for (ii=0; ii<old_cookie->cookie_headers->nelts; ii++) {
237 if (hentryp && apr_table_get(new_cookie_table, hentryp[ii].key) == NULL) {
238 apr_table_add(new_cookie_table, hentryp[ii].key, hentryp[ii].val);
242 chxj_delete_cookie(r, old_cookie_id);
243 chxj_delete_cookie_expire(r, old_cookie_id);
249 DBG(r, "end chxj_save_cookie()");
256 cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(new_cookie_table);
257 hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts;
258 apr_size_t store_string_len = 0;
259 for (ii=0; ii<cookie->cookie_headers->nelts; ii++) {
260 if (ii) store_string_len++;
261 store_string_len += (strlen(hentryp[ii].key) + strlen(hentryp[ii].val) + 1);
263 store_string = apr_palloc(pool, store_string_len + 1);
264 memset(store_string, 0, store_string_len + 1);
267 for (ii=0; ii<cookie->cookie_headers->nelts; ii++) {
268 if (ii) store_string[npos++] = '\n';
269 memcpy(&store_string[npos], hentryp[ii].key, strlen(hentryp[ii].key));
270 npos += strlen(hentryp[ii].key);
271 store_string[npos++] = '=';
272 memcpy(&store_string[npos], hentryp[ii].val, strlen(hentryp[ii].val));
273 npos += strlen(hentryp[ii].val);
276 if (old_cookie_id && IS_COOKIE_LAZY(dconf)) {
277 DBG(r, "LAZY COOKIE save");
278 cookie->cookie_id = apr_pstrdup(pool, old_cookie_id);
281 DBG(r, "NO LAZY COOKIE save. old_cookie_id:[%s] LAZY:[%d]", old_cookie_id,IS_COOKIE_LAZY(dconf));
282 cookie->cookie_id = alloc_cookie_id(r);
287 #if defined(USE_MYSQL_COOKIE)
288 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
289 if (! chxj_save_cookie_mysql(r, dconf, cookie->cookie_id, store_string)) {
290 ERR(r, "%s:%d faild: chxj_save_cookie_mysql() cookie_id:[%s]", APLOG_MARK,cookie->cookie_id);
297 #if defined(USE_MEMCACHE_COOKIE)
298 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
299 if (! chxj_save_cookie_memcache(r, dconf, cookie->cookie_id, store_string)) {
300 ERR(r, "%s:%d failed: chxj_save_cookie_memcache() cookie_id:[%s]", APLOG_MARK, cookie->cookie_id);
307 if (IS_COOKIE_STORE_DBM(dconf->cookie_store_type) || ! done_proc) {
308 if (! chxj_save_cookie_dbm(r, dconf, cookie->cookie_id, store_string)) {
309 ERR(r, "%s:%d failed: chxj_save_cookie_dbm() cookie_id:[%s]", APLOG_MARK, cookie->cookie_id);
315 apr_table_unset(r->headers_out, "Set-Cookie");
316 apr_table_unset(r->err_headers_out, "Set-Cookie");
319 chxj_save_cookie_expire(r, cookie);
323 DBG(r, "end chxj_save_cookie()");
333 chxj_update_cookie(request_rec *r, cookie_t *old_cookie)
336 apr_array_header_t *headers;
337 apr_table_entry_t *hentryp;
339 mod_chxj_config *dconf;
340 chxjconvrule_entry *entryp;
344 DBG(r, "start chxj_update_cookie()");
345 if (!old_cookie || ! old_cookie->cookie_headers || ! old_cookie->cookie_id) {
346 DBG(r, "end chxj_update_cookie() (old_cookie is null)");
350 cookie = (cookie_t *)apr_palloc(r->pool, sizeof(cookie_t));
351 cookie->cookie_id = NULL;
353 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
354 entryp = chxj_apply_convrule(r, dconf->convrules);
356 DBG(r, "end chxj_update_cookie() no pattern");
359 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
360 DBG(r, "end chxj_update_cookie() CookieOff");
364 headers = (apr_array_header_t*)apr_table_elts(r->headers_out);
365 hentryp = (apr_table_entry_t*)headers->elts;
367 chxj_delete_cookie(r, old_cookie->cookie_id);
368 chxj_delete_cookie_expire(r, old_cookie->cookie_id);
370 if (IS_COOKIE_LAZY(dconf)) {
372 cookie->cookie_id = apr_pstrdup(r->pool, old_cookie->cookie_id);
375 DBG(r, "NO LAZY MODE");
376 cookie->cookie_id = alloc_cookie_id(r);
379 cookie->cookie_headers = old_cookie->cookie_headers;
380 store_string = apr_palloc(r->pool, 1);
382 hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts;
384 for (ii=0; ii<cookie->cookie_headers->nelts; ii++) {
385 if (ii) store_string = apr_pstrcat(r->pool,
390 DBG(r, "OLD COOKIE VALUE=[%s][%s]", hentryp[ii].key, hentryp[ii].val);
391 store_string = apr_pstrcat(r->pool,
401 #if defined(USE_MYSQL_COOKIE)
402 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
403 if (!chxj_update_cookie_mysql(r, dconf, cookie->cookie_id, store_string)) {
404 ERR(r, "failed: chxj_update_cookie_mysql() cookie_id:[%s]", cookie->cookie_id);
411 #if defined(USE_MEMCACHE_COOKIE)
412 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
413 if (! chxj_update_cookie_memcache(r, dconf, cookie->cookie_id, store_string)) {
414 ERR(r, "failed: chxj_update_cookie_memcache() cookie_id:[%s]", cookie->cookie_id);
420 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
421 if (! chxj_update_cookie_dbm(r, dconf, cookie->cookie_id, store_string)) {
422 ERR(r, "failed: chxj_update_cookie_dbm() cookie_id:[%s]", cookie->cookie_id);
428 chxj_save_cookie_expire(r, cookie);
430 apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id);
434 DBG(r, "end chxj_update_cookie()");
441 * @return loaded data.
444 chxj_load_cookie(request_rec *r, char *cookie_id)
446 mod_chxj_config *dconf;
447 chxjconvrule_entry *entryp;
449 apr_table_t *load_cookie_table;
450 char *load_string = NULL;
457 DBG(r, "start chxj_load_cookie() cookie_id=[%s]", cookie_id);
458 chxj_cookie_expire_gc(r);
460 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
461 cookie->cookie_headers = NULL;
462 cookie->cookie_id = chxj_url_decode(r->pool, apr_pstrdup(r->pool, cookie_id));
463 cookie->cookie_id = chxj_url_encode(r->pool, cookie->cookie_id);
466 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
467 entryp = chxj_apply_convrule(r, dconf->convrules);
469 DBG(r, "end chxj_load_cookie() no pattern");
472 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
473 DBG(r, "end chxj_load_cookie() CookieOff");
476 load_cookie_table = apr_table_make(r->pool, 0);
480 #if defined(USE_MYSQL_COOKIE)
481 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
482 if (! (load_string = chxj_load_cookie_mysql(r, dconf, cookie->cookie_id))) {
483 ERR(r, "%s:%d failed: chxj_load_cookie_mysql() cookie_id:[%s]", APLOG_MARK, cookie_id);
489 #if defined(USE_MEMCACHE_COOKIE)
490 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
491 if (! (load_string = chxj_load_cookie_memcache(r, dconf, cookie->cookie_id))) {
492 ERR(r, "%s:%d failed: chxj_load_cookie_memcache() cookie_id:[%s]", APLOG_MARK,cookie_id);
498 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
499 if (! (load_string = chxj_load_cookie_dbm(r, dconf, cookie->cookie_id))) {
500 ERR(r, "%s:%d failed: chxj_load_cookie_dbm() cookie_id:[%s]", APLOG_MARK,cookie_id);
507 DBG(r, "load_string=[%s]", load_string);
508 header_cookie = apr_palloc(r->pool, 1);
509 header_cookie[0] = 0;
513 pair = apr_strtok(load_string, "\n", &pstat);
517 DBG(r, "Cookie:[%s]", pair);
519 tmp_pair = apr_pstrdup(r->pool, pair);
520 val = strchr(tmp_pair, '=');
524 apr_table_add(load_cookie_table, key, val);
525 DBG(r, "ADD key:[%s] val:[%s]", key, val);
527 tmp_pair = apr_pstrdup(r->pool, pair);
528 tmp_sem = strchr(tmp_pair, ';');
532 if (check_valid_cookie_attribute(r, pair)) {
533 if (strlen(header_cookie))
534 header_cookie = apr_pstrcat(r->pool, header_cookie, ";", NULL);
536 header_cookie = apr_pstrcat(r->pool, header_cookie, tmp_pair, NULL);
539 if (strlen(header_cookie)) {
540 DBG(r, "ADD COOKIE to REQUEST HEADER:[%s]", header_cookie);
541 apr_table_add(r->headers_in, "Cookie", header_cookie);
544 cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(load_cookie_table);
546 if (apr_table_get(r->headers_in, "referer") == NULL) {
547 apr_table_setn(r->headers_in,
549 apr_table_get(load_cookie_table, REFERER_COOKIE_KEY));
553 * save cookie_id to request header.
555 apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id);
558 DBG(r, "end chxj_load_cookie()");
564 DBG(r, "end chxj_load_cookie()");
569 check_valid_cookie_attribute(request_rec *r, const char *value)
580 DBG(r, "start check_valid_cookie_attribute() value:[%s]", value);
582 domain_pair = path_pair = expire_pair = secure_pair = NULL;
583 p = apr_pstrdup(r->pool, value);
585 /* pass first pair */
586 first_pair = apr_strtok(p, ";", &pstat);
589 pair = apr_strtok(NULL, ";", &pstat);
591 pair = qs_trim_string(r->pool, pair);
592 if (STRNCASEEQ('d','D',"domain", pair, sizeof("domain")-1)) {
593 domain_pair = apr_pstrdup(r->pool, pair);
595 else if (STRNCASEEQ('p','P',"path", pair, sizeof("path")-1)) {
596 path_pair = apr_pstrdup(r->pool, pair);
598 else if (STRNCASEEQ('e','E',"expires", pair, sizeof("expires")-1)) {
599 expire_pair = apr_pstrdup(r->pool, pair);
601 else if (STRNCASEEQ('s','S',"secure", pair, sizeof("secure")-1)) {
602 secure_pair = apr_pstrdup(r->pool, pair);
607 if (!valid_domain(r, domain_pair)) {
608 DBG(r, "invalid domain. domain_pair:[%s]", domain_pair);
613 if (!valid_path(r, path_pair)) {
614 DBG(r, "invalid path. path_pair:[%s]", path_pair);
619 if (!valid_expires(r, expire_pair)) {
620 DBG(r, "invalid expire. expire_pair:[%s]", expire_pair);
625 if (!valid_secure(r, secure_pair)) {
626 DBG(r, "invalid secure. secure_pair:[%s]", secure_pair);
630 DBG(r, "end check_valid_cookie_attribute() value:[%s]", value);
636 valid_domain(request_rec *r, const char *value)
642 char *p = apr_pstrdup(r->pool, value);
643 const char *host = apr_table_get(r->headers_in, HTTP_HOST);
645 DBG(r, "start valid_domain() value:[%s]", value);
646 DBG(r, "host:[%s]", host);
650 name = apr_strtok(p,"=", &pstat);
651 name = qs_trim_string(r->pool, name);
652 val = apr_strtok(NULL, "=", &pstat);
653 val = qs_trim_string(r->pool, val);
656 if (chxj_strcasenrcmp(r->pool, host, val, strlen(val))) {
657 DBG(r, "not match domain. host domain:[%s] vs value:[%s]", host, val);
661 DBG(r, "end valid_domain() value:[%s]", value);
667 valid_path(request_rec *r, const char *value)
669 char *p = apr_pstrdup(r->pool, value);
676 DBG(r, "start valid_path() unparsed_uri:[%s] value:[%s]", r->unparsed_uri, value);
677 if (chxj_starts_with(r->unparsed_uri, "http://")) {
678 uri = strchr(&r->unparsed_uri[sizeof("http://")], '/');
680 uri = apr_pstrdup(r->pool, uri);
683 else if (chxj_starts_with(r->unparsed_uri, "https://")) {
684 uri = strchr(&r->unparsed_uri[sizeof("https://")], '/');
686 uri = apr_pstrdup(r->pool, uri);
689 else if (chxj_starts_with(r->unparsed_uri, "/")) {
690 uri = apr_pstrdup(r->pool, r->unparsed_uri);
693 uri = apr_pstrdup(r->pool, "/");
696 if ((tmp = strchr(uri, '?'))) {
699 DBG(r, "uri=[%s]", uri);
700 name = apr_strtok(p, "=", &pstat);
701 val = apr_strtok(NULL, "=", &pstat);
702 name = qs_trim_string(r->pool, name);
703 val = qs_trim_string(r->pool, val);
704 DBG(r, "name=[%s] val=[%s]", name, val);
706 DBG(r, "val:[%s] vs uri:[%s]", val, uri);
707 if (! chxj_starts_with(uri, val)) {
708 DBG(r, "end valid_path() unparsed_uri:[%s] value:[%s] (false)", r->unparsed_uri, value);
711 DBG(r, "end valid_path() unparsed_uri:[%s] value:[%s] (true)", r->unparsed_uri, value);
717 valid_expires(request_rec *r, const char *value)
721 char *p = apr_pstrdup(r->pool, value);
726 DBG(r, "start valid_expire() value:[%s]", value);
727 name = apr_strtok(p, "=", &pstat);
728 val = apr_strtok(NULL, "=", &pstat);
729 DBG(r, "name=[%s] val=[%s]", name, val);
730 now = apr_time_now();
731 expires = chxj_parse_cookie_expires(val);
733 DBG(r, "end valid_expire() value:[%s] (expired)", value);
737 DBG(r, "end valid_expire() value:[%s] (non expired)", value);
743 valid_secure(request_rec *r, const char *value)
746 DBG(r, "start valid_secure() value:[%s]", value);
747 scheme = chxj_apache_run_http_scheme(r);
748 if (strcasecmp("https", scheme)) {
749 DBG(r, "end valid_secure() value:[%s] (non secure)", value);
752 DBG(r, "end valid_secure() value:[%s] (secure)", value);
758 chxj_add_cookie_parameter(request_rec *r, char *value, cookie_t *cookie)
764 DBG(r, "start chxj_add_cookie_parameter() cookie_id=[%s]", (cookie) ? cookie->cookie_id : NULL);
766 dst = apr_pstrdup(r->pool, value);
771 if (!cookie->cookie_id)
774 if (chxj_cookie_check_host(r, value) != 0) {
775 DBG(r, "end chxj_add_cookie_parameter()(check host)");
779 qs = strchr(dst, '#');
781 name = apr_pstrdup(r->pool, qs);
785 qs = strchr(dst, '?');
787 dst = apr_psprintf(r->pool, "%s&%s=%s%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id, name);
790 dst = apr_psprintf(r->pool, "%s?%s=%s%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id, name);
793 DBG(r, "end chxj_add_cookie_parameter() dst=[%s]", dst);
798 DBG(r, "end chxj_add_cookie_parameter() (on_error)");
804 chxj_cookie_check_host(request_rec *r, char *value)
808 DBG(r, "hostname=[%s]", r->hostname);
810 hostnm = s_get_hostname_from_url(r, value);
812 if (strcasecmp(hostnm, r->hostname) == 0)
822 s_get_hostname_from_url(request_rec *r, char *value)
827 if (strncasecmp(value, "http://", 7) == 0 )
828 return s_cut_until_end_hostname(r, &value[7]);
830 if (strncasecmp(value, "https://", 8) == 0)
831 return s_cut_until_end_hostname(r, &value[8]);
838 s_cut_until_end_hostname(request_rec *r, char *value)
843 hostnm = sp = apr_pstrdup(r->pool, value);
845 if (*sp == '/'|| *sp == '?') {
856 chxj_delete_cookie(request_rec *r, const char *cookie_id)
859 mod_chxj_config *dconf;
861 DBG(r, "start chxj_delete_cookie()");
862 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
864 #if defined(USE_MYSQL_COOKIE)
865 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
866 if (! chxj_delete_cookie_mysql(r, dconf, cookie_id)) {
867 ERR(r, "failed: chxj_delete_cookie_mysql() cookie_id:[%s]", cookie_id);
868 DBG(r, "end chxj_delete_cookie()");
874 #if defined(USE_MEMCACHE_COOKIE)
875 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
876 if (! chxj_delete_cookie_memcache(r, dconf, cookie_id)) {
877 ERR(r, "failed: chxj_delete_cookie_memcache() cookie_id:[%s]", cookie_id);
878 DBG(r, "end chxj_delete_cookie()");
884 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
885 if (! chxj_delete_cookie_dbm(r, dconf, cookie_id)) {
886 ERR(r, "failed: chxj_delete_cookie_dbm() cookie_id:[%s]", cookie_id);
887 DBG(r, "end chxj_delete_cookie()");
892 DBG(r, "end chxj_delete_cookie()");
900 chxj_save_cookie_expire(request_rec *r, cookie_t *cookie)
903 mod_chxj_config *dconf;
905 DBG(r, "start chxj_save_cookie_expire()");
907 DBG(r, "cookie is NULL");
910 if (!cookie->cookie_id) {
911 DBG(r, "cookie->cookie_id is NULL");
915 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
917 DBG(r, "dconf is NULL");
921 #if defined(USE_MYSQL_COOKIE)
922 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
923 if (! chxj_save_cookie_expire_mysql(r, dconf, cookie->cookie_id)) {
924 ERR(r, "failed: chxj_save_cookie_expire_mysql() cookie_id:[%s]", cookie->cookie_id);
925 DBG(r, "end chxj_save_cookie_expire()");
931 #if defined(USE_MEMCACHE_COOKIE)
932 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
933 if (! chxj_save_cookie_expire_memcache(r, dconf, cookie->cookie_id)) {
934 ERR(r, "failed: chxj_save_cookie_expire_memcache() cookie_id:[%s]", cookie->cookie_id);
935 DBG(r, "end chxj_save_cookie_expire()");
941 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
942 if (! chxj_save_cookie_expire_dbm(r, dconf, cookie->cookie_id)) {
943 ERR(r, "failed: chxj_save_cookie_expire_dbm() cookie_id:[%s]", cookie->cookie_id);
944 DBG(r, "end chxj_save_cookie_expire()");
949 DBG(r, "end chxj_save_cookie_expire()");
954 chxj_delete_cookie_expire(request_rec *r, char *cookie_id)
957 mod_chxj_config *dconf;
959 DBG(r, "start chxj_delete_cookie_expire()");
961 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
963 #if defined(USE_MYSQL_COOKIE)
964 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
965 if (! chxj_delete_cookie_expire_mysql(r, dconf, cookie_id)) {
966 ERR(r, "failed: chxj_delete_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
972 #if defined(USE_MEMCACHE_COOKIE)
973 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
974 if (!chxj_delete_cookie_expire_memcache(r, dconf, cookie_id)) {
975 ERR(r, "failed: chxj_delete_cookie_expire_memcache() cookie_id:[%s]", cookie_id);
981 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
982 if (!chxj_delete_cookie_expire_dbm(r, dconf, cookie_id)) {
983 ERR(r, "failed: chxj_delete_cookie_expire_dbm() cookie_id:[%s]", cookie_id);
988 DBG(r, "end chxj_delete_cookie_expire()");
993 chxj_cookie_expire_gc(request_rec *r)
995 mod_chxj_config *dconf;
998 DBG(r, "start chxj_cookie_expire_gc()");
1000 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
1001 #if defined(USE_MYSQL_COOKIE)
1002 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
1003 if (! chxj_cookie_expire_gc_mysql(r, dconf)) {
1004 ERR(r, "%s:%d end chxj_cookie_expire_gc(): failed: chxj_cookie_expire_gc_mysql()", APLOG_MARK);
1010 #if defined(USE_MEMCACHE_COOKIE)
1011 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
1012 if (! chxj_cookie_expire_gc_memcache(r, dconf)) {
1013 ERR(r, "%s:%d end chxj_cookie_expire_gc(): failed: chxj_cookie_expire_gc_memcache()", APLOG_MARK);
1020 if (! chxj_cookie_expire_gc_dbm(r, dconf)) {
1021 ERR(r, "%s:%d end chxj_cookie_expire_gc(): failed: chxj_cookie_expire_gc_dbm()", APLOG_MARK);
1025 DBG(r, "end chxj_cookie_expire_gc()");
1029 chxj_parse_cookie_expires(const char *s)
1031 if (!s) return (apr_time_t)0;
1032 return apr_date_parse_rfc(s);
1037 chxj_cookie_lock(request_rec *r)
1039 mod_chxj_config *dconf;
1043 DBG(r, "start chxj_cookie_lock()");
1044 if ((rv = apr_proc_mutex_lock(global_cookie_mutex)) != APR_SUCCESS) {
1046 ERR(r, "%s:%d apr_proc_mutex_lock failure.(%d:%s)", APLOG_MARK, rv, apr_strerror(rv, errstr, 255));
1049 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
1050 #if defined(USE_MYSQL_COOKIE)
1051 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
1052 if (! chxj_cookie_lock_mysql(r, dconf)) {
1053 ERR(r, "%s:%d end chxj_cookie_lock(): failed: chxj_cookie_lock_mysql()", APLOG_MARK);
1059 #if defined(USE_MEMCACHE_COOKIE)
1060 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
1061 if (! chxj_cookie_lock_memcache(r, dconf)) {
1062 ERR(r, "%s:%d end chxj_cookie_lock(): failed: chxj_cookie_lock_memcache()", APLOG_MARK);
1069 if (! chxj_cookie_lock_dbm(r, dconf)) {
1070 ERR(r, "%s:%d end chxj_cookie_lock(): failed: chxj_cookie_lock_dbm()", APLOG_MARK);
1074 DBG(r, "end chxj_cookie_lock()");
1080 chxj_cookie_unlock(request_rec *r)
1082 mod_chxj_config *dconf;
1087 DBG(r, "start chxj_cookie_unlock()");
1089 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
1090 #if defined(USE_MYSQL_COOKIE)
1091 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
1092 if (! chxj_cookie_unlock_mysql(r, dconf)) {
1093 ERR(r, "failed: chxj_cookie_unlock_mysql()");
1095 goto end_chxj_cookie_unlock;
1100 #if defined(USE_MEMCACHE_COOKIE)
1101 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
1102 if (! chxj_cookie_unlock_memcache(r, dconf)) {
1103 ERR(r, "failed: chxj_cookie_unlock_memcache()");
1105 goto end_chxj_cookie_unlock;
1111 if (! chxj_cookie_unlock_dbm(r, dconf)) {
1112 ERR(r, "failed: chxj_cookie_unlock_dbm()");
1114 goto end_chxj_cookie_unlock;
1117 end_chxj_cookie_unlock:
1118 if ((rv = apr_proc_mutex_unlock(global_cookie_mutex)) != APR_SUCCESS) {
1120 ERR(r, "%s:%d apr_proc_mutex_unlock failure.(%d:%s)", APLOG_MARK, rv, apr_strerror(rv, errstr, 255));
1123 DBG(r, "end chxj_cookie_unlock()");