2021-05-13 06:37:05 +00:00
|
|
|
#pragma once
|
|
|
|
|
2021-05-18 20:48:16 +00:00
|
|
|
#if USE_SSL
|
|
|
|
|
2021-05-13 06:37:05 +00:00
|
|
|
#include <Disks/IDisk.h>
|
2021-05-17 16:58:51 +00:00
|
|
|
#include <Disks/DiskDecorator.h>
|
2021-05-13 06:37:05 +00:00
|
|
|
#include <IO/ReadBufferFromFileBase.h>
|
2021-05-14 21:52:51 +00:00
|
|
|
#include <IO/WriteBufferFromFileBase.h>
|
2021-05-13 06:37:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
namespace ErrorCodes
|
|
|
|
{
|
|
|
|
extern const int LOGICAL_ERROR;
|
|
|
|
}
|
|
|
|
|
2021-05-14 21:52:51 +00:00
|
|
|
class DiskEncrypted : public DiskDecorator
|
2021-05-13 06:37:05 +00:00
|
|
|
{
|
|
|
|
public:
|
2021-05-13 16:21:45 +00:00
|
|
|
DiskEncrypted(const String & name_, DiskPtr disk_, const String & key_, const String & path_)
|
2021-05-14 21:52:51 +00:00
|
|
|
: DiskDecorator(disk_)
|
|
|
|
, name(name_), key(key_), disk_path(path_)
|
|
|
|
, disk_absolute_path(delegate->getPath() + disk_path)
|
2021-05-13 06:37:05 +00:00
|
|
|
{
|
2021-05-14 21:52:51 +00:00
|
|
|
initialize();
|
2021-05-13 06:37:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const String & getName() const override { return name; }
|
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
const String & getPath() const override { return disk_absolute_path; }
|
2021-05-13 06:37:05 +00:00
|
|
|
|
|
|
|
ReservationPtr reserve(UInt64 bytes) override;
|
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
bool exists(const String & path) const override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
return delegate->exists(wrapped_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool isFile(const String & path) const override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
return delegate->isFile(wrapped_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
bool isDirectory(const String & path) const override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
return delegate->isDirectory(wrapped_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-14 21:52:51 +00:00
|
|
|
size_t getFileSize(const String & path) const override;
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void createDirectory(const String & path) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->createDirectory(wrapped_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void createDirectories(const String & path) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->createDirectories(wrapped_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void clearDirectory(const String & path) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->clearDirectory(wrapped_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void moveDirectory(const String & from_path, const String & to_path) override
|
|
|
|
{
|
|
|
|
auto wrapped_from_path = wrappedPath(from_path);
|
|
|
|
auto wrapped_to_path = wrappedPath(to_path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->moveDirectory(wrapped_from_path, wrapped_to_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
DiskDirectoryIteratorPtr iterateDirectory(const String & path) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
return delegate->iterateDirectory(wrapped_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-19 22:06:25 +00:00
|
|
|
void createFile(const String & path) override
|
|
|
|
{
|
2021-05-13 16:21:45 +00:00
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->createFile(wrapped_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void moveFile(const String & from_path, const String & to_path) override
|
|
|
|
{
|
|
|
|
auto wrapped_from_path = wrappedPath(from_path);
|
|
|
|
auto wrapped_to_path = wrappedPath(to_path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->moveFile(wrapped_from_path, wrapped_to_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void replaceFile(const String & from_path, const String & to_path) override
|
|
|
|
{
|
|
|
|
auto wrapped_from_path = wrappedPath(from_path);
|
|
|
|
auto wrapped_to_path = wrappedPath(to_path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->replaceFile(wrapped_from_path, wrapped_to_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void listFiles(const String & path, std::vector<String> & file_names) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->listFiles(wrapped_path, file_names);
|
|
|
|
}
|
|
|
|
|
|
|
|
void copy(const String & from_path, const std::shared_ptr<IDisk> & to_disk, const String & to_path) override
|
|
|
|
{
|
2021-05-18 20:20:51 +00:00
|
|
|
IDisk::copy(from_path, to_disk, to_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
|
|
|
std::unique_ptr<ReadBufferFromFileBase> readFile(
|
|
|
|
const String & path,
|
|
|
|
size_t buf_size,
|
|
|
|
size_t estimated_size,
|
|
|
|
size_t aio_threshold,
|
|
|
|
size_t mmap_threshold,
|
|
|
|
MMappedFileCache * mmap_cache) const override;
|
|
|
|
|
|
|
|
std::unique_ptr<WriteBufferFromFileBase> writeFile(
|
|
|
|
const String & path,
|
|
|
|
size_t buf_size,
|
|
|
|
WriteMode mode) override;
|
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void removeFile(const String & path) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->removeFile(wrapped_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void removeFileIfExists(const String & path) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->removeFileIfExists(wrapped_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void removeDirectory(const String & path) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->removeDirectory(wrapped_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void removeRecursive(const String & path) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->removeRecursive(wrapped_path);
|
|
|
|
}
|
|
|
|
|
|
|
|
void removeSharedFile(const String & path, bool flag) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
|
|
|
delegate->removeSharedFile(wrapped_path, flag);
|
|
|
|
}
|
|
|
|
|
|
|
|
void removeSharedRecursive(const String & path, bool flag) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
|
|
|
delegate->removeSharedRecursive(wrapped_path, flag);
|
|
|
|
}
|
|
|
|
|
|
|
|
void removeSharedFileIfExists(const String & path, bool flag) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
|
|
|
delegate->removeSharedFileIfExists(wrapped_path, flag);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void setLastModified(const String & path, const Poco::Timestamp & timestamp) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->setLastModified(wrapped_path, timestamp);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
Poco::Timestamp getLastModified(const String & path) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
return delegate->getLastModified(wrapped_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void setReadOnly(const String & path) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->setReadOnly(wrapped_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
2021-05-13 16:21:45 +00:00
|
|
|
void createHardLink(const String & src_path, const String & dst_path) override
|
|
|
|
{
|
|
|
|
auto wrapped_src_path = wrappedPath(src_path);
|
|
|
|
auto wrapped_dst_path = wrappedPath(dst_path);
|
2021-05-14 21:52:51 +00:00
|
|
|
delegate->createHardLink(wrapped_src_path, wrapped_dst_path);
|
2021-05-13 16:21:45 +00:00
|
|
|
}
|
2021-05-13 06:37:05 +00:00
|
|
|
|
|
|
|
void truncateFile(const String & path, size_t size) override;
|
|
|
|
|
2021-05-14 21:52:51 +00:00
|
|
|
String getUniqueId(const String & path) const override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
|
|
|
return delegate->getUniqueId(wrapped_path);
|
|
|
|
}
|
|
|
|
|
|
|
|
void onFreeze(const String & path) override
|
|
|
|
{
|
|
|
|
auto wrapped_path = wrappedPath(path);
|
2021-05-18 20:20:51 +00:00
|
|
|
delegate->onFreeze(wrapped_path);
|
2021-05-14 21:52:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void applyNewSettings(const Poco::Util::AbstractConfiguration & config, ContextConstPtr context, const String & config_prefix, const DisksMap & map) override;
|
|
|
|
|
2021-05-13 06:37:05 +00:00
|
|
|
DiskType::Type getType() const override { return DiskType::Type::Encrypted; }
|
|
|
|
|
|
|
|
SyncGuardPtr getDirectorySyncGuard(const String & path) const override;
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
2021-05-14 21:52:51 +00:00
|
|
|
String wrappedPath(const String & path) const
|
|
|
|
{
|
|
|
|
// if path starts_with disk_path -> got already wrapped path
|
|
|
|
if (!disk_path.empty() && path.rfind(disk_path, 0) == 0)
|
|
|
|
return path;
|
|
|
|
return disk_path + path;
|
|
|
|
}
|
|
|
|
|
|
|
|
void initialize()
|
|
|
|
{
|
|
|
|
// use wrapped_disk as an EncryptedDisk store
|
|
|
|
if (disk_path.empty())
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (disk_path.back() != '/')
|
|
|
|
throw Exception("Disk path must ends with '/', but '" + disk_path + "' doesn't.", ErrorCodes::LOGICAL_ERROR);
|
|
|
|
|
2021-05-23 06:49:02 +00:00
|
|
|
delegate->createDirectories(disk_path);
|
2021-05-14 21:52:51 +00:00
|
|
|
}
|
2021-05-13 16:21:45 +00:00
|
|
|
|
2021-05-13 06:37:05 +00:00
|
|
|
String name;
|
|
|
|
String key;
|
2021-05-13 16:21:45 +00:00
|
|
|
String disk_path;
|
|
|
|
String disk_absolute_path;
|
2021-05-13 06:37:05 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
2021-05-18 20:48:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
#endif
|