added server stubs for lsa_enum_acct_with_right
authorAndrew Tridgell <tridge@samba.org>
Tue, 11 Feb 2003 21:55:48 +0000 (21:55 +0000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 11 Feb 2003 21:55:48 +0000 (21:55 +0000)
(This used to be commit aa2abacaf48924797b6803786c14c9f303185e4a)

source3/rpc_parse/parse_lsa.c
source3/rpc_parse/parse_misc.c
source3/rpc_server/srv_lsa.c
source3/rpc_server/srv_lsa_nt.c

index 6832b0df667bc6b2c1b0adf2dbd93d385e2eaabb..53a0fc958d815c20db39e3b7b0b770044e268cba 100644 (file)
@@ -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);
+}
index 403a12ee538e801eb4946657114458840301d04c..524b1ed61c27c9239e51b406300cb74b1b501384 100644 (file)
@@ -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.
 ********************************************************************/
index ace95e730862b0e8b4a2cb561a55861b81ac6b8a..fad8f5641abef0cb25a27f0c2b2356dd1b0f23d5 100644 (file)
@@ -674,6 +674,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
  ***************************************************************************/
@@ -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},
     };
index 7a2f5ae4431d5b83acd2ba72b2b0fc10138151f8..57e8177bc6027cf9279c666958ad6b2eb9b39fe6 100644 (file)
@@ -1282,6 +1282,35 @@ NTSTATUS _lsa_enum_acct_rights(pipes_struct *p, LSA_Q_ENUM_ACCT_RIGHTS *q_u, LSA
        return r_u->status;
 }
 
+/***************************************************************************
+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
  ***************************************************************************/