1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-29 21:47:30 +03:00

Started conversion of lsa server code to canonical format (as srv_reg and

srv_samr have been).
Jeremy.
This commit is contained in:
Jeremy Allison -
parent e7ccb9be6d
commit f434cda977
4 changed files with 162 additions and 58 deletions

View File

@ -2403,6 +2403,8 @@ BOOL lsa_io_r_lookup_names(char *desc, LSA_R_LOOKUP_NAMES *r_r,
void init_lsa_q_close(LSA_Q_CLOSE *q_c, POLICY_HND *hnd);
BOOL lsa_io_q_close(char *desc, LSA_Q_CLOSE *q_c, prs_struct *ps, int depth);
BOOL lsa_io_r_close(char *desc, LSA_R_CLOSE *r_c, prs_struct *ps, int depth);
BOOL lsa_io_q_open_secret(char *desc, LSA_Q_OPEN_SECRET *q_c, prs_struct *ps, int depth);
BOOL lsa_io_r_open_secret(char *desc, LSA_R_OPEN_SECRET *r_c, prs_struct *ps, int depth);
/*The following definitions come from rpc_parse/parse_misc.c */
@ -3383,6 +3385,15 @@ pipes_struct *get_rpc_pipe(int pnum);
BOOL api_reg_rpc(pipes_struct *p);
#endif
/*The following definitions come from rpc_server/srv_reg_nt.c */
#if OLD_NTDOMAIN
uint32 _reg_close(pipes_struct *p, REG_Q_CLOSE *q_u, REG_R_CLOSE *r_u);
uint32 _reg_open(pipes_struct *p, REG_Q_OPEN_HKLM *q_u, REG_R_OPEN_HKLM *r_u);
uint32 _reg_open_entry(pipes_struct *p, REG_Q_OPEN_ENTRY *q_u, REG_R_OPEN_ENTRY *r_u);
uint32 _reg_info(pipes_struct *p, REG_Q_INFO *q_u, REG_R_INFO *r_u);
#endif
/*The following definitions come from rpc_server/srv_samr.c */
#if OLD_NTDOMAIN

View File

@ -360,4 +360,23 @@ typedef struct lsa_r_lookup_names
} LSA_R_LOOKUP_NAMES;
/* This is probably a policy handle but at the moment we
never read it - so use a dummy struct. */
typedef struct lsa_q_open_secret
{
uint32 dummy;
} LSA_Q_OPEN_SECRET;
/* We always return "not found" at present - so just marshal the minimum. */
typedef struct lsa_r_open_secret
{
uint32 dummy1;
uint32 dummy2;
uint32 dummy3;
uint32 dummy4;
uint32 status;
} LSA_R_OPEN_SECRET;
#endif /* _RPC_LSA_H */

View File

@ -1257,3 +1257,42 @@ BOOL lsa_io_r_close(char *desc, LSA_R_CLOSE *r_c, prs_struct *ps, int depth)
return True;
}
/*******************************************************************
Reads or writes an LSA_Q_OPEN_SECRET structure.
********************************************************************/
BOOL lsa_io_q_open_secret(char *desc, LSA_Q_OPEN_SECRET *q_c, prs_struct *ps, int depth)
{
prs_debug(ps, depth, desc, "lsa_io_q_open_secret");
depth++;
/* Don't bother to read or write at present... */
return True;
}
/*******************************************************************
Reads or writes an LSA_R_OPEN_SECRET structure.
********************************************************************/
BOOL lsa_io_r_open_secret(char *desc, LSA_R_OPEN_SECRET *r_c, prs_struct *ps, int depth)
{
prs_debug(ps, depth, desc, "lsa_io_r_open_secret");
depth++;
if(!prs_align(ps))
return False;
if(!prs_uint32("dummy1", ps, depth, &r_c->dummy1))
return False;
if(!prs_uint32("dummy2", ps, depth, &r_c->dummy2))
return False;
if(!prs_uint32("dummy3", ps, depth, &r_c->dummy3))
return False;
if(!prs_uint32("dummy4", ps, depth, &r_c->dummy4))
return False;
if(!prs_uint32("status", ps, depth, &r_c->status))
return False;
return True;
}

View File

@ -6,7 +6,7 @@
* Copyright (C) Andrew Tridgell 1992-1997,
* Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
* Copyright (C) Paul Ashton 1997.
* Copyright (C) Jeremy Allison 1998.
* Copyright (C) Jeremy Allison 2001.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -125,7 +125,7 @@ static void lsa_reply_enum_trust_dom(LSA_Q_ENUM_TRUST_DOM *q_e,
/* set up the LSA QUERY INFO response */
init_r_enum_trust_dom(&r_e, enum_context, dom_name, dom_sid,
dom_name != NULL ? 0x0 : 0x80000000 | NT_STATUS_UNABLE_TO_FREE_VM);
dom_name != NULL ? NT_STATUS_NO_PROBLEMO : NT_STATUS_UNABLE_TO_FREE_VM);
/* store the response in the SMB stream */
lsa_io_r_enum_trust_dom("", &r_e, rdata, 0);
@ -267,9 +267,9 @@ static void init_reply_lookup_names(LSA_R_LOOKUP_NAMES *r_l,
r_l->mapped_count = mapped_count;
if (mapped_count == 0)
r_l->status = 0xC0000000 | NT_STATUS_NONE_MAPPED;
r_l->status = NT_STATUS_NONE_MAPPED;
else
r_l->status = 0x0;
r_l->status = NT_STATUS_NO_PROBLEMO;
}
/***************************************************************************
@ -362,9 +362,9 @@ static void init_reply_lookup_sids(LSA_R_LOOKUP_SIDS *r_l,
r_l->mapped_count = mapped_count;
if (mapped_count == 0)
r_l->status = 0xC0000000 | NT_STATUS_NONE_MAPPED;
r_l->status = NT_STATUS_NONE_MAPPED;
else
r_l->status = 0x0;
r_l->status = NT_STATUS_NO_PROBLEMO;
}
/***************************************************************************
@ -398,36 +398,6 @@ static BOOL lsa_reply_lookup_sids(prs_struct *rdata, DOM_SID2 *sid, int num_entr
return True;
}
/***************************************************************************
lsa_reply_lookup_names
***************************************************************************/
static BOOL lsa_reply_lookup_names(prs_struct *rdata, UNISTR2 *names,
int num_entries)
{
LSA_R_LOOKUP_NAMES r_l;
DOM_R_REF ref;
DOM_RID2 rids[MAX_LOOKUP_SIDS];
uint32 mapped_count = 0;
BOOL result = True;
ZERO_STRUCT(r_l);
ZERO_STRUCT(ref);
ZERO_ARRAY(rids);
/* set up the LSA Lookup RIDs response */
init_lsa_rid2s(&ref, rids, num_entries, names, &mapped_count);
init_reply_lookup_names(&r_l, &ref, num_entries, rids, mapped_count);
/* store the response in the SMB stream */
if(!lsa_io_r_lookup_names("", &r_l, rdata, 0)) {
DEBUG(0,("lsa_reply_lookup_names: Failed to marshall LSA_R_LOOKUP_NAMES.\n"));
result = False;
}
return result;
}
/***************************************************************************
api_lsa_open_policy2
***************************************************************************/
@ -587,7 +557,7 @@ static BOOL api_lsa_query_info(pipes_struct *p)
break;
default:
DEBUG(0,("api_lsa_query_info: unknown info level in Lsa Query: %d\n", q_i.info_class));
r_q.status = (NT_STATUS_INVALID_INFO_CLASS | 0xC0000000);
r_q.status = NT_STATUS_INVALID_INFO_CLASS;
break;
}
@ -625,39 +595,91 @@ static BOOL api_lsa_lookup_sids(pipes_struct *p)
return result;
}
/***************************************************************************
lsa_reply_lookup_names
***************************************************************************/
static uint32 _lsa_lookup_names(pipes_struct *p,LSA_Q_LOOKUP_NAMES *q_u, LSA_R_LOOKUP_NAMES *r_u)
{
UNISTR2 *names = q_u->uni_name;
int num_entries = q_u->num_entries;
DOM_R_REF ref;
DOM_RID2 rids[MAX_LOOKUP_SIDS];
uint32 mapped_count = 0;
ZERO_STRUCT(ref);
ZERO_ARRAY(rids);
/* set up the LSA Lookup RIDs response */
init_lsa_rid2s(&ref, rids, num_entries, names, &mapped_count);
init_reply_lookup_names(r_u, &ref, num_entries, rids, mapped_count);
return r_u->status;
}
/***************************************************************************
api_lsa_lookup_names
***************************************************************************/
static BOOL api_lsa_lookup_names(pipes_struct *p)
{
LSA_Q_LOOKUP_NAMES q_l;
LSA_Q_LOOKUP_NAMES q_u;
LSA_R_LOOKUP_NAMES r_u;
prs_struct *data = &p->in_data.data;
prs_struct *rdata = &p->out_data.rdata;
ZERO_STRUCT(q_l);
ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u);
/* grab the info class and policy handle */
if(!lsa_io_q_lookup_names("", &q_l, data, 0)) {
if(!lsa_io_q_lookup_names("", &q_u, data, 0)) {
DEBUG(0,("api_lsa_lookup_names: failed to unmarshall LSA_Q_LOOKUP_NAMES.\n"));
return False;
}
return lsa_reply_lookup_names(rdata, q_l.uni_name, q_l.num_entries);
r_u.status = _lsa_lookup_names(p, &q_u, &r_u);
/* store the response in the SMB stream */
if(!lsa_io_r_lookup_names("", &r_u, rdata, 0)) {
DEBUG(0,("api_lsa_lookup_names: Failed to marshall LSA_R_LOOKUP_NAMES.\n"));
return False;
}
return True;
}
/***************************************************************************
api_lsa_close
_lsa_close. Also weird - needs to check if lsa handle is correct. JRA.
***************************************************************************/
static uint32 _lsa_close(pipes_struct *p, LSA_Q_CLOSE *q_u, LSA_R_CLOSE *r_u)
{
return NT_STATUS_NO_PROBLEMO;
}
/***************************************************************************
api_lsa_close.
***************************************************************************/
static BOOL api_lsa_close(pipes_struct *p)
{
LSA_R_CLOSE r_c;
LSA_Q_CLOSE q_u;
LSA_R_CLOSE r_u;
prs_struct *data = &p->in_data.data;
prs_struct *rdata = &p->out_data.rdata;
ZERO_STRUCT(r_c);
ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u);
if (!lsa_io_q_close("", &q_u, data, 0)) {
DEBUG(0,("api_lsa_close: lsa_io_q_close failed.\n"));
return False;
}
r_u.status = _lsa_close(p, &q_u, &r_u);
/* store the response in the SMB stream */
if (!lsa_io_r_close("", &r_c, rdata, 0)) {
if (!lsa_io_r_close("", &r_u, rdata, 0)) {
DEBUG(0,("api_lsa_close: lsa_io_r_close failed.\n"));
return False;
}
@ -666,26 +688,38 @@ static BOOL api_lsa_close(pipes_struct *p)
}
/***************************************************************************
api_lsa_open_secret
"No more secrets Marty...." :-).
***************************************************************************/
static uint32 _lsa_open_secret(pipes_struct *p, LSA_Q_OPEN_SECRET *q_u, LSA_R_OPEN_SECRET *r_u)
{
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
/***************************************************************************
api_lsa_open_secret.
***************************************************************************/
static BOOL api_lsa_open_secret(pipes_struct *p)
{
/* XXXX this is NOT good */
size_t i;
uint32 dummy = 0;
LSA_Q_OPEN_SECRET q_u;
LSA_R_OPEN_SECRET r_u;
prs_struct *data = &p->in_data.data;
prs_struct *rdata = &p->out_data.rdata;
for(i =0; i < 4; i++) {
if(!prs_uint32("api_lsa_close", rdata, 1, &dummy)) {
DEBUG(0,("api_lsa_open_secret: prs_uint32 %d failed.\n",
(int)i ));
return False;
}
ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u);
if(!lsa_io_q_open_secret("", &q_u, data, 0)) {
DEBUG(0,("api_lsa_open_secret: failed to unmarshall LSA_Q_OPEN_SECRET.\n"));
return False;
}
dummy = 0xC0000000 | NT_STATUS_OBJECT_NAME_NOT_FOUND;
if(!prs_uint32("api_lsa_close", rdata, 1, &dummy)) {
DEBUG(0,("api_lsa_open_secret: prs_uint32 status failed.\n"));
r_u.status = _lsa_open_secret(p, &q_u, &r_u);
/* store the response in the SMB stream */
if(!lsa_io_r_open_secret("", &r_u, rdata, 0)) {
DEBUG(0,("api_lsa_open_secret: Failed to marshall LSA_R_OPEN_SECRET.\n"));
return False;
}
@ -695,6 +729,7 @@ static BOOL api_lsa_open_secret(pipes_struct *p)
/***************************************************************************
\PIPE\ntlsa commands
***************************************************************************/
static struct api_struct api_lsa_cmds[] =
{
{ "LSA_OPENPOLICY2" , LSA_OPENPOLICY2 , api_lsa_open_policy2 },