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  */
21da6c28aaSamw /*
222c1b14e5Sjose borrego  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23da6c28aaSamw  * Use is subject to license terms.
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>
35*8d7e4166Sjose borrego #include <smbsrv/libmlsvc.h>
36da6c28aaSamw #include <smbsrv/ndl/netlogon.ndl>
37da6c28aaSamw #include <smbsrv/ntstatus.h>
38da6c28aaSamw #include <smbsrv/nterror.h>
39da6c28aaSamw #include <smbsrv/nmpipes.h>
40da6c28aaSamw #include <smbsrv/netrauth.h>
41da6c28aaSamw 
42*8d7e4166Sjose borrego static int netr_s_ServerReqChallenge(void *, ndr_xa_t *);
43*8d7e4166Sjose borrego static int netr_s_ServerAuthenticate2(void *, ndr_xa_t *);
44*8d7e4166Sjose borrego static int netr_s_ServerPasswordSet(void *, ndr_xa_t *);
45*8d7e4166Sjose borrego static int netr_s_SamLogon(void *, ndr_xa_t *);
46*8d7e4166Sjose borrego static int netr_s_SamLogoff(void *, ndr_xa_t *);
47da6c28aaSamw 
48*8d7e4166Sjose borrego static ndr_stub_table_t netr_stub_table[] = {
49da6c28aaSamw 	{ netr_s_ServerReqChallenge,	NETR_OPNUM_ServerReqChallenge },
50da6c28aaSamw 	{ netr_s_ServerAuthenticate2,	NETR_OPNUM_ServerAuthenticate2 },
51da6c28aaSamw 	{ netr_s_ServerPasswordSet,	NETR_OPNUM_ServerPasswordSet },
52da6c28aaSamw 	{ netr_s_SamLogon,		NETR_OPNUM_SamLogon },
53da6c28aaSamw 	{ netr_s_SamLogoff,		NETR_OPNUM_SamLogoff },
54da6c28aaSamw 	{0}
55da6c28aaSamw };
56da6c28aaSamw 
57*8d7e4166Sjose borrego static ndr_service_t netr_service = {
58da6c28aaSamw 	"NETR",				/* name */
59da6c28aaSamw 	"NetLogon",			/* desc */
60da6c28aaSamw 	"\\netlogon",			/* endpoint */
61da6c28aaSamw 	PIPE_LSASS,			/* sec_addr_port */
62*8d7e4166Sjose borrego 	"12345678-1234-abcd-ef00-01234567cffb", 1,	/* abstract */
63*8d7e4166Sjose borrego 	NDR_TRANSFER_SYNTAX_UUID,		2,	/* transfer */
64da6c28aaSamw 	0,				/* no bind_instance_size */
65da6c28aaSamw 	0,				/* no bind_req() */
66da6c28aaSamw 	0,				/* no unbind_and_close() */
67da6c28aaSamw 	0,				/* use generic_call_stub() */
68da6c28aaSamw 	&TYPEINFO(netr_interface),	/* interface ti */
69da6c28aaSamw 	netr_stub_table			/* stub_table */
70da6c28aaSamw };
71da6c28aaSamw 
72da6c28aaSamw /*
73da6c28aaSamw  * netr_initialize
74da6c28aaSamw  *
75da6c28aaSamw  * This function registers the NETR RPC interface with the RPC runtime
76da6c28aaSamw  * library. It must be called in order to use either the client side
77da6c28aaSamw  * or the server side functions.
78da6c28aaSamw  */
79da6c28aaSamw void
80da6c28aaSamw netr_initialize(void)
81da6c28aaSamw {
82*8d7e4166Sjose borrego 	(void) ndr_svc_register(&netr_service);
83da6c28aaSamw }
84da6c28aaSamw 
85da6c28aaSamw /*
86da6c28aaSamw  * netr_s_ServerReqChallenge
87da6c28aaSamw  */
88da6c28aaSamw /*ARGSUSED*/
89da6c28aaSamw static int
90*8d7e4166Sjose borrego netr_s_ServerReqChallenge(void *arg, ndr_xa_t *mxa)
91da6c28aaSamw {
92da6c28aaSamw 	struct netr_ServerReqChallenge *param = arg;
93da6c28aaSamw 
94da6c28aaSamw 	bzero(param, sizeof (struct netr_ServerReqChallenge));
95da6c28aaSamw 	param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
96*8d7e4166Sjose borrego 	return (NDR_DRC_OK);
97da6c28aaSamw }
98da6c28aaSamw 
99da6c28aaSamw /*
100da6c28aaSamw  * netr_s_ServerAuthenticate2
101da6c28aaSamw  */
102da6c28aaSamw /*ARGSUSED*/
103da6c28aaSamw static int
104*8d7e4166Sjose borrego netr_s_ServerAuthenticate2(void *arg, ndr_xa_t *mxa)
105da6c28aaSamw {
106da6c28aaSamw 	struct netr_ServerAuthenticate2 *param = arg;
107da6c28aaSamw 
108da6c28aaSamw 	bzero(param, sizeof (struct netr_ServerAuthenticate2));
109da6c28aaSamw 	param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
110*8d7e4166Sjose borrego 	return (NDR_DRC_OK);
111da6c28aaSamw }
112da6c28aaSamw 
113da6c28aaSamw /*
114da6c28aaSamw  * netr_s_ServerPasswordSet
115da6c28aaSamw  */
116da6c28aaSamw /*ARGSUSED*/
117da6c28aaSamw static int
118*8d7e4166Sjose borrego netr_s_ServerPasswordSet(void *arg, ndr_xa_t *mxa)
119da6c28aaSamw {
120da6c28aaSamw 	struct netr_PasswordSet *param = arg;
121da6c28aaSamw 
122da6c28aaSamw 	bzero(param, sizeof (struct netr_PasswordSet));
123da6c28aaSamw 	param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
124*8d7e4166Sjose borrego 	return (NDR_DRC_OK);
125da6c28aaSamw }
126da6c28aaSamw 
127da6c28aaSamw /*
128da6c28aaSamw  * netr_s_SamLogon
129da6c28aaSamw  */
130da6c28aaSamw /*ARGSUSED*/
131da6c28aaSamw static int
132*8d7e4166Sjose borrego netr_s_SamLogon(void *arg, ndr_xa_t *mxa)
133da6c28aaSamw {
134da6c28aaSamw 	struct netr_SamLogon *param = arg;
135da6c28aaSamw 
136da6c28aaSamw 	bzero(param, sizeof (struct netr_SamLogon));
137da6c28aaSamw 	param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
138*8d7e4166Sjose borrego 	return (NDR_DRC_OK);
139da6c28aaSamw }
140da6c28aaSamw 
141da6c28aaSamw /*
142da6c28aaSamw  * netr_s_SamLogoff
143da6c28aaSamw  */
144da6c28aaSamw /*ARGSUSED*/
145da6c28aaSamw static int
146*8d7e4166Sjose borrego netr_s_SamLogoff(void *arg, ndr_xa_t *mxa)
147da6c28aaSamw {
148da6c28aaSamw 	struct netr_SamLogoff *param = arg;
149da6c28aaSamw 
150da6c28aaSamw 	bzero(param, sizeof (struct netr_SamLogoff));
151da6c28aaSamw 	param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
152*8d7e4166Sjose borrego 	return (NDR_DRC_OK);
153da6c28aaSamw }
154da6c28aaSamw 
155da6c28aaSamw /*
156da6c28aaSamw  * Declare extern references.
157da6c28aaSamw  */
158da6c28aaSamw DECL_FIXUP_STRUCT(netr_validation_u);
159da6c28aaSamw DECL_FIXUP_STRUCT(netr_validation_info);
160da6c28aaSamw DECL_FIXUP_STRUCT(netr_SamLogon);
161da6c28aaSamw 
162da6c28aaSamw /*
163da6c28aaSamw  * Patch the netr_SamLogon union.
164da6c28aaSamw  * This function is called from mlsvc_netr_ndr.c
165da6c28aaSamw  */
166da6c28aaSamw void
167da6c28aaSamw fixup_netr_SamLogon(struct netr_SamLogon *arg)
168da6c28aaSamw {
169da6c28aaSamw 	unsigned short size1 = 0;
170da6c28aaSamw 	unsigned short size2 = 0;
171da6c28aaSamw 	unsigned short size3 = 0;
172da6c28aaSamw 	WORD level = (WORD)arg->validation_level;
173da6c28aaSamw 
174da6c28aaSamw 	switch (level) {
175da6c28aaSamw 	case 3:
176da6c28aaSamw 		/*
177da6c28aaSamw 		 * The netr_validation_u union contains a pointer, which
178da6c28aaSamw 		 * is a DWORD in NDR. So we need to set size1 to ensure
179da6c28aaSamw 		 * that we can correctly decode the remaining parameters.
180da6c28aaSamw 		 */
181da6c28aaSamw 		size1 = sizeof (DWORD);
182da6c28aaSamw 		break;
183da6c28aaSamw 
184da6c28aaSamw 	default:
185da6c28aaSamw 		/*
186da6c28aaSamw 		 * If the request is badly formed or the level is invalid,
187da6c28aaSamw 		 * the server returns NT_STATUS_INVALID_INFO_CLASS. Size1
188da6c28aaSamw 		 * must be zero to correctly decode the status.
189da6c28aaSamw 		 */
190da6c28aaSamw 		size1 = 0;
191da6c28aaSamw 		break;
192da6c28aaSamw 	};
193da6c28aaSamw 
194da6c28aaSamw 	size2 = size1 + (2 * sizeof (DWORD));
1952c1b14e5Sjose borrego 	size3 = size2 + sizeof (ndr_request_hdr_t) + sizeof (DWORD);
196da6c28aaSamw 
197da6c28aaSamw 	FIXUP_PDU_SIZE(netr_validation_u, size1);
198da6c28aaSamw 	FIXUP_PDU_SIZE(netr_validation_info, size2);
199da6c28aaSamw 	FIXUP_PDU_SIZE(netr_SamLogon, size3);
200da6c28aaSamw }
201