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