/* */ #include "NsCookieParser.h" #include #include #include #include "util.h" #include "A2STR.h" #include "DlAbortEx.h" #include "fmt.h" #include "Cookie.h" #include "cookie_helper.h" #include "BufferedFile.h" #include "array_fun.h" namespace aria2 { NsCookieParser::NsCookieParser() {} NsCookieParser::~NsCookieParser() {} namespace { bool parseNsCookie (Cookie& cookie, const char* buf, size_t buflen, time_t creationTime) { std::vector vs; util::splitIter(&buf[0], &buf[buflen], std::back_inserter(vs), '\t', true); if(vs.size() < 6) { return false; } vs[0].first = util::lstripIter(vs[0].first, vs[0].second, '.'); if(vs[5].first == vs[5].second || vs[0].first == vs[0].second || !cookie::goodPath(vs[2].first, vs[2].second)) { return false; } int64_t expiryTime; if(!util::parseLLIntNoThrow(expiryTime, vs[4].first, vs[4].second)) { return false; } if(std::numeric_limits::max() < expiryTime) { expiryTime = std::numeric_limits::max(); } else if(std::numeric_limits::min() > expiryTime) { expiryTime = std::numeric_limits::min(); } cookie.setName(vs[5].first, vs[5].second); if(vs.size() >= 7) { cookie.setValue(vs[6].first, vs[6].second); } else { cookie.setValue(A2STR::NIL.begin(), A2STR::NIL.end()); } cookie.setExpiryTime(expiryTime == 0? std::numeric_limits::max():expiryTime); // aria2 treats expiryTime == 0 means session cookie. cookie.setPersistent(expiryTime != 0); cookie.setDomain(vs[0].first, vs[0].second); const char C_TRUE[] = "TRUE"; cookie.setHostOnly(util::isNumericHost(cookie.getDomain()) || !util::streq(vs[1].first, vs[1].second, C_TRUE, vend(C_TRUE)-1)); cookie.setPath(vs[2].first, vs[2].second); cookie.setSecure(util::streq(vs[3].first, vs[3].second, C_TRUE, vend(C_TRUE)-1)); cookie.setCreationTime(creationTime); return true; } } // namespace std::vector NsCookieParser::parse (const std::string& filename, time_t creationTime) { BufferedFile fp(filename, BufferedFile::READ); if(!fp) { throw DL_ABORT_EX(fmt("Failed to open file %s", filename.c_str())); } std::vector cookies; char buf[8192]; while(1) { if(!fp.getsn(buf, sizeof(buf))) { break; } size_t len = strlen(buf); if(len == 0 || buf[0] == '#') { continue; } Cookie c; if(parseNsCookie(c, buf, len, creationTime)) { cookies.push_back(c); } } return cookies; } } // namespace aria2