|
|
@@ -17,6 +17,7 @@
|
|
|
#include <apt-pkg/strutl.h>
|
|
|
#include <apt-pkg/configuration.h>
|
|
|
#include <apt-pkg/aptconfiguration.h>
|
|
|
+#include <apt-pkg/hashes.h>
|
|
|
|
|
|
using std::max;
|
|
|
/*}}}*/
|
|
|
@@ -114,64 +115,86 @@ bool debSrcRecordParser::BuildDepends(std::vector<pkgSrcRecords::Parser::BuildDe
|
|
|
bool debSrcRecordParser::Files(std::vector<pkgSrcRecords::File> &List)
|
|
|
{
|
|
|
List.erase(List.begin(),List.end());
|
|
|
+
|
|
|
+ // map from the Hashsum field to the hashsum function,
|
|
|
+ // unfortunately this is not a 1:1 mapping from
|
|
|
+ // Hashes::SupporedHashes as e.g. Files is a historic name for the md5
|
|
|
+ const std::pair<const char*, const char*> SourceHashFields[] = {
|
|
|
+ std::make_pair( "Checksums-Sha512", "SHA512"),
|
|
|
+ std::make_pair( "Checksums-Sha256", "SHA256"),
|
|
|
+ std::make_pair( "Checksums-Sha1", "SHA1"),
|
|
|
+ std::make_pair( "Files", "MD5Sum"), // historic Name
|
|
|
+ };
|
|
|
|
|
|
- string Files = Sect.FindS("Files");
|
|
|
- if (Files.empty() == true)
|
|
|
- return false;
|
|
|
+ for (unsigned int i=0;
|
|
|
+ i < sizeof(SourceHashFields)/sizeof(SourceHashFields[0]);
|
|
|
+ i++)
|
|
|
+ {
|
|
|
+ string Files = Sect.FindS(SourceHashFields[i].first);
|
|
|
+ if (Files.empty() == true)
|
|
|
+ continue;
|
|
|
|
|
|
- // Stash the / terminated directory prefix
|
|
|
- string Base = Sect.FindS("Directory");
|
|
|
- if (Base.empty() == false && Base[Base.length()-1] != '/')
|
|
|
- Base += '/';
|
|
|
+ // Stash the / terminated directory prefix
|
|
|
+ string Base = Sect.FindS("Directory");
|
|
|
+ if (Base.empty() == false && Base[Base.length()-1] != '/')
|
|
|
+ Base += '/';
|
|
|
|
|
|
- std::vector<std::string> const compExts = APT::Configuration::getCompressorExtensions();
|
|
|
+ std::vector<std::string> const compExts = APT::Configuration::getCompressorExtensions();
|
|
|
|
|
|
- // Iterate over the entire list grabbing each triplet
|
|
|
- const char *C = Files.c_str();
|
|
|
- while (*C != 0)
|
|
|
- {
|
|
|
- pkgSrcRecords::File F;
|
|
|
- string Size;
|
|
|
-
|
|
|
- // Parse each of the elements
|
|
|
- if (ParseQuoteWord(C,F.MD5Hash) == false ||
|
|
|
- ParseQuoteWord(C,Size) == false ||
|
|
|
- ParseQuoteWord(C,F.Path) == false)
|
|
|
- return _error->Error("Error parsing file record");
|
|
|
-
|
|
|
- // Parse the size and append the directory
|
|
|
- F.Size = atoi(Size.c_str());
|
|
|
- F.Path = Base + F.Path;
|
|
|
-
|
|
|
- // Try to guess what sort of file it is we are getting.
|
|
|
- string::size_type Pos = F.Path.length()-1;
|
|
|
- while (1)
|
|
|
- {
|
|
|
- string::size_type Tmp = F.Path.rfind('.',Pos);
|
|
|
- if (Tmp == string::npos)
|
|
|
- break;
|
|
|
- if (F.Type == "tar") {
|
|
|
- // source v3 has extension 'debian.tar.*' instead of 'diff.*'
|
|
|
- if (string(F.Path, Tmp+1, Pos-Tmp) == "debian")
|
|
|
- F.Type = "diff";
|
|
|
- break;
|
|
|
- }
|
|
|
- F.Type = string(F.Path,Tmp+1,Pos-Tmp);
|
|
|
+ // Iterate over the entire list grabbing each triplet
|
|
|
+ const char *C = Files.c_str();
|
|
|
+ while (*C != 0)
|
|
|
+ {
|
|
|
+ pkgSrcRecords::File F;
|
|
|
+ string Size;
|
|
|
+
|
|
|
+ // Parse each of the elements
|
|
|
+ std::string RawHash;
|
|
|
+ if (ParseQuoteWord(C, RawHash) == false ||
|
|
|
+ ParseQuoteWord(C, Size) == false ||
|
|
|
+ ParseQuoteWord(C, F.Path) == false)
|
|
|
+ return _error->Error("Error parsing '%s' record",
|
|
|
+ SourceHashFields[i].first);
|
|
|
+ // assign full hash string
|
|
|
+ F.Hash = HashString(SourceHashFields[i].second, RawHash).toStr();
|
|
|
+ // API compat hack
|
|
|
+ if(SourceHashFields[i].second == "MD5Sum")
|
|
|
+ F.MD5Hash = RawHash;
|
|
|
+
|
|
|
+ // Parse the size and append the directory
|
|
|
+ F.Size = atoi(Size.c_str());
|
|
|
+ F.Path = Base + F.Path;
|
|
|
+
|
|
|
+ // Try to guess what sort of file it is we are getting.
|
|
|
+ string::size_type Pos = F.Path.length()-1;
|
|
|
+ while (1)
|
|
|
+ {
|
|
|
+ string::size_type Tmp = F.Path.rfind('.',Pos);
|
|
|
+ if (Tmp == string::npos)
|
|
|
+ break;
|
|
|
+ if (F.Type == "tar") {
|
|
|
+ // source v3 has extension 'debian.tar.*' instead of 'diff.*'
|
|
|
+ if (string(F.Path, Tmp+1, Pos-Tmp) == "debian")
|
|
|
+ F.Type = "diff";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ F.Type = string(F.Path,Tmp+1,Pos-Tmp);
|
|
|
+
|
|
|
+ if (std::find(compExts.begin(), compExts.end(), std::string(".").append(F.Type)) != compExts.end() ||
|
|
|
+ F.Type == "tar")
|
|
|
+ {
|
|
|
+ Pos = Tmp-1;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- if (std::find(compExts.begin(), compExts.end(), std::string(".").append(F.Type)) != compExts.end() ||
|
|
|
- F.Type == "tar")
|
|
|
- {
|
|
|
- Pos = Tmp-1;
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
- }
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- List.push_back(F);
|
|
|
+ List.push_back(F);
|
|
|
+ }
|
|
|
+ break;
|
|
|
}
|
|
|
-
|
|
|
- return true;
|
|
|
+ return (List.size() > 0);
|
|
|
}
|
|
|
/*}}}*/
|
|
|
// SrcRecordParser::~SrcRecordParser - Destructor /*{{{*/
|