da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or http://www.opensolaris.org/os/licensing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * NetLogon RPC (NETR) interface definition. This module provides
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * the server side NETR RPC interface and the interface registration
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * function.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <strings.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/libsmb.h>
8d7e41661dc4633488e93b13363137523ce59977jose borrego#include <smbsrv/libmlsvc.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/ndl/netlogon.ndl>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/nmpipes.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/netrauth.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
8d7e41661dc4633488e93b13363137523ce59977jose borregostatic int netr_s_ServerReqChallenge(void *, ndr_xa_t *);
8d7e41661dc4633488e93b13363137523ce59977jose borregostatic int netr_s_ServerAuthenticate2(void *, ndr_xa_t *);
8d7e41661dc4633488e93b13363137523ce59977jose borregostatic int netr_s_ServerPasswordSet(void *, ndr_xa_t *);
8d7e41661dc4633488e93b13363137523ce59977jose borregostatic int netr_s_SamLogon(void *, ndr_xa_t *);
8d7e41661dc4633488e93b13363137523ce59977jose borregostatic int netr_s_SamLogoff(void *, ndr_xa_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
8d7e41661dc4633488e93b13363137523ce59977jose borregostatic ndr_stub_table_t netr_stub_table[] = {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw { netr_s_ServerReqChallenge, NETR_OPNUM_ServerReqChallenge },
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw { netr_s_ServerAuthenticate2, NETR_OPNUM_ServerAuthenticate2 },
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw { netr_s_ServerPasswordSet, NETR_OPNUM_ServerPasswordSet },
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw { netr_s_SamLogon, NETR_OPNUM_SamLogon },
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw { netr_s_SamLogoff, NETR_OPNUM_SamLogoff },
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw {0}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw};
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
8d7e41661dc4633488e93b13363137523ce59977jose borregostatic ndr_service_t netr_service = {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "NETR", /* name */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "NetLogon", /* desc */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "\\netlogon", /* endpoint */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw PIPE_LSASS, /* sec_addr_port */
8d7e41661dc4633488e93b13363137523ce59977jose borrego "12345678-1234-abcd-ef00-01234567cffb", 1, /* abstract */
8d7e41661dc4633488e93b13363137523ce59977jose borrego NDR_TRANSFER_SYNTAX_UUID, 2, /* transfer */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw 0, /* no bind_instance_size */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw 0, /* no bind_req() */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw 0, /* no unbind_and_close() */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw 0, /* use generic_call_stub() */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw &TYPEINFO(netr_interface), /* interface ti */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw netr_stub_table /* stub_table */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw};
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * netr_initialize
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This function registers the NETR RPC interface with the RPC runtime
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * library. It must be called in order to use either the client side
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or the server side functions.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwnetr_initialize(void)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) ndr_svc_register(&netr_service);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * netr_s_ServerReqChallenge
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*ARGSUSED*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int
8d7e41661dc4633488e93b13363137523ce59977jose borregonetr_s_ServerReqChallenge(void *arg, ndr_xa_t *mxa)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct netr_ServerReqChallenge *param = arg;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw bzero(param, sizeof (struct netr_ServerReqChallenge));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
8d7e41661dc4633488e93b13363137523ce59977jose borrego return (NDR_DRC_OK);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * netr_s_ServerAuthenticate2
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*ARGSUSED*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int
8d7e41661dc4633488e93b13363137523ce59977jose borregonetr_s_ServerAuthenticate2(void *arg, ndr_xa_t *mxa)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct netr_ServerAuthenticate2 *param = arg;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw bzero(param, sizeof (struct netr_ServerAuthenticate2));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
8d7e41661dc4633488e93b13363137523ce59977jose borrego return (NDR_DRC_OK);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * netr_s_ServerPasswordSet
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*ARGSUSED*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int
8d7e41661dc4633488e93b13363137523ce59977jose borregonetr_s_ServerPasswordSet(void *arg, ndr_xa_t *mxa)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct netr_PasswordSet *param = arg;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw bzero(param, sizeof (struct netr_PasswordSet));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
8d7e41661dc4633488e93b13363137523ce59977jose borrego return (NDR_DRC_OK);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * netr_s_SamLogon
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*ARGSUSED*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int
8d7e41661dc4633488e93b13363137523ce59977jose borregonetr_s_SamLogon(void *arg, ndr_xa_t *mxa)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct netr_SamLogon *param = arg;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw bzero(param, sizeof (struct netr_SamLogon));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
8d7e41661dc4633488e93b13363137523ce59977jose borrego return (NDR_DRC_OK);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * netr_s_SamLogoff
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*ARGSUSED*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int
8d7e41661dc4633488e93b13363137523ce59977jose borregonetr_s_SamLogoff(void *arg, ndr_xa_t *mxa)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct netr_SamLogoff *param = arg;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw bzero(param, sizeof (struct netr_SamLogoff));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
8d7e41661dc4633488e93b13363137523ce59977jose borrego return (NDR_DRC_OK);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Declare extern references.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwDECL_FIXUP_STRUCT(netr_validation_u);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwDECL_FIXUP_STRUCT(netr_validation_info);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwDECL_FIXUP_STRUCT(netr_SamLogon);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Patch the netr_SamLogon union.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This function is called from mlsvc_netr_ndr.c
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwfixup_netr_SamLogon(struct netr_SamLogon *arg)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short size1 = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short size2 = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short size3 = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw WORD level = (WORD)arg->validation_level;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (level) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 3:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The netr_validation_u union contains a pointer, which
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * is a DWORD in NDR. So we need to set size1 to ensure
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * that we can correctly decode the remaining parameters.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw size1 = sizeof (DWORD);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw default:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If the request is badly formed or the level is invalid,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * the server returns NT_STATUS_INVALID_INFO_CLASS. Size1
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * must be zero to correctly decode the status.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw size1 = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw };
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw size2 = size1 + (2 * sizeof (DWORD));
2c1b14e51525da2c09064641416fc4aed457c72fjose borrego size3 = size2 + sizeof (ndr_request_hdr_t) + sizeof (DWORD);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw FIXUP_PDU_SIZE(netr_validation_u, size1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw FIXUP_PDU_SIZE(netr_validation_info, size2);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw FIXUP_PDU_SIZE(netr_SamLogon, size3);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}