#include "messages/MAuth.h"
#include "messages/MAuthReply.h"
-int AuthClientHandler::generate_request(bufferlist& bl)
+int AuthClientHandler::generate_authenticate_request(bufferlist& bl)
{
dout(0) << "status=" << status << dendl;
if (status < 0) {
bl = m->result_bl;
ret = m->result;
- got_response = true;
+ got_authenticate_response = true;
bufferlist::iterator iter = bl.begin();
return 0;
}
-int AuthClientHandler::generate_cephx_authorize_request(uint32_t service_id, bufferlist& bl)
+int AuthClientHandler::generate_cephx_authorize_request(uint32_t service_id, bufferlist& bl, AuthorizeContext& ctx)
{
CephXRequestHeader header;
if (!(have & service_id)) {
header.request_type = CEPHX_OPEN_SESSION;
::encode(header, bl);
- AuthorizeContext& ctx = context_map.create();
+ //AuthorizeContext& ctx = context_map.create();
utime_t now;
if (!tickets.build_authorizer(service_id, bl, ctx))
return -EINVAL;
do {
status = 0;
- int err = _do_request(timeout);
- dout(0) << "_do_request returned " << err << dendl;
+ int err = _do_authenticate_request(timeout);
+ dout(0) << "_do_authenticate_request returned " << err << dendl;
if (err < 0)
return err;
int AuthClientHandler::authorize(uint32_t service_id)
{
- /* FIXME: do it via _do_request(), so that we get timeout handling */
+ MAuth *msg = new MAuth;
+ if (!msg)
+ return NULL;
+ bufferlist& bl = msg->get_auth_payload();
-
+ AuthorizeContext& ctx = context_map.create();
+
+ int err = generate_cephx_authorize_request(service_id, bl, ctx);
+ if (err < 0) {
+ context_map.remove(ctx.id);
+ }
+
+ client->send_message(msg);
return 0;
}
}
-Message *AuthClientHandler::build_request()
+Message *AuthClientHandler::build_authenticate_request()
{
MAuth *msg = new MAuth;
if (!msg)
return NULL;
bufferlist& bl = msg->get_auth_payload();
- if (generate_request(bl) < 0) {
+ if (generate_authenticate_request(bl) < 0) {
delete msg;
return NULL;
}
return msg;
}
-int AuthClientHandler::_do_request(double timeout)
+int AuthClientHandler::_do_authenticate_request(double timeout)
{
- Message *msg = build_request();
-
+ Message *msg = build_authenticate_request();
if (!msg)
return -EIO;
- got_response = false;
-
+ Cond request_cond;
+ cur_request_cond = &request_cond;
+ got_authenticate_response = false;
+
+ int ret = _do_request_generic(timeout, msg, request_cond);
+
+ cur_request_cond = NULL;
+
+ return ret;
+}
+
+int AuthClientHandler::_do_request_generic(double timeout, Message *msg, Cond& request_cond)
+{
client->send_message(msg);
// schedule timeout?
timeout_event = new C_OpTimeout(this, timeout);
timer.add_event_after(timeout, timeout_event);
- Cond request_cond;
+ dout(0) << "got_authenticate_response=" << got_authenticate_response << " got_timeout=" << got_authenticate_timeout << dendl;
- cur_request_cond = &request_cond;
-
- dout(0) << "got_response=" << got_response << " got_timeout=" << got_timeout << dendl;
-
- while (!got_response && !got_timeout) {
- request_cond.Wait(lock);
- }
-
- cur_request_cond = NULL;
+ request_cond.Wait(lock);
// finish.
timer.cancel_event(timeout_event);
- timeout_event = 0;
+ timeout_event = NULL;
return 0;
}
-void AuthClientHandler::_request_timeout(double timeout)
+void AuthClientHandler::_authenticate_request_timeout(double timeout)
{
Mutex::Locker l(lock);
dout(10) << "_op_timeout" << dendl;
timeout_event = 0;
- if (!got_response) {
- got_timeout = 1;
+ if (!got_authenticate_response) {
+ got_authenticate_timeout = 1;
assert(cur_request_cond);
cur_request_cond->Signal();
}
int cephx_request_state;
int cephx_response_state;
- bool got_response;
- bool got_timeout;
+ bool got_authenticate_response;
+ bool got_authenticate_timeout;
EntityName name;
entity_addr_t addr;
AuthorizeContextMap context_map;
bool request_pending();
- Message *build_request();
+ Message *build_authenticate_request();
- int generate_request(bufferlist& bl);
+ int generate_authenticate_request(bufferlist& bl);
int handle_response(Message *response);
/* cephx requests */
int generate_cephx_authenticate_request(bufferlist& bl);
- int generate_cephx_authorize_request(uint32_t service_id, bufferlist& bl);
+ int generate_cephx_authorize_request(uint32_t service_id, bufferlist& bl, AuthorizeContext& ctx);
/* cephx responses */
int handle_cephx_response(bufferlist::iterator& indata);
status = 0;
cephx_request_state = 0;
cephx_response_state = 0;
- got_response = false;
- got_timeout = false;
+ got_authenticate_response = false;
+ got_authenticate_timeout = false;
timeout_event = NULL;
cur_request_cond = NULL;
}
client_handler(handler), timeout(to) {
}
void finish(int r) {
- if (r >= 0) client_handler->_request_timeout(timeout);
+ if (r >= 0) client_handler->_authenticate_request_timeout(timeout);
}
};
- void _request_timeout(double timeout);
- int _do_request(double timeout);
+ void _authenticate_request_timeout(double timeout);
+ int _do_authenticate_request(double timeout);
+ int _do_request_generic(double timeout, Message *msg, Cond& request_cond);
public:
AuthClientHandler() : lock("AuthClientHandler::lock"),