static gboolean handle_lock (CockpitStorageBlock *object, GDBusMethodInvocation *invocation) { StorageBlock *block = STORAGE_BLOCK(object); GError *error = NULL; if (!auth_check_sender_role (invocation, COCKPIT_ROLE_STORAGE_ADMIN)) return TRUE; UDisksObject *udisks_object = (UDisksObject *) g_dbus_interface_get_object(G_DBUS_INTERFACE (block->udisks_block)); if (udisks_object == NULL) { g_dbus_method_invocation_return_error (invocation, COCKPIT_ERROR, COCKPIT_ERROR_FAILED, "No object!?"); g_error_free (error); return TRUE; } UDisksEncrypted *enc = udisks_object_peek_encrypted (udisks_object); if (enc == NULL) { g_dbus_method_invocation_return_error (invocation, COCKPIT_ERROR, COCKPIT_ERROR_FAILED, "Block device is not encrypted"); g_error_free (error); return TRUE; } if (!udisks_encrypted_call_lock_sync (enc, g_variant_new ("a{sv}", NULL), NULL, &error)) { g_dbus_error_strip_remote_error (error); g_dbus_method_invocation_return_error (invocation, COCKPIT_ERROR, COCKPIT_ERROR_FAILED, "%s", error->message); g_error_free (error); return TRUE; } cockpit_storage_block_complete_lock (object, invocation); return TRUE; }
static gboolean cleanup_block_walker (UDisksClient *client, UDisksBlock *block, gboolean is_leaf, gpointer user_data, GError **error) { StorageProvider *provider = user_data; UDisksObject *object = UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (block))); UDisksEncrypted *enc = udisks_object_peek_encrypted (object); if (enc) { UDisksBlock *cleartext = udisks_client_get_cleartext_block (client, block); if (cleartext) { /* The crypto backing device is unlocked and the cleartext device has been cleaned up. Lock the backing device so that we can format or wipe it later. */ if (enc && !udisks_encrypted_call_lock_sync (enc, g_variant_new ("a{sv}", NULL), NULL, error)) return FALSE; } else { /* The crypto backing device is locked and the cleartext device has not been cleaned up (since it doesn't exist). Remove its remembered configs. */ GList *remembered_configs = storage_provider_get_and_forget_remembered_configs (provider, g_dbus_object_get_object_path (G_DBUS_OBJECT (object))); for (GList *l = remembered_configs; l; l = l->next) { GVariant *config = l->data; storage_remove_config (provider, block, config); } g_list_free_full (remembered_configs, (GDestroyNotify)g_variant_unref); } } storage_remove_config (provider, block, udisks_block_get_configuration (block)); return TRUE; }