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

If user name is embedded but password is missing in URI, first
	resolve password using .netrc. If password is found in .netrc,
	then use it as password. If not, use the password specified in
	--ftp-passwd.
	* src/AuthConfigFactory.cc
	* src/Request.cc
	* src/Request.h
	* test/AuthConfigFactoryTest.cc
pull/1/head
Tatsuhiro Tsujikawa 2009-10-27 12:58:46 +00:00
parent cda8b2e343
commit 14a47f43f8
5 changed files with 67 additions and 1 deletions

View File

@ -1,3 +1,14 @@
2009-10-27 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
If user name is embedded but password is missing in URI, first
resolve password using .netrc. If password is found in .netrc,
then use it as password. If not, use the password specified in
--ftp-passwd.
* src/AuthConfigFactory.cc
* src/Request.cc
* src/Request.h
* test/AuthConfigFactoryTest.cc
2009-10-25 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> 2009-10-25 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed typo Fixed typo

View File

@ -86,7 +86,26 @@ AuthConfigFactory::createAuthConfig
} }
} else if(request->getProtocol() == Request::PROTO_FTP) { } else if(request->getProtocol() == Request::PROTO_FTP) {
if(!request->getUsername().empty()) { if(!request->getUsername().empty()) {
if(request->hasPassword()) {
return createAuthConfig(request->getUsername(), request->getPassword()); return createAuthConfig(request->getUsername(), request->getPassword());
} else {
if(!op->getAsBool(PREF_NO_NETRC)) {
// First, check we have password corresponding to host and
// username
NetrcAuthResolver authResolver;
authResolver.setNetrc(_netrc);
SharedHandle<AuthConfig> ac =
authResolver.resolveAuthConfig(request->getHost());
if(!ac.isNull() && ac->getUser() == request->getUsername()) {
return ac;
}
}
// We don't have password for host and username. Return
// password specified by --ftp-passwd
return
createAuthConfig(request->getUsername(), op->get(PREF_FTP_PASSWD));
}
} else { } else {
return return
createFtpAuthResolver(op)->resolveAuthConfig(request->getHost()); createFtpAuthResolver(op)->resolveAuthConfig(request->getHost());

View File

@ -72,6 +72,7 @@ Request::Request():
_pipeliningHint(false), _pipeliningHint(false),
_maxPipelinedRequest(1), _maxPipelinedRequest(1),
method(METHOD_GET), method(METHOD_GET),
_hasPassword(false),
_ipv6LiteralAddress(false) _ipv6LiteralAddress(false)
{} {}
@ -161,6 +162,7 @@ bool Request::parseUrl(const std::string& url) {
_query = A2STR::NIL; _query = A2STR::NIL;
_username = A2STR::NIL; _username = A2STR::NIL;
_password = A2STR::NIL; _password = A2STR::NIL;
_hasPassword = false;
_ipv6LiteralAddress = false; _ipv6LiteralAddress = false;
// find query part // find query part
std::string queryTemp; std::string queryTemp;
@ -193,6 +195,9 @@ bool Request::parseUrl(const std::string& url) {
util::split(authPart, A2STR::COLON_C); util::split(authPart, A2STR::COLON_C);
_username = util::urldecode(userPass.first); _username = util::urldecode(userPass.first);
_password = util::urldecode(userPass.second); _password = util::urldecode(userPass.second);
if(authPart.find(A2STR::COLON_C) != std::string::npos) {
_hasPassword = true;
}
hostPart.erase(0, atmarkp+1); hostPart.erase(0, atmarkp+1);
} }
{ {

View File

@ -83,6 +83,8 @@ private:
std::string _password; std::string _password;
bool _hasPassword;
bool _ipv6LiteralAddress; bool _ipv6LiteralAddress;
SharedHandle<PeerStat> _peerStat; SharedHandle<PeerStat> _peerStat;
@ -191,6 +193,12 @@ public:
return _password; return _password;
} }
// Returns true if current URI has embedded password.
bool hasPassword() const
{
return _hasPassword;
}
const std::string& getMethod() const { const std::string& getMethod() const {
return method; return method;
} }

View File

@ -170,6 +170,29 @@ void AuthConfigFactoryTest::testCreateAuthConfig_ftp()
req->setUrl("ftp://aria2user:aria2password@localhost/download/aria2-1.0.0.tar.bz2"); req->setUrl("ftp://aria2user:aria2password@localhost/download/aria2-1.0.0.tar.bz2");
CPPUNIT_ASSERT_EQUAL(std::string("aria2user:aria2password"), CPPUNIT_ASSERT_EQUAL(std::string("aria2user:aria2password"),
factory.createAuthConfig(req, &option)->getAuthText()); factory.createAuthConfig(req, &option)->getAuthText());
// username in URI, but no password. We have DefaultAuthenticator
// but username is not aria2user
req->setUrl("ftp://aria2user@localhost/download/aria2-1.0.0.tar.bz2");
CPPUNIT_ASSERT_EQUAL(std::string("aria2user:userDefinedPassword"),
factory.createAuthConfig(req, &option)->getAuthText());
// Recreate netrc with entry for user aria2user
netrc.reset(new Netrc());
netrc->addAuthenticator
(SharedHandle<Authenticator>(new Authenticator("localhost",
"aria2user",
"netrcpass",
"netrcacct")));
factory.setNetrc(netrc);
// This time, we can find same username "aria2user" in netrc, so the
// password "netrcpass" is used, instead of "userDefinedPassword"
CPPUNIT_ASSERT_EQUAL(std::string("aria2user:netrcpass"),
factory.createAuthConfig(req, &option)->getAuthText());
// No netrc entry for host mirror, so "userDefinedPassword" is used.
req->setUrl("ftp://aria2user@mirror/download/aria2-1.0.0.tar.bz2");
CPPUNIT_ASSERT_EQUAL(std::string("aria2user:userDefinedPassword"),
factory.createAuthConfig(req, &option)->getAuthText());
} }
void AuthConfigFactoryTest::testUpdateBasicCred() void AuthConfigFactoryTest::testUpdateBasicCred()