summaryrefslogtreecommitdiffstats
path: root/src/realmd/LMI_RealmdRealmProvider.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/realmd/LMI_RealmdRealmProvider.c')
-rw-r--r--src/realmd/LMI_RealmdRealmProvider.c326
1 files changed, 326 insertions, 0 deletions
diff --git a/src/realmd/LMI_RealmdRealmProvider.c b/src/realmd/LMI_RealmdRealmProvider.c
new file mode 100644
index 0000000..d8e0a18
--- /dev/null
+++ b/src/realmd/LMI_RealmdRealmProvider.c
@@ -0,0 +1,326 @@
+#include <konkret/konkret.h>
+#include <string.h>
+#include "LMI_RealmdRealm.h"
+#include "globals.h"
+#include "rdcp_error.h"
+#include "rdcp_dbus.h"
+#include "rdcp_util.h"
+#include "rdcp_realmdrealm.h"
+
+static const CMPIBroker* _cb = NULL;
+
+CMPIStatus LMI_RealmdRealmRef_InitFromDBusPath(
+ LMI_RealmdRealmRef* self,
+ const CMPIBroker* cb,
+ const char* ns,
+ const char* dbus_path)
+{
+ CMPIStatus status;
+
+ CMSetStatus(&status, CMPI_RC_OK);
+
+ LMI_RealmdRealmInitKeys(LMI_RealmdRealmRef, self, dbus_path);
+
+ return status;
+}
+
+CMPIStatus LMI_RealmdRealm_InitFromDBusPath(
+ LMI_RealmdRealm* self,
+ const CMPIBroker* cb,
+ const char* ns,
+ const char* dbus_path)
+{
+ CMPIStatus status;
+ GError *g_error = NULL;
+ GVariant *realm_props = NULL;
+
+ CMSetStatus(&status, CMPI_RC_OK);
+
+ if (!rdcp_dbus_initialize(&g_error)) {
+ return handle_g_error(&g_error, _cb, &status, CMPI_RC_ERR_FAILED, "rdcp_dbus_initialize failed");
+ }
+
+ GET_DBUS_PROPERIES_OR_EXIT(realm_props, dbus_path,
+ REALM_DBUS_REALM_INTERFACE, &status);
+
+ LMI_RealmdRealmInitKeys(LMI_RealmdRealm, self, dbus_path);
+ LMI_InitFromDBusRealmProps(LMI_RealmdRealm, self, realm_props);
+
+ exit:
+ G_VARIANT_FREE(realm_props);
+
+ return status;
+}
+
+static void LMI_RealmdRealmInitialize()
+{
+}
+
+static CMPIStatus LMI_RealmdRealmCleanup(
+ CMPIInstanceMI* mi,
+ const CMPIContext* cc,
+ CMPIBoolean term)
+{
+ CMReturn(CMPI_RC_OK);
+}
+
+static CMPIStatus LMI_RealmdRealmEnumInstanceNames(
+ CMPIInstanceMI* mi,
+ const CMPIContext* cc,
+ const CMPIResult* cr,
+ const CMPIObjectPath* cop)
+{
+ return KDefaultEnumerateInstanceNames(
+ _cb, mi, cc, cr, cop);
+}
+
+static CMPIStatus LMI_RealmdRealmEnumInstances(
+ CMPIInstanceMI* mi,
+ const CMPIContext* cc,
+ const CMPIResult* cr,
+ const CMPIObjectPath* cop,
+ const char** properties)
+{
+ CMPIStatus status;
+ GError *g_error = NULL;
+ GVariant *provider_props = NULL;
+ GVariantIter *iter = NULL;
+ gchar *realm_obj_path;
+ const char *name_space = KNameSpace(cop);
+
+ CMSetStatus(&status, CMPI_RC_OK);
+
+ if (!rdcp_dbus_initialize(&g_error)) {
+ return handle_g_error(&g_error, _cb, &status, CMPI_RC_ERR_FAILED, "rdcp_dbus_initialize failed");
+ }
+
+ GET_DBUS_PROPERIES_OR_EXIT(provider_props, REALM_DBUS_SERVICE_PATH,
+ REALM_DBUS_PROVIDER_INTERFACE, &status);
+
+ g_variant_lookup(provider_props, "Realms", "ao", &iter);
+ while (g_variant_iter_next(iter, "&o", &realm_obj_path)) {
+ LMI_RealmdRealm realmd_realm;
+
+ status = LMI_RealmdRealm_InitFromDBusPath(&realmd_realm, _cb,
+ name_space, realm_obj_path);
+ if (status.rc != CMPI_RC_OK) {
+ goto exit;
+ }
+ KReturnInstance(cr, realmd_realm);
+ }
+
+ exit:
+ G_VARIANT_ITER_FREE(iter);
+ G_VARIANT_FREE(provider_props);
+
+ return status;
+}
+
+static CMPIStatus LMI_RealmdRealmGetInstance(
+ CMPIInstanceMI* mi,
+ const CMPIContext* cc,
+ const CMPIResult* cr,
+ const CMPIObjectPath* cop,
+ const char** properties)
+{
+ CMPIStatus status;
+ GError *g_error = NULL;
+ LMI_RealmdRealmRef realmdrealm_ref;
+ gchar *dbus_path = NULL;
+ LMI_RealmdRealm realmd_realm;
+
+ CMSetStatus(&status, CMPI_RC_OK);
+
+ KReturnIf(LMI_RealmdRealmRef_InitFromObjectPath(&realmdrealm_ref, _cb, cop));
+
+ if (!dbus_path_from_instance_id(realmdrealm_ref.InstanceID.chars, &dbus_path, &g_error)) {
+ return handle_g_error(&g_error, _cb, &status, CMPI_RC_ERR_FAILED,
+ "dbus_path_from_instance_id() failed");
+ }
+
+ KReturnIf(LMI_RealmdRealm_InitFromDBusPath(&realmd_realm, _cb, KNameSpace(cop), dbus_path));
+
+ KReturnInstance(cr, realmd_realm);
+
+ return status;
+}
+
+static CMPIStatus LMI_RealmdRealmCreateInstance(
+ CMPIInstanceMI* mi,
+ const CMPIContext* cc,
+ const CMPIResult* cr,
+ const CMPIObjectPath* cop,
+ const CMPIInstance* ci)
+{
+ CMReturn(CMPI_RC_ERR_NOT_SUPPORTED);
+}
+
+static CMPIStatus LMI_RealmdRealmModifyInstance(
+ CMPIInstanceMI* mi,
+ const CMPIContext* cc,
+ const CMPIResult* cr,
+ const CMPIObjectPath* cop,
+ const CMPIInstance* ci,
+ const char** properties)
+{
+ CMReturn(CMPI_RC_ERR_NOT_SUPPORTED);
+}
+
+static CMPIStatus LMI_RealmdRealmDeleteInstance(
+ CMPIInstanceMI* mi,
+ const CMPIContext* cc,
+ const CMPIResult* cr,
+ const CMPIObjectPath* cop)
+{
+ CMReturn(CMPI_RC_ERR_NOT_SUPPORTED);
+}
+
+static CMPIStatus LMI_RealmdRealmExecQuery(
+ CMPIInstanceMI* mi,
+ const CMPIContext* cc,
+ const CMPIResult* cr,
+ const CMPIObjectPath* cop,
+ const char* lang,
+ const char* query)
+{
+ CMReturn(CMPI_RC_ERR_NOT_SUPPORTED);
+}
+
+CMInstanceMIStub(
+ LMI_RealmdRealm,
+ LMI_RealmdRealm,
+ _cb,
+ LMI_RealmdRealmInitialize())
+
+static CMPIStatus LMI_RealmdRealmMethodCleanup(
+ CMPIMethodMI* mi,
+ const CMPIContext* cc,
+ CMPIBoolean term)
+{
+ CMReturn(CMPI_RC_OK);
+}
+
+static CMPIStatus LMI_RealmdRealmInvokeMethod(
+ CMPIMethodMI* mi,
+ const CMPIContext* cc,
+ const CMPIResult* cr,
+ const CMPIObjectPath* cop,
+ const char* meth,
+ const CMPIArgs* in,
+ CMPIArgs* out)
+{
+ return LMI_RealmdRealm_DispatchMethod(
+ _cb, mi, cc, cr, cop, meth, in, out);
+}
+
+CMMethodMIStub(
+ LMI_RealmdRealm,
+ LMI_RealmdRealm,
+ _cb,
+ LMI_RealmdRealmInitialize())
+
+KUint32 LMI_RealmdRealm_ChangeLoginPolicy(
+ const CMPIBroker* cb,
+ CMPIMethodMI* mi,
+ const CMPIContext* context,
+ const LMI_RealmdRealmRef* self,
+ const KString* LoginPolicy,
+ const KStringA* PermittedAdd,
+ const KStringA* PermittedRemove,
+ CMPIStatus* status)
+{
+ GError *g_error = NULL;
+ KUint32 result = KUINT32_INIT;
+ gchar *dbus_path = NULL;
+ const gchar *login_policy = NULL;
+ GVariant *permitted_add = NULL;
+ GVariant *permitted_remove = NULL;
+ GVariant *options = NULL;
+
+ KUint32_Set(&result, LMI_REALMD_RESULT_SUCCESS);
+ CMSetStatus(status, CMPI_RC_OK);
+
+ if (!rdcp_dbus_initialize(&g_error)) {
+ handle_g_error(&g_error, _cb, status, CMPI_RC_ERR_FAILED, "rdcp_dbus_initialize failed");
+ KUint32_Set(&result, LMI_REALMD_RESULT_FAILED);
+ goto exit;
+ }
+
+ if (!LoginPolicy->exists || LoginPolicy->null) {
+ login_policy = "";
+ } else {
+ login_policy = LoginPolicy->chars;
+ }
+
+ if (!PermittedAdd->exists || PermittedAdd->null) {
+ CMSetStatusWithChars(cb, status, CMPI_RC_ERR_INVALID_PARAMETER, "PermittedAdd parameter absent");
+ KUint32_Set(&result, LMI_REALMD_RESULT_FAILED);
+ goto exit;
+ }
+
+ if (!PermittedRemove->exists || PermittedRemove->null) {
+ CMSetStatusWithChars(cb, status, CMPI_RC_ERR_INVALID_PARAMETER, "PermittedRemove parameter absent");
+ KUint32_Set(&result, LMI_REALMD_RESULT_FAILED);
+ goto exit;
+ }
+
+ if (!dbus_path_from_instance_id(self->InstanceID.chars, &dbus_path, &g_error)) {
+ handle_g_error(&g_error, cb, status, CMPI_RC_ERR_FAILED,
+ "dbus_path_from_instance_id() failed");
+ KUint32_Set(&result, LMI_REALMD_RESULT_FAILED);
+ goto exit;
+ }
+
+ if (!build_g_variant_string_array_from_KStringA(PermittedAdd, &permitted_add, &g_error)) {
+ handle_g_error(&g_error, cb, status, CMPI_RC_ERR_FAILED,
+ "failed to convert PermittedAdd to gvariant array");
+ KUint32_Set(&result, LMI_REALMD_RESULT_FAILED);
+ goto exit;
+ }
+
+ if (!build_g_variant_string_array_from_KStringA(PermittedRemove, &permitted_remove, &g_error)) {
+ handle_g_error(&g_error, cb, status, CMPI_RC_ERR_FAILED,
+ "failed to convert PermittedRemove to gvariant array");
+ KUint32_Set(&result, LMI_REALMD_RESULT_FAILED);
+ goto exit;
+ }
+
+ /* For now we don't pass any options so just create an empty dictionary */
+ options = g_variant_new_array(G_VARIANT_TYPE ("{sv}"), NULL, 0);
+
+ if (!dbus_change_login_policy_call(system_bus, dbus_path, login_policy,
+ permitted_add, permitted_remove,
+ options, &g_error)) {
+ handle_g_error(&g_error, cb, status, CMPI_RC_ERR_FAILED, "dbus_change_login_policy_call() failed");
+ KUint32_Set(&result, LMI_REALMD_RESULT_FAILED);
+ goto exit;
+ }
+
+
+ exit:
+
+ G_VARIANT_FREE(permitted_add);
+ G_VARIANT_FREE(permitted_remove);
+ G_VARIANT_FREE(options);
+
+ return result;
+}
+
+KUint32 LMI_RealmdRealm_Deconfigure(
+ const CMPIBroker* cb,
+ CMPIMethodMI* mi,
+ const CMPIContext* context,
+ const LMI_RealmdRealmRef* self,
+ CMPIStatus* status)
+{
+ KUint32 result = KUINT32_INIT;
+
+ KSetStatus(status, ERR_NOT_SUPPORTED);
+ return result;
+}
+
+KONKRET_REGISTRATION(
+ "root/cimv2",
+ "LMI_RealmdRealm",
+ "LMI_RealmdRealm",
+ "instance method");