summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2016-11-15 13:34:51 +0100
committerLukas Slebodnik <lslebodn@redhat.com>2016-12-19 23:23:46 +0100
commit7a2ca8d776df685bddbb64370181fb32d776f676 (patch)
treec104e2e02984c54cbb16bf1d7289addb4fbd9c84
parent7be55c7de03da57f43fae3db7e6114eebb117a2e (diff)
downloadsssd-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.am1
-rw-r--r--src/responder/common/cache_req/cache_req_private.h9
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_common.c109
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_object_by_sid.c31
-rw-r--r--src/tests/cwrap/Makefile.am1
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 \