From 307e5b239ada7f817b941f7ffa4af6f1451ae91e Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Mon, 31 May 2010 17:12:32 +0200 Subject: s3:idmap: add abstract idmap_rw new_mapping mechanism without registering backends --- source3/winbindd/idmap_rw.c | 79 +++++++++++++++++++++++++++++++++++++++++++++ source3/winbindd/idmap_rw.h | 56 ++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 source3/winbindd/idmap_rw.c create mode 100644 source3/winbindd/idmap_rw.h diff --git a/source3/winbindd/idmap_rw.c b/source3/winbindd/idmap_rw.c new file mode 100644 index 0000000000..f0f06f9f66 --- /dev/null +++ b/source3/winbindd/idmap_rw.c @@ -0,0 +1,79 @@ +/* + * Unix SMB/CIFS implementation. + * + * ID mapping: abstract r/w new-mapping mechanism + * + * Copyright (C) Michael Adam 2010 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "includes.h" +#include "winbindd.h" +#include "idmap.h" +#include "idmap_rw.h" + +#undef DBGC_CLASS +#define DBGC_CLASS DBGC_IDMAP + +NTSTATUS idmap_rw_new_mapping(struct idmap_domain *dom, + struct idmap_rw_ops *ops, + struct id_map *map) +{ + NTSTATUS status; + + if (map == NULL) { + return NT_STATUS_INVALID_PARAMETER; + } + + if ((map->xid.type != ID_TYPE_UID) && (map->xid.type != ID_TYPE_GID)) { + return NT_STATUS_INVALID_PARAMETER; + } + + if (map->sid == NULL) { + return NT_STATUS_INVALID_PARAMETER; + } + + status = ops->get_new_id(dom, &map->xid); + + if (!NT_STATUS_IS_OK(status)) { + DEBUG(3, ("Could not allocate id: %s\n", nt_errstr(status))); + return status; + } + + 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; + status = ops->set_mapping(dom, map); + + if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) { + struct id_map *ids[2]; + DEBUG(5, ("Mapping for %s exists - retrying to map sid\n", + sid_string_dbg(map->sid))); + ids[0] = map; + ids[1] = NULL; + status = dom->methods->sids_to_unixids(dom, ids); + } + + if (!NT_STATUS_IS_OK(status)) { + DEBUG(3, ("Could not store the new mapping: %s\n", + nt_errstr(status))); + return status; + } + + return NT_STATUS_OK; +} diff --git a/source3/winbindd/idmap_rw.h b/source3/winbindd/idmap_rw.h new file mode 100644 index 0000000000..72389e7a02 --- /dev/null +++ b/source3/winbindd/idmap_rw.h @@ -0,0 +1,56 @@ +/* + * Unix SMB/CIFS implementation. + * + * ID mapping: abstract r/w new-mapping mechanism + * + * Copyright (C) Michael Adam 2010 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * This module implements the abstract logic for creating a new + * SID<->Unix-ID mapping. It can be used by idmap backends that + * need to create mappings for unmapped SIDs upon request. + */ + +#ifndef _IDMAP_RW_H_ +#define _IDMAP_RW_H_ + +#include "includes.h" +#include "idmap.h" + +struct idmap_rw_ops { + NTSTATUS (*get_new_id)(struct idmap_domain *dom, struct unixid *id); + NTSTATUS (*set_mapping)(struct idmap_domain *dom, + const struct id_map *map); +}; + +/** + * This is the abstract mechanism of creating a new mapping + * for a given SID. It is meant to be called called from an + * allocating backend from within idmap__sids_to_unixids(). + * It expects map->sid and map->xid.type to be set. + * Upon success, the new mapping is stored by the backend and + * map contains the new mapped xid. + * + * The caller has to take care of the necessary steps to + * guarantee atomicity of the operation, e.g. wrapping + * this call in a transaction if available. + */ +NTSTATUS idmap_rw_new_mapping(struct idmap_domain *dom, + struct idmap_rw_ops *ops, + struct id_map *map); + +#endif /* _IDMAP_RW_H_ */ -- cgit