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/fuseMappersImpl.cpp | |
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/fuseMappersImpl.cpp')
-rw-r--r-- | netfs/fuse/fuseMappersImpl.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
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}; + } } |