diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2020-09-20 15:53:29 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2020-09-20 15:53:29 +0100 |
commit | 777724a09ba4000ec077154b4f13c77d8c875d63 (patch) | |
tree | d3ca13f9aabf0fc01bd1fbdb4a4c07c2c88069c1 /netfs/fuse | |
parent | Test the hiding mapper (diff) | |
download | netfs-777724a09ba4000ec077154b4f13c77d8c875d63.tar.bz2 netfs-777724a09ba4000ec077154b4f13c77d8c875d63.tar.xz netfs-777724a09ba4000ec077154b4f13c77d8c875d63.zip |
Add the MaskUnknown mapper
Diffstat (limited to 'netfs/fuse')
-rw-r--r-- | netfs/fuse/fuseMappers.ice | 7 | ||||
-rw-r--r-- | netfs/fuse/fuseMappersImpl.cpp | 42 | ||||
-rw-r--r-- | netfs/fuse/fuseMappersImpl.h | 14 |
3 files changed, 63 insertions, 0 deletions
diff --git a/netfs/fuse/fuseMappers.ice b/netfs/fuse/fuseMappers.ice index 6945eec..582aa16 100644 --- a/netfs/fuse/fuseMappers.ice +++ b/netfs/fuse/fuseMappers.ice @@ -7,6 +7,13 @@ module NetFS { local class HideUnknownMapper extends Mapping::Mapper { }; + ["slicer:implementation:NetFS.Client.MaskUnknownMapperImpl"] + local class MaskUnknownMapper extends Mapping::Mapper { + string UnknownUser = "nobody"; + string UnknownGroup = "nogroup"; + int MaskUser = 0700; + int MaskGroup = 0070; + }; }; }; diff --git a/netfs/fuse/fuseMappersImpl.cpp b/netfs/fuse/fuseMappersImpl.cpp index d22f3a4..4aa2789 100644 --- a/netfs/fuse/fuseMappersImpl.cpp +++ b/netfs/fuse/fuseMappersImpl.cpp @@ -38,4 +38,46 @@ namespace NetFS::Client { } return {u->name, g->name, 0}; } + MaskUnknownMapperImpl::MaskUnknownMapperImpl() : MaskUnknownMapperImpl(std::make_shared<UserEntCache>()) { } + + MaskUnknownMapperImpl::MaskUnknownMapperImpl(EntryResolverPtr<User> u) : + MaskUnknownMapperImpl(std::move(u), std::make_shared<GroupEntCache>(u)) + { + } + + MaskUnknownMapperImpl::MaskUnknownMapperImpl(EntryResolverPtr<User> u, EntryResolverPtr<Group> g) : + users(std::move(u)), groups(std::move(g)) + { + } + + Mapping::FileSystem + MaskUnknownMapperImpl::mapTransport(const std::string & un, const std::string & gn) + { + int mask = 0; + auto apply = [&mask](const auto & resolver, const auto & entry, const auto & fallbackentry, auto entrymask) { + auto e = resolver->getEntry(entry); + if (!e) { + e = resolver->getEntry(fallbackentry); + if (!e) { + throw NetFS::SystemError(EPERM); + } + mask |= entrymask; + } + return e; + }; + auto u = apply(users, un, UnknownUser, MaskUser); + auto g = apply(groups, gn, UnknownGroup, MaskGroup); + return {static_cast<int>(u->id), static_cast<int>(g->id), mask}; + } + + Mapping::Transport + MaskUnknownMapperImpl::mapFileSystem(int uid, int gid) + { + auto u = users->getEntry(uid); + auto g = groups->getEntry(gid); + if (!u || !g) { + throw NetFS::SystemError(EPERM); + } + return {u->name, g->name, 0}; + } } diff --git a/netfs/fuse/fuseMappersImpl.h b/netfs/fuse/fuseMappersImpl.h index a0b1eb3..41d78b8 100644 --- a/netfs/fuse/fuseMappersImpl.h +++ b/netfs/fuse/fuseMappersImpl.h @@ -21,6 +21,20 @@ namespace NetFS { EntryResolverPtr<User> users; EntryResolverPtr<Group> groups; }; + + class DLL_PUBLIC MaskUnknownMapperImpl : public MaskUnknownMapper { + public: + MaskUnknownMapperImpl(); + MaskUnknownMapperImpl(EntryResolverPtr<User> u); + MaskUnknownMapperImpl(EntryResolverPtr<User> u, EntryResolverPtr<Group> g); + + Mapping::Transport mapFileSystem(int uid, int gid) override; + Mapping::FileSystem mapTransport(const std::string & un, const std::string & gn) override; + + protected: + EntryResolverPtr<User> users; + EntryResolverPtr<Group> groups; + }; } } |