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