]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
cmdparse, mon: add cmd_vartype_stringify for _allowed_command
authorDan Mick <dan.mick@inktank.com>
Tue, 4 Jun 2013 04:06:34 +0000 (21:06 -0700)
committerDan Mick <dan.mick@inktank.com>
Tue, 4 Jun 2013 04:06:34 +0000 (21:06 -0700)
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 <dan.mick@inktank.com>
src/common/cmdparse.cc
src/common/cmdparse.h
src/mon/Monitor.cc

index 0fd5d438aae5e89a8d8ffa978730970139def72d..467c2140cb04463e504c05d3b33cef390eb4e75e 100644 (file)
@@ -172,6 +172,25 @@ cmdmap_from_json(vector<string> cmd, map<string, cmd_vartype> *mapp, stringstrea
   }
 }
 
+class stringify_visitor : public boost::static_visitor<string>
+{
+  public:
+    template <typename T>
+    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)
 {
index 8a65d24ac78b979608f724336ea4d9a3d00a4f1f..df8f570c46b7f264aeff80c4ee82481cac8f3daa 100644 (file)
@@ -28,6 +28,7 @@ bool cmdmap_from_json(std::vector<std::string> 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 <typename T>
 bool
index fc423bd696a3c2dea9c21bbfa8baeaa93a179ee6..1e8688e226ae885b7338e4e974c1fc3de6b9e60c 100644 (file)
@@ -2137,6 +2137,8 @@ void Monitor::finish_election()
 
 bool Monitor::_allowed_command(MonSession *s, map<string, cmd_vartype>& cmd)
 {
+  bool retval = false;
+
   if (s->caps.is_allow_all())
     return true;
 
@@ -2144,15 +2146,19 @@ bool Monitor::_allowed_command(MonSession *s, map<string, cmd_vartype>& cmd)
   cmd_getval(g_ceph_context, cmd, "prefix", prefix);
 
   map<string,string> strmap;
-  for (map<string, cmd_vartype>::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<string, cmd_vartype>::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)