1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SMB_TOKEN_H 27 #define _SMB_TOKEN_H 28 29 #pragma ident "%Z%%M% %I% %E% SMI" 30 31 #include <smbsrv/netrauth.h> 32 #include <smbsrv/smb_privilege.h> 33 #include <smbsrv/smb_sid.h> 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 /* 40 * User Session Key 41 * 42 * This is part of the MAC key which is required for signing SMB messages. 43 */ 44 typedef struct smb_session_key { 45 uint8_t data[16]; 46 } smb_session_key_t; 47 48 /* 49 * Access Token 50 * 51 * An access token identifies a user, the user's privileges and the 52 * list of groups of which the user is a member. This information is 53 * used when access is requested to an object by comparing this 54 * information with the DACL in the object's security descriptor. 55 * 56 * Only group attributes are defined. No user attributes defined. 57 */ 58 59 #define SE_GROUP_MANDATORY 0x00000001 60 #define SE_GROUP_ENABLED_BY_DEFAULT 0x00000002 61 #define SE_GROUP_ENABLED 0x00000004 62 #define SE_GROUP_OWNER 0x00000008 63 #define SE_GROUP_USE_FOR_DENY_ONLY 0x00000010 64 #define SE_GROUP_LOGON_ID 0xC0000000 65 66 typedef struct smb_sid_attrs { 67 uint32_t attrs; 68 smb_sid_t *sid; 69 } smb_sid_attrs_t; 70 71 /* 72 * smb_id_t consists of both the Windows security identifier 73 * and its corresponding POSIX/ephemeral ID. 74 */ 75 typedef struct smb_id { 76 smb_sid_attrs_t i_sidattr; 77 uid_t i_id; 78 } smb_id_t; 79 80 /* 81 * Windows groups (each group SID is associated with a POSIX/ephemeral 82 * gid. 83 */ 84 typedef struct smb_win_grps { 85 uint16_t wg_count; 86 smb_id_t wg_groups[ANY_SIZE_ARRAY]; 87 } smb_win_grps_t; 88 89 /* 90 * Access Token Flags 91 * 92 * SMB_ATF_GUEST Token belongs to guest user 93 * SMB_ATF_ANON Token belongs to anonymous user 94 * and it's only good for IPC Connection. 95 * SMB_ATF_POWERUSER Token belongs to a Power User member 96 * SMB_ATF_BACKUPOP Token belongs to a Power User member 97 * SMB_ATF_ADMIN Token belongs to a Domain Admins member 98 */ 99 #define SMB_ATF_GUEST 0x00000001 100 #define SMB_ATF_ANON 0x00000002 101 #define SMB_ATF_POWERUSER 0x00000004 102 #define SMB_ATF_BACKUPOP 0x00000008 103 #define SMB_ATF_ADMIN 0x00000010 104 105 #define SMB_POSIX_GRPS_SIZE(n) \ 106 (sizeof (smb_posix_grps_t) + (n - 1) * sizeof (gid_t)) 107 /* 108 * It consists of the primary and supplementary POSIX groups. 109 */ 110 typedef struct smb_posix_grps { 111 uint32_t pg_ngrps; 112 gid_t pg_grps[ANY_SIZE_ARRAY]; 113 } smb_posix_grps_t; 114 115 /* 116 * Token Structure. 117 * 118 * This structure contains information of a user. There should be one 119 * unique token per user per session per client. The information 120 * provided will either give or deny access to shares, files or folders. 121 */ 122 typedef struct smb_token { 123 smb_id_t *tkn_user; 124 smb_id_t *tkn_owner; 125 smb_id_t *tkn_primary_grp; 126 smb_win_grps_t *tkn_win_grps; 127 smb_privset_t *tkn_privileges; 128 char *tkn_account_name; 129 char *tkn_domain_name; 130 uint32_t tkn_flags; 131 uint32_t tkn_audit_sid; 132 smb_session_key_t *tkn_session_key; 133 smb_posix_grps_t *tkn_posix_grps; 134 } smb_token_t; 135 136 /* 137 * This is the max buffer length for holding certain fields of 138 * any access token: domain, account, workstation, and IP with the 139 * format as show below: 140 * [domain name]\[user account] [workstation] (IP) 141 * 142 * This is not meant to be the maximum buffer length for holding 143 * the entire context of a token. 144 */ 145 #define NTTOKEN_BASIC_INFO_MAXLEN (SMB_PI_MAX_DOMAIN + SMB_PI_MAX_USERNAME \ 146 + SMB_PI_MAX_HOST + INET_ADDRSTRLEN + 8) 147 148 /* 149 * Information returned by an RPC call is allocated on an internal heap 150 * which is deallocated before returning from the interface call. The 151 * smb_userinfo structure provides a useful common mechanism to get the 152 * information back to the caller. It's like a compact access token but 153 * only parts of it are filled in by each RPC so the content is call 154 * specific. 155 */ 156 typedef struct smb_rid_attrs { 157 uint32_t rid; 158 uint32_t attributes; 159 } smb_rid_attrs_t; 160 161 #define SMB_UINFO_FLAG_ANON 0x01 162 #define SMB_UINFO_FLAG_LADMIN 0x02 /* Local admin */ 163 #define SMB_UINFO_FLAG_DADMIN 0x04 /* Domain admin */ 164 #define SMB_UINFO_FLAG_ADMIN (SMB_UINFO_FLAG_LADMIN | SMB_UINFO_FLAG_DADMIN) 165 166 /* 167 * This structure is mainly used where there's some 168 * kind of user related interaction with a domain 169 * controller via different RPC calls. 170 */ 171 typedef struct smb_userinfo { 172 uint16_t sid_name_use; 173 uint32_t rid; 174 uint32_t primary_group_rid; 175 char *name; 176 char *domain_name; 177 smb_sid_t *domain_sid; 178 uint32_t n_groups; 179 smb_rid_attrs_t *groups; 180 uint32_t n_other_grps; 181 smb_sid_attrs_t *other_grps; 182 smb_session_key_t *session_key; 183 184 smb_sid_t *user_sid; 185 smb_sid_t *pgrp_sid; 186 uint32_t flags; 187 } smb_userinfo_t; 188 189 /* XDR routines */ 190 extern bool_t xdr_smb_session_key_t(); 191 extern bool_t xdr_netr_client_t(); 192 extern bool_t xdr_smb_sid_t(); 193 extern bool_t xdr_smb_sid_attrs_t(); 194 extern bool_t xdr_smb_id_t(); 195 extern bool_t xdr_smb_win_grps_t(); 196 extern bool_t xdr_smb_posix_grps_t(); 197 extern bool_t xdr_smb_token_t(); 198 199 200 #ifndef _KERNEL 201 smb_token_t *smb_logon(netr_client_t *clnt); 202 void smb_token_destroy(smb_token_t *token); 203 uint8_t *smb_token_mkselfrel(smb_token_t *obj, uint32_t *len); 204 netr_client_t *netr_client_mkabsolute(uint8_t *buf, uint32_t len); 205 void netr_client_xfree(netr_client_t *); 206 void smb_token_log(smb_token_t *token); 207 #else /* _KERNEL */ 208 smb_token_t *smb_token_mkabsolute(uint8_t *buf, uint32_t len); 209 void smb_token_free(smb_token_t *token); 210 uint8_t *netr_client_mkselfrel(netr_client_t *obj, uint32_t *len); 211 #endif /* _KERNEL */ 212 213 int smb_token_query_privilege(smb_token_t *token, int priv_id); 214 215 #ifdef __cplusplus 216 } 217 #endif 218 219 220 #endif /* _SMB_TOKEN_H */ 221