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;
64 DBG(r, "start chxj_save_cookie()");
66 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
67 cookie->cookie_id = NULL;
72 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
73 entryp = chxj_apply_convrule(r, dconf->convrules);
75 DBG(r, "end chxj_save_cookie() no pattern");
78 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
79 DBG(r, "end chxj_save_cookie() CookieOff");
85 headers = (apr_array_header_t*)apr_table_elts(r->headers_out);
86 hentryp = (apr_table_entry_t*)headers->elts;
89 new_cookie_table = apr_table_make(r->pool, 0);
91 for (ii=0; ii<headers->nelts; ii++) {
92 if (strcasecmp(hentryp[ii].key, "Set-Cookie") == 0) {
93 DBG(r, "=====================================");
94 DBG2(r, "cookie=[%s:%s]", hentryp[ii].key, hentryp[ii].val);
101 buff = apr_pstrdup(r->pool, hentryp[ii].val);
102 val = strchr(buff, '=');
106 apr_table_add(new_cookie_table, key, val);
107 if (strcasecmp(REFERER_COOKIE_KEY, key) == 0) has_refer++;
112 DBG(r, "=====================================");
115 apr_table_unset(r->headers_out, "Set-Cookie");
118 apr_uri_parse(r->pool,r->uri, &parsed_uri);
119 refer_string = apr_psprintf(r->pool,
121 ap_run_http_method(r),
123 apr_uri_unparse(r->pool,
125 APR_URI_UNP_OMITSITEPART));
126 if (r->args && strlen(r->args)) {
127 refer_string = apr_pstrcat(r->pool, refer_string, "?", r->args, NULL);
129 apr_table_setn(new_cookie_table, REFERER_COOKIE_KEY, refer_string);
130 DBG1(r, "ADD REFER[%s]", refer_string);
136 * check input parameters
138 old_cookie_id = (char*)apr_table_get(r->headers_in, "CHXJ_COOKIE_ID");
140 old_cookie = chxj_load_cookie(r, old_cookie_id);
141 if (old_cookie && old_cookie->cookie_headers) {
142 hentryp = (apr_table_entry_t*)old_cookie->cookie_headers->elts;
143 for (ii=0; ii<old_cookie->cookie_headers->nelts; ii++) {
144 if (hentryp && apr_table_get(new_cookie_table, hentryp[ii].key) == NULL) {
145 apr_table_add(new_cookie_table, hentryp[ii].key, hentryp[ii].val);
149 chxj_delete_cookie(r, old_cookie_id);
150 chxj_delete_cookie_expire(r, old_cookie_id);
156 DBG(r, "end chxj_save_cookie()");
160 file = chxj_cookie_db_lock(r);
162 ERR(r, "mod_chxj: Can't lock cookie db");
163 DBG(r, "end chxj_save_cookie()");
169 retval = apr_dbm_open_ex(&f,
171 chxj_cookie_db_name_create(r, dconf->cookie_db_dir),
175 if (retval != APR_SUCCESS) {
176 DBG(r, "end chxj_save_cookie()");
177 ERR2(r, "could not open dbm (type %s) auth file: %s",
179 chxj_cookie_db_name_create(r,dconf->cookie_db_dir));
180 chxj_cookie_db_unlock(r, file);
185 uuid_string = apr_palloc(r->pool, APR_UUID_FORMATTED_LENGTH + 1);
186 memset(uuid_string, 0, APR_UUID_FORMATTED_LENGTH + 1);
187 apr_uuid_format(uuid_string, &uuid);;
189 md5_value = (unsigned char*)apr_palloc(r->pool, APR_MD5_DIGESTSIZE + 1);
190 memset(md5_value, 0, APR_MD5_DIGESTSIZE + 1);
192 retval = apr_md5(md5_value,
193 (const char*)uuid_string,
194 (apr_size_t)APR_UUID_FORMATTED_LENGTH);
195 if (retval != APR_SUCCESS) {
196 ERR(r, "md5 failed.");
200 cookie->cookie_id = apr_palloc(r->pool, apr_base64_encode_len(APR_MD5_DIGESTSIZE)+1);
201 memset(cookie->cookie_id, 0, APR_MD5_DIGESTSIZE+1);
202 apr_base64_encode(cookie->cookie_id, (char*)md5_value, APR_MD5_DIGESTSIZE);
204 DBG1(r, "cookie->cookie_id=[%s]", cookie->cookie_id);
206 cookie->cookie_id = chxj_url_encode(r,cookie->cookie_id);
208 DBG1(r, "cookie->cookie_id=[%s]", cookie->cookie_id);
214 dbmkey.dptr = cookie->cookie_id;
215 dbmkey.dsize = strlen(cookie->cookie_id);
220 cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(new_cookie_table);
221 store_string = apr_palloc(r->pool, 1);
223 hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts;
225 for (ii=0; ii<cookie->cookie_headers->nelts; ii++) {
226 if (ii) store_string = apr_pstrcat(r->pool,
231 store_string = apr_pstrcat(r->pool,
238 dbmval.dptr = store_string;
239 dbmval.dsize = strlen(store_string);
244 retval = apr_dbm_store(f, dbmkey, dbmval);
245 if (retval != APR_SUCCESS) {
246 ERR1(r, "Cannot store Cookie data to DBM file `%s'",
247 chxj_cookie_db_name_create(r, dconf->cookie_db_dir));
251 chxj_save_cookie_expire(r, cookie);
256 chxj_cookie_db_unlock(r, file);
258 DBG(r, "end chxj_save_cookie()");
266 chxj_update_cookie(request_rec* r, cookie_t* old_cookie)
269 apr_array_header_t* headers;
270 apr_table_entry_t* hentryp;
277 unsigned char* md5_value;
279 mod_chxj_config* dconf;
280 chxjconvrule_entry* entryp;
285 DBG(r, "start chxj_update_cookie()");
286 if (!old_cookie || ! old_cookie->cookie_headers || ! old_cookie->cookie_id) {
287 DBG(r, "end chxj_update_cookie() (old_cookie is null)");
291 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
292 cookie->cookie_id = NULL;
295 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
296 entryp = chxj_apply_convrule(r, dconf->convrules);
298 DBG(r, "end chxj_update_cookie() no pattern");
301 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
302 DBG(r, "end chxj_update_cookie() CookieOff");
307 headers = (apr_array_header_t*)apr_table_elts(r->headers_out);
308 hentryp = (apr_table_entry_t*)headers->elts;
311 chxj_delete_cookie(r, old_cookie->cookie_id);
312 chxj_delete_cookie_expire(r, old_cookie->cookie_id);
314 file = chxj_cookie_db_lock(r);
316 ERR(r, "mod_chxj: Can't lock cookie db");
322 retval = apr_dbm_open_ex(&f,
324 chxj_cookie_db_name_create(r, dconf->cookie_db_dir),
328 if (retval != APR_SUCCESS) {
329 ERR2(r, "could not open dbm (type %s) auth file: %s",
331 chxj_cookie_db_name_create(r,dconf->cookie_db_dir));
332 chxj_cookie_db_unlock(r, file);
338 uuid_string = apr_palloc(r->pool, APR_UUID_FORMATTED_LENGTH + 1);
339 memset(uuid_string, 0, APR_UUID_FORMATTED_LENGTH + 1);
340 apr_uuid_format(uuid_string, &uuid);;
342 md5_value = (unsigned char*)apr_palloc(r->pool, APR_MD5_DIGESTSIZE + 1);
343 memset(md5_value, 0, APR_MD5_DIGESTSIZE + 1);
345 retval = apr_md5(md5_value,
346 (const char*)uuid_string,
347 (apr_size_t)APR_UUID_FORMATTED_LENGTH);
348 if (retval != APR_SUCCESS) {
349 ERR(r, "md5 failed.");
354 cookie->cookie_id = apr_palloc(r->pool, apr_base64_encode_len(APR_MD5_DIGESTSIZE)+1);
355 memset(cookie->cookie_id, 0, APR_MD5_DIGESTSIZE+1);
356 apr_base64_encode(cookie->cookie_id, (char*)md5_value, APR_MD5_DIGESTSIZE);
358 cookie->cookie_id = chxj_url_encode(r,cookie->cookie_id);
366 dbmkey.dptr = cookie->cookie_id;
367 dbmkey.dsize = strlen(cookie->cookie_id);
372 cookie->cookie_headers = old_cookie->cookie_headers;
373 store_string = apr_palloc(r->pool, 1);
375 hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts;
377 for (ii=0; ii<cookie->cookie_headers->nelts; ii++) {
378 if (ii) store_string = apr_pstrcat(r->pool,
383 DBG2(r, "OLD COOKIE VALUE=[%s][%s]", hentryp[ii].key, hentryp[ii].val);
384 store_string = apr_pstrcat(r->pool,
391 dbmval.dptr = store_string;
392 dbmval.dsize = strlen(store_string);
397 retval = apr_dbm_store(f, dbmkey, dbmval);
398 if (retval != APR_SUCCESS) {
399 ERR1(r, "Cannot store Cookie data to DBM file `%s'",
400 chxj_cookie_db_name_create(r, dconf->cookie_db_dir));
404 chxj_save_cookie_expire(r, cookie);
406 apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id);
411 chxj_cookie_db_unlock(r, file);
413 DBG(r, "end chxj_update_cookie()");
420 * @return loaded data.
423 chxj_load_cookie(request_rec* r, char* cookie_id)
429 mod_chxj_config* dconf;
430 chxjconvrule_entry* entryp;
433 apr_table_t* load_cookie_table;
440 DBG(r, "========================================================");
441 DBG(r, "========================================================");
442 DBG(r, "========================================================");
443 DBG(r, "========================================================");
444 DBG1(r, "start chxj_load_cookie() cookie_id=[%s]", cookie_id);
445 chxj_cookie_expire_gc(r);
447 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
448 cookie->cookie_headers = NULL;
449 cookie->cookie_id = apr_pstrdup(r->pool, cookie_id);
451 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
452 entryp = chxj_apply_convrule(r, dconf->convrules);
454 DBG(r, "end chxj_load_cookie() no pattern");
457 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
458 DBG(r, "end chxj_load_cookie() CookieOff");
463 file = chxj_cookie_db_lock(r);
465 ERR(r, "mod_chxj: Can't lock cookie db");
469 retval = apr_dbm_open_ex(&f,
471 chxj_cookie_db_name_create(r, dconf->cookie_db_dir),
475 if (retval != APR_SUCCESS) {
477 "could not open dbm (type %s) auth file: %s",
479 chxj_cookie_db_name_create(r, dconf->cookie_db_dir));
486 dbmkey.dptr = apr_pstrdup(r->pool, cookie->cookie_id);
487 dbmkey.dsize = strlen(dbmkey.dptr);
488 if (apr_dbm_exists(f, dbmkey)) {
490 retval = apr_dbm_fetch(f, dbmkey, &dbmval);
491 if (retval != APR_SUCCESS) {
493 "could not fetch dbm (type %s) auth file: %s", "default",
494 chxj_cookie_db_name_create(r, dconf->cookie_db_dir));
497 load_cookie_table = apr_table_make(r->pool, 0);
498 load_string = apr_palloc(r->pool, dbmval.dsize+1);
500 memset(load_string, 0, dbmval.dsize+1);
501 memcpy(load_string, dbmval.dptr, dbmval.dsize);
503 char* header_cookie = apr_palloc(r->pool, 1);
505 header_cookie[0] = 0;
508 pair = apr_strtok(load_string, "\n", &pstat);
512 DBG1(r, "Cookie:[%s]", pair);
515 tmp_pair = apr_pstrdup(r->pool, pair);
516 val = strchr(tmp_pair, '=');
520 apr_table_add(load_cookie_table, key, val);
522 tmp_sem = strchr(pair, ';');
526 if (strlen(header_cookie))
527 header_cookie = apr_pstrcat(r->pool, header_cookie, ";", NULL);
529 header_cookie = apr_pstrcat(r->pool, header_cookie, pair, NULL);
531 if (strlen(header_cookie))
532 apr_table_add(r->headers_in, "Cookie", header_cookie);
534 cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(load_cookie_table);
536 if (apr_table_get(r->headers_in, "referer") == NULL) {
537 apr_table_setn(r->headers_in, "referer", apr_table_get(load_cookie_table, REFERER_COOKIE_KEY));
541 * save cookie_id to request header.
543 apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id);
546 chxj_cookie_db_unlock(r, file);
547 DBG(r, "end chxj_load_cookie()");
548 DBG(r, "========================================================");
549 DBG(r, "========================================================");
550 DBG(r, "========================================================");
551 DBG(r, "========================================================");
560 chxj_cookie_db_unlock(r, file);
564 DBG(r, "end chxj_load_cookie()");
565 DBG(r, "========================================================");
566 DBG(r, "========================================================");
567 DBG(r, "========================================================");
568 DBG(r, "========================================================");
574 chxj_add_cookie_parameter(request_rec* r, char* value, cookie_t* cookie)
579 DBG1(r, "start chxj_add_cookie_parameter() cookie_id=[%s]", (cookie) ? cookie->cookie_id : NULL);
581 dst = apr_pstrdup(r->pool, value);
586 if (!cookie->cookie_id)
589 if (chxj_cookie_check_host(r, value) != 0) {
590 DBG(r, "end chxj_add_cookie_parameter()(check host)");
594 qs = strchr(dst, '?');
596 dst = apr_psprintf(r->pool, "%s&%s=%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id);
599 dst = apr_psprintf(r->pool, "%s?%s=%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id);
602 DBG1(r, "end chxj_add_cookie_parameter() dst=[%s]", dst);
607 DBG(r, "end chxj_add_cookie_parameter() (on_error)");
613 chxj_cookie_check_host(request_rec* r, char* value)
617 DBG1(r, "hostname=[%s]", r->hostname);
619 hostnm = s_get_hostname_from_url(r, value);
621 if (strcasecmp(hostnm, r->hostname) == 0)
631 s_get_hostname_from_url(request_rec* r, char* value)
636 if (strncasecmp(value, "http://", 7) == 0 )
637 return s_cut_until_end_hostname(r, &value[7]);
639 if (strncasecmp(value, "https://", 8) == 0)
640 return s_cut_until_end_hostname(r, &value[8]);
647 s_cut_until_end_hostname(request_rec* r, char* value)
652 hostnm = sp = apr_pstrdup(r->pool, value);
654 if (*sp == '/'|| *sp == '?') {
664 chxj_cookie_db_lock(request_rec* r)
668 mod_chxj_config* dconf;
670 dconf = (mod_chxj_config*)ap_get_module_config(r->per_dir_config, &chxj_module);
672 rv = apr_file_open(&file,
673 chxj_cookie_db_lock_name_create(r, dconf->cookie_db_dir),
674 APR_CREATE|APR_WRITE,
677 if (rv != APR_SUCCESS) {
678 ERR(r, "cookie lock file open failed.");
682 rv = apr_file_lock(file,APR_FLOCK_EXCLUSIVE);
683 if (rv != APR_SUCCESS) {
684 ERR(r, "cookie lock file open failed.");
685 apr_file_close(file);
694 chxj_cookie_db_unlock(request_rec* r, apr_file_t* file)
698 rv = apr_file_unlock(file);
699 if (rv != APR_SUCCESS) {
700 ERR(r, "cookie lock file open failed.");
704 apr_file_close(file);
709 chxj_delete_cookie(request_rec* r, char* cookie_id)
715 mod_chxj_config* dconf;
717 DBG(r, "start chxj_delete_cookie()");
719 file = chxj_cookie_db_lock(r);
721 ERR(r, "mod_chxj: Can't lock cookie db");
724 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
726 retval = apr_dbm_open_ex(&f,
728 chxj_cookie_db_name_create(r, dconf->cookie_db_dir),
732 if (retval != APR_SUCCESS) {
734 "could not open dbm (type %s) auth file: %s",
736 chxj_cookie_db_name_create(r,dconf->cookie_db_dir));
743 dbmkey.dptr = apr_pstrdup(r->pool, cookie_id);
744 dbmkey.dsize = strlen(dbmkey.dptr);
745 if (apr_dbm_exists(f, dbmkey)) {
746 apr_dbm_delete(f, dbmkey);
749 chxj_cookie_db_unlock(r, file);
751 DBG(r, "end chxj_delete_cookie()");
756 chxj_cookie_db_unlock(r, file);
765 chxj_cookie_db_name_create(request_rec* r, const char* dir)
770 dst = apr_pstrdup(r->pool, DEFAULT_COOKIE_DB_DIR);
773 dst = apr_pstrdup(r->pool, dir);
776 if (dst[strlen(dst)-1] != '/') {
777 dst = apr_pstrcat(r->pool, dst, "/", COOKIE_DB_NAME, NULL);
780 dst = apr_pstrcat(r->pool, dst, COOKIE_DB_NAME, NULL);
788 chxj_cookie_db_lock_name_create(request_rec* r, const char* dir)
791 DBG(r, "start chxj_cookie_db_lock_name_create()");
795 dst = apr_pstrdup(r->pool, DEFAULT_COOKIE_DB_DIR);
799 DBG1(r, " dir=[%x]", (unsigned int)dir);
800 dst = apr_pstrdup(r->pool, dir);
803 DBG1(r, "dst[strlen(dst)-1]=[%c]", dst[strlen(dst)-1]);
804 if (dst[strlen(dst)-1] != '/') {
805 dst = apr_pstrcat(r->pool, dst, "/", COOKIE_DB_LOCK_NAME, NULL);
808 dst = apr_pstrcat(r->pool, dst, COOKIE_DB_LOCK_NAME, NULL);
810 DBG(r, "end chxj_cookie_db_lock_name_create()");
817 chxj_save_cookie_expire(request_rec* r, cookie_t* cookie)
824 mod_chxj_config* dconf;
827 DBG(r, "start chxj_save_cookie_expire()");
829 DBG(r, "cookie is NULL");
833 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
835 DBG(r, "dconf is NULL");
839 file = chxj_cookie_expire_db_lock(r);
841 ERR(r, "mod_chxj: Can't lock cookie db");
847 retval = apr_dbm_open_ex(&f,
849 chxj_cookie_expire_db_name_create(r, dconf->cookie_db_dir),
853 if (retval != APR_SUCCESS) {
854 ERR2(r, "could not open dbm (type %s) auth file: %s",
856 chxj_cookie_expire_db_name_create(r,dconf->cookie_db_dir));
857 chxj_cookie_expire_db_unlock(r, file);
864 dbmkey.dptr = cookie->cookie_id;
865 dbmkey.dsize = strlen(cookie->cookie_id);
871 store_string = apr_psprintf(r->pool, "%d", (int)time(NULL));
872 dbmval.dptr = store_string;
873 dbmval.dsize = strlen(store_string);
878 retval = apr_dbm_store(f, dbmkey, dbmval);
879 if (retval != APR_SUCCESS) {
880 ERR1(r, "Cannot store Cookie data to DBM file `%s'",
881 chxj_cookie_db_name_create(r, dconf->cookie_db_dir));
886 chxj_cookie_expire_db_unlock(r, file);
888 DBG(r, "end chxj_save_cookie_expire()");
893 chxj_cookie_expire_db_name_create(request_rec* r, const char* dir)
898 dst = apr_pstrdup(r->pool, DEFAULT_COOKIE_DB_DIR);
901 dst = apr_pstrdup(r->pool, dir);
904 if (dst[strlen(dst)-1] != '/') {
905 dst = apr_pstrcat(r->pool, dst, "/", COOKIE_EXPIRE_DB_NAME, NULL);
908 dst = apr_pstrcat(r->pool, dst, COOKIE_EXPIRE_DB_NAME, NULL);
916 chxj_cookie_expire_db_lock_name_create(request_rec* r, const char* dir)
921 dst = apr_pstrdup(r->pool, DEFAULT_COOKIE_DB_DIR);
924 dst = apr_pstrdup(r->pool, dir);
926 if (dst[strlen(dst)-1] != '/') {
927 dst = apr_pstrcat(r->pool, dst, "/", COOKIE_EXPIRE_DB_LOCK_NAME, NULL);
930 dst = apr_pstrcat(r->pool, dst, COOKIE_EXPIRE_DB_LOCK_NAME, NULL);
938 chxj_cookie_expire_db_lock(request_rec* r)
942 mod_chxj_config* dconf;
944 dconf = (mod_chxj_config*)ap_get_module_config(r->per_dir_config, &chxj_module);
946 rv = apr_file_open(&file,
947 chxj_cookie_expire_db_lock_name_create(r, dconf->cookie_db_dir),
948 APR_CREATE|APR_WRITE,
951 if (rv != APR_SUCCESS) {
952 ERR(r, "cookie lock file open failed.");
956 rv = apr_file_lock(file,APR_FLOCK_EXCLUSIVE);
957 if (rv != APR_SUCCESS) {
958 ERR(r, "cookie lock file open failed.");
959 apr_file_close(file);
968 chxj_cookie_expire_db_unlock(request_rec* r, apr_file_t* file)
972 rv = apr_file_unlock(file);
973 if (rv != APR_SUCCESS) {
974 ERR(r, "cookie lock file open failed.");
978 apr_file_close(file);
982 chxj_delete_cookie_expire(request_rec* r, char* cookie_id)
988 mod_chxj_config* dconf;
990 DBG(r, "start chxj_delete_cookie_expire()");
992 file = chxj_cookie_expire_db_lock(r);
994 ERR(r, "mod_chxj: Can't lock cookie db");
997 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
999 retval = apr_dbm_open_ex(&f,
1001 chxj_cookie_expire_db_name_create(r, dconf->cookie_db_dir),
1005 if (retval != APR_SUCCESS) {
1007 "could not open dbm (type %s) auth file: %s",
1009 chxj_cookie_expire_db_name_create(r,dconf->cookie_db_dir));
1016 dbmkey.dptr = apr_pstrdup(r->pool, cookie_id);
1017 dbmkey.dsize = strlen(dbmkey.dptr);
1018 if (apr_dbm_exists(f, dbmkey)) {
1019 apr_dbm_delete(f, dbmkey);
1022 chxj_cookie_expire_db_unlock(r, file);
1024 DBG(r, "end chxj_delete_cookie_expire()");
1029 chxj_cookie_expire_db_unlock(r, file);
1038 chxj_cookie_expire_gc(request_rec* r)
1040 apr_status_t retval;
1045 mod_chxj_config* dconf;
1048 DBG(r, "start chxj_cookie_expire_gc()");
1050 file = chxj_cookie_expire_db_lock(r);
1052 ERR(r, "mod_chxj: Can't lock cookie db");
1055 dconf = ap_get_module_config(r->per_dir_config, &chxj_module);
1057 retval = apr_dbm_open_ex(&f,
1059 chxj_cookie_expire_db_name_create(r, dconf->cookie_db_dir),
1063 if (retval != APR_SUCCESS) {
1065 "could not open dbm (type %s) auth file: %s",
1067 chxj_cookie_expire_db_name_create(r,dconf->cookie_db_dir));
1074 memset(&dbmkey, 0, sizeof(apr_datum_t));
1076 now_time = time(NULL);
1078 retval = apr_dbm_firstkey(f, &dbmkey);
1079 if (retval == APR_SUCCESS) {
1080 DBG2(r, "firstkey=[%.*s]", dbmkey.dsize, dbmkey.dptr);
1083 char* old_cookie_id;
1087 retval = apr_dbm_fetch(f, dbmkey, &dbmval);
1088 if (retval != APR_SUCCESS) {
1091 tmp = apr_palloc(r->pool, dbmval.dsize+1);
1092 memset(tmp, 0, dbmval.dsize+1);
1093 memcpy(tmp, dbmval.dptr, dbmval.dsize);
1096 val_time = atoi(tmp);
1098 if (dconf->cookie_timeout == 0)
1099 cmp_time = now_time - DEFAULT_COOKIE_TIMEOUT;
1101 cmp_time = now_time - dconf->cookie_timeout;
1103 DBG2(r, "key=[%.*s]", dbmkey.dsize, dbmkey.dptr);
1104 if (cmp_time >= val_time) {
1105 apr_dbm_delete(f, dbmkey);
1107 old_cookie_id = apr_palloc(r->pool, dbmkey.dsize+1);
1108 memset(old_cookie_id, 0, dbmkey.dsize+1);
1109 memcpy(old_cookie_id, dbmkey.dptr, dbmkey.dsize);
1111 chxj_delete_cookie(r,old_cookie_id);
1112 DBG1(r, "detect timeout cookie [%s]", old_cookie_id);
1115 retval = apr_dbm_nextkey(f, &dbmkey);
1116 } while(retval == APR_SUCCESS && dbmkey.dptr != NULL);
1120 chxj_cookie_expire_db_unlock(r, file);
1122 DBG(r, "end chxj_cookie_expire_gc()");
1127 chxj_cookie_expire_db_unlock(r, file);