2010-10-10 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Retrieve last access time from sqlite3 cookie database.
	* src/CookieStorage.cc
	* src/Sqlite3CookieParser.cc
	* src/Sqlite3CookieParser.h
	* src/Sqlite3CookieParserImpl.cc
	* test/Sqlite3CookieParserTest.cc
	* test/chromium_cookies.sqlite
	* test/cookies.sqlite
pull/1/head
Tatsuhiro Tsujikawa 2010-10-10 09:53:30 +00:00
parent bcddb4cfa3
commit f6dbba5427
8 changed files with 49 additions and 26 deletions

View File

@ -1,3 +1,14 @@
2010-10-10 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Retrieve last access time from sqlite3 cookie database.
* src/CookieStorage.cc
* src/Sqlite3CookieParser.cc
* src/Sqlite3CookieParser.h
* src/Sqlite3CookieParserImpl.cc
* test/Sqlite3CookieParserTest.cc
* test/chromium_cookies.sqlite
* test/cookies.sqlite
2010-10-10 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Remove expired cookies first when cookies_ is full.

View File

@ -308,7 +308,7 @@ bool CookieStorage::load(const std::string& filename, time_t now)
#ifdef HAVE_SQLITE3
std::vector<Cookie> cookies;
try {
Sqlite3MozCookieParser(filename).parse(cookies, now);
Sqlite3MozCookieParser(filename).parse(cookies);
} catch(RecoverableException& e) {
if(logger_->info()) {
logger_->info(EX_EXCEPTION_CAUGHT, e);
@ -316,7 +316,7 @@ bool CookieStorage::load(const std::string& filename, time_t now)
" Retrying, assuming it is Chromium cookie file.");
}
// Try chrome cookie format
Sqlite3ChromiumCookieParser(filename).parse(cookies, now);
Sqlite3ChromiumCookieParser(filename).parse(cookies);
}
storeCookies(cookies.begin(), cookies.end(), now);
#else // !HAVE_SQLITE3

View File

@ -78,9 +78,23 @@ static std::string toString(const char* str)
}
}
static int cookieRowMapper(void* data, int rowIndex,
static bool parseTime(int64_t& time, const std::string& s)
{
if(!util::parseLLIntNoThrow(time, s)) {
return false;
}
if(sizeof(time_t) == 4 && time > INT32_MAX) {
time = INT32_MAX;
}
return true;
}
static int cookieRowMapper(void* data, int columns,
char** values, char** names)
{
if(columns != 7) {
return 0;
}
std::vector<Cookie>& cookies =
*reinterpret_cast<std::vector<Cookie>*>(data);
std::string cookieDomain = cookie::removePrecedingDots(toString(values[0]));
@ -91,13 +105,13 @@ static int cookieRowMapper(void* data, int rowIndex,
return 0;
}
int64_t expiryTime;
if(!util::parseLLIntNoThrow(expiryTime, toString(values[3]))) {
if(!parseTime(expiryTime, toString(values[3]))) {
return 0;
}
if(sizeof(time_t) == 4 && expiryTime > INT32_MAX) {
expiryTime = INT32_MAX;
int64_t lastAccessTime;
if(!parseTime(lastAccessTime, toString(values[6]))) {
return 0;
}
// TODO get last access, creation date(chrome only)
Cookie c(cookieName,
toString(values[5]), // value
expiryTime,
@ -107,14 +121,13 @@ static int cookieRowMapper(void* data, int rowIndex,
cookiePath,
strcmp(toString(values[2]).c_str(), "1") == 0, //secure
false,
0 // creation time. Set this later.
lastAccessTime // creation time. Set this later.
);
cookies.push_back(c);
return 0;
}
void Sqlite3CookieParser::parse
(std::vector<Cookie>& cookies, time_t creationTime)
void Sqlite3CookieParser::parse(std::vector<Cookie>& cookies)
{
if(!db_) {
throw DL_ABORT_EX(StringFormat("SQLite3 database is not opened.").str());
@ -123,13 +136,6 @@ void Sqlite3CookieParser::parse
char* sqlite3ErrMsg = 0;
int ret = sqlite3_exec(db_, getQuery().c_str(), cookieRowMapper,
&tcookies, &sqlite3ErrMsg);
// TODO If last access, creation date are retrieved from database,
// following for loop must be removed.
for(std::vector<Cookie>::iterator i = tcookies.begin(), eoi = tcookies.end();
i != eoi; ++i) {
(*i).setCreationTime(creationTime);
(*i).setLastAccessTime(creationTime);
}
std::string errMsg;
if(sqlite3ErrMsg) {
errMsg = sqlite3ErrMsg;

View File

@ -55,12 +55,12 @@ public:
// Loads cookies from sqlite3 database and stores them in cookies.
// When loading is successful, cookies stored in cookies initially
// are removed. Otherwise, the content of cookies is unchanged.
void parse(std::vector<Cookie>& cookies, time_t creationTime);
void parse(std::vector<Cookie>& cookies);
protected:
// Returns SQL select statement to get 1 record of cookie. The sql
// must return 6 columns in the following order: host, path,
// secure(1 for secure, 0 for not), expiry(utc, unix time), name,
// value
// value, last access time(utc, unix time)
virtual const std::string& getQuery() const = 0;
private:
sqlite3* db_;

View File

@ -44,7 +44,8 @@ Sqlite3MozCookieParser::~Sqlite3MozCookieParser() {}
const std::string& Sqlite3MozCookieParser::getQuery() const
{
static const std::string sql =
"SELECT host, path, isSecure, expiry, name, value FROM moz_cookies";
"SELECT host, path, isSecure, expiry, name, value, lastAccessed"
" FROM moz_cookies";
return sql;
}
@ -56,7 +57,8 @@ Sqlite3ChromiumCookieParser::~Sqlite3ChromiumCookieParser() {}
const std::string& Sqlite3ChromiumCookieParser::getQuery() const
{
static const std::string sql =
"SELECT host_key, path, secure, expires_utc, name, value FROM cookies";
"SELECT host_key, path, secure, expires_utc, name, value, last_access_utc"
" FROM cookies";
return sql;
}

View File

@ -35,7 +35,7 @@ void Sqlite3CookieParserTest::testMozParse()
{
Sqlite3MozCookieParser parser("cookies.sqlite");
std::vector<Cookie> cookies;
parser.parse(cookies, 0);
parser.parse(cookies);
CPPUNIT_ASSERT_EQUAL((size_t)3, cookies.size());
const Cookie& localhost = cookies[0];
@ -47,6 +47,8 @@ void Sqlite3CookieParserTest::testMozParse()
CPPUNIT_ASSERT(localhost.getHostOnly());
CPPUNIT_ASSERT_EQUAL(std::string("/"), localhost.getPath());
CPPUNIT_ASSERT(localhost.getSecure());
CPPUNIT_ASSERT_EQUAL((time_t)3000, localhost.getLastAccessTime());
CPPUNIT_ASSERT_EQUAL((time_t)3000, localhost.getCreationTime());
const Cookie& nullValue = cookies[1];
CPPUNIT_ASSERT_EQUAL(std::string("uid"), nullValue.getName());
@ -79,7 +81,7 @@ void Sqlite3CookieParserTest::testMozParse_fileNotFound()
Sqlite3MozCookieParser parser("fileNotFound");
try {
std::vector<Cookie> cookies;
parser.parse(cookies, 0);
parser.parse(cookies);
CPPUNIT_FAIL("exception must be thrown.");
} catch(RecoverableException& e) {
// SUCCESS
@ -93,7 +95,7 @@ void Sqlite3CookieParserTest::testMozParse_badfile()
Sqlite3MozCookieParser parser("badcookies.sqlite");
try {
std::vector<Cookie> cookies;
parser.parse(cookies, 0);
parser.parse(cookies);
CPPUNIT_FAIL("exception must be thrown.");
} catch(RecoverableException& e) {
// SUCCESS
@ -104,7 +106,7 @@ void Sqlite3CookieParserTest::testChromumParse()
{
Sqlite3ChromiumCookieParser parser("chromium_cookies.sqlite");
std::vector<Cookie> cookies;
parser.parse(cookies, 0);
parser.parse(cookies);
CPPUNIT_ASSERT_EQUAL((size_t)3, cookies.size());
const Cookie& sfnet = cookies[0];
@ -130,7 +132,9 @@ void Sqlite3CookieParserTest::testChromumParse()
const Cookie& localnet = cookies[2];
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), localnet.getDomain());
CPPUNIT_ASSERT(sfjp.getHostOnly());
CPPUNIT_ASSERT(sfjp.getHostOnly());
CPPUNIT_ASSERT_EQUAL((time_t)3000, localnet.getLastAccessTime());
CPPUNIT_ASSERT_EQUAL((time_t)3000, localnet.getCreationTime());
}
} // namespace aria2

Binary file not shown.

Binary file not shown.