Blame src/applet-device-bt.c

Packit Service 639700
// SPDX-License-Identifier: GPL-2.0+
Packit fabffb
/* NetworkManager Applet -- allow user control over networking
Packit fabffb
 *
Packit fabffb
 * Dan Williams <dcbw@redhat.com>
Packit fabffb
 *
Packit fabffb
 * Copyright 2008 - 2014 Red Hat, Inc.
Packit fabffb
 * Copyright 2008 Novell, Inc.
Packit fabffb
 */
Packit fabffb
Packit fabffb
#include "nm-default.h"
Packit fabffb
Packit fabffb
#include "applet.h"
Packit fabffb
#include "applet-device-bt.h"
Packit fabffb
#include "applet-dialogs.h"
Packit fabffb
Packit fabffb
static gboolean
Packit fabffb
bt_new_auto_connection (NMDevice *device,
Packit fabffb
                        gpointer dclass_data,
Packit fabffb
                        AppletNewAutoConnectionCallback callback,
Packit fabffb
                        gpointer callback_data)
Packit fabffb
{
Packit fabffb
Packit fabffb
	// FIXME: call gnome-bluetooth setup wizard
Packit fabffb
	return FALSE;
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
bt_add_menu_item (NMDevice *device,
Packit fabffb
                  gboolean multiple__devices,
Packit fabffb
                  const GPtrArray *connections,
Packit fabffb
                  NMConnection *active,
Packit fabffb
                  GtkWidget *menu,
Packit fabffb
                  NMApplet *applet)
Packit fabffb
{
Packit fabffb
	const char *text;
Packit fabffb
	GtkWidget *item;
Packit fabffb
Packit fabffb
	text = nm_device_bt_get_name (NM_DEVICE_BT (device));
Packit fabffb
	if (!text)
Packit fabffb
		text = nm_device_get_description (device);
Packit fabffb
Packit fabffb
	item = applet_menu_item_create_device_item_helper (device, applet, text);
Packit fabffb
Packit fabffb
	gtk_widget_set_sensitive (item, FALSE);
Packit fabffb
	gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
Packit fabffb
	gtk_widget_show (item);
Packit fabffb
Packit fabffb
	if (connections->len)
Packit fabffb
		applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_ACTIVE, menu, applet);
Packit fabffb
Packit fabffb
	/* Notify user of unmanaged or unavailable device */
Packit fabffb
	item = nma_menu_device_get_menu_item (device, applet, NULL);
Packit fabffb
	if (item) {
Packit fabffb
		gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
Packit fabffb
		gtk_widget_show (item);
Packit fabffb
	}
Packit fabffb
Packit fabffb
	if (!nma_menu_device_check_unusable (device)) {
Packit fabffb
		/* Add menu items for existing bluetooth connections for this device */
Packit fabffb
		if (connections->len) {
Packit fabffb
			applet_menu_item_add_complex_separator_helper (menu, applet, _("Available"));
Packit fabffb
			applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_INACTIVE, menu, applet);
Packit fabffb
		}
Packit fabffb
	}
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
bt_notify_connected (NMDevice *device,
Packit fabffb
                     const char *msg,
Packit fabffb
                     NMApplet *applet)
Packit fabffb
{
Packit fabffb
	applet_do_notify_with_pref (applet,
Packit fabffb
	                            _("Connection Established"),
Packit fabffb
	                            msg ? msg : _("You are now connected to the mobile broadband network."),
Packit fabffb
	                            "nm-device-wwan",
Packit fabffb
	                            PREF_DISABLE_CONNECTED_NOTIFICATIONS);
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
bt_get_icon (NMDevice *device,
Packit fabffb
             NMDeviceState state,
Packit fabffb
             NMConnection *connection,
Packit fabffb
             GdkPixbuf **out_pixbuf,
Packit fabffb
             const char **out_icon_name,
Packit fabffb
             char **tip,
Packit fabffb
             NMApplet *applet)
Packit fabffb
{
Packit fabffb
	NMSettingConnection *s_con;
Packit fabffb
	const char *id;
Packit fabffb
Packit fabffb
	g_return_if_fail (out_icon_name && !*out_icon_name);
Packit fabffb
	g_return_if_fail (tip && !*tip);
Packit fabffb
Packit fabffb
	id = nm_device_get_iface (NM_DEVICE (device));
Packit fabffb
	if (connection) {
Packit fabffb
		s_con = nm_connection_get_setting_connection (connection);
Packit fabffb
		id = nm_setting_connection_get_id (s_con);
Packit fabffb
	}
Packit fabffb
Packit fabffb
	switch (state) {
Packit fabffb
	case NM_DEVICE_STATE_PREPARE:
Packit fabffb
		*tip = g_strdup_printf (_("Preparing mobile broadband connection “%s”…"), id);
Packit fabffb
		break;
Packit fabffb
	case NM_DEVICE_STATE_CONFIG:
Packit fabffb
		*tip = g_strdup_printf (_("Configuring mobile broadband connection “%s”…"), id);
Packit fabffb
		break;
Packit fabffb
	case NM_DEVICE_STATE_NEED_AUTH:
Packit fabffb
		*tip = g_strdup_printf (_("User authentication required for mobile broadband connection “%s”…"), id);
Packit fabffb
		break;
Packit fabffb
	case NM_DEVICE_STATE_IP_CONFIG:
Packit fabffb
		*tip = g_strdup_printf (_("Requesting a network address for “%s”…"), id);
Packit fabffb
		break;
Packit fabffb
	case NM_DEVICE_STATE_ACTIVATED:
Packit fabffb
		*out_icon_name = "nm-device-wwan";
Packit fabffb
		*tip = g_strdup_printf (_("Mobile broadband connection “%s” active"), id);
Packit fabffb
		break;
Packit fabffb
	default:
Packit fabffb
		break;
Packit fabffb
	}
Packit fabffb
}
Packit fabffb
Packit fabffb
typedef struct {
Packit fabffb
	SecretsRequest req;
Packit fabffb
	GtkWidget *dialog;
Packit fabffb
	GtkEntry *secret_entry;
Packit fabffb
	char *secret_name;
Packit fabffb
} NMBtSecretsInfo;
Packit fabffb
Packit fabffb
static void
Packit fabffb
free_bt_secrets_info (SecretsRequest *req)
Packit fabffb
{
Packit fabffb
	NMBtSecretsInfo *info = (NMBtSecretsInfo *) req;
Packit fabffb
Packit fabffb
	if (info->dialog) {
Packit fabffb
		gtk_widget_hide (info->dialog);
Packit fabffb
		gtk_widget_destroy (info->dialog);
Packit fabffb
	}
Packit fabffb
	g_free (info->secret_name);
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
get_bt_secrets_cb (GtkDialog *dialog,
Packit fabffb
                   gint response,
Packit fabffb
                   gpointer user_data)
Packit fabffb
{
Packit fabffb
	SecretsRequest *req = user_data;
Packit fabffb
	NMBtSecretsInfo *info = (NMBtSecretsInfo *) req;
Packit fabffb
	NMSetting *setting;
Packit fabffb
	GError *error = NULL;
Packit fabffb
Packit fabffb
	if (response == GTK_RESPONSE_OK) {
Packit fabffb
		setting = nm_connection_get_setting_by_name (req->connection, req->setting_name);
Packit fabffb
		if (setting) {
Packit fabffb
			/* Normally we'd want to get all the settings's secrets and return those
Packit fabffb
			 * to NM too (since NM wants them), but since the only other secrets for 3G
Packit fabffb
			 * connections are PINs, and since the phone obviously has to be unlocked
Packit fabffb
			 * to even make the Bluetooth connection, we can skip doing that here for
Packit fabffb
			 * Bluetooth devices.
Packit fabffb
			 */
Packit fabffb
Packit fabffb
			/* Update the password */
Packit fabffb
			g_object_set (G_OBJECT (setting),
Packit fabffb
					      info->secret_name, gtk_entry_get_text (info->secret_entry),
Packit fabffb
					      NULL);
Packit fabffb
		} else {
Packit fabffb
			g_set_error (&error,
Packit fabffb
				         NM_SECRET_AGENT_ERROR,
Packit fabffb
				         NM_SECRET_AGENT_ERROR_FAILED,
Packit fabffb
				         "%s.%d (%s): unhandled setting '%s'",
Packit fabffb
				         __FILE__, __LINE__, __func__, req->setting_name);
Packit fabffb
		}
Packit fabffb
	} else {
Packit fabffb
		g_set_error (&error,
Packit fabffb
		             NM_SECRET_AGENT_ERROR,
Packit fabffb
		             NM_SECRET_AGENT_ERROR_FAILED,
Packit fabffb
		             "%s.%d (%s): canceled",
Packit fabffb
		             __FILE__, __LINE__, __func__);
Packit fabffb
	}
Packit fabffb
Packit fabffb
	applet_secrets_request_complete_setting (req, req->setting_name, error);
Packit fabffb
	applet_secrets_request_free (req);
Packit fabffb
	g_clear_error (&error);
Packit fabffb
}
Packit fabffb
Packit fabffb
static gboolean
Packit fabffb
bt_get_secrets (SecretsRequest *req, GError **error)
Packit fabffb
{
Packit fabffb
	NMBtSecretsInfo *info = (NMBtSecretsInfo *) req;
Packit fabffb
	GtkWidget *widget;
Packit fabffb
	GtkEntry *secret_entry = NULL;
Packit fabffb
Packit fabffb
	applet_secrets_request_set_free_func (req, free_bt_secrets_info);
Packit fabffb
Packit fabffb
	if (!req->hints || !g_strv_length (req->hints)) {
Packit fabffb
		g_set_error (error,
Packit fabffb
		             NM_SECRET_AGENT_ERROR,
Packit fabffb
		             NM_SECRET_AGENT_ERROR_FAILED,
Packit fabffb
		             "%s.%d (%s): missing secrets hints.",
Packit fabffb
		             __FILE__, __LINE__, __func__);
Packit fabffb
		return FALSE;
Packit fabffb
	}
Packit fabffb
	info->secret_name = g_strdup (req->hints[0]);
Packit fabffb
Packit fabffb
	if (   (!strcmp (req->setting_name, NM_SETTING_CDMA_SETTING_NAME) && !strcmp (info->secret_name, NM_SETTING_CDMA_PASSWORD))
Packit fabffb
	    || (!strcmp (req->setting_name, NM_SETTING_GSM_SETTING_NAME) && !strcmp (info->secret_name, NM_SETTING_GSM_PASSWORD)))
Packit fabffb
		widget = applet_mobile_password_dialog_new (req->connection, &secret_entry);
Packit fabffb
	else {
Packit fabffb
		g_set_error (error,
Packit fabffb
		             NM_SECRET_AGENT_ERROR,
Packit fabffb
		             NM_SECRET_AGENT_ERROR_FAILED,
Packit fabffb
		             "%s.%d (%s): unknown secrets hint '%s'.",
Packit fabffb
		             __FILE__, __LINE__, __func__, info->secret_name);
Packit fabffb
		return FALSE;
Packit fabffb
	}
Packit fabffb
	info->dialog = widget;
Packit fabffb
	info->secret_entry = secret_entry;
Packit fabffb
Packit fabffb
	if (!widget || !secret_entry) {
Packit fabffb
		g_set_error (error,
Packit fabffb
		             NM_SECRET_AGENT_ERROR,
Packit fabffb
		             NM_SECRET_AGENT_ERROR_FAILED,
Packit fabffb
		             "%s.%d (%s): error asking for CDMA secrets.",
Packit fabffb
		             __FILE__, __LINE__, __func__);
Packit fabffb
		return FALSE;
Packit fabffb
	}
Packit fabffb
Packit fabffb
	g_signal_connect (widget, "response", G_CALLBACK (get_bt_secrets_cb), info);
Packit fabffb
Packit fabffb
	gtk_window_set_position (GTK_WINDOW (widget), GTK_WIN_POS_CENTER_ALWAYS);
Packit fabffb
	gtk_widget_realize (GTK_WIDGET (widget));
Packit fabffb
	gtk_window_present (GTK_WINDOW (widget));
Packit fabffb
Packit fabffb
	return TRUE;
Packit fabffb
}
Packit fabffb
Packit fabffb
NMADeviceClass *
Packit fabffb
applet_device_bt_get_class (NMApplet *applet)
Packit fabffb
{
Packit fabffb
	NMADeviceClass *dclass;
Packit fabffb
Packit fabffb
	dclass = g_slice_new0 (NMADeviceClass);
Packit fabffb
	if (!dclass)
Packit fabffb
		return NULL;
Packit fabffb
Packit fabffb
	dclass->new_auto_connection = bt_new_auto_connection;
Packit fabffb
	dclass->add_menu_item = bt_add_menu_item;
Packit fabffb
	dclass->notify_connected = bt_notify_connected;
Packit fabffb
	dclass->get_icon = bt_get_icon;
Packit fabffb
	dclass->get_secrets = bt_get_secrets;
Packit fabffb
	dclass->secrets_request_size = sizeof (NMBtSecretsInfo);
Packit fabffb
Packit fabffb
	return dclass;
Packit fabffb
}