seems to work, or better called, first working version, now checks the checksums too
authorDuncan Mac-Vicar P <dmacvicar@suse.de>
Wed, 24 Sep 2008 16:58:54 +0000 (16:58 +0000)
committerDuncan Mac-Vicar P <dmacvicar@suse.de>
Wed, 24 Sep 2008 16:58:54 +0000 (16:58 +0000)
18 files changed:
tests/zypp/Fetcher_test.cc
tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/SHA1SUMS [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/SHA1SUMS.asc [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/SHA1SUMS.key [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/subdir1-file1.txt [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/subdir1-file2.txt [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/SHA1SUMS [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/SHA1SUMS.asc [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/SHA1SUMS.key [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/subdir2-file1.txt [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/SHA1SUMS [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/SHA1SUMS.asc [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/SHA1SUMS.key [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/SHA1SUMS [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/SHA1SUMS.asc [new file with mode: 0644]
tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/SHA1SUMS.key [new file with mode: 0644]
zypp/Fetcher.cc
zypp/Fetcher.h

index bfce7c842f9b0bef8783a331d20af4ebc24aec2a..9ad024529ab2c29be0231354d8a229a4a901f30b 100644 (file)
@@ -5,6 +5,7 @@
 #include <boost/test/unit_test_log.hpp>
 
 #include "zypp/base/Logger.h"
+#include "zypp/ZYppFactory.h"
 #include "zypp/MediaSetAccess.h"
 #include "zypp/Fetcher.h"
 #include "zypp/Url.h"
@@ -24,24 +25,54 @@ BOOST_AUTO_TEST_CASE(fetcher)
   MediaSetAccess media( ( DATADIR).asUrl(), "/" );
   Fetcher fetcher;
 
-  filesystem::TmpDir dest;
+  // Now test that without trusting it, it should throw
+  // do the test by trusting the SHA1SUMS file signature key
+  {
+      filesystem::TmpDir dest;
 
-  fetcher.enqueueDir(OnMediaLocation().setFilename("/complexdir"), true);
-  fetcher.start( dest.path(), media );
+      fetcher.enqueueDir(OnMediaLocation().setFilename("/complexdir"), true);
+      BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception);
+      fetcher.reset();
+  }
 
-  BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2").isExist() );
-  BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2/subdir2-file1.txt").isExist() );
-  BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file1.txt").isExist() );
-  BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file2.txt").isExist() );
-  
-  fetcher.reset();
+  // do the test by trusting the SHA1SUMS file signature key
+  {
+      filesystem::TmpDir dest;
+
+      // add the key as trusted
+      getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir/subdir1/SHA1SUMS.key"), true);
+      fetcher.enqueueDir(OnMediaLocation().setFilename("/complexdir"), true);
+      fetcher.start( dest.path(), media );
+
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2/subdir2-file1.txt").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file1.txt").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file2.txt").isExist() );
   
-  fetcher.enqueue(OnMediaLocation().setFilename("/file-1.txt"));
-  fetcher.start( dest.path(), media );  
+      fetcher.reset();
+  }
+
+  // do the test by trusting the SHA1SUMS file signature key but with a broken file
+  {
+      filesystem::TmpDir dest;
 
-  BOOST_CHECK( PathInfo(dest.path() + "/file-1.txt").isExist() );
+      // add the key as trusted
+      getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir-broken/subdir1/SHA1SUMS.key"), true);
+      fetcher.enqueueDir(OnMediaLocation().setFilename("/complexdir-broken"), true);
+      BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception);  
+      fetcher.reset();
+  }
 
-  MIL << fetcher;
+
+  {  
+      filesystem::TmpDir dest;
+
+      fetcher.enqueue(OnMediaLocation().setFilename("/file-1.txt"));
+      fetcher.start( dest.path(), media );  
+      BOOST_CHECK( PathInfo(dest.path() + "/file-1.txt").isExist() );
+  }
+  
+  //MIL << fetcher;
 }
 
 
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/SHA1SUMS b/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/SHA1SUMS
new file mode 100644 (file)
index 0000000..e93f782
--- /dev/null
@@ -0,0 +1,2 @@
+f1d2d2f924e986ac86fdf7b36c94bcdf32beec15  subdir1-file1.txt
+e242ed3bffccdf271b7fbaf34ed72d089537b42f  subdir1-file2.txt
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/SHA1SUMS.asc b/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/SHA1SUMS.asc
new file mode 100644 (file)
index 0000000..ac94d40
--- /dev/null
@@ -0,0 +1,7 @@
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+iEYEABECAAYFAkjaaxUACgkQm+zCtd2wN1ZLgACfcqpLHAavAr8cIjenaR3pJHpo
+WoMAmwdbZQX2b9Yw6mY1aGbarwsEon6I
+=/0VZ
+-----END PGP SIGNATURE-----
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/SHA1SUMS.key b/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/SHA1SUMS.key
new file mode 100644 (file)
index 0000000..7b6734f
--- /dev/null
@@ -0,0 +1,49 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQGiBEYjZk4RBACjIOtNaPzvKlC32b8R5TDRB0/FQ0tsMtt5dLwuq2ZYlEbT1YLF
+110vZEl5IQAq5ldvD7MdR/6fqdXTdxBeYzZjeIEYbHzg3rN/N/+MkcG4W8IK1H6e
+DAbL05HlQ1ueTp0mjgoGLYKt1igQe8h5uA6gEE7dv0tG0NJx2w5Gs2GpmwCgiRiu
+s2ev221Pa65IpR1gsYuXLOEEAKJ1Bvjm+BfHJirqoH7iPq5HlABwn+s9sUmf6bjC
+kfar/ySAsL0VUhHNCIoHUEZd2imA2ZA0kTBxB+BIX/HMRZzxPZEwYI8Q0UYsTVb/
+gnQt+mWaZs1/2teWR0wnUp+eO5MpOAO9QjFJTdIz0GegsfSOPCo55CUtktr3tJUK
+fZ3gA/9mZe+b1Evi1/Us+klnERRKR2jjWXxwuPN6UivJbfXIZjuVUNclAhEqstzp
+fnWJ3LhPxj0zJvhp/MnqSTaI6DQbr0f+JvwP+5k/4gbnqm+xxOocyhiVT45zOPAy
+UYuG4t0m+9G7Vx6LC9tMukbdfHaRym42yC2s04GW2isKfta1ZbQsWllwcCBUZXN0
+IEtleSBQYWlyIDx6eXBwLWRldmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRiNm
+TgIbIwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEJvswrXdsDdWSVAAnjkR2lao
+hb2Q4WnxamdHYWSf8ULKAJ4jjfZsFq0vmgPsO/YHaKTJN5sAL7kBDQRGI2ZREAQA
+toB5TGT9K7NCv5D5dQw7jVHngnxp3NGTtAhwirYphBWaF2be3UJVTLbUFW14eMnr
+VW9PKj/HNVLhQu0C6CaXtXy5LahIls+mFlSKwbiP74cFlNYcj69tzCnaFKgElQPH
+cMOc31EgjySYcUIys421MxI++sugW+yHr5ByIsL6vfcAAwUEAILSwmLtD+Pwkues
+73DPPyWIM3MA0exO7QmZeFwnbpiZYuZQ3GiPGrbeZVqHWB72dhW8+5ugR9CVQSsL
+HC5wHMIQFU8RsiL06gZdIaJNgAr7ajhtUybP0WPVpXkzm5+VB8Che9m0Z0t2tK8Y
+0KVapBcr3YDgx89F9VA0yny6q3WiiEkEGBECAAkFAkYjZlECGwwACgkQm+zCtd2w
+N1apuACfUR+Daoo3N1fxxDa3A3t4OkAfpQgAn1UEvpQp+/4DnzSbEvwzLeoek3dz
+mQGiBEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7B
+wW4EqmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuc
+iR3ygsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY
+3q7eR8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD+
++nazSIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbn
+Z0yoOaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9u
+AhgDA/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3
+sYaEtZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin
+1/4DABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/rQrWllwcCB0ZXN0
+Y2FzZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3JnPohgBBMRAgAgBQJGP7wC
+AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHYm9mIIb7TJQCfTe4MwrmO
+lWDxWV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kxuGn8uQINBEY/vAwQCAD4
+T11KPE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVBpYORxyWjS8QMc9ge8Wxe
+zAsjyTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7bAi4xx+NLOu9DuuU+jqUk
+yHYlt8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPxvYrFAWnesgUJMqZo7Td5
+Ly4IjfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/m+MTV05nT6+1KCBqCRUl
+uHqDaCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraatXyHnAyhwiwTZLq2jabM
+jQgGhV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSjZKlHAUdnGul0M2KuyJhv
+8ZBkApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt67abbezp/Dgs8+691OtAR
+EDWbAzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2HGTzVy1k33vnuGCVwC/K
+iZ/C6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp8dMJ+FFsTmzONzZpFC9D
+DtpaUeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+cFkE7hW8tyOwcx4sk1J/
+tDCeJ1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqCGWJViEkEGBECAAkFAkY/
+vAwCGwwACgkQvWHYm9mIIb5O9wCfeI0Ro1UCK/CVT1/BH9NNB0TyYzAAmwdQFE6I
+aVStjbDRYEnTHQOGsVy9
+=ZZx0
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/subdir1-file1.txt b/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/subdir1-file1.txt
new file mode 100644 (file)
index 0000000..f2fe044
--- /dev/null
@@ -0,0 +1 @@
+fooa
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/subdir1-file2.txt b/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/subdir1-file2.txt
new file mode 100644 (file)
index 0000000..5716ca5
--- /dev/null
@@ -0,0 +1 @@
+bar
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/SHA1SUMS b/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/SHA1SUMS
new file mode 100644 (file)
index 0000000..c688c0b
--- /dev/null
@@ -0,0 +1 @@
+f572d396fae9206628714fb2ce00f72e94f2258f  subdir2-file1.txt
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/SHA1SUMS.asc b/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/SHA1SUMS.asc
new file mode 100644 (file)
index 0000000..42445ee
--- /dev/null
@@ -0,0 +1,7 @@
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+iEYEABECAAYFAkjaayAACgkQm+zCtd2wN1Z3GwCfUjf9mRdFrB5UvOHAW/DoEzWL
+mpEAnRmkzRLTY3hXiZ+95XCYG1csiMmF
+=X6am
+-----END PGP SIGNATURE-----
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/SHA1SUMS.key b/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/SHA1SUMS.key
new file mode 100644 (file)
index 0000000..7b6734f
--- /dev/null
@@ -0,0 +1,49 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+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
+aVStjbDRYEnTHQOGsVy9
+=ZZx0
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/subdir2-file1.txt b/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/subdir2-file1.txt
new file mode 100644 (file)
index 0000000..ce01362
--- /dev/null
@@ -0,0 +1 @@
+hello
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/SHA1SUMS b/tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/SHA1SUMS
new file mode 100644 (file)
index 0000000..e93f782
--- /dev/null
@@ -0,0 +1,2 @@
+f1d2d2f924e986ac86fdf7b36c94bcdf32beec15  subdir1-file1.txt
+e242ed3bffccdf271b7fbaf34ed72d089537b42f  subdir1-file2.txt
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/SHA1SUMS.asc b/tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/SHA1SUMS.asc
new file mode 100644 (file)
index 0000000..ac94d40
--- /dev/null
@@ -0,0 +1,7 @@
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+iEYEABECAAYFAkjaaxUACgkQm+zCtd2wN1ZLgACfcqpLHAavAr8cIjenaR3pJHpo
+WoMAmwdbZQX2b9Yw6mY1aGbarwsEon6I
+=/0VZ
+-----END PGP SIGNATURE-----
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/SHA1SUMS.key b/tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/SHA1SUMS.key
new file mode 100644 (file)
index 0000000..7b6734f
--- /dev/null
@@ -0,0 +1,49 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+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
+aVStjbDRYEnTHQOGsVy9
+=ZZx0
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/SHA1SUMS b/tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/SHA1SUMS
new file mode 100644 (file)
index 0000000..c688c0b
--- /dev/null
@@ -0,0 +1 @@
+f572d396fae9206628714fb2ce00f72e94f2258f  subdir2-file1.txt
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/SHA1SUMS.asc b/tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/SHA1SUMS.asc
new file mode 100644 (file)
index 0000000..42445ee
--- /dev/null
@@ -0,0 +1,7 @@
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+iEYEABECAAYFAkjaayAACgkQm+zCtd2wN1Z3GwCfUjf9mRdFrB5UvOHAW/DoEzWL
+mpEAnRmkzRLTY3hXiZ+95XCYG1csiMmF
+=X6am
+-----END PGP SIGNATURE-----
diff --git a/tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/SHA1SUMS.key b/tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/SHA1SUMS.key
new file mode 100644 (file)
index 0000000..7b6734f
--- /dev/null
@@ -0,0 +1,49 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+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
+aVStjbDRYEnTHQOGsVy9
+=ZZx0
+-----END PGP PUBLIC KEY BLOCK-----
index f21dfd9d1c53a7e04994da6892b3d2bd0edd0f8a..7214206319b8a52df0cdb033ddace3d8b7191dad 100644 (file)
  *
 */
 #include <iostream>
+#include <fstream>
 #include <list>
+#include <map>
 
 #include "zypp/base/Easy.h"
 #include "zypp/base/Logger.h"
 #include "zypp/base/PtrTypes.h"
 #include "zypp/base/DefaultIntegral.h"
+#include "zypp/base/String.h"
 #include "zypp/Fetcher.h"
+#include "zypp/CheckSum.h"
 #include "zypp/base/UserRequestException.h"
 
 using namespace std;
@@ -74,9 +78,9 @@ namespace zypp
       MIL << endl;
      }
     
-    void enqueue( const OnMediaLocation &resource, const FileChecker &checker  );
-    void enqueueDir( const OnMediaLocation &resource, bool recursive, const FileChecker &checker );
-    void enqueueDigested( const OnMediaLocation &resource, const FileChecker &checker );
+      void enqueue( const OnMediaLocation &resource, const FileChecker &checker = FileChecker()  );
+      void enqueueDir( const OnMediaLocation &resource, bool recursive, const FileChecker &checker = FileChecker() );
+      void enqueueDigested( const OnMediaLocation &resource, const FileChecker &checker = FileChecker() );
     void addCachePath( const Pathname &cache_dir );
     void reset();
     void start( const Pathname &dest_dir,
@@ -277,55 +281,133 @@ namespace zypp
                                   const OnMediaLocation &resource, 
                                   const Pathname &dest_dir, bool recursive  )
   {
+      // first get the content of the directory so we can add
+      // individual transfer jobs
+      MIL << "Adding directory " << resource.filename() << endl;
       filesystem::DirContent content;
-      
       media.dirInfo( content, resource.filename(), false /* dots */, resource.medianr());
+      
+      filesystem::DirEntry shafile, shasig, shakey;
+      shafile.name = "SHA1SUMS"; shafile.type = filesystem::FT_FILE;
+      shasig.name = "SHA1SUMS.asc"; shasig.type = filesystem::FT_FILE;
+      shakey.name = "SHA1SUMS.key"; shakey.type = filesystem::FT_FILE;
+      
+      // create a new fetcher with a different state to transfer the
+      // file containing checksums and its signature
+      Fetcher fetcher;
+      // signature checker for SHA1SUMS. We havent got the signature from
+      // the nextwork yet.
+      SignatureFileChecker sigchecker;
+
+      // now try to find the SHA1SUMS signature
+      if ( find(content.begin(), content.end(), shasig) 
+           != content.end() )
+      {
+          MIL << "found checksums signature file: " << shasig.name << endl;
+          // TODO refactor with OnMediaLocation::extend or something
+          fetcher.enqueue( OnMediaLocation(resource.filename() + shasig.name, resource.medianr()).setOptional(true) );
+          assert_dir(dest_dir + resource.filename());
+          fetcher.start( dest_dir, media );
+
+          // if we get the signature, update the checker
+          sigchecker = SignatureFileChecker(dest_dir + resource.filename() + shasig.name);
+          fetcher.reset();
+      }
+      else
+          MIL << "no signature for " << shafile.name << endl;
 
-      for ( filesystem::DirContent::const_iterator it = content.begin(); it != content.end(); ++it )
+      // look for the SHA1SUMS.key file
+      if ( find(content.begin(), content.end(), shakey) 
+           != content.end() )
       {
-          MIL << (*it).name << endl;
+          MIL << "found public key file: " << shakey.name << endl;
+          fetcher.enqueue( OnMediaLocation(resource.filename() + shakey.name, resource.medianr()).setOptional(true) );
+          assert_dir(dest_dir + resource.filename());
+          fetcher.start( dest_dir, media );
+          fetcher.reset();
+          KeyContext context;
+          sigchecker.addPublicKey(dest_dir + resource.filename() + shakey.name, context);
       }
-      
-      filesystem::DirEntry shafile, shasig;
-      shafile.name = "SHA1SUMS";
-      shafile.name = "SHA1SUMS.asc";
-      shasig.type = filesystem::FT_FILE;
-      shasig.type = filesystem::FT_FILE;
 
+      // look for the SHA1SUMS public key file
+      if ( find(content.begin(), content.end(), shafile) 
+           != content.end() )
+      {
+          MIL << "found checksums file: " << shafile.name << endl;
+          fetcher.enqueue( OnMediaLocation(resource.filename() + shafile.name, resource.medianr()).setOptional(true) );
+          assert_dir(dest_dir + resource.filename()); 
+          fetcher.start( dest_dir, media );
+          fetcher.reset();
+      }
+
+      // hash table to store checksums
+      map<string, CheckSum> checksums;
+      
       // look for the SHA1SUMS file
       if ( find(content.begin(), content.end(), shafile) != content.end() )
       {
           MIL << "found checksums file: " << shafile.name << endl;
-          
-          provideToDest(media, resource.filename() + shafile.name, dest_dir);
-          // look for the SHA1SUMS.asc signature
-          if ( find(content.begin(), content.end(), shasig) != content.end() )
-          {
-              provideToDest(media, resource.filename() + shasig.name, dest_dir);
+          fetcher.enqueue( OnMediaLocation(
+                               resource.filename() + shafile.name,
+                               resource.medianr()).setOptional(true),
+                           FileChecker(sigchecker) );
+          assert_dir(dest_dir + resource.filename());
+          fetcher.start( dest_dir + resource.filename(), media );
+          fetcher.reset();
+
+          // now read the SHA1SUMS file
+          Pathname pShafile = dest_dir + resource.filename() + shafile.name;
+          std::ifstream in( pShafile.c_str() );
+          string buffer;
+          if ( ! in.fail() )
+          {          
+              while ( getline(in, buffer) )
+              {
+                  vector<string> words;
+                  str::split( buffer, back_inserter(words) );
+                  if ( words.size() != 2 )
+                      ZYPP_THROW(Exception("Wrong format for SHA1SUMS file"));
+                  //MIL << "check: '" << words[0] << "' | '" << words[1] << "'" << endl;
+                  if ( ! words[1].empty() )
+                      checksums[words[1]] = CheckSum::sha1(words[0]);
+              }
           }
-          
+          else
+              ZYPP_THROW(Exception("Can't open SHA1SUMS file: " + pShafile.asString()));
       }
-      
-      for ( filesystem::DirContent::const_iterator it = content.begin(); it != content.end(); ++it )
+
+      for ( filesystem::DirContent::const_iterator it = content.begin();
+            it != content.end();
+            ++it )
       {
+          // skip SHA1SUMS* as they were already retrieved
+          if ( str::hasPrefix(it->name, "SHA1SUMS") )
+              continue;
+          
           Pathname filename = resource.filename() + it->name;
-
+          
           switch ( it->type )
           {
           case filesystem::FT_NOT_AVAIL: // old directory.yast contains no typeinfo at all
           case filesystem::FT_FILE:
-              enqueue(OnMediaLocation().setFilename(filename), FileChecker());
-              
-              MIL << filename << endl;
+          {
+              CheckSum checksum;
+              if ( checksums.find(it->name) != checksums.end() )
+                  checksum = checksums[it->name];
+                  
+              // create a resource from the file
+              // if checksum was not available we will have a empty
+              // checksum, which will end in a validation anyway
+              // warning the user that there is no checksum
+              enqueueDigested(OnMediaLocation()
+                              .setFilename(filename)
+                              .setChecksum(checksum));
+                  
               break;
+          }
           case filesystem::FT_DIR: // newer directory.yast contain at least directory info
               if ( recursive )
-              {
                   addDirJobs(media, filename, dest_dir, recursive);
-              } 
-              else 
-              {
-              }
               break;
           default:
               // don't provide devices, sockets, etc.
index 6c8b83a43534188977f75145bc0f4af73f480830..2ad05365ab41f05b91033dcd6f8851c47989cf3e 100644 (file)
@@ -108,6 +108,10 @@ namespace zypp
      * and a respective SHA1SUMS.asc which has
      * the signature for the checksums.
      *
+     * If you expect the user to not have the key of
+     * the signature either in the trusted or untrusted
+     * keyring, you can offer it as SHA1SUMS.key
+     *
      * \param recursive True if the complete tree should
      * be enqueued.
      *
@@ -116,7 +120,13 @@ namespace zypp
      * transfer job, so make sure you don't add another one or
      * the user could be asked twice.
      *
-
+     * \note The format of the file SHA1SUMS is the output of:
+     * ls | grep -v SHA1SUMS | xargs sha1sum > SHA1SUMS
+     * in each subdirectory.
+     *
+     * \note Every file appart of SHA1SUMS.(asc|key|(void)) will
+     * not be transfered and will be ignored.
+     *
      */
     void enqueueDir( const OnMediaLocation &resource,
                      bool recursive = false,