Author: jkupec
Date: Thu Sep 18 12:34:14 2008
New Revision: 11091
URL: http://svn.opensuse.org/viewcvs/zypp?rev=11091&view=rev
Log:
- repomanager: pass service's credentials down to repos
- credmanager: add*Cred(), save() added, saveIn() renamed to saveInFile()
Modified:
trunk/libzypp/tests/media/CredentialManager_test.cc
trunk/libzypp/zypp/RepoManager.cc
trunk/libzypp/zypp/media/CredentialManager.cc
trunk/libzypp/zypp/media/CredentialManager.h
trunk/libzypp/zypp/media/MediaUserAuth.cc
trunk/libzypp/zypp/media/MediaUserAuth.h
Modified: trunk/libzypp/tests/media/CredentialManager_test.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/tests/media/CredentialManager_test.cc?rev=11091&r1=11090&r2=11091&view=diff
==============================================================================
--- trunk/libzypp/tests/media/CredentialManager_test.cc (original)
+++ trunk/libzypp/tests/media/CredentialManager_test.cc Thu Sep 18 12:34:14 2008
@@ -21,20 +21,21 @@
opts.userCredFilePath = Pathname();
CredentialManager cm(opts);
- Url url("https://drink.it/repo/roots");
+ BOOST_CHECK(cm.credsGlobalSize() == 2);
+ Url url("https://drink.it/repo/roots");
AuthData_Ptr credentials = cm.getCred(url);
-
+ BOOST_CHECK(credentials.get() != NULL);
+ if (!credentials)
+ return;
BOOST_CHECK(credentials->username() == "ginger");
BOOST_CHECK(credentials->password() == "ale");
Url url2("ftp://magda@weprovidesoft.fr/download/opensuse/110");
-
credentials = cm.getCred(url2);
BOOST_CHECK(credentials.get() != NULL);
if (!credentials)
return;
-
BOOST_CHECK(credentials->username() == "magda");
BOOST_CHECK(credentials->password() == "richard");
}
@@ -51,6 +52,7 @@
CredentialManager::CredentialSet creds;
};
+
BOOST_AUTO_TEST_CASE(save_creds)
{
filesystem::TmpDir tmp;
@@ -58,32 +60,39 @@
CredManagerOptions opts;
opts.globalCredFilePath = tmp / "fooha";
-
CredentialManager cm1(opts);
AuthData cr1("benson","absolute");
cr1.setUrl(Url("http://joooha.com"));
AuthData cr2("pat","vymetheny");
cr2.setUrl(Url("ftp://filesuck.org"));
+ // should creat a new file
cm1.saveInGlobal(cr1);
-
+
CredCollector collector;
CredentialFileReader reader(opts.globalCredFilePath,
bind( &CredCollector::collect, &collector, _1 ));
-
BOOST_CHECK(collector.creds.size() == 1);
+
+ cout << "----" << endl;
collector.creds.clear();
-
cm1.saveInGlobal(cr2);
filesystem::copy(opts.globalCredFilePath, "/home/jkupec/tmp/foo");
CredentialFileReader reader1(opts.globalCredFilePath,
bind( &CredCollector::collect, &collector, _1 ));
-
BOOST_CHECK(collector.creds.size() == 2);
+
+ cout << "----" << endl;
collector.creds.clear();
- // todo save the same creds.
+
+ // save the same creds again
+ cm1.saveInGlobal(cr2);
+ CredentialFileReader reader2(opts.globalCredFilePath,
+ bind( &CredCollector::collect, &collector, _1 ));
+ BOOST_CHECK(collector.creds.size() == 2);
+
// todo check created file permissions
}
\ No newline at end of file
Modified: trunk/libzypp/zypp/RepoManager.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/RepoManager.cc?rev=11091&r1=11090&r2=11091&view=diff
==============================================================================
--- trunk/libzypp/zypp/RepoManager.cc (original)
+++ trunk/libzypp/zypp/RepoManager.cc Thu Sep 18 12:34:14 2008
@@ -1522,8 +1522,8 @@
ServiceInfo toSave( service );
_pimpl->saveService( toSave );
_pimpl->services.insert( toSave );
-
- // check for credentials in Url
+
+ // check for credentials in Url (username:password, not ?credentials param)
if ( !toSave.url().getUsername().empty() && !toSave.url().getPassword().empty() )
{
media::CredentialManager cm(
@@ -1645,6 +1645,12 @@
mediamanager.release( mid );
mediamanager.close( mid );
+ string serviceCredParam = service.url().getQueryParam("credentials");
+ INT << "service creds file " << serviceCredParam << endl;
+
+ // URL credentials to store
+ set<Url> urlsWithCredentials;
+
// set service alias and base url for all collected repositories
for_( it, collector.repos.begin(), collector.repos.end() )
{
@@ -1666,6 +1672,18 @@
it->setPath("");
}
+ // use the same credentials as the service
+ if (!serviceCredParam.empty())
+ url.setQueryParam("credentials", serviceCredParam);
+ else if (!service.url().getUsername().empty()
+ && !service.url().getPassword().empty())
+ {
+ url.setUsername(service.url().getUsername());
+ url.setPassword(service.url().getPassword());
+ // need to save these, creds not shared with the service like above
+ urlsWithCredentials.insert(url);
+ }
+
// save the url
it->setBaseUrl( url );
// set refrence to the parent service
@@ -1714,6 +1732,8 @@
// exists outside this service. Maybe forcefully re-alias
// the existing repo?
addRepository( *it );
+
+ // save repo credentials
}
else
{
@@ -1726,7 +1746,7 @@
oldRepoModified = true;
}
-#warning also check changed URL due to PATH change in service
+#warning also check changed URL due to PATH/URL change in service, but ignore ?credentials param!
// save if modified:
if ( oldRepoModified )
{
@@ -1741,8 +1761,19 @@
// write out modified service file.
modifyService( service.alias(), service );
}
+
+ // save new/modified credentials
+ if (!urlsWithCredentials.empty())
+ {
+ media::CredentialManager cm(
+ media::CredManagerOptions(_pimpl->options.rootDir) );
+ for_(urlit, urlsWithCredentials.begin(), urlsWithCredentials.end())
+ cm.addUserCred(media::AuthData(*urlit));
+ cm.save();
+ }
}
+
void RepoManager::modifyService(const std::string & oldAlias, const ServiceInfo & service)
{
MIL << "Going to modify service " << oldAlias << endl;
Modified: trunk/libzypp/zypp/media/CredentialManager.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/media/CredentialManager.cc?rev=11091&r1=11090&r2=11091&view=diff
==============================================================================
--- trunk/libzypp/zypp/media/CredentialManager.cc (original)
+++ trunk/libzypp/zypp/media/CredentialManager.cc Thu Sep 18 12:34:14 2008
@@ -78,6 +78,9 @@
CredentialSet _credsGlobal;
CredentialSet _credsUser;
CredentialSet _credsTmp;
+
+ bool _globalDirty;
+ bool _userDirty;
};
//////////////////////////////////////////////////////////////////////
@@ -90,6 +93,8 @@
CredentialManager::Impl::Impl(const CredManagerOptions & options)
: _options(options)
+ , _globalDirty(false)
+ , _userDirty(false)
{
init_globalCredentials();
init_userCredentials();
@@ -134,7 +139,7 @@
bind(&Impl::processCredentials, this, _1));
}
else
- DBG << "user cred file does not exist";
+ DBG << "user cred file does not exist" << endl;
_credsUser = _credsTmp; _credsTmp.clear();
DBG << "Got " << _credsUser.size() << " user records." << endl;
@@ -262,36 +267,78 @@
AuthData_Ptr CredentialManager::getCred(const Url & url)
- { return _pimpl->getCred(url); }
+ {
+ string credfile = url.getQueryParam("credentials");
+ if (credfile.empty())
+ return _pimpl->getCred(url);
+ return _pimpl->getCredFromFile(credfile);
+ }
AuthData_Ptr CredentialManager::getCredFromFile(const Pathname & file)
{ return _pimpl->getCredFromFile(file); }
- void CredentialManager::save(const AuthData & cred, bool global)
- { global ? saveInGlobal(cred) : saveInUser(cred); }
+ void CredentialManager::addCred(const AuthData & cred)
+ {
+ // add with user callbacks
+ }
- void CredentialManager::saveInGlobal(const AuthData & cred)
+ void CredentialManager::addGlobalCred(const AuthData & cred)
{
AuthData_Ptr c_ptr;
c_ptr.reset(new AuthData(cred)); // FIX for child classes if needed
- _pimpl->_credsGlobal.insert(c_ptr); //! \todo avoid adding duplicates
- _pimpl->saveGlobalCredentials();
+ if (_pimpl->_credsGlobal.insert(c_ptr).second)
+ {
+ _pimpl->_globalDirty = true;
+ INT << "changed/new:" << cred << endl;
+ }
+ else
+ INT << "already there: " << cred << endl;
}
- void CredentialManager::saveInUser(const AuthData & cred)
+ void CredentialManager::addUserCred(const AuthData & cred)
{
AuthData_Ptr c_ptr;
c_ptr.reset(new AuthData(cred)); // FIX for child classes if needed
- _pimpl->_credsUser.insert(c_ptr); //! \todo avoid adding duplicates
- _pimpl->saveUserCredentials();
+ if (_pimpl->_credsUser.insert(c_ptr).second)
+ {
+ _pimpl->_userDirty = true;
+ INT << "changed/new:" << cred << endl;
+ }
+ else
+ INT << "already there: " << cred << endl;
+ }
+
+
+ void CredentialManager::save()
+ {
+ if (_pimpl->_globalDirty)
+ _pimpl->saveGlobalCredentials();
+ if (_pimpl->_userDirty)
+ _pimpl->saveUserCredentials();
+ _pimpl->_globalDirty = false;
+ _pimpl->_userDirty = false;
+ }
+
+
+ void CredentialManager::saveInGlobal(const AuthData & cred)
+ {
+ addGlobalCred(cred);
+ save();
+ }
+
+
+ void CredentialManager::saveInUser(const AuthData & cred)
+ {
+ addUserCred(cred);
+ save();
}
- void CredentialManager::saveIn(const AuthData & cred, const Pathname & credFile)
+ void CredentialManager::saveInFile(const AuthData & cred, const Pathname & credFile)
{
AuthData_Ptr c_ptr;
c_ptr.reset(new AuthData(cred)); // FIX for child classes if needed
Modified: trunk/libzypp/zypp/media/CredentialManager.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/media/CredentialManager.h?rev=11091&r1=11090&r2=11091&view=diff
==============================================================================
--- trunk/libzypp/zypp/media/CredentialManager.h (original)
+++ trunk/libzypp/zypp/media/CredentialManager.h Thu Sep 18 12:34:14 2008
@@ -43,6 +43,21 @@
};
//////////////////////////////////////////////////////////////////////
+ // comparator for CredentialSet
+ struct AuthDataComparator
+ {
+ public: bool operator()(const AuthData_Ptr & lhs,
+ const AuthData_Ptr & rhs)
+ {
+ if (lhs->username() < rhs->username())
+ return true;
+ if (lhs->password() < rhs->password())
+ return true;
+ if (lhs->url() != rhs->url())
+ return true;
+ return false;
+ }
+ };
//////////////////////////////////////////////////////////////////////
//
@@ -50,18 +65,18 @@
//
/**
* \todo better method names
- * \todo separate add() and save() methods
* \todo delete(AuthData) method
*/
class CredentialManager
{
public:
- typedef std::set