xref: /openbmc/linux/fs/smb/server/mgmt/user_config.c (revision 38c8a9a5)
1*38c8a9a5SSteve French // SPDX-License-Identifier: GPL-2.0-or-later
2*38c8a9a5SSteve French /*
3*38c8a9a5SSteve French  *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
4*38c8a9a5SSteve French  */
5*38c8a9a5SSteve French 
6*38c8a9a5SSteve French #include <linux/slab.h>
7*38c8a9a5SSteve French #include <linux/mm.h>
8*38c8a9a5SSteve French 
9*38c8a9a5SSteve French #include "user_config.h"
10*38c8a9a5SSteve French #include "../transport_ipc.h"
11*38c8a9a5SSteve French 
ksmbd_login_user(const char * account)12*38c8a9a5SSteve French struct ksmbd_user *ksmbd_login_user(const char *account)
13*38c8a9a5SSteve French {
14*38c8a9a5SSteve French 	struct ksmbd_login_response *resp;
15*38c8a9a5SSteve French 	struct ksmbd_user *user = NULL;
16*38c8a9a5SSteve French 
17*38c8a9a5SSteve French 	resp = ksmbd_ipc_login_request(account);
18*38c8a9a5SSteve French 	if (!resp)
19*38c8a9a5SSteve French 		return NULL;
20*38c8a9a5SSteve French 
21*38c8a9a5SSteve French 	if (!(resp->status & KSMBD_USER_FLAG_OK))
22*38c8a9a5SSteve French 		goto out;
23*38c8a9a5SSteve French 
24*38c8a9a5SSteve French 	user = ksmbd_alloc_user(resp);
25*38c8a9a5SSteve French out:
26*38c8a9a5SSteve French 	kvfree(resp);
27*38c8a9a5SSteve French 	return user;
28*38c8a9a5SSteve French }
29*38c8a9a5SSteve French 
ksmbd_alloc_user(struct ksmbd_login_response * resp)30*38c8a9a5SSteve French struct ksmbd_user *ksmbd_alloc_user(struct ksmbd_login_response *resp)
31*38c8a9a5SSteve French {
32*38c8a9a5SSteve French 	struct ksmbd_user *user = NULL;
33*38c8a9a5SSteve French 
34*38c8a9a5SSteve French 	user = kmalloc(sizeof(struct ksmbd_user), GFP_KERNEL);
35*38c8a9a5SSteve French 	if (!user)
36*38c8a9a5SSteve French 		return NULL;
37*38c8a9a5SSteve French 
38*38c8a9a5SSteve French 	user->name = kstrdup(resp->account, GFP_KERNEL);
39*38c8a9a5SSteve French 	user->flags = resp->status;
40*38c8a9a5SSteve French 	user->gid = resp->gid;
41*38c8a9a5SSteve French 	user->uid = resp->uid;
42*38c8a9a5SSteve French 	user->passkey_sz = resp->hash_sz;
43*38c8a9a5SSteve French 	user->passkey = kmalloc(resp->hash_sz, GFP_KERNEL);
44*38c8a9a5SSteve French 	if (user->passkey)
45*38c8a9a5SSteve French 		memcpy(user->passkey, resp->hash, resp->hash_sz);
46*38c8a9a5SSteve French 
47*38c8a9a5SSteve French 	if (!user->name || !user->passkey) {
48*38c8a9a5SSteve French 		kfree(user->name);
49*38c8a9a5SSteve French 		kfree(user->passkey);
50*38c8a9a5SSteve French 		kfree(user);
51*38c8a9a5SSteve French 		user = NULL;
52*38c8a9a5SSteve French 	}
53*38c8a9a5SSteve French 	return user;
54*38c8a9a5SSteve French }
55*38c8a9a5SSteve French 
ksmbd_free_user(struct ksmbd_user * user)56*38c8a9a5SSteve French void ksmbd_free_user(struct ksmbd_user *user)
57*38c8a9a5SSteve French {
58*38c8a9a5SSteve French 	ksmbd_ipc_logout_request(user->name, user->flags);
59*38c8a9a5SSteve French 	kfree(user->name);
60*38c8a9a5SSteve French 	kfree(user->passkey);
61*38c8a9a5SSteve French 	kfree(user);
62*38c8a9a5SSteve French }
63*38c8a9a5SSteve French 
ksmbd_anonymous_user(struct ksmbd_user * user)64*38c8a9a5SSteve French int ksmbd_anonymous_user(struct ksmbd_user *user)
65*38c8a9a5SSteve French {
66*38c8a9a5SSteve French 	if (user->name[0] == '\0')
67*38c8a9a5SSteve French 		return 1;
68*38c8a9a5SSteve French 	return 0;
69*38c8a9a5SSteve French }
70*38c8a9a5SSteve French 
ksmbd_compare_user(struct ksmbd_user * u1,struct ksmbd_user * u2)71*38c8a9a5SSteve French bool ksmbd_compare_user(struct ksmbd_user *u1, struct ksmbd_user *u2)
72*38c8a9a5SSteve French {
73*38c8a9a5SSteve French 	if (strcmp(u1->name, u2->name))
74*38c8a9a5SSteve French 		return false;
75*38c8a9a5SSteve French 	if (memcmp(u1->passkey, u2->passkey, u1->passkey_sz))
76*38c8a9a5SSteve French 		return false;
77*38c8a9a5SSteve French 
78*38c8a9a5SSteve French 	return true;
79*38c8a9a5SSteve French }
80