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

#ifndef CROS_DISKS_FUSE_HELPER_H_
#define CROS_DISKS_FUSE_HELPER_H_

#include <memory>
#include <string>
#include <vector>

#include <base/files/file_path.h>
#include <base/macros.h>
#include <chromeos/dbus/service_constants.h>
#include <gtest/gtest_prod.h>

namespace cros_disks {

class FUSEMounter;
class MountOptions;
class Platform;
class Uri;

// Base class to simplify calling of individual mounters based on
// specific conventions for a particular userspace FUSE implementation.
class FUSEHelper {
 public:
  // OS user that will access files provided by this module.
  static const char kFilesUser[];

  // OS group that will access files provided by this module.
  static const char kFilesGroup[];

  // FUSE kernel-level option allowing access to the mount by UIDs different
  // from the one that FUSE helper is being run. Relevant if FUSE helper is
  // being run in a sandbox under different UID.
  static const char kOptionAllowOther[];

  // Enable permission checking by the kernel instead of FUSE helper itself.
  static const char kOptionDefaultPermissions[];

  FUSEHelper(const std::string& fuse_type,
             const Platform* platform,
             const base::FilePath& mount_program_path,
             const std::string& mount_user);
  virtual ~FUSEHelper();

  const std::string& type() const { return fuse_type_; }
  const std::string& user() const { return mount_user_; }
  const Platform* platform() const { return platform_; }
  const base::FilePath& program_path() const { return mount_program_path_; }

  // Whether this helper is able to handle this kind of source.
  // Default implementation just compares scheme of the URI with FUSE type
  // and checks that there is some path in the URI.
  virtual bool CanMount(const Uri& source) const;

  // Derives suggested directory name for the mount point from the source.
  // Default implementation takes path part of the URI and escapes path
  // characters..
  virtual std::string GetTargetSuffix(const Uri& source) const;

  // Does preprocessing and conversion of options and source format to be
  // compatible with the FUSE mount program, and returns resulting Mounter.
  // |working_dir| is a temporary writable directory that may be used by
  // this invocation of the mounter process.
  virtual std::unique_ptr<FUSEMounter> CreateMounter(
      const base::FilePath& working_dir,
      const Uri& source,
      const base::FilePath& target_path,
      const std::vector<std::string>& options) const;

 private:
  const std::string fuse_type_;
  const Platform* const platform_;
  const base::FilePath mount_program_path_;
  const std::string mount_user_;

  DISALLOW_COPY_AND_ASSIGN(FUSEHelper);
};

}  // namespace cros_disks

#endif  // CROS_DISKS_FUSE_HELPER_H_
