explicit AuthAuthorizer(__u32 p) : protocol(p) {}
virtual ~AuthAuthorizer() {}
virtual bool verify_reply(bufferlist::const_iterator& reply,
- CryptoKey *connection_secret) = 0;
+ std::string *connection_secret) = 0;
virtual bool add_challenge(CephContext *cct, const bufferlist& challenge) = 0;
};
int auth_mode = 0; ///< AUTH_MODE_*
- /// server: client's preferred con_modes
- std::vector<uint32_t> preferred_con_modes;
-
int con_mode = 0; ///< negotiated mode
bool is_mode_crc() {
return con_mode == CEPH_CON_MODE_SECURE;
}
- CryptoKey session_key; ///< per-ticket key
- CryptoKey connection_secret; ///< per-connection key
+ CryptoKey session_key; ///< per-ticket key
+
+ size_t get_connection_secret_length() const {
+ switch (con_mode) {
+ case CEPH_CON_MODE_CRC:
+ return 0;
+ case CEPH_CON_MODE_SECURE:
+ return 16 * 4;
+ }
+ return 0;
+ }
+ std::string connection_secret; ///< per-connection key
std::unique_ptr<AuthAuthorizer> authorizer;
std::unique_ptr<AuthAuthorizerChallenge> authorizer_challenge;
CephContext *cct,
KeyStore *keys,
const bufferlist& authorizer_data,
+ size_t connection_secret_required_len,
bufferlist *authorizer_reply,
EntityName *entity_name,
uint64_t *global_id,
AuthCapsInfo *caps_info,
CryptoKey *session_key,
- CryptoKey *connection_secret,
+ std::string *connection_secret,
std::unique_ptr<AuthAuthorizerChallenge> *challenge) = 0;
virtual int authorizer_session_crypto() = 0;
};
uint32_t con_mode,
const bufferlist& bl,
CryptoKey *session_key,
- CryptoKey *connection_key) = 0;
+ std::string *connection_secret) = 0;
virtual int handle_auth_bad_method(
Connection *con,
uint32_t old_auth_method,
virtual int build_request(bufferlist& bl) const = 0;
virtual int handle_response(int ret, bufferlist::const_iterator& iter,
CryptoKey *session_key,
- CryptoKey *connection_secret) = 0;
+ std::string *connection_secret) = 0;
virtual bool build_rotating_request(bufferlist& bl) const = 0;
virtual AuthAuthorizer *build_authorizer(uint32_t service_id) const = 0;
virtual ~AuthServiceHandler() { }
virtual int start_session(const EntityName& name,
+ size_t connection_secret_required_length,
bufferlist *result,
AuthCapsInfo *caps,
CryptoKey *session_key,
- CryptoKey *connection_secret) = 0;
+ std::string *connection_secret) = 0;
virtual int handle_request(bufferlist::const_iterator& indata,
+ size_t connection_secret_required_length,
bufferlist *result,
uint64_t *global_id,
AuthCapsInfo *caps,
CryptoKey *session_key,
- CryptoKey *connection_secret) = 0;
+ std::string *connection_secret) = 0;
EntityName& get_entity_name() { return entity_name; }
};
AuthSessionHandler *get_auth_session_handler(
CephContext *cct, int protocol,
const CryptoKey& key,
- const CryptoKey& connection_secret,
+ const std::string& connection_secret,
uint64_t features)
{
protected:
CephContext *cct;
int protocol;
- CryptoKey key; // per mon authentication
- CryptoKey connection_secret; // per connection
+ CryptoKey key; // per mon authentication
+ std::string connection_secret; // per connection
public:
explicit AuthSessionHandler(CephContext *cct_) : cct(cct_), protocol(CEPH_AUTH_UNKNOWN) {}
AuthSessionHandler(CephContext *cct_, int protocol_,
const CryptoKey& key_,
- const CryptoKey& cs_)
+ const std::string& cs_)
: cct(cct_),
protocol(protocol_),
key(key_),
extern AuthSessionHandler *get_auth_session_handler(
CephContext *cct, int protocol,
const CryptoKey& key,
- const CryptoKey& connection_secret,
+ const std::string& connection_secret,
uint64_t features);
#endif
CephContext *cct,
KeyStore *keys,
const bufferlist& authorizer_data,
+ size_t connection_secret_required_len,
bufferlist *authorizer_reply,
EntityName *entity_name,
uint64_t *global_id,
AuthCapsInfo *caps_info,
CryptoKey *session_key,
- CryptoKey *connection_secret,
+ std::string *connection_secret,
std::unique_ptr<AuthAuthorizerChallenge> *challenge)
{
auto iter = authorizer_data.cbegin();
CephXServiceTicketInfo auth_ticket_info;
- bool isvalid = cephx_verify_authorizer(cct, keys, iter, auth_ticket_info,
+ bool isvalid = cephx_verify_authorizer(cct, keys, iter,
+ connection_secret_required_len,
+ auth_ticket_info,
challenge, connection_secret,
authorizer_reply);
CephContext *cct,
KeyStore *keys,
const bufferlist& authorizer_data,
+ size_t connection_secret_required_len,
bufferlist *authorizer_reply,
EntityName *entity_name,
uint64_t *global_id,
AuthCapsInfo *caps_info,
CryptoKey *session_key,
- CryptoKey *connection_secret,
+ std::string *connection_secret,
std::unique_ptr<AuthAuthorizerChallenge> *challenge) override;
int authorizer_session_crypto() override;
};
int ret,
bufferlist::const_iterator& indata,
CryptoKey *session_key,
- CryptoKey *connection_secret)
+ std::string *connection_secret)
{
ldout(cct, 10) << this << " handle_response ret = " << ret << dendl;
lderr(cct) << __func__ << " failed to decrypt connection_secret"
<< dendl;
} else {
- ldout(cct, 10) << " got connection_secret " << dendl;
+ ldout(cct, 10) << " got connection_secret "
+ << connection_secret->size() << " bytes" << dendl;
}
}
if (extra_tickets.length()) {
int build_request(bufferlist& bl) const override;
int handle_response(int ret, bufferlist::const_iterator& iter,
CryptoKey *session_key,
- CryptoKey *connection_secret) override;
+ std::string *connection_secret) override;
bool build_rotating_request(bufferlist& bl) const override;
int get_protocol() const override { return CEPH_AUTH_CEPHX; }
*/
bool cephx_verify_authorizer(CephContext *cct, KeyStore *keys,
bufferlist::const_iterator& indata,
+ size_t connection_secret_required_len,
CephXServiceTicketInfo& ticket_info,
std::unique_ptr<AuthAuthorizerChallenge> *challenge,
- CryptoKey *connection_secret,
+ std::string *connection_secret,
bufferlist *reply_bl)
{
__u8 authorizer_v;
#ifndef WITH_SEASTAR
if (connection_secret) {
// generate a connection secret
- bufferptr bp;
- CryptoHandler *crypto = cct->get_crypto_handler(CEPH_CRYPTO_AES);
- assert(crypto);
- int r = crypto->create(cct->random(), bp);
- assert(r >= 0);
- connection_secret->set_secret(CEPH_CRYPTO_AES, bp, ceph_clock_now());
+ connection_secret->resize(connection_secret_required_len);
+ if (connection_secret_required_len) {
+ cct->random()->get_bytes(connection_secret->data(),
+ connection_secret_required_len);
+ }
reply.connection_secret = *connection_secret;
}
#endif
}
bool CephXAuthorizer::verify_reply(bufferlist::const_iterator& indata,
- CryptoKey *connection_secret)
+ std::string *connection_secret)
{
CephXAuthorizeReply reply;
}
if (connection_secret &&
- reply.connection_secret.get_type()) {
+ reply.connection_secret.size()) {
*connection_secret = reply.connection_secret;
}
return true;
struct CephXAuthorizeReply {
uint64_t nonce_plus_one;
- CryptoKey connection_secret;
+ std::string connection_secret;
void encode(bufferlist& bl) const {
using ceph::encode;
__u8 struct_v = 1;
- if (connection_secret.get_type()) {
+ if (connection_secret.size()) {
struct_v = 2;
}
encode(struct_v, bl);
bool build_authorizer();
bool verify_reply(bufferlist::const_iterator& reply,
- CryptoKey *connection_secret) override;
+ std::string *connection_secret) override;
bool add_challenge(CephContext *cct, const bufferlist& challenge) override;
};
* Verify authorizer and generate reply authorizer
*/
extern bool cephx_verify_authorizer(
- CephContext *cct, KeyStore *keys,
+ CephContext *cct,
+ KeyStore *keys,
bufferlist::const_iterator& indata,
+ size_t connection_secret_required_len,
CephXServiceTicketInfo& ticket_info,
std::unique_ptr<AuthAuthorizerChallenge> *challenge,
- CryptoKey *connection_secret,
+ std::string *connection_secret,
bufferlist *reply_bl);
#undef dout_prefix
#define dout_prefix *_dout << "cephx server " << entity_name << ": "
-int CephxServiceHandler::start_session(const EntityName& name,
- bufferlist *result_bl,
- AuthCapsInfo *caps,
- CryptoKey *session_key,
- CryptoKey *connection_secret)
+int CephxServiceHandler::start_session(
+ const EntityName& name,
+ size_t connection_secret_required_length,
+ bufferlist *result_bl,
+ AuthCapsInfo *caps,
+ CryptoKey *session_key,
+ std::string *connection_secret)
{
entity_name = name;
int CephxServiceHandler::handle_request(
bufferlist::const_iterator& indata,
+ size_t connection_secret_required_len,
bufferlist *result_bl,
uint64_t *global_id,
AuthCapsInfo *caps,
CryptoKey *psession_key,
- CryptoKey *pconnection_secret)
+ std::string *pconnection_secret)
{
int ret = 0;
// generate a connection_secret
bufferlist cbl;
if (pconnection_secret) {
- key_server->generate_secret(*pconnection_secret);
- string err;
- encode_encrypt(cct, *pconnection_secret, session_key, cbl, err);
+ pconnection_secret->resize(connection_secret_required_len);
+ if (connection_secret_required_len) {
+ cct->random()->get_bytes(pconnection_secret->data(),
+ connection_secret_required_len);
+ }
+ std::string err;
+ if (encode_encrypt(cct, *pconnection_secret, session_key, cbl,
+ err) < 0) {
+ lderr(cct) << __func__ << " failed to encrypt connection secret, "
+ << err << dendl;
+ ret = -EACCES;
+ break;
+ }
}
encode(cbl, *result_bl);
// provite all of the other tickets at the same time
CephXServiceTicketInfo auth_ticket_info;
// note: no challenge here.
if (!cephx_verify_authorizer(
- cct, key_server, indata, auth_ticket_info, nullptr,
+ cct, key_server, indata, 0, auth_ticket_info, nullptr,
nullptr,
&tmp_bl)) {
ret = -EPERM;
~CephxServiceHandler() override {}
int start_session(const EntityName& name,
+ size_t connection_secret_required_length,
bufferlist *result_bl,
AuthCapsInfo *caps,
CryptoKey *session_key,
- CryptoKey *connection_secret) override;
+ std::string *connection_secret) override;
int handle_request(
bufferlist::const_iterator& indata,
+ size_t connection_secret_required_length,
bufferlist *result_bl,
uint64_t *global_id,
AuthCapsInfo *caps,
CryptoKey *session_key,
- CryptoKey *connection_secret) override;
+ std::string *connection_secret) override;
void build_cephx_response_header(int request_type, int status, bufferlist& bl);
};
int CephxSessionHandler::encrypt_bufferlist(bufferlist &in, bufferlist &out) {
std::string error;
try {
- connection_secret.encrypt(cct, in, out, &error);
+#warning fixme key
+ key.encrypt(cct, in, out, &error);
} catch (std::exception &e) {
lderr(cct) << __func__ << " failed to encrypt buffer: " << error << dendl;
return -1;
int CephxSessionHandler::decrypt_bufferlist(bufferlist &in, bufferlist &out) {
std::string error;
try {
- connection_secret.decrypt(cct, in, out, &error);
+#warning fixme key
+ key.decrypt(cct, in, out, &error);
} catch (std::exception &e) {
lderr(cct) << __func__ << " failed to decrypt buffer: " << error << dendl;
return -1;
public:
CephxSessionHandler(CephContext *cct_,
const CryptoKey& session_key,
- const CryptoKey& connection_secret,
+ const std::string& connection_secret,
uint64_t features)
: AuthSessionHandler(cct_, CEPH_AUTH_CEPHX, session_key, connection_secret),
features(features) {}
CephContext* ceph_ctx,
KeyStore* keys,
const bufferlist& authorizer_data,
+ size_t connection_secret_required_len,
bufferlist *authorizer_reply,
EntityName *entity_name,
uint64_t *global_id,
AuthCapsInfo *caps_info,
CryptoKey *session_key,
- CryptoKey *connection_secret,
+ std::string *connection_secret,
std::unique_ptr<AuthAuthorizerChallenge>* challenge)
{
auto itr(authorizer_data.cbegin());
CephContext*,
KeyStore*,
const bufferlist&,
+ size_t,
bufferlist *,
EntityName *,
uint64_t *,
AuthCapsInfo *,
CryptoKey *,
- CryptoKey *connection_secret,
+ std::string *connection_secret,
std::unique_ptr<
AuthAuthorizerChallenge>* = nullptr) override;
int ret,
bufferlist::const_iterator& buff_list,
CryptoKey *session_key,
- CryptoKey *connection_secret)
+ std::string *connection_secret)
{
auto result(ret);
gss_buffer_desc gss_buffer_in = {0, nullptr};
int handle_response(int ret,
bufferlist::const_iterator& buff_list,
CryptoKey *session_key,
- CryptoKey *connection_secret) override;
+ std::string *connection_secret) override;
bool build_rotating_request(bufferlist& buff_list) const override {
return false;
}
bool verify_reply(bufferlist::const_iterator& buff_list,
- CryptoKey *connection_secret) override {
+ std::string *connection_secret) override {
return true;
}
bool add_challenge(CephContext* ceph_ctx,
int KrbServiceHandler::handle_request(
bufferlist::const_iterator& indata,
+ size_t connection_secret_required_length,
bufferlist *buff_list,
uint64_t *global_id,
AuthCapsInfo *caps,
CryptoKey *session_key,
- CryptoKey *connection_secret)
+ std::string *connection_secret)
{
auto result(0);
gss_buffer_desc gss_buffer_in = {0, nullptr};
int KrbServiceHandler::start_session(
const EntityName& name,
+ size_t connection_secret_required_length,
bufferlist *buff_list,
AuthCapsInfo *caps,
CryptoKey *session_key,
- CryptoKey *connection_secret)
+ std::string *connection_secret)
{
gss_buffer_desc gss_buffer_in = {0, nullptr};
gss_OID gss_object_id = GSS_C_NT_HOSTBASED_SERVICE;
m_key_server(kserver) { }
~KrbServiceHandler();
int handle_request(bufferlist::const_iterator& indata,
- bufferlist *buff_list,
+ size_t connection_secret_required_length,
+ bufferlist *buff_list,
uint64_t *global_id,
AuthCapsInfo *caps,
CryptoKey *session_key,
- CryptoKey *connection_secret) override;
+ std::string *connection_secret) override;
int start_session(const EntityName& name,
- bufferlist *buff_list,
+ size_t connection_secret_required_length,
+ bufferlist *buff_list,
AuthCapsInfo *caps,
CryptoKey *session_key,
- CryptoKey *connection_secret) override;
+ std::string *connection_secret) override;
private:
gss_buffer_desc m_gss_buffer_out;
public:
KrbSessionHandler(CephContext* ceph_ctx,
const CryptoKey& session_key,
- const CryptoKey& connection_secret) :
+ const std::string& connection_secret) :
AuthSessionHandler(ceph_ctx, CEPH_AUTH_GSS, session_key,
connection_secret) { }
~KrbSessionHandler() override = default;
CephContext *cct,
KeyStore *keys,
const bufferlist& authorizer_data,
+ size_t connection_secret_required_len,
bufferlist *authorizer_reply,
EntityName *entity_name,
uint64_t *global_id,
AuthCapsInfo *caps_info,
CryptoKey *session_key,
- CryptoKey *connection_secret,
+ std::string *connection_secret,
std::unique_ptr<AuthAuthorizerChallenge> *challenge)
{
auto iter = authorizer_data.cbegin();
CephContext *cct,
KeyStore *keys,
const bufferlist& authorizer_data,
+ size_t connection_secret_required_len,
bufferlist *authorizer_reply,
EntityName *entity_name,
uint64_t *global_id,
AuthCapsInfo *caps_info,
CryptoKey *session_key,
- CryptoKey *connection_secret,
+ std::string *connection_secret,
std::unique_ptr<AuthAuthorizerChallenge> *challenge) override;
int authorizer_session_crypto() override;
};
int build_request(bufferlist& bl) const override { return 0; }
int handle_response(int ret, bufferlist::const_iterator& iter,
CryptoKey *session_key,
- CryptoKey *connection_secret) override { return 0; }
+ std::string *connection_secret) override { return 0; }
bool build_rotating_request(bufferlist& bl) const override { return false; }
int get_protocol() const override { return CEPH_AUTH_NONE; }
return 0;
}
bool verify_reply(bufferlist::const_iterator& reply,
- CryptoKey *connection_secret) override { return true; }
+ std::string *connection_secret) override { return true; }
bool add_challenge(CephContext *cct, const bufferlist& ch) override {
return true;
}
~AuthNoneServiceHandler() override {}
int start_session(const EntityName& name,
+ size_t connection_secret_required_length,
bufferlist *result_bl,
AuthCapsInfo *caps,
CryptoKey *session_key,
- CryptoKey *connection_secret) override {
+ std::string *connection_secret) override {
entity_name = name;
caps->allow_all = true;
return 1;
}
int handle_request(bufferlist::const_iterator& indata,
+ size_t connection_secret_required_length,
bufferlist *result_bl,
uint64_t *global_id,
AuthCapsInfo *caps,
CryptoKey *session_key,
- CryptoKey *connection_secret) override {
+ std::string *connection_secret) override {
return 0;
}
void build_cephx_response_header(int request_type, int status,
public:
AuthNoneSessionHandler(CephContext *cct_,
const CryptoKey& session_key,
- const CryptoKey& connection_secret)
+ const std::string& connection_secret)
: AuthSessionHandler(cct_, CEPH_AUTH_NONE, session_key, connection_secret) {}
~AuthNoneSessionHandler() override {}
CephContext *cct,
KeyStore *keys,
const bufferlist& authorizer_data,
+ size_t connection_secret_required_len,
bufferlist * authorizer_reply,
EntityName *entity_name,
uint64_t *global_id,
AuthCapsInfo *caps_info,
CryptoKey *session_key,
- CryptoKey *connection_secret,
+ std::string *connection_secret,
std::unique_ptr<AuthAuthorizerChallenge> *challenge)
{
// For unknown authorizers, there's nothing to verify. They're "OK" by definition. PLR
CephContext *cct,
KeyStore *keys,
const bufferlist& authorizer_data,
+ size_t connection_secret_required_len,
bufferlist *authorizer_reply,
EntityName *entity_name,
uint64_t *global_id,
AuthCapsInfo *caps_info,
CryptoKey *session_key,
- CryptoKey *connection_secret,
+ std::string *connection_secret,
std::unique_ptr<AuthAuthorizerChallenge> *challenge) override;
int authorizer_session_crypto() override;
};
int build_request(bufferlist& bl) const { return 0; }
int handle_response(int ret, bufferlist::iterator& iter,
CryptoKey *session_key,
- CryptoKey *connection_secret) { return 0; }
+ std::string *connection_secret) { return 0; }
bool build_rotating_request(bufferlist& bl) const { return false; }
int get_protocol() const { return CEPH_AUTH_UNKNOWN; }
~AuthUnknownServiceHandler() {}
int start_session(const EntityName& name,
+ size_t connection_secret_required_length,
bufferlist *result_bl,
AuthCapsInfo *caps,
CryptoKey *session_key,
- CryptoKey *connection_secret) {
+ std::string *connection_secret) {
return 1;
}
int handle_request(bufferlist::iterator& indata,
+ size_t connection_secret_required_length,
bufferlist *result_bl,
uint64_t *global_id,
AuthCapsInfo *caps,
CryptoKey *session_key,
- CryptoKey *connection_secret) {
+ std::string *connection_secret) {
ceph_abort(); // shouldn't get called
return 0;
}
public:
AuthUnknownSessionHandler(CephContext *cct_,
const CryptoKey& session_key,
- const CryptoKey& connection_secret)
+ const std::string& connection_secret)
: AuthSessionHandler(cct_, CEPH_AUTH_UNKNOWN,
session_key, connection_secret) {}
~AuthUnknownSessionHandler() override {}
h.backoff = 0ms;
set_features(h.reply.features & h.connect.features);
if (h.authorizer) {
- CryptoKey connection_secret; // this is not used here, we just need
+ std::string connection_secret; // this is not used here, we just need
// to make get_auth_session_handler
// call happy
session_security.reset(
try {
if (start) {
// new session
- ret = s->auth_handler->start_session(entity_name, &response_bl,
+ ret = s->auth_handler->start_session(entity_name,
+ 0, // no connection_secret needed
+ &response_bl,
&s->con->peer_caps_info,
nullptr, nullptr);
} else {
// request
ret = s->auth_handler->handle_request(
indata,
+ 0, // no connection_secret needed
&response_bl,
&s->con->peer_global_id,
&s->con->peer_caps_info,
uint32_t con_mode,
const bufferlist& bl,
CryptoKey *session_key,
- CryptoKey *connection_key)
+ std::string *connection_secret)
{
if (con->get_peer_type() == CEPH_ENTITY_TYPE_MON) {
std::lock_guard l(monc_lock);
if (i.second.is_con(con)) {
int r = i.second.handle_auth_done(
global_id, bl,
- session_key, connection_key);
+ session_key, connection_secret);
if (r) {
pending_cons.erase(i.first);
if (!pending_cons.empty()) {
cct,
rotating_secrets.get(),
payload,
+ auth_meta->get_connection_secret_length(),
reply,
&con->peer_name,
&con->peer_global_id,
uint64_t new_global_id,
const bufferlist& bl,
CryptoKey *session_key,
- CryptoKey *connection_secret)
+ std::string *connection_secret)
{
ldout(cct,10) << __func__ << " global_id " << new_global_id
<< " payload " << bl.length()
uint64_t global_id,
const bufferlist& bl,
CryptoKey *session_key,
- CryptoKey *connection_secret);
+ std::string *connection_secret);
int handle_auth_bad_method(
uint32_t old_auth_method,
int result,
uint32_t con_mode,
const bufferlist& bl,
CryptoKey *session_key,
- CryptoKey *connection_key) override;
+ std::string *connection_secret) override;
int handle_auth_bad_method(
Connection *con,
uint32_t old_auth_method,
uint32_t con_mode,
const bufferlist& bl,
CryptoKey *session_key,
- CryptoKey *connection_key)
+ std::string *connection_secret)
{
// verify authorizer reply
auto auth_meta = con->get_auth_meta();
auto p = bl.begin();
- if (!auth_meta->authorizer->verify_reply(p, &auth_meta->connection_secret)) {
+ if (!auth_meta->authorizer->verify_reply(p, connection_secret)) {
dout(0) << __func__ << " failed verifying authorizer reply" << dendl;
return -EACCES;
}
cct,
&keyring,
payload,
+ auth_meta->get_connection_secret_length(),
reply,
&con->peer_name,
&con->peer_global_id,
s->auth_handler = auth_handler;
con->set_priv(RefCountedPtr{s, false});
- r = s->auth_handler->start_session(entity_name, reply,
- &con->peer_caps_info,
- &auth_meta->session_key,
- &auth_meta->connection_secret);
+ r = s->auth_handler->start_session(
+ entity_name,
+ auth_meta->get_connection_secret_length(),
+ reply,
+ &con->peer_caps_info,
+ &auth_meta->session_key,
+ &auth_meta->connection_secret);
} else {
priv = con->get_priv();
s = static_cast<MonSession*>(priv.get());
- r = s->auth_handler->handle_request(p, reply, &con->peer_global_id,
- &con->peer_caps_info,
- &auth_meta->session_key,
- &auth_meta->connection_secret);
+ r = s->auth_handler->handle_request(
+ p,
+ auth_meta->get_connection_secret_length(),
+ reply,
+ &con->peer_global_id,
+ &con->peer_caps_info,
+ &auth_meta->session_key,
+ &auth_meta->connection_secret);
}
if (r > 0 &&
!s->authenticated) {
uint32_t con_mode,
const bufferlist& bl,
CryptoKey *session_key,
- CryptoKey *connection_key) override;
+ std::string *connection_secret) override;
int handle_auth_bad_method(
Connection *con,
uint32_t old_auth_method,
bufferlist& authorizer_reply,
bool& isvalid,
CryptoKey& session_key,
- CryptoKey *connection_secret,
+ std::string *connection_secret,
std::unique_ptr<AuthAuthorizerChallenge> *challenge)
{
if (authorizer.length() == 0) {
cct,
ks,
authorizer,
+ 0,
&authorizer_reply,
&con->peer_name,
&con->peer_global_id,
bool ms_deliver_verify_authorizer(
Connection *con, int peer_type,
int protocol, bufferlist& authorizer, bufferlist& authorizer_reply,
- bool& isvalid, CryptoKey& session_key,
- CryptoKey *connection_secret,
+ bool& isvalid,
+ CryptoKey& session_key,
+ std::string *connection_secret,
std::unique_ptr<AuthAuthorizerChallenge> *challenge);
/**
<< authorizer << dendl;
session_security.reset(get_auth_session_handler(
cct, authorizer->protocol, authorizer->session_key,
- authorizer->session_key /* connection_secret */,
+ string() /* connection_secret */,
connection->get_features()));
} else {
// We have no authorizer, so we shouldn't be applying security to messages
session_security.reset(
get_auth_session_handler(cct, connect_msg.authorizer_protocol,
session_key,
- session_key /* connection secret */,
+ string() /* connection secret */,
connection->get_features()));
bufferlist reply_bl;
<< ", payload_len=" << request.auth_payload().length() << ")"
<< dendl;
auth_meta.auth_method = request.method();
- auth_meta.preferred_con_modes = request.preferred_modes();
+
+ // select a connection mode
+ auto& preferred_modes = request.preferred_modes();
+ std::vector<uint32_t> allowed_modes;
+ messenger->auth_server->get_supported_con_modes(
+ connection->get_peer_type(), auth_meta.auth_method, &allowed_modes);
+ for (auto mode : allowed_modes) {
+ if (std::find(preferred_modes.begin(), preferred_modes.end(), mode)
+ != preferred_modes.end()) {
+ auth_meta.con_mode = mode;
+ break;
+ }
+ }
+ if (auth_meta.con_mode == CEPH_CON_MODE_UNKNOWN) {
+ ldout(cct,1) << "failed to pick con mode from client's " << preferred_modes
+ << " and our " << allowed_modes << dendl;
+ return _auth_bad_method(-EOPNOTSUPP);
+ }
return _handle_auth_request(request.auth_payload(), false);
}
return _fault();
}
if (r == 1) {
- // select a connection mode
- std::vector<uint32_t> allowed_modes;
- messenger->auth_server->get_supported_con_modes(
- connection->get_peer_type(), auth_meta.auth_method, &allowed_modes);
- for (auto mode : allowed_modes) {
- if (std::find(auth_meta.preferred_con_modes.begin(),
- auth_meta.preferred_con_modes.end(),
- mode) != auth_meta.preferred_con_modes.end()) {
- auth_meta.con_mode = mode;
- break;
- }
- }
- if (auth_meta.con_mode == 0) {
- ldout(cct, 1) << __func__ << " failed to select connection mode, i allow "
- << allowed_modes
- << ", client prefers " << auth_meta.preferred_con_modes
- << dendl;
- return _auth_bad_method(-EOPNOTSUPP);
- } else {
- AuthDoneFrame auth_done(connection->peer_global_id, auth_meta.con_mode,
- reply);
- return WRITE(auth_done.get_buffer(), "auth done", read_frame);
- }
+ AuthDoneFrame auth_done(connection->peer_global_id, auth_meta.con_mode,
+ reply);
+ return WRITE(auth_done.get_buffer(), "auth done", read_frame);
} else if (r == 0) {
AuthReplyMoreFrame more(reply);
return WRITE(more.get_buffer(), "auth reply more", read_frame);
had_challenge = (bool)authorizer_challenge;
authorizer_reply.clear();
if (!msgr->ms_deliver_verify_authorizer(
- connection_state.get(), peer_type, connect.authorizer_protocol, authorizer,
+ connection_state.get(), peer_type, connect.authorizer_protocol,
+ authorizer,
authorizer_reply, authorizer_valid, session_key,
nullptr /* connection_secret */,
need_challenge ? &authorizer_challenge : nullptr) ||
get_auth_session_handler(msgr->cct,
connect.authorizer_protocol,
session_key,
- session_key, /* connection_secret */
+ string(), /* connection_secret */
connection_state->get_features()));
// notify
msgr->cct,
authorizer->protocol,
authorizer->session_key,
- authorizer->session_key /* connection secret*/,
+ string() /* connection secret*/,
connection_state->get_features()));
} else {
// We have no authorizer, so we shouldn't be applying security to messages in this pipe. PLR
msgr->ms_deliver_verify_authorizer(
this, peer_type, CEPH_AUTH_NONE,
auth.bl,
+ 0,
authorizer_reply,
authorizer_valid,
session_key);