Merge tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm
[platform/kernel/linux-rpi.git] / fs / ksmbd / mgmt / user_config.c
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
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
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
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
64 int ksmbd_anonymous_user(struct ksmbd_user *user)
65 {
66         if (user->name[0] == '\0')
67                 return 1;
68         return 0;
69 }