/* */ #include "Netrc.h" #include "RecoverableException.h" #include "StringFormat.h" #include #include namespace aria2 { std::string Netrc::getRequiredNextToken(std::ifstream& f) const { std::string token; if(f >> token) { return token; } else { throw RecoverableException ("Netrc:parse error. EOF reached where a token expected."); } } void Netrc::skipMacdef(std::ifstream& f) const { std::string line; getline(f, line); while(getline(f, line)) { if(line == "\r" || line == "") { break; } } } void Netrc::parse(const std::string& path) { authenticators.clear(); std::ifstream f(path.c_str()); if(!f) { throw RecoverableException (StringFormat("File not found: %s", path.c_str()).str()); } AuthenticatorHandle authenticator; std::string token; while(f >> token) { if(token == "machine") { storeAuthenticator(authenticator); authenticator.reset(new Authenticator()); authenticator->setMachine(getRequiredNextToken(f)); } else if(token == "default") { storeAuthenticator(authenticator); authenticator.reset(new DefaultAuthenticator()); } else { if(authenticator.isNull()) { throw RecoverableException ("Netrc:parse error. %s encounterd where 'machine' or 'default' expected."); } if(token == "login") { authenticator->setLogin(getRequiredNextToken(f)); } else if(token == "password") { authenticator->setPassword(getRequiredNextToken(f)); } else if(token == "account") { authenticator->setAccount(getRequiredNextToken(f)); } else if(token == "macdef") { getRequiredNextToken(f); skipMacdef(f); } } } storeAuthenticator(authenticator); } void Netrc::storeAuthenticator(const AuthenticatorHandle& authenticator) { if(!authenticator.isNull()) { authenticators.push_back(authenticator); } } class AuthHostMatch { private: std::string hostname; public: AuthHostMatch(const std::string& hostname):hostname(hostname) {} bool operator()(const AuthenticatorHandle& authenticator) { return authenticator->match(hostname); } }; AuthenticatorHandle Netrc::findAuthenticator(const std::string& hostname) const { Authenticators::const_iterator itr = std::find_if(authenticators.begin(), authenticators.end(), AuthHostMatch(hostname)); if(itr == authenticators.end()) { return SharedHandle(); } else { return *itr; } } } // namespace aria2