Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
0004  */
0005 
0006 #include <linux/slab.h>
0007 #include <linux/mm.h>
0008 
0009 #include "user_config.h"
0010 #include "../transport_ipc.h"
0011 
0012 struct ksmbd_user *ksmbd_login_user(const char *account)
0013 {
0014     struct ksmbd_login_response *resp;
0015     struct ksmbd_user *user = NULL;
0016 
0017     resp = ksmbd_ipc_login_request(account);
0018     if (!resp)
0019         return NULL;
0020 
0021     if (!(resp->status & KSMBD_USER_FLAG_OK))
0022         goto out;
0023 
0024     user = ksmbd_alloc_user(resp);
0025 out:
0026     kvfree(resp);
0027     return user;
0028 }
0029 
0030 struct ksmbd_user *ksmbd_alloc_user(struct ksmbd_login_response *resp)
0031 {
0032     struct ksmbd_user *user = NULL;
0033 
0034     user = kmalloc(sizeof(struct ksmbd_user), GFP_KERNEL);
0035     if (!user)
0036         return NULL;
0037 
0038     user->name = kstrdup(resp->account, GFP_KERNEL);
0039     user->flags = resp->status;
0040     user->gid = resp->gid;
0041     user->uid = resp->uid;
0042     user->passkey_sz = resp->hash_sz;
0043     user->passkey = kmalloc(resp->hash_sz, GFP_KERNEL);
0044     if (user->passkey)
0045         memcpy(user->passkey, resp->hash, resp->hash_sz);
0046 
0047     if (!user->name || !user->passkey) {
0048         kfree(user->name);
0049         kfree(user->passkey);
0050         kfree(user);
0051         user = NULL;
0052     }
0053     return user;
0054 }
0055 
0056 void ksmbd_free_user(struct ksmbd_user *user)
0057 {
0058     ksmbd_ipc_logout_request(user->name, user->flags);
0059     kfree(user->name);
0060     kfree(user->passkey);
0061     kfree(user);
0062 }
0063 
0064 int ksmbd_anonymous_user(struct ksmbd_user *user)
0065 {
0066     if (user->name[0] == '\0')
0067         return 1;
0068     return 0;
0069 }
0070 
0071 bool ksmbd_compare_user(struct ksmbd_user *u1, struct ksmbd_user *u2)
0072 {
0073     if (strcmp(u1->name, u2->name))
0074         return false;
0075     if (memcmp(u1->passkey, u2->passkey, u1->passkey_sz))
0076         return false;
0077 
0078     return true;
0079 }