]> git.saurik.com Git - apt.git/commitdiff
detect and error out on conflicting Trusted settings
authorDavid Kalnischkies <david@kalnischkies.de>
Mon, 22 Jun 2015 10:34:11 +0000 (12:34 +0200)
committerDavid Kalnischkies <david@kalnischkies.de>
Mon, 10 Aug 2015 15:25:26 +0000 (17:25 +0200)
A specific trust state can be enforced via a sources.list option, but it
effects all entries handled by the same Release file, not just the entry
it was given on so we enforce acknowledgement of this by requiring the
same value to be (not) set on all such entries.

apt-pkg/deb/debmetaindex.cc
apt-pkg/deb/debmetaindex.h
apt-pkg/metaindex.cc
apt-pkg/metaindex.h
doc/sources.list.5.xml
test/integration/test-bug-596498-trusted-unsigned-repo
test/integration/test-sourceslist-trusted-options

index f690a8d644d8f760ca0e892e916814dc33ba9276..1f725ba0506aec4ce294455468171935b18cd829 100644 (file)
@@ -29,6 +29,8 @@
 #include <unistd.h>
 #include <string.h>
 
+#include <apti18n.h>
+
 class APT_HIDDEN debReleaseIndexPrivate                                        /*{{{*/
 {
    public:
@@ -42,6 +44,11 @@ class APT_HIDDEN debReleaseIndexPrivate                                      /*{{{*/
 
    std::vector<debSectionEntry> DebEntries;
    std::vector<debSectionEntry> DebSrcEntries;
+
+   debReleaseIndex::TriState Trusted;
+
+   debReleaseIndexPrivate() : Trusted(debReleaseIndex::TRI_UNSET) {}
+   debReleaseIndexPrivate(bool const pTrusted) : Trusted(pTrusted ? debReleaseIndex::TRI_YES : debReleaseIndex::TRI_NO) {}
 };
                                                                        /*}}}*/
 // ReleaseIndex::MetaIndex* - display helpers                          /*{{{*/
@@ -101,12 +108,11 @@ std::string debReleaseIndex::LocalFileName() const                        /*{{{*/
                                                                        /*}}}*/
 // ReleaseIndex Con- and Destructors                                   /*{{{*/
 debReleaseIndex::debReleaseIndex(std::string const &URI, std::string const &Dist) :
-                                       metaIndex(URI, Dist, "deb"), d(new debReleaseIndexPrivate()), Trusted(CHECK_TRUST)
+                                       metaIndex(URI, Dist, "deb"), d(new debReleaseIndexPrivate())
 {}
 debReleaseIndex::debReleaseIndex(std::string const &URI, std::string const &Dist, bool const Trusted) :
-                                       metaIndex(URI, Dist, "deb"), d(new debReleaseIndexPrivate()) {
-       SetTrusted(Trusted);
-}
+                                       metaIndex(URI, Dist, "deb"), d(new debReleaseIndexPrivate(Trusted))
+{}
 debReleaseIndex::~debReleaseIndex() {
    if (d != NULL)
       delete d;
@@ -225,9 +231,9 @@ void debReleaseIndex::AddComponent(bool const isSrc, std::string const &Name,/*{
 bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool const &GetAll) const/*{{{*/
 {
    indexRecords * const iR = new indexRecords(Dist);
-   if (Trusted == ALWAYS_TRUSTED)
+   if (d->Trusted == TRI_YES)
       iR->SetTrusted(true);
-   else if (Trusted == NEVER_TRUSTED)
+   else if (d->Trusted == TRI_NO)
       iR->SetTrusted(false);
 
    // special case for --print-uris
@@ -246,19 +252,21 @@ bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool const &GetAll) const/*{
    return true;
 }
                                                                        /*}}}*/
-// ReleaseIndex::*Trusted setters and checkers                         /*{{{*/
-void debReleaseIndex::SetTrusted(bool const Trusted)
+// ReleaseIndex::IsTrusted                                             /*{{{*/
+bool debReleaseIndex::SetTrusted(TriState const Trusted)
 {
-       if (Trusted == true)
-               this->Trusted = ALWAYS_TRUSTED;
-       else
-               this->Trusted = NEVER_TRUSTED;
+   if (d->Trusted == TRI_UNSET)
+      d->Trusted = Trusted;
+   else if (d->Trusted != Trusted)
+      // TRANSLATOR: The first is an option name from sources.list manpage, the other two URI and Suite
+      return _error->Error(_("Conflicting values set for option %s concerning source %s %s"), "Trusted", URI.c_str(), Dist.c_str());
+   return true;
 }
 bool debReleaseIndex::IsTrusted() const
 {
-   if (Trusted == ALWAYS_TRUSTED)
+   if (d->Trusted == TRI_YES)
       return true;
-   else if (Trusted == NEVER_TRUSTED)
+   else if (d->Trusted == TRI_NO)
       return false;
 
 
@@ -476,7 +484,12 @@ class APT_HIDDEN debSLTypeDebian : public pkgSourceList::Type              /*{{{*/
 
       std::map<std::string, std::string>::const_iterator const trusted = Options.find("trusted");
       if (trusted != Options.end())
-        Deb->SetTrusted(StringToBool(trusted->second, false));
+      {
+        if (Deb->SetTrusted(StringToBool(trusted->second, false) ? debReleaseIndex::TRI_YES : debReleaseIndex::TRI_NO) == false)
+           return false;
+      }
+      else if (Deb->SetTrusted(debReleaseIndex::TRI_DONTCARE) == false)
+        return false;
 
       return true;
    }
index 9b60b6137904bcd2bca5e7461f7b7287f1bada65..a6db4e287b6a1c2b206d91502f95fa28cf06b657 100644 (file)
@@ -27,8 +27,6 @@ class APT_HIDDEN debReleaseIndex : public metaIndex
 {
    debReleaseIndexPrivate * const d;
 
-   enum APT_HIDDEN { ALWAYS_TRUSTED, NEVER_TRUSTED, CHECK_TRUST } Trusted;
-
    public:
 
    APT_HIDDEN std::string MetaIndexInfo(const char *Type) const;
@@ -51,7 +49,11 @@ class APT_HIDDEN debReleaseIndex : public metaIndex
 
    virtual std::vector <pkgIndexFile *> *GetIndexFiles();
 
-   void SetTrusted(bool const Trusted);
+   enum APT_HIDDEN TriState {
+      TRI_YES, TRI_DONTCARE, TRI_NO, TRI_UNSET
+   };
+   bool SetTrusted(TriState const Trusted);
+
    virtual bool IsTrusted() const;
 
    void AddComponent(bool const isSrc, std::string const &Name,
index d9634997467505adb1acbf93741371c31fe4bfec..0c88ee9cdb0c7c5a4181f95a5ba9c3fc9e3e40c5 100644 (file)
@@ -41,7 +41,7 @@ bool metaIndex::Merge(pkgCacheGenerator &Gen,OpProgress *) const
 
 metaIndex::metaIndex(std::string const &URI, std::string const &Dist,
       char const * const Type)
-: d(NULL), Indexes(NULL), Type(Type), URI(URI), Dist(Dist), Trusted(false)
+: d(NULL), Indexes(NULL), Type(Type), URI(URI), Dist(Dist)
 {
    /* nothing */
 }
index 1bcec1c4ae298fb8003e3234ef1b29c634b1f2a8..9667e1c92f447784eb8846cd08aa488a0c13dcf5 100644 (file)
@@ -34,7 +34,6 @@ class metaIndex
    const char *Type;
    std::string URI;
    std::string Dist;
-   bool Trusted;
 
    public:
 
index 8506017adf57aebddafa7608f6852fb5ca6c0e8e..f87dcda23489f98098167dddeda197d66ef230f4 100644 (file)
@@ -223,7 +223,15 @@ deb-src [ option1=value1 option2=value2 ] uri suite [component1] [component2] [.
                source. If not specified, the default set is defined by the
                <literal>APT::Acquire::Targets</literal> configuration scope.
          </para></listitem>
+       </itemizedlist>
+
+       Further more, there are options which if set effect
+       <emphasis>all</emphasis> sources with the same URI and Suite, so they
+       have to be set on all such entries and can not be varied between
+       different components. APT will try to detect and error out on such
+       anomalies.
 
+       <itemizedlist>
          <listitem><para><literal>Trusted</literal> (<literal>trusted</literal>)
                is a tri-state value which defaults to APT deciding if a source
                is considered trusted or if warnings should be raised before e.g.
index 1ff0f1d8de1acd5d55cf69d4f43bd6135560da49..c515837a354e69d26cef979f83c882e42284e92d 100755 (executable)
@@ -18,7 +18,7 @@ aptgetupdate() {
 PKGTEXT="$(aptget install cool --assume-no -d | head -n 8)"
 DOWNLOG="$(echo "$PKGTEXT" | tail -n 1)"
 PKGTEXT="$(echo "$PKGTEXT" | head -n 7)"
-DEBFILE='rootdir/etc/apt/sources.list.d/apt-test-unstable-deb.list'
+DEBFILE='rootdir/etc/apt/sources.list.d/apt-test-unstable-*.list'
 
 testsuccessequal "$PKGTEXT
 $DOWNLOG
@@ -28,7 +28,7 @@ testsuccessequal "$PKGTEXT
 $DOWNLOG
 Download complete and in download only mode" aptget install cool --assume-no -d --allow-unauthenticated
 
-sed -i -e 's#deb#deb [trusted=no]#' $DEBFILE
+sed -i -e 's#\(deb\(-src\)\?\) #\1 [trusted=no] #' $DEBFILE
 aptgetupdate 'testsuccess'
 
 testfailureequal "$PKGTEXT
@@ -38,7 +38,7 @@ Install these packages without verification? [y/N] N
 E: Some packages could not be authenticated" aptget install cool --assume-no -d
 
 find aptarchive/ \( -name 'Release.gpg' -o -name 'InRelease' \) -delete
-sed -i -e 's#deb \[trusted=no\]#deb#' $DEBFILE
+sed -i -e 's#\(deb\(-src\)\?\) \[trusted=no\] #\1 #' $DEBFILE
 aptgetupdate
 
 testfailureequal "$PKGTEXT
@@ -54,7 +54,7 @@ Authentication warning overridden.
 $DOWNLOG
 Download complete and in download only mode" aptget install cool --assume-no -d --allow-unauthenticated
 
-sed -i -e 's#deb#deb [trusted=yes]#' $DEBFILE
+sed -i -e 's#\(deb\(-src\)\?\) #\1 [trusted=yes] #' $DEBFILE
 aptgetupdate
 
 testsuccessequal "$PKGTEXT
index 5fe4933ce636c41eefa787a320ddb98074858b61..86036e2427351fac78d40bb40be9ea121945b804 100755 (executable)
@@ -199,3 +199,20 @@ insecureaptgetupdate
 everythingfails
 everythingfails -t stable
 everythingfails -t testing
+
+msgmsg 'Test conflicting trusted options are refused'
+testsource() {
+       echo "$@" > rootdir/etc/apt/sources.list.d/example.list
+       testfailuremsg 'E: Conflicting values set for option Trusted concerning source http://example.org/bad/ unstable
+E: The list of sources could not be read.' aptget update --print-uris
+}
+for VAL in 'yes' 'no'; do
+       testsource "deb http://example.org/bad unstable main
+deb [trusted=${VAL}] http://example.org/bad unstable non-free"
+       testsource "deb [trusted=${VAL}] http://example.org/bad unstable main
+deb http://example.org/bad unstable non-free"
+done
+testsource 'deb [trusted=yes] http://example.org/bad unstable main
+deb [trusted=no] http://example.org/bad unstable non-free'
+testsource 'deb [trusted=no] http://example.org/bad unstable main
+deb [trusted=yes] http://example.org/bad unstable non-free'