123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- // Copyright 2019 The Chromium 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 ASH_COMPONENTS_SMBFS_SMBFS_MOUNTER_H_
- #define ASH_COMPONENTS_SMBFS_SMBFS_MOUNTER_H_
- #include <memory>
- #include <string>
- #include <vector>
- #include "ash/components/disks/disk_mount_manager.h"
- #include "ash/components/disks/mount_point.h"
- #include "ash/components/smbfs/mojom/smbfs.mojom.h"
- #include "ash/components/smbfs/smbfs_host.h"
- #include "base/callback.h"
- #include "base/component_export.h"
- #include "base/files/scoped_file.h"
- #include "base/memory/weak_ptr.h"
- #include "base/timer/timer.h"
- #include "base/unguessable_token.h"
- #include "mojo/public/cpp/bindings/remote.h"
- #include "mojo/public/cpp/system/invitation.h"
- #include "net/base/ip_address.h"
- #include "third_party/abseil-cpp/absl/types/optional.h"
- namespace smbfs {
- // SmbFsMounter is a helper class that is used to mount an instance of smbfs. It
- // performs all the actions necessary to start smbfs and initiate a connection
- // to the SMB server.
- class COMPONENT_EXPORT(SMBFS) SmbFsMounter {
- public:
- using DoneCallback =
- base::OnceCallback<void(mojom::MountError, std::unique_ptr<SmbFsHost>)>;
- struct KerberosOptions {
- using Source = mojom::KerberosConfig::Source;
- KerberosOptions(Source source, const std::string& identity);
- ~KerberosOptions();
- // Don't allow an invalid options struct to be created.
- KerberosOptions() = delete;
- Source source;
- std::string identity;
- };
- struct MountOptions {
- MountOptions();
- MountOptions(const MountOptions&);
- ~MountOptions();
- // Resolved IP address for share's hostname.
- net::IPAddress resolved_host;
- // Authentication options.
- std::string username;
- std::string workgroup;
- std::string password;
- absl::optional<KerberosOptions> kerberos_options;
- // Allow NTLM authentication to be used.
- bool allow_ntlm = false;
- // Skip attempting to connect to the share.
- bool skip_connect = false;
- // Have smbfs save/restore the share's password.
- bool save_restore_password = false;
- std::string account_hash;
- std::vector<uint8_t> password_salt;
- };
- SmbFsMounter(const std::string& share_path,
- const std::string& mount_dir_name,
- const MountOptions& options,
- SmbFsHost::Delegate* delegate,
- ash::disks::DiskMountManager* disk_mount_manager);
- SmbFsMounter(const SmbFsMounter&) = delete;
- SmbFsMounter& operator=(const SmbFsMounter&) = delete;
- virtual ~SmbFsMounter();
- // Initiate the filesystem mount request, and run |callback| when completed.
- // |callback| is guaranteed not to run after |this| is destroyed.
- // Must only be called once. Virtual for testing.
- virtual void Mount(DoneCallback callback);
- protected:
- // Additional constructors for tests.
- SmbFsMounter();
- SmbFsMounter(const std::string& share_path,
- const std::string& mount_dir_name,
- const MountOptions& options,
- SmbFsHost::Delegate* delegate,
- ash::disks::DiskMountManager* disk_mount_manager,
- mojo::Remote<mojom::SmbFsBootstrap> bootstrap);
- private:
- // Callback for MountPoint::Mount().
- void OnMountDone(ash::MountError error_code,
- std::unique_ptr<ash::disks::MountPoint> mount_point);
- // Callback for receiving a Mojo bootstrap channel.
- void OnIpcChannel(base::ScopedFD mojo_fd);
- // Callback for bootstrap Mojo MountShare() method.
- void OnMountShare(
- mojo::PendingReceiver<mojom::SmbFsDelegate> delegate_receiver,
- mojom::MountError mount_error,
- mojo::PendingRemote<mojom::SmbFs> smbfs);
- // Mojo disconnection handler.
- void OnMojoDisconnect();
- // Mount timeout handler.
- void OnMountTimeout();
- // Perform cleanup and run |callback_| with |mount_error|.
- void ProcessMountError(mojom::MountError mount_error);
- const std::string share_path_;
- const std::string mount_dir_name_;
- const MountOptions options_;
- SmbFsHost::Delegate* const delegate_;
- ash::disks::DiskMountManager* const disk_mount_manager_;
- const base::UnguessableToken token_;
- const std::string mount_url_;
- bool mojo_fd_pending_ = false;
- base::OneShotTimer mount_timer_;
- DoneCallback callback_;
- std::unique_ptr<ash::disks::MountPoint> mount_point_;
- mojo::OutgoingInvitation bootstrap_invitation_;
- mojo::Remote<mojom::SmbFsBootstrap> bootstrap_;
- base::WeakPtrFactory<SmbFsMounter> weak_factory_{this};
- };
- } // namespace smbfs
- #endif // ASH_COMPONENTS_SMBFS_SMBFS_MOUNTER_H_
|