- fix https://bugzilla.novell.com/show_bug.cgi?id=162984 , gpg hangs
authorDuncan Mac-Vicar P <dmacvicar@suse.de>
Tue, 4 Apr 2006 12:03:30 +0000 (12:03 +0000)
committerDuncan Mac-Vicar P <dmacvicar@suse.de>
Tue, 4 Apr 2006 12:03:30 +0000 (12:03 +0000)
  because the matching data file for the key cannot be find.
- Fix restore of YUM source using the same cache dir semantics as
  susetags instead of assuming there is a cache if a cache_dir was
given.

zypp/KeyRing.cc
zypp/KeyRing.h
zypp/source/yum/YUMSourceImpl.cc
zypp/source/yum/YUMSourceImpl.h

index 25ca25e36580bf018cd79ed7842ed1ea5385b3c8..168a2df2b18f35e29a029f8fc39553cecede07a0 100644 (file)
@@ -78,7 +78,7 @@ namespace zypp
 
     void importKey( const Pathname &keyfile, bool trusted = false);
     PublicKey readPublicKey( const Pathname &keyfile );
-    std::string readSignatureKeyId( const Pathname &keyfile );
+    std::string readSignatureKeyId(  const Pathname &data, const Pathname &keyfile );
     
     void deleteKey( const std::string &id, bool trusted );
     std::list<PublicKey> trustedPublicKeys();
@@ -209,7 +209,7 @@ namespace zypp
     MIL << "Going to verify signature for " << file << " with " << signature << std::endl; 
 
     // get the id of the signature
-    std::string id = readSignatureKeyId(signature);
+    std::string id = readSignatureKeyId(file, signature);
     
     // doeskey exists in trusted keyring
     if ( publicKeyExists( id, _trusted_kr ) )
@@ -430,7 +430,7 @@ namespace zypp
   }    
   
   
-  std::string KeyRing::Impl::readSignatureKeyId( const Pathname &keyfile )
+  std::string KeyRing::Impl::readSignatureKeyId( const Pathname &data, const Pathname &keyfile )
   {  
     // HACK create a tmp keyring with no keys
     TmpDir dir;
@@ -446,7 +446,9 @@ namespace zypp
       "1",
       "--homedir",
       dir.path().asString().c_str(),
+      "--verify",
       keyfile.asString().c_str(),
+      data.asString().c_str(),
       NULL
     };
     
@@ -556,9 +558,9 @@ namespace zypp
     return _pimpl->readPublicKey(keyfile);
   }
   
-  std::string KeyRing::readSignatureKeyId( const Pathname &keyfile )
+  std::string KeyRing::readSignatureKeyId(  const Pathname &data, const Pathname &keyfile )
   {
-    return _pimpl->readSignatureKeyId(keyfile);
+    return _pimpl->readSignatureKeyId(data, keyfile);
   }
   
   void KeyRing::deleteKey( const std::string &id, bool trusted )
index 9438e4fd2eaff7a576b8e1f9629d9a42b87e443e..fb1522f9993a713dd8b9cfa962b38283f1f22d71 100644 (file)
@@ -92,7 +92,10 @@ namespace zypp
     
     void dumpPublicKey( const std::string &id, bool trusted, std::ostream &stream );
     
-    std::string readSignatureKeyId( const Pathname &keyfile );
+    /**
+     * reads the public key id used to sign file with keyfile
+     */
+    std::string readSignatureKeyId( const Pathname &data, const Pathname &keyfile );
     
     /**
      * removes a key from the keyring.
index 74c1830e3eeffb582525b66dea5d8a5928ed16fc..2f5fe6857926bd5fa32bf695a8204110db12e0f1 100644 (file)
@@ -37,6 +37,7 @@
 
 #include "zypp/base/GzStream.h"
 #include "zypp/base/Gettext.h"
+#include "zypp/PathInfo.h"
 
 #include <fstream>
 
@@ -61,6 +62,17 @@ namespace zypp
       YUMSourceImpl::YUMSourceImpl()
       {}
 
+      bool YUMSourceImpl::cacheExists()
+      {
+        bool exists = PathInfo(_cache_dir + "/repodata/repomd.xml").isExist();
+        if (exists)
+          MIL << "YUM cache found at " << _cache_dir << std::endl;
+        else
+          MIL << "YUM cache not found" << std::endl;
+        
+        return exists;
+      }
+      
       void YUMSourceImpl::factoryInit()
       {
        try {
@@ -82,7 +94,7 @@ namespace zypp
        try {
          // first read list of all files in the repository
          Pathname filename;
-         if (_cache_dir.empty())
+         if (!cacheExists())
          {
            // now, the file exists, try to read it
            filename = provideFile(_path + "/repodata/repomd.xml");
@@ -99,7 +111,7 @@ namespace zypp
          filesystem::TmpFile tmp;
          filesystem::copy(filename, tmp.path());
          filename = tmp.path();
-         if (_cache_dir.empty())
+         if (!cacheExists())
          {
            MIL << "Trying to get the key" << endl;
            Pathname key_local;
@@ -135,7 +147,7 @@ namespace zypp
              ! repomd.atEnd();
              ++repomd)
          {
-           if (_cache_dir.empty())
+           if (!cacheExists())
            {
              if (! checkCheckSum(provideFile(_path + (*repomd)->location), (*repomd)->checksumType, (*repomd)->checksum))
              {
@@ -144,9 +156,9 @@ namespace zypp
            }
            if ((*repomd)->type == "patches")
            {
-             Pathname filename = _cache_dir.empty()
-               ? provideFile(_path + (*repomd)->location)
-               : _cache_dir + (*repomd)->location;
+              Pathname filename = cacheExists()
+                  ? _cache_dir + (*repomd)->location
+                  : provideFile(_path + (*repomd)->location);
              DBG << "reading file " << filename << endl;
              ifgzstream st ( filename.asString().c_str() );
              YUMPatchesParser patch(st, "");
@@ -155,7 +167,7 @@ namespace zypp
                  ++patch)
              {
                string filename = (*patch)->location;
-               if (_cache_dir.empty())
+               if (!cacheExists())
                {
                  if (! checkCheckSum(provideFile(_path + filename), (*patch)->checksumType, (*patch)->checksum))
                  {
@@ -260,15 +272,15 @@ namespace zypp
 
       try {
          // first read list of all files in the repository
-         Pathname filename = _cache_dir.empty()
-           ? provideFile(_path + "/repodata/repomd.xml")
-           : _cache_dir + "/repodata/repomd.xml";
+        Pathname filename = cacheExists()
+          ? _cache_dir + "/repodata/repomd.xml"
+          : provideFile(_path + "/repodata/repomd.xml");
          _metadata_files.push_back("/repodata/repomd.xml");
          // use tmpfile because of checking integrity - provideFile might release the medium
          filesystem::TmpFile tmp;
          filesystem::copy(filename, tmp.path());
          filename = tmp.path();
-         if (_cache_dir.empty())
+         if (!cacheExists())
          {
            MIL << "Checking repomd.xml integrity" << endl;
            Pathname asc_local;
@@ -326,10 +338,10 @@ namespace zypp
              it != repo_files.end();
              it++)
          {
-           Pathname filename = _cache_dir.empty()
-             ? provideFile(_path + (*it)->location)
-             : _cache_dir + (*it)->location;
-           if (_cache_dir.empty())
+            Pathname filename = cacheExists()
+              ? _cache_dir + (*it)->location
+              :  provideFile(_path + (*it)->location);
+            if (!cacheExists())
            {
              if (! checkCheckSum(filename, (*it)->checksumType, (*it)->checksum))
              {
@@ -362,10 +374,10 @@ namespace zypp
              it != repo_other.end();
              it++)
          {
-           Pathname filename = _cache_dir.empty()
-             ? provideFile(_path + (*it)->location)
-             : _cache_dir + (*it)->location;
-           if (_cache_dir.empty())
+            Pathname filename = cacheExists()
+              ? _cache_dir + (*it)->location
+              : provideFile(_path + (*it)->location);
+            if (!cacheExists())
            {
              if (! checkCheckSum(filename, (*it)->checksumType, (*it)->checksum))
              {
@@ -400,10 +412,10 @@ namespace zypp
              it != repo_primary.end();
              it++)
        {
-           Pathname filename = _cache_dir.empty()
-                             ? provideFile(_path + (*it)->location)
-                             : _cache_dir + (*it)->location;
-           if (_cache_dir.empty())
+          Pathname filename = cacheExists()
+              ? _cache_dir + (*it)->location
+            : provideFile(_path + (*it)->location);
+          if (!cacheExists())
            {
              if (! checkCheckSum(filename, (*it)->checksumType, (*it)->checksum))
              {
@@ -468,10 +480,10 @@ namespace zypp
              it != repo_group.end();
              it++)
        {
-           Pathname filename = _cache_dir.empty()
-             ? provideFile(_path + (*it)->location)
-             : _cache_dir + (*it)->location;
-           if (_cache_dir.empty())
+          Pathname filename = cacheExists()
+              ? _cache_dir + (*it)->location
+            : provideFile(_path + (*it)->location);
+           if (!cacheExists())
            {
              if (! checkCheckSum(filename, (*it)->checksumType, (*it)->checksum))
              {
@@ -508,10 +520,10 @@ namespace zypp
              it != repo_pattern.end();
              it++)
        {
-           Pathname filename = _cache_dir.empty()
-             ? provideFile(_path + (*it)->location)
-             : _cache_dir + (*it)->location;
-           if (_cache_dir.empty())
+          Pathname filename = cacheExists()
+              ? _cache_dir + (*it)->location
+            : provideFile(_path + (*it)->location);
+           if (!cacheExists())
            {
              if (! checkCheckSum(filename, (*it)->checksumType, (*it)->checksum))
              {
@@ -548,10 +560,10 @@ namespace zypp
              it != repo_product.end();
              it++)
        {
-           Pathname filename = _cache_dir.empty()
-             ? provideFile(_path + (*it)->location)
-             : _cache_dir + (*it)->location;
-           if (_cache_dir.empty())
+          Pathname filename = cacheExists()
+              ? _cache_dir + (*it)->location
+            : provideFile(_path + (*it)->location);
+           if (!cacheExists())
            {
              if (! checkCheckSum(filename, (*it)->checksumType, (*it)->checksum))
              {
@@ -588,10 +600,10 @@ namespace zypp
              it != repo_patches.end();
              it++)
          {
-           Pathname filename = _cache_dir.empty()
-             ? provideFile(_path + (*it)->location)
-             : _cache_dir + (*it)->location;
-           if (_cache_dir.empty())
+            Pathname filename = cacheExists()
+                ? _cache_dir + (*it)->location
+              : provideFile(_path + (*it)->location);
+           if (!cacheExists())
            {
              if (! checkCheckSum(filename, (*it)->checksumType, (*it)->checksum))
              {
@@ -607,7 +619,7 @@ namespace zypp
                  ++patch)
            {
                string filename = (*patch)->location;
-               if (_cache_dir.empty())
+                if (!cacheExists())
                {
                  if (! checkCheckSum(provideFile(_path + filename), (*patch)->checksumType, (*patch)->checksum))
                  {
@@ -627,9 +639,9 @@ namespace zypp
          it != patch_files.end();
          it++)
        {
-           Pathname filename = _cache_dir.empty()
-               ? provideFile(_path + *it)
-               : _cache_dir + *it;
+          Pathname filename = cacheExists()
+              ? _cache_dir + *it
+            : provideFile(_path + *it);
            _metadata_files.push_back(*it);
            DBG << "Reading file " << filename << endl;
            ifgzstream st ( filename.asString().c_str() );
index 6487b402a3a5831329fcdbe941f71a249e1fd9b7..b584c7fddeba79ab59e92c6328ff8ebe25b878cf 100644 (file)
@@ -117,7 +117,7 @@ namespace zypp
         virtual void factoryInit();
 
       private:
-
+        bool cacheExists();
        std::list<Pathname> _metadata_files;
 
        typedef struct {