From: Michael Adam Date: Thu, 17 Jun 2010 18:19:46 +0000 (+0200) Subject: s3:idmap_ldap: add a idmap_ldap_new_mapping(). X-Git-Url: http://git.samba.org/?p=metze%2Fsamba%2Fwip.git;a=commitdiff_plain;h=c6a0b3fba0c86247cfe37ba2d911d75e324682c1 s3:idmap_ldap: add a idmap_ldap_new_mapping(). High level function to create a new mapping for an unmapped sid. This builds logic that used to reside in the top level idmap code in the backend. --- diff --git a/source3/winbindd/idmap_ldap.c b/source3/winbindd/idmap_ldap.c index 4a06a5ce72c6..81562ce88ca8 100644 --- a/source3/winbindd/idmap_ldap.c +++ b/source3/winbindd/idmap_ldap.c @@ -752,6 +752,54 @@ done: return ret; } +/** + * Create a new mapping for an unmapped SID, also allocating a new ID. + * If possible, this should be run inside a transaction to make the + * action atomic. + */ +static NTSTATUS idmap_ldap_new_mapping(struct idmap_domain *dom, struct id_map *map) +{ + NTSTATUS ret; + + if (map == NULL) { + ret = NT_STATUS_INVALID_PARAMETER; + goto done; + } + + if ((map->xid.type != ID_TYPE_UID) && (map->xid.type != ID_TYPE_GID)) { + ret = NT_STATUS_INVALID_PARAMETER; + goto done; + } + + if (map->sid == NULL) { + ret = NT_STATUS_INVALID_PARAMETER; + goto done; + } + + ret = idmap_ldap_get_new_id(dom, &map->xid); + if (!NT_STATUS_IS_OK(ret)) { + DEBUG(3, ("Could not allocate id: %s\n", nt_errstr(ret))); + goto done; + } + + DEBUG(10, ("Setting mapping: %s <-> %s %lu\n", + sid_string_dbg(map->sid), + (map->xid.type == ID_TYPE_UID) ? "UID" : "GID", + (unsigned long)map->xid.id)); + + map->status = ID_MAPPED; + + /* store the mapping */ + ret = idmap_ldap_set_mapping(dom, map); + if (!NT_STATUS_IS_OK(ret)) { + DEBUG(3, ("Could not store the new mapping: %s\n", + nt_errstr(ret))); + } + +done: + return ret; +} + /* max number of ids requested per batch query */ #define IDMAP_LDAP_MAX_IDS 30