1*02d09e03SGordon Ross /* 2*02d09e03SGordon Ross * CDDL HEADER START 3*02d09e03SGordon Ross * 4*02d09e03SGordon Ross * The contents of this file are subject to the terms of the 5*02d09e03SGordon Ross * Common Development and Distribution License (the "License"). 6*02d09e03SGordon Ross * You may not use this file except in compliance with the License. 7*02d09e03SGordon Ross * 8*02d09e03SGordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*02d09e03SGordon Ross * or http://www.opensolaris.org/os/licensing. 10*02d09e03SGordon Ross * See the License for the specific language governing permissions 11*02d09e03SGordon Ross * and limitations under the License. 12*02d09e03SGordon Ross * 13*02d09e03SGordon Ross * When distributing Covered Code, include this CDDL HEADER in each 14*02d09e03SGordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*02d09e03SGordon Ross * If applicable, add the following below this CDDL HEADER, with the 16*02d09e03SGordon Ross * fields enclosed by brackets "[]" replaced with your own identifying 17*02d09e03SGordon Ross * information: Portions Copyright [yyyy] [name of copyright owner] 18*02d09e03SGordon Ross * 19*02d09e03SGordon Ross * CDDL HEADER END 20*02d09e03SGordon Ross */ 21*02d09e03SGordon Ross 22*02d09e03SGordon Ross /* 23*02d09e03SGordon Ross * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*02d09e03SGordon Ross * Use is subject to license terms. 25*02d09e03SGordon Ross */ 26*02d09e03SGordon Ross 27*02d09e03SGordon Ross #ifndef _SMBFS_NTACL_H 28*02d09e03SGordon Ross #define _SMBFS_NTACL_H 29*02d09e03SGordon Ross 30*02d09e03SGordon Ross /* 31*02d09e03SGordon Ross * Internal functions for dealing with 32*02d09e03SGordon Ross * NT Security data structures. 33*02d09e03SGordon Ross */ 34*02d09e03SGordon Ross 35*02d09e03SGordon Ross #include <netsmb/mchain.h> 36*02d09e03SGordon Ross 37*02d09e03SGordon Ross /* 38*02d09e03SGordon Ross * Internal form of an NT SID 39*02d09e03SGordon Ross * Same as on the wire, but possibly byte-swapped. 40*02d09e03SGordon Ross */ 41*02d09e03SGordon Ross typedef struct i_ntsid { 42*02d09e03SGordon Ross uint8_t sid_revision; 43*02d09e03SGordon Ross uint8_t sid_subauthcount; 44*02d09e03SGordon Ross uint8_t sid_authority[6]; 45*02d09e03SGordon Ross uint32_t sid_subauthvec[1]; /* actually len=subauthcount */ 46*02d09e03SGordon Ross } i_ntsid_t; 47*02d09e03SGordon Ross #define I_SID_SIZE(sacnt) (8 + 4 * (sacnt)) 48*02d09e03SGordon Ross 49*02d09e03SGordon Ross /* 50*02d09e03SGordon Ross * Internal form of an NT ACE 51*02d09e03SGordon Ross */ 52*02d09e03SGordon Ross typedef struct i_ntace { 53*02d09e03SGordon Ross uint8_t ace_type; 54*02d09e03SGordon Ross uint8_t ace_flags; 55*02d09e03SGordon Ross uint32_t ace_rights; /* generic, standard, specific, etc */ 56*02d09e03SGordon Ross i_ntsid_t *ace_sid; 57*02d09e03SGordon Ross } i_ntace_t; 58*02d09e03SGordon Ross 59*02d09e03SGordon Ross /* 60*02d09e03SGordon Ross * Internal form of an NT ACL (see sacl/dacl below) 61*02d09e03SGordon Ross */ 62*02d09e03SGordon Ross typedef struct i_ntacl { 63*02d09e03SGordon Ross uint8_t acl_revision; /* 0x02 observed with W2K */ 64*02d09e03SGordon Ross uint16_t acl_acecount; 65*02d09e03SGordon Ross i_ntace_t *acl_acevec[1]; /* actually, len=acecount */ 66*02d09e03SGordon Ross } i_ntacl_t; 67*02d09e03SGordon Ross 68*02d09e03SGordon Ross /* 69*02d09e03SGordon Ross * Internal form of an NT Security Descriptor (SD) 70*02d09e03SGordon Ross */ 71*02d09e03SGordon Ross typedef struct i_ntsd { 72*02d09e03SGordon Ross uint8_t sd_revision; /* 0x01 observed between W2K */ 73*02d09e03SGordon Ross uint8_t sd_rmctl; /* resource mgr control (MBZ) */ 74*02d09e03SGordon Ross uint16_t sd_flags; 75*02d09e03SGordon Ross i_ntsid_t *sd_owner; 76*02d09e03SGordon Ross i_ntsid_t *sd_group; 77*02d09e03SGordon Ross i_ntacl_t *sd_sacl; 78*02d09e03SGordon Ross i_ntacl_t *sd_dacl; 79*02d09e03SGordon Ross } i_ntsd_t; 80*02d09e03SGordon Ross 81*02d09e03SGordon Ross /* 82*02d09e03SGordon Ross * Import a raw SD (mb chain) into "internal" form. 83*02d09e03SGordon Ross * (like "absolute" form per. NT docs) 84*02d09e03SGordon Ross * Returns allocated data in sdp 85*02d09e03SGordon Ross */ 86*02d09e03SGordon Ross int md_get_ntsd(mdchain_t *mbp, i_ntsd_t **sdp); 87*02d09e03SGordon Ross 88*02d09e03SGordon Ross /* 89*02d09e03SGordon Ross * Export an "internal" SD into an raw SD (mb chain). 90*02d09e03SGordon Ross * (a.k.a "self-relative" form per. NT docs) 91*02d09e03SGordon Ross * Returns allocated mbchain in mbp. 92*02d09e03SGordon Ross */ 93*02d09e03SGordon Ross int mb_put_ntsd(mbchain_t *mbp, i_ntsd_t *sd); 94*02d09e03SGordon Ross 95*02d09e03SGordon Ross /* 96*02d09e03SGordon Ross * Convert an internal SD to a ZFS-style ACL. 97*02d09e03SGordon Ross * Get uid/gid too if pointers != NULL. 98*02d09e03SGordon Ross */ 99*02d09e03SGordon Ross #ifdef _KERNEL 100*02d09e03SGordon Ross int smbfs_acl_sd2zfs(i_ntsd_t *, vsecattr_t *, uid_t *, gid_t *); 101*02d09e03SGordon Ross #else /* _KERNEL */ 102*02d09e03SGordon Ross int smbfs_acl_sd2zfs(i_ntsd_t *, acl_t *, uid_t *, gid_t *); 103*02d09e03SGordon Ross #endif /* _KERNEL */ 104*02d09e03SGordon Ross 105*02d09e03SGordon Ross /* 106*02d09e03SGordon Ross * Convert an internal SD to a ZFS-style ACL. 107*02d09e03SGordon Ross * Include owner/group too if uid/gid != -1. 108*02d09e03SGordon Ross */ 109*02d09e03SGordon Ross #ifdef _KERNEL 110*02d09e03SGordon Ross int smbfs_acl_zfs2sd(vsecattr_t *, uid_t, gid_t, i_ntsd_t **); 111*02d09e03SGordon Ross #else /* _KERNEL */ 112*02d09e03SGordon Ross int smbfs_acl_zfs2sd(acl_t *, uid_t, gid_t, i_ntsd_t **); 113*02d09e03SGordon Ross #endif /* _KERNEL */ 114*02d09e03SGordon Ross 115*02d09e03SGordon Ross /* 116*02d09e03SGordon Ross * Free an i_ntsd_t, as returned by md_get_ntsd() 117*02d09e03SGordon Ross * or smbfs_acl_zfs2sd(). 118*02d09e03SGordon Ross */ 119*02d09e03SGordon Ross void smbfs_acl_free_sd(struct i_ntsd *); 120*02d09e03SGordon Ross 121*02d09e03SGordon Ross /* 122*02d09e03SGordon Ross * Convert an NT SID to string format. 123*02d09e03SGordon Ross */ 124*02d09e03SGordon Ross int smbfs_sid2str(i_ntsid_t *sid, 125*02d09e03SGordon Ross char *obuf, size_t olen, uint32_t *ridp); 126*02d09e03SGordon Ross 127*02d09e03SGordon Ross #endif /* _SMBFS_NTACL_H */ 128