diff options
author | Andrew Tridgell <tridge@samba.org> | 2003-02-11 21:55:48 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2003-02-11 21:55:48 +0000 |
commit | aa2abacaf48924797b6803786c14c9f303185e4a (patch) | |
tree | fdf9f691fb00d6f3117705f1ca0545ecbb708be1 | |
parent | 7836b9a58d158a54a7326b3de5d2fa757a9bb5b6 (diff) | |
download | samba-aa2abacaf48924797b6803786c14c9f303185e4a.tar.gz samba-aa2abacaf48924797b6803786c14c9f303185e4a.tar.xz samba-aa2abacaf48924797b6803786c14c9f303185e4a.zip |
added server stubs for lsa_enum_acct_with_right
-rw-r--r-- | source/rpc_parse/parse_lsa.c | 13 | ||||
-rw-r--r-- | source/rpc_parse/parse_misc.c | 73 | ||||
-rw-r--r-- | source/rpc_server/srv_lsa.c | 32 | ||||
-rw-r--r-- | source/rpc_server/srv_lsa_nt.c | 29 |
4 files changed, 147 insertions, 0 deletions
diff --git a/source/rpc_parse/parse_lsa.c b/source/rpc_parse/parse_lsa.c index 6832b0df667..53a0fc958d8 100644 --- a/source/rpc_parse/parse_lsa.c +++ b/source/rpc_parse/parse_lsa.c @@ -2510,3 +2510,16 @@ BOOL lsa_io_r_enum_acct_with_right(const char *desc, LSA_R_ENUM_ACCT_WITH_RIGHT return True; } + +/******************************************************************* + Inits an LSA_R_ENUM_ACCT_WITH_RIGHT structure. +********************************************************************/ +void init_r_enum_acct_with_right(LSA_R_ENUM_ACCT_WITH_RIGHT *r_c, + uint32 count, + DOM_SID *sids) +{ + DEBUG(5, ("init_r_enum_acct_with_right\n")); + + r_c->count = count; + init_sid_array(&r_c->sids, count, sids); +} diff --git a/source/rpc_parse/parse_misc.c b/source/rpc_parse/parse_misc.c index 403a12ee538..524b1ed61c2 100644 --- a/source/rpc_parse/parse_misc.c +++ b/source/rpc_parse/parse_misc.c @@ -1122,6 +1122,79 @@ BOOL smb_io_unistr2_array(const char *desc, UNISTR2_ARRAY *array, prs_struct *ps } +/* + initialise a SID_ARRAY from a list of sids +*/ +BOOL init_sid_array(SID_ARRAY *array, + uint32 count, DOM_SID *sids) +{ + int i; + + array->count = count; + array->ref_id = count?1:0; + if (array->count == 0) { + return True; + } + + array->sids = (SID_ARRAY_EL *)talloc_zero(get_talloc_ctx(), count * sizeof(SID_ARRAY_EL)); + if (!array->sids) { + return False; + } + + for (i=0;i<count;i++) { + array->sids[i].ref_id = 1; + init_dom_sid2(&array->sids[i].sid, &sids[i]); + } + + return True; +} + + +/******************************************************************* + Reads or writes a SID_ARRAY structure. +********************************************************************/ +BOOL smb_io_sid_array(const char *desc, SID_ARRAY *array, prs_struct *ps, int depth) +{ + int i; + + prs_debug(ps, depth, desc, "smb_io_sid_array"); + depth++; + + if(!prs_uint32("ref_id", ps, depth, &array->ref_id)) + return False; + + if (! array->ref_id) { + return True; + } + + if(!prs_uint32("count", ps, depth, &array->count)) + return False; + + if (array->count == 0) { + return True; + } + + if (UNMARSHALLING(ps)) { + array->sids = talloc_zero(get_talloc_ctx(), array->count * sizeof(array->sids[0])); + } + if (! array->sids) { + return False; + } + + for (i=0;i<array->count;i++) { + if(!prs_uint32("ref_id", ps, depth, &array->sids[i].ref_id)) + return False; + } + + for (i=0;i<array->count;i++) { + if (!smb_io_dom_sid2("sid", &array->sids[i].sid, ps, depth)) + return False; + } + + return True; +} + + /******************************************************************* Reads or writes a SID_ARRAY structure. ********************************************************************/ diff --git a/source/rpc_server/srv_lsa.c b/source/rpc_server/srv_lsa.c index ace95e73086..fad8f5641ab 100644 --- a/source/rpc_server/srv_lsa.c +++ b/source/rpc_server/srv_lsa.c @@ -675,6 +675,37 @@ static BOOL api_lsa_enum_acct_rights(pipes_struct *p) /*************************************************************************** + api_lsa_enum_acct_with_right + ***************************************************************************/ +static BOOL api_lsa_enum_acct_with_right(pipes_struct *p) +{ + LSA_Q_ENUM_ACCT_WITH_RIGHT q_u; + LSA_R_ENUM_ACCT_WITH_RIGHT r_u; + + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; + + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); + + if(!lsa_io_q_enum_acct_with_right("", &q_u, data, 0)) { + DEBUG(0,("api_lsa_enum_acct_with_right: failed to unmarshall LSA_Q_ENUM_ACCT_WITH_RIGHT.\n")); + return False; + } + + r_u.status = _lsa_enum_acct_with_right(p, &q_u, &r_u); + + /* store the response in the SMB stream */ + if(!lsa_io_r_enum_acct_with_right("", &r_u, rdata, 0)) { + DEBUG(0,("api_lsa_enum_acct_with_right: Failed to marshall LSA_R_ENUM_ACCT_WITH_RIGHT.\n")); + return False; + } + + return True; +} + + +/*************************************************************************** api_lsa_add_acctrights ***************************************************************************/ static BOOL api_lsa_add_acct_rights(pipes_struct *p) @@ -769,6 +800,7 @@ int rpc_lsa_init(void) { "LSA_QUERYSECOBJ" , LSA_QUERYSECOBJ , api_lsa_query_secobj }, { "LSA_QUERYINFO2" , LSA_QUERYINFO2 , api_lsa_query_info2 }, { "LSA_ENUMACCTRIGHTS" , LSA_ENUMACCTRIGHTS , api_lsa_enum_acct_rights }, + { "LSA_ENUMACCTWITHRIGHT", LSA_ENUMACCTWITHRIGHT, api_lsa_enum_acct_with_right }, { "LSA_ADDACCTRIGHTS" , LSA_ADDACCTRIGHTS , api_lsa_add_acct_rights }, { "LSA_REMOVEACCTRIGHTS", LSA_REMOVEACCTRIGHTS, api_lsa_remove_acct_rights}, }; diff --git a/source/rpc_server/srv_lsa_nt.c b/source/rpc_server/srv_lsa_nt.c index 7a2f5ae4431..57e8177bc60 100644 --- a/source/rpc_server/srv_lsa_nt.c +++ b/source/rpc_server/srv_lsa_nt.c @@ -1283,6 +1283,35 @@ NTSTATUS _lsa_enum_acct_rights(pipes_struct *p, LSA_Q_ENUM_ACCT_RIGHTS *q_u, LSA } /*************************************************************************** +return a list of SIDs for a particular privilege + ***************************************************************************/ +NTSTATUS _lsa_enum_acct_with_right(pipes_struct *p, + LSA_Q_ENUM_ACCT_WITH_RIGHT *q_u, + LSA_R_ENUM_ACCT_WITH_RIGHT *r_u) +{ + struct lsa_info *info=NULL; + char *right; + DOM_SID *sids = NULL; + uint32 count = 0; + + r_u->status = NT_STATUS_OK; + + /* find the connection policy handle. */ + if (!find_policy_by_hnd(p, &q_u->pol, (void **)&info)) + return NT_STATUS_INVALID_HANDLE; + + right = unistr2_tdup(p->mem_ctx, &q_u->right); + + DEBUG(5,("lsa_enum_acct_with_right on right %s\n", right)); + + /* no backend db yet .... */ + + init_r_enum_acct_with_right(r_u, count, sids); + + return r_u->status; +} + +/*************************************************************************** add privileges to a acct by SID ***************************************************************************/ NTSTATUS _lsa_add_acct_rights(pipes_struct *p, LSA_Q_ADD_ACCT_RIGHTS *q_u, LSA_R_ADD_ACCT_RIGHTS *r_u) |