static void gkd_secret_service_dispose (GObject *obj) { GkdSecretService *self = GKD_SECRET_SERVICE (obj); if (self->name_owner_id) { g_dbus_connection_signal_unsubscribe (self->connection, self->name_owner_id); self->name_owner_id = 0; } if (self->filter_id) { g_dbus_connection_remove_filter (self->connection, self->filter_id); self->filter_id = 0; } /* Closes all the clients */ g_hash_table_remove_all (self->clients); /* Hide all the objects */ if (self->objects) { g_object_run_dispose (G_OBJECT (self->objects)); g_object_unref (self->objects); self->objects = NULL; } g_clear_object (&self->connection); if (self->internal_session) { dispose_and_unref (self->internal_session); self->internal_session = NULL; } G_OBJECT_CLASS (gkd_secret_service_parent_class)->dispose (obj); }
static void gkd_secret_service_dispose (GObject *obj) { GkdSecretService *self = GKD_SECRET_SERVICE (obj); if (self->match_rule) { g_return_if_fail (self->connection); dbus_bus_remove_match (self->connection, self->match_rule, NULL); g_free (self->match_rule); self->match_rule = NULL; } /* Closes all the clients */ g_hash_table_remove_all (self->clients); /* Hide all the objects */ if (self->objects) { g_object_run_dispose (G_OBJECT (self->objects)); g_object_unref (self->objects); self->objects = NULL; } if (self->connection) { dbus_connection_remove_filter (self->connection, gkd_secret_service_filter_handler, self); dbus_connection_unref (self->connection); self->connection = NULL; } G_OBJECT_CLASS (gkd_secret_service_parent_class)->dispose (obj); }
static void gkd_secret_service_finalize (GObject *obj) { GkdSecretService *self = GKD_SECRET_SERVICE (obj); g_assert (g_hash_table_size (self->clients) == 0); g_hash_table_destroy (self->clients); self->clients = NULL; G_OBJECT_CLASS (gkd_secret_service_parent_class)->finalize (obj); }
static void gkd_secret_service_get_property (GObject *obj, guint prop_id, GValue *value, GParamSpec *pspec) { GkdSecretService *self = GKD_SECRET_SERVICE (obj); switch (prop_id) { case PROP_CONNECTION: g_value_set_object (value, gkd_secret_service_get_connection (self)); break; case PROP_PKCS11_SLOT: g_value_set_object (value, gkd_secret_service_get_pkcs11_slot (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); break; } }
static void gkd_secret_service_set_property (GObject *obj, guint prop_id, const GValue *value, GParamSpec *pspec) { GkdSecretService *self = GKD_SECRET_SERVICE (obj); switch (prop_id) { case PROP_CONNECTION: g_return_if_fail (!self->connection); self->connection = g_value_dup_object (value); g_return_if_fail (self->connection); break; case PROP_PKCS11_SLOT: g_return_if_fail (!self->objects); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); break; } }
static GObject* gkd_secret_service_constructor (GType type, guint n_props, GObjectConstructParam *props) { GkdSecretService *self = GKD_SECRET_SERVICE (G_OBJECT_CLASS (gkd_secret_service_parent_class)->constructor(type, n_props, props)); DBusError error = DBUS_ERROR_INIT; GckSlot *slot = NULL; guint i; g_return_val_if_fail (self, NULL); g_return_val_if_fail (self->connection, NULL); /* Find the pkcs11-slot parameter */ for (i = 0; !slot && i < n_props; ++i) { if (g_str_equal (props[i].pspec->name, "pkcs11-slot")) slot = g_value_get_object (props[i].value); } /* Create our objects proxy */ g_return_val_if_fail (GCK_IS_SLOT (slot), NULL); self->objects = g_object_new (GKD_SECRET_TYPE_OBJECTS, "pkcs11-slot", slot, "service", self, NULL); /* Register for signals that let us know when clients leave the bus */ self->match_rule = g_strdup_printf ("type='signal',member=NameOwnerChanged," "interface='" DBUS_INTERFACE_DBUS "'"); dbus_bus_add_match (self->connection, self->match_rule, &error); if (dbus_error_is_set (&error)) { g_warning ("couldn't listen for NameOwnerChanged signal on session bus: %s", error.message); dbus_error_free (&error); g_free (self->match_rule); self->match_rule = NULL; } if (!dbus_connection_add_filter (self->connection, gkd_secret_service_filter_handler, self, NULL)) g_return_val_if_reached (NULL); return G_OBJECT (self); }
static GObject* gkd_secret_service_constructor (GType type, guint n_props, GObjectConstructParam *props) { GkdSecretService *self = GKD_SECRET_SERVICE (G_OBJECT_CLASS (gkd_secret_service_parent_class)->constructor(type, n_props, props)); GError *error = NULL; GckSlot *slot = NULL; guint i; g_return_val_if_fail (self, NULL); g_return_val_if_fail (self->connection, NULL); /* Find the pkcs11-slot parameter */ for (i = 0; !slot && i < n_props; ++i) { if (g_str_equal (props[i].pspec->name, "pkcs11-slot")) slot = g_value_get_object (props[i].value); } /* Create our objects proxy */ g_return_val_if_fail (GCK_IS_SLOT (slot), NULL); self->objects = g_object_new (GKD_SECRET_TYPE_OBJECTS, "pkcs11-slot", slot, "service", self, NULL); self->skeleton = gkd_secret_service_skeleton_new (self); g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (self->skeleton), self->connection, SECRET_SERVICE_PATH, &error); if (error != NULL) { g_warning ("could not register secret service on session bus: %s", error->message); g_clear_error (&error); } g_signal_connect (self->skeleton, "handle-change-lock", G_CALLBACK (service_method_change_lock), self); g_signal_connect (self->skeleton, "handle-create-collection", G_CALLBACK (service_method_create_collection), self); g_signal_connect (self->skeleton, "handle-get-secrets", G_CALLBACK (service_method_get_secrets), self); g_signal_connect (self->skeleton, "handle-lock", G_CALLBACK (service_method_lock), self); g_signal_connect (self->skeleton, "handle-lock-service", G_CALLBACK (service_method_lock_service), self); g_signal_connect (self->skeleton, "handle-open-session", G_CALLBACK (service_method_open_session), self); g_signal_connect (self->skeleton, "handle-read-alias", G_CALLBACK (service_method_read_alias), self); g_signal_connect (self->skeleton, "handle-search-items", G_CALLBACK (service_method_search_items), self); g_signal_connect (self->skeleton, "handle-set-alias", G_CALLBACK (service_method_set_alias), self); g_signal_connect (self->skeleton, "handle-unlock", G_CALLBACK (service_method_unlock), self); self->internal_skeleton = gkd_exported_internal_skeleton_new (); g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (self->internal_skeleton), self->connection, SECRET_SERVICE_PATH, &error); if (error != NULL) { g_warning ("could not register internal interface service on session bus: %s", error->message); g_clear_error (&error); } g_signal_connect (self->internal_skeleton, "handle-change-with-master-password", G_CALLBACK (service_method_change_with_master_password), self); g_signal_connect (self->internal_skeleton, "handle-change-with-prompt", G_CALLBACK (service_method_change_with_prompt), self); g_signal_connect (self->internal_skeleton, "handle-create-with-master-password", G_CALLBACK (service_method_create_with_master_password), self); g_signal_connect (self->internal_skeleton, "handle-unlock-with-master-password", G_CALLBACK (service_method_unlock_with_master_password), self); self->name_owner_id = g_dbus_connection_signal_subscribe (self->connection, NULL, "org.freedesktop.DBus", "NameOwnerChanged", NULL, NULL, G_DBUS_SIGNAL_FLAGS_NONE, service_name_owner_changed, self, NULL); self->filter_id = g_dbus_connection_add_filter (self->connection, service_message_filter, self, NULL); gkd_secret_service_init_collections (self); return G_OBJECT (self); }