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