1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-11 05:18:09 +03:00

r6080: Port some of the non-critical changes from HEAD to 3_0. The main one is the

change in pdb_enum_alias_memberships to match samr.idl a bit closer.

Volker
(This used to be commit 3a67865169)
This commit is contained in:
Volker Lendecke 2005-03-27 16:33:04 +00:00 committed by Gerald (Jerry) Carter
parent 0aa89db947
commit e84ead0cfd
13 changed files with 253 additions and 106 deletions

View File

@ -518,7 +518,7 @@ static NTSTATUS one_alias_membership(const DOM_SID *member,
if (!string_to_sid(&alias, string_sid))
continue;
add_sid_to_array_unique(&alias, sids, num);
add_sid_to_array_unique(NULL, &alias, sids, num);
if (sids == NULL)
return NT_STATUS_NO_MEMORY;
@ -665,7 +665,7 @@ static int collect_aliasmem(TDB_CONTEXT *tdb_ctx, TDB_DATA key, TDB_DATA data,
if (!string_to_sid(&member, member_string))
continue;
add_sid_to_array(&member, closure->sids, closure->num);
add_sid_to_array(NULL, &member, closure->sids, closure->num);
}
return 0;
@ -1348,11 +1348,42 @@ NTSTATUS pdb_default_enum_aliasmem(struct pdb_methods *methods,
}
NTSTATUS pdb_default_alias_memberships(struct pdb_methods *methods,
const DOM_SID *members,
TALLOC_CTX *mem_ctx,
const DOM_SID *domain_sid,
const DOM_SID const *members,
int num_members,
DOM_SID **aliases, int *num)
uint32 **alias_rids,
int *num_alias_rids)
{
return alias_memberships(members, num_members, aliases, num);
DOM_SID *alias_sids;
int i, num_alias_sids;
NTSTATUS result;
alias_sids = NULL;
num_alias_sids = 0;
result = alias_memberships(members, num_members,
&alias_sids, &num_alias_sids);
if (!NT_STATUS_IS_OK(result))
return result;
*alias_rids = TALLOC_ARRAY(mem_ctx, uint32, num_alias_sids);
if ((alias_sids != 0) && (*alias_rids == NULL))
return NT_STATUS_NO_MEMORY;
*num_alias_rids = 0;
for (i=0; i<num_alias_sids; i++) {
if (!sid_peek_check_rid(domain_sid, &alias_sids[i],
&(*alias_rids)[*num_alias_rids]))
continue;
*num_alias_rids += 1;
}
SAFE_FREE(alias_sids);
return NT_STATUS_OK;
}
/**********************************************************************

View File

@ -337,10 +337,12 @@ typedef struct pdb_context
DOM_SID **members, int *num_members);
NTSTATUS (*pdb_enum_alias_memberships)(struct pdb_context *context,
const DOM_SID *members,
TALLOC_CTX *mem_ctx,
const DOM_SID *domain_sid,
const DOM_SID const *members,
int num_members,
DOM_SID **aliases,
int *num_aliases);
uint32 **alias_rids,
int *num_alias_rids);
NTSTATUS (*pdb_lookup_rids)(struct pdb_context *context,
TALLOC_CTX *mem_ctx,
@ -445,9 +447,12 @@ typedef struct pdb_methods
const DOM_SID *alias, DOM_SID **members,
int *num_members);
NTSTATUS (*enum_alias_memberships)(struct pdb_methods *methods,
const DOM_SID *members,
TALLOC_CTX *mem_ctx,
const DOM_SID *domain_sid,
const DOM_SID const *members,
int num_members,
DOM_SID **aliases, int *num);
uint32 **alias_rids,
int *num_alias_rids);
NTSTATUS (*lookup_rids)(struct pdb_methods *methods,
TALLOC_CTX *mem_ctx,
const DOM_SID *domain_sid,

View File

@ -497,7 +497,7 @@ static int priv_traverse_fn(TDB_CONTEXT *t, TDB_DATA key, TDB_DATA data, void *s
return 0;
}
add_sid_to_array( &sid, &priv->sids.list, &priv->sids.count );
add_sid_to_array( NULL, &sid, &priv->sids.list, &priv->sids.count );
return 0;
}

View File

@ -178,10 +178,10 @@ BOOL getgroups_user(const char *user, gid_t primary_gid,
groups = NULL;
/* Add in primary group first */
add_gid_to_array_unique(primary_gid, &groups, &ngrp);
add_gid_to_array_unique(NULL, primary_gid, &groups, &ngrp);
for (i=0; i<max_grp; i++)
add_gid_to_array_unique(temp_groups[i], &groups, &ngrp);
add_gid_to_array_unique(NULL, temp_groups[i], &groups, &ngrp);
*ngroups = ngrp;
*ret_groups = groups;

View File

@ -277,7 +277,8 @@ const char *tmpdir(void)
Add a gid to an array of gids if it's not already there.
****************************************************************************/
void add_gid_to_array_unique(gid_t gid, gid_t **gids, int *num)
void add_gid_to_array_unique(TALLOC_CTX *mem_ctx, gid_t gid,
gid_t **gids, int *num)
{
int i;
@ -285,8 +286,11 @@ void add_gid_to_array_unique(gid_t gid, gid_t **gids, int *num)
if ((*gids)[i] == gid)
return;
}
*gids = SMB_REALLOC_ARRAY(*gids, gid_t, *num+1);
if (mem_ctx != NULL)
*gids = TALLOC_REALLOC_ARRAY(mem_ctx, *gids, gid_t, *num+1);
else
*gids = SMB_REALLOC_ARRAY(*gids, gid_t, *num+1);
if (*gids == NULL)
return;

View File

@ -351,6 +351,19 @@ BOOL string_to_sid(DOM_SID *sidout, const char *sidstr)
return True;
}
DOM_SID *string_sid_talloc(TALLOC_CTX *mem_ctx, const char *sidstr)
{
DOM_SID *result = TALLOC_P(mem_ctx, DOM_SID);
if (result == NULL)
return NULL;
if (!string_to_sid(result, sidstr))
return NULL;
return result;
}
/*****************************************************************
Add a rid to the end of a sid
*****************************************************************/
@ -652,9 +665,14 @@ DOM_SID *sid_dup_talloc(TALLOC_CTX *ctx, const DOM_SID *src)
Add SID to an array SIDs
********************************************************************/
void add_sid_to_array(const DOM_SID *sid, DOM_SID **sids, int *num)
void add_sid_to_array(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
DOM_SID **sids, int *num)
{
*sids = SMB_REALLOC_ARRAY(*sids, DOM_SID, (*num)+1);
if (mem_ctx != NULL)
*sids = TALLOC_REALLOC_ARRAY(mem_ctx, *sids, DOM_SID,
(*num)+1);
else
*sids = SMB_REALLOC_ARRAY(*sids, DOM_SID, (*num)+1);
if (*sids == NULL)
return;
@ -670,7 +688,8 @@ void add_sid_to_array(const DOM_SID *sid, DOM_SID **sids, int *num)
Add SID to an array SIDs ensuring that it is not already there
********************************************************************/
void add_sid_to_array_unique(const DOM_SID *sid, DOM_SID **sids, int *num_sids)
void add_sid_to_array_unique(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
DOM_SID **sids, int *num_sids)
{
int i;
@ -679,7 +698,7 @@ void add_sid_to_array_unique(const DOM_SID *sid, DOM_SID **sids, int *num_sids)
return;
}
add_sid_to_array(sid, sids, num_sids);
add_sid_to_array(mem_ctx, sid, sids, num_sids);
}
/********************************************************************

View File

@ -73,10 +73,10 @@ BOOL getgroups_user(const char *user, gid_t primary_gid, gid_t **ret_groups, int
groups = NULL;
/* Add in primary group first */
add_gid_to_array_unique(primary_gid, &groups, &ngrp);
add_gid_to_array_unique(NULL, primary_gid, &groups, &ngrp);
for (i=0; i<max_grp; i++)
add_gid_to_array_unique(temp_groups[i], &groups, &ngrp);
add_gid_to_array_unique(NULL, temp_groups[i], &groups, &ngrp);
*ngroups = ngrp;
*ret_groups = groups;

View File

@ -920,6 +920,55 @@ enum winbindd_result winbindd_list_groups(struct winbindd_cli_state *state)
return WINBINDD_OK;
}
static BOOL enum_alias_memberships(const DOM_SID *member_sid,
DOM_SID **aliases, int *num_aliases)
{
TALLOC_CTX *mem_ctx = talloc_init("enum_alias_memberships");
DOM_SID builtin_sid;
uint32 *rids = NULL;
int i, num_rids = 0;
BOOL result = False;
if (mem_ctx == NULL)
return False;
*aliases = NULL;
*num_aliases = 0;
if (!pdb_enum_alias_memberships(mem_ctx, get_global_sam_sid(),
member_sid, 1, &rids, &num_rids))
goto done;
for (i=0; i<num_rids; i++) {
DOM_SID alias_sid;
sid_copy(&alias_sid, get_global_sam_sid());
sid_append_rid(&alias_sid, rids[i]);
add_sid_to_array(NULL, &alias_sid, aliases, num_aliases);
}
string_to_sid(&builtin_sid, "S-1-5-32");
if (!pdb_enum_alias_memberships(mem_ctx, &builtin_sid,
member_sid, 1, &rids, &num_rids))
goto done;
for (i=0; i<num_rids; i++) {
DOM_SID alias_sid;
sid_copy(&alias_sid, &builtin_sid);
sid_append_rid(&alias_sid, rids[i]);
add_sid_to_array(NULL, &alias_sid, aliases, num_aliases);
}
result = True;
done:
if (mem_ctx != NULL)
talloc_destroy(mem_ctx);
return result;
}
static void add_local_gids_from_sid(DOM_SID *sid, gid_t **gids, int *num)
{
gid_t gid;
@ -937,7 +986,7 @@ static void add_local_gids_from_sid(DOM_SID *sid, gid_t **gids, int *num)
/* Add nested group memberships */
if (!pdb_enum_alias_memberships(sid, 1, &aliases, &num_aliases))
if (!enum_alias_memberships(sid, &aliases, &num_aliases))
return;
for (j=0; j<num_aliases; j++) {
@ -953,7 +1002,7 @@ static void add_local_gids_from_sid(DOM_SID *sid, gid_t **gids, int *num)
continue;
}
add_gid_to_array_unique(gid, gids, num);
add_gid_to_array_unique(NULL, gid, gids, num);
}
SAFE_FREE(aliases);
}
@ -974,7 +1023,7 @@ static void add_gids_from_group_sid(DOM_SID *sid, gid_t **gids, int *num)
sid_string_static(sid)));
if (NT_STATUS_IS_OK(idmap_sid_to_gid(sid, &gid, 0)))
add_gid_to_array_unique(gid, gids, num);
add_gid_to_array_unique(NULL, gid, gids, num);
add_local_gids_from_sid(sid, gids, num);
}
@ -1170,7 +1219,7 @@ static void add_local_sids_from_sid(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
DOM_SID *aliases = NULL;
int i, num_aliases = 0;
if (!pdb_enum_alias_memberships(sid, 1, &aliases, &num_aliases))
if (!enum_alias_memberships(sid, &aliases, &num_aliases))
return;
if (num_aliases == 0)

View File

@ -643,9 +643,12 @@ static NTSTATUS context_enum_aliasmem(struct pdb_context *context,
}
static NTSTATUS context_enum_alias_memberships(struct pdb_context *context,
const DOM_SID *members,
TALLOC_CTX *mem_ctx,
const DOM_SID *domain_sid,
const DOM_SID const *members,
int num_members,
DOM_SID **aliases, int *num)
uint32 **alias_rids,
int *num_alias_rids)
{
NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
@ -655,8 +658,9 @@ static NTSTATUS context_enum_alias_memberships(struct pdb_context *context,
}
return context->pdb_methods->
enum_alias_memberships(context->pdb_methods, members,
num_members, aliases, num);
enum_alias_memberships(context->pdb_methods, mem_ctx,
domain_sid, members, num_members,
alias_rids, num_alias_rids);
}
static NTSTATUS context_lookup_rids(struct pdb_context *context,
@ -1273,8 +1277,9 @@ BOOL pdb_enum_aliasmem(const DOM_SID *alias,
members, num_members));
}
BOOL pdb_enum_alias_memberships(const DOM_SID *members, int num_members,
DOM_SID **aliases, int *num)
BOOL pdb_enum_alias_memberships(TALLOC_CTX *mem_ctx, const DOM_SID *domain_sid,
const DOM_SID const *members, int num_members,
uint32 **alias_rids, int *num_alias_rids)
{
struct pdb_context *pdb_context = pdb_get_static_context(False);
@ -1283,9 +1288,11 @@ BOOL pdb_enum_alias_memberships(const DOM_SID *members, int num_members,
}
return NT_STATUS_IS_OK(pdb_context->
pdb_enum_alias_memberships(pdb_context, members,
num_members,
aliases, num));
pdb_enum_alias_memberships(pdb_context, mem_ctx,
domain_sid,
members, num_members,
alias_rids,
num_alias_rids));
}
NTSTATUS pdb_lookup_rids(TALLOC_CTX *mem_ctx,

View File

@ -2469,11 +2469,11 @@ static NTSTATUS ldapsam_enum_group_memberships(struct pdb_methods *methods,
/* We need to add the primary group as the first gid/sid */
add_gid_to_array_unique(primary_gid, gids, &num_gids);
add_gid_to_array_unique(NULL, primary_gid, gids, &num_gids);
/* This sid will be replaced later */
add_sid_to_array_unique(&global_sid_NULL, sids, &num_sids);
add_sid_to_array_unique(NULL, &global_sid_NULL, sids, &num_sids);
for (entry = ldap_first_entry(conn->ldap_struct, msg);
entry != NULL;
@ -2505,8 +2505,8 @@ static NTSTATUS ldapsam_enum_group_memberships(struct pdb_methods *methods,
if (gid == primary_gid) {
sid_copy(&(*sids)[0], &sid);
} else {
add_gid_to_array_unique(gid, gids, &num_gids);
add_sid_to_array_unique(&sid, sids, &num_sids);
add_gid_to_array_unique(NULL, gid, gids, &num_gids);
add_sid_to_array_unique(NULL, &sid, sids, &num_sids);
}
}
@ -3052,7 +3052,7 @@ static NTSTATUS ldapsam_enum_aliasmem(struct pdb_methods *methods,
if (!string_to_sid(&member, values[i]))
continue;
add_sid_to_array(&member, members, num_members);
add_sid_to_array(NULL, &member, members, num_members);
}
ldap_value_free(values);
@ -3062,9 +3062,12 @@ static NTSTATUS ldapsam_enum_aliasmem(struct pdb_methods *methods,
}
static NTSTATUS ldapsam_alias_memberships(struct pdb_methods *methods,
TALLOC_CTX *mem_ctx,
const DOM_SID *domain_sid,
const DOM_SID *members,
int num_members,
DOM_SID **aliases, int *num_aliases)
uint32 **alias_rids,
int *num_alias_rids)
{
struct ldapsam_privates *ldap_state =
(struct ldapsam_privates *)methods->private_data;
@ -3077,12 +3080,6 @@ static NTSTATUS ldapsam_alias_memberships(struct pdb_methods *methods,
int i;
int rc;
char *filter;
TALLOC_CTX *mem_ctx;
mem_ctx = talloc_init("ldapsam_alias_memberships");
if (mem_ctx == NULL)
return NT_STATUS_NO_MEMORY;
/* This query could be further optimized by adding a
(&(sambaSID=<domain-sid>*)) so that only those aliases that are
@ -3107,9 +3104,6 @@ static NTSTATUS ldapsam_alias_memberships(struct pdb_methods *methods,
if (rc != LDAP_SUCCESS)
return NT_STATUS_UNSUCCESSFUL;
*aliases = NULL;
*num_aliases = 0;
ldap_struct = ldap_state->smbldap_state->ldap_struct;
for (entry = ldap_first_entry(ldap_struct, result);
@ -3118,6 +3112,7 @@ static NTSTATUS ldapsam_alias_memberships(struct pdb_methods *methods,
{
fstring sid_str;
DOM_SID sid;
uint32 rid;
if (!smbldap_get_single_attribute(ldap_struct, entry,
LDAP_ATTRIBUTE_SID,
@ -3128,7 +3123,11 @@ static NTSTATUS ldapsam_alias_memberships(struct pdb_methods *methods,
if (!string_to_sid(&sid, sid_str))
continue;
add_sid_to_array_unique(&sid, aliases, num_aliases);
if (!sid_peek_check_rid(domain_sid, &sid, &rid))
continue;
add_rid_to_array_unique(mem_ctx, rid, alias_rids,
num_alias_rids);
}
ldap_msgfree(result);

View File

@ -3230,8 +3230,8 @@ NTSTATUS _samr_set_userinfo2(pipes_struct *p, SAMR_Q_SET_USERINFO2 *q_u, SAMR_R_
NTSTATUS _samr_query_useraliases(pipes_struct *p, SAMR_Q_QUERY_USERALIASES *q_u, SAMR_R_QUERY_USERALIASES *r_u)
{
int num_groups = 0;
uint32 *rids=NULL;
int num_alias_rids;
uint32 *alias_rids;
struct samr_info *info = NULL;
int i;
@ -3239,8 +3239,6 @@ NTSTATUS _samr_query_useraliases(pipes_struct *p, SAMR_Q_QUERY_USERALIASES *q_u,
NTSTATUS ntstatus2;
DOM_SID *members;
DOM_SID *aliases;
int num_aliases;
BOOL res;
r_u->status = NT_STATUS_OK;
@ -3273,35 +3271,20 @@ NTSTATUS _samr_query_useraliases(pipes_struct *p, SAMR_Q_QUERY_USERALIASES *q_u,
for (i=0; i<q_u->num_sids1; i++)
sid_copy(&members[i], &q_u->sid[i].sid);
alias_rids = NULL;
num_alias_rids = 0;
become_root();
res = pdb_enum_alias_memberships(members,
q_u->num_sids1, &aliases,
&num_aliases);
res = pdb_enum_alias_memberships(p->mem_ctx, &info->sid, members,
q_u->num_sids1,
&alias_rids, &num_alias_rids);
unbecome_root();
if (!res)
return NT_STATUS_UNSUCCESSFUL;
rids = NULL;
num_groups = 0;
for (i=0; i<num_aliases; i++) {
uint32 rid;
if (!sid_peek_check_rid(&info->sid, &aliases[i], &rid))
continue;
rids = TALLOC_REALLOC_ARRAY(p->mem_ctx, rids, uint32, num_groups+1);
if (rids == NULL)
return NT_STATUS_NO_MEMORY;
rids[num_groups] = rid;
num_groups += 1;
}
SAFE_FREE(aliases);
init_samr_r_query_useraliases(r_u, num_groups, rids, NT_STATUS_OK);
init_samr_r_query_useraliases(r_u, num_alias_rids, alias_rids,
NT_STATUS_OK);
return NT_STATUS_OK;
}

View File

@ -568,25 +568,42 @@ static NTSTATUS cmd_samr_query_useraliases(struct cli_state *cli,
{
POLICY_HND connect_pol, domain_pol;
NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
uint32 user_rid, num_aliases, *alias_rids;
DOM_SID *sids;
int num_sids;
uint32 num_aliases, *alias_rids;
uint32 access_mask = MAXIMUM_ALLOWED_ACCESS;
int i;
fstring server;
DOM_SID tmp_sid;
DOM_SID2 sid;
DOM_SID2 *sid2;
DOM_SID global_sid_Builtin;
string_to_sid(&global_sid_Builtin, "S-1-5-32");
if ((argc < 3) || (argc > 4)) {
printf("Usage: %s builtin|domain rid [access mask]\n", argv[0]);
return NT_STATUS_OK;
if (argc < 3) {
printf("Usage: %s builtin|domain sid1 sid2 ...\n", argv[0]);
return NT_STATUS_INVALID_PARAMETER;
}
sscanf(argv[2], "%i", &user_rid);
if (argc > 3)
sscanf(argv[3], "%x", &access_mask);
sids = NULL;
num_sids = 0;
for (i=2; i<argc; i++) {
DOM_SID tmp_sid;
if (!string_to_sid(&tmp_sid, argv[i])) {
printf("%s is not a legal SID\n", argv[i]);
return NT_STATUS_INVALID_PARAMETER;
}
add_sid_to_array(mem_ctx, &tmp_sid, &sids, &num_sids);
}
sid2 = TALLOC_ARRAY(mem_ctx, DOM_SID2, num_sids);
if (sid2 == NULL)
return NT_STATUS_NO_MEMORY;
for (i=0; i<num_sids; i++) {
sid_copy(&sid2[i].sid, &sids[i]);
sid2[i].num_auths = sid2[i].sid.num_auths;
}
slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->desthost);
strupper_m(server);
@ -604,18 +621,19 @@ static NTSTATUS cmd_samr_query_useraliases(struct cli_state *cli,
else if (StrCaseCmp(argv[1], "builtin")==0)
result = cli_samr_open_domain(cli, mem_ctx, &connect_pol,
access_mask,
&global_sid_Builtin, &domain_pol);
else
return NT_STATUS_OK;
&global_sid_Builtin,
&domain_pol);
else {
printf("Usage: %s builtin|domain sid1 sid2 ...\n", argv[0]);
return NT_STATUS_INVALID_PARAMETER;
}
if (!NT_STATUS_IS_OK(result))
goto done;
sid_copy(&tmp_sid, &domain_sid);
sid_append_rid(&tmp_sid, user_rid);
init_dom_sid2(&sid, &tmp_sid);
result = cli_samr_query_useraliases(cli, mem_ctx, &domain_pol, 1, &sid, &num_aliases, &alias_rids);
result = cli_samr_query_useraliases(cli, mem_ctx, &domain_pol,
num_sids, sid2,
&num_aliases, &alias_rids);
if (!NT_STATUS_IS_OK(result))
goto done;

View File

@ -693,12 +693,37 @@ static int net_groupmap_listmem(int argc, const char **argv)
return 0;
}
static BOOL print_alias_memberships(TALLOC_CTX *mem_ctx,
const DOM_SID *domain_sid,
const DOM_SID *member)
{
uint32 *alias_rids;
int i, num_alias_rids;
alias_rids = NULL;
num_alias_rids = 0;
if (!pdb_enum_alias_memberships(mem_ctx, domain_sid, member, 1,
&alias_rids, &num_alias_rids)) {
d_printf("Could not list memberships for sid %s\n",
sid_string_static(member));
return False;
}
for (i = 0; i < num_alias_rids; i++) {
DOM_SID alias;
sid_copy(&alias, domain_sid);
sid_append_rid(&alias, alias_rids[i]);
printf("%s\n", sid_string_static(&alias));
}
return True;
}
static int net_groupmap_memberships(int argc, const char **argv)
{
DOM_SID member;
DOM_SID *aliases;
int i, num;
NTSTATUS result;
TALLOC_CTX *mem_ctx;
DOM_SID *domain_sid, *builtin_sid, member;
if ( (argc != 1) ||
!string_to_sid(&member, argv[0]) ) {
@ -706,17 +731,24 @@ static int net_groupmap_memberships(int argc, const char **argv)
return -1;
}
if (!pdb_enum_alias_memberships(&member, 1, &aliases, &num)) {
d_printf("Could not list memberships for sid %s: %s\n",
argv[0], nt_errstr(result));
mem_ctx = talloc_init("net_groupmap_memberships");
if (mem_ctx == NULL) {
d_printf("talloc_init failed\n");
return -1;
}
for (i = 0; i < num; i++) {
printf("%s\n", sid_string_static(&(aliases[i])));
domain_sid = get_global_sam_sid();
builtin_sid = string_sid_talloc(mem_ctx, "S-1-5-32");
if ((domain_sid == NULL) || (builtin_sid == NULL)) {
d_printf("Could not get domain sid\n");
return -1;
}
SAFE_FREE(aliases);
if (!print_alias_memberships(mem_ctx, domain_sid, &member) ||
!print_alias_memberships(mem_ctx, builtin_sid, &member))
return -1;
talloc_destroy(mem_ctx);
return 0;
}