[GLUE] Rsync SAMBA_3_0 SVN r25598 in order to create the v3-0-test branch.
[gd/samba/.git] / source / groupdb / mapping_tdb.c
index 7ea7ec498c16788b75552127b119589e0244ac44..2a4753d24f3307771079f1929a001954fad22b45 100644 (file)
 
 static TDB_CONTEXT *tdb; /* used for driver files */
 
-static BOOL enum_group_mapping(const DOM_SID *domsid, enum lsa_SidType sid_name_use, GROUP_MAP **pp_rmap,
-                              size_t *p_num_entries, BOOL unix_only);
-static BOOL group_map_remove(const DOM_SID *sid);
-       
 /****************************************************************************
  Open the group mapping tdb.
 ****************************************************************************/
-static BOOL init_group_mapping(void)
+ BOOL init_group_mapping(void)
 {
        const char *vstring = "INFO/version";
        int32 vers_id;
@@ -89,16 +85,21 @@ static BOOL init_group_mapping(void)
 
 /****************************************************************************
 ****************************************************************************/
-static BOOL add_mapping_entry(GROUP_MAP *map, int flag)
+ BOOL add_mapping_entry(GROUP_MAP *map, int flag)
 {
-       TDB_DATA dbuf;
+       TDB_DATA kbuf, dbuf;
        pstring key, buf;
        fstring string_sid="";
        int len;
 
+       if(!init_group_mapping()) {
+               DEBUG(0,("failed to initialize group mapping\n"));
+               return(False);
+       }
+       
        sid_to_string(string_sid, &map->sid);
 
-       len = tdb_pack((uint8 *)buf, sizeof(buf), "ddff",
+       len = tdb_pack(buf, sizeof(buf), "ddff",
                        map->gid, map->sid_name_use, map->nt_name, map->comment);
 
        if (len > sizeof(buf))
@@ -106,9 +107,11 @@ static BOOL add_mapping_entry(GROUP_MAP *map, int flag)
 
        slprintf(key, sizeof(key), "%s%s", GROUP_PREFIX, string_sid);
 
+       kbuf.dsize = strlen(key)+1;
+       kbuf.dptr = key;
        dbuf.dsize = len;
-       dbuf.dptr = (uint8 *)buf;
-       if (tdb_store_bystring(tdb, key, dbuf, flag) != 0) return False;
+       dbuf.dptr = buf;
+       if (tdb_store(tdb, kbuf, dbuf, flag) != 0) return False;
 
        return True;
 }
@@ -118,19 +121,27 @@ static BOOL add_mapping_entry(GROUP_MAP *map, int flag)
  Return the sid and the type of the unix group.
 ****************************************************************************/
 
-static BOOL get_group_map_from_sid(DOM_SID sid, GROUP_MAP *map)
+ BOOL get_group_map_from_sid(DOM_SID sid, GROUP_MAP *map)
 {
-       TDB_DATA dbuf;
+       TDB_DATA kbuf, dbuf;
        pstring key;
        fstring string_sid;
        int ret = 0;
        
+       if(!init_group_mapping()) {
+               DEBUG(0,("failed to initialize group mapping\n"));
+               return(False);
+       }
+
        /* the key is the SID, retrieving is direct */
 
        sid_to_string(string_sid, &sid);
        slprintf(key, sizeof(key), "%s%s", GROUP_PREFIX, string_sid);
 
-       dbuf = tdb_fetch_bystring(tdb, key);
+       kbuf.dptr = key;
+       kbuf.dsize = strlen(key)+1;
+               
+       dbuf = tdb_fetch(tdb, kbuf);
        if (!dbuf.dptr)
                return False;
 
@@ -153,25 +164,30 @@ static BOOL get_group_map_from_sid(DOM_SID sid, GROUP_MAP *map)
  Return the sid and the type of the unix group.
 ****************************************************************************/
 
-static BOOL get_group_map_from_gid(gid_t gid, GROUP_MAP *map)
+ BOOL get_group_map_from_gid(gid_t gid, GROUP_MAP *map)
 {
        TDB_DATA kbuf, dbuf, newkey;
        fstring string_sid;
        int ret;
 
+       if(!init_group_mapping()) {
+               DEBUG(0,("failed to initialize group mapping\n"));
+               return(False);
+       }
+
        /* we need to enumerate the TDB to find the GID */
 
        for (kbuf = tdb_firstkey(tdb); 
             kbuf.dptr; 
             newkey = tdb_nextkey(tdb, kbuf), safe_free(kbuf.dptr), kbuf=newkey) {
 
-               if (strncmp((const char *)kbuf.dptr, GROUP_PREFIX, strlen(GROUP_PREFIX)) != 0) continue;
+               if (strncmp(kbuf.dptr, GROUP_PREFIX, strlen(GROUP_PREFIX)) != 0) continue;
                
                dbuf = tdb_fetch(tdb, kbuf);
                if (!dbuf.dptr)
                        continue;
 
-               fstrcpy(string_sid, (const char *)kbuf.dptr+strlen(GROUP_PREFIX));
+               fstrcpy(string_sid, kbuf.dptr+strlen(GROUP_PREFIX));
 
                string_to_sid(&map->sid, string_sid);
                
@@ -198,25 +214,30 @@ static BOOL get_group_map_from_gid(gid_t gid, GROUP_MAP *map)
  Return the sid and the type of the unix group.
 ****************************************************************************/
 
-static BOOL get_group_map_from_ntname(const char *name, GROUP_MAP *map)
+ BOOL get_group_map_from_ntname(const char *name, GROUP_MAP *map)
 {
        TDB_DATA kbuf, dbuf, newkey;
        fstring string_sid;
        int ret;
 
+       if(!init_group_mapping()) {
+               DEBUG(0,("get_group_map_from_ntname:failed to initialize group mapping\n"));
+               return(False);
+       }
+
        /* we need to enumerate the TDB to find the name */
 
        for (kbuf = tdb_firstkey(tdb); 
             kbuf.dptr; 
             newkey = tdb_nextkey(tdb, kbuf), safe_free(kbuf.dptr), kbuf=newkey) {
 
-               if (strncmp((const char *)kbuf.dptr, GROUP_PREFIX, strlen(GROUP_PREFIX)) != 0) continue;
+               if (strncmp(kbuf.dptr, GROUP_PREFIX, strlen(GROUP_PREFIX)) != 0) continue;
                
                dbuf = tdb_fetch(tdb, kbuf);
                if (!dbuf.dptr)
                        continue;
 
-               fstrcpy(string_sid, (const char *)kbuf.dptr+strlen(GROUP_PREFIX));
+               fstrcpy(string_sid, kbuf.dptr+strlen(GROUP_PREFIX));
 
                string_to_sid(&map->sid, string_sid);
                
@@ -243,24 +264,32 @@ static BOOL get_group_map_from_ntname(const char *name, GROUP_MAP *map)
  Remove a group mapping entry.
 ****************************************************************************/
 
-static BOOL group_map_remove(const DOM_SID *sid)
+BOOL group_map_remove(const DOM_SID *sid)
 {
-       TDB_DATA dbuf;
+       TDB_DATA kbuf, dbuf;
        pstring key;
        fstring string_sid;
        
+       if(!init_group_mapping()) {
+               DEBUG(0,("failed to initialize group mapping\n"));
+               return(False);
+       }
+
        /* the key is the SID, retrieving is direct */
 
        sid_to_string(string_sid, sid);
        slprintf(key, sizeof(key), "%s%s", GROUP_PREFIX, string_sid);
 
-       dbuf = tdb_fetch_bystring(tdb, key);
+       kbuf.dptr = key;
+       kbuf.dsize = strlen(key)+1;
+               
+       dbuf = tdb_fetch(tdb, kbuf);
        if (!dbuf.dptr)
                return False;
        
        SAFE_FREE(dbuf.dptr);
 
-       if(tdb_delete_bystring(tdb, key) != TDB_SUCCESS)
+       if(tdb_delete(tdb, kbuf) != TDB_SUCCESS)
                return False;
 
        return True;
@@ -270,7 +299,7 @@ static BOOL group_map_remove(const DOM_SID *sid)
  Enumerate the group mapping.
 ****************************************************************************/
 
-static BOOL enum_group_mapping(const DOM_SID *domsid, enum lsa_SidType sid_name_use, GROUP_MAP **pp_rmap,
+BOOL enum_group_mapping(const DOM_SID *domsid, enum lsa_SidType sid_name_use, GROUP_MAP **pp_rmap,
                        size_t *p_num_entries, BOOL unix_only)
 {
        TDB_DATA kbuf, dbuf, newkey;
@@ -282,6 +311,11 @@ static BOOL enum_group_mapping(const DOM_SID *domsid, enum lsa_SidType sid_name_
        DOM_SID grpsid;
        uint32 rid;
 
+       if(!init_group_mapping()) {
+               DEBUG(0,("failed to initialize group mapping\n"));
+               return(False);
+       }
+
        *p_num_entries=0;
        *pp_rmap=NULL;
 
@@ -289,14 +323,14 @@ static BOOL enum_group_mapping(const DOM_SID *domsid, enum lsa_SidType sid_name_
             kbuf.dptr; 
             newkey = tdb_nextkey(tdb, kbuf), safe_free(kbuf.dptr), kbuf=newkey) {
 
-               if (strncmp((const char *)kbuf.dptr, GROUP_PREFIX, strlen(GROUP_PREFIX)) != 0)
+               if (strncmp(kbuf.dptr, GROUP_PREFIX, strlen(GROUP_PREFIX)) != 0)
                        continue;
 
                dbuf = tdb_fetch(tdb, kbuf);
                if (!dbuf.dptr)
                        continue;
 
-               fstrcpy(string_sid, (const char *)kbuf.dptr+strlen(GROUP_PREFIX));
+               fstrcpy(string_sid, kbuf.dptr+strlen(GROUP_PREFIX));
                                
                ret = tdb_unpack(dbuf.dptr, dbuf.dsize, "ddff",
                                 &map.gid, &map.sid_name_use, &map.nt_name, &map.comment);
@@ -362,23 +396,31 @@ static BOOL enum_group_mapping(const DOM_SID *domsid, enum lsa_SidType sid_name_
 /* This operation happens on session setup, so it should better be fast. We
  * store a list of aliases a SID is member of hanging off MEMBEROF/SID. */
 
-static NTSTATUS one_alias_membership(const DOM_SID *member,
+ NTSTATUS one_alias_membership(const DOM_SID *member,
                               DOM_SID **sids, size_t *num)
 {
        fstring key, string_sid;
-       TDB_DATA dbuf;
+       TDB_DATA kbuf, dbuf;
        const char *p;
 
+       if (!init_group_mapping()) {
+               DEBUG(0,("failed to initialize group mapping\n"));
+               return NT_STATUS_ACCESS_DENIED;
+       }
+
        sid_to_string(string_sid, member);
        slprintf(key, sizeof(key), "%s%s", MEMBEROF_PREFIX, string_sid);
 
-       dbuf = tdb_fetch_bystring(tdb, key);
+       kbuf.dsize = strlen(key)+1;
+       kbuf.dptr = key;
+
+       dbuf = tdb_fetch(tdb, kbuf);
 
        if (dbuf.dptr == NULL) {
                return NT_STATUS_OK;
        }
 
-       p = (const char *)dbuf.dptr;
+       p = dbuf.dptr;
 
        while (next_token(&p, string_sid, " ", sizeof(string_sid))) {
 
@@ -433,15 +475,20 @@ static BOOL is_aliasmem(const DOM_SID *alias, const DOM_SID *member)
 }
 
 
-static NTSTATUS add_aliasmem(const DOM_SID *alias, const DOM_SID *member)
+ NTSTATUS add_aliasmem(const DOM_SID *alias, const DOM_SID *member)
 {
        GROUP_MAP map;
-       TDB_DATA dbuf;
+       TDB_DATA kbuf, dbuf;
        pstring key;
        fstring string_sid;
        char *new_memberstring;
        int result;
 
+       if(!init_group_mapping()) {
+               DEBUG(0,("failed to initialize group mapping\n"));
+               return NT_STATUS_ACCESS_DENIED;
+       }
+
        if (!get_group_map_from_sid(*alias, &map))
                return NT_STATUS_NO_SUCH_ALIAS;
 
@@ -455,7 +502,10 @@ static NTSTATUS add_aliasmem(const DOM_SID *alias, const DOM_SID *member)
        sid_to_string(string_sid, member);
        slprintf(key, sizeof(key), "%s%s", MEMBEROF_PREFIX, string_sid);
 
-       dbuf = tdb_fetch_bystring(tdb, key);
+       kbuf.dsize = strlen(key)+1;
+       kbuf.dptr = key;
+
+       dbuf = tdb_fetch(tdb, kbuf);
 
        sid_to_string(string_sid, alias);
 
@@ -470,9 +520,10 @@ static NTSTATUS add_aliasmem(const DOM_SID *alias, const DOM_SID *member)
                return NT_STATUS_NO_MEMORY;
 
        SAFE_FREE(dbuf.dptr);
-       dbuf = string_term_tdb_data(new_memberstring);
+       dbuf.dsize = strlen(new_memberstring)+1;
+       dbuf.dptr = new_memberstring;
 
-       result = tdb_store_bystring(tdb, key, dbuf, 0);
+       result = tdb_store(tdb, kbuf, dbuf, 0);
 
        SAFE_FREE(new_memberstring);
 
@@ -492,11 +543,11 @@ static int collect_aliasmem(TDB_CONTEXT *tdb_ctx, TDB_DATA key, TDB_DATA data,
        const char *p;
        fstring alias_string;
 
-       if (strncmp((const char *)key.dptr, MEMBEROF_PREFIX,
+       if (strncmp(key.dptr, MEMBEROF_PREFIX,
                    strlen(MEMBEROF_PREFIX)) != 0)
                return 0;
 
-       p = (const char *)data.dptr;
+       p = data.dptr;
 
        while (next_token(&p, alias_string, " ", sizeof(alias_string))) {
 
@@ -514,7 +565,7 @@ static int collect_aliasmem(TDB_CONTEXT *tdb_ctx, TDB_DATA key, TDB_DATA data,
                 * list currently scanned. The key represents the alias
                 * member. Add that. */
 
-               member_string = strchr((const char *)key.dptr, '/');
+               member_string = strchr(key.dptr, '/');
 
                /* Above we tested for MEMBEROF_PREFIX which includes the
                 * slash. */
@@ -534,11 +585,16 @@ static int collect_aliasmem(TDB_CONTEXT *tdb_ctx, TDB_DATA key, TDB_DATA data,
        return 0;
 }
 
-static NTSTATUS enum_aliasmem(const DOM_SID *alias, DOM_SID **sids, size_t *num)
+ NTSTATUS enum_aliasmem(const DOM_SID *alias, DOM_SID **sids, size_t *num)
 {
        GROUP_MAP map;
        struct aliasmem_closure closure;
 
+       if(!init_group_mapping()) {
+               DEBUG(0,("failed to initialize group mapping\n"));
+               return NT_STATUS_ACCESS_DENIED;
+       }
+
        if (!get_group_map_from_sid(*alias, &map))
                return NT_STATUS_NO_SUCH_ALIAS;
 
@@ -557,14 +613,14 @@ static NTSTATUS enum_aliasmem(const DOM_SID *alias, DOM_SID **sids, size_t *num)
        return NT_STATUS_OK;
 }
 
-static NTSTATUS del_aliasmem(const DOM_SID *alias, const DOM_SID *member)
+ NTSTATUS del_aliasmem(const DOM_SID *alias, const DOM_SID *member)
 {
        NTSTATUS result;
        DOM_SID *sids;
        size_t i, num;
        BOOL found = False;
        char *member_string;
-       TDB_DATA dbuf;
+       TDB_DATA kbuf, dbuf;
        pstring key;
        fstring sid_string;
 
@@ -593,8 +649,11 @@ static NTSTATUS del_aliasmem(const DOM_SID *alias, const DOM_SID *member)
        sid_to_string(sid_string, member);
        slprintf(key, sizeof(key), "%s%s", MEMBEROF_PREFIX, sid_string);
 
+       kbuf.dsize = strlen(key)+1;
+       kbuf.dptr = key;
+
        if (num == 0)
-               return tdb_delete_bystring(tdb, key) == 0 ?
+               return tdb_delete(tdb, kbuf) == 0 ?
                        NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
 
        member_string = SMB_STRDUP("");
@@ -617,9 +676,10 @@ static NTSTATUS del_aliasmem(const DOM_SID *alias, const DOM_SID *member)
                }
        }
 
-       dbuf = string_term_tdb_data(member_string);
+       dbuf.dsize = strlen(member_string)+1;
+       dbuf.dptr = member_string;
 
-       result = tdb_store_bystring(tdb, key, dbuf, 0) == 0 ?
+       result = tdb_store(tdb, kbuf, dbuf, 0) == 0 ?
                NT_STATUS_OK : NT_STATUS_ACCESS_DENIED;
 
        TALLOC_FREE(sids);
@@ -628,29 +688,3 @@ static NTSTATUS del_aliasmem(const DOM_SID *alias, const DOM_SID *member)
        return result;
 }
 
-
-static const struct mapping_backend tdb_backend = {
-       .add_mapping_entry         = add_mapping_entry,
-       .get_group_map_from_sid    = get_group_map_from_sid,
-       .get_group_map_from_gid    = get_group_map_from_gid,
-       .get_group_map_from_ntname = get_group_map_from_ntname,
-       .group_map_remove          = group_map_remove,
-       .enum_group_mapping        = enum_group_mapping,
-       .one_alias_membership      = one_alias_membership,
-       .add_aliasmem              = add_aliasmem,
-       .del_aliasmem              = del_aliasmem,
-       .enum_aliasmem             = enum_aliasmem      
-};
-
-/*
-  initialise the tdb mapping backend
- */
-const struct mapping_backend *groupdb_tdb_init(void)
-{
-       if (!init_group_mapping()) {
-               DEBUG(0,("Failed to initialise tdb mapping backend\n"));
-               return NULL;
-       }
-
-       return &tdb_backend;
-}