static void expect(int lineno, const char *exp_reply, const char *scheme, const char *host, const char *path) { char *reply = a_Cookies_get_query(scheme, host, path); if (strcmp(reply, exp_reply)) { MSG("line %d: EXPECTED: %s GOT: %s\n", lineno, exp_reply, reply); failed++; } else { passed++; } }
/* * Make the http query string */ Dstr *a_Http_make_query_str(const DilloUrl *url, const DilloUrl *requester, bool_t use_proxy) { char *ptr, *cookies, *referer, *auth; Dstr *query = dStr_new(""), *request_uri = dStr_new(""), *proxy_auth = dStr_new(""); if (use_proxy) { dStr_sprintfa(request_uri, "%s%s", URL_STR(url), (URL_PATH_(url) || URL_QUERY_(url)) ? "" : "/"); if ((ptr = strrchr(request_uri->str, '#'))) dStr_truncate(request_uri, ptr - request_uri->str); if (HTTP_Proxy_Auth_base64) dStr_sprintf(proxy_auth, "Proxy-Authorization: Basic %s\r\n", HTTP_Proxy_Auth_base64); } else { dStr_sprintfa(request_uri, "%s%s%s%s", URL_PATH(url), URL_QUERY_(url) ? "?" : "", URL_QUERY(url), (URL_PATH_(url) || URL_QUERY_(url)) ? "" : "/"); } cookies = a_Cookies_get_query(url, requester); auth = a_Auth_get_auth_str(url, request_uri->str); referer = Http_get_referer(url); if (URL_FLAGS(url) & URL_Post) { Dstr *content_type = Http_make_content_type(url); dStr_sprintfa( query, "POST %s HTTP/1.1\r\n" "Connection: close\r\n" "Accept: text/*,image/*,*/*;q=0.2\r\n" "Accept-Charset: utf-8,*;q=0.8\r\n" "Accept-Encoding: gzip\r\n" "%s" /* language */ "%s" /* auth */ "Host: %s\r\n" "%s" "%s" "User-Agent: %s\r\n" "Content-Length: %ld\r\n" "Content-Type: %s\r\n" "%s" /* cookies */ "\r\n", request_uri->str, HTTP_Language_hdr, auth ? auth : "", URL_AUTHORITY(url), proxy_auth->str, referer, prefs.http_user_agent, (long)URL_DATA(url)->len, content_type->str, cookies); dStr_append_l(query, URL_DATA(url)->str, URL_DATA(url)->len); dStr_free(content_type, TRUE); } else { dStr_sprintfa( query, "GET %s HTTP/1.1\r\n" "%s" "Connection: close\r\n" "Accept: text/*,image/*,*/*;q=0.2\r\n" "Accept-Charset: utf-8,*;q=0.8\r\n" "Accept-Encoding: gzip\r\n" "%s" /* language */ "%s" /* auth */ "Host: %s\r\n" "%s" "%s" "User-Agent: %s\r\n" "%s" /* cookies */ "\r\n", request_uri->str, (URL_FLAGS(url) & URL_E2EQuery) ? "Cache-Control: no-cache\r\nPragma: no-cache\r\n" : "", HTTP_Language_hdr, auth ? auth : "", URL_AUTHORITY(url), proxy_auth->str, referer, prefs.http_user_agent, cookies); } dFree(referer); dFree(cookies); dFree(auth); dStr_free(request_uri, TRUE); dStr_free(proxy_auth, TRUE); _MSG("Query: {%s}\n", dStr_printable(query, 8192)); return query; }
int main() { if (Cookies_rc_check()) { MSG("If you change cookiesrc, remember to stop the DPIs via dpidc.\n"); return 1; } a_Cookies_set("name=val", "ordinary.com", "/", NULL); expect(__LINE__, "Cookie: name=val\r\n", "http", "ordinary.com", "/"); toomany(); maxage(); expires_server_ahead(); expires_server_behind(); expires_extremes(); expires_date_formats(); a_Cookies_set("name=val; expires=\"Sun Jan 10 00:00:00 2038\"", "quoted-date.org", "/", NULL); expect(__LINE__, "Cookie: name=val\r\n", "http", "quoted-date.org", "/"); a_Cookies_set("name=val; expires=\"Sun Jan 11 00:00:00 1970\"", "quoted-pastdate.org", "/", NULL); expect(__LINE__, "", "http", "quoted-pastdate.org", "/"); path(); /* LEADING/TRAILING DOTS AND A LITTLE PUBLIC SUFFIX */ a_Cookies_set("name=val; domain=co.il", "www.co.il", "/", NULL); expect(__LINE__, "", "http", "www.co.il", "/"); a_Cookies_set("name=val; domain=.co.il", "www.co.il", "/", NULL); expect(__LINE__, "", "http", "www.co.il", "/"); a_Cookies_set("name=val; domain=co.il.", "www.co.il.", "/", NULL); expect(__LINE__, "", "http", "www.co.il.", "/"); a_Cookies_set("name=val; domain=.co.il.", "www.co.il.", "/", NULL); expect(__LINE__, "", "http", ".www.co.il.", "/"); a_Cookies_set("name=val; domain=co.org", "www.co.org", "/", NULL); expect(__LINE__, "Cookie: name=val\r\n", "http", "www.co.org", "/"); a_Cookies_set("name=val; domain=.cp.org", "www.cp.org", "/", NULL); expect(__LINE__, "Cookie: name=val\r\n", "http", "www.cp.org", "/"); /* DOTDOMAIN */ a_Cookies_set("name=val; domain=.dotdomain.org", "dotdomain.org", "/", NULL); expect(__LINE__, "Cookie: name=val\r\n", "http", "dotdomain.org", "/"); expect(__LINE__, "Cookie: name=val\r\n", "http", "www.dotdomain.org", "/"); /* HOST_ONLY */ a_Cookies_set("name=val; domain=.hostonly.org", "hostonly.org", "/", NULL); a_Cookies_set("name2=val2", "hostonly.org", "/", NULL); a_Cookies_set("name3=val3; domain=hostonly.org", "hostonly.org", "/", NULL); expect(__LINE__, "Cookie: name=val; name2=val2; name3=val3\r\n", "http", "hostonly.org", "/"); a_Cookies_set("name=new; domain=.hostonly.org", "hostonly.org", "/", NULL); expect(__LINE__, "Cookie: name=new; name2=val2; name3=val3\r\n", "http", "hostonly.org", "/"); a_Cookies_set("name2=new2", "hostonly.org", "/", NULL); expect(__LINE__, "Cookie: name=new; name2=new2; name3=val3\r\n", "http", "hostonly.org", "/"); a_Cookies_set("name3=new3; domain=hostonly.org", "hostonly.org", "/", NULL); expect(__LINE__, "Cookie: name=new; name2=new2; name3=new3\r\n", "http", "hostonly.org", "/"); /* SUBDOMAIN */ a_Cookies_set("name=val; domain=www.subdomain.com", "subdomain.com", "/", NULL); a_Cookies_set("name=val; domain=.www.subdomain.com", "subdomain.com", "/", NULL); expect(__LINE__, "", "http", "subdomain.com", "/"); expect(__LINE__, "", "http", "www.subdomain.com", "/"); /* SUPERDOMAIN(?) */ a_Cookies_set("name=val; domain=.supdomain.com", "www.supdomain.com", "/", NULL); a_Cookies_set("name2=val2; domain=supdomain.com", "www.supdomain.com", "/", NULL); expect(__LINE__, "Cookie: name=val; name2=val2\r\n", "http", "sub2.sub.supdomain.com", "/"); expect(__LINE__, "Cookie: name=val; name2=val2\r\n", "http", "www.supdomain.com", "/"); expect(__LINE__, "Cookie: name=val; name2=val2\r\n", "http", "supdomain.com", "/"); /* UNRELATED */ a_Cookies_set("name=val; domain=another.com", "unrelated.com", "/", NULL); expect(__LINE__, "", "http", "another.com", "/"); a_Cookies_set("name=val; domain=another.com", "a.org", "/", NULL); expect(__LINE__, "", "http", "another.com", "/"); a_Cookies_set("name=val; domain=another.com", "badguys.com", "/", NULL); expect(__LINE__, "", "http", "another.com", "/"); a_Cookies_set("name=val; domain=another.com", "more.badguys.com", "/", NULL); expect(__LINE__, "", "http", "another.com", "/"); a_Cookies_set("name=val; domain=another.com", "verybadguys.com", "/", NULL); expect(__LINE__, "", "http", "another.com", "/"); a_Cookies_set("name=val; domain=similar.com", "imilar.com", "/", NULL); a_Cookies_set("name2=val2; domain=similar.com", "ssimilar.com", "/", NULL); a_Cookies_set("name3=val3; domain=.similar.com", "imilar.com", "/", NULL); a_Cookies_set("name4=val4; domain=.similar.com", "timilar.com", "/", NULL); a_Cookies_set("name4=val4; domain=.similar.com", "tiimilar.com", "/", NULL); expect(__LINE__, "", "http", "similar.com", "/"); /* SECURE */ a_Cookies_set("name=val; secure", "secure.com", "/", NULL); expect(__LINE__, "", "http", "secure.com", "/"); expect(__LINE__, "Cookie: name=val\r\n", "https", "secure.com", "/"); /* HTTPONLY */ a_Cookies_set("name=val; HttpOnly", "httponly.net", "/", NULL); expect(__LINE__, "Cookie: name=val\r\n", "http", "httponly.net", "/"); /* GIBBERISH ATTR IGNORED */ a_Cookies_set("name=val; ldkfals", "gibberish.net", "/", NULL); expect(__LINE__, "Cookie: name=val\r\n", "http", "gibberish.net", "/"); /* WHITESPACE/DELIMITERS */ a_Cookies_set(" name=val ", "whitespace.net", "/", NULL); a_Cookies_set("name2=val2;", "whitespace.net", "/", NULL); expect(__LINE__, "Cookie: name=val; name2=val2\r\n", "http", "whitespace.net", "/"); /* NAMELESS/VALUELESS */ a_Cookies_set("value", "nonameval.org", "/", NULL); a_Cookies_set("name=", "nonameval.org", "/", NULL); a_Cookies_set("name2= ", "nonameval.org", "/", NULL); expect(__LINE__, "Cookie: name=; name2=\r\n", "http", "nonameval.org", "/"); a_Cookies_set("=val2", "nonameval.org", "/", NULL); expect(__LINE__, "Cookie: name=; name2=\r\n", "http", "nonameval.org", "/"); /* SOME IP ADDRS */ a_Cookies_set("name=val", "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", "/", NULL); expect(__LINE__, "Cookie: name=val\r\n", "http", "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", "/"); a_Cookies_set("name=val", "::FFFF:129.144.52.38", "/", NULL); expect(__LINE__, "Cookie: name=val\r\n", "http", "::FFFF:129.144.52.38", "/"); a_Cookies_set("name=val", "127.0.0.1", "/", NULL); expect(__LINE__, "Cookie: name=val\r\n", "http", "127.0.0.1", "/"); a_Cookies_set("name=val; domain=128.0.0.1", "128.0.0.1", "/", NULL); expect(__LINE__, "Cookie: name=val\r\n", "http", "128.0.0.1", "/"); a_Cookies_set("name=val; domain=130.0.0.1", "129.0.0.1", "/", NULL); expect(__LINE__, "", "http", "129.0.0.1", "/"); expect(__LINE__, "", "http", "130.0.0.1", "/"); a_Cookies_set("name=val", "2.0.0.1", "/", NULL); a_Cookies_set("name=bad; domain=22.0.0.1", "2.0.0.1", "/", NULL); a_Cookies_set("name=bad; domain=.0.0.1", "2.0.0.1", "/", NULL); a_Cookies_set("name=bad; domain=not-ip.org", "2.0.0.1", "/", NULL); expect(__LINE__, "", "http", "22.0.0.1", "/"); expect(__LINE__, "", "http", "not-ip.org", "/"); expect(__LINE__, "Cookie: name=val\r\n", "http", "2.0.0.1", "/"); #if 0 HAD BEEN PLAYING AROUND WITH REAL PUBLIC SUFFIX a_Cookies_set("name=val;domain=sub.sub.yokohama.jp", "sub.sub.yokohama.jp", "/", NULL); MSG("sub sub yokohama should work: %s\n", a_Cookies_get_query("http", "sub.sub.yokohama.jp", "/")); a_Cookies_set("name=val; domain=sub.tokyo.jp", "sub.sub.tokyo.jp", "/", NULL); MSG("sub tokyo jp should fail: %s\n", a_Cookies_get_query("http", "sub.sub.tokyo.jp", "/")); a_Cookies_set("name=val; domain=pref.chiba.jp", "sub.pref.chiba.jp", "/", NULL); MSG("pref chiba jp should succeed: %s\n", a_Cookies_get_query("http", "sub.pref.chiba.jp", "/")); a_Cookies_set("name=val; domain=org", "www.dillo.org", "/", NULL); a_Cookies_set("name=val; domain=org", "dillo.org", "/", NULL); a_Cookies_set("name=val; domain=org", ".dillo.org", "/", NULL); a_Cookies_set("name=val; domain=org.", ".dillo.org", "/", NULL); a_Cookies_set("name=val; domain=org.", ".dillo.org.", "/", NULL); MSG("org should fail: %s\n", a_Cookies_get_query("http", "www.dillo.org", "/")); #endif MSG("TESTS: passed: %u failed: %u\n", passed, failed); MSG("Now that everything is full of fake cookies, you should run " "'dpidc stop', plus delete cookies.txt if necessary.\n"); return 0; }