// Copyright 2020 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 SMBFS_MOJO_SESSION_H_
#define SMBFS_MOJO_SESSION_H_

#include <fuse_lowlevel.h>
#include <sys/types.h>

#include <memory>
#include <string>

#include <base/callback.h>
#include <base/macros.h>
#include <base/files/file_path.h>
#include <dbus/bus.h>

#include "smbfs/smb_filesystem.h"
#include "smbfs/smbfs_bootstrap_impl.h"

namespace smbfs {

class FuseSession;
class KerberosArtifactSynchronizer;
class SmbFsImpl;
struct Options;

// MojoSession maintains the state of a SMB filesystem initialised over a Mojo
// IPC connection. It is responsible for responding to the setup request (via
// a mojom::SmbFsBootstrap implementation), synchronising with Kerberos,
// owning/running the FUSE session, and owning the Mojo interfaces to the
// browser.
class MojoSession : public SmbFsBootstrapImpl::Delegate,
                    public SmbFilesystem::Delegate {
 public:
  MojoSession(scoped_refptr<dbus::Bus> bus,
              const base::FilePath& temp_dir,
              fuse_chan* chan,
              mojom::SmbFsBootstrapRequest bootstrap_request,
              uid_t uid,
              gid_t gid,
              base::OnceClosure shutdown_callback);
  MojoSession(const MojoSession&) = delete;
  MojoSession& operator=(const MojoSession&) = delete;

  virtual ~MojoSession();

 private:
  // SmbFsBootstrapImpl::Delegate overrides.
  void SetupKerberos(mojom::KerberosConfigPtr kerberos_config,
                     base::OnceCallback<void(bool success)> callback) override;
  void OnPasswordFilePathSet(const base::FilePath& path) override;

  // SmbFilesystem::Delegate overrides.
  void RequestCredentials(RequestCredentialsCallback callback) override;

  // Callback for mojom::SmbFsDelegate::RequestCredentials().
  void OnRequestCredentialsDone(RequestCredentialsCallback callback,
                                mojom::CredentialsPtr credentials);

  // Returns the full path to the given kerberos configuration file.
  base::FilePath KerberosConfFilePath(const std::string& file_name);

  // Callback for SmbFsBootstrapImpl::Start().
  void OnBootstrapComplete(std::unique_ptr<SmbFilesystem> fs,
                           mojom::SmbFsRequest smbfs_request,
                           mojom::SmbFsDelegatePtr delegate_ptr);

  // Factory function for creating an SmbFilesystem.
  std::unique_ptr<SmbFilesystem> CreateSmbFilesystem(
      SmbFilesystem::Options options);

  // Runs |shutdown_callback_|.
  void DoShutdown();

  scoped_refptr<dbus::Bus> const bus_;
  const base::FilePath temp_dir_;
  fuse_chan* chan_;
  const uid_t uid_;
  const gid_t gid_;
  base::OnceClosure shutdown_callback_;
  std::unique_ptr<SmbFsBootstrapImpl> bootstrap_impl_;

  base::FilePath password_file_path_;
  std::unique_ptr<FuseSession> fuse_session_;
  std::unique_ptr<KerberosArtifactSynchronizer> kerberos_sync_;
  std::unique_ptr<SmbFsImpl> smbfs_impl_;
  mojom::SmbFsDelegatePtr smbfs_delegate_;
};

}  // namespace smbfs

#endif  // SMBFS_MOJO_SESSION_H_
