summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/auth/auth_util.c13
-rw-r--r--source3/passdb/lookup_sid.c48
-rw-r--r--source3/passdb/lookup_sid.h2
3 files changed, 39 insertions, 24 deletions
diff --git a/source3/auth/auth_util.c b/source3/auth/auth_util.c
index 4f6ebfa4a4..07ed9c1077 100644
--- a/source3/auth/auth_util.c
+++ b/source3/auth/auth_util.c
@@ -32,6 +32,7 @@
#include "passdb.h"
#include "../librpc/gen_ndr/ndr_auth.h"
#include "../auth/auth_sam_reply.h"
+#include "../librpc/gen_ndr/idmap.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_AUTH
@@ -465,7 +466,7 @@ NTSTATUS create_local_token(TALLOC_CTX *mem_ctx,
size_t i;
struct dom_sid tmp_sid;
struct auth_session_info *session_info;
- struct wbcUnixId *ids;
+ struct unixid *ids;
fstring tmp;
/* Ensure we can't possible take a code path leading to a
@@ -593,7 +594,7 @@ NTSTATUS create_local_token(TALLOC_CTX *mem_ctx,
t = session_info->security_token;
- ids = talloc_array(talloc_tos(), struct wbcUnixId,
+ ids = talloc_array(talloc_tos(), struct unixid,
t->num_sids);
if (ids == NULL) {
return NT_STATUS_NO_MEMORY;
@@ -606,18 +607,18 @@ NTSTATUS create_local_token(TALLOC_CTX *mem_ctx,
for (i=0; i<t->num_sids; i++) {
- if (i == 0 && ids[i].type != WBC_ID_TYPE_BOTH) {
+ if (i == 0 && ids[i].type != ID_TYPE_BOTH) {
continue;
}
- if (ids[i].type != WBC_ID_TYPE_GID &&
- ids[i].type != WBC_ID_TYPE_BOTH) {
+ if (ids[i].type != ID_TYPE_GID &&
+ ids[i].type != ID_TYPE_BOTH) {
DEBUG(10, ("Could not convert SID %s to gid, "
"ignoring it\n",
sid_string_dbg(&t->sids[i])));
continue;
}
- if (!add_gid_to_array_unique(session_info, ids[i].id.gid,
+ if (!add_gid_to_array_unique(session_info, ids[i].id,
&session_info->unix_token->groups,
&session_info->unix_token->ngroups)) {
return NT_STATUS_NO_MEMORY;
diff --git a/source3/passdb/lookup_sid.c b/source3/passdb/lookup_sid.c
index a70d31791f..a4af677714 100644
--- a/source3/passdb/lookup_sid.c
+++ b/source3/passdb/lookup_sid.c
@@ -1253,7 +1253,7 @@ void gid_to_sid(struct dom_sid *psid, gid_t gid)
}
bool sids_to_unix_ids(const struct dom_sid *sids, uint32_t num_sids,
- struct wbcUnixId *ids)
+ struct unixid *ids)
{
struct wbcDomainSid *wbc_sids = NULL;
struct wbcUnixId *wbc_ids = NULL;
@@ -1274,29 +1274,29 @@ bool sids_to_unix_ids(const struct dom_sid *sids, uint32_t num_sids,
if (sid_peek_check_rid(&global_sid_Unix_Users,
&sids[i], &rid)) {
- ids[i].type = WBC_ID_TYPE_UID;
- ids[i].id.uid = rid;
+ ids[i].type = ID_TYPE_UID;
+ ids[i].id = rid;
continue;
}
if (sid_peek_check_rid(&global_sid_Unix_Groups,
&sids[i], &rid)) {
- ids[i].type = WBC_ID_TYPE_GID;
- ids[i].id.gid = rid;
+ ids[i].type = ID_TYPE_GID;
+ ids[i].id = rid;
continue;
}
- if (idmap_cache_find_sid2uid(&sids[i], &ids[i].id.uid,
+ if (idmap_cache_find_sid2uid(&sids[i], &ids[i].id,
&expired)
&& !expired) {
- ids[i].type = WBC_ID_TYPE_UID;
+ ids[i].type = ID_TYPE_UID;
continue;
}
- if (idmap_cache_find_sid2gid(&sids[i], &ids[i].id.gid,
+ if (idmap_cache_find_sid2gid(&sids[i], &ids[i].id,
&expired)
&& !expired) {
- ids[i].type = WBC_ID_TYPE_GID;
+ ids[i].type = ID_TYPE_GID;
continue;
}
- ids[i].type = WBC_ID_TYPE_NOT_SPECIFIED;
+ ids[i].type = ID_TYPE_NOT_SPECIFIED;
memcpy(&wbc_sids[num_not_cached], &sids[i],
ndr_size_dom_sid(&sids[i], 0));
num_not_cached += 1;
@@ -1320,22 +1320,36 @@ bool sids_to_unix_ids(const struct dom_sid *sids, uint32_t num_sids,
num_not_cached = 0;
for (i=0; i<num_sids; i++) {
- if (ids[i].type == WBC_ID_TYPE_NOT_SPECIFIED) {
- ids[i] = wbc_ids[num_not_cached];
+ if (ids[i].type == ID_TYPE_NOT_SPECIFIED) {
+ switch (wbc_ids[num_not_cached].type) {
+ case ID_TYPE_UID:
+ ids[i].type = WBC_ID_TYPE_UID;
+ ids[i].id = wbc_ids[num_not_cached].id.uid;
+ break;
+ case ID_TYPE_GID:
+ ids[i].type = WBC_ID_TYPE_GID;
+ ids[i].id = wbc_ids[num_not_cached].id.gid;
+ break;
+ default:
+ /* The types match, and wbcUnixId -> id is a union anyway */
+ ids[i].type = wbc_ids[num_not_cached].type;
+ ids[i].id = wbc_ids[num_not_cached].id.gid;
+ break;
+ }
num_not_cached += 1;
}
}
for (i=0; i<num_sids; i++) {
- if (ids[i].type != WBC_ID_TYPE_NOT_SPECIFIED) {
+ if (ids[i].type != ID_TYPE_NOT_SPECIFIED) {
continue;
}
- if (legacy_sid_to_gid(&sids[i], &ids[i].id.gid)) {
- ids[i].type = WBC_ID_TYPE_GID;
+ if (legacy_sid_to_gid(&sids[i], &ids[i].id)) {
+ ids[i].type = ID_TYPE_GID;
continue;
}
- if (legacy_sid_to_uid(&sids[i], &ids[i].id.uid)) {
- ids[i].type = WBC_ID_TYPE_UID;
+ if (legacy_sid_to_uid(&sids[i], &ids[i].id)) {
+ ids[i].type = ID_TYPE_UID;
continue;
}
}
diff --git a/source3/passdb/lookup_sid.h b/source3/passdb/lookup_sid.h
index 65444c39a6..068e499664 100644
--- a/source3/passdb/lookup_sid.h
+++ b/source3/passdb/lookup_sid.h
@@ -87,7 +87,7 @@ bool sid_to_uid(const struct dom_sid *psid, uid_t *puid);
bool sid_to_gid(const struct dom_sid *psid, gid_t *pgid);
struct wbcUnixId;
bool sids_to_unix_ids(const struct dom_sid *sids, uint32_t num_sids,
- struct wbcUnixId *ids);
+ struct unixid *ids);
NTSTATUS get_primary_group_sid(TALLOC_CTX *mem_ctx,
const char *username,
struct passwd **_pwd,