summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2016-11-14 14:55:03 +0100
committerLukas Slebodnik <lslebodn@redhat.com>2016-12-19 23:23:42 +0100
commit7be55c7de03da57f43fae3db7e6114eebb117a2e (patch)
treea78d7401ae591111800ee362842adf60d114fc11 /src
parent4e2c15e6b7c4015fa787f8c624c2ec10153e99f6 (diff)
cache_req: allow to return well known object as result
When we are looking name by sid or sid by name we want to be also able to translate well known sid/name into its pair equivalent. This adds the ability to mock cache_req_result if a well known object is found. Resolves: https://fedorahosted.org/sssd/ticket/3151 Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/responder/common/cache_req/cache_req.c100
-rw-r--r--src/responder/common/cache_req/cache_req.h13
-rw-r--r--src/responder/common/cache_req/cache_req_plugin.h16
-rw-r--r--src/responder/common/cache_req/cache_req_private.h10
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_enum_groups.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_enum_svc.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_enum_users.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_group_by_filter.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_group_by_id.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_group_by_name.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_initgroups_by_name.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_initgroups_by_upn.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_netgroup_by_name.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_object_by_sid.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_svc_by_name.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_svc_by_port.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_user_by_cert.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_user_by_filter.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_user_by_id.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_user_by_name.c1
-rw-r--r--src/responder/common/cache_req/plugins/cache_req_user_by_upn.c1
21 files changed, 153 insertions, 3 deletions
diff --git a/src/responder/common/cache_req/cache_req.c b/src/responder/common/cache_req/cache_req.c
index 1c25c76bc..e74f28e08 100644
--- a/src/responder/common/cache_req/cache_req.c
+++ b/src/responder/common/cache_req/cache_req.c
@@ -158,6 +158,30 @@ cache_req_validate_domain(struct cache_req *cr,
}
static errno_t
+cache_req_is_well_known_object(TALLOC_CTX *mem_ctx,
+ struct cache_req *cr,
+ struct cache_req_result **_result)
+{
+ errno_t ret;
+
+ if (cr->plugin->is_well_known_fn == NULL) {
+ return ENOENT;
+ }
+
+ ret = cr->plugin->is_well_known_fn(mem_ctx, cr, cr->data, _result);
+ if (ret == EOK) {
+ CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, cr, "Object is well known!\n");
+ (*_result)->well_known_object = true;
+ } else if (ret != ENOENT) {
+ CACHE_REQ_DEBUG(SSSDBG_CRIT_FAILURE, cr,
+ "Unable to prepare data [%d]: %s\n",
+ ret, sss_strerror(ret));
+ }
+
+ return ret;
+}
+
+static errno_t
cache_req_prepare_domain_data(struct cache_req *cr,
struct sss_domain_info *domain)
{
@@ -293,6 +317,9 @@ struct cache_req_state {
bool check_next;
};
+static errno_t cache_req_add_result(struct cache_req_state *state,
+ struct cache_req_result *new);
+
static errno_t cache_req_process_input(TALLOC_CTX *mem_ctx,
struct tevent_req *req,
struct cache_req *cr,
@@ -316,6 +343,7 @@ struct tevent_req *cache_req_send(TALLOC_CTX *mem_ctx,
struct cache_req_data *data)
{
struct cache_req_state *state;
+ struct cache_req_result *result;
struct cache_req *cr;
struct tevent_req *req;
errno_t ret;
@@ -335,6 +363,14 @@ struct tevent_req *cache_req_send(TALLOC_CTX *mem_ctx,
CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, cr, "New request\n");
+ ret = cache_req_is_well_known_object(state, cr, &result);
+ if (ret == EOK) {
+ ret = cache_req_add_result(state, result);
+ goto done;
+ } else if (ret != ENOENT) {
+ goto done;
+ }
+
ret = cache_req_process_input(state, req, cr, domain);
if (ret != EOK) {
goto done;
@@ -570,7 +606,7 @@ cache_req_create_and_add_result(struct cache_req_state *state,
"Found %u entries in domain %s\n",
ldb_result->count, domain->name);
- item = cache_req_create_result(state, domain, ldb_result, name);
+ item = cache_req_create_result(state, domain, ldb_result, name, NULL);
if (item == NULL) {
return ENOMEM;
}
@@ -728,7 +764,8 @@ struct cache_req_result *
cache_req_create_result(TALLOC_CTX *mem_ctx,
struct sss_domain_info *domain,
struct ldb_result *ldb_result,
- const char *lookup_name)
+ const char *lookup_name,
+ const char *well_known_domain)
{
struct cache_req_result *result;
@@ -750,6 +787,65 @@ cache_req_create_result(TALLOC_CTX *mem_ctx,
}
}
+ if (well_known_domain != NULL) {
+ result->well_known_domain = talloc_strdup(result, well_known_domain);
+ if (result->well_known_domain == NULL) {
+ talloc_free(result);
+ return NULL;
+ }
+ }
+
+ return result;
+}
+
+struct cache_req_result *
+cache_req_create_result_from_msg(TALLOC_CTX *mem_ctx,
+ struct sss_domain_info *domain,
+ struct ldb_message *ldb_msg,
+ const char *lookup_name,
+ const char *well_known_domain)
+{
+ struct cache_req_result *result;
+ struct ldb_result *ldb_result;
+ errno_t ret;
+
+ if (ldb_msg == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "No message set!\n");
+ return NULL;
+ }
+
+ ldb_result = talloc_zero(NULL, struct ldb_result);
+ if (ldb_result == NULL) {
+ return NULL;
+ }
+
+ ldb_result->extended = NULL;
+ ldb_result->controls = NULL;
+ ldb_result->refs = NULL;
+ ldb_result->count = 1;
+ ldb_result->msgs = talloc_zero_array(ldb_result, struct ldb_message *, 2);
+ if (ldb_result->msgs == NULL) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ ldb_result->msgs[0] = talloc_steal(ldb_result->msgs, ldb_msg);
+
+ result = cache_req_create_result(mem_ctx, domain, ldb_result,
+ lookup_name, well_known_domain);
+ if (result == NULL) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ ret = EOK;
+
+done:
+ if (ret != EOK) {
+ talloc_free(ldb_result);
+ return NULL;
+ }
+
return result;
}
diff --git a/src/responder/common/cache_req/cache_req.h b/src/responder/common/cache_req/cache_req.h
index 73c00b6e2..c0568476e 100644
--- a/src/responder/common/cache_req/cache_req.h
+++ b/src/responder/common/cache_req/cache_req.h
@@ -114,6 +114,19 @@ struct cache_req_result {
* normalized to @domain rules.
*/
const char *lookup_name;
+
+ /**
+ * If true the result contain attributes of a well known object.
+ * Since this result is manually created it may not contain all
+ * requested attributes, depending on the plug-in.
+ */
+ bool well_known_object;
+
+ /* If this is a well known object, it may not be part of any particular
+ * SSSD domain, but still may be associated with a well known domain
+ * name such as "BUILTIN", or "LOCAL AUTHORITY".
+ */
+ const char *well_known_domain;
};
/**
diff --git a/src/responder/common/cache_req/cache_req_plugin.h b/src/responder/common/cache_req/cache_req_plugin.h
index 490e93968..f57a07d81 100644
--- a/src/responder/common/cache_req/cache_req_plugin.h
+++ b/src/responder/common/cache_req/cache_req_plugin.h
@@ -31,6 +31,21 @@ enum cache_object_status {
};
/**
+ * Create cache request result manually, if the searched object is well known
+ * and thus can not be found in the cache.
+ *
+ *
+ * @return EOK If it is a well known object and a result was created.
+ * @return ENOENT If it is not a well known object.
+ * @return Other errno code in case of an error.
+ */
+typedef errno_t
+(*cache_req_is_well_known_result_fn)(TALLOC_CTX *mem_ctx,
+ struct cache_req *cr,
+ struct cache_req_data *data,
+ struct cache_req_result **_result);
+
+/**
* Create an object debug name that is used in debug messages to identify
* this object.
*
@@ -174,6 +189,7 @@ struct cache_req_plugin {
enum cache_req_type upn_equivalent;
/* Operations */
+ cache_req_is_well_known_result_fn is_well_known_fn;
cache_req_prepare_domain_data_fn prepare_domain_data_fn;
cache_req_create_debug_name_fn create_debug_name_fn;
cache_req_global_ncache_add_fn global_ncache_add_fn;
diff --git a/src/responder/common/cache_req/cache_req_private.h b/src/responder/common/cache_req/cache_req_private.h
index dc46408d5..16d7bfaf7 100644
--- a/src/responder/common/cache_req/cache_req_private.h
+++ b/src/responder/common/cache_req/cache_req_private.h
@@ -113,6 +113,14 @@ struct cache_req_result *
cache_req_create_result(TALLOC_CTX *mem_ctx,
struct sss_domain_info *domain,
struct ldb_result *ldb_result,
- const char *lookup_name);
+ const char *lookup_name,
+ const char *well_known_domain);
+
+struct cache_req_result *
+cache_req_create_result_from_msg(TALLOC_CTX *mem_ctx,
+ struct sss_domain_info *domain,
+ struct ldb_message *ldb_msg,
+ const char *lookup_name,
+ const char *well_known_domain);
#endif /* _CACHE_REQ_PRIVATE_H_ */
diff --git a/src/responder/common/cache_req/plugins/cache_req_enum_groups.c b/src/responder/common/cache_req/plugins/cache_req_enum_groups.c
index fb6bf08aa..c36925615 100644
--- a/src/responder/common/cache_req/plugins/cache_req_enum_groups.c
+++ b/src/responder/common/cache_req/plugins/cache_req_enum_groups.c
@@ -73,6 +73,7 @@ struct cache_req_plugin cache_req_enum_groups = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = 0,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = NULL,
.create_debug_name_fn = cache_req_enum_groups_create_debug_name,
.global_ncache_add_fn = NULL,
diff --git a/src/responder/common/cache_req/plugins/cache_req_enum_svc.c b/src/responder/common/cache_req/plugins/cache_req_enum_svc.c
index 9e4d5aa30..d88a29259 100644
--- a/src/responder/common/cache_req/plugins/cache_req_enum_svc.c
+++ b/src/responder/common/cache_req/plugins/cache_req_enum_svc.c
@@ -74,6 +74,7 @@ struct cache_req_plugin cache_req_enum_svc = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = 0,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = NULL,
.create_debug_name_fn = cache_req_enum_svc_create_debug_name,
.global_ncache_add_fn = NULL,
diff --git a/src/responder/common/cache_req/plugins/cache_req_enum_users.c b/src/responder/common/cache_req/plugins/cache_req_enum_users.c
index 811afcf8e..ed042f648 100644
--- a/src/responder/common/cache_req/plugins/cache_req_enum_users.c
+++ b/src/responder/common/cache_req/plugins/cache_req_enum_users.c
@@ -73,6 +73,7 @@ struct cache_req_plugin cache_req_enum_users = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = 0,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = NULL,
.create_debug_name_fn = cache_req_enum_users_create_debug_name,
.global_ncache_add_fn = NULL,
diff --git a/src/responder/common/cache_req/plugins/cache_req_group_by_filter.c b/src/responder/common/cache_req/plugins/cache_req_group_by_filter.c
index b92173222..fc4549031 100644
--- a/src/responder/common/cache_req/plugins/cache_req_group_by_filter.c
+++ b/src/responder/common/cache_req/plugins/cache_req_group_by_filter.c
@@ -128,6 +128,7 @@ struct cache_req_plugin cache_req_group_by_filter = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = 0,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = cache_req_group_by_filter_prepare_domain_data,
.create_debug_name_fn = cache_req_group_by_filter_create_debug_name,
.global_ncache_add_fn = NULL,
diff --git a/src/responder/common/cache_req/plugins/cache_req_group_by_id.c b/src/responder/common/cache_req/plugins/cache_req_group_by_id.c
index c15226054..7728330ae 100644
--- a/src/responder/common/cache_req/plugins/cache_req_group_by_id.c
+++ b/src/responder/common/cache_req/plugins/cache_req_group_by_id.c
@@ -116,6 +116,7 @@ struct cache_req_plugin cache_req_group_by_id = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = 0,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = NULL,
.create_debug_name_fn = cache_req_group_by_id_create_debug_name,
.global_ncache_add_fn = cache_req_group_by_id_global_ncache_add,
diff --git a/src/responder/common/cache_req/plugins/cache_req_group_by_name.c b/src/responder/common/cache_req/plugins/cache_req_group_by_name.c
index f9e504205..b0d363fff 100644
--- a/src/responder/common/cache_req/plugins/cache_req_group_by_name.c
+++ b/src/responder/common/cache_req/plugins/cache_req_group_by_name.c
@@ -166,6 +166,7 @@ struct cache_req_plugin cache_req_group_by_name = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = 0,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = cache_req_group_by_name_prepare_domain_data,
.create_debug_name_fn = cache_req_group_by_name_create_debug_name,
.global_ncache_add_fn = NULL,
diff --git a/src/responder/common/cache_req/plugins/cache_req_initgroups_by_name.c b/src/responder/common/cache_req/plugins/cache_req_initgroups_by_name.c
index 2d3056cd8..c1ba3f52a 100644
--- a/src/responder/common/cache_req/plugins/cache_req_initgroups_by_name.c
+++ b/src/responder/common/cache_req/plugins/cache_req_initgroups_by_name.c
@@ -181,6 +181,7 @@ struct cache_req_plugin cache_req_initgroups_by_name = {
.upn_equivalent = CACHE_REQ_INITGROUPS_BY_UPN,
.get_next_domain_flags = 0,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = cache_req_initgroups_by_name_prepare_domain_data,
.create_debug_name_fn = cache_req_initgroups_by_name_create_debug_name,
.global_ncache_add_fn = NULL,
diff --git a/src/responder/common/cache_req/plugins/cache_req_initgroups_by_upn.c b/src/responder/common/cache_req/plugins/cache_req_initgroups_by_upn.c
index 7284e7844..d1c7987ad 100644
--- a/src/responder/common/cache_req/plugins/cache_req_initgroups_by_upn.c
+++ b/src/responder/common/cache_req/plugins/cache_req_initgroups_by_upn.c
@@ -117,6 +117,7 @@ struct cache_req_plugin cache_req_initgroups_by_upn = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = SSS_GND_DESCEND,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = cache_req_initgroups_by_upn_prepare_domain_data,
.create_debug_name_fn = cache_req_initgroups_by_upn_create_debug_name,
.global_ncache_add_fn = NULL,
diff --git a/src/responder/common/cache_req/plugins/cache_req_netgroup_by_name.c b/src/responder/common/cache_req/plugins/cache_req_netgroup_by_name.c
index 08c5a16fe..07582e831 100644
--- a/src/responder/common/cache_req/plugins/cache_req_netgroup_by_name.c
+++ b/src/responder/common/cache_req/plugins/cache_req_netgroup_by_name.c
@@ -125,6 +125,7 @@ struct cache_req_plugin cache_req_netgroup_by_name = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = 0,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = cache_req_netgroup_by_name_prepare_domain_data,
.create_debug_name_fn = cache_req_netgroup_by_name_create_debug_name,
.global_ncache_add_fn = NULL,
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 390878a1a..d2e31f12e 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
@@ -89,6 +89,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,
.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/responder/common/cache_req/plugins/cache_req_svc_by_name.c b/src/responder/common/cache_req/plugins/cache_req_svc_by_name.c
index df5f9c3ff..7a253eb82 100644
--- a/src/responder/common/cache_req/plugins/cache_req_svc_by_name.c
+++ b/src/responder/common/cache_req/plugins/cache_req_svc_by_name.c
@@ -149,6 +149,7 @@ struct cache_req_plugin cache_req_svc_by_name = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = 0,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = cache_req_svc_by_name_prepare_domain_data,
.create_debug_name_fn = cache_req_svc_by_name_create_debug_name,
.global_ncache_add_fn = NULL,
diff --git a/src/responder/common/cache_req/plugins/cache_req_svc_by_port.c b/src/responder/common/cache_req/plugins/cache_req_svc_by_port.c
index 521849992..9b9703ac6 100644
--- a/src/responder/common/cache_req/plugins/cache_req_svc_by_port.c
+++ b/src/responder/common/cache_req/plugins/cache_req_svc_by_port.c
@@ -122,6 +122,7 @@ struct cache_req_plugin cache_req_svc_by_port = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = 0,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = cache_req_svc_by_port_prepare_domain_data,
.create_debug_name_fn = cache_req_svc_by_port_create_debug_name,
.global_ncache_add_fn = NULL,
diff --git a/src/responder/common/cache_req/plugins/cache_req_user_by_cert.c b/src/responder/common/cache_req/plugins/cache_req_user_by_cert.c
index 0da9de091..68728984d 100644
--- a/src/responder/common/cache_req/plugins/cache_req_user_by_cert.c
+++ b/src/responder/common/cache_req/plugins/cache_req_user_by_cert.c
@@ -92,6 +92,7 @@ struct cache_req_plugin cache_req_user_by_cert = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = SSS_GND_DESCEND,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = NULL,
.create_debug_name_fn = cache_req_user_by_cert_create_debug_name,
.global_ncache_add_fn = cache_req_user_by_cert_global_ncache_add,
diff --git a/src/responder/common/cache_req/plugins/cache_req_user_by_filter.c b/src/responder/common/cache_req/plugins/cache_req_user_by_filter.c
index 9490a0441..ef01d71d5 100644
--- a/src/responder/common/cache_req/plugins/cache_req_user_by_filter.c
+++ b/src/responder/common/cache_req/plugins/cache_req_user_by_filter.c
@@ -128,6 +128,7 @@ struct cache_req_plugin cache_req_user_by_filter = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = 0,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = cache_req_user_by_filter_prepare_domain_data,
.create_debug_name_fn = cache_req_user_by_filter_create_debug_name,
.global_ncache_add_fn = NULL,
diff --git a/src/responder/common/cache_req/plugins/cache_req_user_by_id.c b/src/responder/common/cache_req/plugins/cache_req_user_by_id.c
index e70ab9f44..f0629add5 100644
--- a/src/responder/common/cache_req/plugins/cache_req_user_by_id.c
+++ b/src/responder/common/cache_req/plugins/cache_req_user_by_id.c
@@ -116,6 +116,7 @@ struct cache_req_plugin cache_req_user_by_id = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = 0,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = NULL,
.create_debug_name_fn = cache_req_user_by_id_create_debug_name,
.global_ncache_add_fn = cache_req_user_by_id_global_ncache_add,
diff --git a/src/responder/common/cache_req/plugins/cache_req_user_by_name.c b/src/responder/common/cache_req/plugins/cache_req_user_by_name.c
index f598317e2..c799362da 100644
--- a/src/responder/common/cache_req/plugins/cache_req_user_by_name.c
+++ b/src/responder/common/cache_req/plugins/cache_req_user_by_name.c
@@ -166,6 +166,7 @@ struct cache_req_plugin cache_req_user_by_name = {
.upn_equivalent = CACHE_REQ_USER_BY_UPN,
.get_next_domain_flags = 0,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = cache_req_user_by_name_prepare_domain_data,
.create_debug_name_fn = cache_req_user_by_name_create_debug_name,
.global_ncache_add_fn = NULL,
diff --git a/src/responder/common/cache_req/plugins/cache_req_user_by_upn.c b/src/responder/common/cache_req/plugins/cache_req_user_by_upn.c
index 1260643b3..a0addfbc2 100644
--- a/src/responder/common/cache_req/plugins/cache_req_user_by_upn.c
+++ b/src/responder/common/cache_req/plugins/cache_req_user_by_upn.c
@@ -116,6 +116,7 @@ struct cache_req_plugin cache_req_user_by_upn = {
.upn_equivalent = CACHE_REQ_SENTINEL,
.get_next_domain_flags = SSS_GND_DESCEND,
+ .is_well_known_fn = NULL,
.prepare_domain_data_fn = cache_req_user_by_upn_prepare_domain_data,
.create_debug_name_fn = cache_req_user_by_upn_create_debug_name,
.global_ncache_add_fn = NULL,