summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2003-02-11 21:55:48 +0000
committerAndrew Tridgell <tridge@samba.org>2003-02-11 21:55:48 +0000
commitaa2abacaf48924797b6803786c14c9f303185e4a (patch)
treefdf9f691fb00d6f3117705f1ca0545ecbb708be1
parent7836b9a58d158a54a7326b3de5d2fa757a9bb5b6 (diff)
downloadsamba-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.c13
-rw-r--r--source/rpc_parse/parse_misc.c73
-rw-r--r--source/rpc_server/srv_lsa.c32
-rw-r--r--source/rpc_server/srv_lsa_nt.c29
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)