Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/net/ceph/auth_none.c
26282 views
1
// SPDX-License-Identifier: GPL-2.0
2
3
#include <linux/ceph/ceph_debug.h>
4
5
#include <linux/err.h>
6
#include <linux/module.h>
7
#include <linux/random.h>
8
#include <linux/slab.h>
9
10
#include <linux/ceph/decode.h>
11
#include <linux/ceph/auth.h>
12
13
#include "auth_none.h"
14
15
static void reset(struct ceph_auth_client *ac)
16
{
17
struct ceph_auth_none_info *xi = ac->private;
18
19
xi->starting = true;
20
}
21
22
static void destroy(struct ceph_auth_client *ac)
23
{
24
kfree(ac->private);
25
ac->private = NULL;
26
}
27
28
static 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
35
static 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
42
static int ceph_auth_none_build_authorizer(struct ceph_auth_client *ac,
43
struct ceph_none_authorizer *au)
44
{
45
void *p = au->buf;
46
void *const end = p + sizeof(au->buf);
47
int ret;
48
49
ceph_encode_8_safe(&p, end, 1, e_range);
50
ret = ceph_auth_entity_name_encode(ac->name, &p, end);
51
if (ret < 0)
52
return ret;
53
54
ceph_encode_64_safe(&p, end, ac->global_id, e_range);
55
au->buf_len = p - (void *)au->buf;
56
dout("%s built authorizer len %d\n", __func__, au->buf_len);
57
return 0;
58
59
e_range:
60
return -ERANGE;
61
}
62
63
static int build_request(struct ceph_auth_client *ac, void *buf, void *end)
64
{
65
return 0;
66
}
67
68
/*
69
* the generic auth code decode the global_id, and we carry no actual
70
* authenticate state, so nothing happens here.
71
*/
72
static int handle_reply(struct ceph_auth_client *ac, u64 global_id,
73
void *buf, void *end, u8 *session_key,
74
int *session_key_len, u8 *con_secret,
75
int *con_secret_len)
76
{
77
struct ceph_auth_none_info *xi = ac->private;
78
79
xi->starting = false;
80
ceph_auth_set_global_id(ac, global_id);
81
return 0;
82
}
83
84
static void ceph_auth_none_destroy_authorizer(struct ceph_authorizer *a)
85
{
86
kfree(a);
87
}
88
89
/*
90
* build an 'authorizer' with our entity_name and global_id. it is
91
* identical for all services we connect to.
92
*/
93
static int ceph_auth_none_create_authorizer(
94
struct ceph_auth_client *ac, int peer_type,
95
struct ceph_auth_handshake *auth)
96
{
97
struct ceph_none_authorizer *au;
98
int ret;
99
100
au = kmalloc(sizeof(*au), GFP_NOFS);
101
if (!au)
102
return -ENOMEM;
103
104
au->base.destroy = ceph_auth_none_destroy_authorizer;
105
106
ret = ceph_auth_none_build_authorizer(ac, au);
107
if (ret) {
108
kfree(au);
109
return ret;
110
}
111
112
auth->authorizer = (struct ceph_authorizer *) au;
113
auth->authorizer_buf = au->buf;
114
auth->authorizer_buf_len = au->buf_len;
115
auth->authorizer_reply_buf = NULL;
116
auth->authorizer_reply_buf_len = 0;
117
118
return 0;
119
}
120
121
static const struct ceph_auth_client_ops ceph_auth_none_ops = {
122
.reset = reset,
123
.destroy = destroy,
124
.is_authenticated = is_authenticated,
125
.should_authenticate = should_authenticate,
126
.build_request = build_request,
127
.handle_reply = handle_reply,
128
.create_authorizer = ceph_auth_none_create_authorizer,
129
};
130
131
int ceph_auth_none_init(struct ceph_auth_client *ac)
132
{
133
struct ceph_auth_none_info *xi;
134
135
dout("ceph_auth_none_init %p\n", ac);
136
xi = kzalloc(sizeof(*xi), GFP_NOFS);
137
if (!xi)
138
return -ENOMEM;
139
140
xi->starting = true;
141
142
ac->protocol = CEPH_AUTH_NONE;
143
ac->private = xi;
144
ac->ops = &ceph_auth_none_ops;
145
return 0;
146
}
147
148