xref: /titanic_51/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_netr.c (revision 148c5f43199ca0b43fc8e3b643aab11cd66ea327)
1da6c28aaSamw /*
2da6c28aaSamw  * CDDL HEADER START
3da6c28aaSamw  *
4da6c28aaSamw  * The contents of this file are subject to the terms of the
5da6c28aaSamw  * Common Development and Distribution License (the "License").
6da6c28aaSamw  * You may not use this file except in compliance with the License.
7da6c28aaSamw  *
8da6c28aaSamw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9da6c28aaSamw  * or http://www.opensolaris.org/os/licensing.
10da6c28aaSamw  * See the License for the specific language governing permissions
11da6c28aaSamw  * and limitations under the License.
12da6c28aaSamw  *
13da6c28aaSamw  * When distributing Covered Code, include this CDDL HEADER in each
14da6c28aaSamw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15da6c28aaSamw  * If applicable, add the following below this CDDL HEADER, with the
16da6c28aaSamw  * fields enclosed by brackets "[]" replaced with your own identifying
17da6c28aaSamw  * information: Portions Copyright [yyyy] [name of copyright owner]
18da6c28aaSamw  *
19da6c28aaSamw  * CDDL HEADER END
20da6c28aaSamw  */
21*148c5f43SAlan Wright 
22da6c28aaSamw /*
23*148c5f43SAlan Wright  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24da6c28aaSamw  */
25da6c28aaSamw 
26da6c28aaSamw /*
27da6c28aaSamw  * NetLogon RPC (NETR) interface definition. This module provides
28da6c28aaSamw  * the server side NETR RPC interface and the interface registration
29da6c28aaSamw  * function.
30da6c28aaSamw  */
31da6c28aaSamw 
32da6c28aaSamw #include <strings.h>
33da6c28aaSamw 
34da6c28aaSamw #include <smbsrv/libsmb.h>
358d7e4166Sjose borrego #include <smbsrv/libmlsvc.h>
36da6c28aaSamw #include <smbsrv/ndl/netlogon.ndl>
37da6c28aaSamw #include <smbsrv/nmpipes.h>
38da6c28aaSamw #include <smbsrv/netrauth.h>
39da6c28aaSamw 
408d7e4166Sjose borrego static int netr_s_ServerReqChallenge(void *, ndr_xa_t *);
418d7e4166Sjose borrego static int netr_s_ServerAuthenticate2(void *, ndr_xa_t *);
428d7e4166Sjose borrego static int netr_s_ServerPasswordSet(void *, ndr_xa_t *);
438d7e4166Sjose borrego static int netr_s_SamLogon(void *, ndr_xa_t *);
448d7e4166Sjose borrego static int netr_s_SamLogoff(void *, ndr_xa_t *);
45da6c28aaSamw 
468d7e4166Sjose borrego static ndr_stub_table_t netr_stub_table[] = {
47da6c28aaSamw 	{ netr_s_ServerReqChallenge,	NETR_OPNUM_ServerReqChallenge },
48da6c28aaSamw 	{ netr_s_ServerAuthenticate2,	NETR_OPNUM_ServerAuthenticate2 },
49da6c28aaSamw 	{ netr_s_ServerPasswordSet,	NETR_OPNUM_ServerPasswordSet },
50da6c28aaSamw 	{ netr_s_SamLogon,		NETR_OPNUM_SamLogon },
51da6c28aaSamw 	{ netr_s_SamLogoff,		NETR_OPNUM_SamLogoff },
52da6c28aaSamw 	{0}
53da6c28aaSamw };
54da6c28aaSamw 
558d7e4166Sjose borrego static ndr_service_t netr_service = {
56da6c28aaSamw 	"NETR",				/* name */
57da6c28aaSamw 	"NetLogon",			/* desc */
58da6c28aaSamw 	"\\netlogon",			/* endpoint */
59da6c28aaSamw 	PIPE_LSASS,			/* sec_addr_port */
608d7e4166Sjose borrego 	"12345678-1234-abcd-ef00-01234567cffb", 1,	/* abstract */
618d7e4166Sjose borrego 	NDR_TRANSFER_SYNTAX_UUID,		2,	/* transfer */
62da6c28aaSamw 	0,				/* no bind_instance_size */
63da6c28aaSamw 	0,				/* no bind_req() */
64da6c28aaSamw 	0,				/* no unbind_and_close() */
65da6c28aaSamw 	0,				/* use generic_call_stub() */
66da6c28aaSamw 	&TYPEINFO(netr_interface),	/* interface ti */
67da6c28aaSamw 	netr_stub_table			/* stub_table */
68da6c28aaSamw };
69da6c28aaSamw 
70da6c28aaSamw /*
71da6c28aaSamw  * netr_initialize
72da6c28aaSamw  *
73da6c28aaSamw  * This function registers the NETR RPC interface with the RPC runtime
74da6c28aaSamw  * library. It must be called in order to use either the client side
75da6c28aaSamw  * or the server side functions.
76da6c28aaSamw  */
77da6c28aaSamw void
78da6c28aaSamw netr_initialize(void)
79da6c28aaSamw {
808d7e4166Sjose borrego 	(void) ndr_svc_register(&netr_service);
81da6c28aaSamw }
82da6c28aaSamw 
83da6c28aaSamw /*
84da6c28aaSamw  * netr_s_ServerReqChallenge
85da6c28aaSamw  */
86da6c28aaSamw /*ARGSUSED*/
87da6c28aaSamw static int
888d7e4166Sjose borrego netr_s_ServerReqChallenge(void *arg, ndr_xa_t *mxa)
89da6c28aaSamw {
90da6c28aaSamw 	struct netr_ServerReqChallenge *param = arg;
91da6c28aaSamw 
92da6c28aaSamw 	bzero(param, sizeof (struct netr_ServerReqChallenge));
93da6c28aaSamw 	param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
948d7e4166Sjose borrego 	return (NDR_DRC_OK);
95da6c28aaSamw }
96da6c28aaSamw 
97da6c28aaSamw /*
98da6c28aaSamw  * netr_s_ServerAuthenticate2
99da6c28aaSamw  */
100da6c28aaSamw /*ARGSUSED*/
101da6c28aaSamw static int
1028d7e4166Sjose borrego netr_s_ServerAuthenticate2(void *arg, ndr_xa_t *mxa)
103da6c28aaSamw {
104da6c28aaSamw 	struct netr_ServerAuthenticate2 *param = arg;
105da6c28aaSamw 
106da6c28aaSamw 	bzero(param, sizeof (struct netr_ServerAuthenticate2));
107da6c28aaSamw 	param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
1088d7e4166Sjose borrego 	return (NDR_DRC_OK);
109da6c28aaSamw }
110da6c28aaSamw 
111da6c28aaSamw /*
112da6c28aaSamw  * netr_s_ServerPasswordSet
113da6c28aaSamw  */
114da6c28aaSamw /*ARGSUSED*/
115da6c28aaSamw static int
1168d7e4166Sjose borrego netr_s_ServerPasswordSet(void *arg, ndr_xa_t *mxa)
117da6c28aaSamw {
118da6c28aaSamw 	struct netr_PasswordSet *param = arg;
119da6c28aaSamw 
120da6c28aaSamw 	bzero(param, sizeof (struct netr_PasswordSet));
121da6c28aaSamw 	param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
1228d7e4166Sjose borrego 	return (NDR_DRC_OK);
123da6c28aaSamw }
124da6c28aaSamw 
125da6c28aaSamw /*
126da6c28aaSamw  * netr_s_SamLogon
127da6c28aaSamw  */
128da6c28aaSamw /*ARGSUSED*/
129da6c28aaSamw static int
1308d7e4166Sjose borrego netr_s_SamLogon(void *arg, ndr_xa_t *mxa)
131da6c28aaSamw {
132da6c28aaSamw 	struct netr_SamLogon *param = arg;
133da6c28aaSamw 
134da6c28aaSamw 	bzero(param, sizeof (struct netr_SamLogon));
135da6c28aaSamw 	param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
1368d7e4166Sjose borrego 	return (NDR_DRC_OK);
137da6c28aaSamw }
138da6c28aaSamw 
139da6c28aaSamw /*
140da6c28aaSamw  * netr_s_SamLogoff
141da6c28aaSamw  */
142da6c28aaSamw /*ARGSUSED*/
143da6c28aaSamw static int
1448d7e4166Sjose borrego netr_s_SamLogoff(void *arg, ndr_xa_t *mxa)
145da6c28aaSamw {
146da6c28aaSamw 	struct netr_SamLogoff *param = arg;
147da6c28aaSamw 
148da6c28aaSamw 	bzero(param, sizeof (struct netr_SamLogoff));
149da6c28aaSamw 	param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
1508d7e4166Sjose borrego 	return (NDR_DRC_OK);
151da6c28aaSamw }
152da6c28aaSamw 
153da6c28aaSamw /*
154da6c28aaSamw  * Declare extern references.
155da6c28aaSamw  */
156da6c28aaSamw DECL_FIXUP_STRUCT(netr_validation_u);
157da6c28aaSamw DECL_FIXUP_STRUCT(netr_validation_info);
158da6c28aaSamw DECL_FIXUP_STRUCT(netr_SamLogon);
159da6c28aaSamw 
160da6c28aaSamw /*
161da6c28aaSamw  * Patch the netr_SamLogon union.
162da6c28aaSamw  * This function is called from mlsvc_netr_ndr.c
163da6c28aaSamw  */
164da6c28aaSamw void
165da6c28aaSamw fixup_netr_SamLogon(struct netr_SamLogon *arg)
166da6c28aaSamw {
167da6c28aaSamw 	unsigned short size1 = 0;
168da6c28aaSamw 	unsigned short size2 = 0;
169da6c28aaSamw 	unsigned short size3 = 0;
170da6c28aaSamw 	WORD level = (WORD)arg->validation_level;
171da6c28aaSamw 
172da6c28aaSamw 	switch (level) {
173da6c28aaSamw 	case 3:
174da6c28aaSamw 		/*
175da6c28aaSamw 		 * The netr_validation_u union contains a pointer, which
176da6c28aaSamw 		 * is a DWORD in NDR. So we need to set size1 to ensure
177da6c28aaSamw 		 * that we can correctly decode the remaining parameters.
178da6c28aaSamw 		 */
179da6c28aaSamw 		size1 = sizeof (DWORD);
180da6c28aaSamw 		break;
181da6c28aaSamw 
182da6c28aaSamw 	default:
183da6c28aaSamw 		/*
184da6c28aaSamw 		 * If the request is badly formed or the level is invalid,
185da6c28aaSamw 		 * the server returns NT_STATUS_INVALID_INFO_CLASS. Size1
186da6c28aaSamw 		 * must be zero to correctly decode the status.
187da6c28aaSamw 		 */
188da6c28aaSamw 		size1 = 0;
189da6c28aaSamw 		break;
190da6c28aaSamw 	};
191da6c28aaSamw 
192da6c28aaSamw 	size2 = size1 + (2 * sizeof (DWORD));
1932c1b14e5Sjose borrego 	size3 = size2 + sizeof (ndr_request_hdr_t) + sizeof (DWORD);
194da6c28aaSamw 
195da6c28aaSamw 	FIXUP_PDU_SIZE(netr_validation_u, size1);
196da6c28aaSamw 	FIXUP_PDU_SIZE(netr_validation_info, size2);
197da6c28aaSamw 	FIXUP_PDU_SIZE(netr_SamLogon, size3);
198da6c28aaSamw }
199