diff options
author | Pavel Březina <pbrezina@redhat.com> | 2016-11-15 13:34:51 +0100 |
---|---|---|
committer | Lukas Slebodnik <lslebodn@redhat.com> | 2016-12-19 23:23:46 +0100 |
commit | 7a2ca8d776df685bddbb64370181fb32d776f676 (patch) | |
tree | c104e2e02984c54cbb16bf1d7289addb4fbd9c84 | |
parent | 7be55c7de03da57f43fae3db7e6114eebb117a2e (diff) | |
download | sssd-7a2ca8d776df685bddbb64370181fb32d776f676.tar.gz sssd-7a2ca8d776df685bddbb64370181fb32d776f676.tar.xz sssd-7a2ca8d776df685bddbb64370181fb32d776f676.zip |
cache_req: return well known objects in object by sid
Resolves:
https://fedorahosted.org/sssd/ticket/3151
Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | src/responder/common/cache_req/cache_req_private.h | 9 | ||||
-rw-r--r-- | src/responder/common/cache_req/plugins/cache_req_common.c | 109 | ||||
-rw-r--r-- | src/responder/common/cache_req/plugins/cache_req_object_by_sid.c | 31 | ||||
-rw-r--r-- | src/tests/cwrap/Makefile.am | 1 |
5 files changed, 150 insertions, 1 deletions
diff --git a/Makefile.am b/Makefile.am index b53469fa9..3483b7f2e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -482,6 +482,7 @@ SSSD_CACHE_REQ_OBJ = \ src/responder/common/cache_req/cache_req.c \ src/responder/common/cache_req/cache_req_search.c \ src/responder/common/cache_req/cache_req_data.c \ + src/responder/common/cache_req/plugins/cache_req_common.c \ src/responder/common/cache_req/plugins/cache_req_enum_users.c \ src/responder/common/cache_req/plugins/cache_req_enum_groups.c \ src/responder/common/cache_req/plugins/cache_req_enum_svc.c \ diff --git a/src/responder/common/cache_req/cache_req_private.h b/src/responder/common/cache_req/cache_req_private.h index 16d7bfaf7..4019fe368 100644 --- a/src/responder/common/cache_req/cache_req_private.h +++ b/src/responder/common/cache_req/cache_req_private.h @@ -123,4 +123,13 @@ cache_req_create_result_from_msg(TALLOC_CTX *mem_ctx, const char *lookup_name, const char *well_known_domain); +/* Plug-in common. */ + +struct cache_req_result * +cache_req_well_known_sid_result(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + const char *domname, + const char *sid, + const char *name); + #endif /* _CACHE_REQ_PRIVATE_H_ */ diff --git a/src/responder/common/cache_req/plugins/cache_req_common.c b/src/responder/common/cache_req/plugins/cache_req_common.c new file mode 100644 index 000000000..4c0f358fa --- /dev/null +++ b/src/responder/common/cache_req/plugins/cache_req_common.c @@ -0,0 +1,109 @@ +/* + Authors: + Pavel Březina <pbrezina@redhat.com> + + Copyright (C) 2016 Red Hat + + 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 <http://www.gnu.org/licenses/>. +*/ + +#include <talloc.h> +#include <ldb.h> + +#include "db/sysdb.h" +#include "util/util.h" +#include "providers/data_provider.h" +#include "responder/common/cache_req/cache_req_plugin.h" + +static struct ldb_message * +cache_req_well_known_sid_msg(TALLOC_CTX *mem_ctx, + const char *sid, + const char *name) +{ + struct ldb_message *msg; + const char *dup_sid; + const char *dup_name; + int ldberr; + + msg = ldb_msg_new(NULL); + if (msg == NULL) { + return NULL; + } + + dup_sid = talloc_strdup(msg, sid); + if (dup_sid == NULL) { + ldberr = LDB_ERR_OTHER; + goto done; + } + + dup_name = talloc_strdup(msg, name); + if (name == NULL) { + ldberr = LDB_ERR_OTHER; + goto done; + } + + ldberr = ldb_msg_add_string(msg, SYSDB_OBJECTCLASS, SYSDB_GROUP_CLASS); + if (ldberr != LDB_SUCCESS) { + goto done; + } + + ldberr = ldb_msg_add_string(msg, SYSDB_NAME, dup_name); + if (ldberr != LDB_SUCCESS) { + goto done; + } + + ldberr = ldb_msg_add_string(msg, SYSDB_SID_STR, dup_sid); + if (ldberr != LDB_SUCCESS) { + goto done; + } + +done: + if (ldberr != LDB_SUCCESS) { + talloc_free(msg); + return NULL; + } + + return msg; +} + +struct cache_req_result * +cache_req_well_known_sid_result(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + const char *domname, + const char *sid, + const char *name) +{ + struct cache_req_result *result; + struct sss_domain_info *domain; + struct ldb_message *msg; + + msg = cache_req_well_known_sid_msg(NULL, sid, name); + if (msg == NULL) { + return NULL; + } + + if (domname != NULL) { + domain = find_domain_by_name(cr->rctx->domains, domname, true); + } else { + domain = NULL; + } + + result = cache_req_create_result_from_msg(mem_ctx, domain, msg, + name, domname); + if (result == NULL) { + talloc_free(msg); + } + + return result; +} diff --git a/src/responder/common/cache_req/plugins/cache_req_object_by_sid.c b/src/responder/common/cache_req/plugins/cache_req_object_by_sid.c index d2e31f12e..e40968bce 100644 --- a/src/responder/common/cache_req/plugins/cache_req_object_by_sid.c +++ b/src/responder/common/cache_req/plugins/cache_req_object_by_sid.c @@ -26,6 +26,35 @@ #include "providers/data_provider.h" #include "responder/common/cache_req/cache_req_plugin.h" +static errno_t +cache_req_object_by_sid_well_known(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct cache_req_result **_result) +{ + struct cache_req_result *result; + const char *domname; + const char *name; + errno_t ret; + + ret = well_known_sid_to_name(data->sid, &domname, &name); + if (ret != EOK) { + CACHE_REQ_DEBUG(SSSDBG_TRACE_ALL, cr, + "SID [%s] is not a Well-Known SID.\n", data->sid); + return ret; + } + + result = cache_req_well_known_sid_result(mem_ctx, cr, domname, + data->sid, name); + if (result == NULL) { + return ENOMEM; + } + + *_result = result; + + return EOK; +} + static const char * cache_req_object_by_sid_create_debug_name(TALLOC_CTX *mem_ctx, struct cache_req_data *data, @@ -89,7 +118,7 @@ struct cache_req_plugin cache_req_object_by_sid = { .upn_equivalent = CACHE_REQ_SENTINEL, .get_next_domain_flags = 0, - .is_well_known_fn = NULL, + .is_well_known_fn = cache_req_object_by_sid_well_known, .prepare_domain_data_fn = NULL, .create_debug_name_fn = cache_req_object_by_sid_create_debug_name, .global_ncache_add_fn = cache_req_object_by_sid_global_ncache_add, diff --git a/src/tests/cwrap/Makefile.am b/src/tests/cwrap/Makefile.am index a0f1f27bb..c90cccfeb 100644 --- a/src/tests/cwrap/Makefile.am +++ b/src/tests/cwrap/Makefile.am @@ -40,6 +40,7 @@ SSSD_CACHE_REQ_OBJ = \ ../../../src/responder/common/cache_req/cache_req.c \ ../../../src/responder/common/cache_req/cache_req_search.c \ ../../../src/responder/common/cache_req/cache_req_data.c \ + ../../../src/responder/common/cache_req/plugins/cache_req_common.c \ ../../../src/responder/common/cache_req/plugins/cache_req_enum_users.c \ ../../../src/responder/common/cache_req/plugins/cache_req_enum_groups.c \ ../../../src/responder/common/cache_req/plugins/cache_req_enum_svc.c \ |