162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2018 Samsung Electronics Co., Ltd. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/slab.h> 762306a36Sopenharmony_ci#include <linux/mm.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "user_config.h" 1062306a36Sopenharmony_ci#include "../transport_ipc.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistruct ksmbd_user *ksmbd_login_user(const char *account) 1362306a36Sopenharmony_ci{ 1462306a36Sopenharmony_ci struct ksmbd_login_response *resp; 1562306a36Sopenharmony_ci struct ksmbd_user *user = NULL; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci resp = ksmbd_ipc_login_request(account); 1862306a36Sopenharmony_ci if (!resp) 1962306a36Sopenharmony_ci return NULL; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci if (!(resp->status & KSMBD_USER_FLAG_OK)) 2262306a36Sopenharmony_ci goto out; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci user = ksmbd_alloc_user(resp); 2562306a36Sopenharmony_ciout: 2662306a36Sopenharmony_ci kvfree(resp); 2762306a36Sopenharmony_ci return user; 2862306a36Sopenharmony_ci} 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistruct ksmbd_user *ksmbd_alloc_user(struct ksmbd_login_response *resp) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci struct ksmbd_user *user = NULL; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci user = kmalloc(sizeof(struct ksmbd_user), GFP_KERNEL); 3562306a36Sopenharmony_ci if (!user) 3662306a36Sopenharmony_ci return NULL; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci user->name = kstrdup(resp->account, GFP_KERNEL); 3962306a36Sopenharmony_ci user->flags = resp->status; 4062306a36Sopenharmony_ci user->gid = resp->gid; 4162306a36Sopenharmony_ci user->uid = resp->uid; 4262306a36Sopenharmony_ci user->passkey_sz = resp->hash_sz; 4362306a36Sopenharmony_ci user->passkey = kmalloc(resp->hash_sz, GFP_KERNEL); 4462306a36Sopenharmony_ci if (user->passkey) 4562306a36Sopenharmony_ci memcpy(user->passkey, resp->hash, resp->hash_sz); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci if (!user->name || !user->passkey) { 4862306a36Sopenharmony_ci kfree(user->name); 4962306a36Sopenharmony_ci kfree(user->passkey); 5062306a36Sopenharmony_ci kfree(user); 5162306a36Sopenharmony_ci user = NULL; 5262306a36Sopenharmony_ci } 5362306a36Sopenharmony_ci return user; 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_civoid ksmbd_free_user(struct ksmbd_user *user) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci ksmbd_ipc_logout_request(user->name, user->flags); 5962306a36Sopenharmony_ci kfree(user->name); 6062306a36Sopenharmony_ci kfree(user->passkey); 6162306a36Sopenharmony_ci kfree(user); 6262306a36Sopenharmony_ci} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ciint ksmbd_anonymous_user(struct ksmbd_user *user) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci if (user->name[0] == '\0') 6762306a36Sopenharmony_ci return 1; 6862306a36Sopenharmony_ci return 0; 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cibool ksmbd_compare_user(struct ksmbd_user *u1, struct ksmbd_user *u2) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci if (strcmp(u1->name, u2->name)) 7462306a36Sopenharmony_ci return false; 7562306a36Sopenharmony_ci if (memcmp(u1->passkey, u2->passkey, u1->passkey_sz)) 7662306a36Sopenharmony_ci return false; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci return true; 7962306a36Sopenharmony_ci} 80