added rid and sid_name_use to DOMAIN_GRP_MEMBER, for use in group member
authorLuke Leighton <lkcl@samba.org>
Wed, 2 Dec 1998 22:05:56 +0000 (22:05 +0000)
committerLuke Leighton <lkcl@samba.org>
Wed, 2 Dec 1998 22:05:56 +0000 (22:05 +0000)
query.

domain groups now work, hurrah!  only thing is that the description is
one character long, don't know why (which is wierd in itself).

source/groupdb/groupunix.c
source/include/rpc_samr.h
source/include/smb.h
source/rpc_parse/parse_misc.c
source/rpc_parse/parse_samr.c
source/rpc_server/srv_samr.c

index 685e8146c024b67558e94090857aba762d176d9b..154e23338d9ce9dd10aa79aae41ff810d5494609 100644 (file)
@@ -84,6 +84,8 @@ BOOL get_unixgroup_members(struct group *grp,
        for (i = 0; (unix_name = grp->gr_mem[i]) != NULL; i++)
        {
                DOM_NAME_MAP gmep;
+               DOMAIN_GRP_MEMBER *mem;
+               uint32 rid;
 
                if (!lookupsmbpwnam (unix_name, &gmep) &&
                    !lookupsmbgrpnam(unix_name, &gmep))
@@ -100,7 +102,8 @@ BOOL get_unixgroup_members(struct group *grp,
                        continue;
                }
                        
-               if (!sid_front_equal(&global_sam_sid, &gmep.sid))
+               sid_split_rid(&gmep.sid, &rid);
+               if (!sid_equal(&global_sam_sid, &gmep.sid))
                {
                        DEBUG(0,("group database: could not resolve name %s (wrong Domain SID)\n",
                                  unix_name));
@@ -113,9 +116,13 @@ BOOL get_unixgroup_members(struct group *grp,
                        return False;
                }
 
-               fstrcpy((*members)[(*num_mem)].name, gmep.nt_name);
-               (*members)[(*num_mem)].attr = 0x07;
+               mem = &(*members)[(*num_mem)];
                (*num_mem)++;
+
+               fstrcpy(mem->name, gmep.nt_name);
+               mem->attr    = 0x07;
+               mem->sid_use = gmep.type;
+               mem->rid     = rid;
        }
        return True;
 }
index 4c42c18921a3b3b1fe52c9437ecd1ca4cf210c5c..657058d9407271ecea5301e561fea4862f4ee1f9 100644 (file)
@@ -1037,20 +1037,20 @@ SAMR_R_UNKNOWN_12 - do a conversion from group RID to names
 /* SAMR_R_UNKNOWN_12 */
 typedef struct r_samr_unknown_12_info
 {
-    POLICY_HND pol;       /* policy handle */
+       POLICY_HND pol;       /* policy handle */
 
-       uint32 num_aliases1;      /* number of aliases being looked up */
-       uint32 ptr_aliases;       /* pointer to aliases */
-       uint32 num_aliases2;      /* number of aliases being looked up */
+       uint32 num_names1;      /* number of aliases being looked up */
+       uint32 ptr_names;       /* pointer to aliases */
+       uint32 num_names2;      /* number of aliases being looked up */
 
-       UNIHDR  hdr_als_name[MAX_LOOKUP_SIDS]; /* unicode account name header */
-       UNISTR2 uni_als_name[MAX_LOOKUP_SIDS]; /* unicode account name string */
+       UNIHDR  hdr_name[MAX_LOOKUP_SIDS]; /* unicode account name header */
+       UNISTR2 uni_name[MAX_LOOKUP_SIDS]; /* unicode account name string */
 
-       uint32 num_als_usrs1;      /* number of users in aliases being looked up */
-       uint32 ptr_als_usrs;       /* pointer to users in aliases */
-       uint32 num_als_usrs2;      /* number of users in aliases being looked up */
+       uint32 num_types1;      /* number of users in aliases being looked up */
+       uint32 ptr_types;       /* pointer to users in aliases */
+       uint32 num_types2;      /* number of users in aliases being looked up */
 
-       uint32 num_als_usrs[MAX_LOOKUP_SIDS]; /* number of users per group */
+       uint32 type[MAX_LOOKUP_SIDS]; /* SID_ENUM type */
 
        uint32 status;
 
index 3d8dd14a1b89c8b52e6b29dc1dd8c0af5cfd4983..e4191f706d2bc396b95c47e13c6d9d2e3a4aaa7b 100644 (file)
@@ -486,6 +486,8 @@ typedef struct domain_grp_member_info
 {
        fstring name;
        uint8   attr; /* attributes forced to be set to 0x7: SE_GROUP_xxx */
+       uint32  rid; /* rid of domain group member */
+       uint8   sid_use; /* usr=1 grp=2 dom=3 alias=4 wkng=5 del=6 inv=7 unk=8 */
 
 } DOMAIN_GRP_MEMBER;
 
index 6c42070de4d90b52db17a145efe45606b67732a1..18c5f23ce37a3e7addd73a3cdeca3cc1e6e2884c 100644 (file)
@@ -458,7 +458,7 @@ void smb_io_buffer2(char *desc,  BUFFER2 *buf2, uint32 buffer, prs_struct *ps, i
 
                prs_align(ps);
                
-               prs_uint32("uni_max_len", ps, depth, &(buf2->buf_max_len));
+               prs_uint32("buf_max_len", ps, depth, &(buf2->buf_max_len));
                prs_uint32("undoc      ", ps, depth, &(buf2->undoc      ));
                prs_uint32("buf_len    ", ps, depth, &(buf2->buf_len));
 
index 8e0ecef3d4e0c223c72e74722d70ced1d86ed7eb..5a9b7660ab93c48335c7069e2f3b019c2f9765d5 100644 (file)
@@ -1387,7 +1387,7 @@ void make_samr_group_info1(GROUP_INFO1 *gr1,
        make_uni_hdr(&(gr1->hdr_acct_desc), desc_len , desc_len, acct_desc ? 1 : 0);
 
        gr1->unknown_1 = 0x3;
-       gr1->unknown_2 = 0x1;
+       gr1->unknown_2 = 0x3;
 
        make_unistr2(&(gr1->uni_acct_name), acct_name, acct_len);
        make_unistr2(&(gr1->uni_acct_desc), acct_desc, desc_len);
@@ -1406,13 +1406,15 @@ void samr_io_group_info1(char *desc,  GROUP_INFO1 *gr1, prs_struct *ps, int dept
 
        prs_align(ps);
 
-       smb_io_unihdr ("hdr_acct_desc", &(gr1->hdr_acct_desc) , ps, depth); 
+       smb_io_unihdr ("hdr_acct_name", &(gr1->hdr_acct_name) , ps, depth); 
        smb_io_unihdr ("hdr_acct_desc", &(gr1->hdr_acct_desc) , ps, depth); 
 
        prs_uint32("unknown_1", ps, depth, &(gr1->unknown_1));
        prs_uint32("unknown_2", ps, depth, &(gr1->unknown_2));
 
-       smb_io_unistr2("uni_acct_desc", &(gr1->uni_acct_desc), gr1->hdr_acct_desc.buffer, ps, depth);
+       smb_io_unistr2("uni_acct_name", &(gr1->uni_acct_name), gr1->hdr_acct_name.buffer, ps, depth);
+       prs_align(ps);
+
        smb_io_unistr2("uni_acct_desc", &(gr1->uni_acct_desc), gr1->hdr_acct_desc.buffer, ps, depth);
 }
 
@@ -1460,25 +1462,22 @@ void samr_group_info_ctr(char *desc,  GROUP_INFO_CTR *ctr, prs_struct *ps, int d
        prs_uint16("switch_value", ps, depth, &(ctr->switch_value));
        prs_align(ps);
 
-       if (ctr->switch_value != 0)
+       switch (ctr->switch_value)
        {
-               switch (ctr->switch_value)
+               case 1:
                {
-                       case 1:
-                       {
-                               samr_io_group_info1("group_info1", &(ctr->group.info1), ps, depth);
-                               break;
-                       }
-                       case 4:
-                       {
-                               samr_io_group_info4("group_info4", &(ctr->group.info4), ps, depth);
-                               break;
-                       }
-                       default:
-                       {
-                               DEBUG(4,("samr_group_info_ctr: unsupported switch level\n"));
-                               break;
-                       }
+                       samr_io_group_info1("group_info1", &(ctr->group.info1), ps, depth);
+                       break;
+               }
+               case 4:
+               {
+                       samr_io_group_info4("group_info4", &(ctr->group.info4), ps, depth);
+                       break;
+               }
+               default:
+               {
+                       DEBUG(4,("samr_group_info_ctr: unsupported switch level\n"));
+                       break;
                }
        }
 
@@ -2483,43 +2482,43 @@ void samr_io_q_unknown_12(char *desc,  SAMR_Q_UNKNOWN_12 *q_u, prs_struct *ps, i
 makes a SAMR_R_UNKNOWN_12 structure.
 ********************************************************************/
 void make_samr_r_unknown_12(SAMR_R_UNKNOWN_12 *r_u,
-               uint32 num_aliases, fstring *als_name, uint8 *num_als_usrs,
+               uint32 num_names, fstring *name, uint8 *type,
                uint32 status)
 {
        int i;
-       if (r_u == NULL || als_name == NULL || num_als_usrs == NULL) return;
+       if (r_u == NULL || name == NULL || type == NULL) return;
 
        DEBUG(5,("make_samr_r_unknown_12\n"));
 
        if (status == 0x0)
        {
-               r_u->num_aliases1 = num_aliases;
-               r_u->ptr_aliases  = 1;
-               r_u->num_aliases2 = num_aliases;
+               r_u->num_names1 = num_names;
+               r_u->ptr_names  = 1;
+               r_u->num_names2 = num_names;
 
-               r_u->num_als_usrs1 = num_aliases;
-               r_u->ptr_als_usrs  = 1;
-               r_u->num_als_usrs2 = num_aliases;
+               r_u->num_types1 = num_names;
+               r_u->ptr_types  = 1;
+               r_u->num_types2 = num_names;
 
-               SMB_ASSERT_ARRAY(r_u->hdr_als_name, num_aliases);
+               SMB_ASSERT_ARRAY(r_u->hdr_name, num_names);
 
-               for (i = 0; i < num_aliases; i++)
+               for (i = 0; i < num_names; i++)
                {
-                       int als_len = als_name[i] != NULL ? strlen(als_name[i]) : 0;
-                       make_uni_hdr(&(r_u->hdr_als_name[i]), als_len    , als_len, als_name[i] ? 1 : 0);
-                       make_unistr2(&(r_u->uni_als_name[i]), als_name[i], als_len);
-                       r_u->num_als_usrs[i] = num_als_usrs[i];
+                       int len = name[i] != NULL ? strlen(name[i]) : 0;
+                       make_uni_hdr(&(r_u->hdr_name[i]), len    , len, name[i] ? 1 : 0);
+                       make_unistr2(&(r_u->uni_name[i]), name[i], len);
+                       r_u->type[i] = type[i];
                }
        }
        else
        {
-               r_u->num_aliases1 = num_aliases;
-               r_u->ptr_aliases  = 0;
-               r_u->num_aliases2 = num_aliases;
+               r_u->num_names1 = num_names;
+               r_u->ptr_names  = 0;
+               r_u->num_names2 = num_names;
 
-               r_u->num_als_usrs1 = num_aliases;
-               r_u->ptr_als_usrs  = 0;
-               r_u->num_als_usrs2 = num_aliases;
+               r_u->num_types1 = num_names;
+               r_u->ptr_types  = 0;
+               r_u->num_types2 = num_names;
        }
 
        r_u->status = status;
@@ -2539,43 +2538,41 @@ void samr_io_r_unknown_12(char *desc,  SAMR_R_UNKNOWN_12 *r_u, prs_struct *ps, i
 
        prs_align(ps);
 
-       prs_uint32("num_aliases1", ps, depth, &(r_u->num_aliases1));
-       prs_uint32("ptr_aliases ", ps, depth, &(r_u->ptr_aliases ));
-       prs_uint32("num_aliases2", ps, depth, &(r_u->num_aliases2));
+       prs_uint32("num_names1", ps, depth, &(r_u->num_names1));
+       prs_uint32("ptr_names ", ps, depth, &(r_u->ptr_names ));
+       prs_uint32("num_names2", ps, depth, &(r_u->num_names2));
 
-       if (r_u->ptr_aliases != 0 && r_u->num_aliases1 != 0)
+       if (r_u->ptr_names != 0 && r_u->num_names1 != 0)
        {
-               SMB_ASSERT_ARRAY(r_u->hdr_als_name, r_u->num_aliases2);
+               SMB_ASSERT_ARRAY(r_u->hdr_name, r_u->num_names2);
 
-               for (i = 0; i < r_u->num_aliases2; i++)
+               for (i = 0; i < r_u->num_names2; i++)
                {
                        prs_grow(ps);
-                       slprintf(tmp, sizeof(tmp) - 1, "als_hdr[%02d]  ", i);
-                       smb_io_unihdr ("", &(r_u->hdr_als_name[i]), ps, depth); 
+                       slprintf(tmp, sizeof(tmp) - 1, "hdr[%02d]  ", i);
+                       smb_io_unihdr ("", &(r_u->hdr_name[i]), ps, depth); 
                }
-               for (i = 0; i < r_u->num_aliases2; i++)
+               for (i = 0; i < r_u->num_names2; i++)
                {
                        prs_grow(ps);
-                       slprintf(tmp, sizeof(tmp) - 1, "als_str[%02d]  ", i);
-                       smb_io_unistr2("", &(r_u->uni_als_name[i]), r_u->hdr_als_name[i].buffer, ps, depth); 
+                       slprintf(tmp, sizeof(tmp) - 1, "str[%02d]  ", i);
+                       smb_io_unistr2("", &(r_u->uni_name[i]), r_u->hdr_name[i].buffer, ps, depth); 
                }
        }
 
        prs_align(ps);
 
-       prs_uint32("num_als_usrs1", ps, depth, &(r_u->num_als_usrs1));
-       prs_uint32("ptr_als_usrs ", ps, depth, &(r_u->ptr_als_usrs ));
-       prs_uint32("num_als_usrs2", ps, depth, &(r_u->num_als_usrs2));
+       prs_uint32("num_types1", ps, depth, &(r_u->num_types1));
+       prs_uint32("ptr_types ", ps, depth, &(r_u->ptr_types ));
+       prs_uint32("num_types2", ps, depth, &(r_u->num_types2));
 
-       if (r_u->ptr_als_usrs != 0 && r_u->num_als_usrs1 != 0)
+       if (r_u->ptr_types != 0 && r_u->num_types1 != 0)
        {
-               SMB_ASSERT_ARRAY(r_u->num_als_usrs, r_u->num_als_usrs2);
-
-               for (i = 0; i < r_u->num_als_usrs2; i++)
+               for (i = 0; i < r_u->num_types2; i++)
                {
                        prs_grow(ps);
-                       slprintf(tmp, sizeof(tmp) - 1, "als_usrs[%02d]  ", i);
-                       prs_uint32(tmp, ps, depth, &(r_u->num_als_usrs[i]));
+                       slprintf(tmp, sizeof(tmp) - 1, "type[%02d]  ", i);
+                       prs_uint32(tmp, ps, depth, &(r_u->type[i]));
                }
        }
 
index 505fad25b4ecce152bc3eacab961669b474d7850..7bc12afe748cea3908e1e02a282352172b2239c1 100644 (file)
@@ -670,7 +670,6 @@ static void api_samr_query_dispinfo( uint16 vuid, prs_struct *data, prs_struct *
        samr_reply_query_dispinfo(&q_e, rdata);
 }
 
-#if 0
 /*******************************************************************
  samr_reply_query_groupmem
  ********************************************************************/
@@ -741,9 +740,14 @@ static void samr_reply_query_groupmem(SAMR_Q_QUERY_GROUPMEM *q_u,
        /* store the response in the SMB stream */
        samr_io_r_query_groupmem("", &r_u, rdata, 0);
 
-       if (sid != NULL)
+       if (rid != NULL)
        {
-               free(sid);
+               free(rid);
+       }
+
+       if (attr != NULL)
+       {
+               free(attr);
        }
 
        DEBUG(5,("samr_query_groupmem: %d\n", __LINE__));
@@ -764,8 +768,6 @@ static void api_samr_query_groupmem( uint16 vuid, prs_struct *data, prs_struct *
        samr_reply_query_groupmem(&q_u, rdata);
 }
 
-#endif
-
 
 /*******************************************************************
  samr_reply_query_groupinfo
@@ -793,13 +795,13 @@ static void samr_reply_query_groupinfo(SAMR_Q_QUERY_GROUPINFO *q_u,
                {
                        r_e.ptr = 1;
                        ctr.switch_value = 1;
-                       make_samr_group_info1(&ctr.group.info1, "<account name>", "<account description>");
+                       make_samr_group_info1(&ctr.group.info1, "account name", "account description");
                }
                else if (q_u->switch_level == 4)
                {
                        r_e.ptr = 1;
                        ctr.switch_value = 4;
-                       make_samr_group_info4(&ctr.group.info4, "<account description>");
+                       make_samr_group_info4(&ctr.group.info4, "account description");
                }
                else
                {
@@ -1296,7 +1298,6 @@ static void samr_reply_unknown_12(SAMR_Q_UNKNOWN_12 *q_u,
                        sid_copy(&sid, &pol_sid);
                        sid_append_rid(&sid, q_u->gid[i]);
                        lookup_sid(&sid, group_names[i], &group_attrs[i]);
-                       group_attrs[i] = 0x2;
                }
        }
 
@@ -2075,6 +2076,7 @@ static struct api_struct api_samr_cmds [] =
        { "SAMR_ENUM_DOM_ALIASES" , SAMR_ENUM_DOM_ALIASES , api_samr_enum_dom_aliases },
        { "SAMR_QUERY_USERALIASES", SAMR_QUERY_USERALIASES, api_samr_query_useraliases},
        { "SAMR_QUERY_ALIASMEM"   , SAMR_QUERY_ALIASMEM   , api_samr_query_aliasmem   },
+       { "SAMR_QUERY_GROUPMEM"   , SAMR_QUERY_GROUPMEM   , api_samr_query_groupmem   },
        { "SAMR_LOOKUP_NAMES"     , SAMR_LOOKUP_NAMES     , api_samr_lookup_names     },
        { "SAMR_OPEN_USER"        , SAMR_OPEN_USER        , api_samr_open_user        },
        { "SAMR_QUERY_USERINFO"   , SAMR_QUERY_USERINFO   , api_samr_query_userinfo   },