// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef EXTENSIONS_BROWSER_JSON_FILE_SANITIZER_H_
#define EXTENSIONS_BROWSER_JSON_FILE_SANITIZER_H_

#include <memory>
#include <set>
#include <string>
#include <tuple>

#include "base/files/file_path.h"
#include "base/memory/weak_ptr.h"
#include "base/task/sequenced_task_runner.h"
#include "base/values.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/data_decoder/public/mojom/json_parser.mojom.h"
#include "third_party/abseil-cpp/absl/types/optional.h"

namespace data_decoder {
class DataDecoder;
}

namespace extensions {

// This class takes potentially unsafe JSON files, decodes them in a sandboxed
// process, then reencodes them so that they can later be parsed safely from the
// browser process.
// Note that at this time it this is limited to JSON files that contain a
// unique dictionary as their root and will fail with a kDecodingError if that
// is not the case.
class JsonFileSanitizer {
 public:
  enum class Status {
    kSuccess = 0,
    kFileReadError,
    kFileDeleteError,
    kDecodingError,
    kSerializingError,
    kFileWriteError,
  };

  // Callback invoked when the JSON sanitization is is done. If status is an
  // error, |error_msg| contains the error message.
  using Callback =
      base::OnceCallback<void(Status status, const std::string& error_msg)>;

  // Creates a JsonFileSanitizer and starts the sanitization of the JSON files
  // in |file_paths|.
  // |decoder| should be a DataDecoder which can be used to talk to a Data
  // Decoder service instance. It must be live on the calling sequence and
  // it is not retained beyond the extent of this call.
  // |callback| is invoked asynchronously when all JSON files have been
  // sanitized or if an error occurred.
  // If the returned JsonFileSanitizer instance is deleted before |callback| was
  // invoked, then |callback| is never invoked and the sanitization stops
  // promptly (some background tasks may still run).
  static std::unique_ptr<JsonFileSanitizer> CreateAndStart(
      data_decoder::DataDecoder* decoder,
      const std::set<base::FilePath>& file_paths,
      Callback callback,
      const scoped_refptr<base::SequencedTaskRunner>& io_task_runner);

  JsonFileSanitizer(const JsonFileSanitizer&) = delete;
  JsonFileSanitizer& operator=(const JsonFileSanitizer&) = delete;

  ~JsonFileSanitizer();

 private:
  JsonFileSanitizer(
      const std::set<base::FilePath>& file_paths,
      Callback callback,
      const scoped_refptr<base::SequencedTaskRunner>& io_task_runner);

  void Start(data_decoder::DataDecoder* decoder);

  void JsonFileRead(const base::FilePath& file_path,
                    std::tuple<std::string, bool, bool> read_and_delete_result);

  void JsonParsingDone(const base::FilePath& file_path,
                       absl::optional<base::Value> json_value,
                       const absl::optional<std::string>& error);

  void JsonFileWritten(const base::FilePath& file_path,
                       int expected_size,
                       int actual_size);

  void ReportSuccess();

  void ReportError(Status status, const std::string& path);

  std::set<base::FilePath> file_paths_;
  Callback callback_;
  scoped_refptr<base::SequencedTaskRunner> io_task_runner_;
  mojo::Remote<data_decoder::mojom::JsonParser> json_parser_;
  base::WeakPtrFactory<JsonFileSanitizer> weak_factory_{this};
};

}  // namespace extensions

#endif  // EXTENSIONS_BROWSER_JSON_FILE_SANITIZER_H_
