mirror of
https://github.com/microsoft/vcpkg.git
synced 2025-06-07 12:26:08 +08:00
[vcpkg.exe] Hash check after downloading a tool
This commit is contained in:
parent
0108d6ea28
commit
b217246f70
@ -20,6 +20,7 @@ namespace vcpkg::Commands::Fetch
|
||||
std::string url;
|
||||
fs::path downloaded_path;
|
||||
fs::path tool_dir_path;
|
||||
std::string sha512;
|
||||
};
|
||||
|
||||
static Optional<std::array<int, 3>> parse_version_string(const std::string& version_as_string)
|
||||
@ -78,6 +79,7 @@ namespace vcpkg::Commands::Fetch
|
||||
Strings::format(R"###(<exeRelativePath>([\s\S]*?)</exeRelativePath>)###")};
|
||||
static const std::regex ARCHIVE_NAME_REGEX{Strings::format(R"###(<archiveName>([\s\S]*?)</archiveName>)###")};
|
||||
static const std::regex URL_REGEX{Strings::format(R"###(<url>([\s\S]*?)</url>)###")};
|
||||
static const std::regex SHA512_REGEX{Strings::format(R"###(<sha512>([\s\S]*?)</sha512>)###")};
|
||||
|
||||
std::smatch match_xml_version;
|
||||
const bool has_xml_version = std::regex_search(XML.cbegin(), XML.cend(), match_xml_version, XML_VERSION_REGEX);
|
||||
@ -123,11 +125,15 @@ namespace vcpkg::Commands::Fetch
|
||||
const std::string tool_dir_name = Strings::format("%s-%s-%s", tool, required_version_as_string, OS_STRING);
|
||||
const fs::path tool_dir_path = paths.downloads / "tools" / tool_dir_name;
|
||||
const fs::path exe_path = tool_dir_path / exe_relative_path;
|
||||
|
||||
const std::string sha512 = get_string_inside_tags(tool_data_as_string, SHA512_REGEX, "sha512");
|
||||
|
||||
return ToolData{*required_version.get(),
|
||||
exe_path,
|
||||
url,
|
||||
paths.downloads / archive_name.value_or(exe_relative_path),
|
||||
tool_dir_path};
|
||||
tool_dir_path,
|
||||
sha512};
|
||||
}
|
||||
|
||||
static bool exists_and_has_equal_or_greater_version(const std::string& version_cmd,
|
||||
@ -256,6 +262,17 @@ namespace vcpkg::Commands::Fetch
|
||||
Checks::check_exit(VCPKG_LINE_INFO, code == 0, "curl failed while downloading %s", tool_data.url);
|
||||
}
|
||||
|
||||
const std::string actual_hash = Hash::get_file_hash(paths, tool_data.downloaded_path, "SHA512");
|
||||
Checks::check_exit(VCPKG_LINE_INFO,
|
||||
tool_data.sha512 == actual_hash,
|
||||
"File does not have the expected hash:\n"
|
||||
" File path : [ %s ]\n"
|
||||
" Expected hash: [ %s ]\n"
|
||||
" Actual hash: [ %s ] \n",
|
||||
tool_data.downloaded_path.u8string(),
|
||||
tool_data.sha512,
|
||||
actual_hash);
|
||||
|
||||
System::println("Extracting %s...", tool_name);
|
||||
extract_archive(paths, tool_data.downloaded_path, tool_data.tool_dir_path);
|
||||
System::println("Extracting %s... done.", tool_name);
|
||||
|
Loading…
Reference in New Issue
Block a user