/* */ #include "CookieStorage.h" #include #include #include "Util.h" #include "LogFactory.h" #include "Logger.h" #include "DlAbortEx.h" #include "StringFormat.h" #include "NsCookieParser.h" #ifdef HAVE_SQLITE3 # include "Sqlite3MozCookieParser.h" #endif // HAVE_SQLITE3 namespace aria2 { CookieStorage::CookieStorage():_logger(LogFactory::getInstance()) {} CookieStorage::~CookieStorage() {} bool CookieStorage::store(const Cookie& cookie) { if(!cookie.good()) { return false; } std::deque::iterator i = std::find(_cookies.begin(), _cookies.end(), cookie); if(i == _cookies.end()) { if(cookie.isExpired()) { return false; } else { _cookies.push_back(cookie); return true; } } else if(cookie.isExpired()) { _cookies.erase(i); return false; } else { *i = cookie; return true; } } void CookieStorage::storeCookies(const std::deque& cookies) { for(std::deque::const_iterator i = cookies.begin(); i != cookies.end(); ++i) { store(*i); } } bool CookieStorage::parseAndStore(const std::string& setCookieString, const std::string& requestHost, const std::string& requestPath) { Cookie cookie = _parser.parse(setCookieString, requestHost, requestPath); if(cookie.validate(requestHost, requestPath)) { return store(cookie); } else { return false; } } class CriteriaMatch:public std::unary_function { private: std::string _requestHost; std::string _requestPath; time_t _date; bool _secure; public: CriteriaMatch(const std::string& requestHost, const std::string& requestPath, time_t date, bool secure): _requestHost(requestHost), _requestPath(requestPath), _date(date), _secure(secure) {} bool operator()(const Cookie& cookie) const { return cookie.match(_requestHost, _requestPath, _date, _secure); } }; class OrderByPathDesc:public std::binary_function { public: bool operator()(const Cookie& lhs, const Cookie& rhs) const { return lhs.getPath() > rhs.getPath(); } }; std::deque CookieStorage::criteriaFind(const std::string& requestHost, const std::string& requestPath, time_t date, bool secure) const { std::deque res; std::remove_copy_if(_cookies.begin(), _cookies.end(), std::back_inserter(res), std::not1(CriteriaMatch(requestHost, requestPath, date, secure))); std::sort(res.begin(), res.end(), OrderByPathDesc()); return res; } size_t CookieStorage::size() const { return _cookies.size(); } void CookieStorage::load(const std::string& filename) { char header[16]; // "SQLite format 3" plus \0 { std::ifstream s(filename.c_str(), std::ios::binary); s.get(header, sizeof(header)); if(s.bad()) { throw DL_ABORT_EX (StringFormat("Failed to read header of cookie file %s", filename.c_str()).str()); } } try { if(std::string(header) == "SQLite format 3") { #ifdef HAVE_SQLITE3 storeCookies(Sqlite3MozCookieParser().parse(filename)); #else // !HAVE_SQLITE3 throw DL_ABORT_EX ("Cannot read SQLite3 database because SQLite3 support is disabled by" " configuration."); #endif // !HAVE_SQLITE3 } else { storeCookies(NsCookieParser().parse(filename)); } } catch(RecoverableException& e) { throw DL_ABORT_EX2 (StringFormat("Failed to load cookies from %s", filename.c_str()).str(), e); } } } // namespace aria2