xref: /titanic_44/usr/src/common/smbclnt/smbfs_ntacl.h (revision 02d09e03eb27f3a2dc299de704e45dae5173f43f)
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