1
2#include <linux/ceph/ceph_debug.h>
3
4#include <linux/err.h>
5#include <linux/module.h>
6#include <linux/random.h>
7#include <linux/slab.h>
8
9#include <linux/ceph/decode.h>
10#include <linux/ceph/auth.h>
11
12#include "auth_none.h"
13
14static void reset(struct ceph_auth_client *ac)
15{
16	struct ceph_auth_none_info *xi = ac->private;
17
18	xi->starting = true;
19	xi->built_authorizer = false;
20}
21
22static void destroy(struct ceph_auth_client *ac)
23{
24	kfree(ac->private);
25	ac->private = NULL;
26}
27
28static int is_authenticated(struct ceph_auth_client *ac)
29{
30	struct ceph_auth_none_info *xi = ac->private;
31
32	return !xi->starting;
33}
34
35static int should_authenticate(struct ceph_auth_client *ac)
36{
37	struct ceph_auth_none_info *xi = ac->private;
38
39	return xi->starting;
40}
41
42static int build_request(struct ceph_auth_client *ac, void *buf, void *end)
43{
44	return 0;
45}
46
47/*
48 * the generic auth code decode the global_id, and we carry no actual
49 * authenticate state, so nothing happens here.
50 */
51static int handle_reply(struct ceph_auth_client *ac, int result,
52			void *buf, void *end)
53{
54	struct ceph_auth_none_info *xi = ac->private;
55
56	xi->starting = false;
57	return result;
58}
59
60/*
61 * build an 'authorizer' with our entity_name and global_id.  we can
62 * reuse a single static copy since it is identical for all services
63 * we connect to.
64 */
65static int ceph_auth_none_create_authorizer(
66	struct ceph_auth_client *ac, int peer_type,
67	struct ceph_auth_handshake *auth)
68{
69	struct ceph_auth_none_info *ai = ac->private;
70	struct ceph_none_authorizer *au = &ai->au;
71	void *p, *end;
72	int ret;
73
74	if (!ai->built_authorizer) {
75		p = au->buf;
76		end = p + sizeof(au->buf);
77		ceph_encode_8(&p, 1);
78		ret = ceph_entity_name_encode(ac->name, &p, end - 8);
79		if (ret < 0)
80			goto bad;
81		ceph_decode_need(&p, end, sizeof(u64), bad2);
82		ceph_encode_64(&p, ac->global_id);
83		au->buf_len = p - (void *)au->buf;
84		ai->built_authorizer = true;
85		dout("built authorizer len %d\n", au->buf_len);
86	}
87
88	auth->authorizer = (struct ceph_authorizer *) au;
89	auth->authorizer_buf = au->buf;
90	auth->authorizer_buf_len = au->buf_len;
91	auth->authorizer_reply_buf = au->reply_buf;
92	auth->authorizer_reply_buf_len = sizeof (au->reply_buf);
93
94	return 0;
95
96bad2:
97	ret = -ERANGE;
98bad:
99	return ret;
100}
101
102static void ceph_auth_none_destroy_authorizer(struct ceph_auth_client *ac,
103				      struct ceph_authorizer *a)
104{
105	/* nothing to do */
106}
107
108static const struct ceph_auth_client_ops ceph_auth_none_ops = {
109	.name = "none",
110	.reset = reset,
111	.destroy = destroy,
112	.is_authenticated = is_authenticated,
113	.should_authenticate = should_authenticate,
114	.build_request = build_request,
115	.handle_reply = handle_reply,
116	.create_authorizer = ceph_auth_none_create_authorizer,
117	.destroy_authorizer = ceph_auth_none_destroy_authorizer,
118};
119
120int ceph_auth_none_init(struct ceph_auth_client *ac)
121{
122	struct ceph_auth_none_info *xi;
123
124	dout("ceph_auth_none_init %p\n", ac);
125	xi = kzalloc(sizeof(*xi), GFP_NOFS);
126	if (!xi)
127		return -ENOMEM;
128
129	xi->starting = true;
130	xi->built_authorizer = false;
131
132	ac->protocol = CEPH_AUTH_NONE;
133	ac->private = xi;
134	ac->ops = &ceph_auth_none_ops;
135	return 0;
136}
137
138