virtual ~AuthServiceHandler() { }
virtual int start_session(bufferlist& result) = 0;
- virtual int handle_request(bufferlist::iterator& indata, bufferlist& result) = 0;
+ virtual int handle_request(bufferlist::iterator& indata, bufferlist& result, bufferlist& caps) = 0;
};
extern AuthServiceHandler *get_auth_service_handler(KeyServer *ks, set<__u32>& supported);
return true;
}
+bool KeyServer::_get_service_caps(EntityName& name, uint32_t service_id, bufferlist& caps)
+{
+ string s = ceph_entity_type_name(service_id);
+
+ return data.get_caps(name, s, caps);
+}
+
+bool KeyServer::get_service_caps(EntityName& name, uint32_t service_id, bufferlist& caps)
+{
+ Mutex::Locker l(lock);
+ return _get_service_caps(name, service_id, caps);
+}
+
+
int KeyServer::_build_session_auth_info(uint32_t service_id, CephXServiceTicketInfo& auth_ticket_info, CephXSessionAuthInfo& info)
{
info.ticket.name = auth_ticket_info.ticket.name;
void _generate_all_rotating_secrets(bool init);
bool _check_rotate();
int _build_session_auth_info(uint32_t service_id, CephXServiceTicketInfo& auth_ticket_info, CephXSessionAuthInfo& info);
+ bool _get_service_caps(EntityName& name, uint32_t service_id, bufferlist& caps);
public:
KeyServer();
bool get_rotating_encrypted(EntityName& name, bufferlist& enc_bl);
Mutex& get_lock() { return lock; }
+ bool get_service_caps(EntityName& name, uint32_t service_id, bufferlist& caps);
};
WRITE_CLASS_ENCODER(KeyServer);
return CEPH_AUTH_CEPHX;
}
-int CephxServiceHandler::handle_request(bufferlist::iterator& indata, bufferlist& result_bl)
+int CephxServiceHandler::handle_request(bufferlist::iterator& indata, bufferlist& result_bl, bufferlist& caps)
{
int ret = 0;
ret = -EIO;
break;
}
+
+ if (!key_server->get_service_caps(entity_name, CEPH_ENTITY_TYPE_MON, caps)) {
+ dout(0) << "could not get mon caps for " << entity_name << dendl;
+ }
}
break;
~CephxServiceHandler() {}
int start_session(bufferlist& result_bl);
- int handle_request(bufferlist::iterator& indata, bufferlist& result_bl);
+ int handle_request(bufferlist::iterator& indata, bufferlist& result_bl, bufferlist& caps);
void build_cephx_response_header(int request_type, int status, bufferlist& bl);
};
{
dout(0) << "preprocess_auth() blob_size=" << m->get_auth_payload().length() << dendl;
int ret = 0;
+ bufferlist caps;
+ MAuthReply *reply;
Session *s = (Session *)m->get_connection()->get_priv();
- s->put();
bufferlist response_bl;
bufferlist::iterator indata = m->auth_payload.begin();
} else if (s->auth_handler) {
// handle the request
try {
- ret = s->auth_handler->handle_request(indata, response_bl);
+ ret = s->auth_handler->handle_request(indata, response_bl, caps);
+ if (caps.length()) {
+ s->caps.parse(caps);
+ }
} catch (buffer::error *err) {
ret = -EINVAL;
dout(0) << "caught error when trying to handle auth request, probably malformed request" << dendl;
}
if (ret == -EIO) {
paxos->wait_for_active(new C_RetryMessage(this, m));
- return true;
+ goto done;
}
} else {
ret = -EINVAL; // no protocol selected?
}
- MAuthReply *reply = new MAuthReply(proto, &response_bl, ret);
+ reply = new MAuthReply(proto, &response_bl, ret);
mon->messenger->send_message(reply, m->get_orig_source_inst());
+done:
+ s->put();
return true;
}
Subscription(Session *s, const nstring& t) : session(s), type(t), type_item(this) {};
};
+class MonCaps {
+ bool get_next_token(string s, size_t& pos, string& token);
+public:
+ MonCaps() {}
+ bool parse(bufferlist& bl) { return true; }
+};
struct Session : public RefCountedObject {
entity_inst_t inst;
bool closed;
xlist<Session*>::item item;
set<__u64> routed_request_tids;
+ MonCaps caps;
map<nstring, Subscription*> sub_map;