forked from Minki/linux
4e7a5dcd1b
When we open a monitor session, we send an initial AUTH message listing the auth protocols we support, our entity name, and (possibly) a previously assigned global_id. The monitor chooses a protocol and responds with an initial message. Initially implement AUTH_NONE, a dummy protocol that provides no security, but works within the new framework. It generates 'authorizers' that are used when connecting to (mds, osd) services that simply state our entity name and global_id. This is a wire protocol change. Signed-off-by: Sage Weil <sage@newdream.net>
121 lines
2.6 KiB
C
121 lines
2.6 KiB
C
|
|
#include "ceph_debug.h"
|
|
|
|
#include <linux/err.h>
|
|
#include <linux/module.h>
|
|
#include <linux/random.h>
|
|
|
|
#include "auth_none.h"
|
|
#include "auth.h"
|
|
#include "decode.h"
|
|
|
|
static void reset(struct ceph_auth_client *ac)
|
|
{
|
|
struct ceph_auth_none_info *xi = ac->private;
|
|
|
|
xi->starting = true;
|
|
xi->built_authorizer = false;
|
|
}
|
|
|
|
static void destroy(struct ceph_auth_client *ac)
|
|
{
|
|
kfree(ac->private);
|
|
ac->private = NULL;
|
|
}
|
|
|
|
static int is_authenticated(struct ceph_auth_client *ac)
|
|
{
|
|
struct ceph_auth_none_info *xi = ac->private;
|
|
|
|
return !xi->starting;
|
|
}
|
|
|
|
/*
|
|
* the generic auth code decode the global_id, and we carry no actual
|
|
* authenticate state, so nothing happens here.
|
|
*/
|
|
static int handle_reply(struct ceph_auth_client *ac, int result,
|
|
void *buf, void *end)
|
|
{
|
|
struct ceph_auth_none_info *xi = ac->private;
|
|
|
|
xi->starting = false;
|
|
return result;
|
|
}
|
|
|
|
/*
|
|
* build an 'authorizer' with our entity_name and global_id. we can
|
|
* reuse a single static copy since it is identical for all services
|
|
* we connect to.
|
|
*/
|
|
static int ceph_auth_none_create_authorizer(
|
|
struct ceph_auth_client *ac, int peer_type,
|
|
struct ceph_authorizer **a,
|
|
void **buf, size_t *len,
|
|
void **reply_buf, size_t *reply_len)
|
|
{
|
|
struct ceph_auth_none_info *ai = ac->private;
|
|
struct ceph_none_authorizer *au = &ai->au;
|
|
void *p, *end;
|
|
int ret;
|
|
|
|
if (!ai->built_authorizer) {
|
|
p = au->buf;
|
|
end = p + sizeof(au->buf);
|
|
ret = ceph_entity_name_encode(ac->name, &p, end - 8);
|
|
if (ret < 0)
|
|
goto bad;
|
|
ceph_decode_need(&p, end, sizeof(u64), bad2);
|
|
ceph_encode_64(&p, ac->global_id);
|
|
au->buf_len = p - (void *)au->buf;
|
|
ai->built_authorizer = true;
|
|
dout("built authorizer len %d\n", au->buf_len);
|
|
}
|
|
|
|
*a = (struct ceph_authorizer *)au;
|
|
*buf = au->buf;
|
|
*len = au->buf_len;
|
|
*reply_buf = au->reply_buf;
|
|
*reply_len = sizeof(au->reply_buf);
|
|
return 0;
|
|
|
|
bad2:
|
|
ret = -ERANGE;
|
|
bad:
|
|
return ret;
|
|
}
|
|
|
|
static void ceph_auth_none_destroy_authorizer(struct ceph_auth_client *ac,
|
|
struct ceph_authorizer *a)
|
|
{
|
|
/* nothing to do */
|
|
}
|
|
|
|
static const struct ceph_auth_client_ops ceph_auth_none_ops = {
|
|
.reset = reset,
|
|
.destroy = destroy,
|
|
.is_authenticated = is_authenticated,
|
|
.handle_reply = handle_reply,
|
|
.create_authorizer = ceph_auth_none_create_authorizer,
|
|
.destroy_authorizer = ceph_auth_none_destroy_authorizer,
|
|
};
|
|
|
|
int ceph_auth_none_init(struct ceph_auth_client *ac)
|
|
{
|
|
struct ceph_auth_none_info *xi;
|
|
|
|
dout("ceph_auth_none_init %p\n", ac);
|
|
xi = kzalloc(sizeof(*xi), GFP_NOFS);
|
|
if (!xi)
|
|
return -ENOMEM;
|
|
|
|
xi->starting = true;
|
|
xi->built_authorizer = false;
|
|
|
|
ac->protocol = CEPH_AUTH_NONE;
|
|
ac->private = xi;
|
|
ac->ops = &ceph_auth_none_ops;
|
|
return 0;
|
|
}
|
|
|