#include <strings.h>
#include <smbsrv/libsmb.h>
#include <smbsrv/libmlsvc.h>
#include <smbsrv/ndl/netlogon.ndl>
#include <smbsrv/nmpipes.h>
#include <smbsrv/netrauth.h>
static int netr_s_ServerReqChallenge(void *, ndr_xa_t *);
static int netr_s_ServerAuthenticate2(void *, ndr_xa_t *);
static int netr_s_ServerPasswordSet(void *, ndr_xa_t *);
static int netr_s_SamLogon(void *, ndr_xa_t *);
static int netr_s_SamLogoff(void *, ndr_xa_t *);
static ndr_stub_table_t netr_stub_table[] = {
{ netr_s_ServerReqChallenge, NETR_OPNUM_ServerReqChallenge },
{ netr_s_ServerAuthenticate2, NETR_OPNUM_ServerAuthenticate2 },
{ netr_s_ServerPasswordSet, NETR_OPNUM_ServerPasswordSet },
{ netr_s_SamLogon, NETR_OPNUM_SamLogon },
{ netr_s_SamLogoff, NETR_OPNUM_SamLogoff },
{0}
};
static ndr_service_t netr_service = {
"NETR",
"NetLogon",
"\\netlogon",
PIPE_LSASS,
"12345678-1234-abcd-ef00-01234567cffb", 1,
NDR_TRANSFER_SYNTAX_UUID, 2,
0,
0,
0,
0,
&TYPEINFO(netr_interface),
netr_stub_table
};
void
netr_initialize(void)
{
uint32_t flags;
(void) ndr_svc_register(&netr_service);
flags = smb_get_netlogon_flags();
netlogon_init_global(flags);
}
static int
netr_s_ServerReqChallenge(void *arg, ndr_xa_t *mxa)
{
struct netr_ServerReqChallenge *param = arg;
bzero(param, sizeof (struct netr_ServerReqChallenge));
param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
return (NDR_DRC_OK);
}
static int
netr_s_ServerAuthenticate2(void *arg, ndr_xa_t *mxa)
{
struct netr_ServerAuthenticate2 *param = arg;
bzero(param, sizeof (struct netr_ServerAuthenticate2));
param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
return (NDR_DRC_OK);
}
static int
netr_s_ServerPasswordSet(void *arg, ndr_xa_t *mxa)
{
struct netr_PasswordSet *param = arg;
bzero(param, sizeof (struct netr_PasswordSet));
param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
return (NDR_DRC_OK);
}
static int
netr_s_SamLogon(void *arg, ndr_xa_t *mxa)
{
struct netr_SamLogon *param = arg;
bzero(param, sizeof (struct netr_SamLogon));
param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
return (NDR_DRC_OK);
}
static int
netr_s_SamLogoff(void *arg, ndr_xa_t *mxa)
{
struct netr_SamLogoff *param = arg;
bzero(param, sizeof (struct netr_SamLogoff));
param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED);
return (NDR_DRC_OK);
}
DECL_FIXUP_STRUCT(netr_validation_u);
DECL_FIXUP_STRUCT(netr_validation_info);
DECL_FIXUP_STRUCT(netr_SamLogon);
DECL_FIXUP_STRUCT(netr_SamLogonEx);
static unsigned short
fixup_netr_validation_info(WORD level)
{
unsigned short size1 = 0;
unsigned short size2 = 0;
switch (level) {
case 3:
size1 = sizeof (DWORD);
break;
default:
size1 = 0;
break;
};
size2 = size1 + (2 * sizeof (DWORD));
FIXUP_PDU_SIZE(netr_validation_u, size1);
FIXUP_PDU_SIZE(netr_validation_info, size2);
return (size2);
}
void
fixup_netr_SamLogon(struct netr_SamLogon *arg)
{
unsigned short size2 = 0;
unsigned short size3 = 0;
size2 = fixup_netr_validation_info(arg->validation_level);
size3 = size2 + sizeof (ndr_request_hdr_t) + 3 * sizeof (DWORD);
FIXUP_PDU_SIZE(netr_SamLogon, size3);
}
void
fixup_netr_SamLogonEx(struct netr_SamLogonEx *arg)
{
unsigned short size2 = 0;
unsigned short size3 = 0;
size2 = fixup_netr_validation_info(arg->validation_level);
size3 = size2 + sizeof (ndr_request_hdr_t) + 3 * sizeof (DWORD);
FIXUP_PDU_SIZE(netr_SamLogonEx, size3);
}