- save user credentials when adding repos/services with URLs containing
authorJan Kupec <jkupec@suse.cz>
Wed, 17 Sep 2008 16:05:28 +0000 (16:05 +0000)
committerJan Kupec <jkupec@suse.cz>
Wed, 17 Sep 2008 16:05:28 +0000 (16:05 +0000)
  the credentials (bnc #425462)

zypp/RepoManager.cc
zypp/RepoManager.h
zypp/media/CredentialManager.cc

index 6d5de29..887ff66 100644 (file)
@@ -30,6 +30,7 @@
 #include "zypp/RepoManager.h"
 
 #include "zypp/media/MediaManager.h"
+#include "zypp/media/CredentialManager.h"
 #include "zypp/MediaSetAccess.h"
 #include "zypp/ExternalProgram.h"
 #include "zypp/ManagedFile.h"
@@ -120,6 +121,8 @@ namespace zypp
     {
       DBG << "Target not initialized, using an empty servicesTargetDistro." << endl;
     }
+    
+    rootDir = root_r;
   }
 
   RepoManagerOptions RepoManagerOptions::makeTestSetup( const Pathname & root_r )
@@ -131,6 +134,7 @@ namespace zypp
     ret.repoPackagesCachePath = root_r/"packages";
     ret.knownReposPath        = root_r/"repos.d";
     ret.knownServicesPath     = root_r/"services.d";
+    ret.rootDir = root_r;
     return ret;
   }
 
@@ -1217,6 +1221,26 @@ namespace zypp
     tosave.dumpAsIniOn(file);
     tosave.setFilepath(repofile);
     _pimpl->repos.insert(tosave);
+
+    progress.set(90);
+
+    // check for credentials in Urls
+    bool havePasswords = false;
+    for_( urlit, tosave.baseUrlsBegin(), tosave.baseUrlsEnd() )
+      if ( !urlit->getUsername().empty() && !urlit->getPassword().empty() )
+      { havePasswords = true; break; }
+    // save the credentials
+    if ( havePasswords )
+    {
+      media::CredentialManager cm(
+          media::CredManagerOptions(_pimpl->options.rootDir) );
+
+      for_(urlit, tosave.baseUrlsBegin(), tosave.baseUrlsEnd())
+        if (!urlit->getPassword().empty() && !urlit->getUsername().empty())
+          //! \todo use a method calling UI callbacks to ask where to save creds?
+          cm.saveInUser(media::AuthData(*urlit)); 
+    }
+
     progress.toMax();
     MIL << "done" << endl;
   }
@@ -1498,6 +1522,16 @@ namespace zypp
     ServiceInfo toSave( service );
     _pimpl->saveService( toSave );
     _pimpl->services.insert( toSave );
+    
+    // check for credentials in Url
+    if ( !toSave.url().getUsername().empty() && !toSave.url().getPassword().empty() )
+    {
+      media::CredentialManager cm(
+          media::CredManagerOptions(_pimpl->options.rootDir) );
+
+      //! \todo use a method calling UI callbacks to ask where to save creds?
+      cm.saveInUser(media::AuthData(toSave.url()));
+    }
 
     MIL << "added service " << toSave.alias() << endl;
   }
index d0d1bc1..39dcf6e 100644 (file)
@@ -93,6 +93,9 @@ namespace zypp
      * If empty, no repositories contained in the index will be skipped.
      */
     std::string servicesTargetDistro;
+
+    /** remembers root_r value for later use */
+    Pathname rootDir;
   };
 
 
index 6281bb1..8981aae 100644 (file)
@@ -217,10 +217,12 @@ namespace zypp
 
   static void save_creds_in_file(
       const CredentialManager::CredentialSet creds,
-      const Pathname & file)
+      const Pathname & file/*,
+       desired permissions*/)
   {
     filesystem::assert_dir(file.dirname());
 
+    //! \todo set correct permissions
     std::ofstream fs(file.c_str());
     if (!fs)
       ZYPP_THROW(Exception("Can't open " + file.asString()));
@@ -280,7 +282,7 @@ namespace zypp
 
   void saveIn(const AuthData &, const Pathname & credFile)
   {
-    //! \todo
+    //! \todo save in the file or  /etc/zypp/credentials.d/credFile if not absolute 
   }
 
   CredentialManager::CredentialIterator CredentialManager::credsGlobalBegin() const