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 | |
parent | Test the hiding mapper (diff) | |
download | netfs-777724a09ba4000ec077154b4f13c77d8c875d63.tar.bz2 netfs-777724a09ba4000ec077154b4f13c77d8c875d63.tar.xz netfs-777724a09ba4000ec077154b4f13c77d8c875d63.zip |
Add the MaskUnknown mapper
-rw-r--r-- | netfs/fuse/fuseMappers.ice | 7 | ||||
-rw-r--r-- | netfs/fuse/fuseMappersImpl.cpp | 42 | ||||
-rw-r--r-- | netfs/fuse/fuseMappersImpl.h | 14 | ||||
-rw-r--r-- | netfs/unittests/testLib.cpp | 42 |
4 files changed, 105 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; + }; } } diff --git a/netfs/unittests/testLib.cpp b/netfs/unittests/testLib.cpp index 29167c4..c99f582 100644 --- a/netfs/unittests/testLib.cpp +++ b/netfs/unittests/testLib.cpp @@ -155,3 +155,45 @@ BOOST_AUTO_TEST_CASE(bad_mapfilesystem) } BOOST_AUTO_TEST_SUITE_END(); + +BOOST_FIXTURE_TEST_SUITE(mm, NetFS::Client::MaskUnknownMapperImpl); + +BOOST_AUTO_TEST_CASE(good_maptransport) +{ + auto fs = mapTransport("root", "root"); + BOOST_CHECK_EQUAL(0, fs.uid); + BOOST_CHECK_EQUAL(0, fs.gid); + BOOST_CHECK_EQUAL(0, fs.mask); +} + +BOOST_AUTO_TEST_CASE(good_mapfs) +{ + auto tn = mapFileSystem(0, 0); + BOOST_CHECK_EQUAL("root", tn.username); + BOOST_CHECK_EQUAL("root", tn.groupname); +} + +BOOST_AUTO_TEST_CASE(bad_maptransport) +{ + BOOST_CHECK_EQUAL(mapTransport("root", "").mask, 0070); + BOOST_CHECK_EQUAL(mapTransport("", "root").mask, 0700); + BOOST_CHECK_EQUAL(mapTransport("", "").mask, 0770); +} + +BOOST_AUTO_TEST_CASE(bad_maptransport_badfallback) +{ + UnknownUser = "not existing"; + UnknownGroup = "not existing"; + BOOST_REQUIRE_THROW(mapTransport("root", ""), NetFS::SystemError); + BOOST_REQUIRE_THROW(mapTransport("", "root"), NetFS::SystemError); + BOOST_REQUIRE_THROW(mapTransport("", ""), NetFS::SystemError); +} + +BOOST_AUTO_TEST_CASE(bad_mapfilesystem) +{ + BOOST_REQUIRE_THROW(mapFileSystem(0, -1), NetFS::SystemError); + BOOST_REQUIRE_THROW(mapFileSystem(-1, 0), NetFS::SystemError); + BOOST_REQUIRE_THROW(mapFileSystem(-1, -1), NetFS::SystemError); +} + +BOOST_AUTO_TEST_SUITE_END(); |