summaryrefslogtreecommitdiff
path: root/Source/Core/UpdaterCommon/UpdaterCommon.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/UpdaterCommon/UpdaterCommon.cpp')
-rw-r--r--Source/Core/UpdaterCommon/UpdaterCommon.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/Source/Core/UpdaterCommon/UpdaterCommon.cpp b/Source/Core/UpdaterCommon/UpdaterCommon.cpp
index fb9606ca49..dee55965bf 100644
--- a/Source/Core/UpdaterCommon/UpdaterCommon.cpp
+++ b/Source/Core/UpdaterCommon/UpdaterCommon.cpp
@@ -18,6 +18,7 @@
#include "Common/HttpRequest.h"
#include "Common/ScopeGuard.h"
#include "Common/StringUtil.h"
+#include "UpdaterCommon/Platform.h"
#include "UpdaterCommon/UI.h"
#ifndef _WIN32
@@ -278,6 +279,41 @@ bool DownloadContent(const std::vector<TodoList::DownloadOp>& to_download,
return true;
}
+bool PlatformVersionCheck(const std::vector<TodoList::UpdateOp>& to_update,
+ const std::string& install_base_path, const std::string& temp_dir)
+{
+ UI::SetDescription("Checking platform...");
+
+ const auto op_it = std::find_if(to_update.cbegin(), to_update.cend(),
+ [&](const auto& op) { return op.filename == "build_info.txt"; });
+ if (op_it == to_update.cend())
+ return true;
+
+ const auto op = *op_it;
+ std::string build_info_path =
+ temp_dir + DIR_SEP + HexEncode(op.new_hash.data(), op.new_hash.size());
+ std::string build_info_content;
+ if (!File::ReadFileToString(build_info_path, build_info_content) ||
+ op.new_hash != ComputeHash(build_info_content))
+ {
+ fprintf(log_fp, "Failed to read %s\n.", build_info_path.c_str());
+ return false;
+ }
+ auto next_build_info = Platform::BuildInfo(build_info_content);
+
+ build_info_path = install_base_path + DIR_SEP + "build_info.txt";
+ auto this_build_info = Platform::BuildInfo();
+ if (File::ReadFileToString(build_info_path, build_info_content))
+ {
+ if (op.old_hash != ComputeHash(build_info_content))
+ fprintf(log_fp, "Using modified existing BuildInfo %s.\n", build_info_path.c_str());
+ this_build_info = Platform::BuildInfo(build_info_content);
+ }
+
+ // The existing BuildInfo may have been modified. Be careful not to overly trust its contents!
+ return Platform::VersionCheck(this_build_info, next_build_info);
+}
+
TodoList ComputeActionsToDo(Manifest this_manifest, Manifest next_manifest)
{
TodoList todo;
@@ -474,6 +510,11 @@ bool PerformUpdate(const TodoList& todo, const std::string& install_base_path,
return false;
fprintf(log_fp, "Download step completed.\n");
+ fprintf(log_fp, "Starting platform version check step...\n");
+ if (!PlatformVersionCheck(todo.to_update, install_base_path, temp_path))
+ return false;
+ fprintf(log_fp, "Platform version check step completed.\n");
+
fprintf(log_fp, "Starting update step...\n");
if (!UpdateFiles(todo.to_update, install_base_path, temp_path))
return false;