DISCUSS s3:groupdb: allow machine accounts as members.
[metze/samba/wip.git] / source3 / groupdb / mapping.c
index da5a866619b20faa9bee463b17443d57c89a2d64..837f84a724b7e0027bd7ae9d85f37864f66b3246 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "includes.h"
 #include "groupdb/mapping.h"
+#include "../libcli/security/security.h"
 
 static const struct mapping_backend *backend;
 
@@ -65,8 +66,8 @@ NTSTATUS add_initial_entry(gid_t gid, const char *sid, enum lsa_SidType sid_name
        return pdb_add_group_mapping_entry(&map);
 }
 
-static NTSTATUS alias_memberships(const DOM_SID *members, size_t num_members,
-                                 DOM_SID **sids, size_t *num)
+static NTSTATUS alias_memberships(const struct dom_sid *members, size_t num_members,
+                                 struct dom_sid **sids, size_t *num)
 {
        size_t i;
 
@@ -82,8 +83,8 @@ static NTSTATUS alias_memberships(const DOM_SID *members, size_t num_members,
 }
 
 struct aliasmem_closure {
-       const DOM_SID *alias;
-       DOM_SID **sids;
+       const struct dom_sid *alias;
+       struct dom_sid **sids;
        size_t *num;
 };
 
@@ -101,7 +102,7 @@ struct aliasmem_closure {
 
 /* get a domain group from it's SID */
 
-bool get_domain_group_from_sid(DOM_SID sid, GROUP_MAP *map)
+bool get_domain_group_from_sid(struct dom_sid sid, GROUP_MAP *map)
 {
        struct group *grp;
        bool ret;
@@ -323,8 +324,8 @@ int smb_add_user_group(const char *unix_group, const char *unix_user)
                if (!add_script) {
                        return -1;
                }
-               add_script = talloc_string_sub(ctx,
-                               add_script, "%u", unix_user);
+               add_script = talloc_string_sub2(ctx,
+                               add_script, "%u", unix_user, true, false, true);
                if (!add_script) {
                        return -1;
                }
@@ -363,8 +364,8 @@ int smb_delete_user_group(const char *unix_group, const char *unix_user)
                if (!del_script) {
                        return -1;
                }
-               del_script = talloc_string_sub(ctx,
-                               del_script, "%u", unix_user);
+               del_script = talloc_string_sub2(ctx,
+                               del_script, "%u", unix_user, true, false, true);
                if (!del_script) {
                        return -1;
                }
@@ -381,7 +382,7 @@ int smb_delete_user_group(const char *unix_group, const char *unix_user)
 
 
 NTSTATUS pdb_default_getgrsid(struct pdb_methods *methods, GROUP_MAP *map,
-                                DOM_SID sid)
+                                struct dom_sid sid)
 {
        if (!init_group_mapping()) {
                DEBUG(0,("failed to initialize group mapping\n"));
@@ -436,7 +437,7 @@ NTSTATUS pdb_default_update_group_mapping_entry(struct pdb_methods *methods,
 }
 
 NTSTATUS pdb_default_delete_group_mapping_entry(struct pdb_methods *methods,
-                                                  DOM_SID sid)
+                                                  struct dom_sid sid)
 {
        if (!init_group_mapping()) {
                DEBUG(0,("failed to initialize group mapping\n"));
@@ -447,7 +448,7 @@ NTSTATUS pdb_default_delete_group_mapping_entry(struct pdb_methods *methods,
 }
 
 NTSTATUS pdb_default_enum_group_mapping(struct pdb_methods *methods,
-                                          const DOM_SID *sid, enum lsa_SidType sid_name_use,
+                                          const struct dom_sid *sid, enum lsa_SidType sid_name_use,
                                           GROUP_MAP **pp_rmap, size_t *p_num_entries,
                                           bool unix_only)
 {
@@ -462,7 +463,7 @@ NTSTATUS pdb_default_enum_group_mapping(struct pdb_methods *methods,
 NTSTATUS pdb_default_create_alias(struct pdb_methods *methods,
                                  const char *name, uint32 *rid)
 {
-       DOM_SID sid;
+       struct dom_sid sid;
        enum lsa_SidType type;
        uint32 new_rid;
        gid_t gid;
@@ -486,21 +487,22 @@ NTSTATUS pdb_default_create_alias(struct pdb_methods *methods,
                return NT_STATUS_ALIAS_EXISTS;
        }
 
-       if (!winbind_allocate_gid(&gid)) {
-               DEBUG(3, ("Could not get a gid out of winbind\n"));
+       if (!pdb_new_rid(&new_rid)) {
+               DEBUG(0, ("Could not allocate a RID.\n"));
                return NT_STATUS_ACCESS_DENIED;
        }
 
-       if (!pdb_new_rid(&new_rid)) {
-               DEBUG(0, ("Could not allocate a RID -- wasted a gid :-(\n"));
+       sid_compose(&sid, get_global_sam_sid(), new_rid);
+
+       if (!winbind_allocate_gid(&gid)) {
+               DEBUG(3, ("Could not get a gid out of winbind - "
+                         "wasted a rid :-(\n"));
                return NT_STATUS_ACCESS_DENIED;
        }
 
        DEBUG(10, ("Creating alias %s with gid %u and rid %u\n",
                   name, (unsigned int)gid, (unsigned int)new_rid));
 
-       sid_compose(&sid, get_global_sam_sid(), new_rid);
-
        map.gid = gid;
        sid_copy(&map.sid, &sid);
        map.sid_name_use = SID_NAME_ALIAS;
@@ -521,13 +523,13 @@ NTSTATUS pdb_default_create_alias(struct pdb_methods *methods,
 }
 
 NTSTATUS pdb_default_delete_alias(struct pdb_methods *methods,
-                                 const DOM_SID *sid)
+                                 const struct dom_sid *sid)
 {
        return pdb_delete_group_mapping_entry(*sid);
 }
 
 NTSTATUS pdb_default_get_aliasinfo(struct pdb_methods *methods,
-                                  const DOM_SID *sid,
+                                  const struct dom_sid *sid,
                                   struct acct_info *info)
 {
        GROUP_MAP map;
@@ -550,7 +552,7 @@ NTSTATUS pdb_default_get_aliasinfo(struct pdb_methods *methods,
 }
 
 NTSTATUS pdb_default_set_aliasinfo(struct pdb_methods *methods,
-                                  const DOM_SID *sid,
+                                  const struct dom_sid *sid,
                                   struct acct_info *info)
 {
        GROUP_MAP map;
@@ -565,7 +567,7 @@ NTSTATUS pdb_default_set_aliasinfo(struct pdb_methods *methods,
 }
 
 NTSTATUS pdb_default_add_aliasmem(struct pdb_methods *methods,
-                                 const DOM_SID *alias, const DOM_SID *member)
+                                 const struct dom_sid *alias, const struct dom_sid *member)
 {
        if (!init_group_mapping()) {
                DEBUG(0,("failed to initialize group mapping\n"));
@@ -575,7 +577,7 @@ NTSTATUS pdb_default_add_aliasmem(struct pdb_methods *methods,
 }
 
 NTSTATUS pdb_default_del_aliasmem(struct pdb_methods *methods,
-                                 const DOM_SID *alias, const DOM_SID *member)
+                                 const struct dom_sid *alias, const struct dom_sid *member)
 {
        if (!init_group_mapping()) {
                DEBUG(0,("failed to initialize group mapping\n"));
@@ -585,8 +587,8 @@ NTSTATUS pdb_default_del_aliasmem(struct pdb_methods *methods,
 }
 
 NTSTATUS pdb_default_enum_aliasmem(struct pdb_methods *methods,
-                                  const DOM_SID *alias, TALLOC_CTX *mem_ctx,
-                                  DOM_SID **pp_members, size_t *p_num_members)
+                                  const struct dom_sid *alias, TALLOC_CTX *mem_ctx,
+                                  struct dom_sid **pp_members, size_t *p_num_members)
 {
        if (!init_group_mapping()) {
                DEBUG(0,("failed to initialize group mapping\n"));
@@ -598,13 +600,13 @@ NTSTATUS pdb_default_enum_aliasmem(struct pdb_methods *methods,
 
 NTSTATUS pdb_default_alias_memberships(struct pdb_methods *methods,
                                       TALLOC_CTX *mem_ctx,
-                                      const DOM_SID *domain_sid,
-                                      const DOM_SID *members,
+                                      const struct dom_sid *domain_sid,
+                                      const struct dom_sid *members,
                                       size_t num_members,
                                       uint32 **pp_alias_rids,
                                       size_t *p_num_alias_rids)
 {
-       DOM_SID *alias_sids;
+       struct dom_sid *alias_sids;
        size_t i, num_alias_sids;
        NTSTATUS result;
 
@@ -650,7 +652,7 @@ NTSTATUS pdb_default_alias_memberships(struct pdb_methods *methods,
  *********************************************************************/
 
 NTSTATUS pdb_nop_getgrsid(struct pdb_methods *methods, GROUP_MAP *map,
-                                DOM_SID sid)
+                                struct dom_sid sid)
 {
        return NT_STATUS_UNSUCCESSFUL;
 }
@@ -680,7 +682,7 @@ NTSTATUS pdb_nop_update_group_mapping_entry(struct pdb_methods *methods,
 }
 
 NTSTATUS pdb_nop_delete_group_mapping_entry(struct pdb_methods *methods,
-                                                  DOM_SID sid)
+                                                  struct dom_sid sid)
 {
        return NT_STATUS_UNSUCCESSFUL;
 }
@@ -696,7 +698,7 @@ NTSTATUS pdb_nop_enum_group_mapping(struct pdb_methods *methods,
 /****************************************************************************
  These need to be redirected through pdb_interface.c
 ****************************************************************************/
-bool pdb_get_dom_grp_info(const DOM_SID *sid, struct acct_info *info)
+bool pdb_get_dom_grp_info(const struct dom_sid *sid, struct acct_info *info)
 {
        GROUP_MAP map;
        bool res;
@@ -714,7 +716,7 @@ bool pdb_get_dom_grp_info(const DOM_SID *sid, struct acct_info *info)
        return True;
 }
 
-bool pdb_set_dom_grp_info(const DOM_SID *sid, const struct acct_info *info)
+bool pdb_set_dom_grp_info(const struct dom_sid *sid, const struct acct_info *info)
 {
        GROUP_MAP map;
 
@@ -733,7 +735,7 @@ bool pdb_set_dom_grp_info(const DOM_SID *sid, const struct acct_info *info)
 
 NTSTATUS pdb_create_builtin_alias(uint32 rid)
 {
-       DOM_SID sid;
+       struct dom_sid sid;
        enum lsa_SidType type;
        gid_t gid;
        GROUP_MAP map;