/* initialize all attributes */ static void *make_cookietrack_settings(apr_pool_t *p, char *d) { cookietrack_settings_rec *dcfg; dcfg = (cookietrack_settings_rec *) apr_pcalloc(p, sizeof(cookietrack_settings_rec)); dcfg->cookie_name = COOKIE_NAME; dcfg->cookie_domain = NULL; dcfg->cookie_ip_header = NULL; dcfg->style = CT_UNSET; dcfg->enabled = 0; dcfg->expires = 0; dcfg->note_name = NOTE_NAME; dcfg->header_name = HEADER_NAME; dcfg->send_header = 0; dcfg->dnt_value = DNT_VALUE; dcfg->set_dnt_cookie = 1; dcfg->comply_with_dnt = 1; dcfg->dnt_expires = DNT_EXPIRES; dcfg->dnt_max_age = DNT_MAX_AGE; dcfg->dnt_exempt = apr_array_make(p, 2, sizeof(const char*) ); /* In case the user does not use the CookieName directive, * we need to compile the regexp for the default cookie name. */ set_and_comp_regexp(dcfg, p, COOKIE_NAME); return dcfg; }
static void *make_cookie_dir(apr_pool_t *p, char *d) { cookie_dir_rec *dcfg; dcfg = (cookie_dir_rec *) apr_pcalloc(p, sizeof(cookie_dir_rec)); dcfg->cookie_name = COOKIE_NAME; dcfg->cookie_domain = NULL; dcfg->style = CT_UNSET; dcfg->enabled = 0; /* In case the user does not use the CookieName directive, * we need to compile the regexp for the default cookie name. */ set_and_comp_regexp(dcfg, p, COOKIE_NAME); return dcfg; }
static const char *set_cookie_name(cmd_parms *cmd, void *mconfig, const char *name) { cookie_dir_rec *dcfg = (cookie_dir_rec *) mconfig; dcfg->cookie_name = name; set_and_comp_regexp(dcfg, cmd->pool, name); if (dcfg->regexp == NULL) { return "Regular expression could not be compiled."; } if (dcfg->regexp->re_nsub + 1 != NUM_SUBS) { return apr_pstrcat(cmd->pool, "Invalid cookie name \"", name, "\"", NULL); } return NULL; }
/* Set the value of a config variabe, strings only */ static const char *set_config_value(cmd_parms *cmd, void *mconfig, const char *value) { cookietrack_settings_rec *dcfg; dcfg = (cookietrack_settings_rec *) mconfig; char name[50]; sprintf( name, "%s", cmd->cmd->name ); /* Unfortunately, C does not have the equivalent of Perls $struct->$name = $value. So we're using a switch instead. Suggestions welcome. */ /* Oh hey, switch statements aren't for strings, so we're going to be using if (strcasecmp(name, "y") == 0) { instead. sexy times! */ /* * Apply restrictions on attributes. */ if( strlen(value) == 0 ) { return apr_psprintf(cmd->pool, "%s not allowed to be NULL", name); } /* Name of the cookie header to send */ if( strcasecmp(name, "CookieHeaderName") == 0 ) { dcfg->header_name = apr_pstrdup(cmd->pool, value); /* Name of the note to use in the logs */ } else if( strcasecmp(name, "CookieNoteName") == 0 ) { dcfg->note_name = apr_pstrdup(cmd->pool, value); /* Value to use if setting a DNT cookie */ } else if( strcasecmp(name, "CookieDNTValue") == 0 ) { dcfg->dnt_value = apr_pstrdup(cmd->pool, value); /* Cookie style to sue */ } else if( strcasecmp(name, "CookieStyle") == 0 ) { if( strcasecmp(value, "Netscape") == 0 ) { dcfg->style = CT_NETSCAPE; } else if( (strcasecmp(value, "Cookie") == 0) || (strcasecmp(value, "RFC2109") == 0) ) { dcfg->style = CT_COOKIE; } else if( (strcasecmp(value, "Cookie2") == 0) || (strcasecmp(value, "RFC2965") == 0) ) { dcfg->style = CT_COOKIE2; } else { return apr_psprintf(cmd->pool, "Invalid %s: %s", name, value); } /* Name of the note to use in the logs */ } else if( strcasecmp(name, "CookieIPHeader") == 0 ) { dcfg->cookie_ip_header = apr_pstrdup(cmd->pool, value); /* Domain to set the cookie in */ } else if( strcasecmp(name, "CookieDomain") == 0 ) { if( value[0] != '.' ) { return "CookieDomain values must begin with a dot"; } if( ap_strchr_c( &value[1], '.' ) == NULL ) { return "CookieDomain values must contain at least one embedded dot"; } dcfg->cookie_domain = apr_pstrdup(cmd->pool, value); /* Name of the cookie */ } else if( strcasecmp(name, "CookieName") == 0 ) { dcfg->cookie_name = apr_pstrdup(cmd->pool, value); /* build regex to compare against */ set_and_comp_regexp(dcfg, cmd->pool, value); if (dcfg->regexp == NULL) { return "Regular expression could not be compiled."; } if (dcfg->regexp->re_nsub + 1 != NUM_SUBS) { return apr_psprintf(cmd->pool, "Invalid cookie name: %s", value); } } else if( strcasecmp(name, "CookieDNTExempt") == 0 ) { // following tutorial here: // http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-19.html const char *str = apr_pstrdup(cmd->pool, value); *(const char**)apr_array_push(dcfg->dnt_exempt) = str; _DEBUG && fprintf( stderr, "dnt exempt = %s\n", str ); char *ary = apr_array_pstrcat( cmd->pool, dcfg->dnt_exempt, '-' ); _DEBUG && fprintf( stderr, "dnt exempt as str = %s\n", ary ); } else { return apr_psprintf(cmd->pool, "No such variable %s", name); } return NULL; }