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