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"
45 static char* s_get_hostname_from_url(request_rec* r, char* value);
46 static char* s_cut_until_end_hostname(request_rec*, char* value);
47 static int valid_domain(request_rec *r, const char *value);
48 static int valid_path(request_rec *r, const char *value);
49 static int valid_expires(request_rec *r, const char *value);
50 static int valid_secure(request_rec *r, const char *value);
51 static int check_valid_cookie_attribute(request_rec *r, const char *pair);
53 apr_proc_mutex_t *global_cookie_mutex;
56 alloc_cookie_id(request_rec *r)
60 unsigned char *md5_value;
65 uuid_string = apr_palloc(r->pool, APR_UUID_FORMATTED_LENGTH + 1);
66 memset(uuid_string, 0, APR_UUID_FORMATTED_LENGTH + 1);
67 apr_uuid_format(uuid_string, &uuid);;
69 md5_value = (unsigned char*)apr_palloc(r->pool, APR_MD5_DIGESTSIZE + 1);
70 memset(md5_value, 0, APR_MD5_DIGESTSIZE + 1);
72 retval = apr_md5(md5_value,
73 (const char*)uuid_string,
74 APR_UUID_FORMATTED_LENGTH);
75 if (retval != APR_SUCCESS) {
76 ERR(r, "md5 failed.");
80 cookie_id = apr_palloc(r->pool, apr_base64_encode_len(APR_MD5_DIGESTSIZE)+1);
81 memset(cookie_id, 0, APR_MD5_DIGESTSIZE+1);
82 apr_base64_encode(cookie_id, (char*)md5_value, APR_MD5_DIGESTSIZE);
84 DBG(r, "cookie_id=[%s]", cookie_id);
86 cookie_id = chxj_url_encode(r->pool,cookie_id);
88 DBG(r, "cookie_id=[%s]", cookie_id);
97 chxj_save_cookie(request_rec *r)
100 apr_array_header_t *headers;
101 apr_table_entry_t *hentryp;
104 mod_chxj_config *dconf;
105 chxjconvrule_entry *entryp;
106 apr_table_t *new_cookie_table;
109 cookie_t *old_cookie;
111 apr_uri_t parsed_uri;
115 DBG(r, "start chxj_save_cookie()");
117 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
118 cookie->cookie_id = NULL;
123 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
124 entryp = chxj_apply_convrule(r, dconf->convrules);
126 DBG(r, "end chxj_save_cookie() no pattern");
129 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
130 DBG(r, "end chxj_save_cookie() CookieOff");
136 headers = (apr_array_header_t*)apr_table_elts(r->headers_out);
137 hentryp = (apr_table_entry_t*)headers->elts;
140 new_cookie_table = apr_table_make(r->pool, 0);
142 for (ii=0; ii<headers->nelts; ii++) {
143 if (strcasecmp(hentryp[ii].key, "Set-Cookie") == 0) {
144 DBG(r, "=====================================");
145 DBG(r, "cookie=[%s:%s]", hentryp[ii].key, hentryp[ii].val);
152 buff = apr_pstrdup(r->pool, hentryp[ii].val);
153 val = strchr(buff, '=');
157 apr_table_add(new_cookie_table, key, val);
158 if (strcasecmp(REFERER_COOKIE_KEY, key) == 0) has_refer++;
163 DBG(r, "=====================================");
166 apr_table_unset(r->headers_out, "Set-Cookie");
169 apr_uri_parse(r->pool,r->uri, &parsed_uri);
170 refer_string = apr_psprintf(r->pool,
172 chxj_run_http_scheme(r),
174 apr_uri_unparse(r->pool,
176 APR_URI_UNP_OMITSITEPART));
177 if (r->args && strlen(r->args)) {
178 refer_string = apr_pstrcat(r->pool, refer_string, "?", r->args, NULL);
180 apr_table_setn(new_cookie_table, REFERER_COOKIE_KEY, refer_string);
181 DBG(r, "ADD REFER[%s]", refer_string);
187 * check input parameters
189 old_cookie_id = (char*)apr_table_get(r->headers_in, "CHXJ_COOKIE_ID");
191 old_cookie = chxj_load_cookie(r, old_cookie_id);
192 if (old_cookie && old_cookie->cookie_headers) {
193 hentryp = (apr_table_entry_t*)old_cookie->cookie_headers->elts;
194 for (ii=0; ii<old_cookie->cookie_headers->nelts; ii++) {
195 if (hentryp && apr_table_get(new_cookie_table, hentryp[ii].key) == NULL) {
196 apr_table_add(new_cookie_table, hentryp[ii].key, hentryp[ii].val);
200 chxj_delete_cookie(r, old_cookie_id);
201 chxj_delete_cookie_expire(r, old_cookie_id);
207 DBG(r, "end chxj_save_cookie()");
214 cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(new_cookie_table);
215 store_string = apr_palloc(r->pool, 1);
217 hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts;
219 for (ii=0; ii<cookie->cookie_headers->nelts; ii++) {
220 if (ii) store_string = apr_pstrcat(r->pool,
225 store_string = apr_pstrcat(r->pool,
233 if (old_cookie_id && IS_COOKIE_LAZY(dconf)) {
234 DBG(r, "LAZY COOKIE save");
235 cookie->cookie_id = apr_pstrdup(r->pool, old_cookie_id);
238 DBG(r, "NO LAZY COOKIE save. old_cookie_id:[%s] LAZY:[%d]", old_cookie_id,IS_COOKIE_LAZY(dconf));
239 cookie->cookie_id = alloc_cookie_id(r);
244 #if defined(USE_MYSQL_COOKIE)
245 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
246 if (! chxj_save_cookie_mysql(r, dconf, cookie->cookie_id, store_string)) {
247 ERR(r, "%s:%d faild: chxj_save_cookie_mysql() cookie_id:[%s]", APLOG_MARK,cookie->cookie_id);
254 #if defined(USE_MEMCACHE_COOKIE)
255 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
256 if (! chxj_save_cookie_memcache(r, dconf, cookie->cookie_id, store_string)) {
257 ERR(r, "%s:%d failed: chxj_save_cookie_memcache() cookie_id:[%s]", APLOG_MARK, cookie->cookie_id);
264 if (IS_COOKIE_STORE_DBM(dconf->cookie_store_type) || ! done_proc) {
265 if (! chxj_save_cookie_dbm(r, dconf, cookie->cookie_id, store_string)) {
266 ERR(r, "%s:%d failed: chxj_save_cookie_dbm() cookie_id:[%s]", APLOG_MARK, cookie->cookie_id);
274 chxj_save_cookie_expire(r, cookie);
278 DBG(r, "end chxj_save_cookie()");
288 chxj_update_cookie(request_rec *r, cookie_t *old_cookie)
291 apr_array_header_t *headers;
292 apr_table_entry_t *hentryp;
294 mod_chxj_config *dconf;
295 chxjconvrule_entry *entryp;
299 DBG(r, "start chxj_update_cookie()");
300 if (!old_cookie || ! old_cookie->cookie_headers || ! old_cookie->cookie_id) {
301 DBG(r, "end chxj_update_cookie() (old_cookie is null)");
305 cookie = (cookie_t *)apr_palloc(r->pool, sizeof(cookie_t));
306 cookie->cookie_id = NULL;
308 <<<<<<< HEAD:src/chxj_cookie.c
311 >>>>>>> * updated new trunk.:src/chxj_cookie.c
312 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
313 entryp = chxj_apply_convrule(r, dconf->convrules);
315 DBG(r, "end chxj_update_cookie() no pattern");
318 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
319 DBG(r, "end chxj_update_cookie() CookieOff");
323 headers = (apr_array_header_t*)apr_table_elts(r->headers_out);
324 hentryp = (apr_table_entry_t*)headers->elts;
326 chxj_delete_cookie(r, old_cookie->cookie_id);
327 chxj_delete_cookie_expire(r, old_cookie->cookie_id);
329 if (IS_COOKIE_LAZY(dconf)) {
331 cookie->cookie_id = apr_pstrdup(r->pool, old_cookie->cookie_id);
334 DBG(r, "NO LAZY MODE");
335 cookie->cookie_id = alloc_cookie_id(r);
338 cookie->cookie_headers = old_cookie->cookie_headers;
339 store_string = apr_palloc(r->pool, 1);
341 hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts;
343 for (ii=0; ii<cookie->cookie_headers->nelts; ii++) {
344 if (ii) store_string = apr_pstrcat(r->pool,
349 DBG(r, "OLD COOKIE VALUE=[%s][%s]", hentryp[ii].key, hentryp[ii].val);
350 store_string = apr_pstrcat(r->pool,
360 #if defined(USE_MYSQL_COOKIE)
361 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
362 if (!chxj_update_cookie_mysql(r, dconf, cookie->cookie_id, store_string)) {
363 ERR(r, "failed: chxj_update_cookie_mysql() cookie_id:[%s]", cookie->cookie_id);
370 #if defined(USE_MEMCACHE_COOKIE)
371 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
372 if (! chxj_update_cookie_memcache(r, dconf, cookie->cookie_id, store_string)) {
373 ERR(r, "failed: chxj_update_cookie_memcache() cookie_id:[%s]", cookie->cookie_id);
379 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
380 if (! chxj_update_cookie_dbm(r, dconf, cookie->cookie_id, store_string)) {
381 ERR(r, "failed: chxj_update_cookie_dbm() cookie_id:[%s]", cookie->cookie_id);
387 chxj_save_cookie_expire(r, cookie);
389 apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id);
393 DBG(r, "end chxj_update_cookie()");
400 * @return loaded data.
403 chxj_load_cookie(request_rec *r, char *cookie_id)
405 mod_chxj_config *dconf;
406 chxjconvrule_entry *entryp;
408 apr_table_t *load_cookie_table;
409 char *load_string = NULL;
416 DBG(r, "start chxj_load_cookie() cookie_id=[%s]", cookie_id);
417 chxj_cookie_expire_gc(r);
419 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
420 cookie->cookie_headers = NULL;
421 cookie->cookie_id = apr_pstrdup(r->pool, cookie_id);
423 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
424 entryp = chxj_apply_convrule(r, dconf->convrules);
426 DBG(r, "end chxj_load_cookie() no pattern");
429 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
430 DBG(r, "end chxj_load_cookie() CookieOff");
433 load_cookie_table = apr_table_make(r->pool, 0);
437 #if defined(USE_MYSQL_COOKIE)
438 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
439 if (! (load_string = chxj_load_cookie_mysql(r, dconf, cookie->cookie_id))) {
440 ERR(r, "%s:%d failed: chxj_load_cookie_mysql() cookie_id:[%s]", APLOG_MARK, cookie_id);
446 #if defined(USE_MEMCACHE_COOKIE)
447 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
448 if (! (load_string = chxj_load_cookie_memcache(r, dconf, cookie->cookie_id))) {
449 ERR(r, "%s:%d failed: chxj_load_cookie_memcache() cookie_id:[%s]", APLOG_MARK,cookie_id);
455 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
456 if (! (load_string = chxj_load_cookie_dbm(r, dconf, cookie->cookie_id))) {
457 ERR(r, "%s:%d failed: chxj_load_cookie_dbm() cookie_id:[%s]", APLOG_MARK,cookie_id);
464 DBG(r, "load_string=[%s]", load_string);
465 header_cookie = apr_palloc(r->pool, 1);
466 header_cookie[0] = 0;
470 pair = apr_strtok(load_string, "\n", &pstat);
474 DBG(r, "Cookie:[%s]", pair);
476 tmp_pair = apr_pstrdup(r->pool, pair);
477 val = strchr(tmp_pair, '=');
481 apr_table_add(load_cookie_table, key, val);
482 DBG(r, "ADD key:[%s] val:[%s]", key, val);
484 tmp_pair = apr_pstrdup(r->pool, pair);
485 tmp_sem = strchr(tmp_pair, ';');
489 if (check_valid_cookie_attribute(r, pair)) {
490 if (strlen(header_cookie))
491 header_cookie = apr_pstrcat(r->pool, header_cookie, ";", NULL);
493 header_cookie = apr_pstrcat(r->pool, header_cookie, tmp_pair, NULL);
496 if (strlen(header_cookie)) {
497 DBG(r, "ADD COOKIE to REQUEST HEADER:[%s]", header_cookie);
498 apr_table_add(r->headers_in, "Cookie", header_cookie);
501 cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(load_cookie_table);
503 if (apr_table_get(r->headers_in, "referer") == NULL) {
504 apr_table_setn(r->headers_in,
506 apr_table_get(load_cookie_table, REFERER_COOKIE_KEY));
510 * save cookie_id to request header.
512 apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id);
515 DBG(r, "end chxj_load_cookie()");
521 DBG(r, "end chxj_load_cookie()");
526 check_valid_cookie_attribute(request_rec *r, const char *value)
537 DBG(r, "start check_valid_cookie_attribute() value:[%s]", value);
539 domain_pair = path_pair = expire_pair = secure_pair = NULL;
540 p = apr_pstrdup(r->pool, value);
542 /* pass first pair */
543 first_pair = apr_strtok(p, ";", &pstat);
546 pair = apr_strtok(NULL, ";", &pstat);
548 pair = qs_trim_string(r->pool, pair);
549 if (STRNCASEEQ('d','D',"domain", pair, sizeof("domain")-1)) {
550 domain_pair = apr_pstrdup(r->pool, pair);
552 else if (STRNCASEEQ('p','P',"path", pair, sizeof("path")-1)) {
553 path_pair = apr_pstrdup(r->pool, pair);
555 else if (STRNCASEEQ('e','E',"expires", pair, sizeof("expires")-1)) {
556 expire_pair = apr_pstrdup(r->pool, pair);
558 else if (STRNCASEEQ('s','S',"secure", pair, sizeof("secure")-1)) {
559 secure_pair = apr_pstrdup(r->pool, pair);
564 if (!valid_domain(r, domain_pair)) {
565 DBG(r, "invalid domain. domain_pair:[%s]", domain_pair);
570 if (!valid_path(r, path_pair)) {
571 DBG(r, "invalid path. path_pair:[%s]", path_pair);
576 if (!valid_expires(r, expire_pair)) {
577 DBG(r, "invalid expire. expire_pair:[%s]", expire_pair);
582 if (!valid_secure(r, secure_pair)) {
583 DBG(r, "invalid secure. secure_pair:[%s]", secure_pair);
587 DBG(r, "end check_valid_cookie_attribute() value:[%s]", value);
593 valid_domain(request_rec *r, const char *value)
599 char *p = apr_pstrdup(r->pool, value);
600 const char *host = apr_table_get(r->headers_in, HTTP_HOST);
602 DBG(r, "start valid_domain() value:[%s]", value);
603 DBG(r, "host:[%s]", host);
607 name = apr_strtok(p,"=", &pstat);
608 name = qs_trim_string(r->pool, name);
609 val = apr_strtok(NULL, "=", &pstat);
610 val = qs_trim_string(r->pool, val);
613 if (chxj_strcasenrcmp(r->pool, host, val, strlen(val))) {
614 DBG(r, "not match domain. host domain:[%s] vs value:[%s]", host, val);
618 DBG(r, "end valid_domain() value:[%s]", value);
624 valid_path(request_rec *r, const char *value)
626 char *p = apr_pstrdup(r->pool, value);
633 DBG(r, "start valid_path() unparsed_uri:[%s] value:[%s]", r->unparsed_uri, value);
634 if (chxj_starts_with(r->unparsed_uri, "http://")) {
635 uri = strchr(&r->unparsed_uri[sizeof("http://")], '/');
637 uri = apr_pstrdup(r->pool, uri);
640 else if (chxj_starts_with(r->unparsed_uri, "https://")) {
641 uri = strchr(&r->unparsed_uri[sizeof("https://")], '/');
643 uri = apr_pstrdup(r->pool, uri);
646 else if (chxj_starts_with(r->unparsed_uri, "/")) {
647 uri = apr_pstrdup(r->pool, r->unparsed_uri);
650 uri = apr_pstrdup(r->pool, "/");
653 if ((tmp = strchr(uri, '?'))) {
656 DBG(r, "uri=[%s]", uri);
657 name = apr_strtok(p, "=", &pstat);
658 val = apr_strtok(NULL, "=", &pstat);
659 name = qs_trim_string(r->pool, name);
660 val = qs_trim_string(r->pool, val);
661 DBG(r, "name=[%s] val=[%s]", name, val);
663 DBG(r, "val:[%s] vs uri:[%s]", val, uri);
664 if (! chxj_starts_with(uri, val)) {
665 DBG(r, "end valid_path() unparsed_uri:[%s] value:[%s] (false)", r->unparsed_uri, value);
668 DBG(r, "end valid_path() unparsed_uri:[%s] value:[%s] (true)", r->unparsed_uri, value);
674 valid_expires(request_rec *r, const char *value)
678 char *p = apr_pstrdup(r->pool, value);
683 DBG(r, "start valid_expire() value:[%s]", value);
684 name = apr_strtok(p, "=", &pstat);
685 val = apr_strtok(NULL, "=", &pstat);
686 DBG(r, "name=[%s] val=[%s]", name, val);
687 now = apr_time_now();
688 expires = chxj_parse_cookie_expires(val);
690 DBG(r, "end valid_expire() value:[%s] (expired)", value);
694 DBG(r, "end valid_expire() value:[%s] (non expired)", value);
700 valid_secure(request_rec *r, const char *value)
703 DBG(r, "start valid_secure() value:[%s]", value);
704 scheme = chxj_apache_run_http_scheme(r);
705 if (strcasecmp("https", scheme)) {
706 DBG(r, "end valid_secure() value:[%s] (non secure)", value);
709 DBG(r, "end valid_secure() value:[%s] (secure)", value);
715 chxj_add_cookie_parameter(request_rec *r, char *value, cookie_t *cookie)
720 DBG(r, "start chxj_add_cookie_parameter() cookie_id=[%s]", (cookie) ? cookie->cookie_id : NULL);
722 dst = apr_pstrdup(r->pool, value);
727 if (!cookie->cookie_id)
730 if (chxj_cookie_check_host(r, value) != 0) {
731 DBG(r, "end chxj_add_cookie_parameter()(check host)");
735 qs = strchr(dst, '?');
737 dst = apr_psprintf(r->pool, "%s&%s=%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id);
740 dst = apr_psprintf(r->pool, "%s?%s=%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id);
743 DBG(r, "end chxj_add_cookie_parameter() dst=[%s]", dst);
748 DBG(r, "end chxj_add_cookie_parameter() (on_error)");
754 chxj_cookie_check_host(request_rec *r, char *value)
758 DBG(r, "hostname=[%s]", r->hostname);
760 hostnm = s_get_hostname_from_url(r, value);
762 if (strcasecmp(hostnm, r->hostname) == 0)
772 s_get_hostname_from_url(request_rec *r, char *value)
777 if (strncasecmp(value, "http://", 7) == 0 )
778 return s_cut_until_end_hostname(r, &value[7]);
780 if (strncasecmp(value, "https://", 8) == 0)
781 return s_cut_until_end_hostname(r, &value[8]);
788 s_cut_until_end_hostname(request_rec *r, char *value)
793 hostnm = sp = apr_pstrdup(r->pool, value);
795 if (*sp == '/'|| *sp == '?') {
806 chxj_delete_cookie(request_rec *r, const char *cookie_id)
809 mod_chxj_config *dconf;
811 DBG(r, "start chxj_delete_cookie()");
812 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
814 #if defined(USE_MYSQL_COOKIE)
815 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
816 if (! chxj_delete_cookie_mysql(r, dconf, cookie_id)) {
817 ERR(r, "failed: chxj_delete_cookie_mysql() cookie_id:[%s]", cookie_id);
818 DBG(r, "end chxj_delete_cookie()");
824 #if defined(USE_MEMCACHE_COOKIE)
825 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
826 if (! chxj_delete_cookie_memcache(r, dconf, cookie_id)) {
827 ERR(r, "failed: chxj_delete_cookie_memcache() cookie_id:[%s]", cookie_id);
828 DBG(r, "end chxj_delete_cookie()");
834 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
835 if (! chxj_delete_cookie_dbm(r, dconf, cookie_id)) {
836 ERR(r, "failed: chxj_delete_cookie_dbm() cookie_id:[%s]", cookie_id);
837 DBG(r, "end chxj_delete_cookie()");
842 DBG(r, "end chxj_delete_cookie()");
850 chxj_save_cookie_expire(request_rec *r, cookie_t *cookie)
853 mod_chxj_config *dconf;
855 DBG(r, "start chxj_save_cookie_expire()");
857 DBG(r, "cookie is NULL");
860 if (!cookie->cookie_id) {
861 DBG(r, "cookie->cookie_id is NULL");
865 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
867 DBG(r, "dconf is NULL");
871 #if defined(USE_MYSQL_COOKIE)
872 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
873 if (! chxj_save_cookie_expire_mysql(r, dconf, cookie->cookie_id)) {
874 ERR(r, "failed: chxj_save_cookie_expire_mysql() cookie_id:[%s]", cookie->cookie_id);
875 DBG(r, "end chxj_save_cookie_expire()");
881 #if defined(USE_MEMCACHE_COOKIE)
882 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
883 if (! chxj_save_cookie_expire_memcache(r, dconf, cookie->cookie_id)) {
884 ERR(r, "failed: chxj_save_cookie_expire_memcache() cookie_id:[%s]", cookie->cookie_id);
885 DBG(r, "end chxj_save_cookie_expire()");
891 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
892 if (! chxj_save_cookie_expire_dbm(r, dconf, cookie->cookie_id)) {
893 ERR(r, "failed: chxj_save_cookie_expire_dbm() cookie_id:[%s]", cookie->cookie_id);
894 DBG(r, "end chxj_save_cookie_expire()");
899 DBG(r, "end chxj_save_cookie_expire()");
904 chxj_delete_cookie_expire(request_rec *r, char *cookie_id)
907 mod_chxj_config *dconf;
909 DBG(r, "start chxj_delete_cookie_expire()");
911 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
913 #if defined(USE_MYSQL_COOKIE)
914 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
915 if (! chxj_delete_cookie_expire_mysql(r, dconf, cookie_id)) {
916 ERR(r, "failed: chxj_delete_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
922 #if defined(USE_MEMCACHE_COOKIE)
923 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
924 if (!chxj_delete_cookie_expire_memcache(r, dconf, cookie_id)) {
925 ERR(r, "failed: chxj_delete_cookie_expire_memcache() cookie_id:[%s]", cookie_id);
931 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
932 if (!chxj_delete_cookie_expire_dbm(r, dconf, cookie_id)) {
933 ERR(r, "failed: chxj_delete_cookie_expire_dbm() cookie_id:[%s]", cookie_id);
938 DBG(r, "end chxj_delete_cookie_expire()");
943 chxj_cookie_expire_gc(request_rec *r)
945 mod_chxj_config *dconf;
948 DBG(r, "start chxj_cookie_expire_gc()");
950 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
951 #if defined(USE_MYSQL_COOKIE)
952 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
953 if (! chxj_cookie_expire_gc_mysql(r, dconf)) {
954 ERR(r, "%s:%d end chxj_cookie_expire_gc(): failed: chxj_cookie_expire_gc_mysql()", APLOG_MARK);
960 #if defined(USE_MEMCACHE_COOKIE)
961 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
962 if (! chxj_cookie_expire_gc_memcache(r, dconf)) {
963 ERR(r, "%s:%d end chxj_cookie_expire_gc(): failed: chxj_cookie_expire_gc_memcache()", APLOG_MARK);
970 if (! chxj_cookie_expire_gc_dbm(r, dconf)) {
971 ERR(r, "%s:%d end chxj_cookie_expire_gc(): failed: chxj_cookie_expire_gc_dbm()", APLOG_MARK);
975 DBG(r, "end chxj_cookie_expire_gc()");
979 chxj_parse_cookie_expires(const char *s)
981 if (!s) return (apr_time_t)0;
982 return apr_date_parse_rfc(s);
987 chxj_cookie_lock(request_rec *r)
989 mod_chxj_config *dconf;
993 DBG(r, "start chxj_cookie_lock()");
994 if ((rv = apr_proc_mutex_lock(global_cookie_mutex)) != APR_SUCCESS) {
996 ERR(r, "%s:%d apr_proc_mutex_lock failure.(%d:%s)", APLOG_MARK, rv, apr_strerror(rv, errstr, 255));
999 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
1000 #if defined(USE_MYSQL_COOKIE)
1001 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
1002 if (! chxj_cookie_lock_mysql(r, dconf)) {
1003 ERR(r, "%s:%d end chxj_cookie_lock(): failed: chxj_cookie_lock_mysql()", APLOG_MARK);
1009 #if defined(USE_MEMCACHE_COOKIE)
1010 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
1011 if (! chxj_cookie_lock_memcache(r, dconf)) {
1012 ERR(r, "%s:%d end chxj_cookie_lock(): failed: chxj_cookie_lock_memcache()", APLOG_MARK);
1019 if (! chxj_cookie_lock_dbm(r, dconf)) {
1020 ERR(r, "%s:%d end chxj_cookie_lock(): failed: chxj_cookie_lock_dbm()", APLOG_MARK);
1024 DBG(r, "end chxj_cookie_lock()");
1030 chxj_cookie_unlock(request_rec *r)
1032 mod_chxj_config *dconf;
1037 DBG(r, "start chxj_cookie_unlock()");
1039 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
1040 #if defined(USE_MYSQL_COOKIE)
1041 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
1042 if (! chxj_cookie_unlock_mysql(r, dconf)) {
1043 ERR(r, "failed: chxj_cookie_unlock_mysql()");
1045 goto end_chxj_cookie_unlock;
1050 #if defined(USE_MEMCACHE_COOKIE)
1051 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
1052 if (! chxj_cookie_unlock_memcache(r, dconf)) {
1053 ERR(r, "failed: chxj_cookie_unlock_memcache()");
1055 goto end_chxj_cookie_unlock;
1061 if (! chxj_cookie_unlock_dbm(r, dconf)) {
1062 ERR(r, "failed: chxj_cookie_unlock_dbm()");
1064 goto end_chxj_cookie_unlock;
1067 end_chxj_cookie_unlock:
1068 if ((rv = apr_proc_mutex_unlock(global_cookie_mutex)) != APR_SUCCESS) {
1070 ERR(r, "%s:%d apr_proc_mutex_unlock failure.(%d:%s)", APLOG_MARK, rv, apr_strerror(rv, errstr, 255));
1073 DBG(r, "end chxj_cookie_unlock()");