0001
0002
0003
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 }