0db2f3402b37df221fbf55486769989f82df479aPavel Březina/*
0db2f3402b37df221fbf55486769989f82df479aPavel Březina Authors:
0db2f3402b37df221fbf55486769989f82df479aPavel Březina Pavel Březina <pbrezina@redhat.com>
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina Copyright (C) 2016 Red Hat
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina This program is free software; you can redistribute it and/or modify
0db2f3402b37df221fbf55486769989f82df479aPavel Březina it under the terms of the GNU General Public License as published by
0db2f3402b37df221fbf55486769989f82df479aPavel Březina the Free Software Foundation; either version 3 of the License, or
0db2f3402b37df221fbf55486769989f82df479aPavel Březina (at your option) any later version.
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina This program is distributed in the hope that it will be useful,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
0db2f3402b37df221fbf55486769989f82df479aPavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0db2f3402b37df221fbf55486769989f82df479aPavel Březina GNU General Public License for more details.
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina You should have received a copy of the GNU General Public License
0db2f3402b37df221fbf55486769989f82df479aPavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
0db2f3402b37df221fbf55486769989f82df479aPavel Březina*/
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina#include <talloc.h>
0db2f3402b37df221fbf55486769989f82df479aPavel Březina#include <ldb.h>
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina#include "db/sysdb.h"
0db2f3402b37df221fbf55486769989f82df479aPavel Březina#include "util/util.h"
0db2f3402b37df221fbf55486769989f82df479aPavel Březina#include "providers/data_provider.h"
0db2f3402b37df221fbf55486769989f82df479aPavel Březina#include "responder/common/cache_req/cache_req_plugin.h"
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březinastatic errno_t
0db2f3402b37df221fbf55486769989f82df479aPavel Březinacache_req_group_by_filter_prepare_domain_data(struct cache_req *cr,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina struct cache_req_data *data,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina struct sss_domain_info *domain)
0db2f3402b37df221fbf55486769989f82df479aPavel Březina{
0db2f3402b37df221fbf55486769989f82df479aPavel Březina TALLOC_CTX *tmp_ctx;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina const char *name;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina errno_t ret;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina if (cr->data->name.name == NULL) {
0db2f3402b37df221fbf55486769989f82df479aPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Bug: parsed name is NULL?\n");
0db2f3402b37df221fbf55486769989f82df479aPavel Březina return ERR_INTERNAL;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina }
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina tmp_ctx = talloc_new(NULL);
0db2f3402b37df221fbf55486769989f82df479aPavel Březina if (tmp_ctx == NULL) {
0db2f3402b37df221fbf55486769989f82df479aPavel Březina return ENOMEM;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina }
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina name = sss_get_cased_name(tmp_ctx, cr->data->name.name,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina domain->case_sensitive);
0db2f3402b37df221fbf55486769989f82df479aPavel Březina if (name == NULL) {
0db2f3402b37df221fbf55486769989f82df479aPavel Březina ret = ENOMEM;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina goto done;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina }
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina name = sss_reverse_replace_space(tmp_ctx, name, cr->rctx->override_space);
0db2f3402b37df221fbf55486769989f82df479aPavel Březina if (name == NULL) {
0db2f3402b37df221fbf55486769989f82df479aPavel Březina ret = ENOMEM;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina goto done;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina }
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina talloc_zfree(data->name.lookup);
0db2f3402b37df221fbf55486769989f82df479aPavel Březina data->name.lookup = talloc_steal(data, name);
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina ret = EOK;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březinadone:
0db2f3402b37df221fbf55486769989f82df479aPavel Březina talloc_free(tmp_ctx);
0db2f3402b37df221fbf55486769989f82df479aPavel Březina return ret;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina}
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březinastatic const char *
0db2f3402b37df221fbf55486769989f82df479aPavel Březinacache_req_group_by_filter_create_debug_name(TALLOC_CTX *mem_ctx,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina struct cache_req_data *data,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina struct sss_domain_info *domain)
0db2f3402b37df221fbf55486769989f82df479aPavel Březina{
0db2f3402b37df221fbf55486769989f82df479aPavel Březina return talloc_strdup(mem_ctx, data->name.lookup);
0db2f3402b37df221fbf55486769989f82df479aPavel Březina}
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březinastatic errno_t
0db2f3402b37df221fbf55486769989f82df479aPavel Březinacache_req_group_by_filter_lookup(TALLOC_CTX *mem_ctx,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina struct cache_req *cr,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina struct cache_req_data *data,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina struct sss_domain_info *domain,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina struct ldb_result **_result)
0db2f3402b37df221fbf55486769989f82df479aPavel Březina{
0db2f3402b37df221fbf55486769989f82df479aPavel Březina char *recent_filter;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina errno_t ret;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina recent_filter = talloc_asprintf(mem_ctx, "(%s>=%lu)", SYSDB_LAST_UPDATE,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina cr->req_start);
0db2f3402b37df221fbf55486769989f82df479aPavel Březina if (recent_filter == NULL) {
0db2f3402b37df221fbf55486769989f82df479aPavel Březina return ENOMEM;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina }
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina ret = sysdb_enumgrent_filter_with_views(mem_ctx, domain, data->name.lookup,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina recent_filter, _result);
0db2f3402b37df221fbf55486769989f82df479aPavel Březina talloc_free(recent_filter);
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina return ret;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina}
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březinastatic errno_t
0db2f3402b37df221fbf55486769989f82df479aPavel Březinacache_req_group_by_filter_dpreq_params(TALLOC_CTX *mem_ctx,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina struct cache_req *cr,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina struct ldb_result *result,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina const char **_string,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina uint32_t *_id,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina const char **_flag)
0db2f3402b37df221fbf55486769989f82df479aPavel Březina{
0db2f3402b37df221fbf55486769989f82df479aPavel Březina *_id = cr->data->id;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina *_string = cr->data->name.lookup;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina *_flag = NULL;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina return EOK;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina}
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březinastruct cache_req_plugin cache_req_group_by_filter = {
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .name = "Group by filter",
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .dp_type = SSS_DP_WILDCARD_GROUP,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .attr_expiration = SYSDB_CACHE_EXPIRE,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .parse_name = true,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .bypass_cache = true,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .only_one_result = false,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .allow_missing_fqn = false,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .allow_switch_to_upn = false,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .upn_equivalent = CACHE_REQ_SENTINEL,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .get_next_domain_flags = 0,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .prepare_domain_data_fn = cache_req_group_by_filter_prepare_domain_data,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .create_debug_name_fn = cache_req_group_by_filter_create_debug_name,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .global_ncache_add_fn = NULL,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .ncache_check_fn = NULL,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .ncache_add_fn = NULL,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .lookup_fn = cache_req_group_by_filter_lookup,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina .dpreq_params_fn = cache_req_group_by_filter_dpreq_params
0db2f3402b37df221fbf55486769989f82df479aPavel Březina};
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březinastruct tevent_req *
0db2f3402b37df221fbf55486769989f82df479aPavel Březinacache_req_group_by_filter_send(TALLOC_CTX *mem_ctx,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina struct tevent_context *ev,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina struct resp_ctx *rctx,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina const char *domain,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina const char *filter)
0db2f3402b37df221fbf55486769989f82df479aPavel Březina{
0db2f3402b37df221fbf55486769989f82df479aPavel Březina struct cache_req_data *data;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina data = cache_req_data_name(mem_ctx, CACHE_REQ_GROUP_BY_FILTER, filter);
0db2f3402b37df221fbf55486769989f82df479aPavel Březina if (data == NULL) {
0db2f3402b37df221fbf55486769989f82df479aPavel Březina return NULL;
0db2f3402b37df221fbf55486769989f82df479aPavel Březina }
0db2f3402b37df221fbf55486769989f82df479aPavel Březina
0db2f3402b37df221fbf55486769989f82df479aPavel Březina return cache_req_steal_data_and_send(mem_ctx, ev, rctx, NULL,
0db2f3402b37df221fbf55486769989f82df479aPavel Březina 0, domain, data);
0db2f3402b37df221fbf55486769989f82df479aPavel Březina}