summaryrefslogtreecommitdiffstats
path: root/src/sssd/sssd_domains.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sssd/sssd_domains.c')
-rw-r--r--src/sssd/sssd_domains.c183
1 files changed, 183 insertions, 0 deletions
diff --git a/src/sssd/sssd_domains.c b/src/sssd/sssd_domains.c
new file mode 100644
index 0000000..b60ca0c
--- /dev/null
+++ b/src/sssd/sssd_domains.c
@@ -0,0 +1,183 @@
+/*
+ Authors:
+ Pavel Březina <pbrezina@redhat.com>
+
+ Copyright (C) 2014 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 <konkret/konkret.h>
+#include <dbus/dbus.h>
+#include <sss_dbus.h>
+#include "sssd_domains.h"
+#include "utils.h"
+
+struct sssd_domain_attrs {
+ const char *name;
+ const char *provider;
+ const char * const *primary_servers;
+ unsigned int num_primary;
+ const char * const *backup_servers;
+ unsigned int num_backup;
+ uint32_t min_id;
+ uint32_t max_id;
+ const char *realm;
+ const char *forest;
+ const char *login_format;
+ const char *fqn_format;
+ sss_dbus_bool enumerable;
+ sss_dbus_bool use_fqn;
+ sss_dbus_bool subdomain;
+ const char *parent_domain;
+};
+
+static sssd_method_error
+sssd_domain_get_attrs(sss_dbus_attr **attrs,
+ const char *path,
+ struct sssd_domain_attrs *out)
+{
+ sss_dbus_error error;
+ sssd_method_error ret;
+
+ error = sss_dbus_find_attr_as_string(attrs, "name", &out->name);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_string(attrs, "provider", &out->provider);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_string_array(attrs, "primary_servers",
+ &out->num_primary, &out->primary_servers);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_string_array(attrs, "backup_servers",
+ &out->num_backup, &out->backup_servers);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_uint32(attrs, "min_id", &out->min_id);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_uint32(attrs, "max_id", &out->max_id);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_string(attrs, "realm", &out->realm);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_string(attrs, "forest", &out->forest);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_string(attrs, "login_format",
+ &out->login_format);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_string(attrs, "fully_qualified_name_format",
+ &out->fqn_format);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_bool(attrs, "enumerable", &out->enumerable);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_bool(attrs, "use_fully_qualified_names",
+ &out->use_fqn);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_bool(attrs, "subdomain", &out->subdomain);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_string(attrs, "parent_domain",
+ &out->parent_domain);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ ret = SSSD_METHOD_ERROR_OK;
+
+done:
+ return ret;
+}
+
+sssd_method_error
+sssd_domain_set_instance(sss_dbus_ctx *dbus_ctx,
+ const char *path,
+ const CMPIBroker* cb,
+ const char *namespace,
+ LMI_SSSDDomain *instance)
+{
+ sss_dbus_attr **attrs = NULL;
+ sss_dbus_attr **parent = NULL;
+ sss_dbus_error error;
+ struct sssd_domain_attrs values;
+ sssd_method_error ret;
+ int i;
+
+ error = sss_dbus_fetch_all_attrs(dbus_ctx, path,
+ SSS_DBUS_IFACE_DOMAINS, &attrs);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_IO, done);
+
+ ret = sssd_domain_get_attrs(attrs, path, &values);
+ if (ret != SSSD_METHOD_ERROR_OK) {
+ goto done;
+ }
+
+ LMI_SSSDDomain_Init(instance, cb, namespace);
+
+ /* CIM_ManagedElement */
+ LMI_SSSDDomain_Set_Caption(instance, "SSSD Domain");
+ LMI_SSSDDomain_Set_Description(instance, "SSSD Domain");
+ LMI_SSSDDomain_Set_ElementName(instance, values.name);
+
+ /* LMI_SSSDDomain */
+ LMI_SSSDDomain_Set_Name(instance, values.name);
+ LMI_SSSDDomain_Set_Provider(instance, values.provider);
+ LMI_SSSDDomain_Set_MinId(instance, values.min_id);
+ LMI_SSSDDomain_Set_MaxId(instance, values.max_id);
+ LMI_SSSDDomain_Set_Realm(instance, values.realm);
+ LMI_SSSDDomain_Set_Forest(instance, values.forest);
+ LMI_SSSDDomain_Set_LoginFormat(instance, values.login_format);
+ LMI_SSSDDomain_Set_FullyQualifiedNameFormat(instance, values.fqn_format);
+ LMI_SSSDDomain_Set_Enumerate(instance, values.enumerable);
+ LMI_SSSDDomain_Set_UseFullyQualifiedNames(instance, values.use_fqn);
+ LMI_SSSDDomain_Set_IsSubdomain(instance, values.subdomain);
+
+ LMI_SSSDDomain_Init_PrimaryServers(instance, values.num_primary);
+ for (i = 0; i < values.num_primary; i++) {
+ LMI_SSSDDomain_Set_PrimaryServers(instance, i,
+ values.primary_servers[i]);
+ }
+
+ LMI_SSSDDomain_Init_BackupServers(instance, values.num_backup);
+ for (i = 0; i < values.num_backup; i++) {
+ LMI_SSSDDomain_Set_BackupServers(instance, i,
+ values.backup_servers[i]);
+ }
+
+ if (strcmp(values.parent_domain, "/") == 0) {
+ LMI_SSSDDomain_Null_ParentDomain(instance);
+ } else {
+ error = sss_dbus_fetch_attr(dbus_ctx, values.parent_domain,
+ SSS_DBUS_IFACE_DOMAINS, "name", &parent);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_IO, done);
+
+ error = sss_dbus_find_attr_as_string(parent, "name",
+ &values.parent_domain);
+ check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ LMI_SSSDDomain_Set_ParentDomain(instance, values.parent_domain);
+ }
+
+ ret = SSSD_METHOD_ERROR_OK;
+
+done:
+ sss_dbus_free_attrs(dbus_ctx, &attrs);
+ sss_dbus_free_attrs(dbus_ctx, &parent);
+ return ret;
+}