blob: de5dfef5eaa542359c3b30458591f1dc7334fcc4 [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media_galleries/fileapi/av_scanning_file_validator.h"
#include <string>
#include "base/functional/callback.h"
#include "build/build_config.h"
#include "components/download/public/common/quarantine_connection.h"
#include "content/public/browser/browser_thread.h"
#if BUILDFLAG(IS_WIN)
#include "base/files/file_path.h"
#include "base/functional/bind.h"
#include "components/services/quarantine/public/mojom/quarantine.mojom.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "url/gurl.h"
#endif // BUILDFLAG(IS_WIN)
namespace {
#if BUILDFLAG(IS_WIN)
void OnFileQuarantined(AVScanningFileValidator::ResultCallback result_callback,
quarantine::mojom::QuarantineFileResult result) {
std::move(result_callback)
.Run(result == quarantine::mojom::QuarantineFileResult::OK
? base::File::FILE_OK
: base::File::FILE_ERROR_SECURITY);
}
void ScanFile(
const base::FilePath& dest_platform_path,
download::QuarantineConnectionCallback quarantine_connection_callback,
AVScanningFileValidator::ResultCallback result_callback) {
mojo::Remote<quarantine::mojom::Quarantine> quarantine_remote;
if (quarantine_connection_callback) {
quarantine_connection_callback.Run(
quarantine_remote.BindNewPipeAndPassReceiver());
}
if (quarantine_remote) {
quarantine_remote->QuarantineFile(
dest_platform_path, GURL(), GURL(), std::string(),
base::BindOnce(&OnFileQuarantined, std::move(result_callback)));
} else {
std::move(result_callback).Run(base::File::FILE_OK);
}
}
#endif // BUILDFLAG(IS_WIN)
} // namespace
AVScanningFileValidator::~AVScanningFileValidator() {}
void AVScanningFileValidator::StartPostWriteValidation(
const base::FilePath& dest_platform_path,
ResultCallback result_callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
#if BUILDFLAG(IS_WIN)
ScanFile(dest_platform_path, quarantine_connection_callback_,
std::move(result_callback));
#else
std::move(result_callback).Run(base::File::FILE_OK);
#endif
}
AVScanningFileValidator::AVScanningFileValidator(
download::QuarantineConnectionCallback quarantine_connection_callback)
: quarantine_connection_callback_(quarantine_connection_callback) {}