From: Sage Weil Date: Thu, 28 May 2015 04:33:07 +0000 (-0400) Subject: mds/MDSAuthCaps: parse optional gid list X-Git-Tag: v10.0.0~123^2~101 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1d82ec469e266f4a49893b974224efe5233c3101;p=ceph.git mds/MDSAuthCaps: parse optional gid list Signed-off-by: Sage Weil --- diff --git a/src/mds/MDSAuthCaps.cc b/src/mds/MDSAuthCaps.cc index a8eec5c3d5d..9aa65c5f436 100644 --- a/src/mds/MDSAuthCaps.cc +++ b/src/mds/MDSAuthCaps.cc @@ -52,12 +52,14 @@ struct MDSCapParser : qi::grammar lexeme[lit("'") >> *(char_ - '\'') >> '\'']; unquoted_path %= +char_("a-zA-Z0-9_.-/"); - // match := [path=] [uid=] - uid %= (spaces >> lit("uid") >> lit('=') >> int_); + // match := [path=] [uid= [gids=[,...]] path %= (spaces >> lit("path") >> lit('=') >> (quoted_path | unquoted_path)); + uid %= (spaces >> lit("uid") >> lit('=') >> int_); + intlist %= (int_ % lit(',')); + gidlist %= -(spaces >> lit("gids") >> lit('=') >> intlist); match = -( - (uid)[_val = phoenix::construct(_1)] | - (path >> uid)[_val = phoenix::construct(_1, _2)] | + (uid >> gidlist)[_val = phoenix::construct(_1, _2)] | + (path >> uid >> gidlist)[_val = phoenix::construct(_1, _2, _3)] | (path)[_val = phoenix::construct(_1)]); // capspec = * | r[w] @@ -78,6 +80,8 @@ struct MDSCapParser : qi::grammar qi::rule capspec; qi::rule path; qi::rule uid; + qi::rule() > intlist; + qi::rule() > gidlist; qi::rule match; qi::rule grant; qi::rule()> grants; @@ -160,11 +164,22 @@ ostream &operator<<(ostream &out, const MDSCapMatch &match) if (match.path != MDSCapMatch::MDS_AUTH_PATH_ROOT) { out << "path=\"" << match.path << "\""; } - if (match.path != MDSCapMatch::MDS_AUTH_PATH_ROOT && match.uid != MDSCapMatch::MDS_AUTH_UID_ANY) { + if (match.path != MDSCapMatch::MDS_AUTH_PATH_ROOT && + match.uid != MDSCapMatch::MDS_AUTH_UID_ANY) { out << " "; } if (match.uid != MDSCapMatch::MDS_AUTH_UID_ANY) { out << "uid=" << match.uid; + if (!match.gids.empty()) { + out << " gids="; + for (std::vector::const_iterator p = match.gids.begin(); + p != match.gids.end(); + ++p) { + if (p != match.gids.begin()) + out << ','; + out << *p; + } + } } return out; diff --git a/src/mds/MDSAuthCaps.h b/src/mds/MDSAuthCaps.h index 202c26f9ecf..c243ef424ca 100644 --- a/src/mds/MDSAuthCaps.h +++ b/src/mds/MDSAuthCaps.h @@ -20,7 +20,7 @@ #include #include - +// what we can do struct MDSCapSpec { bool read; bool write; @@ -34,17 +34,21 @@ struct MDSCapSpec { } }; +// conditions before we are allowed to do it struct MDSCapMatch { static const int MDS_AUTH_UID_ANY = -1; static const std::string MDS_AUTH_PATH_ROOT; - int uid; // Require UID to be equal to this, if !=MDS_AUTH_UID_ANY + int uid; // Require UID to be equal to this, if !=MDS_AUTH_UID_ANY + std::vector gids; // Use these GIDs std::string path; // Require path to be child of this (may be "/" for any) MDSCapMatch() : uid(MDS_AUTH_UID_ANY), path(MDS_AUTH_PATH_ROOT) {} - MDSCapMatch(int uid_) : uid(uid_), path(MDS_AUTH_PATH_ROOT) {} + MDSCapMatch(int uid_, std::vector& gids_) + : uid(uid_), gids(gids_), path(MDS_AUTH_PATH_ROOT) {} MDSCapMatch(std::string path_) : uid(MDS_AUTH_UID_ANY), path(path_) {} - MDSCapMatch(std::string path_, int uid_) : uid(uid_), path(path_) {} + MDSCapMatch(std::string path_, int uid_, std::vector& gids_) + : uid(uid_), gids(gids_), path(path_) {} bool is_match_all() const { diff --git a/src/test/mds/TestMDSAuthCaps.cc b/src/test/mds/TestMDSAuthCaps.cc index 74cec8a7618..aa463ebf5b1 100644 --- a/src/test/mds/TestMDSAuthCaps.cc +++ b/src/test/mds/TestMDSAuthCaps.cc @@ -23,6 +23,7 @@ using std::string; using std::cout; const char *parse_good[] = { + "allow rw uid=1 gids=1", "allow * path=\"/foo\"", "allow * path=/foo", "allow * path=\"/foo bar/baz\"", @@ -31,6 +32,8 @@ const char *parse_good[] = { "allow *", "allow r", "allow rw", + "allow rw uid=1 gids=1,2,3", + "allow rw path=/foo uid=1 gids=1,2,3", 0 }; @@ -66,6 +69,10 @@ const char *parse_bad[] = { "allow namespace=foo", "allow rwx auid 123 namespace asdf", "allow wwx pool ''", + "allow rw gids=1", + "allow rw gids=1,2,3", + "allow rw uid=123 gids=asdf", + "allow rw uid=123 gids=1,2,asdf", 0 }; @@ -133,12 +140,18 @@ TEST(MDSAuthCaps, OutputParsed) { "MDSAuthCaps[allow rw]"}, {"allow * uid=1", "MDSAuthCaps[allow * uid=1]"}, + {"allow * uid=1 gids=1", + "MDSAuthCaps[allow * uid=1 gids=1]"}, + {"allow * uid=1 gids=1,2,3", + "MDSAuthCaps[allow * uid=1 gids=1,2,3]"}, {"allow * path=/foo", "MDSAuthCaps[allow * path=\"/foo\"]"}, {"allow * path=\"/foo\"", "MDSAuthCaps[allow * path=\"/foo\"]"}, {"allow * path=\"/foo\" uid=1", "MDSAuthCaps[allow * path=\"/foo\" uid=1]"}, + {"allow * path=\"/foo\" uid=1 gids=1,2,3", + "MDSAuthCaps[allow * path=\"/foo\" uid=1 gids=1,2,3]"}, }; size_t num_tests = sizeof(test_values) / sizeof(*test_values); for (size_t i = 0; i < num_tests; ++i) {