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.c196
1 files changed, 196 insertions, 0 deletions
diff --git a/src/sssd/sssd_domains.c b/src/sssd/sssd_domains.c
new file mode 100644
index 0000000..be9481c
--- /dev/null
+++ b/src/sssd/sssd_domains.c
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Pavel Březina <pbrezina@redhat.com>
+ */
+
+#include <konkret/konkret.h>
+#include <sss_sifp_dbus.h>
+#include <dbus/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;
+ bool enumerable;
+ bool use_fqn;
+ bool subdomain;
+ const char *parent_domain;
+};
+
+static sssd_method_error
+sssd_domain_get_attrs(sss_sifp_attr **attrs,
+ const char *path,
+ struct sssd_domain_attrs *out)
+{
+ sss_sifp_error error;
+ sssd_method_error ret;
+
+ error = sss_sifp_find_attr_as_string(attrs, "name", &out->name);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_sifp_find_attr_as_string(attrs, "provider", &out->provider);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_sifp_find_attr_as_uint32(attrs, "min_id", &out->min_id);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_sifp_find_attr_as_uint32(attrs, "max_id", &out->max_id);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_sifp_find_attr_as_string(attrs, "realm", &out->realm);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_sifp_find_attr_as_string(attrs, "forest", &out->forest);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_sifp_find_attr_as_string(attrs, "login_format",
+ &out->login_format);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_sifp_find_attr_as_string(attrs, "fully_qualified_name_format",
+ &out->fqn_format);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_sifp_find_attr_as_bool(attrs, "enumerable", &out->enumerable);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_sifp_find_attr_as_bool(attrs, "use_fully_qualified_names",
+ &out->use_fqn);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_sifp_find_attr_as_bool(attrs, "subdomain", &out->subdomain);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ error = sss_sifp_find_attr_as_string(attrs, "parent_domain",
+ &out->parent_domain);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ /* server list may be empty */
+ error = sss_sifp_find_attr_as_string_array(attrs, "primary_servers",
+ &out->num_primary, &out->primary_servers);
+ if (error == SSS_SIFP_ATTR_NULL) {
+ out->num_primary = 0;
+ out->primary_servers = NULL;
+ } else if (error != SSS_SIFP_OK) {
+ ret = SSSD_METHOD_ERROR_FAILED;
+ goto done;
+ }
+
+ error = sss_sifp_find_attr_as_string_array(attrs, "backup_servers",
+ &out->num_backup, &out->backup_servers);
+ if (error == SSS_SIFP_ATTR_NULL) {
+ out->num_backup = 0;
+ out->backup_servers = NULL;
+ } else if (error != SSS_SIFP_OK) {
+ ret = SSSD_METHOD_ERROR_FAILED;
+ goto done;
+ }
+
+ ret = SSSD_METHOD_ERROR_OK;
+
+done:
+ return ret;
+}
+
+sssd_method_error
+sssd_domain_set_instance(sss_sifp_ctx *sifp_ctx,
+ const char *path,
+ const CMPIBroker* cb,
+ const char *namespace,
+ LMI_SSSDDomain *instance)
+{
+ sss_sifp_attr **attrs = NULL;
+ sss_sifp_attr **parent = NULL;
+ sss_sifp_error error;
+ struct sssd_domain_attrs values;
+ sssd_method_error ret;
+ int i;
+
+ error = sss_sifp_fetch_all_attrs(sifp_ctx, path,
+ SSS_SIFP_IFACE_DOMAINS, &attrs);
+ check_sss_sifp_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_sifp_fetch_attr(sifp_ctx, values.parent_domain,
+ SSS_SIFP_IFACE_DOMAINS, "name", &parent);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_IO, done);
+
+ error = sss_sifp_find_attr_as_string(parent, "name",
+ &values.parent_domain);
+ check_sss_sifp_error(error, ret, SSSD_METHOD_ERROR_FAILED, done);
+
+ LMI_SSSDDomain_Set_ParentDomain(instance, values.parent_domain);
+ }
+
+ ret = SSSD_METHOD_ERROR_OK;
+
+done:
+ sss_sifp_free_attrs(sifp_ctx, &attrs);
+ sss_sifp_free_attrs(sifp_ctx, &parent);
+ return ret;
+}