blob: 77f92867932855c690cc672a9af3cd08f1476404 [file]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_SERVICES_FILE_UTIL_SAFE_ARCHIVE_ANALYZER_H_
#define CHROME_SERVICES_FILE_UTIL_SAFE_ARCHIVE_ANALYZER_H_
#include <optional>
#include "chrome/common/safe_browsing/archive_analyzer_results.h"
#include "chrome/services/file_util/public/mojom/safe_archive_analyzer.mojom.h"
#include "chrome/utility/safe_browsing/rar_analyzer.h"
#include "chrome/utility/safe_browsing/seven_zip_analyzer.h"
#include "chrome/utility/safe_browsing/zip_analyzer.h"
#include "mojo/public/cpp/bindings/remote.h"
#if BUILDFLAG(IS_MAC)
#include "chrome/utility/safe_browsing/mac/dmg_analyzer.h"
#endif
namespace base {
class File;
}
using AnalysisFinishedCallback = base::OnceCallback<void()>;
using GetTempFileCallback = base::OnceCallback<void(base::File)>;
class SafeArchiveAnalyzer : public chrome::mojom::SafeArchiveAnalyzer {
public:
SafeArchiveAnalyzer();
SafeArchiveAnalyzer(const SafeArchiveAnalyzer&) = delete;
SafeArchiveAnalyzer& operator=(const SafeArchiveAnalyzer&) = delete;
~SafeArchiveAnalyzer() override;
private:
// chrome::mojom::SafeArchiveAnalyzer:
void AnalyzeZipFile(
base::File zip_file,
const std::optional<std::string>& password,
mojo::PendingRemote<chrome::mojom::TemporaryFileGetter> temp_file_getter,
AnalyzeZipFileCallback callback) override;
void AnalyzeDmgFile(
base::File dmg_file,
mojo::PendingRemote<chrome::mojom::TemporaryFileGetter> temp_file_getter,
AnalyzeDmgFileCallback callback) override;
void AnalyzeRarFile(
base::File rar_file,
const std::optional<std::string>& password,
mojo::PendingRemote<chrome::mojom::TemporaryFileGetter> temp_file_getter,
AnalyzeRarFileCallback callback) override;
void AnalyzeSevenZipFile(
base::File seven_zip_file,
mojo::PendingRemote<chrome::mojom::TemporaryFileGetter> temp_file_getter,
AnalyzeSevenZipFileCallback callback) override;
// Uses `temp_file_getter_` to supply a temporary file to callback.
void RequestTemporaryFile(GetTempFileCallback callback);
// Evokes the main callback to tell the browser process that the
// archive is finished downloading. Takes a FilePath to match the nested
// analyzer functions.
void AnalysisFinished(base::FilePath path);
// A timeout to ensure the SafeArchiveAnalyzer does not take too much time.
void Timeout();
safe_browsing::ZipAnalyzer zip_analyzer_;
safe_browsing::RarAnalyzer rar_analyzer_;
safe_browsing::SevenZipAnalyzer seven_zip_analyzer_;
#if BUILDFLAG(IS_MAC)
safe_browsing::dmg::DMGAnalyzer dmg_analyzer_;
#endif
// A timer to ensure no archive takes too long to unpack.
base::OneShotTimer timeout_timer_;
base::OnceCallback<void(const safe_browsing::ArchiveAnalyzerResults&)>
callback_;
safe_browsing::ArchiveAnalyzerResults results_;
mojo::Remote<chrome::mojom::TemporaryFileGetter> temp_file_getter_;
base::WeakPtrFactory<SafeArchiveAnalyzer> weak_factory_{this};
};
#endif // CHROME_SERVICES_FILE_UTIL_SAFE_ARCHIVE_ANALYZER_H_