From 2d2d13ee6104f21fa4a3ec845f216084a24da0b2 Mon Sep 17 00:00:00 2001 From: Christian Ambach Date: Tue, 18 Jun 2013 16:30:31 +0200 Subject: s3:passdb add a gid argument to pdb_create_builtin_alias make it possible to skip the allocation of a new gid from winbind by specifying the gid to be used Signed-off-by: Christian Ambach Reviewed-by: Michael Adam --- source3/groupdb/mapping.c | 34 ++++++++++++++++++++++------------ source3/include/passdb.h | 2 +- source3/passdb/ABI/pdb-0.sigs | 2 +- source3/passdb/pdb_util.c | 2 +- 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/source3/groupdb/mapping.c b/source3/groupdb/mapping.c index c6fcc8aa71..e3d52b70fb 100644 --- a/source3/groupdb/mapping.c +++ b/source3/groupdb/mapping.c @@ -790,15 +790,19 @@ NTSTATUS pdb_nop_enum_group_mapping(struct pdb_methods *methods, return NT_STATUS_UNSUCCESSFUL; } -/******************************************************************** - Really just intended to be called by smbd -********************************************************************/ - -NTSTATUS pdb_create_builtin_alias(uint32 rid) +/** +* @brief Add a new group mapping +* +* @param[in] gid gid to use to store the mapping. If gid is 0, +* new gid will be allocated from winbind +* +* @return Normal NTSTATUS return +*/ +NTSTATUS pdb_create_builtin_alias(uint32 rid, gid_t gid) { struct dom_sid sid; enum lsa_SidType type; - gid_t gid; + gid_t gidformap; GROUP_MAP *map; NTSTATUS status; const char *name = NULL; @@ -820,15 +824,21 @@ NTSTATUS pdb_create_builtin_alias(uint32 rid) goto done; } - if (!winbind_allocate_gid(&gid)) { - DEBUG(3, ("pdb_create_builtin_alias: Could not get a gid out of winbind\n")); - status = NT_STATUS_ACCESS_DENIED; - goto done; + if (gid == 0) { + if (!winbind_allocate_gid(&gidformap)) { + DEBUG(3, ("pdb_create_builtin_alias: Could not get a " + "gid out of winbind\n")); + status = NT_STATUS_ACCESS_DENIED; + goto done; + } + } else { + gidformap = gid; } - DEBUG(10, ("Creating alias %s with gid %u\n", name, (unsigned)gid)); + DEBUG(10, ("Creating alias %s with gid %u\n", name, + (unsigned) gidformap)); - map->gid = gid; + map->gid = gidformap; sid_copy(&map->sid, &sid); map->sid_name_use = SID_NAME_ALIAS; map->nt_name = talloc_strdup(map, name); diff --git a/source3/include/passdb.h b/source3/include/passdb.h index ae3a968464..637c55a840 100644 --- a/source3/include/passdb.h +++ b/source3/include/passdb.h @@ -123,7 +123,7 @@ NTSTATUS pdb_nop_enum_group_mapping(struct pdb_methods *methods, enum lsa_SidType sid_name_use, GROUP_MAP **rmap, size_t *num_entries, bool unix_only); -NTSTATUS pdb_create_builtin_alias(uint32_t rid); +NTSTATUS pdb_create_builtin_alias(uint32_t rid, gid_t gid); /* passdb headers */ diff --git a/source3/passdb/ABI/pdb-0.sigs b/source3/passdb/ABI/pdb-0.sigs index 9c5c773941..ccb371b207 100644 --- a/source3/passdb/ABI/pdb-0.sigs +++ b/source3/passdb/ABI/pdb-0.sigs @@ -74,7 +74,7 @@ pdb_build_fields_present: uint32_t (struct samu *) pdb_capabilities: uint32_t (void) pdb_copy_sam_account: bool (struct samu *, struct samu *) pdb_create_alias: NTSTATUS (const char *, uint32_t *) -pdb_create_builtin_alias: NTSTATUS (uint32_t) +pdb_create_builtin_alias: NTSTATUS (uint32_t, gid_t) pdb_create_dom_group: NTSTATUS (TALLOC_CTX *, const char *, uint32_t *) pdb_create_user: NTSTATUS (TALLOC_CTX *, const char *, uint32_t, uint32_t *) pdb_decode_acct_ctrl: uint32_t (const char *) diff --git a/source3/passdb/pdb_util.c b/source3/passdb/pdb_util.c index 0ac6594d4c..31fd018e8c 100644 --- a/source3/passdb/pdb_util.c +++ b/source3/passdb/pdb_util.c @@ -81,7 +81,7 @@ NTSTATUS pdb_create_builtin(uint32_t rid) if (!lp_winbind_nested_groups() || !winbind_ping()) { return NT_STATUS_PROTOCOL_UNREACHABLE; } - status = pdb_create_builtin_alias(rid); + status = pdb_create_builtin_alias(rid, 0); } return status; } -- cgit