]> git.saurik.com Git - apt.git/commitdiff
fix: --print-uris removes authentication
authorDavid Kalnischkies <kalnischkies@gmail.com>
Sat, 10 Aug 2013 10:40:37 +0000 (12:40 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Mon, 12 Aug 2013 16:01:37 +0000 (18:01 +0200)
The constructors of our (clear)sign-acquire-items move a pre-existent
file for error-recovery away, which gets restored or discarded later as
the acquire progresses, but --print-uris never really starts the
acquire process, so the files aren't restored (as they should).

To fix this both get a destructor which checks for signs of acquire
doing anything and if it hasn't the file is restored.

Note that these virtual destructors theoretically break the API, but
only with classes extending the sign-acquire-items and nobody does this,
as it would be insane for library users to fiddle with Acquire
internals – and these classes are internals.

Closes: 719263
apt-pkg/acquire-item.cc
apt-pkg/acquire-item.h
test/integration/test-bug-602412-dequote-redirect
test/integration/test-bug-719263-print-uris-removes-authentication [new file with mode: 0755]

index 7bcdf285bcddfc5ad8800e9641106fdf83f3fd77..95dadcd6d2d7f7fc7905f9f62c1efb989d1ffedb 100644 (file)
@@ -1067,8 +1067,7 @@ pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire *Owner,                           /*{{{*/
       
    string Final = _config->FindDir("Dir::State::lists");
    Final += URItoFileName(RealURI);
-   struct stat Buf;
-   if (stat(Final.c_str(),&Buf) == 0)
+   if (RealFileExists(Final) == true)
    {
       // File was already in place.  It needs to be re-downloaded/verified
       // because Release might have changed, we do give it a differnt
@@ -1080,6 +1079,19 @@ pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire *Owner,                          /*{{{*/
    }
 
    QueueURI(Desc);
+}
+                                                                       /*}}}*/
+pkgAcqMetaSig::~pkgAcqMetaSig()                                                /*{{{*/
+{
+   // if the file was never queued undo file-changes done in the constructor
+   if (QueueCounter == 1 && Status == StatIdle && FileSize == 0 && Complete == false &&
+        LastGoodSig.empty() == false)
+   {
+      string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
+      if (RealFileExists(Final) == false && RealFileExists(LastGoodSig) == true)
+        Rename(LastGoodSig, Final);
+   }
+
 }
                                                                        /*}}}*/
 // pkgAcqMetaSig::Custom600Headers - Insert custom request headers     /*{{{*/
@@ -1595,14 +1607,25 @@ pkgAcqMetaClearSig::pkgAcqMetaClearSig(pkgAcquire *Owner,               /*{{{*/
 
    // keep the old InRelease around in case of transistent network errors
    string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
-   struct stat Buf;
-   if (stat(Final.c_str(),&Buf) == 0)
+   if (RealFileExists(Final) == true)
    {
       string const LastGoodSig = DestFile + ".reverify";
       Rename(Final,LastGoodSig);
    }
 }
                                                                        /*}}}*/
+pkgAcqMetaClearSig::~pkgAcqMetaClearSig()                              /*{{{*/
+{
+   // if the file was never queued undo file-changes done in the constructor
+   if (QueueCounter == 1 && Status == StatIdle && FileSize == 0 && Complete == false)
+   {
+      string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
+      string const LastGoodSig = DestFile + ".reverify";
+      if (RealFileExists(Final) == false && RealFileExists(LastGoodSig) == true)
+        Rename(LastGoodSig, Final);
+   }
+}
+                                                                       /*}}}*/
 // pkgAcqMetaClearSig::Custom600Headers - Insert custom request headers        /*{{{*/
 // ---------------------------------------------------------------------
 // FIXME: this can go away once the InRelease file is used widely
index 51d539450b012b69e3d3603b7d01eee9c18370dd..10c855e63d98a91caab3726dbaa708ab08107122 100644 (file)
@@ -774,6 +774,7 @@ class pkgAcqMetaSig : public pkgAcquire::Item
                 std::string MetaIndexURI, std::string MetaIndexURIDesc, std::string MetaIndexShortDesc,
                 const std::vector<struct IndexTarget*>* IndexTargets,
                 indexRecords* MetaIndexParser);
+   virtual ~pkgAcqMetaSig();
 };
                                                                        /*}}}*/
 /** \brief An item that is responsible for downloading the meta-index  {{{
@@ -904,6 +905,7 @@ public:
                std::string const &MetaSigURI, std::string const &MetaSigURIDesc, std::string const &MetaSigShortDesc,
                const std::vector<struct IndexTarget*>* IndexTargets,
                indexRecords* MetaIndexParser);
+   virtual ~pkgAcqMetaClearSig();
 };
                                                                        /*}}}*/
 /** \brief An item that is responsible for fetching a package file.    {{{
index 764e1366791b21078d211c243cd27e7d2437a150..bcebb57b8273dea6e5277021bfedd016f44a545f 100755 (executable)
@@ -26,4 +26,4 @@ Hit http://localhost:8080 unstable/main Translation-en
 Reading package lists...' aptget update #-o debug::pkgacquire=1 -o debug::pkgacquire::worker=1
 
 msgtest 'Test redirection works in' 'package download'
-testsuccess --nomsg aptget install unrelated --download-only
+testsuccess --nomsg aptget install unrelated --download-only -y
diff --git a/test/integration/test-bug-719263-print-uris-removes-authentication b/test/integration/test-bug-719263-print-uris-removes-authentication
new file mode 100755 (executable)
index 0000000..1c1a27c
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture 'amd64'
+
+insertinstalledpackage 'unrelated' 'all' '1'
+buildsimplenativepackage 'unrelated' 'all' '2' 'unstable'
+
+setupaptarchive
+
+testnoact() {
+       cp -a rootdir/var/lib/dpkg/status rootdir/var/lib/dpkg/status-backup-noact
+       touch rootdir/var/lib/apt/extended_states
+       testequal 'Reading package lists...
+Building dependency tree...
+Reading state information...
+The following packages will be upgraded:
+  unrelated
+1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+Inst unrelated [1] (2 unstable [all])
+Conf unrelated (2 unstable [all])' aptget install unrelated -s
+       testsuccess aptget install unrelated -y
+       testdpkginstalled unrelated
+       cp -a rootdir/var/lib/dpkg/status-backup-noact rootdir/var/lib/dpkg/status
+}
+
+testnoact
+testsuccess aptget update --print-uris
+testnoact
+
+# same thing, just not with InRelease this time
+rm -rf rootdir/var/lib/apt/lists
+testsuccess aptget update -o Acquire::TryInRelease=0
+
+testnoact
+testsuccess aptget update --print-uris -o Acquire::TryInRelease=0
+testnoact