summaryrefslogtreecommitdiff
path: root/netfs/fuse/fuseMappersImpl.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2020-09-20 15:53:29 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2020-09-20 15:53:29 +0100
commit777724a09ba4000ec077154b4f13c77d8c875d63 (patch)
treed3ca13f9aabf0fc01bd1fbdb4a4c07c2c88069c1 /netfs/fuse/fuseMappersImpl.cpp
parentTest the hiding mapper (diff)
downloadnetfs-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.cpp42
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};
+ }
}