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