|
|
@@ -50,13 +50,24 @@
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
+static void printHashSumComparision(std::string const &URI, HashStringList const &Expected, HashStringList const &Actual) /*{{{*/
|
|
|
+{
|
|
|
+ if (_config->FindB("Debug::Acquire::HashSumMismatch", false) == false)
|
|
|
+ return;
|
|
|
+ std::cerr << std::endl << URI << ":" << std::endl << " Expected Hash: " << std::endl;
|
|
|
+ for (HashStringList::const_iterator hs = Expected.begin(); hs != Expected.end(); ++hs)
|
|
|
+ std::cerr << "\t- " << hs->toStr() << std::endl;
|
|
|
+ std::cerr << " Actual Hash: " << std::endl;
|
|
|
+ for (HashStringList::const_iterator hs = Actual.begin(); hs != Actual.end(); ++hs)
|
|
|
+ std::cerr << "\t- " << hs->toStr() << std::endl;
|
|
|
+}
|
|
|
+ /*}}}*/
|
|
|
+
|
|
|
// Acquire::Item::Item - Constructor /*{{{*/
|
|
|
-// ---------------------------------------------------------------------
|
|
|
-/* */
|
|
|
-pkgAcquire::Item::Item(pkgAcquire *Owner) : Owner(Owner), FileSize(0),
|
|
|
- PartialSize(0), Mode(0), ID(0), Complete(false),
|
|
|
- Local(false), QueueCounter(0),
|
|
|
- ExpectedAdditionalItems(0)
|
|
|
+pkgAcquire::Item::Item(pkgAcquire *Owner, HashStringList const &ExpectedHashes) :
|
|
|
+ Owner(Owner), FileSize(0), PartialSize(0), Mode(0), ID(0), Complete(false),
|
|
|
+ Local(false), QueueCounter(0), ExpectedAdditionalItems(0),
|
|
|
+ ExpectedHashes(ExpectedHashes)
|
|
|
{
|
|
|
Owner->Add(this);
|
|
|
Status = StatIdle;
|
|
|
@@ -118,7 +129,7 @@ void pkgAcquire::Item::Start(string /*Message*/,unsigned long long Size)
|
|
|
// Acquire::Item::Done - Item downloaded OK /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* */
|
|
|
-void pkgAcquire::Item::Done(string Message,unsigned long long Size,string /*Hash*/,
|
|
|
+void pkgAcquire::Item::Done(string Message,unsigned long long Size,HashStringList const &/*Hash*/,
|
|
|
pkgAcquire::MethodConfig * /*Cnf*/)
|
|
|
{
|
|
|
// We just downloaded something..
|
|
|
@@ -229,8 +240,8 @@ void pkgAcquire::Item::ReportMirrorFailure(string FailCode)
|
|
|
possibly query additional files */
|
|
|
pkgAcqSubIndex::pkgAcqSubIndex(pkgAcquire *Owner, string const &URI,
|
|
|
string const &URIDesc, string const &ShortDesc,
|
|
|
- HashString const &ExpectedHash)
|
|
|
- : Item(Owner), ExpectedHash(ExpectedHash)
|
|
|
+ HashStringList const &ExpectedHashes)
|
|
|
+ : Item(Owner, ExpectedHashes)
|
|
|
{
|
|
|
/* XXX: Beware: Currently this class does nothing (of value) anymore ! */
|
|
|
Debug = _config->FindB("Debug::pkgAcquire::SubIndex",false);
|
|
|
@@ -252,7 +263,7 @@ pkgAcqSubIndex::pkgAcqSubIndex(pkgAcquire *Owner, string const &URI,
|
|
|
// AcqSubIndex::Custom600Headers - Insert custom request headers /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* The only header we use is the last-modified header. */
|
|
|
-string pkgAcqSubIndex::Custom600Headers()
|
|
|
+string pkgAcqSubIndex::Custom600Headers() const
|
|
|
{
|
|
|
string Final = _config->FindDir("Dir::State::lists");
|
|
|
Final += URItoFileName(Desc.URI);
|
|
|
@@ -275,7 +286,7 @@ void pkgAcqSubIndex::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)/*
|
|
|
// No good Index is provided
|
|
|
}
|
|
|
/*}}}*/
|
|
|
-void pkgAcqSubIndex::Done(string Message,unsigned long long Size,string Md5Hash, /*{{{*/
|
|
|
+void pkgAcqSubIndex::Done(string Message,unsigned long long Size,HashStringList const &Hashes, /*{{{*/
|
|
|
pkgAcquire::MethodConfig *Cnf)
|
|
|
{
|
|
|
if(Debug)
|
|
|
@@ -297,7 +308,7 @@ void pkgAcqSubIndex::Done(string Message,unsigned long long Size,string Md5Hash,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- Item::Done(Message,Size,Md5Hash,Cnf);
|
|
|
+ Item::Done(Message, Size, Hashes, Cnf);
|
|
|
|
|
|
string FinalFile = _config->FindDir("Dir::State::lists")+URItoFileName(Desc.URI);
|
|
|
|
|
|
@@ -343,10 +354,10 @@ bool pkgAcqSubIndex::ParseIndex(string const &IndexFile) /*{{{*/
|
|
|
* the original packages file
|
|
|
*/
|
|
|
pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire *Owner,
|
|
|
- IndexTarget const *Target,
|
|
|
- HashString ExpectedHash,
|
|
|
+ IndexTarget const * const Target,
|
|
|
+ HashStringList const &ExpectedHashes,
|
|
|
indexRecords *MetaIndexParser)
|
|
|
- : pkgAcqBaseIndex(Owner, Target, ExpectedHash, MetaIndexParser)
|
|
|
+ : pkgAcqBaseIndex(Owner, Target, ExpectedHashes, MetaIndexParser)
|
|
|
{
|
|
|
|
|
|
Debug = _config->FindB("Debug::pkgAcquire::Diffs",false);
|
|
|
@@ -391,7 +402,7 @@ pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire *Owner,
|
|
|
// AcqIndex::Custom600Headers - Insert custom request headers /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* The only header we use is the last-modified header. */
|
|
|
-string pkgAcqDiffIndex::Custom600Headers()
|
|
|
+string pkgAcqDiffIndex::Custom600Headers() const
|
|
|
{
|
|
|
string Final = _config->FindDir("Dir::State::lists");
|
|
|
Final += URItoFileName(RealURI) + string(".IndexDiff");
|
|
|
@@ -444,7 +455,7 @@ bool pkgAcqDiffIndex::ParseDiffIndex(string IndexDiffFile) /*{{{*/
|
|
|
std::clog << "Package file is up-to-date" << std::endl;
|
|
|
// list cleanup needs to know that this file as well as the already
|
|
|
// present index is ours, so we create an empty diff to save it for us
|
|
|
- new pkgAcqIndexDiffs(Owner, Target, ExpectedHash, MetaIndexParser,
|
|
|
+ new pkgAcqIndexDiffs(Owner, Target, ExpectedHashes, MetaIndexParser,
|
|
|
ServerSha1, available_patches);
|
|
|
return true;
|
|
|
}
|
|
|
@@ -531,7 +542,7 @@ bool pkgAcqDiffIndex::ParseDiffIndex(string IndexDiffFile) /*{{{*/
|
|
|
|
|
|
if (pdiff_merge == false)
|
|
|
{
|
|
|
- new pkgAcqIndexDiffs(Owner, Target, ExpectedHash, MetaIndexParser,
|
|
|
+ new pkgAcqIndexDiffs(Owner, Target, ExpectedHashes, MetaIndexParser,
|
|
|
ServerSha1, available_patches);
|
|
|
}
|
|
|
else
|
|
|
@@ -539,7 +550,7 @@ bool pkgAcqDiffIndex::ParseDiffIndex(string IndexDiffFile) /*{{{*/
|
|
|
std::vector<pkgAcqIndexMergeDiffs*> *diffs = new std::vector<pkgAcqIndexMergeDiffs*>(available_patches.size());
|
|
|
for(size_t i = 0; i < available_patches.size(); ++i)
|
|
|
(*diffs)[i] = new pkgAcqIndexMergeDiffs(Owner, Target,
|
|
|
- ExpectedHash,
|
|
|
+ ExpectedHashes,
|
|
|
MetaIndexParser,
|
|
|
available_patches[i],
|
|
|
diffs);
|
|
|
@@ -566,20 +577,20 @@ void pkgAcqDiffIndex::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)/
|
|
|
std::clog << "pkgAcqDiffIndex failed: " << Desc.URI << " with " << Message << std::endl
|
|
|
<< "Falling back to normal index file acquire" << std::endl;
|
|
|
|
|
|
- new pkgAcqIndex(Owner, Target, ExpectedHash, MetaIndexParser);
|
|
|
+ new pkgAcqIndex(Owner, Target, ExpectedHashes, MetaIndexParser);
|
|
|
|
|
|
Complete = false;
|
|
|
Status = StatDone;
|
|
|
Dequeue();
|
|
|
}
|
|
|
/*}}}*/
|
|
|
-void pkgAcqDiffIndex::Done(string Message,unsigned long long Size,string Md5Hash, /*{{{*/
|
|
|
+void pkgAcqDiffIndex::Done(string Message,unsigned long long Size,HashStringList const &Hashes, /*{{{*/
|
|
|
pkgAcquire::MethodConfig *Cnf)
|
|
|
{
|
|
|
if(Debug)
|
|
|
std::clog << "pkgAcqDiffIndex::Done(): " << Desc.URI << std::endl;
|
|
|
|
|
|
- Item::Done(Message,Size,Md5Hash,Cnf);
|
|
|
+ Item::Done(Message, Size, Hashes, Cnf);
|
|
|
|
|
|
string FinalFile;
|
|
|
FinalFile = _config->FindDir("Dir::State::lists")+URItoFileName(RealURI);
|
|
|
@@ -610,11 +621,11 @@ void pkgAcqDiffIndex::Done(string Message,unsigned long long Size,string Md5Hash
|
|
|
*/
|
|
|
pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire *Owner,
|
|
|
struct IndexTarget const * const Target,
|
|
|
- HashString ExpectedHash,
|
|
|
+ HashStringList const &ExpectedHashes,
|
|
|
indexRecords *MetaIndexParser,
|
|
|
string ServerSha1,
|
|
|
vector<DiffInfo> diffs)
|
|
|
- : pkgAcqBaseIndex(Owner, Target, ExpectedHash, MetaIndexParser),
|
|
|
+ : pkgAcqBaseIndex(Owner, Target, ExpectedHashes, MetaIndexParser),
|
|
|
available_patches(diffs), ServerSha1(ServerSha1)
|
|
|
{
|
|
|
|
|
|
@@ -646,7 +657,7 @@ void pkgAcqIndexDiffs::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)
|
|
|
if(Debug)
|
|
|
std::clog << "pkgAcqIndexDiffs failed: " << Desc.URI << " with " << Message << std::endl
|
|
|
<< "Falling back to normal index file acquire" << std::endl;
|
|
|
- new pkgAcqIndex(Owner, Target, ExpectedHash, MetaIndexParser);
|
|
|
+ new pkgAcqIndex(Owner, Target, ExpectedHashes, MetaIndexParser);
|
|
|
Finish();
|
|
|
}
|
|
|
/*}}}*/
|
|
|
@@ -660,7 +671,7 @@ void pkgAcqIndexDiffs::Finish(bool allDone)
|
|
|
DestFile = _config->FindDir("Dir::State::lists");
|
|
|
DestFile += URItoFileName(RealURI);
|
|
|
|
|
|
- if(!ExpectedHash.empty() && !ExpectedHash.VerifyFile(DestFile))
|
|
|
+ if(HashSums().usable() && !HashSums().VerifyFile(DestFile))
|
|
|
{
|
|
|
RenameOnError(HashSumMismatch);
|
|
|
Dequeue();
|
|
|
@@ -738,13 +749,13 @@ bool pkgAcqIndexDiffs::QueueNextDiff() /*{{{*/
|
|
|
return true;
|
|
|
}
|
|
|
/*}}}*/
|
|
|
-void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size,string Md5Hash, /*{{{*/
|
|
|
+void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size, HashStringList const &Hashes, /*{{{*/
|
|
|
pkgAcquire::MethodConfig *Cnf)
|
|
|
{
|
|
|
if(Debug)
|
|
|
std::clog << "pkgAcqIndexDiffs::Done(): " << Desc.URI << std::endl;
|
|
|
|
|
|
- Item::Done(Message,Size,Md5Hash,Cnf);
|
|
|
+ Item::Done(Message, Size, Hashes, Cnf);
|
|
|
|
|
|
string FinalFile;
|
|
|
FinalFile = _config->FindDir("Dir::State::lists")+URItoFileName(RealURI);
|
|
|
@@ -787,7 +798,7 @@ void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size,string Md5Has
|
|
|
// see if there is more to download
|
|
|
if(available_patches.empty() == false) {
|
|
|
new pkgAcqIndexDiffs(Owner, Target,
|
|
|
- ExpectedHash, MetaIndexParser,
|
|
|
+ ExpectedHashes, MetaIndexParser,
|
|
|
ServerSha1, available_patches);
|
|
|
return Finish();
|
|
|
} else
|
|
|
@@ -798,11 +809,11 @@ void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size,string Md5Has
|
|
|
// AcqIndexMergeDiffs::AcqIndexMergeDiffs - Constructor /*{{{*/
|
|
|
pkgAcqIndexMergeDiffs::pkgAcqIndexMergeDiffs(pkgAcquire *Owner,
|
|
|
struct IndexTarget const * const Target,
|
|
|
- HashString ExpectedHash,
|
|
|
+ HashStringList const &ExpectedHashes,
|
|
|
indexRecords *MetaIndexParser,
|
|
|
DiffInfo const &patch,
|
|
|
std::vector<pkgAcqIndexMergeDiffs*> const * const allPatches)
|
|
|
- : pkgAcqBaseIndex(Owner, Target, ExpectedHash, MetaIndexParser),
|
|
|
+ : pkgAcqBaseIndex(Owner, Target, ExpectedHashes, MetaIndexParser),
|
|
|
patch(patch), allPatches(allPatches), State(StateFetchDiff)
|
|
|
{
|
|
|
|
|
|
@@ -845,16 +856,16 @@ void pkgAcqIndexMergeDiffs::Failed(string Message,pkgAcquire::MethodConfig * /*C
|
|
|
// first failure means we should fallback
|
|
|
State = StateErrorDiff;
|
|
|
std::clog << "Falling back to normal index file acquire" << std::endl;
|
|
|
- new pkgAcqIndex(Owner, Target, ExpectedHash, MetaIndexParser);
|
|
|
+ new pkgAcqIndex(Owner, Target, ExpectedHashes, MetaIndexParser);
|
|
|
}
|
|
|
/*}}}*/
|
|
|
-void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,string Md5Hash, /*{{{*/
|
|
|
+void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,HashStringList const &Hashes, /*{{{*/
|
|
|
pkgAcquire::MethodConfig *Cnf)
|
|
|
{
|
|
|
if(Debug)
|
|
|
std::clog << "pkgAcqIndexMergeDiffs::Done(): " << Desc.URI << std::endl;
|
|
|
|
|
|
- Item::Done(Message,Size,Md5Hash,Cnf);
|
|
|
+ Item::Done(Message,Size,Hashes,Cnf);
|
|
|
|
|
|
string const FinalFile = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
|
|
|
|
|
|
@@ -890,7 +901,7 @@ void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,string M
|
|
|
else if (State == StateApplyDiff)
|
|
|
{
|
|
|
// see if we really got the expected file
|
|
|
- if(!ExpectedHash.empty() && !ExpectedHash.VerifyFile(DestFile))
|
|
|
+ if(ExpectedHashes.usable() && !ExpectedHashes.VerifyFile(DestFile))
|
|
|
{
|
|
|
RenameOnError(HashSumMismatch);
|
|
|
return;
|
|
|
@@ -927,7 +938,7 @@ void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,string M
|
|
|
instantiated to fetch the revision file */
|
|
|
pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,
|
|
|
string URI,string URIDesc,string ShortDesc,
|
|
|
- HashString ExpectedHash, string comprExt)
|
|
|
+ HashStringList const &ExpectedHash, string comprExt)
|
|
|
: pkgAcqBaseIndex(Owner, NULL, ExpectedHash, NULL), RealURI(URI)
|
|
|
{
|
|
|
if(comprExt.empty() == true)
|
|
|
@@ -946,14 +957,15 @@ pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,
|
|
|
Init(URI, URIDesc, ShortDesc);
|
|
|
}
|
|
|
pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner, IndexTarget const *Target,
|
|
|
- HashString const &ExpectedHash, indexRecords *MetaIndexParser)
|
|
|
+ HashStringList const &ExpectedHash,
|
|
|
+ indexRecords *MetaIndexParser)
|
|
|
: pkgAcqBaseIndex(Owner, Target, ExpectedHash, MetaIndexParser),
|
|
|
RealURI(Target->URI)
|
|
|
{
|
|
|
// autoselect the compression method
|
|
|
std::vector<std::string> types = APT::Configuration::getCompressionTypes();
|
|
|
CompressionExtension = "";
|
|
|
- if (ExpectedHash.empty() == false)
|
|
|
+ if (ExpectedHashes.usable())
|
|
|
{
|
|
|
for (std::vector<std::string>::const_iterator t = types.begin(); t != types.end(); ++t)
|
|
|
if (*t == "uncompressed" || MetaIndexParser->Exists(string(Target->MetaKey).append(".").append(*t)) == true)
|
|
|
@@ -1018,7 +1030,7 @@ void pkgAcqIndex::Init(string const &URI, string const &URIDesc, string const &S
|
|
|
// AcqIndex::Custom600Headers - Insert custom request headers /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* The only header we use is the last-modified header. */
|
|
|
-string pkgAcqIndex::Custom600Headers()
|
|
|
+string pkgAcqIndex::Custom600Headers() const
|
|
|
{
|
|
|
string Final = _config->FindDir("Dir::State::lists");
|
|
|
Final += URItoFileName(RealURI);
|
|
|
@@ -1064,22 +1076,17 @@ void pkgAcqIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf) /*{{{*/
|
|
|
to the uncompressed version of the file. If this is so the file
|
|
|
is copied into the partial directory. In all other cases the file
|
|
|
is decompressed with a gzip uri. */
|
|
|
-void pkgAcqIndex::Done(string Message,unsigned long long Size,string Hash,
|
|
|
+void pkgAcqIndex::Done(string Message,unsigned long long Size,HashStringList const &Hashes,
|
|
|
pkgAcquire::MethodConfig *Cfg)
|
|
|
{
|
|
|
- Item::Done(Message,Size,Hash,Cfg);
|
|
|
+ Item::Done(Message,Size,Hashes,Cfg);
|
|
|
|
|
|
if (Decompression == true)
|
|
|
{
|
|
|
- if (_config->FindB("Debug::pkgAcquire::Auth", false))
|
|
|
- {
|
|
|
- std::cerr << std::endl << RealURI << ": Computed Hash: " << Hash;
|
|
|
- std::cerr << " Expected Hash: " << ExpectedHash.toStr() << std::endl;
|
|
|
- }
|
|
|
-
|
|
|
- if (!ExpectedHash.empty() && ExpectedHash.toStr() != Hash)
|
|
|
+ if (ExpectedHashes.usable() && ExpectedHashes != Hashes)
|
|
|
{
|
|
|
RenameOnError(HashSumMismatch);
|
|
|
+ printHashSumComparision(RealURI, ExpectedHashes, Hashes);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -1201,12 +1208,12 @@ void pkgAcqIndex::Done(string Message,unsigned long long Size,string Hash,
|
|
|
/* The Translation file is added to the queue */
|
|
|
pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire *Owner,
|
|
|
string URI,string URIDesc,string ShortDesc)
|
|
|
- : pkgAcqIndex(Owner, URI, URIDesc, ShortDesc, HashString(), "")
|
|
|
+ : pkgAcqIndex(Owner, URI, URIDesc, ShortDesc, HashStringList(), "")
|
|
|
{
|
|
|
}
|
|
|
-pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire *Owner, IndexTarget const *Target,
|
|
|
- HashString const &ExpectedHash, indexRecords *MetaIndexParser)
|
|
|
- : pkgAcqIndex(Owner, Target, ExpectedHash, MetaIndexParser)
|
|
|
+pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire *Owner, IndexTarget const * const Target,
|
|
|
+ HashStringList const &ExpectedHashes, indexRecords *MetaIndexParser)
|
|
|
+ : pkgAcqIndex(Owner, Target, ExpectedHashes, MetaIndexParser)
|
|
|
{
|
|
|
// load the filesize
|
|
|
indexRecords::checkSum *Record = MetaIndexParser->Lookup(string(Target->MetaKey));
|
|
|
@@ -1216,7 +1223,7 @@ pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire *Owner, IndexTarget const *Target,
|
|
|
/*}}}*/
|
|
|
// AcqIndexTrans::Custom600Headers - Insert custom request headers /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
-string pkgAcqIndexTrans::Custom600Headers()
|
|
|
+string pkgAcqIndexTrans::Custom600Headers() const
|
|
|
{
|
|
|
string Final = _config->FindDir("Dir::State::lists");
|
|
|
Final += URItoFileName(RealURI);
|
|
|
@@ -1260,7 +1267,7 @@ pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire *Owner, /*{{{*/
|
|
|
string MetaIndexShortDesc,
|
|
|
const vector<IndexTarget*>* IndexTargets,
|
|
|
indexRecords* MetaIndexParser) :
|
|
|
- Item(Owner), RealURI(URI), MetaIndexURI(MetaIndexURI),
|
|
|
+ Item(Owner, HashStringList()), RealURI(URI), MetaIndexURI(MetaIndexURI),
|
|
|
MetaIndexURIDesc(MetaIndexURIDesc), MetaIndexShortDesc(MetaIndexShortDesc),
|
|
|
MetaIndexParser(MetaIndexParser), IndexTargets(IndexTargets)
|
|
|
{
|
|
|
@@ -1313,7 +1320,7 @@ pkgAcqMetaSig::~pkgAcqMetaSig() /*{{{*/
|
|
|
// pkgAcqMetaSig::Custom600Headers - Insert custom request headers /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* The only header we use is the last-modified header. */
|
|
|
-string pkgAcqMetaSig::Custom600Headers()
|
|
|
+string pkgAcqMetaSig::Custom600Headers() const
|
|
|
{
|
|
|
struct stat Buf;
|
|
|
if (stat(LastGoodSig.c_str(),&Buf) != 0)
|
|
|
@@ -1322,10 +1329,10 @@ string pkgAcqMetaSig::Custom600Headers()
|
|
|
return "\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
|
|
|
}
|
|
|
|
|
|
-void pkgAcqMetaSig::Done(string Message,unsigned long long Size,string MD5,
|
|
|
+void pkgAcqMetaSig::Done(string Message,unsigned long long Size, HashStringList const &Hashes,
|
|
|
pkgAcquire::MethodConfig *Cfg)
|
|
|
{
|
|
|
- Item::Done(Message,Size,MD5,Cfg);
|
|
|
+ Item::Done(Message, Size, Hashes, Cfg);
|
|
|
|
|
|
string FileName = LookupTag(Message,"Filename");
|
|
|
if (FileName.empty() == true)
|
|
|
@@ -1405,9 +1412,9 @@ void pkgAcqMetaSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf)/*{{{*/
|
|
|
pkgAcqMetaIndex::pkgAcqMetaIndex(pkgAcquire *Owner, /*{{{*/
|
|
|
string URI,string URIDesc,string ShortDesc,
|
|
|
string SigFile,
|
|
|
- const vector<struct IndexTarget*>* IndexTargets,
|
|
|
+ const vector<IndexTarget*>* IndexTargets,
|
|
|
indexRecords* MetaIndexParser) :
|
|
|
- Item(Owner), RealURI(URI), SigFile(SigFile), IndexTargets(IndexTargets),
|
|
|
+ Item(Owner, HashStringList()), RealURI(URI), SigFile(SigFile), IndexTargets(IndexTargets),
|
|
|
MetaIndexParser(MetaIndexParser), AuthPass(false), IMSHit(false)
|
|
|
{
|
|
|
DestFile = _config->FindDir("Dir::State::lists") + "partial/";
|
|
|
@@ -1428,7 +1435,7 @@ pkgAcqMetaIndex::pkgAcqMetaIndex(pkgAcquire *Owner, /*{{{*/
|
|
|
// pkgAcqMetaIndex::Custom600Headers - Insert custom request headers /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* The only header we use is the last-modified header. */
|
|
|
-string pkgAcqMetaIndex::Custom600Headers()
|
|
|
+string pkgAcqMetaIndex::Custom600Headers() const
|
|
|
{
|
|
|
string Final = _config->FindDir("Dir::State::lists");
|
|
|
Final += URItoFileName(RealURI);
|
|
|
@@ -1440,10 +1447,10 @@ string pkgAcqMetaIndex::Custom600Headers()
|
|
|
return "\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
|
|
|
}
|
|
|
/*}}}*/
|
|
|
-void pkgAcqMetaIndex::Done(string Message,unsigned long long Size,string Hash, /*{{{*/
|
|
|
+void pkgAcqMetaIndex::Done(string Message,unsigned long long Size,HashStringList const &Hashes, /*{{{*/
|
|
|
pkgAcquire::MethodConfig *Cfg)
|
|
|
{
|
|
|
- Item::Done(Message,Size,Hash,Cfg);
|
|
|
+ Item::Done(Message,Size,Hashes,Cfg);
|
|
|
|
|
|
// MetaIndexes are done in two passes: one to download the
|
|
|
// metaindex with an appropriate method, and a second to verify it
|
|
|
@@ -1614,12 +1621,12 @@ void pkgAcqMetaIndex::QueueIndexes(bool verify) /*{{{*/
|
|
|
// at this point the real Items are loaded in the fetcher
|
|
|
ExpectedAdditionalItems = 0;
|
|
|
|
|
|
- for (vector <struct IndexTarget*>::const_iterator Target = IndexTargets->begin();
|
|
|
+ for (vector <IndexTarget*>::const_iterator Target = IndexTargets->begin();
|
|
|
Target != IndexTargets->end();
|
|
|
++Target)
|
|
|
{
|
|
|
- HashString ExpectedIndexHash;
|
|
|
- indexRecords::checkSum *Record = MetaIndexParser->Lookup((*Target)->MetaKey);
|
|
|
+ HashStringList ExpectedIndexHashes;
|
|
|
+ const indexRecords::checkSum *Record = MetaIndexParser->Lookup((*Target)->MetaKey);
|
|
|
bool compressedAvailable = false;
|
|
|
if (Record == NULL)
|
|
|
{
|
|
|
@@ -1642,14 +1649,16 @@ void pkgAcqMetaIndex::QueueIndexes(bool verify) /*{{{*/
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- ExpectedIndexHash = Record->Hash;
|
|
|
+ ExpectedIndexHashes = Record->Hashes;
|
|
|
if (_config->FindB("Debug::pkgAcquire::Auth", false))
|
|
|
{
|
|
|
- std::cerr << "Queueing: " << (*Target)->URI << std::endl;
|
|
|
- std::cerr << "Expected Hash: " << ExpectedIndexHash.toStr() << std::endl;
|
|
|
+ std::cerr << "Queueing: " << (*Target)->URI << std::endl
|
|
|
+ << "Expected Hash:" << std::endl;
|
|
|
+ for (HashStringList::const_iterator hs = ExpectedIndexHashes.begin(); hs != ExpectedIndexHashes.end(); ++hs)
|
|
|
+ std::cerr << "\t- " << hs->toStr() << std::endl;
|
|
|
std::cerr << "For: " << Record->MetaKeyFilename << std::endl;
|
|
|
}
|
|
|
- if (verify == true && ExpectedIndexHash.empty() == true && (*Target)->IsOptional() == false)
|
|
|
+ if (verify == true && ExpectedIndexHashes.empty() == true && (*Target)->IsOptional() == false)
|
|
|
{
|
|
|
Status = StatAuthError;
|
|
|
strprintf(ErrorText, _("Unable to find hash sum for '%s' in Release file"), (*Target)->MetaKey.c_str());
|
|
|
@@ -1661,14 +1670,14 @@ void pkgAcqMetaIndex::QueueIndexes(bool verify) /*{{{*/
|
|
|
{
|
|
|
if ((*Target)->IsSubIndex() == true)
|
|
|
new pkgAcqSubIndex(Owner, (*Target)->URI, (*Target)->Description,
|
|
|
- (*Target)->ShortDesc, ExpectedIndexHash);
|
|
|
+ (*Target)->ShortDesc, ExpectedIndexHashes);
|
|
|
else if (transInRelease == false || Record != NULL || compressedAvailable == true)
|
|
|
{
|
|
|
if (_config->FindB("Acquire::PDiffs",true) == true && transInRelease == true &&
|
|
|
MetaIndexParser->Exists((*Target)->MetaKey + ".diff/Index") == true)
|
|
|
- new pkgAcqDiffIndex(Owner, *Target, ExpectedIndexHash, MetaIndexParser);
|
|
|
+ new pkgAcqDiffIndex(Owner, *Target, ExpectedIndexHashes, MetaIndexParser);
|
|
|
else
|
|
|
- new pkgAcqIndexTrans(Owner, *Target, ExpectedIndexHash, MetaIndexParser);
|
|
|
+ new pkgAcqIndexTrans(Owner, *Target, ExpectedIndexHashes, MetaIndexParser);
|
|
|
}
|
|
|
continue;
|
|
|
}
|
|
|
@@ -1679,9 +1688,9 @@ void pkgAcqMetaIndex::QueueIndexes(bool verify) /*{{{*/
|
|
|
instead, but passing the required info to it is to much hassle */
|
|
|
if(_config->FindB("Acquire::PDiffs",true) == true && (verify == false ||
|
|
|
MetaIndexParser->Exists((*Target)->MetaKey + ".diff/Index") == true))
|
|
|
- new pkgAcqDiffIndex(Owner, *Target, ExpectedIndexHash, MetaIndexParser);
|
|
|
+ new pkgAcqDiffIndex(Owner, *Target, ExpectedIndexHashes, MetaIndexParser);
|
|
|
else
|
|
|
- new pkgAcqIndex(Owner, *Target, ExpectedIndexHash, MetaIndexParser);
|
|
|
+ new pkgAcqIndex(Owner, *Target, ExpectedIndexHashes, MetaIndexParser);
|
|
|
}
|
|
|
}
|
|
|
/*}}}*/
|
|
|
@@ -1834,7 +1843,7 @@ pkgAcqMetaClearSig::pkgAcqMetaClearSig(pkgAcquire *Owner, /*{{{*/
|
|
|
string const &URI, string const &URIDesc, string const &ShortDesc,
|
|
|
string const &MetaIndexURI, string const &MetaIndexURIDesc, string const &MetaIndexShortDesc,
|
|
|
string const &MetaSigURI, string const &MetaSigURIDesc, string const &MetaSigShortDesc,
|
|
|
- const vector<struct IndexTarget*>* IndexTargets,
|
|
|
+ const vector<IndexTarget*>* IndexTargets,
|
|
|
indexRecords* MetaIndexParser) :
|
|
|
pkgAcqMetaIndex(Owner, URI, URIDesc, ShortDesc, "", IndexTargets, MetaIndexParser),
|
|
|
MetaIndexURI(MetaIndexURI), MetaIndexURIDesc(MetaIndexURIDesc), MetaIndexShortDesc(MetaIndexShortDesc),
|
|
|
@@ -1870,7 +1879,7 @@ pkgAcqMetaClearSig::~pkgAcqMetaClearSig() /*{{{*/
|
|
|
// pkgAcqMetaClearSig::Custom600Headers - Insert custom request headers /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
// FIXME: this can go away once the InRelease file is used widely
|
|
|
-string pkgAcqMetaClearSig::Custom600Headers()
|
|
|
+string pkgAcqMetaClearSig::Custom600Headers() const
|
|
|
{
|
|
|
string Final = _config->FindDir("Dir::State::lists");
|
|
|
Final += URItoFileName(RealURI);
|
|
|
@@ -1919,7 +1928,7 @@ void pkgAcqMetaClearSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf) /*
|
|
|
pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
|
|
|
pkgRecords *Recs,pkgCache::VerIterator const &Version,
|
|
|
string &StoreFilename) :
|
|
|
- Item(Owner), Version(Version), Sources(Sources), Recs(Recs),
|
|
|
+ Item(Owner, HashStringList()), Version(Version), Sources(Sources), Recs(Recs),
|
|
|
StoreFilename(StoreFilename), Vf(Version.FileList()),
|
|
|
Trusted(false)
|
|
|
{
|
|
|
@@ -2004,7 +2013,6 @@ pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
|
|
|
checking later. */
|
|
|
bool pkgAcqArchive::QueueNext()
|
|
|
{
|
|
|
- string const ForceHash = _config->Find("Acquire::ForceHash");
|
|
|
for (; Vf.end() == false; ++Vf)
|
|
|
{
|
|
|
// Ignore not source sources
|
|
|
@@ -2025,31 +2033,10 @@ bool pkgAcqArchive::QueueNext()
|
|
|
pkgRecords::Parser &Parse = Recs->Lookup(Vf);
|
|
|
if (_error->PendingError() == true)
|
|
|
return false;
|
|
|
-
|
|
|
+
|
|
|
string PkgFile = Parse.FileName();
|
|
|
- if (ForceHash.empty() == false)
|
|
|
- {
|
|
|
- if(stringcasecmp(ForceHash, "sha512") == 0)
|
|
|
- ExpectedHash = HashString("SHA512", Parse.SHA512Hash());
|
|
|
- else if(stringcasecmp(ForceHash, "sha256") == 0)
|
|
|
- ExpectedHash = HashString("SHA256", Parse.SHA256Hash());
|
|
|
- else if (stringcasecmp(ForceHash, "sha1") == 0)
|
|
|
- ExpectedHash = HashString("SHA1", Parse.SHA1Hash());
|
|
|
- else
|
|
|
- ExpectedHash = HashString("MD5Sum", Parse.MD5Hash());
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- string Hash;
|
|
|
- if ((Hash = Parse.SHA512Hash()).empty() == false)
|
|
|
- ExpectedHash = HashString("SHA512", Hash);
|
|
|
- else if ((Hash = Parse.SHA256Hash()).empty() == false)
|
|
|
- ExpectedHash = HashString("SHA256", Hash);
|
|
|
- else if ((Hash = Parse.SHA1Hash()).empty() == false)
|
|
|
- ExpectedHash = HashString("SHA1", Hash);
|
|
|
- else
|
|
|
- ExpectedHash = HashString("MD5Sum", Parse.MD5Hash());
|
|
|
- }
|
|
|
+ ExpectedHashes = Parse.Hashes();
|
|
|
+
|
|
|
if (PkgFile.empty() == true)
|
|
|
return _error->Error(_("The package index files are corrupted. No Filename: "
|
|
|
"field for package %s."),
|
|
|
@@ -2136,10 +2123,10 @@ bool pkgAcqArchive::QueueNext()
|
|
|
// AcqArchive::Done - Finished fetching /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* */
|
|
|
-void pkgAcqArchive::Done(string Message,unsigned long long Size,string CalcHash,
|
|
|
+void pkgAcqArchive::Done(string Message,unsigned long long Size, HashStringList const &CalcHashes,
|
|
|
pkgAcquire::MethodConfig *Cfg)
|
|
|
{
|
|
|
- Item::Done(Message,Size,CalcHash,Cfg);
|
|
|
+ Item::Done(Message, Size, CalcHashes, Cfg);
|
|
|
|
|
|
// Check the size
|
|
|
if (Size != Version->Size)
|
|
|
@@ -2147,12 +2134,12 @@ void pkgAcqArchive::Done(string Message,unsigned long long Size,string CalcHash,
|
|
|
RenameOnError(SizeMismatch);
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- // Check the hash
|
|
|
+
|
|
|
// FIXME: could this empty() check impose *any* sort of security issue?
|
|
|
- if(ExpectedHash.empty() == false && ExpectedHash.toStr() != CalcHash)
|
|
|
+ if(ExpectedHashes.usable() && ExpectedHashes != CalcHashes)
|
|
|
{
|
|
|
RenameOnError(HashSumMismatch);
|
|
|
+ printHashSumComparision(DestFile, ExpectedHashes, CalcHashes);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -2224,7 +2211,7 @@ void pkgAcqArchive::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
|
|
|
/*}}}*/
|
|
|
// AcqArchive::IsTrusted - Determine whether this archive comes from a trusted source /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
-APT_PURE bool pkgAcqArchive::IsTrusted()
|
|
|
+APT_PURE bool pkgAcqArchive::IsTrusted() const
|
|
|
{
|
|
|
return Trusted;
|
|
|
}
|
|
|
@@ -2243,11 +2230,11 @@ void pkgAcqArchive::Finished()
|
|
|
// AcqFile::pkgAcqFile - Constructor /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* The file is added to the queue */
|
|
|
-pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI,string Hash,
|
|
|
+pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI, HashStringList const &Hashes,
|
|
|
unsigned long long Size,string Dsc,string ShortDesc,
|
|
|
const string &DestDir, const string &DestFilename,
|
|
|
bool IsIndexFile) :
|
|
|
- Item(Owner), ExpectedHash(Hash), IsIndexFile(IsIndexFile)
|
|
|
+ Item(Owner, Hashes), IsIndexFile(IsIndexFile)
|
|
|
{
|
|
|
Retries = _config->FindI("Acquire::Retries",0);
|
|
|
|
|
|
@@ -2284,15 +2271,16 @@ pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI,string Hash,
|
|
|
// AcqFile::Done - Item downloaded OK /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* */
|
|
|
-void pkgAcqFile::Done(string Message,unsigned long long Size,string CalcHash,
|
|
|
+void pkgAcqFile::Done(string Message,unsigned long long Size,HashStringList const &CalcHashes,
|
|
|
pkgAcquire::MethodConfig *Cnf)
|
|
|
{
|
|
|
- Item::Done(Message,Size,CalcHash,Cnf);
|
|
|
+ Item::Done(Message,Size,CalcHashes,Cnf);
|
|
|
|
|
|
// Check the hash
|
|
|
- if(!ExpectedHash.empty() && ExpectedHash.toStr() != CalcHash)
|
|
|
+ if(ExpectedHashes.usable() && ExpectedHashes != CalcHashes)
|
|
|
{
|
|
|
RenameOnError(HashSumMismatch);
|
|
|
+ printHashSumComparision(DestFile, ExpectedHashes, CalcHashes);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -2363,7 +2351,7 @@ void pkgAcqFile::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
|
|
|
// AcqIndex::Custom600Headers - Insert custom request headers /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* The only header we use is the last-modified header. */
|
|
|
-string pkgAcqFile::Custom600Headers()
|
|
|
+string pkgAcqFile::Custom600Headers() const
|
|
|
{
|
|
|
if (IsIndexFile)
|
|
|
return "\nIndex-File: true";
|