[SCM] Samba Shared Repository - branch master updated
Andreas Schneider
asn at samba.org
Tue Jun 13 13:10:02 UTC 2023
The branch, master has been updated
via e0b1aaea1a3 third_party: Update nss_wrapper to version 1.1.15
via 076d8524671 testprogs: Add test_alias_membership
via 33b3a51a313 s4:torture: Limit run of test_membership_user() only to ad_member_idmap_rid
via 4cf5abb8b3e s3:selftest: Pass environ to local.nss
via c0b819e3e32 s3:selftest: Add environ parameter to plansmbtorture4testsuite
via 611444a22c3 tests: Fix idmap.rid.getgrnam for ad_member_idmap_rid with 'winbind expand groups = 10'
via 99d42ed8654 selftest: set 'winbind expand groups = 10' for ad_member_idmap_rid
via 09e853af7f8 s4:torture: Skip test_membership_user for users that get incorrectly assigned group sid
via a1e611a8c74 s3:winbind: Fix the default group for the 'Guest' user
via 783c9d22373 s3:winbind: Include local groups in _wbint_QueryGroupList
via f116cda34f4 s3:winbind: Remove SID_NAME_ALIAS code from rpc_lookup_groupmem()
via 47b3a5d0def s3:winbind: s/wb_group_members_send/wb_alias_members_send/ for SID_NAME_ALIAS in wb_getgrsid_sid2gid_done()
via d8f7d244f40 lib:dbwrap: Add dbwrap_merge_dbs()
via 6bdd29a7a4d lib:dbwrap: Fix trailing whitespace in lib/dbwrap/dbwrap.h
via fa7d9c13c3c s3:winbind: Convert wb_group_members_send() to resolve array of groups
via 6b321cb17ed s3:winbind: Add wb_alias_members_{send/recv}
via 38565ff2df4 s3:winbind: Add wbint_LookupAliasMembers to winbind interface
via 92b2eb9c3f2 s3:winbind: Add lookup_aliasmem to winbindd_methods and implement it in all backends
via b67dc2586f8 s3:winbind: Fix trailing whitespace in winbindd_cache.c
via d58872053ce s3:winbind: Fix trailing whitespace in winbindd_reconnect.c
via f91c8bf8d0a s3:winbind: Fix trailing whitespace in winbindd_msrpc.c
from e40c86e970e gp: Fix user apply failure when droping privs
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit e0b1aaea1a3969103b3aab4572f45a333a533ce4
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Tue Jan 24 11:20:49 2023 +0100
third_party: Update nss_wrapper to version 1.1.15
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
Autobuild-User(master): Andreas Schneider <asn at cryptomilk.org>
Autobuild-Date(master): Tue Jun 13 13:09:41 UTC 2023 on atb-devel-224
commit 076d8524671fec53943cc24ba9da4adccb46d24f
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Wed Apr 12 09:29:18 2023 +0200
testprogs: Add test_alias_membership
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 33b3a51a3138c5001248125a2d930517591f64e7
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Thu Apr 6 16:59:24 2023 +0200
s4:torture: Limit run of test_membership_user() only to ad_member_idmap_rid
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 4cf5abb8b3edb0b6d57d2902c32ec0e5f96bee04
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Tue Apr 11 12:09:10 2023 +0200
s3:selftest: Pass environ to local.nss
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit c0b819e3e32045f98a59c4d1e1943521184e57fa
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Tue Apr 11 12:08:14 2023 +0200
s3:selftest: Add environ parameter to plansmbtorture4testsuite
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 611444a22c3815fcc93c8e81697975f5190f4b5f
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Mon Apr 24 00:11:34 2023 +0200
tests: Fix idmap.rid.getgrnam for ad_member_idmap_rid with 'winbind expand groups = 10'
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 99d42ed86544e6e3cdeb1a4eb876c45d795e9411
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Mon Feb 27 17:03:31 2023 +0100
selftest: set 'winbind expand groups = 10' for ad_member_idmap_rid
This is for alias members tests.
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 09e853af7f8649bddcc5311e4d3529c3cde7b65d
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Mon Mar 27 20:00:05 2023 +0200
s4:torture: Skip test_membership_user for users that get incorrectly assigned group sid
This commit should be removed once wb_queryuser() is fixed.
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit a1e611a8c74827242e6c5ebf766d1fd4abe63748
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Fri Mar 24 15:03:21 2023 +0100
s3:winbind: Fix the default group for the 'Guest' user
If samlogon cache has no entry for the 'Guest' user, the group sid
should default to 'Guests' group.
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 783c9d22373c32d2b2b4172595bc1d7a3352b1d7
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Mon Feb 27 17:03:32 2023 +0100
s3:winbind: Include local groups in _wbint_QueryGroupList
This is needed for GETGRENT to show also e.g. BUILTIN/users.
Otherwise the test_membership_user (local.nss.membership) would fail.
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit f116cda34f4d01f6ba7b9e4c936e57ee24f24cac
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Thu Mar 30 15:32:55 2023 +0200
s3:winbind: Remove SID_NAME_ALIAS code from rpc_lookup_groupmem()
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 47b3a5d0defb2c04cd4144776c15a621015cb629
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Tue Mar 21 08:33:37 2023 +0100
s3:winbind: s/wb_group_members_send/wb_alias_members_send/ for SID_NAME_ALIAS in wb_getgrsid_sid2gid_done()
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit d8f7d244f408f2b51b4640aaa3e9fcaf36b83a11
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Tue Mar 28 11:15:15 2023 +0200
lib:dbwrap: Add dbwrap_merge_dbs()
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 6bdd29a7a4d7f3fda70df5461b84b0c113636d8e
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Tue Mar 28 11:15:50 2023 +0200
lib:dbwrap: Fix trailing whitespace in lib/dbwrap/dbwrap.h
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit fa7d9c13c3c14b43984db68063451d060d77a813
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Thu Mar 9 16:00:20 2023 +0100
s3:winbind: Convert wb_group_members_send() to resolve array of groups
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 6b321cb17ed723c33a45078937dcabb1116287af
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Wed Mar 29 14:57:50 2023 +0200
s3:winbind: Add wb_alias_members_{send/recv}
wb_alias_members.c is very similar to wb_lookupusergroups.c
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 38565ff2df419d2e27b06b5e9959e168b094ba31
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Wed Mar 29 14:53:14 2023 +0200
s3:winbind: Add wbint_LookupAliasMembers to winbind interface
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 92b2eb9c3f20bc95a66b95a1244c008bb40cb7be
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Wed Mar 8 08:40:58 2023 +0100
s3:winbind: Add lookup_aliasmem to winbindd_methods and implement it in all backends
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit b67dc2586f82879bbe8ae9b25cde05e37f3022ca
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Wed Mar 8 13:04:40 2023 +0100
s3:winbind: Fix trailing whitespace in winbindd_cache.c
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit d58872053cef087cc2f07d4ae589cb8820968b27
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Wed Mar 29 13:28:35 2023 +0200
s3:winbind: Fix trailing whitespace in winbindd_reconnect.c
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit f91c8bf8d0aed6dab48a9e5d17a548d51e4710a6
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Wed Mar 29 13:25:15 2023 +0200
s3:winbind: Fix trailing whitespace in winbindd_msrpc.c
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
-----------------------------------------------------------------------
Summary of changes:
buildtools/wafsamba/samba_third_party.py | 2 +-
lib/dbwrap/dbwrap.c | 29 ++
lib/dbwrap/dbwrap.h | 15 +-
librpc/idl/winbind.idl | 6 +
nsswitch/tests/test_idmap_rid.sh | 10 +-
selftest/target/Samba3.pm | 1 +
source3/selftest/tests.py | 11 +-
.../{wb_lookupusergroups.c => wb_alias_members.c} | 73 ++--
source3/winbindd/wb_getgrsid.c | 193 +++++++++-
source3/winbindd/wb_group_members.c | 26 +-
source3/winbindd/wb_queryuser.c | 11 +-
source3/winbindd/winbindd.h | 8 +
source3/winbindd/winbindd_ads.c | 26 ++
source3/winbindd/winbindd_cache.c | 288 ++++++++++----
source3/winbindd/winbindd_dual_srv.c | 38 ++
source3/winbindd/winbindd_msrpc.c | 57 ++-
source3/winbindd/winbindd_proto.h | 20 +-
source3/winbindd/winbindd_reconnect.c | 45 ++-
source3/winbindd/winbindd_reconnect_ads.c | 28 ++
source3/winbindd/winbindd_rpc.c | 117 ++++--
source3/winbindd/winbindd_rpc.h | 9 +
source3/winbindd/winbindd_samr.c | 69 ++++
source3/winbindd/wscript_build | 1 +
source4/selftest/tests.py | 2 +
source4/torture/local/nss_tests.c | 56 +++
testprogs/blackbox/test_alias_membership.sh | 194 ++++++++++
third_party/nss_wrapper/nss_utils.c | 131 +++++++
.../nss_wrapper/nss_utils.h | 28 +-
third_party/nss_wrapper/nss_wrapper.c | 427 ++++++++++-----------
third_party/nss_wrapper/wscript | 4 +-
30 files changed, 1497 insertions(+), 428 deletions(-)
copy source3/winbindd/{wb_lookupusergroups.c => wb_alias_members.c} (55%)
create mode 100755 testprogs/blackbox/test_alias_membership.sh
create mode 100644 third_party/nss_wrapper/nss_utils.c
copy lib/compression/lzxpress.h => third_party/nss_wrapper/nss_utils.h (74%)
Changeset truncated at 500 lines:
diff --git a/buildtools/wafsamba/samba_third_party.py b/buildtools/wafsamba/samba_third_party.py
index 14b14c517e8..356b041a2a9 100644
--- a/buildtools/wafsamba/samba_third_party.py
+++ b/buildtools/wafsamba/samba_third_party.py
@@ -29,7 +29,7 @@ Build.BuildContext.CHECK_SOCKET_WRAPPER = CHECK_SOCKET_WRAPPER
@conf
def CHECK_NSS_WRAPPER(conf):
- return conf.CHECK_BUNDLED_SYSTEM_PKG('nss_wrapper', minversion='1.1.13')
+ return conf.CHECK_BUNDLED_SYSTEM_PKG('nss_wrapper', minversion='1.1.15')
Build.BuildContext.CHECK_NSS_WRAPPER = CHECK_NSS_WRAPPER
@conf
diff --git a/lib/dbwrap/dbwrap.c b/lib/dbwrap/dbwrap.c
index 9bdbd67dce1..ee4cdc54f92 100644
--- a/lib/dbwrap/dbwrap.c
+++ b/lib/dbwrap/dbwrap.c
@@ -120,6 +120,35 @@ NTSTATUS dbwrap_record_delete(struct db_record *rec)
return NT_STATUS_OK;
}
+struct dbwrap_merge_dbs_state {
+ struct db_context *to;
+ int flags;
+};
+
+/* Copy a single record to the db_context passed in private_data */
+static int dbwrap_merge_dbs_copy_record(struct db_record *rec,
+ void *private_data)
+{
+ struct dbwrap_merge_dbs_state *state = private_data;
+
+ TDB_DATA data = dbwrap_record_get_value(rec);
+ TDB_DATA key = dbwrap_record_get_key(rec);
+ NTSTATUS status = dbwrap_store(state->to, key, data, state->flags);
+
+ return NT_STATUS_IS_OK(status) ? 0 : 1;
+}
+
+NTSTATUS
+dbwrap_merge_dbs(struct db_context *to, struct db_context *from, int flags)
+{
+ struct dbwrap_merge_dbs_state state = {.to = to, .flags = flags};
+
+ return dbwrap_traverse(from,
+ dbwrap_merge_dbs_copy_record,
+ &state,
+ NULL);
+}
+
const char *locked_dbs[DBWRAP_LOCK_ORDER_MAX];
static void debug_lock_order(int level)
diff --git a/lib/dbwrap/dbwrap.h b/lib/dbwrap/dbwrap.h
index 834b10f0942..abc5161be05 100644
--- a/lib/dbwrap/dbwrap.h
+++ b/lib/dbwrap/dbwrap.h
@@ -1,4 +1,4 @@
-/*
+/*
Unix SMB/CIFS implementation.
Database interface wrapper around tdb
Copyright (C) Volker Lendecke 2005-2007
@@ -71,6 +71,19 @@ NTSTATUS dbwrap_record_store(struct db_record *rec, TDB_DATA data, int flags);
NTSTATUS dbwrap_record_storev(struct db_record *rec,
const TDB_DATA *dbufs, int num_dbufs, int flags);
NTSTATUS dbwrap_record_delete(struct db_record *rec);
+
+/**
+ * @brief Adds TDB records from one db_context to another
+ *
+ * @param to Destination db_context
+ * @param from Source db_context
+ * @param flags (TDB_INSERT or TDB_REPLACE)
+ *
+ * @return NT_STATUS_OK on success or NT_STATUS_INTERNAL_DB_CORRUPTION
+ */
+NTSTATUS
+dbwrap_merge_dbs(struct db_context *to, struct db_context *from, int flags);
+
struct db_record *dbwrap_fetch_locked(struct db_context *db,
TALLOC_CTX *mem_ctx,
TDB_DATA key);
diff --git a/librpc/idl/winbind.idl b/librpc/idl/winbind.idl
index de8fbc75c23..50e36884129 100644
--- a/librpc/idl/winbind.idl
+++ b/librpc/idl/winbind.idl
@@ -130,6 +130,12 @@ interface winbind
[out] wbint_Principals *members
);
+ NTSTATUS wbint_LookupAliasMembers(
+ [in] dom_sid *sid,
+ [in] lsa_SidType type,
+ [out] wbint_SidArray *sids
+ );
+
typedef [public] struct {
uint32 num_userinfos;
[size_is(num_userinfos)] wbint_userinfo userinfos[];
diff --git a/nsswitch/tests/test_idmap_rid.sh b/nsswitch/tests/test_idmap_rid.sh
index 1487aa26500..2cd43a7ffe2 100755
--- a/nsswitch/tests/test_idmap_rid.sh
+++ b/nsswitch/tests/test_idmap_rid.sh
@@ -108,13 +108,15 @@ ret=$?
testit "getpwuid for ID_TYPE_BOTH group output" test $ret -eq 0 ||
failed=$(expr $failed + 1)
-group_gr="$DOMAIN/domain users:x:$gid:"
+group_gr="$DOMAIN/domain users:x:$gid"
out=$(getent group "$GROUP")
ret=$?
testit "getgrnam for ID_TYPE_BOTH group succeeds" test $ret -eq 0 ||
failed=$(expr $failed + 1)
-test "$out" = "$group_gr"
+# Compare only 'groupname:x:gid' part, drop the members
+normalized_out=$(echo "$out" | cut -d: -f1-3)
+test "$normalized_out" = "$group_gr"
ret=$?
testit "getgrnam for ID_TYPE_BOTH group output" test $ret -eq 0 ||
failed=$(expr $failed + 1)
@@ -123,7 +125,9 @@ out=$(getent group "$gid")
ret=$?
testit "getgrgid for ID_TYPE_BOTH group succeeds" test $ret -eq 0 ||
failed=$(expr $failed + 1)
-test "$out" = "$group_gr"
+# Compare only 'groupname:x:gid' part, drop the members
+normalized_out=$(echo "$out" | cut -d: -f1-3)
+test "$normalized_out" = "$group_gr"
ret=$?
testit "getgrgid for ID_TYPE_BOTH group output" test $ret -eq 0 ||
failed=$(expr $failed + 1)
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index 6b371ee2714..0bb074cf11e 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -1294,6 +1294,7 @@ sub setup_ad_member_idmap_rid
# values required for tests to succeed
create krb5 conf = no
map to guest = bad user
+ winbind expand groups = 10
";
my $ret = $self->provision(
diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index 75acbf87442..2bc4d372095 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -41,14 +41,14 @@ smbtorture4_options.extend([
])
-def plansmbtorture4testsuite(name, env, options, description=''):
+def plansmbtorture4testsuite(name, env, options, description='', environ=None):
if description == '':
modname = "samba3.%s" % (name, )
else:
modname = "samba3.%s %s" % (name, description)
selftesthelpers.plansmbtorture4testsuite(
- name, env, options, target='samba3', modname=modname)
+ name, env, options, target='samba3', modname=modname, environ=environ)
def compare_versions(version1, version2):
for i in range(max(len(version1),len(version2))):
@@ -1197,7 +1197,12 @@ for t in tests:
plansmbtorture4testsuite(t, "ad_dc", '//$SERVER/tmp -U$%', description="anonymous password set")
elif t == "local.nss":
for env in ["nt4_dc:local", "ad_member:local", "nt4_member:local", "ad_dc:local"]:
- plansmbtorture4testsuite(t, env, '//$SERVER/tmp -U$USERNAME%$PASSWORD')
+ plansmbtorture4testsuite(t,
+ env,
+ '//$SERVER/tmp -U$USERNAME%$PASSWORD',
+ environ = {
+ 'ENVNAME': env,
+ })
elif t == "smb2.change_notify_disabled":
plansmbtorture4testsuite(t, "simpleserver", '//$SERVER/tmp -U$USERNAME%$PASSWORD')
elif t == "smb2.notify" or t == "raw.notify" or t == "smb2.oplock" or t == "raw.oplock":
diff --git a/source3/winbindd/wb_lookupusergroups.c b/source3/winbindd/wb_alias_members.c
similarity index 55%
copy from source3/winbindd/wb_lookupusergroups.c
copy to source3/winbindd/wb_alias_members.c
index 7f359ee9316..06c229233ce 100644
--- a/source3/winbindd/wb_lookupusergroups.c
+++ b/source3/winbindd/wb_alias_members.c
@@ -1,7 +1,7 @@
/*
Unix SMB/CIFS implementation.
- async lookupusergroups
- Copyright (C) Volker Lendecke 2009
+ async alias_members
+ Copyright (C) Pavel Filipenský 2023
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -22,31 +22,41 @@
#include "librpc/gen_ndr/ndr_winbind_c.h"
#include "../libcli/security/security.h"
-struct wb_lookupusergroups_state {
+struct wb_alias_members_state {
struct tevent_context *ev;
struct dom_sid sid;
struct wbint_SidArray sids;
};
-static void wb_lookupusergroups_done(struct tevent_req *subreq);
+static void wb_alias_members_done(struct tevent_req *subreq);
-struct tevent_req *wb_lookupusergroups_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- const struct dom_sid *sid)
+struct tevent_req *wb_alias_members_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ const struct dom_sid *sid,
+ enum lsa_SidType type,
+ int max_nesting)
{
struct tevent_req *req, *subreq;
- struct wb_lookupusergroups_state *state;
+ struct wb_alias_members_state *state;
struct winbindd_domain *domain;
NTSTATUS status;
struct dom_sid_buf buf;
- req = tevent_req_create(mem_ctx, &state,
- struct wb_lookupusergroups_state);
+ req = tevent_req_create(mem_ctx, &state, struct wb_alias_members_state);
if (req == NULL) {
return NULL;
}
- D_INFO("WB command lookupusergroups start.\nLooking up SID %s.\n",
+ D_INFO("WB command alias_members start.\nLooking up SID %s.\n",
dom_sid_str_buf(sid, &buf));
+
+ if (max_nesting <= 0) {
+ D_DEBUG("Finished. The depth based on 'winbind expand groups' is %d.\n", max_nesting);
+ state->sids.num_sids = 0;
+ state->sids.sids = NULL;
+ tevent_req_done(req);
+ return tevent_req_post(req, ev);
+ }
+
sid_copy(&state->sid, sid);
status = lookup_usergroups_cached(state,
@@ -62,28 +72,32 @@ struct tevent_req *wb_lookupusergroups_send(TALLOC_CTX *mem_ctx,
if (domain == NULL) {
DBG_WARNING("could not find domain entry for sid %s\n",
dom_sid_str_buf(&state->sid, &buf));
- tevent_req_nterror(req, NT_STATUS_NO_SUCH_DOMAIN);
+ tevent_req_nterror(req, NT_STATUS_NO_SUCH_ALIAS);
return tevent_req_post(req, ev);
}
- subreq = dcerpc_wbint_LookupUserGroups_send(
- state, ev, dom_child_handle(domain), &state->sid, &state->sids);
+ subreq = dcerpc_wbint_LookupAliasMembers_send(state,
+ ev,
+ dom_child_handle(domain),
+ &state->sid,
+ type,
+ &state->sids);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
- tevent_req_set_callback(subreq, wb_lookupusergroups_done, req);
+ tevent_req_set_callback(subreq, wb_alias_members_done, req);
return req;
}
-static void wb_lookupusergroups_done(struct tevent_req *subreq)
+static void wb_alias_members_done(struct tevent_req *subreq)
{
- struct tevent_req *req = tevent_req_callback_data(
- subreq, struct tevent_req);
- struct wb_lookupusergroups_state *state = tevent_req_data(
- req, struct wb_lookupusergroups_state);
+ struct tevent_req *req =
+ tevent_req_callback_data(subreq, struct tevent_req);
+ struct wb_alias_members_state *state =
+ tevent_req_data(req, struct wb_alias_members_state);
NTSTATUS status, result;
- status = dcerpc_wbint_LookupUserGroups_recv(subreq, state, &result);
+ status = dcerpc_wbint_LookupAliasMembers_recv(subreq, state, &result);
TALLOC_FREE(subreq);
if (any_nt_status_not_ok(status, result, &status)) {
D_WARNING("Failed with %s.\n", nt_errstr(status));
@@ -93,11 +107,13 @@ static void wb_lookupusergroups_done(struct tevent_req *subreq)
tevent_req_done(req);
}
-NTSTATUS wb_lookupusergroups_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
- uint32_t *num_sids, struct dom_sid **sids)
+NTSTATUS wb_alias_members_recv(struct tevent_req *req,
+ TALLOC_CTX *mem_ctx,
+ uint32_t *num_sids,
+ struct dom_sid **sids)
{
- struct wb_lookupusergroups_state *state = tevent_req_data(
- req, struct wb_lookupusergroups_state);
+ struct wb_alias_members_state *state =
+ tevent_req_data(req, struct wb_alias_members_state);
NTSTATUS status;
uint32_t i;
@@ -107,13 +123,14 @@ NTSTATUS wb_lookupusergroups_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
*num_sids = state->sids.num_sids;
*sids = talloc_move(mem_ctx, &state->sids.sids);
- D_INFO("WB command lookupusergroups end.\nReceived %"PRIu32" SID(s).\n",
+ D_INFO("WB command alias_members end.\nReceived %" PRIu32 " SID(s).\n",
*num_sids);
if (CHECK_DEBUGLVL(DBGLVL_INFO)) {
for (i = 0; i < *num_sids; i++) {
struct dom_sid_buf buf;
- D_INFO("%"PRIu32": %s\n",
- i, dom_sid_str_buf(&(*sids)[i], &buf));
+ D_INFO("%" PRIu32 ": %s\n",
+ i,
+ dom_sid_str_buf(&(*sids)[i], &buf));
}
}
return NT_STATUS_OK;
diff --git a/source3/winbindd/wb_getgrsid.c b/source3/winbindd/wb_getgrsid.c
index c62d5040dc9..4fd696dfa10 100644
--- a/source3/winbindd/wb_getgrsid.c
+++ b/source3/winbindd/wb_getgrsid.c
@@ -22,6 +22,7 @@
#include "librpc/gen_ndr/ndr_winbind_c.h"
#include "../libcli/security/security.h"
#include "lib/dbwrap/dbwrap_rbt.h"
+#include "lib/dbwrap/dbwrap.h"
struct wb_getgrsid_state {
struct tevent_context *ev;
@@ -32,11 +33,14 @@ struct wb_getgrsid_state {
enum lsa_SidType type;
gid_t gid;
struct db_context *members;
+ uint32_t num_sids;
+ struct dom_sid *sids;
};
static void wb_getgrsid_lookupsid_done(struct tevent_req *subreq);
static void wb_getgrsid_sid2gid_done(struct tevent_req *subreq);
static void wb_getgrsid_got_members(struct tevent_req *subreq);
+static void wb_getgrsid_got_alias_members(struct tevent_req *subreq);
struct tevent_req *wb_getgrsid_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
@@ -137,7 +141,9 @@ static void wb_getgrsid_sid2gid_done(struct tevent_req *subreq)
state->gid = (gid_t)xids[0].id;
- if (state->type == SID_NAME_USER || state->type == SID_NAME_COMPUTER) {
+ switch (state->type) {
+ case SID_NAME_USER:
+ case SID_NAME_COMPUTER: {
/*
* special treatment for a user sid that is
* mapped to ID_TYPE_BOTH:
@@ -172,19 +178,180 @@ static void wb_getgrsid_sid2gid_done(struct tevent_req *subreq)
tevent_req_done(req);
return;
}
+ case SID_NAME_ALIAS:
+ subreq = wb_alias_members_send(state,
+ state->ev,
+ &state->sid,
+ state->type,
+ state->max_nesting);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ /* Decrement the depth based on 'winbind expand groups' */
+ state->max_nesting--;
+ tevent_req_set_callback(subreq,
+ wb_getgrsid_got_alias_members,
+ req);
+ break;
+ case SID_NAME_DOM_GRP:
+ subreq = wb_group_members_send(state,
+ state->ev,
+ &state->sid,
+ 1,
+ &state->type,
+ state->max_nesting);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, wb_getgrsid_got_members, req);
+ break;
+ case SID_NAME_WKN_GRP:
+ state->members = db_open_rbt(state);
+ if (tevent_req_nomem(state->members, req)) {
+ return;
+ }
+ tevent_req_done(req);
+ return;
+ default:
+ tevent_req_nterror(req, NT_STATUS_NO_SUCH_GROUP);
+ break;
+ }
+}
- /*
- * the "regular" case of a group type sid.
- */
+static void wb_getgrsid_got_alias_members_names(struct tevent_req *subreq)
+{
+ struct tevent_req *req =
+ tevent_req_callback_data(subreq, struct tevent_req);
+ struct wb_getgrsid_state *state =
+ tevent_req_data(req, struct wb_getgrsid_state);
+ struct lsa_RefDomainList *domains = NULL;
+ struct lsa_TransNameArray *names = NULL;
+ NTSTATUS status;
+ uint32_t li;
+ uint32_t num_sids = 0;
+ struct dom_sid *sids = NULL;
+ enum lsa_SidType *types = NULL;
- subreq = wb_group_members_send(state, state->ev, &state->sid,
- state->type, state->max_nesting);
+ status = wb_lookupsids_recv(subreq, state, &domains, &names);
+
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ D_WARNING("Failed with %s.\n", nt_errstr(status));
+ return;
+ }
+
+ if (domains == NULL) {
+ tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+ D_WARNING("Failed with NT_STATUS_INTERNAL_ERROR.\n");
+ return;
+ }
+
+ if (names == NULL) {
+ tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+ D_WARNING("Failed with NT_STATUS_INTERNAL_ERROR.\n");
+ return;
+ }
+
+ state->members = db_open_rbt(state);
+ if (tevent_req_nomem(state->members, req)) {
+ return;
+ }
+
+ for (li = 0; li < state->num_sids; li++) {
+ struct lsa_TranslatedName *n = &names->names[li];
+
+ if (n->sid_type == SID_NAME_USER ||
+ n->sid_type == SID_NAME_COMPUTER) {
+ const char *name = fill_domain_username_talloc(
+ talloc_tos(),
+ domains->domains[n->sid_index].name.string,
+ n->name.string,
+ false /* can_assume */);
+ if (tevent_req_nomem(name, req)) {
+ return;
+ }
+
+ status = add_member_to_db(state->members,
+ &state->sids[li],
+ name);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return;
+ }
+ } else if (n->sid_type == SID_NAME_DOM_GRP) {
+ sids = talloc_realloc(talloc_tos(),
+ sids,
+ struct dom_sid,
+ num_sids + 1);
+ if (tevent_req_nomem(sids, req)) {
+ return;
+ }
+ sids[num_sids] = state->sids[li];
+ types = talloc_realloc(talloc_tos(),
+ types,
+ enum lsa_SidType,
+ num_sids + 1);
+ if (tevent_req_nomem(types, req)) {
+ return;
+ }
+ types[num_sids] = n->sid_type;
+ num_sids++;
+ } else {
+ struct dom_sid_buf buf;
+ D_DEBUG("SID %s with sid_type=%d is ignored!\n",
+ dom_sid_str_buf(&state->sids[li], &buf),
+ n->sid_type);
+ }
+ }
+
--
Samba Shared Repository
More information about the samba-cvs
mailing list