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