From: Dan Mick Date: Tue, 4 Jun 2013 04:06:34 +0000 (-0700) Subject: cmdparse, mon: add cmd_vartype_stringify for _allowed_command X-Git-Tag: v0.65~136^2^2~34 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=be1a51240248de6b5f0fb7e3fc514554ce226516;p=ceph.git cmdparse, mon: add cmd_vartype_stringify for _allowed_command cmd_vartype are not all strings, and need a type-variant function to turn them into strings for authorization against caps. Use boost::apply_visitor to get this behavior. Signed-off-by: Dan Mick --- diff --git a/src/common/cmdparse.cc b/src/common/cmdparse.cc index 0fd5d438aae..467c2140cb0 100644 --- a/src/common/cmdparse.cc +++ b/src/common/cmdparse.cc @@ -172,6 +172,25 @@ cmdmap_from_json(vector cmd, map *mapp, stringstrea } } +class stringify_visitor : public boost::static_visitor +{ + public: + template + string operator()(T &operand) const + { + ostringstream oss; + oss << operand; + return oss.str(); + } +}; + +string +cmd_vartype_stringify(const cmd_vartype &v) +{ + return boost::apply_visitor(stringify_visitor(), v); +} + + void handle_bad_get(CephContext *cct, string k, const char *tname) { diff --git a/src/common/cmdparse.h b/src/common/cmdparse.h index 8a65d24ac78..df8f570c46b 100644 --- a/src/common/cmdparse.h +++ b/src/common/cmdparse.h @@ -28,6 +28,7 @@ bool cmdmap_from_json(std::vector cmd, cmdmap_t *mapp, std::stringstream &ss); void handle_bad_get(CephContext *cct, std::string k, const char *name); +std::string cmd_vartype_stringify(const cmd_vartype& v); template bool diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index fc423bd696a..1e8688e226a 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -2137,6 +2137,8 @@ void Monitor::finish_election() bool Monitor::_allowed_command(MonSession *s, map& cmd) { + bool retval = false; + if (s->caps.is_allow_all()) return true; @@ -2144,15 +2146,19 @@ bool Monitor::_allowed_command(MonSession *s, map& cmd) cmd_getval(g_ceph_context, cmd, "prefix", prefix); map strmap; - for (map::const_iterator p = cmd.begin(); p != cmd.end(); ++p) - if (p->first != "prefix") - cmd_getval(g_ceph_context, cmd, p->first, strmap[p->first]); + for (map::const_iterator p = cmd.begin(); + p != cmd.end(); ++p) { + if (p->first != "prefix") { + strmap[p->first] = cmd_vartype_stringify(p->second); + } + } if (s->caps.is_capable(g_ceph_context, s->inst.name, - "", prefix, strmap, false, false, false)) - return true; + "", prefix, strmap, false, false, false)) { + retval = true; + } - return false; + return retval; } void Monitor::_sync_status(ostream& ss)