Exemplo n.º 1
0
gboolean
gkd_dbus_secrets_startup (void)
{
	DBusError error = DBUS_ERROR_INIT;
	dbus_uint32_t result = 0;
	const gchar *service = NULL;
	unsigned int flags = 0;
	GckSlot *slot;

	g_return_val_if_fail (dbus_conn, FALSE);

#ifdef WITH_TESTS
	service = g_getenv ("MATE_KEYRING_TEST_SERVICE");
	if (service && service[0])
		flags = DBUS_NAME_FLAG_ALLOW_REPLACEMENT | DBUS_NAME_FLAG_REPLACE_EXISTING;
	else
#endif
		service = SECRET_SERVICE;

	/* Figure out which slot to use */
	slot = calculate_secrets_slot ();
	g_return_val_if_fail (slot, FALSE);

	/* Try and grab our name */
	result = dbus_bus_request_name (dbus_conn, service, flags, &error);
	if (dbus_error_is_set (&error)) {
		g_message ("couldn't request name '%s' on session bus: %s",
		           service, error.message);
		dbus_error_free (&error);

	} else {
		switch (result) {

		/* We acquired the service name */
		case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER:
			break;

		/* We already acquired the service name. */
		case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER:
			break;

		/* Another daemon is running */
		case DBUS_REQUEST_NAME_REPLY_IN_QUEUE:
		case DBUS_REQUEST_NAME_REPLY_EXISTS:
			g_message ("another secret service is running");
			break;

		default:
			g_return_val_if_reached (FALSE);
			break;
		};
	}

	g_return_val_if_fail (!secrets_service, FALSE);
	secrets_service = g_object_new (GKD_SECRET_TYPE_SERVICE,
	                                "connection", dbus_conn, "pkcs11-slot", slot, NULL);

	g_object_unref (slot);
	return TRUE;
}
Exemplo n.º 2
0
gboolean
gkd_dbus_secrets_startup (void)
{
	const gchar *service = NULL;
	unsigned int flags = 0;
	GckSlot *slot;
	GError *error = NULL;
	GVariant *request_variant;
	guint res;

	g_return_val_if_fail (dbus_conn, FALSE);
	g_return_val_if_fail (!secrets_service, FALSE);

#ifdef WITH_DEBUG
	service = g_getenv ("GNOME_KEYRING_TEST_SERVICE");
	if (service && service[0])
		flags = G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT | G_BUS_NAME_OWNER_FLAGS_REPLACE;
	else
#endif
		service = SECRET_SERVICE;

	/* Figure out which slot to use */
	slot = calculate_secrets_slot ();
	g_return_val_if_fail (slot, FALSE);
	secrets_service = g_object_new (GKD_SECRET_TYPE_SERVICE,
					"connection", dbus_conn, "pkcs11-slot", slot, NULL);
	g_object_unref (slot);

	/* Try and grab our name */
	request_variant = g_dbus_connection_call_sync (dbus_conn,
						       "org.freedesktop.DBus",  /* bus name */
						       "/org/freedesktop/DBus", /* object path */
						       "org.freedesktop.DBus",  /* interface name */
						       "RequestName",           /* method name */
						       g_variant_new ("(su)",
								      service,
								      flags),
						       G_VARIANT_TYPE ("(u)"),
						       G_DBUS_CALL_FLAGS_NONE,
						       -1, NULL, &error);

	if (error != NULL) {
		g_message ("couldn't request name '%s' on session bus: %s",
			   service, error->message);
		g_error_free (error);
	} else {
		g_variant_get (request_variant, "(u)", &res);
		g_variant_unref (request_variant);

		switch (res) {
		/* We acquired the service name */
		case 1: /* DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER */
		/* We already acquired the service name. */
		case 4: /* DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER */
			break;
		/* Another daemon is running */
		case 2: /* DBUS_REQUEST_NAME_REPLY_IN_QUEUE */
		case 3: /* DBUS_REQUEST_NAME_REPLY_EXISTS */
			g_message ("another secret service is running");
			break;
		default:
			g_clear_object (&secrets_service);
			g_return_val_if_reached (FALSE);
			break;
		};
	}

	return TRUE;
}