]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/DaemonServer: attach MgrSession to connections
authorSage Weil <sage@redhat.com>
Tue, 7 Mar 2017 19:09:20 +0000 (14:09 -0500)
committerSage Weil <sage@redhat.com>
Wed, 29 Mar 2017 15:39:25 +0000 (11:39 -0400)
Reuse MonCap; it is suitably generic.

Signed-off-by: Sage Weil <sage@redhat.com>
src/mgr/DaemonServer.cc
src/mgr/DaemonServer.h

index 1f28257fbbdf5d6be7177762edb75f351f4bfd03..72fb03967884af3c875ac0fcbcc334eff454ce44 100644 (file)
@@ -127,18 +127,42 @@ bool DaemonServer::ms_verify_authorizer(Connection *con,
     return true;
   }
 
+  MgrSessionRef s(new MgrSession);
   AuthCapsInfo caps_info;
-  EntityName name;
-  uint64_t global_id = 0;
 
   is_valid = handler->verify_authorizer(
     cct, monc->rotating_secrets.get(),
     authorizer_data,
-    authorizer_reply, name,
-    global_id, caps_info,
+    authorizer_reply, s->entity_name,
+    s->global_id, caps_info,
     session_key);
 
-  // TODO: invent some caps suitable for ceph-mgr
+  if (is_valid) {
+    if (caps_info.allow_all) {
+      dout(10) << " session " << s << " " << s->entity_name
+              << " allow_all" << dendl;
+      s->caps.set_allow_all();
+    }
+    if (caps_info.caps.length() > 0) {
+      bufferlist::iterator p = caps_info.caps.begin();
+      string str;
+      try {
+       ::decode(str, p);
+      }
+      catch (buffer::error& e) {
+      }
+      bool success = s->caps.parse(str);
+      if (success) {
+       dout(10) << " session " << s << " " << s->entity_name
+                << " has caps " << s->caps << " '" << str << "'" << dendl;
+      } else {
+       dout(10) << " session " << s << " " << s->entity_name
+                << " failed to parse caps '" << str << "'" << dendl;
+       is_valid = false;
+      }
+    }
+    con->set_priv(s->get());
+  }
 
   return true;
 }
index e38f3379ac26aaf2aa9cc36dd4ae1ca261b91812..ee805919d1bbb687186b936837b1ab860c3777ec 100644 (file)
@@ -24,6 +24,8 @@
 #include <msg/Messenger.h>
 #include <mon/MonClient.h>
 
+#include <mon/MonCap.h>
+
 #include "auth/AuthAuthorizeHandler.h"
 
 #include "DaemonState.h"
@@ -32,6 +34,21 @@ class MMgrReport;
 class MMgrOpen;
 class MCommand;
 
+/**
+ * Session state associated with the Connection.
+ */
+struct MgrSession : public RefCountedObject {
+  uint64_t global_id = 0;
+  EntityName entity_name;
+
+  // mon caps are suitably generic for mgr
+  MonCap caps;
+
+  MgrSession() : RefCountedObject(0) {}
+  ~MgrSession() override {}
+};
+
+typedef boost::intrusive_ptr<MgrSession> MgrSessionRef;
 
 /**
  * Server used in ceph-mgr to communicate with Ceph daemons like