xref: /onnv-gate/usr/src/common/smbsrv/smb_token_xdr.c (revision 11963:061945695ce1)
15331Samw /*
25331Samw  * CDDL HEADER START
35331Samw  *
45331Samw  * The contents of this file are subject to the terms of the
55331Samw  * Common Development and Distribution License (the "License").
65331Samw  * You may not use this file except in compliance with the License.
75331Samw  *
85331Samw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95331Samw  * or http://www.opensolaris.org/os/licensing.
105331Samw  * See the License for the specific language governing permissions
115331Samw  * and limitations under the License.
125331Samw  *
135331Samw  * When distributing Covered Code, include this CDDL HEADER in each
145331Samw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155331Samw  * If applicable, add the following below this CDDL HEADER, with the
165331Samw  * fields enclosed by brackets "[]" replaced with your own identifying
175331Samw  * information: Portions Copyright [yyyy] [name of copyright owner]
185331Samw  *
195331Samw  * CDDL HEADER END
205331Samw  */
215331Samw /*
22*11963SAfshin.Ardakani@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
235331Samw  * Use is subject to license terms.
245331Samw  */
255331Samw 
265331Samw /*
275331Samw  * This file was originally generated using rpcgen.
285331Samw  */
295331Samw 
305331Samw #ifndef _KERNEL
315331Samw #include <stdlib.h>
325331Samw #endif /* !_KERNEL */
335331Samw #include <smbsrv/wintypes.h>
346432Sas200622 #include <smbsrv/smb_sid.h>
355331Samw #include <smbsrv/smb_xdr.h>
365331Samw #include <smbsrv/smb_token.h>
375331Samw 
38*11963SAfshin.Ardakani@Sun.COM static bool_t smb_privset_xdr(XDR *, smb_privset_t *);
39*11963SAfshin.Ardakani@Sun.COM static bool_t smb_sid_xdr(XDR *, smb_sid_t *);
405331Samw 
418670SJose.Borrego@Sun.COM static bool_t
smb_privset_helper_xdr(XDR * xdrs,char ** privs)42*11963SAfshin.Ardakani@Sun.COM smb_privset_helper_xdr(XDR *xdrs, char **privs)
435331Samw {
445331Samw 	uint32_t pos, len;
455331Samw 	uint32_t cnt;
465331Samw 	bool_t rc;
475331Samw 	smb_privset_t *p;
485331Samw 
495331Samw 	if (xdrs->x_op == XDR_DECODE) {
505331Samw 		pos = xdr_getpos(xdrs);
515331Samw 
525331Samw 		if (!xdr_bool(xdrs, &rc))
535331Samw 			return (FALSE);
545331Samw 
555331Samw 		if (!xdr_uint32_t(xdrs, &cnt))
565331Samw 			return (FALSE);
575331Samw 
585331Samw 		rc = xdr_setpos(xdrs, pos);
595331Samw 
605331Samw 		if (rc == FALSE)
615331Samw 			return (FALSE);
625331Samw 	} else {
635331Samw 		if (*privs == NULL)
645331Samw 			return (FALSE);
655331Samw 
665331Samw 		p = (smb_privset_t *)(uintptr_t)*privs;
675331Samw 		cnt = p->priv_cnt;
685331Samw 	}
695331Samw 
705331Samw 	len = sizeof (smb_privset_t)
715331Samw 	    - sizeof (smb_luid_attrs_t)
725331Samw 	    + (cnt * sizeof (smb_luid_attrs_t));
735331Samw 
74*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_pointer(xdrs, privs, len, (xdrproc_t)smb_privset_xdr))
755331Samw 		return (FALSE);
765331Samw 
775331Samw 	return (TRUE);
785331Samw }
795331Samw 
808670SJose.Borrego@Sun.COM static bool_t
smb_id_xdr(XDR * xdrs,smb_id_t * objp)81*11963SAfshin.Ardakani@Sun.COM smb_id_xdr(XDR *xdrs, smb_id_t *objp)
825331Samw {
838670SJose.Borrego@Sun.COM 	uint8_t len;
845331Samw 
858670SJose.Borrego@Sun.COM 	if ((xdrs->x_op == XDR_ENCODE) || (xdrs->x_op == XDR_FREE))
868670SJose.Borrego@Sun.COM 		len = smb_sid_len(objp->i_sid);
875331Samw 
888670SJose.Borrego@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->i_attrs))
898670SJose.Borrego@Sun.COM 		return (FALSE);
908670SJose.Borrego@Sun.COM 
918670SJose.Borrego@Sun.COM 	if (!xdr_uint8_t(xdrs, &len))
928670SJose.Borrego@Sun.COM 		return (FALSE);
935331Samw 
948670SJose.Borrego@Sun.COM 	if (!xdr_pointer(xdrs, (char **)&objp->i_sid, len,
95*11963SAfshin.Ardakani@Sun.COM 	    (xdrproc_t)smb_sid_xdr))
968670SJose.Borrego@Sun.COM 		return (FALSE);
975331Samw 
988670SJose.Borrego@Sun.COM 	if (!xdr_uint32_t(xdrs, (uint32_t *)&objp->i_id))
995331Samw 		return (FALSE);
1005331Samw 
1015331Samw 	return (TRUE);
1025331Samw }
1035331Samw 
1048670SJose.Borrego@Sun.COM static bool_t
smb_ids_xdr(XDR * xdrs,smb_ids_t * objp)105*11963SAfshin.Ardakani@Sun.COM smb_ids_xdr(XDR *xdrs, smb_ids_t *objp)
1065331Samw {
1078670SJose.Borrego@Sun.COM 	if (!xdr_array(xdrs, (char **)&objp->i_ids, (uint32_t *)&objp->i_cnt,
108*11963SAfshin.Ardakani@Sun.COM 	    ~0, sizeof (smb_id_t), (xdrproc_t)smb_id_xdr))
1095331Samw 		return (FALSE);
1108670SJose.Borrego@Sun.COM 
1115331Samw 	return (TRUE);
1125331Samw }
1135331Samw 
1148670SJose.Borrego@Sun.COM static bool_t
smb_posix_grps_xdr(XDR * xdrs,smb_posix_grps_t * objp)115*11963SAfshin.Ardakani@Sun.COM smb_posix_grps_xdr(XDR *xdrs, smb_posix_grps_t *objp)
1165331Samw {
1175331Samw 	if (!xdr_uint32_t(xdrs, &objp->pg_ngrps))
1185331Samw 		return (FALSE);
1195331Samw 	if (!xdr_vector(xdrs, (char *)objp->pg_grps, objp->pg_ngrps,
120*11963SAfshin.Ardakani@Sun.COM 	    sizeof (uint32_t), (xdrproc_t)xdr_uint32_t))
1215331Samw 		return (FALSE);
1225331Samw 	return (TRUE);
1235331Samw }
1245331Samw 
1258670SJose.Borrego@Sun.COM static bool_t
smb_posix_grps_helper_xdr(XDR * xdrs,char ** identity)126*11963SAfshin.Ardakani@Sun.COM smb_posix_grps_helper_xdr(XDR *xdrs, char **identity)
1275331Samw {
1285331Samw 	uint32_t pos, len;
1295331Samw 	uint32_t cnt;
1305331Samw 	bool_t rc;
1315331Samw 
1325331Samw 	if (xdrs->x_op == XDR_DECODE) {
1335331Samw 		pos = xdr_getpos(xdrs);
1345331Samw 
1355331Samw 		if (!xdr_bool(xdrs, &rc))
1365331Samw 			return (FALSE);
1375331Samw 
1385331Samw 		if (!xdr_uint32_t(xdrs, &cnt))
1395331Samw 			return (FALSE);
1405331Samw 
1415331Samw 		rc = xdr_setpos(xdrs, pos);
1425331Samw 		if (rc == FALSE)
1435331Samw 			return (FALSE);
1445331Samw 	} else {
1455331Samw 		if (*identity == NULL)
1465331Samw 			return (FALSE);
1475331Samw 		cnt = ((smb_posix_grps_t *)(uintptr_t)*identity)->pg_ngrps;
1485331Samw 	}
1495331Samw 
1505331Samw 	len = SMB_POSIX_GRPS_SIZE(cnt);
1515331Samw 
152*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_pointer(xdrs, identity, len, (xdrproc_t)smb_posix_grps_xdr))
1535331Samw 		return (FALSE);
1545331Samw 	return (TRUE);
1555331Samw }
1565331Samw 
1578670SJose.Borrego@Sun.COM static bool_t
smb_session_key_xdr(XDR * xdrs,smb_session_key_t * objp)158*11963SAfshin.Ardakani@Sun.COM smb_session_key_xdr(XDR *xdrs, smb_session_key_t *objp)
1595331Samw {
1605331Samw 	if (!xdr_vector(xdrs, (char *)objp->data, 16,
1615331Samw 	    sizeof (uint8_t), (xdrproc_t)xdr_uint8_t))
1625331Samw 		return (FALSE);
1635331Samw 	return (TRUE);
1645331Samw }
1655331Samw 
1665331Samw bool_t
smb_logon_xdr(XDR * xdrs,smb_logon_t * objp)167*11963SAfshin.Ardakani@Sun.COM smb_logon_xdr(XDR *xdrs, smb_logon_t *objp)
1685331Samw {
169*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint16_t(xdrs, &objp->lg_level))
170*11963SAfshin.Ardakani@Sun.COM 		return (FALSE);
171*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->lg_username, ~0))
1725331Samw 		return (FALSE);
173*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->lg_domain, ~0))
174*11963SAfshin.Ardakani@Sun.COM 		return (FALSE);
175*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->lg_e_username, ~0))
1765331Samw 		return (FALSE);
177*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->lg_e_domain, ~0))
1785331Samw 		return (FALSE);
179*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->lg_workstation, ~0))
1808670SJose.Borrego@Sun.COM 		return (FALSE);
181*11963SAfshin.Ardakani@Sun.COM 	if (!smb_inaddr_xdr(xdrs, &objp->lg_clnt_ipaddr))
1828670SJose.Borrego@Sun.COM 		return (FALSE);
183*11963SAfshin.Ardakani@Sun.COM 	if (!smb_inaddr_xdr(xdrs, &objp->lg_local_ipaddr))
1845331Samw 		return (FALSE);
185*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint16_t(xdrs, &objp->lg_local_port))
1865331Samw 		return (FALSE);
187*11963SAfshin.Ardakani@Sun.COM 	if (!smb_buf32_xdr(xdrs, &objp->lg_challenge_key))
188*11963SAfshin.Ardakani@Sun.COM 		return (FALSE);
189*11963SAfshin.Ardakani@Sun.COM 	if (!smb_buf32_xdr(xdrs, &objp->lg_nt_password))
1905331Samw 		return (FALSE);
191*11963SAfshin.Ardakani@Sun.COM 	if (!smb_buf32_xdr(xdrs, &objp->lg_lm_password))
192*11963SAfshin.Ardakani@Sun.COM 		return (FALSE);
193*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_int(xdrs, &objp->lg_native_os))
194*11963SAfshin.Ardakani@Sun.COM 		return (FALSE);
195*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_int(xdrs, &objp->lg_native_lm))
1965331Samw 		return (FALSE);
197*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->lg_flags))
1985331Samw 		return (FALSE);
199*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->lg_logon_id))
2005331Samw 		return (FALSE);
201*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->lg_domain_type))
2025331Samw 		return (FALSE);
203*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->lg_secmode))
2045331Samw 		return (FALSE);
205*11963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->lg_status))
2065331Samw 		return (FALSE);
2075331Samw 	return (TRUE);
2085331Samw }
2095331Samw 
2108670SJose.Borrego@Sun.COM static bool_t
smb_sid_xdr(XDR * xdrs,smb_sid_t * objp)211*11963SAfshin.Ardakani@Sun.COM smb_sid_xdr(XDR *xdrs, smb_sid_t *objp)
2125331Samw {
2136432Sas200622 	if (!xdr_uint8_t(xdrs, &objp->sid_revision))
2145331Samw 		return (FALSE);
2156432Sas200622 	if (!xdr_uint8_t(xdrs, &objp->sid_subauthcnt))
2165331Samw 		return (FALSE);
2176432Sas200622 	if (!xdr_vector(xdrs, (char *)objp->sid_authority, NT_SID_AUTH_MAX,
2185331Samw 	    sizeof (uint8_t), (xdrproc_t)xdr_uint8_t))
2195331Samw 		return (FALSE);
2206432Sas200622 	if (!xdr_vector(xdrs, (char *)objp->sid_subauth, objp->sid_subauthcnt,
2215331Samw 	    sizeof (uint32_t), (xdrproc_t)xdr_uint32_t))
2225331Samw 		return (FALSE);
2235331Samw 	return (TRUE);
2245331Samw }
2255331Samw 
2268670SJose.Borrego@Sun.COM static bool_t
smb_luid_xdr(XDR * xdrs,smb_luid_t * objp)227*11963SAfshin.Ardakani@Sun.COM smb_luid_xdr(XDR *xdrs, smb_luid_t *objp)
2285331Samw {
2295331Samw 	if (!xdr_uint32_t(xdrs, &objp->lo_part))
2305331Samw 		return (FALSE);
2315331Samw 	if (!xdr_uint32_t(xdrs, &objp->hi_part))
2325331Samw 		return (FALSE);
2335331Samw 	return (TRUE);
2345331Samw }
2355331Samw 
2368670SJose.Borrego@Sun.COM static bool_t
smb_luid_attrs_xdr(XDR * xdrs,smb_luid_attrs_t * objp)237*11963SAfshin.Ardakani@Sun.COM smb_luid_attrs_xdr(XDR *xdrs, smb_luid_attrs_t *objp)
2385331Samw {
239*11963SAfshin.Ardakani@Sun.COM 	if (!smb_luid_xdr(xdrs, &objp->luid))
2405331Samw 		return (FALSE);
2415331Samw 	if (!xdr_uint32_t(xdrs, &objp->attrs))
2425331Samw 		return (FALSE);
2435331Samw 	return (TRUE);
2445331Samw }
2455331Samw 
2468670SJose.Borrego@Sun.COM static bool_t
smb_privset_xdr(XDR * xdrs,smb_privset_t * objp)247*11963SAfshin.Ardakani@Sun.COM smb_privset_xdr(XDR *xdrs, smb_privset_t *objp)
2485331Samw {
2495331Samw 	if (!xdr_uint32_t(xdrs, &objp->priv_cnt))
2505331Samw 		return (FALSE);
2515331Samw 	if (!xdr_uint32_t(xdrs, &objp->control))
2525331Samw 		return (FALSE);
2535331Samw 	if (!xdr_vector(xdrs, (char *)objp->priv, objp->priv_cnt,
2545331Samw 	    sizeof (smb_luid_attrs_t),
255*11963SAfshin.Ardakani@Sun.COM 	    (xdrproc_t)smb_luid_attrs_xdr))
2565331Samw 		return (FALSE);
2575331Samw 	return (TRUE);
2585331Samw }
2595331Samw 
2605331Samw bool_t
smb_token_xdr(XDR * xdrs,smb_token_t * objp)261*11963SAfshin.Ardakani@Sun.COM smb_token_xdr(XDR *xdrs, smb_token_t *objp)
2625331Samw {
263*11963SAfshin.Ardakani@Sun.COM 	if (!smb_id_xdr(xdrs, &objp->tkn_user))
264*11963SAfshin.Ardakani@Sun.COM 		return (FALSE);
265*11963SAfshin.Ardakani@Sun.COM 	if (!smb_id_xdr(xdrs, &objp->tkn_owner))
2668670SJose.Borrego@Sun.COM 		return (FALSE);
267*11963SAfshin.Ardakani@Sun.COM 	if (!smb_id_xdr(xdrs, &objp->tkn_primary_grp))
2685331Samw 		return (FALSE);
269*11963SAfshin.Ardakani@Sun.COM 	if (!smb_ids_xdr(xdrs, &objp->tkn_win_grps))
2705331Samw 		return (FALSE);
271*11963SAfshin.Ardakani@Sun.COM 	if (!smb_privset_helper_xdr(xdrs, (char **)&objp->tkn_privileges))
2725331Samw 		return (FALSE);
2735331Samw 	if (!xdr_string(xdrs, &objp->tkn_account_name, ~0))
2745331Samw 		return (FALSE);
2755331Samw 	if (!xdr_string(xdrs, &objp->tkn_domain_name, ~0))
2765331Samw 		return (FALSE);
2775331Samw 	if (!xdr_uint32_t(xdrs, &objp->tkn_flags))
2785331Samw 		return (FALSE);
2795331Samw 	if (!xdr_uint32_t(xdrs, &objp->tkn_audit_sid))
2805331Samw 		return (FALSE);
2815331Samw 	if (!xdr_pointer(xdrs, (char **)&objp->tkn_session_key,
282*11963SAfshin.Ardakani@Sun.COM 	    sizeof (smb_session_key_t), (xdrproc_t)smb_session_key_xdr))
2835331Samw 		return (FALSE);
284*11963SAfshin.Ardakani@Sun.COM 	if (!smb_posix_grps_helper_xdr(xdrs, (char **)&objp->tkn_posix_grps))
2855331Samw 		return (FALSE);
2865331Samw 	return (TRUE);
2875331Samw }
288