2014-10-31 18:17:05 +00:00
|
|
|
// Copyright (c) 2014 GitHub, Inc.
|
2014-09-25 08:56:50 +00:00
|
|
|
// Use of this source code is governed by the MIT license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
2019-06-19 20:46:59 +00:00
|
|
|
#include "shell/common/asar/scoped_temporary_file.h"
|
2014-09-25 08:56:50 +00:00
|
|
|
|
2014-09-25 15:25:17 +00:00
|
|
|
#include <vector>
|
|
|
|
|
2015-01-10 01:45:50 +00:00
|
|
|
#include "base/files/file_util.h"
|
2021-09-09 21:49:01 +00:00
|
|
|
#include "base/logging.h"
|
|
|
|
#include "shell/common/asar/asar_util.h"
|
2022-11-17 19:59:23 +00:00
|
|
|
#include "shell/common/thread_restrictions.h"
|
2014-09-25 08:56:50 +00:00
|
|
|
|
|
|
|
namespace asar {
|
|
|
|
|
2019-09-16 22:12:00 +00:00
|
|
|
ScopedTemporaryFile::ScopedTemporaryFile() = default;
|
2014-09-25 08:56:50 +00:00
|
|
|
|
|
|
|
ScopedTemporaryFile::~ScopedTemporaryFile() {
|
|
|
|
if (!path_.empty()) {
|
2022-11-17 19:59:23 +00:00
|
|
|
electron::ScopedAllowBlockingForElectron allow_blocking;
|
2015-02-03 01:03:52 +00:00
|
|
|
// On Windows it is very likely the file is already in use (because it is
|
|
|
|
// mostly used for Node native modules), so deleting it now will halt the
|
|
|
|
// program.
|
2022-02-10 02:58:52 +00:00
|
|
|
#if BUILDFLAG(IS_WIN)
|
2015-02-03 01:03:52 +00:00
|
|
|
base::DeleteFileAfterReboot(path_);
|
2015-02-03 00:09:35 +00:00
|
|
|
#else
|
2020-08-12 18:33:58 +00:00
|
|
|
base::DeleteFile(path_);
|
2015-02-03 00:09:35 +00:00
|
|
|
#endif
|
2014-09-25 08:56:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-02 03:04:47 +00:00
|
|
|
bool ScopedTemporaryFile::Init(const base::FilePath::StringType& ext) {
|
2014-09-25 08:56:50 +00:00
|
|
|
if (!path_.empty())
|
|
|
|
return true;
|
|
|
|
|
2022-11-17 19:59:23 +00:00
|
|
|
electron::ScopedAllowBlockingForElectron allow_blocking;
|
2015-12-02 03:36:29 +00:00
|
|
|
if (!base::CreateTemporaryFile(&path_))
|
2015-12-01 15:57:32 +00:00
|
|
|
return false;
|
|
|
|
|
2022-02-10 02:58:52 +00:00
|
|
|
#if BUILDFLAG(IS_WIN)
|
2015-12-02 03:04:47 +00:00
|
|
|
// Keep the original extension.
|
2015-12-02 03:36:29 +00:00
|
|
|
if (!ext.empty()) {
|
|
|
|
base::FilePath new_path = path_.AddExtension(ext);
|
|
|
|
if (!base::Move(path_, new_path))
|
|
|
|
return false;
|
|
|
|
path_ = new_path;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return true;
|
2014-09-25 08:56:50 +00:00
|
|
|
}
|
|
|
|
|
2021-09-09 21:49:01 +00:00
|
|
|
bool ScopedTemporaryFile::InitFromFile(
|
|
|
|
base::File* src,
|
|
|
|
const base::FilePath::StringType& ext,
|
|
|
|
uint64_t offset,
|
|
|
|
uint64_t size,
|
2024-01-10 22:23:35 +00:00
|
|
|
const std::optional<IntegrityPayload>& integrity) {
|
2021-03-15 18:42:54 +00:00
|
|
|
if (!src->IsValid())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (!Init(ext))
|
|
|
|
return false;
|
|
|
|
|
2022-11-17 19:59:23 +00:00
|
|
|
electron::ScopedAllowBlockingForElectron allow_blocking;
|
2021-03-15 18:42:54 +00:00
|
|
|
std::vector<char> buf(size);
|
|
|
|
int len = src->Read(offset, buf.data(), buf.size());
|
|
|
|
if (len != static_cast<int>(size))
|
|
|
|
return false;
|
|
|
|
|
2021-09-09 21:49:01 +00:00
|
|
|
if (integrity.has_value()) {
|
|
|
|
ValidateIntegrityOrDie(buf.data(), buf.size(), integrity.value());
|
|
|
|
}
|
|
|
|
|
2021-03-15 18:42:54 +00:00
|
|
|
base::File dest(path_, base::File::FLAG_OPEN | base::File::FLAG_WRITE);
|
|
|
|
if (!dest.IsValid())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return dest.WriteAtCurrentPos(buf.data(), buf.size()) ==
|
|
|
|
static_cast<int>(size);
|
|
|
|
}
|
|
|
|
|
2014-09-25 08:56:50 +00:00
|
|
|
} // namespace asar
|