|
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 |
}
|