diff --git a/ChangeLog b/ChangeLog index 1190fa30..07a1b0c7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-10-26 Tatsuhiro Tsujikawa + + Treat Cookie object as session cookie if expiry = 0 is given. + With this change, you can specify session scoped cookies in an external + file setting expiry value to 0. + * src/Cookie.cc + * src/Cookie.h + * test/CookieParserTest.cc + * test/CookieStorageTest.cc + * test/CookieTest.cc + 2008-10-26 Tatsuhiro Tsujikawa Changed signature of DHTMessageFactory::createResponseMessage(). diff --git a/src/Cookie.cc b/src/Cookie.cc index 9a771ae9..8caeca70 100644 --- a/src/Cookie.cc +++ b/src/Cookie.cc @@ -33,10 +33,12 @@ */ /* copyright --> */ #include "Cookie.h" + +#include + #include "Util.h" #include "A2STR.h" #include "TimeA2.h" -#include namespace aria2 { @@ -51,8 +53,7 @@ Cookie::Cookie(const std::string& name, _expiry(expiry), _path(path), _domain(Util::toLower(domain)), - _secure(secure), - _onetime(false) {} + _secure(secure) {} Cookie::Cookie(const std::string& name, const std::string& value, @@ -64,10 +65,9 @@ Cookie::Cookie(const std::string& name, _expiry(0), _path(path), _domain(Util::toLower(domain)), - _secure(secure), - _onetime(true) {} + _secure(secure) {} -Cookie::Cookie():_expiry(0), _secure(false), _onetime(true) {} +Cookie::Cookie():_expiry(0), _secure(false) {} Cookie::~Cookie() {} @@ -115,7 +115,7 @@ bool Cookie::match(const std::string& requestHost, if((secure || (!_secure && !secure)) && domainMatch(lowerRequestHost, _domain) && pathInclude(requestPath, _path) && - (_onetime || (date < _expiry))) { + (isSessionCookie() || (date < _expiry))) { return true; } else { return false; @@ -172,7 +172,7 @@ bool Cookie::operator==(const Cookie& cookie) const bool Cookie::isExpired() const { - return !_onetime && Time().getTime() >= _expiry; + return !_expiry == 0 && Time().getTime() >= _expiry; } const std::string& Cookie::getName() const @@ -205,9 +205,9 @@ bool Cookie::isSecureCookie() const return _secure; } -bool Cookie::isOnetimeCookie() const +bool Cookie::isSessionCookie() const { - return _onetime; + return _expiry == 0; } } // namespace aria2 diff --git a/src/Cookie.h b/src/Cookie.h index 9052a629..b1b98573 100644 --- a/src/Cookie.h +++ b/src/Cookie.h @@ -36,10 +36,12 @@ #define _D_COOKIE_H_ #include "common.h" -#include "a2time.h" + #include #include +#include "a2time.h" + namespace aria2 { class Cookie { @@ -50,10 +52,10 @@ private: std::string _path; std::string _domain; bool _secure; - - // If true, this cookie will expire when aria2 exits. - bool _onetime; public: + /* + * If expires = 0 is given, then the cookie becomes session cookie. + */ Cookie(const std::string& name, const std::string& value, time_t expires, @@ -61,6 +63,10 @@ public: const std::string& domain, bool secure); + /* + * Creates session cookie. This is equivalent to + * Cookie(name, value, 0, path, domain, secure); + */ Cookie(const std::string& name, const std::string& value, const std::string& path, @@ -97,7 +103,7 @@ public: bool isSecureCookie() const; - bool isOnetimeCookie() const; + bool isSessionCookie() const; }; typedef std::deque Cookies; diff --git a/test/CookieParserTest.cc b/test/CookieParserTest.cc index 7c2dd64a..2f39f1fa 100644 --- a/test/CookieParserTest.cc +++ b/test/CookieParserTest.cc @@ -35,7 +35,7 @@ void CookieParserTest::testParse() CPPUNIT_ASSERT_EQUAL(std::string("/"), c.getPath()); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), c.getDomain()); CPPUNIT_ASSERT_EQUAL(true, c.isSecureCookie()); - CPPUNIT_ASSERT_EQUAL(false, c.isOnetimeCookie()); + CPPUNIT_ASSERT_EQUAL(false, c.isSessionCookie()); std::string str2 = "JSESSIONID=123456789"; c = CookieParser().parse(str2, "default.domain", "/default/path"); @@ -46,7 +46,7 @@ void CookieParserTest::testParse() CPPUNIT_ASSERT_EQUAL(std::string("default.domain"), c.getDomain()); CPPUNIT_ASSERT_EQUAL(std::string("/default/path"), c.getPath()); CPPUNIT_ASSERT_EQUAL(false, c.isSecureCookie()); - CPPUNIT_ASSERT_EQUAL(true, c.isOnetimeCookie()); + CPPUNIT_ASSERT_EQUAL(true, c.isSessionCookie()); std::string str3 = ""; c = CookieParser().parse(str3); @@ -55,7 +55,7 @@ void CookieParserTest::testParse() std::string str4 = "UID=300; expires=Wed, 01-Jan-1890 00:00:00 GMT;"; c = CookieParser().parse(str4, "localhost", "/"); CPPUNIT_ASSERT(c.good()); - CPPUNIT_ASSERT(c.isOnetimeCookie()); + CPPUNIT_ASSERT(c.isSessionCookie()); std::string str5 = "k=v; expires=Sun, 10-Jun-07 11:00:00 GMT"; c = CookieParser().parse(str5); @@ -66,7 +66,7 @@ void CookieParserTest::testParse() CPPUNIT_ASSERT_EQUAL(std::string(""), c.getDomain()); CPPUNIT_ASSERT_EQUAL(std::string(""), c.getPath()); CPPUNIT_ASSERT(!c.isSecureCookie()); - CPPUNIT_ASSERT(!c.isOnetimeCookie()); + CPPUNIT_ASSERT(!c.isSessionCookie()); } void CookieParserTest::testParse_file() diff --git a/test/CookieStorageTest.cc b/test/CookieStorageTest.cc index 1952b9b7..2bd05cac 100644 --- a/test/CookieStorageTest.cc +++ b/test/CookieStorageTest.cc @@ -56,7 +56,7 @@ void CookieStorageTest::testStore() CPPUNIT_ASSERT(std::find(st.begin(), st.end(), updateGoodCookie) != st.end()); CPPUNIT_ASSERT(std::find(st.begin(), st.end(), anotherCookie) != st.end()); - Cookie expireGoodCookie("k", "v3", 0, "/", "localhost", false); + Cookie expireGoodCookie("k", "v3", 1, "/", "localhost", false); CPPUNIT_ASSERT(!st.store(expireGoodCookie)); CPPUNIT_ASSERT_EQUAL((size_t)1, st.size()); CPPUNIT_ASSERT(std::find(st.begin(), st.end(), anotherCookie) != st.end()); @@ -70,6 +70,18 @@ void CookieStorageTest::testStore() CPPUNIT_ASSERT(st.store(fromNumericHost)); CPPUNIT_ASSERT_EQUAL((size_t)2, st.size()); CPPUNIT_ASSERT(std::find(st.begin(), st.end(), fromNumericHost) != st.end()); + + Cookie sessionScopedGoodCookie("k", "v3", 0, "/", "localhost", false); + CPPUNIT_ASSERT(st.store(sessionScopedGoodCookie)); + CPPUNIT_ASSERT_EQUAL((size_t)3, st.size()); + CPPUNIT_ASSERT(std::find(st.begin(), st.end(), + sessionScopedGoodCookie) != st.end()); + + Cookie sessionScopedGoodCookie2("k2", "v3", "/", "localhost", false); + CPPUNIT_ASSERT(st.store(sessionScopedGoodCookie2)); + CPPUNIT_ASSERT_EQUAL((size_t)4, st.size()); + CPPUNIT_ASSERT(std::find(st.begin(), st.end(), + sessionScopedGoodCookie2) != st.end()); } void CookieStorageTest::testParseAndStore() @@ -196,22 +208,34 @@ void CookieStorageTest::testLoad_sqlite3() CookieStorage st; #ifdef HAVE_SQLITE3 st.load("cookies.sqlite"); - CPPUNIT_ASSERT_EQUAL((size_t)2, st.size()); - Cookie c = *st.begin(); + CPPUNIT_ASSERT_EQUAL((size_t)3, st.size()); + std::deque::const_iterator i = st.begin(); + Cookie c = *i++; CPPUNIT_ASSERT_EQUAL(std::string("JSESSIONID"), c.getName()); CPPUNIT_ASSERT_EQUAL(std::string("123456789"), c.getValue()); CPPUNIT_ASSERT_EQUAL((time_t)2147483647, c.getExpiry()); CPPUNIT_ASSERT_EQUAL(std::string("/"), c.getPath()); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), c.getDomain()); CPPUNIT_ASSERT(c.isSecureCookie()); + CPPUNIT_ASSERT(!c.isSessionCookie()); - c = *(st.begin()+1); + c = *i++; + CPPUNIT_ASSERT_EQUAL(std::string("uid"), c.getName()); + CPPUNIT_ASSERT_EQUAL(std::string(""), c.getValue()); + CPPUNIT_ASSERT_EQUAL((time_t)0, c.getExpiry()); + CPPUNIT_ASSERT_EQUAL(std::string("/path/to"), c.getPath()); + CPPUNIT_ASSERT_EQUAL(std::string("null_value"), c.getDomain()); + CPPUNIT_ASSERT(!c.isSecureCookie()); + CPPUNIT_ASSERT(c.isSessionCookie()); + + c = *i++; CPPUNIT_ASSERT_EQUAL(std::string("foo"), c.getName()); CPPUNIT_ASSERT_EQUAL(std::string("bar"), c.getValue()); CPPUNIT_ASSERT_EQUAL((time_t)2147483647, c.getExpiry()); CPPUNIT_ASSERT_EQUAL(std::string("/path/to"), c.getPath()); CPPUNIT_ASSERT_EQUAL(std::string("overflow_time_t"), c.getDomain()); CPPUNIT_ASSERT(!c.isSecureCookie()); + CPPUNIT_ASSERT(!c.isSessionCookie()); #else // !HAVE_SQLITE3 try { diff --git a/test/CookieTest.cc b/test/CookieTest.cc index f04a390b..35795c06 100644 --- a/test/CookieTest.cc +++ b/test/CookieTest.cc @@ -146,6 +146,8 @@ void CookieTest::testIsExpired() CPPUNIT_ASSERT(!validCookie.isExpired()); Cookie sessionCookie("k", "v", "/", "localhost", false); CPPUNIT_ASSERT(!sessionCookie.isExpired()); + Cookie sessionCookie2("k", "v", 0, "/", "localhost", false); + CPPUNIT_ASSERT(!sessionCookie2.isExpired()); } } // namespace aria2