2 * Copyright (C) 2005 QSDN,Inc. All rights reserved.
3 * Copyright (C) 2005 Atsushi Konno 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"
28 #include "apr_base64.h"
31 static char* s_get_hostname_from_url(request_rec* r, char* value);
32 static char* s_cut_until_end_hostname(request_rec*, char* value);
38 chxj_save_cookie(request_rec* r)
41 apr_array_header_t* headers;
42 apr_table_entry_t* hentryp;
49 unsigned char* md5_value;
52 mod_chxj_config* dconf;
53 chxjconvrule_entry* entryp;
55 apr_table_t* new_cookie_table;
62 DBG(r, "start chxj_save_cookie()");
64 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
65 cookie->cookie_id = NULL;
69 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
70 entryp = chxj_apply_convrule(r, dconf->convrules);
72 DBG(r, "end chxj_save_cookie() no pattern");
75 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
76 DBG(r, "end chxj_save_cookie() CookieOff");
80 refer_string = apr_psprintf(r->pool,
82 apr_uri_unparse(r->pool,
84 APR_URI_UNP_OMITQUERY));
85 apr_table_setn(r->headers_out, "Set-Cookie", refer_string);
88 headers = (apr_array_header_t*)apr_table_elts(r->headers_out);
89 hentryp = (apr_table_entry_t*)headers->elts;
92 new_cookie_table = apr_table_make(r->pool, 0);
94 for (ii=0; ii<headers->nelts; ii++) {
95 if (strcasecmp(hentryp[ii].key, "Set-Cookie") == 0) {
96 DBG(r, "=====================================");
97 DBG2(r, "cookie=[%s:%s]", hentryp[ii].key, hentryp[ii].val);
103 buff = apr_pstrdup(r->pool, hentryp[ii].val);
104 val = strchr(buff, '=');
108 apr_table_add(new_cookie_table, key, val);
112 DBG(r, "=====================================");
115 apr_table_unset(r->headers_out, "Set-Cookie");
118 * check input parameters
120 old_cookie_id = (char*)apr_table_get(r->headers_in, "CHXJ_COOKIE_ID");
122 old_cookie = chxj_load_cookie(r, old_cookie_id);
123 if (old_cookie && old_cookie->cookie_headers) {
124 hentryp = (apr_table_entry_t*)old_cookie->cookie_headers->elts;
125 for (ii=0; ii<old_cookie->cookie_headers->nelts; ii++) {
126 if (hentryp[ii].key && apr_table_get(new_cookie_table, hentryp[ii].key) == NULL) {
127 apr_table_setn(new_cookie_table, hentryp[ii].key, hentryp[ii].val);
131 chxj_delete_cookie(r, old_cookie_id);
132 chxj_delete_cookie_expire(r, old_cookie_id);
141 file = chxj_cookie_db_lock(r);
143 ERR(r, "mod_chxj: Can't lock cookie db");
149 retval = apr_dbm_open_ex(&f,
151 chxj_cookie_db_name_create(r, dconf->cookie_db_dir),
155 if (retval != APR_SUCCESS) {
156 ERR2(r, "could not open dbm (type %s) auth file: %s",
158 chxj_cookie_db_name_create(r,dconf->cookie_db_dir));
159 chxj_cookie_db_unlock(r, file);
164 uuid_string = apr_palloc(r->pool, APR_UUID_FORMATTED_LENGTH + 1);
165 memset(uuid_string, 0, APR_UUID_FORMATTED_LENGTH + 1);
166 apr_uuid_format(uuid_string, &uuid);;
168 md5_value = (unsigned char*)apr_palloc(r->pool, APR_MD5_DIGESTSIZE + 1);
169 memset(md5_value, 0, APR_MD5_DIGESTSIZE + 1);
171 retval = apr_md5(md5_value,
172 (const char*)uuid_string,
173 (apr_size_t)APR_UUID_FORMATTED_LENGTH);
174 if (retval != APR_SUCCESS) {
175 ERR(r, "md5 failed.");
179 cookie->cookie_id = apr_palloc(r->pool, apr_base64_encode_len(APR_MD5_DIGESTSIZE)+1);
180 memset(cookie->cookie_id, 0, APR_MD5_DIGESTSIZE+1);
181 apr_base64_encode(cookie->cookie_id, (char*)md5_value, APR_MD5_DIGESTSIZE);
183 DBG1(r, "cookie->cookie_id=[%s]", cookie->cookie_id);
185 cookie->cookie_id = chxj_url_encode(r,cookie->cookie_id);
187 DBG1(r, "cookie->cookie_id=[%s]", cookie->cookie_id);
193 dbmkey.dptr = cookie->cookie_id;
194 dbmkey.dsize = strlen(cookie->cookie_id);
199 cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(new_cookie_table);
200 store_string = apr_palloc(r->pool, 1);
202 hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts;
204 for (ii=0; ii<cookie->cookie_headers->nelts; ii++) {
205 if (ii) store_string = apr_pstrcat(r->pool,
210 store_string = apr_pstrcat(r->pool,
217 dbmval.dptr = store_string;
218 dbmval.dsize = strlen(store_string);
223 retval = apr_dbm_store(f, dbmkey, dbmval);
224 if (retval != APR_SUCCESS) {
225 ERR1(r, "Cannot store Cookie data to DBM file `%s'",
226 chxj_cookie_db_name_create(r, dconf->cookie_db_dir));
230 chxj_save_cookie_expire(r, cookie);
235 chxj_cookie_db_unlock(r, file);
237 DBG(r, "end chxj_save_cookie()");
245 chxj_update_cookie(request_rec* r, cookie_t* old_cookie)
248 apr_array_header_t* headers;
249 apr_table_entry_t* hentryp;
256 unsigned char* md5_value;
258 mod_chxj_config* dconf;
259 chxjconvrule_entry* entryp;
264 DBG(r, "start chxj_update_cookie()");
265 if (!old_cookie || ! old_cookie->cookie_headers || ! old_cookie->cookie_id) {
266 DBG(r, "end chxj_update_cookie() (old_cookie is null)");
270 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
271 cookie->cookie_id = NULL;
274 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
275 entryp = chxj_apply_convrule(r, dconf->convrules);
277 DBG(r, "end chxj_update_cookie() no pattern");
280 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
281 DBG(r, "end chxj_update_cookie() CookieOff");
286 headers = (apr_array_header_t*)apr_table_elts(r->headers_out);
287 hentryp = (apr_table_entry_t*)headers->elts;
290 chxj_delete_cookie(r, old_cookie->cookie_id);
291 chxj_delete_cookie_expire(r, old_cookie->cookie_id);
293 file = chxj_cookie_db_lock(r);
295 ERR(r, "mod_chxj: Can't lock cookie db");
301 retval = apr_dbm_open_ex(&f,
303 chxj_cookie_db_name_create(r, dconf->cookie_db_dir),
307 if (retval != APR_SUCCESS) {
308 ERR2(r, "could not open dbm (type %s) auth file: %s",
310 chxj_cookie_db_name_create(r,dconf->cookie_db_dir));
311 chxj_cookie_db_unlock(r, file);
317 uuid_string = apr_palloc(r->pool, APR_UUID_FORMATTED_LENGTH + 1);
318 memset(uuid_string, 0, APR_UUID_FORMATTED_LENGTH + 1);
319 apr_uuid_format(uuid_string, &uuid);;
321 md5_value = (unsigned char*)apr_palloc(r->pool, APR_MD5_DIGESTSIZE + 1);
322 memset(md5_value, 0, APR_MD5_DIGESTSIZE + 1);
324 retval = apr_md5(md5_value,
325 (const char*)uuid_string,
326 (apr_size_t)APR_UUID_FORMATTED_LENGTH);
327 if (retval != APR_SUCCESS) {
328 ERR(r, "md5 failed.");
333 cookie->cookie_id = apr_palloc(r->pool, apr_base64_encode_len(APR_MD5_DIGESTSIZE)+1);
334 memset(cookie->cookie_id, 0, APR_MD5_DIGESTSIZE+1);
335 apr_base64_encode(cookie->cookie_id, (char*)md5_value, APR_MD5_DIGESTSIZE);
337 cookie->cookie_id = chxj_url_encode(r,cookie->cookie_id);
345 dbmkey.dptr = cookie->cookie_id;
346 dbmkey.dsize = strlen(cookie->cookie_id);
351 cookie->cookie_headers = old_cookie->cookie_headers;
352 store_string = apr_palloc(r->pool, 1);
354 hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts;
356 for (ii=0; ii<cookie->cookie_headers->nelts; ii++) {
357 if (ii) store_string = apr_pstrcat(r->pool,
362 DBG2(r, "OLD COOKIE VALUE=[%s][%s]", hentryp[ii].key, hentryp[ii].val);
363 store_string = apr_pstrcat(r->pool,
370 dbmval.dptr = store_string;
371 dbmval.dsize = strlen(store_string);
376 retval = apr_dbm_store(f, dbmkey, dbmval);
377 if (retval != APR_SUCCESS) {
378 ERR1(r, "Cannot store Cookie data to DBM file `%s'",
379 chxj_cookie_db_name_create(r, dconf->cookie_db_dir));
383 chxj_save_cookie_expire(r, cookie);
385 apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id);
390 chxj_cookie_db_unlock(r, file);
392 DBG(r, "end chxj_update_cookie()");
399 * @return loaded data.
402 chxj_load_cookie(request_rec* r, char* cookie_id)
408 mod_chxj_config* dconf;
409 chxjconvrule_entry* entryp;
412 apr_table_t* load_cookie_table;
419 DBG(r, "========================================================");
420 DBG(r, "========================================================");
421 DBG(r, "========================================================");
422 DBG(r, "========================================================");
423 DBG1(r, "start chxj_load_cookie() cookie_id=[%s]", cookie_id);
424 chxj_cookie_expire_gc(r);
426 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
427 cookie->cookie_headers = NULL;
428 cookie->cookie_id = apr_pstrdup(r->pool, cookie_id);
430 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
431 entryp = chxj_apply_convrule(r, dconf->convrules);
433 DBG(r, "end chxj_load_cookie() no pattern");
436 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
437 DBG(r, "end chxj_load_cookie() CookieOff");
442 file = chxj_cookie_db_lock(r);
444 ERR(r, "mod_chxj: Can't lock cookie db");
448 retval = apr_dbm_open_ex(&f,
450 chxj_cookie_db_name_create(r, dconf->cookie_db_dir),
454 if (retval != APR_SUCCESS) {
456 "could not open dbm (type %s) auth file: %s",
458 chxj_cookie_db_name_create(r, dconf->cookie_db_dir));
465 dbmkey.dptr = apr_pstrdup(r->pool, cookie->cookie_id);
466 dbmkey.dsize = strlen(dbmkey.dptr);
467 if (apr_dbm_exists(f, dbmkey)) {
469 retval = apr_dbm_fetch(f, dbmkey, &dbmval);
470 if (retval != APR_SUCCESS) {
472 "could not fetch dbm (type %s) auth file: %s", "default",
473 chxj_cookie_db_name_create(r, dconf->cookie_db_dir));
476 load_cookie_table = apr_table_make(r->pool, 0);
477 load_string = apr_palloc(r->pool, dbmval.dsize+1);
479 memset(load_string, 0, dbmval.dsize+1);
480 memcpy(load_string, dbmval.dptr, dbmval.dsize);
483 pair = apr_strtok(load_string, "\n", &pstat);
487 DBG1(r, "Cookie:[%s]", pair);
490 tmp_pair = apr_pstrdup(r->pool, pair);
491 val = strchr(tmp_pair, '=');
495 apr_table_add(load_cookie_table, key, val);
497 tmp_sem = strchr(pair, ';');
501 apr_table_setn(r->headers_in, "Cookie", pair);
504 cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(load_cookie_table);
507 * save cookie_id to request header.
509 apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id);
512 chxj_cookie_db_unlock(r, file);
513 DBG(r, "end chxj_load_cookie()");
514 DBG(r, "========================================================");
515 DBG(r, "========================================================");
516 DBG(r, "========================================================");
517 DBG(r, "========================================================");
526 chxj_cookie_db_unlock(r, file);
530 DBG(r, "end chxj_load_cookie()");
531 DBG(r, "========================================================");
532 DBG(r, "========================================================");
533 DBG(r, "========================================================");
534 DBG(r, "========================================================");
540 chxj_add_cookie_parameter(request_rec* r, char* value, cookie_t* cookie)
545 DBG1(r, "start chxj_add_cookie_parameter() cookie_id=[%s]", (cookie) ? cookie->cookie_id : NULL);
547 dst = apr_pstrdup(r->pool, value);
552 if (!cookie->cookie_id)
555 if (chxj_cookie_check_host(r, value) != 0) {
556 DBG(r, "end chxj_add_cookie_parameter()(check host)");
560 qs = strchr(dst, '?');
562 dst = apr_psprintf(r->pool, "%s&%s=%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id);
565 dst = apr_psprintf(r->pool, "%s?%s=%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id);
568 DBG1(r, "end chxj_add_cookie_parameter() dst=[%s]", dst);
573 DBG(r, "end chxj_add_cookie_parameter() (on_error)");
579 chxj_cookie_check_host(request_rec* r, char* value)
583 DBG1(r, "hostname=[%s]", r->hostname);
585 hostnm = s_get_hostname_from_url(r, value);
587 if (strcasecmp(hostnm, r->hostname) == 0)
597 s_get_hostname_from_url(request_rec* r, char* value)
602 if (strncasecmp(value, "http://", 7) == 0 )
603 return s_cut_until_end_hostname(r, &value[7]);
605 if (strncasecmp(value, "https://", 8) == 0)
606 return s_cut_until_end_hostname(r, &value[8]);
613 s_cut_until_end_hostname(request_rec* r, char* value)
618 hostnm = sp = apr_pstrdup(r->pool, value);
620 if (*sp == '/'|| *sp == '?') {
630 chxj_cookie_db_lock(request_rec* r)
634 mod_chxj_config* dconf;
636 dconf = (mod_chxj_config*)ap_get_module_config(r->per_dir_config, &chxj_module);
638 rv = apr_file_open(&file,
639 chxj_cookie_db_lock_name_create(r, dconf->cookie_db_dir),
640 APR_CREATE|APR_WRITE,
643 if (rv != APR_SUCCESS) {
644 ERR(r, "cookie lock file open failed.");
648 rv = apr_file_lock(file,APR_FLOCK_EXCLUSIVE);
649 if (rv != APR_SUCCESS) {
650 ERR(r, "cookie lock file open failed.");
651 apr_file_close(file);
660 chxj_cookie_db_unlock(request_rec* r, apr_file_t* file)
664 rv = apr_file_unlock(file);
665 if (rv != APR_SUCCESS) {
666 ERR(r, "cookie lock file open failed.");
670 apr_file_close(file);
675 chxj_delete_cookie(request_rec* r, char* cookie_id)
681 mod_chxj_config* dconf;
683 DBG(r, "start chxj_delete_cookie()");
685 file = chxj_cookie_db_lock(r);
687 ERR(r, "mod_chxj: Can't lock cookie db");
690 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
692 retval = apr_dbm_open_ex(&f,
694 chxj_cookie_db_name_create(r, dconf->cookie_db_dir),
698 if (retval != APR_SUCCESS) {
700 "could not open dbm (type %s) auth file: %s",
702 chxj_cookie_db_name_create(r,dconf->cookie_db_dir));
709 dbmkey.dptr = apr_pstrdup(r->pool, cookie_id);
710 dbmkey.dsize = strlen(dbmkey.dptr);
711 if (apr_dbm_exists(f, dbmkey)) {
712 apr_dbm_delete(f, dbmkey);
715 chxj_cookie_db_unlock(r, file);
717 DBG(r, "end chxj_delete_cookie()");
722 chxj_cookie_db_unlock(r, file);
731 chxj_cookie_db_name_create(request_rec* r, const char* dir)
736 dst = apr_pstrdup(r->pool, DEFAULT_COOKIE_DB_DIR);
739 dst = apr_pstrdup(r->pool, dir);
742 if (dst[strlen(dst)-1] != '/') {
743 dst = apr_pstrcat(r->pool, dst, "/", COOKIE_DB_NAME, NULL);
746 dst = apr_pstrcat(r->pool, dst, COOKIE_DB_NAME, NULL);
754 chxj_cookie_db_lock_name_create(request_rec* r, const char* dir)
757 DBG(r, "start chxj_cookie_db_lock_name_create()");
761 dst = apr_pstrdup(r->pool, DEFAULT_COOKIE_DB_DIR);
765 DBG1(r, " dir=[%x]", (unsigned int)dir);
766 dst = apr_pstrdup(r->pool, dir);
769 DBG1(r, "dst[strlen(dst)-1]=[%c]", dst[strlen(dst)-1]);
770 if (dst[strlen(dst)-1] != '/') {
771 dst = apr_pstrcat(r->pool, dst, "/", COOKIE_DB_LOCK_NAME, NULL);
774 dst = apr_pstrcat(r->pool, dst, COOKIE_DB_LOCK_NAME, NULL);
776 DBG(r, "end chxj_cookie_db_lock_name_create()");
783 chxj_save_cookie_expire(request_rec* r, cookie_t* cookie)
790 mod_chxj_config* dconf;
793 DBG(r, "start chxj_save_cookie_expire()");
795 DBG(r, "cookie is NULL");
799 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
801 DBG(r, "dconf is NULL");
805 file = chxj_cookie_expire_db_lock(r);
807 ERR(r, "mod_chxj: Can't lock cookie db");
813 retval = apr_dbm_open_ex(&f,
815 chxj_cookie_expire_db_name_create(r, dconf->cookie_db_dir),
819 if (retval != APR_SUCCESS) {
820 ERR2(r, "could not open dbm (type %s) auth file: %s",
822 chxj_cookie_expire_db_name_create(r,dconf->cookie_db_dir));
823 chxj_cookie_expire_db_unlock(r, file);
830 dbmkey.dptr = cookie->cookie_id;
831 dbmkey.dsize = strlen(cookie->cookie_id);
837 store_string = apr_psprintf(r->pool, "%d", (int)time(NULL));
838 dbmval.dptr = store_string;
839 dbmval.dsize = strlen(store_string);
844 retval = apr_dbm_store(f, dbmkey, dbmval);
845 if (retval != APR_SUCCESS) {
846 ERR1(r, "Cannot store Cookie data to DBM file `%s'",
847 chxj_cookie_db_name_create(r, dconf->cookie_db_dir));
852 chxj_cookie_expire_db_unlock(r, file);
854 DBG(r, "end chxj_save_cookie_expire()");
859 chxj_cookie_expire_db_name_create(request_rec* r, const char* dir)
864 dst = apr_pstrdup(r->pool, DEFAULT_COOKIE_DB_DIR);
867 dst = apr_pstrdup(r->pool, dir);
870 if (dst[strlen(dst)-1] != '/') {
871 dst = apr_pstrcat(r->pool, dst, "/", COOKIE_EXPIRE_DB_NAME, NULL);
874 dst = apr_pstrcat(r->pool, dst, COOKIE_EXPIRE_DB_NAME, NULL);
882 chxj_cookie_expire_db_lock_name_create(request_rec* r, const char* dir)
887 dst = apr_pstrdup(r->pool, DEFAULT_COOKIE_DB_DIR);
890 dst = apr_pstrdup(r->pool, dir);
892 if (dst[strlen(dst)-1] != '/') {
893 dst = apr_pstrcat(r->pool, dst, "/", COOKIE_EXPIRE_DB_LOCK_NAME, NULL);
896 dst = apr_pstrcat(r->pool, dst, COOKIE_EXPIRE_DB_LOCK_NAME, NULL);
904 chxj_cookie_expire_db_lock(request_rec* r)
908 mod_chxj_config* dconf;
910 dconf = (mod_chxj_config*)ap_get_module_config(r->per_dir_config, &chxj_module);
912 rv = apr_file_open(&file,
913 chxj_cookie_expire_db_lock_name_create(r, dconf->cookie_db_dir),
914 APR_CREATE|APR_WRITE,
917 if (rv != APR_SUCCESS) {
918 ERR(r, "cookie lock file open failed.");
922 rv = apr_file_lock(file,APR_FLOCK_EXCLUSIVE);
923 if (rv != APR_SUCCESS) {
924 ERR(r, "cookie lock file open failed.");
925 apr_file_close(file);
934 chxj_cookie_expire_db_unlock(request_rec* r, apr_file_t* file)
938 rv = apr_file_unlock(file);
939 if (rv != APR_SUCCESS) {
940 ERR(r, "cookie lock file open failed.");
944 apr_file_close(file);
948 chxj_delete_cookie_expire(request_rec* r, char* cookie_id)
954 mod_chxj_config* dconf;
956 DBG(r, "start chxj_delete_cookie_expire()");
958 file = chxj_cookie_expire_db_lock(r);
960 ERR(r, "mod_chxj: Can't lock cookie db");
963 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
965 retval = apr_dbm_open_ex(&f,
967 chxj_cookie_expire_db_name_create(r, dconf->cookie_db_dir),
971 if (retval != APR_SUCCESS) {
973 "could not open dbm (type %s) auth file: %s",
975 chxj_cookie_expire_db_name_create(r,dconf->cookie_db_dir));
982 dbmkey.dptr = apr_pstrdup(r->pool, cookie_id);
983 dbmkey.dsize = strlen(dbmkey.dptr);
984 if (apr_dbm_exists(f, dbmkey)) {
985 apr_dbm_delete(f, dbmkey);
988 chxj_cookie_expire_db_unlock(r, file);
990 DBG(r, "end chxj_delete_cookie_expire()");
995 chxj_cookie_expire_db_unlock(r, file);
1004 chxj_cookie_expire_gc(request_rec* r)
1006 apr_status_t retval;
1011 mod_chxj_config* dconf;
1014 DBG(r, "start chxj_cookie_expire_gc()");
1016 file = chxj_cookie_expire_db_lock(r);
1018 ERR(r, "mod_chxj: Can't lock cookie db");
1021 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
1023 retval = apr_dbm_open_ex(&f,
1025 chxj_cookie_expire_db_name_create(r, dconf->cookie_db_dir),
1029 if (retval != APR_SUCCESS) {
1031 "could not open dbm (type %s) auth file: %s",
1033 chxj_cookie_expire_db_name_create(r,dconf->cookie_db_dir));
1040 memset(&dbmkey, 0, sizeof(apr_datum_t));
1042 now_time = time(NULL);
1044 retval = apr_dbm_firstkey(f, &dbmkey);
1045 if (retval == APR_SUCCESS) {
1046 DBG2(r, "firstkey=[%.*s]", dbmkey.dsize, dbmkey.dptr);
1049 char* old_cookie_id;
1053 retval = apr_dbm_fetch(f, dbmkey, &dbmval);
1054 if (retval != APR_SUCCESS) {
1057 tmp = apr_palloc(r->pool, dbmval.dsize+1);
1058 memset(tmp, 0, dbmval.dsize+1);
1059 memcpy(tmp, dbmval.dptr, dbmval.dsize);
1062 val_time = atoi(tmp);
1064 if (dconf->cookie_timeout == 0)
1065 cmp_time = now_time - DEFAULT_COOKIE_TIMEOUT;
1067 cmp_time = now_time - dconf->cookie_timeout;
1069 DBG2(r, "key=[%.*s]", dbmkey.dsize, dbmkey.dptr);
1070 if (cmp_time >= val_time) {
1071 apr_dbm_delete(f, dbmkey);
1073 old_cookie_id = apr_palloc(r->pool, dbmkey.dsize+1);
1074 memset(old_cookie_id, 0, dbmkey.dsize+1);
1075 memcpy(old_cookie_id, dbmkey.dptr, dbmkey.dsize);
1077 chxj_delete_cookie(r,old_cookie_id);
1078 DBG1(r, "detect timeout cookie [%s]", old_cookie_id);
1081 retval = apr_dbm_nextkey(f, &dbmkey);
1082 } while(retval == APR_SUCCESS && dbmkey.dptr != NULL);
1086 chxj_cookie_expire_db_unlock(r, file);
1088 DBG(r, "end chxj_cookie_expire_gc()");
1093 chxj_cookie_expire_db_unlock(r, file);