Add find_alias, create_alias, delete_alias, get_aliasinfo, set_aliasinfo and
authorVolker Lendecke <vlendec@samba.org>
Sat, 13 Mar 2004 16:30:39 +0000 (16:30 +0000)
committerVolker Lendecke <vlendec@samba.org>
Sat, 13 Mar 2004 16:30:39 +0000 (16:30 +0000)
enum_aliases to passdb. create and delete are not yet filled, you have to do
this with net groupmap and net idmap restore.

Volker
(This used to be commit f44bf63d1143ddf6a1a2fdc15a301e0dc0840d50)

source3/groupdb/mapping.c
source3/include/ntdomain.h
source3/include/passdb.h
source3/passdb/pdb_interface.c

index 48bdfe2cd2aa0b16d294cfad86c81c0296998454..818a4acb847521893925b61eb54f14a431c5f546 100644 (file)
@@ -1270,6 +1270,115 @@ NTSTATUS pdb_default_delete_group_mapping_entry(struct pdb_methods *methods,
                NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
 }
 
+NTSTATUS pdb_default_find_alias(struct pdb_methods *methods,
+                               const char *name, DOM_SID *sid)
+{
+       GROUP_MAP map;
+
+       if (!get_group_map_from_ntname(name, &map))
+               return NT_STATUS_NO_SUCH_ALIAS;
+
+       if ((map.sid_name_use != SID_NAME_WKN_GRP) &&
+           (map.sid_name_use != SID_NAME_ALIAS))
+               return NT_STATUS_OBJECT_TYPE_MISMATCH;
+
+       sid_copy(sid, &map.sid);
+       return NT_STATUS_OK;
+}
+
+NTSTATUS pdb_default_create_alias(struct pdb_methods *methods,
+                                 const char *name, uint32 *rid)
+{
+       return NT_STATUS_ACCESS_DENIED;
+}
+
+NTSTATUS pdb_default_delete_alias(struct pdb_methods *methods,
+                                 const DOM_SID *sid)
+{
+       return NT_STATUS_ACCESS_DENIED;
+}
+
+NTSTATUS pdb_default_enum_aliases(struct pdb_methods *methods,
+                                 const DOM_SID *sid,
+                                 uint32 start_idx, uint32 max_entries,
+                                 uint32 *num_aliases,
+                                 struct acct_info **info)
+{
+       extern DOM_SID global_sid_Builtin;
+
+       GROUP_MAP *map;
+       int i, num_maps;
+       enum SID_NAME_USE type = SID_NAME_UNKNOWN;
+
+       if (sid_compare(sid, get_global_sam_sid()) == 0)
+               type = SID_NAME_ALIAS;
+
+       if (sid_compare(sid, &global_sid_Builtin) == 0)
+               type = SID_NAME_WKN_GRP;
+
+       if (!enum_group_mapping(type, &map, &num_maps, False) ||
+           (num_maps == 0)) {
+               *num_aliases = 0;
+               *info = NULL;
+               goto done;
+       }
+
+       if (start_idx > num_maps) {
+               *num_aliases = 0;
+               *info = NULL;
+               goto done;
+       }
+
+       *num_aliases = num_maps - start_idx;
+
+       if (*num_aliases > max_entries)
+               *num_aliases = max_entries;
+
+       *info = malloc(sizeof(struct acct_info) * (*num_aliases));
+
+       for (i=0; i<*num_aliases; i++) {
+               fstrcpy((*info)[i].acct_name, map[i+start_idx].nt_name);
+               fstrcpy((*info)[i].acct_desc, map[i+start_idx].comment);
+               sid_peek_rid(&map[i].sid, &(*info)[i+start_idx].rid);
+       }
+
+ done:
+       SAFE_FREE(map);
+       return NT_STATUS_OK;
+}
+
+NTSTATUS pdb_default_get_aliasinfo(struct pdb_methods *methods,
+                                  const DOM_SID *sid,
+                                  struct acct_info *info)
+{
+       GROUP_MAP map;
+
+       if (!get_group_map_from_sid(*sid, &map))
+               return NT_STATUS_NO_SUCH_ALIAS;
+
+       fstrcpy(info->acct_name, map.nt_name);
+       fstrcpy(info->acct_desc, map.comment);
+       sid_peek_rid(&map.sid, &info->rid);
+       return NT_STATUS_OK;
+}
+
+NTSTATUS pdb_default_set_aliasinfo(struct pdb_methods *methods,
+                                  const DOM_SID *sid,
+                                  struct acct_info *info)
+{
+       GROUP_MAP map;
+
+       if (!get_group_map_from_sid(*sid, &map))
+               return NT_STATUS_NO_SUCH_ALIAS;
+
+       fstrcpy(map.comment, info->acct_desc);
+
+       if (!add_mapping_entry(&map, TDB_REPLACE))
+               return NT_STATUS_ACCESS_DENIED;
+
+       return NT_STATUS_OK;
+}
+
 NTSTATUS pdb_default_enum_group_mapping(struct pdb_methods *methods,
                                           enum SID_NAME_USE sid_name_use,
                                           GROUP_MAP **rmap, int *num_entries,
index eaedc7ea9b41833eb612f8f2297d034cd6eff145..4e6795a85d5d47d31c94ce72e6febd4bbb2f9689 100644 (file)
@@ -382,13 +382,6 @@ typedef struct
 
 } rid_name;
 
-struct acct_info
-{
-    fstring acct_name; /* account name */
-    fstring acct_desc; /* account name */
-    uint32 rid; /* domain-relative RID */
-};
-
 /*
  * higher order functions for use with msrpc client code
  */
index df7c96963381adb764503da6ac619448db2b9384..21feb7208f00c66400e3699a36a95e467dfca4fb 100644 (file)
@@ -232,6 +232,12 @@ typedef struct _GROUP_INFO {
        fstring comment;
 } GROUP_INFO;
 
+struct acct_info
+{
+    fstring acct_name; /* account name */
+    fstring acct_desc; /* account name */
+    uint32 rid; /* domain-relative RID */
+};
 
 typedef struct sam_trust_passwd {
        TALLOC_CTX *mem_ctx;
@@ -262,7 +268,7 @@ typedef struct sam_trust_passwd {
  * this SAMBA will load. Increment this if *ANY* changes are made to the interface. 
  */
 
-#define PASSDB_INTERFACE_VERSION 6
+#define PASSDB_INTERFACE_VERSION 7
 
 typedef struct pdb_context 
 {
@@ -310,6 +316,29 @@ typedef struct pdb_context
                                           GROUP_MAP **rmap, int *num_entries,
                                           BOOL unix_only);
 
+       NTSTATUS (*pdb_find_alias)(struct pdb_context *context,
+                                  const char *name, DOM_SID *sid);
+
+       NTSTATUS (*pdb_create_alias)(struct pdb_context *context,
+                                    const char *name, uint32 *rid);
+
+       NTSTATUS (*pdb_delete_alias)(struct pdb_context *context,
+                                    const DOM_SID *sid);
+
+       NTSTATUS (*pdb_enum_aliases)(struct pdb_context *context,
+                                    const DOM_SID *domain_sid,
+                                    uint32 start_idx, uint32 num_entries,
+                                    uint32 *num_aliases,
+                                    struct acct_info **aliases);
+
+       NTSTATUS (*pdb_get_aliasinfo)(struct pdb_context *context,
+                                     const DOM_SID *sid,
+                                     struct acct_info *info);
+
+       NTSTATUS (*pdb_set_aliasinfo)(struct pdb_context *context,
+                                     const DOM_SID *sid,
+                                     struct acct_info *info);
+
        NTSTATUS (*pdb_add_aliasmem)(struct pdb_context *context,
                                     const DOM_SID *alias,
                                     const DOM_SID *member);
@@ -430,6 +459,28 @@ typedef struct pdb_methods
                                       GROUP_MAP **rmap, int *num_entries,
                                       BOOL unix_only);
 
+       NTSTATUS (*find_alias)(struct pdb_methods *methods,
+                              const char *name, DOM_SID *sid);
+
+       NTSTATUS (*create_alias)(struct pdb_methods *methods,
+                                const char *name, uint32 *rid);
+
+       NTSTATUS (*delete_alias)(struct pdb_methods *methods,
+                                const DOM_SID *sid);
+
+       NTSTATUS (*enum_aliases)(struct pdb_methods *methods,
+                                const DOM_SID *domain_sid,
+                                uint32 start_idx, uint32 max_entries,
+                                uint32 *num_aliases, struct acct_info **info);
+
+       NTSTATUS (*get_aliasinfo)(struct pdb_methods *methods,
+                                 const DOM_SID *sid,
+                                 struct acct_info *info);
+
+       NTSTATUS (*set_aliasinfo)(struct pdb_methods *methods,
+                                 const DOM_SID *sid,
+                                 struct acct_info *info);
+
        NTSTATUS (*add_aliasmem)(struct pdb_methods *methods,
                                 const DOM_SID *alias, const DOM_SID *member);
        NTSTATUS (*del_aliasmem)(struct pdb_methods *methods,
index 5679d4a5e80dc61ce0239949123718a65025d929..e4a275fe08af6ea270eb2e451566517f4b12b146 100644 (file)
@@ -426,6 +426,95 @@ static NTSTATUS context_enum_group_mapping(struct pdb_context *context,
                                                        num_entries, unix_only);
 }
 
+static NTSTATUS context_find_alias(struct pdb_context *context,
+                                  const char *name, DOM_SID *sid)
+{
+       NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
+
+       if ((!context) || (!context->pdb_methods)) {
+               DEBUG(0, ("invalid pdb_context specified!\n"));
+               return ret;
+       }
+
+       return context->pdb_methods->find_alias(context->pdb_methods,
+                                               name, sid);
+}
+
+static NTSTATUS context_create_alias(struct pdb_context *context,
+                                    const char *name, uint32 *rid)
+{
+       NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
+
+       if ((!context) || (!context->pdb_methods)) {
+               DEBUG(0, ("invalid pdb_context specified!\n"));
+               return ret;
+       }
+
+       return context->pdb_methods->create_alias(context->pdb_methods,
+                                                 name, rid);
+}
+
+static NTSTATUS context_delete_alias(struct pdb_context *context,
+                                    const DOM_SID *sid)
+{
+       NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
+
+       if ((!context) || (!context->pdb_methods)) {
+               DEBUG(0, ("invalid pdb_context specified!\n"));
+               return ret;
+       }
+
+       return context->pdb_methods->delete_alias(context->pdb_methods, sid);
+}
+
+static NTSTATUS context_enum_aliases(struct pdb_context *context,
+                                    const DOM_SID *sid,
+                                    uint32 start_idx, uint32 max_entries,
+                                    uint32 *num_aliases,
+                                    struct acct_info **info)
+{
+       NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
+
+       if ((!context) || (!context->pdb_methods)) {
+               DEBUG(0, ("invalid pdb_context specified!\n"));
+               return ret;
+       }
+
+       return context->pdb_methods->enum_aliases(context->pdb_methods,
+                                                 sid, start_idx, max_entries,
+                                                 num_aliases, info);
+}
+
+static NTSTATUS context_get_aliasinfo(struct pdb_context *context,
+                                     const DOM_SID *sid,
+                                     struct acct_info *info)
+{
+       NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
+
+       if ((!context) || (!context->pdb_methods)) {
+               DEBUG(0, ("invalid pdb_context specified!\n"));
+               return ret;
+       }
+
+       return context->pdb_methods->get_aliasinfo(context->pdb_methods,
+                                                  sid, info);
+}
+
+static NTSTATUS context_set_aliasinfo(struct pdb_context *context,
+                                     const DOM_SID *sid,
+                                     struct acct_info *info)
+{
+       NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
+
+       if ((!context) || (!context->pdb_methods)) {
+               DEBUG(0, ("invalid pdb_context specified!\n"));
+               return ret;
+       }
+
+       return context->pdb_methods->set_aliasinfo(context->pdb_methods,
+                                                  sid, info);
+}
+
 static NTSTATUS context_add_aliasmem(struct pdb_context *context,
                                     const DOM_SID *alias,
                                     const DOM_SID *member)
@@ -834,6 +923,12 @@ static NTSTATUS make_pdb_context(struct pdb_context **context)
        (*context)->pdb_update_group_mapping_entry = context_update_group_mapping_entry;
        (*context)->pdb_delete_group_mapping_entry = context_delete_group_mapping_entry;
        (*context)->pdb_enum_group_mapping = context_enum_group_mapping;
+       (*context)->pdb_find_alias = context_find_alias;
+       (*context)->pdb_create_alias = context_create_alias;
+       (*context)->pdb_delete_alias = context_delete_alias;
+       (*context)->pdb_enum_aliases = context_enum_aliases;
+       (*context)->pdb_get_aliasinfo = context_get_aliasinfo;
+       (*context)->pdb_set_aliasinfo = context_set_aliasinfo;
        (*context)->pdb_add_aliasmem = context_add_aliasmem;
        (*context)->pdb_del_aliasmem = context_del_aliasmem;
        (*context)->pdb_enum_aliasmem = context_enum_aliasmem;
@@ -1158,6 +1253,83 @@ BOOL pdb_enum_group_mapping(enum SID_NAME_USE sid_name_use, GROUP_MAP **rmap,
                                                      rmap, num_entries, unix_only));
 }
 
+BOOL pdb_find_alias(const char *name, DOM_SID *sid)
+{
+       struct pdb_context *pdb_context = pdb_get_static_context(False);
+
+       if (!pdb_context) {
+               return False;
+       }
+
+       return NT_STATUS_IS_OK(pdb_context->pdb_find_alias(pdb_context,
+                                                            name, sid));
+}
+
+BOOL pdb_create_alias(const char *name, uint32 *rid)
+{
+       struct pdb_context *pdb_context = pdb_get_static_context(False);
+
+       if (!pdb_context) {
+               return False;
+       }
+
+       return NT_STATUS_IS_OK(pdb_context->pdb_create_alias(pdb_context,
+                                                            name, rid));
+}
+
+BOOL pdb_delete_alias(const DOM_SID *sid)
+{
+       struct pdb_context *pdb_context = pdb_get_static_context(False);
+
+       if (!pdb_context) {
+               return False;
+       }
+
+       return NT_STATUS_IS_OK(pdb_context->pdb_delete_alias(pdb_context,
+                                                            sid));
+                                                           
+}
+
+BOOL pdb_enum_aliases(const DOM_SID *sid, uint32 start_idx, uint32 max_entries,
+                     uint32 *num_aliases, struct acct_info **info)
+{
+       struct pdb_context *pdb_context = pdb_get_static_context(False);
+
+       if (!pdb_context) {
+               return False;
+       }
+
+       return NT_STATUS_IS_OK(pdb_context->pdb_enum_aliases(pdb_context, sid,
+                                                            start_idx,
+                                                            max_entries,
+                                                            num_aliases,
+                                                            info));
+}
+
+BOOL pdb_get_aliasinfo(const DOM_SID *sid, struct acct_info *info)
+{
+       struct pdb_context *pdb_context = pdb_get_static_context(False);
+
+       if (!pdb_context) {
+               return False;
+       }
+
+       return NT_STATUS_IS_OK(pdb_context->pdb_get_aliasinfo(pdb_context, sid,
+                                                             info));
+}
+
+BOOL pdb_set_aliasinfo(const DOM_SID *sid, struct acct_info *info)
+{
+       struct pdb_context *pdb_context = pdb_get_static_context(False);
+
+       if (!pdb_context) {
+               return False;
+       }
+
+       return NT_STATUS_IS_OK(pdb_context->pdb_set_aliasinfo(pdb_context, sid,
+                                                             info));
+}
+
 BOOL pdb_add_aliasmem(const DOM_SID *alias, const DOM_SID *member)
 {
        struct pdb_context *pdb_context = pdb_get_static_context(False);
@@ -1401,6 +1573,12 @@ NTSTATUS make_pdb_methods(TALLOC_CTX *mem_ctx, PDB_METHODS **methods)
        (*methods)->update_group_mapping_entry = pdb_default_update_group_mapping_entry;
        (*methods)->delete_group_mapping_entry = pdb_default_delete_group_mapping_entry;
        (*methods)->enum_group_mapping = pdb_default_enum_group_mapping;
+       (*methods)->find_alias = pdb_default_find_alias;
+       (*methods)->create_alias = pdb_default_create_alias;
+       (*methods)->delete_alias = pdb_default_delete_alias;
+       (*methods)->enum_aliases = pdb_default_enum_aliases;
+       (*methods)->get_aliasinfo = pdb_default_get_aliasinfo;
+       (*methods)->set_aliasinfo = pdb_default_set_aliasinfo;
        (*methods)->add_aliasmem = pdb_default_add_aliasmem;
        (*methods)->del_aliasmem = pdb_default_del_aliasmem;
        (*methods)->enum_aliasmem = pdb_default_enum_aliasmem;