0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina/*
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina Authors:
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina Pavel Březina <pbrezina@redhat.com>
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina Copyright (C) 2014 Red Hat
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina This program is free software; you can redistribute it and/or modify
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina it under the terms of the GNU General Public License as published by
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina the Free Software Foundation; either version 3 of the License, or
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina (at your option) any later version.
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina This program is distributed in the hope that it will be useful,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina GNU General Public License for more details.
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina You should have received a copy of the GNU General Public License
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina*/
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina#include <dbus/dbus.h>
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina#include "lib/sifp/sss_sifp.h"
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina#include "lib/sifp/sss_sifp_dbus.h"
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina#include "lib/sifp/sss_sifp_private.h"
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina#include "responder/ifp/ifp_iface.h"
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina#define SSS_SIFP_ATTR_NAME "name"
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinastatic sss_sifp_error
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinasss_sifp_fetch_object_by_attr(sss_sifp_ctx *ctx,
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina const char *path,
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina const char *iface_find,
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina const char *iface_object,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina const char *method,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina int attr_type,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina const void *attr,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_object **_object)
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina{
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_object *object = NULL;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina char *object_path = NULL;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_error ret;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina if (method == NULL || attr == NULL || attr_type == DBUS_TYPE_INVALID) {
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina return SSS_SIFP_INVALID_ARGUMENT;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina }
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina ret = sss_sifp_invoke_find_ex(ctx, path, iface_find, method, &object_path,
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina attr_type, attr, DBUS_TYPE_INVALID);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina if (ret != SSS_SIFP_OK) {
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina goto done;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina }
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina ret = sss_sifp_fetch_object(ctx, object_path, iface_object, &object);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina if (ret != SSS_SIFP_OK) {
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina goto done;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina }
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina *_object = object;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina ret = SSS_SIFP_OK;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinadone:
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_free_string(ctx, &object_path);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina return ret;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina}
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinastatic sss_sifp_error
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinasss_sifp_fetch_object_by_name(sss_sifp_ctx *ctx,
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina const char *path,
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina const char *iface_find,
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina const char *iface_object,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina const char *method,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina const char *name,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_object **_object)
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina{
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina return sss_sifp_fetch_object_by_attr(ctx, path, iface_find, iface_object,
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina method, DBUS_TYPE_STRING, &name,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina _object);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina}
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinasss_sifp_error
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinasss_sifp_list_domains(sss_sifp_ctx *ctx,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina char ***_domains)
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina{
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_attr **attrs = NULL;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina char **object_paths = NULL;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina char **domains = NULL;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina const char *name = NULL;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina unsigned int size;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina unsigned int i;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_error ret;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina if (_domains == NULL) {
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina return SSS_SIFP_INVALID_ARGUMENT;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina }
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina ret = sss_sifp_invoke_list_ex(ctx, IFP_PATH, IFACE_IFP, "Domains",
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina &object_paths, DBUS_TYPE_INVALID);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina if (ret != SSS_SIFP_OK) {
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina goto done;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina }
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina /* calculate number of paths acquired and allocate memory for domains */
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina for (size = 0; object_paths[size] != NULL; size++);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina domains = _alloc_zero(ctx, char *, size + 1);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina if (domains == NULL) {
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina ret = SSS_SIFP_OUT_OF_MEMORY;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina goto done;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina }
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina /* fetch domain name */
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina for (i = 0; i < size; i++) {
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina ret = sss_sifp_fetch_attr(ctx, object_paths[i], IFACE_IFP_DOMAINS,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina SSS_SIFP_ATTR_NAME, &attrs);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina if (ret != SSS_SIFP_OK) {
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina goto done;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina }
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina ret = sss_sifp_find_attr_as_string(attrs, SSS_SIFP_ATTR_NAME, &name);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina if (ret != SSS_SIFP_OK) {
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina goto done;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina }
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina domains[i] = sss_sifp_strdup(ctx, name);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina if (domains[i] == NULL) {
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina ret = SSS_SIFP_OUT_OF_MEMORY;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina goto done;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina }
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_free_attrs(ctx, &attrs);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina }
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina domains[i] = NULL;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina *_domains = domains;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina ret = SSS_SIFP_OK;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinadone:
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_free_attrs(ctx, &attrs);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_free_string_array(ctx, &object_paths);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina if (ret != SSS_SIFP_OK) {
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_free_string_array(ctx, &domains);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina }
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina return ret;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina}
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinasss_sifp_error
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinasss_sifp_fetch_domain_by_name(sss_sifp_ctx *ctx,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina const char *name,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_object **_domain)
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina{
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina return sss_sifp_fetch_object_by_name(ctx, IFP_PATH, IFACE_IFP,
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina IFACE_IFP_DOMAINS, "DomainByName",
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina name, _domain);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina}
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinasss_sifp_error
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinasss_sifp_fetch_user_by_uid(sss_sifp_ctx *ctx,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina uid_t uid,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_object **_user)
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina{
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina uint64_t _uid = uid;
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina return sss_sifp_fetch_object_by_attr(ctx, IFP_PATH_USERS, IFACE_IFP_USERS,
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina IFACE_IFP_USERS_USER, "UserByID",
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina DBUS_TYPE_UINT64, &_uid, _user);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina}
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinasss_sifp_error
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březinasss_sifp_fetch_user_by_name(sss_sifp_ctx *ctx,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina const char *name,
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina sss_sifp_object **_user)
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina{
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina return sss_sifp_fetch_object_by_name(ctx, IFP_PATH_USERS, IFACE_IFP_USERS,
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina IFACE_IFP_USERS_USER, "UserByName",
2a45f13e3139063d3a5842119e7377c8c98aea1dPavel Březina name, _user);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina}