| // 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_SAMBA_INTERFACE_IMPL_H_ |
| #define SMBFS_SAMBA_INTERFACE_IMPL_H_ |
| |
| #include <libsmbclient.h> |
| #include <sys/stat.h> |
| #include <sys/types.h> |
| |
| #include <memory> |
| #include <string> |
| |
| #include <base/memory/weak_ptr.h> |
| #include <base/synchronization/lock.h> |
| #include <gtest/gtest_prod.h> |
| |
| #include "smbfs/samba_interface.h" |
| #include "smbfs/smb_credential.h" |
| |
| namespace smbfs { |
| |
| class SambaInterfaceImpl : public SambaInterface { |
| public: |
| SambaInterfaceImpl(std::unique_ptr<SmbCredential> credentials, |
| bool allow_ntlm); |
| ~SambaInterfaceImpl() override; |
| |
| SambaInterfaceImpl(const SambaInterfaceImpl&) = delete; |
| SambaInterfaceImpl& operator=(const SambaInterfaceImpl&) = delete; |
| |
| // SambaInterface overrides. |
| WeakPtr AsWeakPtr() override; |
| |
| void UpdateCredentials(std::unique_ptr<SmbCredential> credentials) override; |
| |
| int StatVfs(const std::string& path, struct statvfs* out_statvfs) override; |
| |
| int OpenFile(const std::string& file_path, |
| int flags, |
| mode_t mode, |
| SMBCFILE** out_file) override; |
| int CloseFile(SMBCFILE* file) override; |
| int SeekFile(SMBCFILE* file, off_t offset, int whence) override; |
| int ReadFile(SMBCFILE* file, |
| void* buf, |
| size_t count, |
| size_t* out_bytes_read) override; |
| int WriteFile(SMBCFILE* file, |
| const void* buf, |
| size_t count, |
| size_t* out_bytes_written) override; |
| int TruncateFile(SMBCFILE* file, off_t size) override; |
| int Stat(const std::string& path, struct stat* out_stat) override; |
| int SetUtimes(const std::string& path, |
| const struct timespec& atime, |
| const struct timespec& mtime) override; |
| int Rename(const std::string& old_path, const std::string& new_path) override; |
| int UnlinkFile(const std::string& file_path) override; |
| |
| int CreateDirectory(const std::string& dir_path, mode_t mode) override; |
| int OpenDirectory(const std::string& dir_path, SMBCFILE** out_dir) override; |
| int CloseDirectory(SMBCFILE* dir) override; |
| int SeekDirectory(SMBCFILE* dir, off_t offset) override; |
| int TellDirectory(SMBCFILE* dir, off_t* out_offset) override; |
| int ReadDirectory(SMBCFILE* dir, |
| const struct libsmb_file_info** out_file_info, |
| struct stat* out_stat) override; |
| int RemoveDirectory(const std::string& dir_path) override; |
| |
| protected: |
| // Protected constructor for unit test subclasses. |
| SambaInterfaceImpl(); |
| |
| private: |
| FRIEND_TEST(SambaInterfaceImplTest, MakeStatModeBitsFromDOSAttributes); |
| FRIEND_TEST(SambaInterfaceImplTest, UpdateCredentials); |
| |
| // Callback function for obtaining authentication credentials. Set by calling |
| // smbc_setFunctionAuthDataWithContext() and called from libsmbclient. |
| static void GetUserAuth(SMBCCTX* context, |
| const char* server, |
| const char* share, |
| char* workgroup, |
| int workgroup_len, |
| char* username, |
| int username_len, |
| char* password, |
| int password_len); |
| |
| // Constructs mode (type and permission) bits for stat from DOS attributes. |
| mode_t MakeStatModeBitsFromDOSAttributes(uint16_t attrs) const; |
| |
| mutable base::Lock lock_; |
| std::unique_ptr<SmbCredential> credentials_; |
| |
| SMBCCTX* context_ = nullptr; |
| |
| smbc_close_fn smbc_close_ctx_ = nullptr; |
| smbc_closedir_fn smbc_closedir_ctx_ = nullptr; |
| smbc_ftruncate_fn smbc_ftruncate_ctx_ = nullptr; |
| smbc_lseek_fn smbc_lseek_ctx_ = nullptr; |
| smbc_lseekdir_fn smbc_lseekdir_ctx_ = nullptr; |
| smbc_mkdir_fn smbc_mkdir_ctx_ = nullptr; |
| smbc_open_fn smbc_open_ctx_ = nullptr; |
| smbc_opendir_fn smbc_opendir_ctx_ = nullptr; |
| smbc_read_fn smbc_read_ctx_ = nullptr; |
| // TODO(crbug.com/1054711): This should be swapped out for |
| // smbc_readdirplus2_fn when Samba is updated to 4.12. |
| smbc_readdirplus_fn smbc_readdirplus_ctx_ = nullptr; |
| smbc_rename_fn smbc_rename_ctx_ = nullptr; |
| smbc_rmdir_fn smbc_rmdir_ctx_ = nullptr; |
| smbc_stat_fn smbc_stat_ctx_ = nullptr; |
| smbc_statvfs_fn smbc_statvfs_ctx_ = nullptr; |
| smbc_telldir_fn smbc_telldir_ctx_ = nullptr; |
| smbc_unlink_fn smbc_unlink_ctx_ = nullptr; |
| smbc_utimes_fn smbc_utimes_ctx_ = nullptr; |
| smbc_write_fn smbc_write_ctx_ = nullptr; |
| |
| // Should be the last member. |
| base::WeakPtrFactory<SambaInterfaceImpl> weak_factory_{this}; |
| }; |
| |
| } // namespace smbfs |
| |
| #endif // SMBFS_SAMBA_INTERFACE_IMPL_H_ |