groups and aliases being "manually" added which do not necessarily have
[samba.git] / source / rpc_server / srv_samr.c
index 2c0537709974364f7379aed6bc8abbd688e199db..ec3fa289a7e638799bb14dea734777ca3cbf8292 100644 (file)
@@ -34,10 +34,6 @@ extern DOM_SID global_sam_sid;
 extern DOM_SID global_sid_S_1_1;
 extern DOM_SID global_sid_S_1_5_20;
 
-extern rid_name domain_group_rids[];
-extern rid_name domain_alias_rids[];
-extern rid_name builtin_alias_rids[];
-
 /*******************************************************************
   This next function should be replaced with something that
   dynamically returns the correct user info..... JRA.
@@ -73,7 +69,10 @@ static BOOL get_sampwd_entries(SAM_USER_INFO_21 *pw_buf,
                        /* skip the requested number of entries.
                           not very efficient, but hey...
                         */
-                       start_idx--;
+                       if (acb_mask == 0 || IS_BITS_SET_SOME(pwd->acct_ctrl, acb_mask))
+                       {
+                               start_idx--;
+                       }
                        continue;
                }
 
@@ -344,11 +343,12 @@ static void samr_reply_enum_dom_users(SAMR_Q_ENUM_DOM_USERS *q_u,
        DEBUG(5,("samr_reply_enum_dom_users: %d\n", __LINE__));
 
        become_root(True);
-       get_sampwd_entries(pass, 0, &total_entries, &num_entries, MAX_SAM_ENTRIES, q_u->acb_mask);
+       get_sampwd_entries(pass, q_u->start_idx, &total_entries, &num_entries,
+                          MAX_SAM_ENTRIES, q_u->acb_mask);
        unbecome_root(True);
 
        make_samr_r_enum_dom_users(&r_e, 
-                                  0x00000000, num_entries,
+                                  q_u->start_idx + num_entries, num_entries,
                                   pass, r_e.status);
 
        /* store the response in the SMB stream */
@@ -402,7 +402,7 @@ static void samr_reply_add_groupmem(SAMR_Q_ADD_GROUPMEM *q_u,
                        DEBUG(10,("lookup on Domain SID\n"));
 
                        become_root(True);
-                       r_e.status = add_group_member(group_rid, q_u->rid) ? 0x0 : 0xC0000000 | NT_STATUS_ACCESS_DENIED;
+                       r_e.status = add_group_member(group_rid, q_u->rid) ? 0x0 : (0xC0000000 | NT_STATUS_ACCESS_DENIED);
                        unbecome_root(True);
                }
                else
@@ -460,7 +460,7 @@ static void samr_reply_del_groupmem(SAMR_Q_DEL_GROUPMEM *q_u,
                        DEBUG(10,("lookup on Domain SID\n"));
 
                        become_root(True);
-                       r_e.status = del_group_member(group_rid, q_u->rid) ? 0x0 : 0xC0000000 | NT_STATUS_ACCESS_DENIED;
+                       r_e.status = del_group_member(group_rid, q_u->rid) ? 0x0 : (0xC0000000 | NT_STATUS_ACCESS_DENIED);
                        unbecome_root(True);
                }
                else
@@ -518,7 +518,7 @@ static void samr_reply_add_aliasmem(SAMR_Q_ADD_ALIASMEM *q_u,
                        DEBUG(10,("add member on Domain SID\n"));
 
                        become_root(True);
-                       r_e.status = add_alias_member(alias_rid, &q_u->sid.sid) ? 0x0 : 0xC0000000 | NT_STATUS_ACCESS_DENIED;
+                       r_e.status = add_alias_member(alias_rid, &q_u->sid.sid) ? 0x0 : (0xC0000000 | NT_STATUS_ACCESS_DENIED);
                        unbecome_root(True);
                }
                else if (sid_equal(&alias_sid, &global_sid_S_1_5_20))
@@ -526,7 +526,7 @@ static void samr_reply_add_aliasmem(SAMR_Q_ADD_ALIASMEM *q_u,
                        DEBUG(10,("add member on BUILTIN SID\n"));
 
                        become_root(True);
-                       r_e.status = add_builtin_member(alias_rid, &q_u->sid.sid) ? 0x0 : 0xC0000000 | NT_STATUS_ACCESS_DENIED;
+                       r_e.status = add_builtin_member(alias_rid, &q_u->sid.sid) ? 0x0 : (0xC0000000 | NT_STATUS_ACCESS_DENIED);
                        unbecome_root(True);
                }
                else
@@ -584,7 +584,7 @@ static void samr_reply_del_aliasmem(SAMR_Q_DEL_ALIASMEM *q_u,
                        DEBUG(10,("del member on Domain SID\n"));
 
                        become_root(True);
-                       r_e.status = del_alias_member(alias_rid, &q_u->sid.sid) ? 0x0 : 0xC0000000 | NT_STATUS_ACCESS_DENIED;
+                       r_e.status = del_alias_member(alias_rid, &q_u->sid.sid) ? 0x0 : (0xC0000000 | NT_STATUS_ACCESS_DENIED);
                        unbecome_root(True);
                }
                else if (sid_equal(&alias_sid, &global_sid_S_1_5_20))
@@ -592,7 +592,7 @@ static void samr_reply_del_aliasmem(SAMR_Q_DEL_ALIASMEM *q_u,
                        DEBUG(10,("del member on BUILTIN SID\n"));
 
                        become_root(True);
-                       r_e.status = del_builtin_member(alias_rid, &q_u->sid.sid) ? 0x0 : 0xC0000000 | NT_STATUS_ACCESS_DENIED;
+                       r_e.status = del_builtin_member(alias_rid, &q_u->sid.sid) ? 0x0 : (0xC0000000 | NT_STATUS_ACCESS_DENIED);
                        unbecome_root(True);
                }
                else
@@ -658,33 +658,6 @@ static void samr_reply_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS *q_u,
                }
        }
 
-       if (r_e.status == 0x0 &&
-           (sid_equal(&sid, &global_sam_sid) ||
-            sid_equal(&sid, &global_sid_S_1_5_20)))
-       {
-               char *name;
-               int i = 0;
-               got_grps = True;
-
-               while (num_entries < MAX_SAM_ENTRIES && ((name = domain_group_rids[i].name) != NULL))
-               {
-                       DOMAIN_GRP tmp_grp;
-
-                       fstrcpy(tmp_grp.name   , name);
-                       fstrcpy(tmp_grp.comment, "");
-                       tmp_grp.rid = domain_group_rids[i].rid;
-                       tmp_grp.attr = 0x7;
-
-                       if (!add_domain_group(&grps, &num_entries, &tmp_grp))
-                       {
-                               r_e.status = 0xC0000000 | NT_STATUS_NO_MEMORY;
-                               break;
-                       }
-
-                       i++;
-               }
-       }
-
        if (r_e.status == 0 && got_grps)
        {
                make_samr_r_enum_dom_groups(&r_e, q_u->start_idx, num_entries, grps, r_e.status);
@@ -740,28 +713,21 @@ static void samr_reply_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES *q_u,
        /* well-known aliases */
        if (sid_equal(&sid, &global_sid_S_1_5_20))
        {
-               char *name;
+               BOOL ret;
+               /* builtin aliases */
 
-               while ((name = builtin_alias_rids[num_entries].name) != NULL)
+               become_root(True);
+               ret = enumdombuiltins(&alss, &num_entries);
+               unbecome_root(True);
+               if (!ret)
                {
-                       LOCAL_GRP tmp_als;
-
-                       fstrcpy(tmp_als.name   , name);
-                       fstrcpy(tmp_als.comment, "");
-                       tmp_als.rid = builtin_alias_rids[num_entries].rid;
-
-                       if (!add_domain_alias(&alss, &num_entries, &tmp_als))
-                       {
-                               r_e.status = 0xC0000000 | NT_STATUS_NO_MEMORY;
-                               break;
-                       }
+                       r_e.status = 0xC0000000 | NT_STATUS_NO_MEMORY;
                }
        }
        else if (sid_equal(&sid, &global_sam_sid))
        {
                BOOL ret;
                /* local aliases */
-               num_entries = 0;
 
                become_root(True);
                ret = enumdomaliases(&alss, &num_entries);
@@ -929,12 +895,12 @@ static void samr_reply_delete_dom_group(SAMR_Q_DELETE_DOM_GROUP *q_u,
                        DEBUG(10,("lookup on Domain SID\n"));
 
                        become_root(True);
-                       status = del_group_entry(group_rid) ? 0x0 : 0xC0000000 | NT_STATUS_NO_SUCH_GROUP;
+                       status = del_group_entry(group_rid) ? 0x0 : (0xC0000000 | NT_STATUS_NO_SUCH_GROUP);
                        unbecome_root(True);
                }
                else
                {
-                       status = 0xC0000000 | NT_STATUS_NO_SUCH_USER;
+                       status = 0xC0000000 | NT_STATUS_NO_SUCH_GROUP;
                }
        }
 
@@ -995,12 +961,12 @@ static void samr_reply_query_groupmem(SAMR_Q_QUERY_GROUPMEM *q_u,
                        DEBUG(10,("lookup on Domain SID\n"));
 
                        become_root(True);
-                       status = getgrouprid(group_rid, &mem_grp, &num_rids) != NULL ? 0x0 : 0xC0000000 | NT_STATUS_NO_SUCH_GROUP;
+                       status = getgrouprid(group_rid, &mem_grp, &num_rids) != NULL ? 0x0 : (0xC0000000 | NT_STATUS_NO_SUCH_GROUP);
                        unbecome_root(True);
                }
                else
                {
-                       status = 0xC0000000 | NT_STATUS_NO_SUCH_USER;
+                       status = 0xC0000000 | NT_STATUS_NO_SUCH_GROUP;
                }
        }
 
@@ -1248,15 +1214,15 @@ static void samr_reply_query_useraliases(SAMR_Q_QUERY_USERALIASES *q_u,
 
        if (status == 0x0 && num_rids > 0)
        {
-                       rid = malloc(num_rids * sizeof(uint32));
-                       if (mem_grp != NULL && rid != NULL)
+               rid = malloc(num_rids * sizeof(uint32));
+               if (mem_grp != NULL && rid != NULL)
+               {
+                       int i;
+                       for (i = 0; i < num_rids; i++)
                        {
-                               int i;
-                               for (i = 0; i < num_rids; i++)
-                               {
-                                       rid[i] = mem_grp[i].rid;
-                               }
-                               free(mem_grp);
+                               rid[i] = mem_grp[i].rid;
+                       }
+                       free(mem_grp);
                }
        }
 
@@ -1320,12 +1286,12 @@ static void samr_reply_delete_dom_alias(SAMR_Q_DELETE_DOM_ALIAS *q_u,
                        DEBUG(10,("lookup on Domain SID\n"));
 
                        become_root(True);
-                       status = del_alias_entry(alias_rid) ? 0x0 : 0xC0000000 | NT_STATUS_NO_SUCH_ALIAS;
+                       status = del_alias_entry(alias_rid) ? 0x0 : (0xC0000000 | NT_STATUS_NO_SUCH_ALIAS);
                        unbecome_root(True);
                }
                else
                {
-                       status = 0xC0000000 | NT_STATUS_NO_SUCH_USER;
+                       status = 0xC0000000 | NT_STATUS_NO_SUCH_ALIAS;
                }
        }
 
@@ -1385,7 +1351,7 @@ static void samr_reply_query_aliasmem(SAMR_Q_QUERY_ALIASMEM *q_u,
                        DEBUG(10,("lookup on S-1-5-20\n"));
 
                        become_root(True);
-                       status = getbuiltinrid(alias_rid, &mem_grp, &num_sids) != NULL ? 0x0 : 0xC0000000 | NT_STATUS_NO_SUCH_GROUP;
+                       status = getbuiltinrid(alias_rid, &mem_grp, &num_sids) != NULL ? 0x0 : 0xC0000000 | NT_STATUS_NO_SUCH_ALIAS;
                        unbecome_root(True);
                }
                else if (sid_equal(&alias_sid, &global_sam_sid))
@@ -1393,12 +1359,12 @@ static void samr_reply_query_aliasmem(SAMR_Q_QUERY_ALIASMEM *q_u,
                        DEBUG(10,("lookup on Domain SID\n"));
 
                        become_root(True);
-                       status = getaliasrid(alias_rid, &mem_grp, &num_sids) != NULL ? 0x0 : 0xC0000000 | NT_STATUS_NO_SUCH_GROUP;
+                       status = getaliasrid(alias_rid, &mem_grp, &num_sids) != NULL ? 0x0 : 0xC0000000 | NT_STATUS_NO_SUCH_ALIAS;
                        unbecome_root(True);
                }
                else
                {
-                       status = 0xC0000000 | NT_STATUS_NO_SUCH_USER;
+                       status = 0xC0000000 | NT_STATUS_NO_SUCH_ALIAS;
                }
        }
 
@@ -1523,8 +1489,8 @@ static void samr_reply_chgpasswd_user(SAMR_Q_CHGPASSWD_USER *q_u,
        fstring user_name;
        fstring wks;
 
-       fstrcpy(user_name, unistrn2(q_u->uni_user_name.buffer, q_u->uni_user_name.uni_str_len));
-       fstrcpy(wks      , unistrn2(q_u->uni_dest_host.buffer, q_u->uni_dest_host.uni_str_len));
+       fstrcpy(user_name, unistr2_to_str(&q_u->uni_user_name));
+       fstrcpy(wks      , unistr2_to_str(&q_u->uni_dest_host));
 
        DEBUG(5,("samr_chgpasswd_user: user: %s wks: %s\n", user_name, wks));
 
@@ -1845,7 +1811,7 @@ static void samr_reply_query_userinfo(SAMR_Q_QUERY_USERINFO *q_u,
                        case 0x10:
                        {
                                info = (void*)&id10;
-                               status = get_user_info_10(&id10, rid) ? 0 : NT_STATUS_NO_SUCH_USER;
+                               status = get_user_info_10(&id10, rid) ? 0 : (0xC0000000 | NT_STATUS_NO_SUCH_USER);
                                break;
                        }
 #if 0
@@ -1866,7 +1832,7 @@ static void samr_reply_query_userinfo(SAMR_Q_QUERY_USERINFO *q_u,
                        case 21:
                        {
                                info = (void*)&id21;
-                               status = get_user_info_21(&id21, rid) ? 0 : NT_STATUS_NO_SUCH_USER;
+                               status = get_user_info_21(&id21, rid) ? 0 : (0xC0000000 | NT_STATUS_NO_SUCH_USER);
                                break;
                        }
 
@@ -2063,7 +2029,7 @@ static void samr_reply_create_dom_alias(SAMR_Q_CREATE_DOM_ALIAS *q_u,
                grp.rid = 0xffffffff;
 
                become_root(True);
-               status = add_alias_entry(&grp) ? 0 : 0xC0000000 | NT_STATUS_ACCESS_DENIED;
+               status = add_alias_entry(&grp) ? 0 : (0xC0000000 | NT_STATUS_ACCESS_DENIED);
                unbecome_root(True);
        }
 
@@ -2175,7 +2141,7 @@ static void samr_reply_create_dom_group(SAMR_Q_CREATE_DOM_GROUP *q_u,
                grp.attr = 0x07;
 
                become_root(True);
-               status = add_group_entry(&grp) ? 0x0 : 0xC0000000 | NT_STATUS_ACCESS_DENIED;
+               status = add_group_entry(&grp) ? 0x0 : (0xC0000000 | NT_STATUS_ACCESS_DENIED);
                unbecome_root(True);
        }
 
@@ -2336,8 +2302,7 @@ static void api_samr_unknown_32( uint16 vuid, prs_struct *data, prs_struct *rdat
           reply if the account already exists...
         */
 
-       fstrcpy(mach_acct, unistrn2(q_u.uni_mach_acct.buffer,
-                                   q_u.uni_mach_acct.uni_str_len));
+       fstrcpy(mach_acct, unistr2_to_str(&q_u.uni_mach_acct));
 
        become_root(True);
        sam_pass = getsam21pwntnam(mach_acct);