summaryrefslogtreecommitdiff
path: root/source3/winbindd/idmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/winbindd/idmap.c')
-rw-r--r--source3/winbindd/idmap.c434
1 files changed, 0 insertions, 434 deletions
diff --git a/source3/winbindd/idmap.c b/source3/winbindd/idmap.c
index f0d2c03e0b..2c18164f8c 100644
--- a/source3/winbindd/idmap.c
+++ b/source3/winbindd/idmap.c
@@ -269,10 +269,6 @@ NTSTATUS idmap_init_cache(void)
return NT_STATUS_NO_MEMORY;
}
- if ( (idmap_cache = idmap_cache_init(idmap_ctx)) == NULL ) {
- return NT_STATUS_UNSUCCESSFUL;
- }
-
return NT_STATUS_OK;
}
@@ -1092,196 +1088,6 @@ static NTSTATUS idmap_backends_set_mapping(const struct id_map *map)
return dom->methods->set_mapping(dom, map);
}
-static NTSTATUS idmap_backends_unixids_to_sids(struct id_map **ids)
-{
- struct idmap_domain *dom;
- struct id_map **unmapped;
- struct id_map **_ids;
- TALLOC_CTX *ctx;
- NTSTATUS ret;
- int i, u, n;
-
- if (!ids || !*ids) {
- DEBUG(1, ("Invalid list of maps\n"));
- return NT_STATUS_INVALID_PARAMETER;
- }
-
- ctx = talloc_named_const(NULL, 0, "idmap_backends_unixids_to_sids ctx");
- if ( ! ctx) {
- DEBUG(0, ("Out of memory!\n"));
- return NT_STATUS_NO_MEMORY;
- }
-
- DEBUG(10, ("Query backends to map ids->sids\n"));
-
- /* start from the default (the last one) and then if there are still
- * unmapped entries cycle through the others */
-
- _ids = ids;
-
- unmapped = NULL;
- for (n = num_domains-1; n >= 0; n--) { /* cycle backwards */
-
- dom = idmap_domains[n];
-
- DEBUG(10, ("Query sids from domain %s\n", dom->name));
-
- ret = dom->methods->unixids_to_sids(dom, _ids);
- IDMAP_REPORT_RET(ret);
-
- unmapped = NULL;
-
- for (i = 0, u = 0; _ids[i]; i++) {
- if (_ids[i]->status != ID_MAPPED) {
- unmapped = talloc_realloc(ctx, unmapped,
- struct id_map *, u + 2);
- IDMAP_CHECK_ALLOC(unmapped);
- unmapped[u] = _ids[i];
- u++;
- }
- }
- if (unmapped) {
- /* terminate the unmapped list */
- unmapped[u] = NULL;
- } else { /* no more entries, get out */
- break;
- }
-
- _ids = unmapped;
-
- }
-
- if (unmapped) {
- /* there are still unmapped ids,
- * map them to the unix users/groups domains */
- /* except for expired entries,
- * these will be returned as valid (offline mode) */
- for (i = 0; unmapped[i]; i++) {
- if (unmapped[i]->status == ID_EXPIRED) continue;
- switch (unmapped[i]->xid.type) {
- case ID_TYPE_UID:
- uid_to_unix_users_sid(
- (uid_t)unmapped[i]->xid.id,
- unmapped[i]->sid);
- unmapped[i]->status = ID_MAPPED;
- break;
- case ID_TYPE_GID:
- gid_to_unix_groups_sid(
- (gid_t)unmapped[i]->xid.id,
- unmapped[i]->sid);
- unmapped[i]->status = ID_MAPPED;
- break;
- default: /* what?! */
- unmapped[i]->status = ID_UNKNOWN;
- break;
- }
- }
- }
-
- ret = NT_STATUS_OK;
-
-done:
- talloc_free(ctx);
- return ret;
-}
-
-static NTSTATUS idmap_backends_sids_to_unixids(struct id_map **ids)
-{
- struct id_map ***dom_ids;
- struct idmap_domain *dom;
- TALLOC_CTX *ctx;
- NTSTATUS ret;
- int i, *counters;
-
- if ( (ctx = talloc_named_const(NULL, 0, "be_sids_to_ids")) == NULL ) {
- DEBUG(1, ("failed to allocate talloc context, OOM?\n"));
- return NT_STATUS_NO_MEMORY;
- }
-
- DEBUG(10, ("Query backends to map sids->ids\n"));
-
- /* split list per domain */
- if (num_domains == 0) {
- DEBUG(1, ("No domains available?\n"));
- return NT_STATUS_UNSUCCESSFUL;
- }
-
- dom_ids = TALLOC_ZERO_ARRAY(ctx, struct id_map **, num_domains);
- IDMAP_CHECK_ALLOC(dom_ids);
- counters = TALLOC_ZERO_ARRAY(ctx, int, num_domains);
- IDMAP_CHECK_ALLOC(counters);
-
- /* partition the requests by domain */
-
- for (i = 0; ids[i]; i++) {
- uint32 idx;
-
- if ((dom = find_idmap_domain_from_sid(ids[i]->sid)) == NULL) {
- /* no available idmap_domain. Move on */
- continue;
- }
-
- DEBUG(10,("SID %s is being handled by %s\n",
- sid_string_dbg(ids[i]->sid),
- dom ? dom->name : "none" ));
-
- idx = find_idmap_domain_index( dom );
- SMB_ASSERT( idx != -1 );
-
- dom_ids[idx] = talloc_realloc(ctx, dom_ids[idx],
- struct id_map *,
- counters[idx] + 2);
- IDMAP_CHECK_ALLOC(dom_ids[idx]);
-
- dom_ids[idx][counters[idx]] = ids[i];
- counters[idx]++;
- dom_ids[idx][counters[idx]] = NULL;
- }
-
- /* All the ids have been dispatched in the right queues.
- Let's cycle through the filled ones */
-
- for (i = 0; i < num_domains; i++) {
- if (dom_ids[i]) {
- dom = idmap_domains[i];
- DEBUG(10, ("Query ids from domain %s\n", dom->name));
- ret = dom->methods->sids_to_unixids(dom, dom_ids[i]);
- IDMAP_REPORT_RET(ret);
- }
- }
-
- /* ok all the backends have been contacted at this point */
- /* let's see if we have any unmapped SID left and act accordingly */
-
- for (i = 0; ids[i]; i++) {
- /* NOTE: this will NOT touch ID_EXPIRED entries that the backend
- * was not able to confirm/deny (offline mode) */
- if (ids[i]->status == ID_UNKNOWN ||
- ids[i]->status == ID_UNMAPPED) {
- /* ok this is an unmapped one, see if we can map it */
- ret = idmap_new_mapping(ctx, ids[i]);
- if (NT_STATUS_IS_OK(ret)) {
- /* successfully mapped */
- ids[i]->status = ID_MAPPED;
- } else
- if (NT_STATUS_EQUAL(ret, NT_STATUS_NONE_MAPPED)) {
- /* could not map it */
- ids[i]->status = ID_UNMAPPED;
- } else {
- /* Something very bad happened down there
- * OR we are offline */
- ids[i]->status = ID_UNKNOWN;
- }
- }
- }
-
- ret = NT_STATUS_OK;
-
-done:
- talloc_free(ctx);
- return ret;
-}
-
NTSTATUS idmap_backends_unixid_to_sid(struct id_map *id)
{
struct id_map *maps[2];
@@ -1321,242 +1127,6 @@ NTSTATUS idmap_backends_sid_to_unixid(struct id_map *id)
return dom->methods->sids_to_unixids(dom, maps);
}
-/**************************************************************************
- idmap interface functions
-**************************************************************************/
-
-NTSTATUS idmap_unixids_to_sids(struct id_map **ids)
-{
- TALLOC_CTX *ctx;
- NTSTATUS ret;
- struct id_map **bids;
- int i, bi;
- int bn = 0;
- struct winbindd_domain *our_domain = find_our_domain();
-
- if (! NT_STATUS_IS_OK(ret = idmap_init())) {
- return ret;
- }
-
- if (!ids || !*ids) {
- DEBUG(1, ("Invalid list of maps\n"));
- return NT_STATUS_INVALID_PARAMETER;
- }
-
- ctx = talloc_named_const(NULL, 0, "idmap_unixids_to_sids ctx");
- if ( ! ctx) {
- DEBUG(1, ("failed to allocate talloc context, OOM?\n"));
- return NT_STATUS_NO_MEMORY;
- }
-
- /* no ids to be asked to the backends by default */
- bids = NULL;
- bi = 0;
-
- for (i = 0; ids[i]; i++) {
-
- if ( ! ids[i]->sid) {
- DEBUG(1, ("invalid null SID in id_map array"));
- talloc_free(ctx);
- return NT_STATUS_INVALID_PARAMETER;
- }
-
- ret = idmap_cache_map_id(idmap_cache, ids[i]);
-
- if (NT_STATUS_IS_OK(ret)) continue;
-
- if ( ! bids) {
- /* alloc space for ids to be resolved by
- * backends (realloc ten by ten) */
- bids = TALLOC_ARRAY(ctx, struct id_map *, 10);
- if ( ! bids) {
- DEBUG(1, ("Out of memory!\n"));
- talloc_free(ctx);
- return NT_STATUS_NO_MEMORY;
- }
- bn = 10;
- }
-
- /* add this id to the ones to be retrieved
- * from the backends */
- bids[bi] = ids[i];
- bi++;
-
- /* check if we need to allocate new space
- * on the rids array */
- if (bi == bn) {
- bn += 10;
- bids = talloc_realloc(ctx, bids, struct id_map *, bn);
- if ( ! bids) {
- DEBUG(1, ("Out of memory!\n"));
- talloc_free(ctx);
- return NT_STATUS_NO_MEMORY;
- }
- }
-
- /* make sure the last element is NULL */
- bids[bi] = NULL;
- }
-
- /* let's see if there is any id mapping to be retrieved
- * from the backends */
- if (bids) {
- bool online;
-
- /* Only do query if we are online */
- online = !IS_DOMAIN_OFFLINE(our_domain);
- if (online) {
- ret = idmap_backends_unixids_to_sids(bids);
- IDMAP_CHECK_RET(ret);
- }
-
- /* update the cache */
- for (i = 0; i < bi; i++) {
- if (bids[i]->status == ID_MAPPED) {
- ret = idmap_cache_set(idmap_cache, bids[i]);
- } else if (bids[i]->status == ID_EXPIRED) {
- /* the cache returned an expired entry and the
- * backend was not able to clear the situation
- * (offline). This handles a previous
- * NT_STATUS_SYNCHRONIZATION_REQUIRED
- * for disconnected mode, */
- bids[i]->status = ID_MAPPED;
- } else if (bids[i]->status == ID_UNKNOWN) {
- /* something bad here. We were not able to
- * handle this for some reason, mark it as
- * unmapped and hope next time things will
- * settle down. */
- bids[i]->status = ID_UNMAPPED;
- } else if (online) { /* unmapped */
- ret = idmap_cache_set_negative_id(idmap_cache,
- bids[i]);
- }
- IDMAP_CHECK_RET(ret);
- }
- }
-
- ret = NT_STATUS_OK;
-done:
- talloc_free(ctx);
- return ret;
-}
-
-NTSTATUS idmap_sids_to_unixids(struct id_map **ids)
-{
- TALLOC_CTX *ctx;
- NTSTATUS ret;
- struct id_map **bids;
- int i, bi;
- int bn = 0;
- struct winbindd_domain *our_domain = find_our_domain();
-
- if (! NT_STATUS_IS_OK(ret = idmap_init())) {
- return ret;
- }
-
- if (!ids || !*ids) {
- DEBUG(1, ("Invalid list of maps\n"));
- return NT_STATUS_INVALID_PARAMETER;
- }
-
- ctx = talloc_named_const(NULL, 0, "idmap_sids_to_unixids ctx");
- if ( ! ctx) {
- DEBUG(1, ("failed to allocate talloc context, OOM?\n"));
- return NT_STATUS_NO_MEMORY;
- }
-
- /* no ids to be asked to the backends by default */
- bids = NULL;
- bi = 0;
-
- for (i = 0; ids[i]; i++) {
-
- if ( ! ids[i]->sid) {
- DEBUG(1, ("invalid null SID in id_map array\n"));
- talloc_free(ctx);
- return NT_STATUS_INVALID_PARAMETER;
- }
-
- ret = idmap_cache_map_sid(idmap_cache, ids[i]);
-
- if (NT_STATUS_IS_OK(ret)) continue;
-
- if ( ! bids) {
- /* alloc space for ids to be resolved
- by backends (realloc ten by ten) */
- bids = TALLOC_ARRAY(ctx, struct id_map *, 10);
- if ( ! bids) {
- DEBUG(1, ("Out of memory!\n"));
- talloc_free(ctx);
- return NT_STATUS_NO_MEMORY;
- }
- bn = 10;
- }
-
- /* add this id to the ones to be retrieved
- * from the backends */
- bids[bi] = ids[i];
- bi++;
-
- /* check if we need to allocate new space
- * on the ids array */
- if (bi == bn) {
- bn += 10;
- bids = talloc_realloc(ctx, bids, struct id_map *, bn);
- if ( ! bids) {
- DEBUG(1, ("Out of memory!\n"));
- talloc_free(ctx);
- return NT_STATUS_NO_MEMORY;
- }
- }
-
- /* make sure the last element is NULL */
- bids[bi] = NULL;
- }
-
- /* let's see if there is any id mapping to be retrieved
- * from the backends */
- if (bids) {
- bool online;
-
- /* Only do query if we are online */
- online = !IS_DOMAIN_OFFLINE(our_domain);
- if (online) {
- ret = idmap_backends_sids_to_unixids(bids);
- IDMAP_CHECK_RET(ret);
- }
-
- /* update the cache */
- for (i = 0; bids[i]; i++) {
- if (bids[i]->status == ID_MAPPED) {
- ret = idmap_cache_set(idmap_cache, bids[i]);
- } else if (bids[i]->status == ID_EXPIRED) {
- /* the cache returned an expired entry and the
- * backend was not able to clear the situation
- * (offline). This handles a previous
- * NT_STATUS_SYNCHRONIZATION_REQUIRED
- * for disconnected mode, */
- bids[i]->status = ID_MAPPED;
- } else if (bids[i]->status == ID_UNKNOWN) {
- /* something bad here. We were not able to
- * handle this for some reason, mark it as
- * unmapped and hope next time things will
- * settle down. */
- bids[i]->status = ID_UNMAPPED;
- } else if (online) { /* unmapped */
- ret = idmap_cache_set_negative_sid(idmap_cache,
- bids[i]);
- }
- IDMAP_CHECK_RET(ret);
- }
- }
-
- ret = NT_STATUS_OK;
-done:
- talloc_free(ctx);
- return ret;
-}
-
NTSTATUS idmap_set_mapping(const struct id_map *id)
{
TALLOC_CTX *ctx;
@@ -1584,10 +1154,6 @@ NTSTATUS idmap_set_mapping(const struct id_map *id)
ret = idmap_backends_set_mapping(id);
IDMAP_CHECK_RET(ret);
- /* set the mapping in the cache */
- ret = idmap_cache_set(idmap_cache, id);
- IDMAP_CHECK_RET(ret);
-
done:
talloc_free(ctx);
return ret;