diff options
Diffstat (limited to 'src/realmd/LMI_RealmdRealmProvider.c')
-rw-r--r-- | src/realmd/LMI_RealmdRealmProvider.c | 326 |
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"); |