virtual int get_protocol() = 0;
virtual void reset() = 0;
+ virtual void prepare_build_request() = 0;
virtual int build_request(bufferlist& bl) = 0;
virtual int handle_response(int ret, bufferlist::iterator& iter) = 0;
virtual bool build_rotating_request(bufferlist& bl) = 0;
{
ldout(cct, 10) << "build_request" << dendl;
- ldout(cct, 10) << "validate_tickets: want=" << want << " need=" << need << " have=" << have << dendl;
-
- lock.get_write();
- validate_tickets();
- lock.put_write();
-
RWLock::RLocker l(lock);
- ldout(cct, 10) << "want=" << want << " need=" << need << " have=" << have << dendl;
-
- CephXTicketHandler& ticket_handler = tickets.get_handler(CEPH_ENTITY_TYPE_AUTH);
if (need & CEPH_ENTITY_TYPE_AUTH) {
/* authenticate */
return -EIO;
}
- req.old_ticket = ticket_handler.ticket;
+ req.old_ticket = ticket_handler->ticket;
if (req.old_ticket.blob.length()) {
ldout(cct, 20) << "old ticket len=" << req.old_ticket.blob.length() << dendl;
header.request_type = CEPHX_GET_PRINCIPAL_SESSION_KEY;
::encode(header, bl);
- CephXAuthorizer *authorizer = ticket_handler.build_authorizer(global_id);
+ CephXAuthorizer *authorizer = ticket_handler->build_authorizer(global_id);
if (!authorizer)
return -EINVAL;
bl.claim_append(authorizer->bl);
return true;
}
+void CephxClientHandler::prepare_build_request()
+{
+ RWLock::WLocker l(lock);
+ ldout(cct, 10) << "validate_tickets: want=" << want << " need=" << need
+ << " have=" << have << dendl;
+ validate_tickets();
+ ldout(cct, 10) << "want=" << want << " need=" << need << " have=" << have
+ << dendl;
+
+ ticket_handler = &(tickets.get_handler(CEPH_ENTITY_TYPE_AUTH));
+}
+
void CephxClientHandler::validate_tickets()
{
// lock should be held for write
uint64_t server_challenge;
CephXTicketManager tickets;
-
+ CephXTicketHandler* ticket_handler;
+
RotatingKeyRing *rotating_secrets;
KeyRing *keyring;
starting(false),
server_challenge(0),
tickets(cct_),
+ ticket_handler(NULL),
rotating_secrets(rsecrets),
keyring(rsecrets->get_keyring())
{
starting = true;
server_challenge = 0;
}
+ void prepare_build_request();
int build_request(bufferlist& bl);
int handle_response(int ret, bufferlist::iterator& iter);
bool build_rotating_request(bufferlist& bl);
void reset() { }
+ void prepare_build_request() {}
int build_request(bufferlist& bl) { return 0; }
int handle_response(int ret, bufferlist::iterator& iter) { return 0; }
bool build_rotating_request(bufferlist& bl) { return false; }
void reset() { }
+ void prepare_build_request() {}
int build_request(bufferlist& bl) { return 0; }
int handle_response(int ret, bufferlist::iterator& iter) { return 0; }
bool build_rotating_request(bufferlist& bl) { return false; }
if (ret == -EAGAIN) {
MAuth *ma = new MAuth;
ma->protocol = auth->get_protocol();
+ auth->prepare_build_request();
ret = auth->build_request(ma->auth_payload);
_send_mon_message(ma, true);
return;
ldout(cct, 10) << "_check_auth_tickets getting new tickets!" << dendl;
MAuth *m = new MAuth;
m->protocol = auth->get_protocol();
+ auth->prepare_build_request();
auth->build_request(m->auth_payload);
_send_mon_message(m);
}