summaryrefslogtreecommitdiff
path: root/netfs/fuse
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
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')
-rw-r--r--netfs/fuse/fuseMappers.ice7
-rw-r--r--netfs/fuse/fuseMappersImpl.cpp42
-rw-r--r--netfs/fuse/fuseMappersImpl.h14
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;
+ };
}
}