コード例 #1
0
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);
}
コード例 #2
0
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);
}
コード例 #3
0
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);
}
コード例 #4
0
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;
	}
}
コード例 #5
0
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;
	}
}
コード例 #6
0
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);
}
コード例 #7
0
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);
}