d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina/*
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina Authors:
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina Pavel Březina <pbrezina@redhat.com>
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina Copyright (C) 2015 Red Hat
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina This program is free software; you can redistribute it and/or modify
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina it under the terms of the GNU General Public License as published by
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina the Free Software Foundation; either version 3 of the License, or
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina (at your option) any later version.
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina This program is distributed in the hope that it will be useful,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina GNU General Public License for more details.
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina You should have received a copy of the GNU General Public License
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina*/
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina#include <talloc.h>
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina#include <tevent.h>
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina#include "db/sysdb.h"
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina#include "util/util.h"
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina#include "responder/common/responder.h"
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina#include "responder/ifp/ifp_cache.h"
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina#include "responder/ifp/ifp_users.h"
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina#include "responder/ifp/ifp_groups.h"
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina#include "responder/ifp/ifp_iface_generated.h"
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinastatic struct ldb_dn *
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaifp_cache_build_base_dn(TALLOC_CTX *mem_ctx,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina enum ifp_cache_type type,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct sss_domain_info *domain)
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina{
f2bba721d18842a014ab170c207af8e8ecb6e890Lukas Slebodnik struct ldb_dn *base_dn = NULL;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina switch (type) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina case IFP_CACHE_USER:
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina base_dn = sysdb_user_base_dn(mem_ctx, domain);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina break;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina case IFP_CACHE_GROUP:
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina base_dn = sysdb_group_base_dn(mem_ctx, domain);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina break;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return base_dn;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinastatic char *
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaifp_cache_build_path(TALLOC_CTX *mem_ctx,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina enum ifp_cache_type type,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct sss_domain_info *domain,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct ldb_message *msg)
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina{
f2bba721d18842a014ab170c207af8e8ecb6e890Lukas Slebodnik char *path = NULL;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina switch (type) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina case IFP_CACHE_USER:
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina path = ifp_users_build_path_from_msg(mem_ctx, domain, msg);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina break;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina case IFP_CACHE_GROUP:
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina path = ifp_groups_build_path_from_msg(mem_ctx, domain, msg);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina break;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return path;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinastatic const char *
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaifp_cache_object_class(enum ifp_cache_type type)
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina{
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina const char *class = NULL;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina switch (type) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina case IFP_CACHE_USER:
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina class = SYSDB_USER_CLASS;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina break;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina case IFP_CACHE_GROUP:
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina class = SYSDB_GROUP_CLASS;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina break;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return class;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinastatic errno_t
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaifp_cache_get_cached_objects(TALLOC_CTX *mem_ctx,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina enum ifp_cache_type type,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct sss_domain_info *domain,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina const char ***_paths,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina int *_num_paths)
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina{
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina TALLOC_CTX *tmp_ctx;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct ldb_dn *base_dn;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct ldb_result *result;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina const char *class = ifp_cache_object_class(type);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina const char **paths;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina errno_t ret;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina int ldb_ret;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina int i;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina const char *attrs[] = {SYSDB_OBJECTCLASS, SYSDB_UIDNUM,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina SYSDB_GIDNUM, NULL};
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina tmp_ctx = talloc_new(NULL);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (tmp_ctx == NULL) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return ENOMEM;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina base_dn = ifp_cache_build_base_dn(tmp_ctx, type, domain);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (base_dn == NULL) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create base dn\n");
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = ENOMEM;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina goto done;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ldb_ret = ldb_search(sysdb_ctx_get_ldb(domain->sysdb), tmp_ctx, &result,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina base_dn, LDB_SCOPE_SUBTREE, attrs,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina "(&(objectClass=%s)(%s=TRUE))", class,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina SYSDB_IFP_CACHED);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (ldb_ret != LDB_SUCCESS) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to search the cache\n");
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = sysdb_error_to_errno(ldb_ret);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina goto done;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina paths = talloc_zero_array(tmp_ctx, const char *, result->count + 1);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (paths == NULL) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = ENOMEM;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina goto done;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina for (i = 0; i < result->count; i++) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina paths[i] = ifp_cache_build_path(paths, type, domain, result->msgs[i]);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (paths[i] == NULL) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = ENOMEM;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina goto done;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina *_paths = talloc_steal(mem_ctx, paths);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina *_num_paths = result->count;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = EOK;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinadone:
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina talloc_free(tmp_ctx);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return ret;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březinaerrno_t ifp_cache_list_domains(TALLOC_CTX *mem_ctx,
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina struct sss_domain_info *domains,
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina enum ifp_cache_type type,
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina const char ***_paths,
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina int *_num_paths)
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina{
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina TALLOC_CTX *tmp_ctx;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct sss_domain_info *domain;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina const char **tmp_paths;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina int num_tmp_paths;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina const char **paths;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina int num_paths;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina errno_t ret;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina tmp_ctx = talloc_new(NULL);
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina if (tmp_ctx == NULL) {
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina return ENOMEM;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina domain = domains;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina num_paths = 0;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina paths = NULL;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina while (domain != NULL) {
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina ret = ifp_cache_get_cached_objects(tmp_ctx, type, domain,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina &tmp_paths, &num_tmp_paths);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (ret != EOK) {
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to build object list "
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina goto done;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina ret = add_strings_lists(tmp_ctx, paths, tmp_paths, true,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina discard_const(&paths));
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (ret != EOK) {
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to build object list "
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina goto done;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina num_paths += num_tmp_paths;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
877b92e80bde510d5cd9f03dbf01e2bcf73ab072Michal Židek domain = get_next_domain(domain, SSS_GND_DESCEND);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina if (_paths != NULL) {
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina *_paths = talloc_steal(mem_ctx, paths);
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina }
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina if (_num_paths != NULL) {
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina *_num_paths = num_paths;
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina }
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina ret = EOK;
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březinadone:
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina talloc_free(tmp_ctx);
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina return ret;
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina}
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březinaint ifp_cache_list(struct sbus_request *sbus_req,
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina void *data,
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina enum ifp_cache_type type)
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina{
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina DBusError *error;
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina struct ifp_ctx *ifp_ctx;
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina const char **paths;
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina int num_paths;
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina errno_t ret;
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina ifp_ctx = talloc_get_type(data, struct ifp_ctx);
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina if (ifp_ctx == NULL) {
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina return ERR_INTERNAL;
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina }
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina ret = ifp_cache_list_domains(sbus_req, ifp_ctx->rctx->domains, type,
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina &paths, &num_paths);
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina if (ret != EOK) {
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED,
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina "Unable to build object list [%d]: %s\n",
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina ret, sss_strerror(ret));
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina return sbus_request_fail_and_finish(sbus_req, error);
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina }
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina iface_ifp_cache_List_finish(sbus_req, paths, num_paths);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return EOK;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_list_by_domain(struct sbus_request *sbus_req,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina void *data,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina const char *domainname,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina enum ifp_cache_type type)
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina{
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina DBusError *error;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct sss_domain_info *domain;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct ifp_ctx *ifp_ctx;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina const char **paths;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina int num_paths;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina errno_t ret;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ifp_ctx = talloc_get_type(data, struct ifp_ctx);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (ifp_ctx == NULL) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return ERR_INTERNAL;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina domain = find_domain_by_name(ifp_ctx->rctx->domains, domainname, true);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (domain == NULL) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Unknown domain");
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return sbus_request_fail_and_finish(sbus_req, error);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = ifp_cache_get_cached_objects(sbus_req, type, domain,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina &paths, &num_paths);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (ret != EOK) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Unable to build "
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina "object list [%d]: %s\n", ret, sss_strerror(ret));
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return sbus_request_fail_and_finish(sbus_req, error);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina iface_ifp_cache_ListByDomain_finish(sbus_req, paths, num_paths);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return EOK;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinastatic errno_t ifp_cache_object_set(struct sss_domain_info *domain,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct ldb_dn *dn,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina bool value)
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina{
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct sysdb_attrs *attrs;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina errno_t ret;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina attrs = sysdb_new_attrs(NULL);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (attrs == NULL) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return ENOMEM;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = sysdb_attrs_add_bool(attrs, SYSDB_IFP_CACHED, value);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (ret != EOK) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to add attribute [%d]: %s\n",
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret, sss_strerror(ret));
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina goto done;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = sysdb_set_entry_attr(domain->sysdb, dn, attrs, SYSDB_MOD_REP);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (ret != EOK) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to modify entry [%d]: %s\n",
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret, sss_strerror(ret));
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina goto done;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = EOK;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinadone:
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina talloc_free(attrs);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return ret;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_object_store(struct sbus_request *sbus_req,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct sss_domain_info *domain,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct ldb_dn *dn)
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina{
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina errno_t ret;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = ifp_cache_object_set(domain, dn, true);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (ret == EOK) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina iface_ifp_cache_object_Store_finish(sbus_req, true);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina } else {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina iface_ifp_cache_object_Store_finish(sbus_req, false);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return EOK;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_object_remove(struct sbus_request *sbus_req,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct sss_domain_info *domain,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct ldb_dn *dn)
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina{
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina errno_t ret;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = ifp_cache_object_set(domain, dn, false);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (ret == EOK) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina iface_ifp_cache_object_Remove_finish(sbus_req, true);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina } else {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina iface_ifp_cache_object_Remove_finish(sbus_req, false);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return EOK;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}