da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or http://www.opensolaris.org/os/licensing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * General Structures Layout
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * -------------------------
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This is a simplified diagram showing the relationship between most of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * main structures.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SMB_INFO |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * v
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+ +-------------------+ +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SESSION |<----->| SESSION |......| SESSION |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+ +-------------------+ +-------------------+
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * | |
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * | |
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * | v
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * | +-------------------+ +-------------------+ +-------------------+
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * | | USER |<--->| USER |...| USER |
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * | +-------------------+ +-------------------+ +-------------------+
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * |
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * |
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * v
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+ +-------------------+ +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | TREE |<----->| TREE |......| TREE |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+ +-------------------+ +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | v
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | +-------+ +-------+ +-------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | | OFILE |<----->| OFILE |......| OFILE |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | +-------+ +-------+ +-------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * v
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------+ +------+ +------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | ODIR |<----->| ODIR |......| ODIR |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------+ +------+ +------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * User State Machine
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * ------------------
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * | T0: Creation/Allocation
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * | (1st session setup)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * v
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * +-----------------------------+
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * | SMB_USER_STATE_LOGGING_ON |<----------+
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * +-----------------------------+ addl. session setup
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * | | (more proc. required)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * | T2 | ^
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * | | | T1: (cont.)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * | +------->-------?
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * v | T3: (fail)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * +-----------------------------+ v
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * | SMB_USER_STATE_LOGGED_ON | (logged off)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-----------------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * | T4
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * v
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-----------------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SMB_USER_STATE_LOGGING_OFF |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-----------------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * | T5
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * v
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * +-----------------------------+ T6
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SMB_USER_STATE_LOGGED_OFF |----------> Deletion/Free
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-----------------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * SMB_USER_STATE_LOGGING_ON
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * While in this state:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * - The user is in the list of users for his session.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * - References will be given out ONLY for session setup.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * - This user can not access anything yet.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * SMB_USER_STATE_LOGGED_ON
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * While in this state:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * - The user is in the list of users for his session.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - References will be given out if the user is looked up.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The user can access files and pipes.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * SMB_USER_STATE_LOGGING_OFF
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * While in this state:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * - The user is in the list of users for his session.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - References will not be given out if the user is looked up.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The trees the user connected are being disconnected.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The resources associated with the user remain.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * SMB_USER_STATE_LOGGED_OFF
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * While in this state:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The user is queued in the list of users of his session.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - References will not be given out if the user is looked up.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The user has no more trees connected.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The resources associated with the user remain.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Transition T0
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * First request in an SMB Session Setup sequence creates a
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * new user object and adds it to the list of users for
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * this session. User UID is assigned and returned.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Transition T1
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Subsequent SMB Session Setup requests (on the same UID
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * assigned in T0) update the state of this user object,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * communicating with smbd for the crypto work.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Transition T2
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * If the SMB Session Setup sequence is successful, T2
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * makes the new user object available for requests.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Transition T3
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * If an Session Setup request gets an error other than
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * the expected "more processing required", then T3
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * leads to state "LOGGED_OFF" and then tear-down of the
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * partially constructed user.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Transition T4
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Normal SMB User Logoff request, or session tear-down.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Transition T5
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This transition occurs in smb_user_release(). The resources associated
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * with the user are deleted as well as the user. For the transition to
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * occur, the user must be in the SMB_USER_STATE_LOGGED_OFF state and the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * reference count be zero.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Comments
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * --------
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The state machine of the user structures is controlled by 3 elements:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The list of users of the session he belongs to.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The mutex embedded in the structure itself.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The reference count.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * There's a mutex embedded in the user structure used to protect its fields
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and there's a lock embedded in the list of users of a session. To
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * increment or to decrement the reference count the mutex must be entered.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * To insert the user into the list of users of the session and to remove
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * the user from it, the lock must be entered in RW_WRITER mode.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Rules of access to a user structure:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 1) In order to avoid deadlocks, when both (mutex and lock of the session
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * list) have to be entered, the lock must be entered first.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 2) All actions applied to a user require a reference count.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 3) There are 2 ways of getting a reference count. One is when the user
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * logs in. The other when the user is looked up.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * It should be noted that the reference count of a user registers the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * number of references to the user in other structures (such as an smb
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * request). The reference count is not incremented in these 2 instances:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 1) The user is logged in. An user is anchored by his state. If there's
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * no activity involving a user currently logged in, the reference
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * count of that user is zero.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 2) The user is queued in the list of users of the session. The fact of
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * being queued in that list is NOT registered by incrementing the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * reference count.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <sys/types.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <sys/sid.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <sys/priv_names.h>
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown#include <smbsrv/smb_kproto.h>
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States#include <smbsrv/smb_door.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego#define ADMINISTRATORS_SID "S-1-5-32-544"
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownstatic int smb_user_enum_private(smb_user_t *, smb_svcenum_t *);
8622ec4569457733001d4982ef7f5b44427069beGordon Rossstatic void smb_user_auth_logoff(smb_user_t *);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Create a new user.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_user_t *
12b65585e720714b31036daaa2b30eb76014048eGordon Rosssmb_user_new(smb_session_t *session)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_user_t *user;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(session);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(session->s_magic == SMB_SESSION_MAGIC);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
8622ec4569457733001d4982ef7f5b44427069beGordon Ross user = kmem_cache_alloc(smb_cache_user, KM_SLEEP);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw bzero(user, sizeof (smb_user_t));
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw user->u_refcnt = 1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw user->u_session = session;
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb user->u_server = session->s_server;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw user->u_logon_time = gethrestime_sec();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (smb_idpool_alloc(&session->s_uid_pool, &user->u_uid))
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto errout;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross mutex_init(&user->u_mutex, NULL, MUTEX_DEFAULT, NULL);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross user->u_state = SMB_USER_STATE_LOGGING_ON;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross user->u_magic = SMB_USER_MAGIC;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smb_llist_enter(&session->s_user_list, RW_WRITER);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smb_llist_insert_tail(&session->s_user_list, user);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smb_llist_exit(&session->s_user_list);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smb_server_inc_users(session->s_server);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (user);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Rosserrout:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (user->u_uid != 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smb_idpool_free(&session->s_uid_pool, user->u_uid);
8622ec4569457733001d4982ef7f5b44427069beGordon Ross kmem_cache_free(smb_cache_user, user);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Fill in the details of a user, meaning a transition
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * from state LOGGING_ON to state LOGGED_ON.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
12b65585e720714b31036daaa2b30eb76014048eGordon Rossint
12b65585e720714b31036daaa2b30eb76014048eGordon Rosssmb_user_logon(
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smb_user_t *user,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross cred_t *cr,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross char *domain_name,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross char *account_name,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross uint32_t flags,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross uint32_t privileges,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross uint32_t audit_sid)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross ASSERT(user->u_magic == SMB_USER_MAGIC);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross ASSERT(cr);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross ASSERT(account_name);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross ASSERT(domain_name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross mutex_enter(&user->u_mutex);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (user->u_state != SMB_USER_STATE_LOGGING_ON) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross mutex_exit(&user->u_mutex);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (-1);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smb_authsock_close(user);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross user->u_state = SMB_USER_STATE_LOGGED_ON;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross user->u_flags = flags;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross user->u_name_len = strlen(account_name) + 1;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross user->u_domain_len = strlen(domain_name) + 1;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross user->u_name = smb_mem_strdup(account_name);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross user->u_domain = smb_mem_strdup(domain_name);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross user->u_audit_sid = audit_sid;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smb_user_setcred(user, cr, privileges);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross mutex_exit(&user->u_mutex);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_user_logoff
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * Change the user state and disconnect trees.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * The user list must not be entered or modified here.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_user_logoff(
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_user_t *user)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(user->u_magic == SMB_USER_MAGIC);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_enter(&user->u_mutex);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(user->u_refcnt);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (user->u_state) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case SMB_USER_STATE_LOGGING_ON: {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smb_authsock_close(user);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross user->u_state = SMB_USER_STATE_LOGGED_OFF;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smb_server_dec_users(user->u_server);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross break;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case SMB_USER_STATE_LOGGED_ON: {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The user is moved into a state indicating that the log off
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * process has started.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw user->u_state = SMB_USER_STATE_LOGGING_OFF;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_exit(&user->u_mutex);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_session_disconnect_owned_trees(user->u_session, user);
8622ec4569457733001d4982ef7f5b44427069beGordon Ross smb_user_auth_logoff(user);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_enter(&user->u_mutex);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw user->u_state = SMB_USER_STATE_LOGGED_OFF;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_server_dec_users(user->u_server);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case SMB_USER_STATE_LOGGED_OFF:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case SMB_USER_STATE_LOGGING_OFF:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw default:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_exit(&user->u_mutex);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown/*
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * Take a reference on a user. Do not return a reference unless the user is in
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * the logged-in state.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown */
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownboolean_t
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_user_hold(smb_user_t *user)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser SMB_USER_VALID(user);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown mutex_enter(&user->u_mutex);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (user->u_state == SMB_USER_STATE_LOGGED_ON) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown user->u_refcnt++;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown mutex_exit(&user->u_mutex);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (B_TRUE);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown mutex_exit(&user->u_mutex);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (B_FALSE);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser/*
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * Unconditionally take a reference on a user.
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser */
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiservoid
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keisersmb_user_hold_internal(smb_user_t *user)
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser{
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser SMB_USER_VALID(user);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser mutex_enter(&user->u_mutex);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser user->u_refcnt++;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser mutex_exit(&user->u_mutex);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser}
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Release a reference on a user. If the reference count falls to
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * zero and the user has logged off, post the object for deletion.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Object deletion is deferred to avoid modifying a list while an
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * iteration may be in progress.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_user_release(
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_user_t *user)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(user->u_magic == SMB_USER_MAGIC);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_enter(&user->u_mutex);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(user->u_refcnt);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw user->u_refcnt--;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (user->u_state) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case SMB_USER_STATE_LOGGED_OFF:
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (user->u_refcnt == 0)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_session_post_user(user->u_session, user);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case SMB_USER_STATE_LOGGING_ON:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case SMB_USER_STATE_LOGGED_ON:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case SMB_USER_STATE_LOGGING_OFF:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw default:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_exit(&user->u_mutex);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Determine whether or not the user is an administrator.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Members of the administrators group have administrative rights.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregoboolean_t
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmb_user_is_admin(smb_user_t *user)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#ifdef _KERNEL
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char sidstr[SMB_SID_STRSZ];
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ksidlist_t *ksidlist;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ksid_t ksid1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ksid_t *ksid2;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int i;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#endif /* _KERNEL */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross boolean_t rc = B_FALSE;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego ASSERT(user);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ASSERT(user->u_cred);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (SMB_USER_IS_ADMIN(user))
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (B_TRUE);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#ifdef _KERNEL
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright bzero(&ksid1, sizeof (ksid_t));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) strlcpy(sidstr, ADMINISTRATORS_SID, SMB_SID_STRSZ);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ASSERT(smb_sid_splitstr(sidstr, &ksid1.ks_rid) == 0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ksid1.ks_domain = ksid_lookupdomain(sidstr);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ksidlist = crgetsidlist(user->u_cred);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ASSERT(ksidlist);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ASSERT(ksid1.ks_domain);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ASSERT(ksid1.ks_domain->kd_name);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright i = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ksid2 = crgetsid(user->u_cred, KSID_USER);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright do {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ASSERT(ksid2->ks_domain);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ASSERT(ksid2->ks_domain->kd_name);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (strcmp(ksid1.ks_domain->kd_name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ksid2->ks_domain->kd_name) == 0 &&
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ksid1.ks_rid == ksid2->ks_rid) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright user->u_flags |= SMB_USER_FLAG_ADMIN;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = B_TRUE;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ksid2 = &ksidlist->ksl_sids[i];
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright } while (i++ < ksidlist->ksl_nsid);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ksid_rele(&ksid1);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#endif /* _KERNEL */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (rc);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown/*
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * This function should be called with a hold on the user.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown */
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownboolean_t
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_user_namecmp(smb_user_t *user, const char *name)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown char *fq_name;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown boolean_t match;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown if (smb_strcasecmp(name, user->u_name, 0) == 0)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (B_TRUE);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown fq_name = kmem_alloc(MAXNAMELEN, KM_SLEEP);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown (void) snprintf(fq_name, MAXNAMELEN, "%s\\%s",
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown user->u_domain, user->u_name);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown match = (smb_strcasecmp(name, fq_name, 0) == 0);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (!match) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown (void) snprintf(fq_name, MAXNAMELEN, "%s@%s",
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown user->u_name, user->u_domain);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown match = (smb_strcasecmp(name, fq_name, 0) == 0);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown kmem_free(fq_name, MAXNAMELEN);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (match);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown/*
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * If the enumeration request is for user data, handle the request
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * here. Otherwise, pass it on to the trees.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown *
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * This function should be called with a hold on the user.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown */
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownint
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_user_enum(smb_user_t *user, smb_svcenum_t *svcenum)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser int rc = 0;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(user);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(user->u_magic == SMB_USER_MAGIC);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (svcenum->se_type == SMB_SVCENUM_TYPE_USER)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (smb_user_enum_private(user, svcenum));
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (rc);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* *************************** Static Functions ***************************** */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Delete a user. The tree list should be empty.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States *
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Remove the user from the session's user list before freeing resources
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * associated with the user.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesvoid
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_user_delete(void *arg)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_session_t *session;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_user_t *user = (smb_user_t *)arg;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_USER_VALID(user);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(user->u_refcnt == 0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(user->u_state == SMB_USER_STATE_LOGGED_OFF);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross ASSERT(user->u_authsock == NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw session = user->u_session;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_llist_enter(&session->s_user_list, RW_WRITER);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_llist_remove(&session->s_user_list, user);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_free(&session->s_uid_pool, user->u_uid);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_llist_exit(&session->s_user_list);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&user->u_mutex);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&user->u_mutex);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw user->u_magic = (uint32_t)~SMB_USER_MAGIC;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_destroy(&user->u_mutex);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (user->u_cred)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright crfree(user->u_cred);
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States if (user->u_privcred)
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States crfree(user->u_privcred);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_free(user->u_name);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_free(user->u_domain);
8622ec4569457733001d4982ef7f5b44427069beGordon Ross kmem_cache_free(smb_cache_user, user);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United Statescred_t *
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United Statessmb_user_getcred(smb_user_t *user)
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States{
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States return (user->u_cred);
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States}
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United Statescred_t *
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United Statessmb_user_getprivcred(smb_user_t *user)
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States{
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States return ((user->u_privcred)? user->u_privcred : user->u_cred);
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#ifdef _KERNEL
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Assign the user cred and privileges.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * If the user has backup and/or restore privleges, dup the cred
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * and add those privileges to this new privileged cred.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmb_user_setcred(smb_user_t *user, cred_t *cr, uint32_t privileges)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright cred_t *privcred = NULL;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ASSERT(cr);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright crhold(cr);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (privileges & (SMB_USER_PRIV_BACKUP | SMB_USER_PRIV_RESTORE))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright privcred = crdup(cr);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (privcred != NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (privileges & SMB_USER_PRIV_BACKUP) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) crsetpriv(privcred, PRIV_FILE_DAC_READ,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright PRIV_FILE_DAC_SEARCH, PRIV_SYS_MOUNT, NULL);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (privileges & SMB_USER_PRIV_RESTORE) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) crsetpriv(privcred, PRIV_FILE_DAC_WRITE,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright PRIV_FILE_CHOWN, PRIV_FILE_CHOWN_SELF,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright PRIV_FILE_DAC_SEARCH, PRIV_FILE_LINK_ANY,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright PRIV_FILE_OWNER, PRIV_FILE_SETID,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright PRIV_SYS_LINKDIR, PRIV_SYS_MOUNT, NULL);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright user->u_cred = cr;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright user->u_privcred = privcred;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright user->u_privileges = privileges;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#endif /* _KERNEL */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown/*
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * Private function to support smb_user_enum.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown */
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownstatic int
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_user_enum_private(smb_user_t *user, smb_svcenum_t *svcenum)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown uint8_t *pb;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown uint_t nbytes;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown int rc;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (svcenum->se_nskip > 0) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown svcenum->se_nskip--;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (0);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (svcenum->se_nitems >= svcenum->se_nlimit) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown svcenum->se_nitems = svcenum->se_nlimit;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (0);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown pb = &svcenum->se_buf[svcenum->se_bused];
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown rc = smb_user_netinfo_encode(user, pb, svcenum->se_bavail, &nbytes);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (rc == 0) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown svcenum->se_bavail -= nbytes;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown svcenum->se_bused += nbytes;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown svcenum->se_nitems++;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (rc);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown/*
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * Encode the NetInfo for a user into a buffer. NetInfo contains
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * information that is often needed in user space to support RPC
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * requests.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown */
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownint
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_user_netinfo_encode(smb_user_t *user, uint8_t *buf, size_t buflen,
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown uint32_t *nbytes)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_netuserinfo_t info;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown int rc;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_user_netinfo_init(user, &info);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown rc = smb_netuserinfo_encode(&info, buf, buflen, nbytes);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_user_netinfo_fini(&info);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (rc);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownvoid
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_user_netinfo_init(smb_user_t *user, smb_netuserinfo_t *info)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_session_t *session;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown char *buf;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(user);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(user->u_domain);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(user->u_name);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown session = user->u_session;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(session);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(session->workstation);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ui_session_id = session->s_kid;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ui_native_os = session->native_os;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ui_ipaddr = session->ipaddr;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ui_numopens = session->s_file_cnt;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai info->ui_smb_uid = user->u_uid;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ui_logon_time = user->u_logon_time;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ui_flags = user->u_flags;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai info->ui_posix_uid = crgetuid(user->u_cred);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ui_domain_len = user->u_domain_len;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States info->ui_domain = smb_mem_strdup(user->u_domain);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ui_account_len = user->u_name_len;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States info->ui_account = smb_mem_strdup(user->u_name);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown buf = kmem_alloc(MAXNAMELEN, KM_SLEEP);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_session_getclient(session, buf, MAXNAMELEN);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ui_workstation_len = strlen(buf) + 1;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States info->ui_workstation = smb_mem_strdup(buf);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown kmem_free(buf, MAXNAMELEN);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownvoid
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_user_netinfo_fini(smb_netuserinfo_t *info)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (info == NULL)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (info->ui_domain)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_free(info->ui_domain);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (info->ui_account)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_free(info->ui_account);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (info->ui_workstation)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_free(info->ui_workstation);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown bzero(info, sizeof (smb_netuserinfo_t));
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesstatic void
8622ec4569457733001d4982ef7f5b44427069beGordon Rosssmb_user_auth_logoff(smb_user_t *user)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
8622ec4569457733001d4982ef7f5b44427069beGordon Ross uint32_t audit_sid = user->u_audit_sid;
8622ec4569457733001d4982ef7f5b44427069beGordon Ross
8622ec4569457733001d4982ef7f5b44427069beGordon Ross (void) smb_kdoor_upcall(user->u_server, SMB_DR_USER_AUTH_LOGOFF,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States &audit_sid, xdr_uint32_t, NULL, NULL);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}