akosut 96/07/28 12:34:57
Modified: src mod_cookies.c Log: Add CookieExpires and CookieEnable directives. Reviewed by: Brian Behlendorf, Rob Hartill, Jim Jagielski Revision Changes Path 1.11 +130 -7 apache/src/mod_cookies.c Index: mod_cookies.c =================================================================== RCS file: /export/home/cvs/apache/src/mod_cookies.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C3 -r1.10 -r1.11 *** mod_cookies.c 1996/07/04 13:01:59 1.10 --- mod_cookies.c 1996/07/28 19:34:56 1.11 *************** *** 96,101 **** --- 96,102 ---- * code from mod_log_agent.c. * 24.5.96 MJC Improved documentation after receiving comments from users * 4.7.96 MJC Bug, "else" missing since February caused logging twice + * 19.7.96 AEK Added CookieExpires and CookieEnable directives */ #include "httpd.h" *************** *** 109,116 **** --- 110,123 ---- char *fname; int log_fd; int always; + time_t expires; } cookie_log_state; + /* Define this to allow post-2000 cookies. Cookies use two-digit dates, + * so it might be dicey. (Netscape does it correctly, but others may not) + */ + #define MILLENIAL_COOKIES + /* Make Cookie: Now we have to generate something that is going to be * pretty unique. We can base it on the pid, time, hostip */ *************** *** 118,138 **** void make_cookie(request_rec *r) { struct timeval tv; char new_cookie[100]; /* blurgh */ char *dot; const char *rname = pstrdup(r->pool, ! get_remote_host(r->connection, r->per_dir_config, REMOTE_NAME)); struct timezone tz = { 0 , 0 }; if ((dot = strchr(rname,'.'))) *dot='\0'; /* First bit of hostname */ gettimeofday(&tv, &tz); ! sprintf(new_cookie,"%s%s%d%ld%d; path=/", ! COOKIE_NAME, rname, ! (int)getpid(), ! (long)tv.tv_sec, (int)tv.tv_usec/1000 ); table_set(r->headers_out,"Set-Cookie",new_cookie); return; --- 125,177 ---- void make_cookie(request_rec *r) { + cookie_log_state *cls = get_module_config (r->server->module_config, + &cookies_module); struct timeval tv; char new_cookie[100]; /* blurgh */ char *dot; const char *rname = pstrdup(r->pool, ! get_remote_host(r->connection, r->per_dir_config, REMOTE_NAME)); struct timezone tz = { 0 , 0 }; if ((dot = strchr(rname,'.'))) *dot='\0'; /* First bit of hostname */ gettimeofday(&tv, &tz); ! ! if (cls->expires) { ! static const char *const days[7]= ! {"Sun","Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; ! struct tm *tms; ! time_t when = time(NULL) + cls->expires; ! ! #ifndef MILLENIAL_COOKIES ! /* Only two-digit date string, so we can't trust "00" or more. ! * Therefore, we knock it all back to just before midnight on ! * 1/1/2000 (which is 946684799) ! */ ! ! if (when > 946684799) ! when = 946684799; ! #endif ! tms = gmtime(&when); ! ! ! ! /* Cookie with date; as strftime '%a, %d-%h-%y %H:%M:%S GMT' */ ! sprintf(new_cookie, ! "%s%s%d%ld%d; path=/; expires=%s, %.2d-%s-%.2d %.2d:%.2d:%.2d GMT", ! COOKIE_NAME, rname, (int)getpid(), ! (long)tv.tv_sec, (int)tv.tv_usec/1000, days[tms->tm_wday], ! tms->tm_mday, month_snames[tms->tm_mon], ! (tms->tm_year >= 100) ? tms->tm_year - 100 : tms->tm_year, ! tms->tm_hour, tms->tm_min, tms->tm_sec); ! } ! else ! sprintf(new_cookie,"%s%s%d%ld%d; path=/", ! COOKIE_NAME, rname, ! (int)getpid(), ! (long)tv.tv_sec, (int)tv.tv_usec/1000 ); table_set(r->headers_out,"Set-Cookie",new_cookie); return; *************** *** 140,147 **** --- 179,190 ---- int spot_cookie(request_rec *r) { + int *disable = (int *)get_module_config(r->per_dir_config, + &cookies_module); char *cookie; + if (*disable) return DECLINED; + if ((cookie = table_get (r->headers_in, "Cookie"))) if (strstr(cookie,COOKIE_NAME)) return DECLINED; /* Theres already a cookie, no new one */ *************** *** 165,174 **** --- 208,228 ---- cls->fname = ""; cls->log_fd = -1; + cls->expires = 0; return (void *)cls; } + void *make_cookie_dir (pool *p, char *d) { + return (void *)pcalloc(p, sizeof(int)); + } + + char *set_cookie_disable (cmd_parms *cmd, int *c, int arg) + { + *c = !arg; + return NULL; + } + char *set_cookie_log (cmd_parms *parms, void *dummy, char *arg) { cookie_log_state *cls = get_module_config (parms->server->module_config, *************** *** 177,185 **** --- 231,308 ---- return NULL; } + char *set_cookie_exp (cmd_parms *parms, void *dummy, char *arg) + { + cookie_log_state *cls = get_module_config (parms->server->module_config, + &cookies_module); + time_t factor, modifier = 0; + time_t num = 0; + char *word; + + /* The simple case first - all numbers (we assume) */ + if (isdigit(arg[0]) && isdigit(arg[strlen(arg)-1])) { + cls->expires = atol(arg); + return NULL; + } + + /* The harder case - stolen from mod_expires + * CookieExpires "[plus] {<num> <type>}*" + */ + + word = getword_conf( parms->pool, &arg ); + if ( !strncasecmp( word, "plus", 1 ) ) { + word = getword_conf( parms->pool, &arg ); + }; + + /* {<num> <type>}* */ + while ( word[0] ) { + /* <num> */ + if ( index("0123456789", word[0]) != NULL ) + num = atoi( word ); + else + return "bad expires code, numeric value expected."; + + /* <type> */ + word = getword_conf( parms->pool, &arg ); + if (!word[0] ) + return "bad expires code, missing <type>"; + + factor = 0; + if ( !strncasecmp( word, "years", 1 ) ) + factor = 60*60*24*365; + else if ( !strncasecmp( word, "months", 2 ) ) + factor = 60*60*24*30; + else if ( !strncasecmp( word, "weeks", 1 ) ) + factor = 60*60*24*7; + else if ( !strncasecmp( word, "days", 1 ) ) + factor = 60*60*24; + else if ( !strncasecmp( word, "hours", 1 ) ) + factor = 60*60; + else if ( !strncasecmp( word, "minutes", 2 ) ) + factor = 60; + else if ( !strncasecmp( word, "seconds", 1 ) ) + factor = 1; + else + return "bad expires code, unrecognized type"; + + modifier = modifier + factor * num; + + /* next <num> */ + word = getword_conf( parms->pool, &arg ); + } + + cls->expires = modifier; + + return NULL; + } + command_rec cookie_log_cmds[] = { { "CookieLog", set_cookie_log, NULL, RSRC_CONF, TAKE1, "the filename of the cookie log" }, + { "CookieExpires", set_cookie_exp, NULL, RSRC_CONF, TAKE1, + "an expiry date code" }, + { "CookieEnable", set_cookie_disable, NULL, OR_FILEINFO, FLAG, + "whether or not to enable cookies" }, { NULL } }; *************** *** 282,289 **** module cookies_module = { STANDARD_MODULE_STUFF, init_cookie_log, /* initializer */ ! NULL, /* dir config creater */ ! NULL, /* dir merger --- default is to override */ make_cookie_log_state, /* server config */ NULL, /* merge server configs */ cookie_log_cmds, /* command table */ --- 405,412 ---- module cookies_module = { STANDARD_MODULE_STUFF, init_cookie_log, /* initializer */ ! make_cookie_dir, /* dir config creater */ ! NULL, /* dir merger --- default is to override */ make_cookie_log_state, /* server config */ NULL, /* merge server configs */ cookie_log_cmds, /* command table */