mirror of
https://gitlab.gnome.org/GNOME/calls.git
synced 2024-11-04 15:41:19 +00:00
sip: account-widget: Add media encryption option
This option can only be set when the transport protocol is set to TLS or the "always-allow-sdes" gsetting is used.
This commit is contained in:
parent
30148cebe3
commit
aeae044534
2 changed files with 116 additions and 15 deletions
|
@ -24,9 +24,13 @@
|
||||||
|
|
||||||
#define G_LOG_DOMAIN "CallsSipAccountWidget"
|
#define G_LOG_DOMAIN "CallsSipAccountWidget"
|
||||||
|
|
||||||
|
#include "calls-settings.h"
|
||||||
#include "calls-sip-account-widget.h"
|
#include "calls-sip-account-widget.h"
|
||||||
#include "calls-sip-provider.h"
|
#include "calls-sip-provider.h"
|
||||||
#include "calls-sip-origin.h"
|
#include "calls-sip-origin.h"
|
||||||
|
#include "calls-sip-util.h"
|
||||||
|
|
||||||
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Section:calls-sip-account-widget
|
* Section:calls-sip-account-widget
|
||||||
|
@ -67,6 +71,8 @@ struct _CallsSipAccountWidget {
|
||||||
char *last_port;
|
char *last_port;
|
||||||
HdyComboRow *protocol;
|
HdyComboRow *protocol;
|
||||||
GListStore *protocols_store; /* bound model for protocol HdyComboRow */
|
GListStore *protocols_store; /* bound model for protocol HdyComboRow */
|
||||||
|
HdyComboRow *media_encryption;
|
||||||
|
GListStore *media_encryption_store;
|
||||||
GtkSwitch *tel_switch;
|
GtkSwitch *tel_switch;
|
||||||
GtkSwitch *auto_connect_switch;
|
GtkSwitch *auto_connect_switch;
|
||||||
|
|
||||||
|
@ -76,6 +82,7 @@ struct _CallsSipAccountWidget {
|
||||||
CallsSipOrigin *origin; /* nullable to add a new account */
|
CallsSipOrigin *origin; /* nullable to add a new account */
|
||||||
|
|
||||||
/* misc */
|
/* misc */
|
||||||
|
CallsSettings *settings;
|
||||||
gboolean connecting;
|
gboolean connecting;
|
||||||
gboolean port_self_change;
|
gboolean port_self_change;
|
||||||
};
|
};
|
||||||
|
@ -104,6 +111,39 @@ is_form_filled (CallsSipAccountWidget *self)
|
||||||
g_strcmp0 (gtk_entry_get_text (self->port), "") != 0;
|
g_strcmp0 (gtk_entry_get_text (self->port), "") != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
get_selected_protocol (CallsSipAccountWidget *self)
|
||||||
|
{
|
||||||
|
g_autoptr (HdyValueObject) obj = NULL;
|
||||||
|
const char *protocol = NULL;
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
if ((i = hdy_combo_row_get_selected_index (self->protocol)) != -1) {
|
||||||
|
obj = g_list_model_get_item (G_LIST_MODEL (self->protocols_store), i);
|
||||||
|
protocol = hdy_value_object_get_string (obj);
|
||||||
|
}
|
||||||
|
return protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_media_encryption (CallsSipAccountWidget *self)
|
||||||
|
{
|
||||||
|
gboolean transport_is_tls;
|
||||||
|
gboolean sdes_always_allowed;
|
||||||
|
|
||||||
|
g_assert (CALLS_IS_SIP_ACCOUNT_WIDGET (self));
|
||||||
|
|
||||||
|
transport_is_tls = g_strcmp0 (get_selected_protocol (self), "TLS") == 0;
|
||||||
|
sdes_always_allowed = calls_settings_get_always_allow_sdes (self->settings);
|
||||||
|
|
||||||
|
gtk_widget_set_sensitive (GTK_WIDGET (self->media_encryption),
|
||||||
|
transport_is_tls | sdes_always_allowed);
|
||||||
|
|
||||||
|
if (!transport_is_tls && !sdes_always_allowed)
|
||||||
|
hdy_combo_row_set_selected_index (self->media_encryption, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_user_changed (CallsSipAccountWidget *self)
|
on_user_changed (CallsSipAccountWidget *self)
|
||||||
|
@ -117,6 +157,8 @@ on_user_changed (CallsSipAccountWidget *self)
|
||||||
gtk_widget_set_sensitive (self->apply_btn,
|
gtk_widget_set_sensitive (self->apply_btn,
|
||||||
is_form_filled (self) &&
|
is_form_filled (self) &&
|
||||||
is_form_valid (self));
|
is_form_valid (self));
|
||||||
|
|
||||||
|
update_media_encryption (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -292,6 +334,35 @@ find_protocol (CallsSipAccountWidget *self,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
find_media_encryption (CallsSipAccountWidget *self,
|
||||||
|
const SipMediaEncryption encryption,
|
||||||
|
guint *index)
|
||||||
|
{
|
||||||
|
guint len;
|
||||||
|
|
||||||
|
g_assert (CALLS_IS_SIP_ACCOUNT_WIDGET (self));
|
||||||
|
|
||||||
|
len = g_list_model_get_n_items (G_LIST_MODEL (self->media_encryption_store));
|
||||||
|
|
||||||
|
for (guint i = 0; i < len; i++) {
|
||||||
|
g_autoptr (HdyValueObject) obj =
|
||||||
|
g_list_model_get_item (G_LIST_MODEL (self->media_encryption_store), i);
|
||||||
|
SipMediaEncryption obj_enc =
|
||||||
|
(SipMediaEncryption) GPOINTER_TO_INT (g_object_get_data (G_OBJECT (obj), "value"));
|
||||||
|
|
||||||
|
if (obj_enc == encryption) {
|
||||||
|
if (index)
|
||||||
|
*index = i;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_warning ("Could not find encryption mode %d", encryption);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clear_form (CallsSipAccountWidget *self)
|
clear_form (CallsSipAccountWidget *self)
|
||||||
{
|
{
|
||||||
|
@ -303,6 +374,8 @@ clear_form (CallsSipAccountWidget *self)
|
||||||
gtk_entry_set_text (self->password, "");
|
gtk_entry_set_text (self->password, "");
|
||||||
gtk_entry_set_text (self->port, "0");
|
gtk_entry_set_text (self->port, "0");
|
||||||
hdy_combo_row_set_selected_index (self->protocol, 0);
|
hdy_combo_row_set_selected_index (self->protocol, 0);
|
||||||
|
gtk_widget_set_sensitive (GTK_WIDGET (self->media_encryption), FALSE);
|
||||||
|
hdy_combo_row_set_selected_index (self->media_encryption, 0);
|
||||||
gtk_switch_set_state (self->tel_switch, FALSE);
|
gtk_switch_set_state (self->tel_switch, FALSE);
|
||||||
gtk_switch_set_state (self->auto_connect_switch, TRUE);
|
gtk_switch_set_state (self->auto_connect_switch, TRUE);
|
||||||
|
|
||||||
|
@ -326,6 +399,8 @@ edit_form (CallsSipAccountWidget *self,
|
||||||
g_autofree char *port_str = NULL;
|
g_autofree char *port_str = NULL;
|
||||||
g_autofree char *protocol = NULL;
|
g_autofree char *protocol = NULL;
|
||||||
gint port;
|
gint port;
|
||||||
|
SipMediaEncryption encryption;
|
||||||
|
guint encryption_index;
|
||||||
guint protocol_index;
|
guint protocol_index;
|
||||||
gboolean can_tel;
|
gboolean can_tel;
|
||||||
gboolean auto_connect;
|
gboolean auto_connect;
|
||||||
|
@ -348,6 +423,7 @@ edit_form (CallsSipAccountWidget *self,
|
||||||
"password", &password,
|
"password", &password,
|
||||||
"port", &port,
|
"port", &port,
|
||||||
"transport-protocol", &protocol,
|
"transport-protocol", &protocol,
|
||||||
|
"media-encryption", &encryption,
|
||||||
"can-tel", &can_tel,
|
"can-tel", &can_tel,
|
||||||
"auto-connect", &auto_connect,
|
"auto-connect", &auto_connect,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -361,6 +437,9 @@ edit_form (CallsSipAccountWidget *self,
|
||||||
if (!find_protocol (self, protocol, &protocol_index))
|
if (!find_protocol (self, protocol, &protocol_index))
|
||||||
protocol_index = 0;
|
protocol_index = 0;
|
||||||
|
|
||||||
|
if (!find_media_encryption (self, encryption, &encryption_index))
|
||||||
|
encryption_index = 0;
|
||||||
|
|
||||||
/* set UI elements */
|
/* set UI elements */
|
||||||
gtk_entry_set_text (self->host, host);
|
gtk_entry_set_text (self->host, host);
|
||||||
gtk_entry_set_text (self->display_name, display_name ?: "");
|
gtk_entry_set_text (self->display_name, display_name ?: "");
|
||||||
|
@ -369,6 +448,7 @@ edit_form (CallsSipAccountWidget *self,
|
||||||
set_password_visibility (self, FALSE);
|
set_password_visibility (self, FALSE);
|
||||||
gtk_entry_set_text (self->port, port_str);
|
gtk_entry_set_text (self->port, port_str);
|
||||||
hdy_combo_row_set_selected_index (self->protocol, protocol_index);
|
hdy_combo_row_set_selected_index (self->protocol, protocol_index);
|
||||||
|
hdy_combo_row_set_selected_index (self->media_encryption, encryption_index);
|
||||||
gtk_switch_set_state (self->tel_switch, can_tel);
|
gtk_switch_set_state (self->tel_switch, can_tel);
|
||||||
gtk_switch_set_state (self->auto_connect_switch, auto_connect);
|
gtk_switch_set_state (self->auto_connect_switch, auto_connect);
|
||||||
|
|
||||||
|
@ -381,21 +461,6 @@ edit_form (CallsSipAccountWidget *self,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static const char *
|
|
||||||
get_selected_protocol (CallsSipAccountWidget *self)
|
|
||||||
{
|
|
||||||
g_autoptr (HdyValueObject) obj = NULL;
|
|
||||||
const char *protocol = NULL;
|
|
||||||
gint i;
|
|
||||||
|
|
||||||
if ((i = hdy_combo_row_get_selected_index (self->protocol)) != -1) {
|
|
||||||
obj = g_list_model_get_item (G_LIST_MODEL (self->protocols_store), i);
|
|
||||||
protocol = hdy_value_object_get_string (obj);
|
|
||||||
}
|
|
||||||
return protocol;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_login_clicked (CallsSipAccountWidget *self)
|
on_login_clicked (CallsSipAccountWidget *self)
|
||||||
{
|
{
|
||||||
|
@ -504,6 +569,7 @@ calls_sip_account_widget_dispose (GObject *object)
|
||||||
|
|
||||||
g_clear_pointer (&self->last_port, g_free);
|
g_clear_pointer (&self->last_port, g_free);
|
||||||
g_clear_object (&self->protocols_store);
|
g_clear_object (&self->protocols_store);
|
||||||
|
g_clear_object (&self->media_encryption_store);
|
||||||
|
|
||||||
G_OBJECT_CLASS (calls_sip_account_widget_parent_class)->dispose (object);
|
G_OBJECT_CLASS (calls_sip_account_widget_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
@ -550,6 +616,7 @@ calls_sip_account_widget_class_init (CallsSipAccountWidgetClass *klass)
|
||||||
gtk_widget_class_bind_template_child (widget_class, CallsSipAccountWidget, password);
|
gtk_widget_class_bind_template_child (widget_class, CallsSipAccountWidget, password);
|
||||||
gtk_widget_class_bind_template_child (widget_class, CallsSipAccountWidget, port);
|
gtk_widget_class_bind_template_child (widget_class, CallsSipAccountWidget, port);
|
||||||
gtk_widget_class_bind_template_child (widget_class, CallsSipAccountWidget, protocol);
|
gtk_widget_class_bind_template_child (widget_class, CallsSipAccountWidget, protocol);
|
||||||
|
gtk_widget_class_bind_template_child (widget_class, CallsSipAccountWidget, media_encryption);
|
||||||
gtk_widget_class_bind_template_child (widget_class, CallsSipAccountWidget, tel_switch);
|
gtk_widget_class_bind_template_child (widget_class, CallsSipAccountWidget, tel_switch);
|
||||||
gtk_widget_class_bind_template_child (widget_class, CallsSipAccountWidget, auto_connect_switch);
|
gtk_widget_class_bind_template_child (widget_class, CallsSipAccountWidget, auto_connect_switch);
|
||||||
|
|
||||||
|
@ -568,8 +635,35 @@ calls_sip_account_widget_init (CallsSipAccountWidget *self)
|
||||||
{
|
{
|
||||||
HdyValueObject *obj;
|
HdyValueObject *obj;
|
||||||
|
|
||||||
|
self->settings = calls_settings_get_default ();
|
||||||
|
|
||||||
|
g_signal_connect_swapped (self->settings,
|
||||||
|
"notify::always-allow-sdes",
|
||||||
|
G_CALLBACK (update_media_encryption),
|
||||||
|
self);
|
||||||
|
|
||||||
gtk_widget_init_template (GTK_WIDGET (self));
|
gtk_widget_init_template (GTK_WIDGET (self));
|
||||||
|
|
||||||
|
self->media_encryption_store = g_list_store_new (HDY_TYPE_VALUE_OBJECT);
|
||||||
|
|
||||||
|
obj = hdy_value_object_new_string (_("No encryption"));
|
||||||
|
g_object_set_data (G_OBJECT (obj),
|
||||||
|
"value", GINT_TO_POINTER (SIP_MEDIA_ENCRYPTION_NONE));
|
||||||
|
g_list_store_insert (self->media_encryption_store, 0, obj);
|
||||||
|
g_clear_object (&obj);
|
||||||
|
|
||||||
|
/* TODO Optional encryption */
|
||||||
|
obj = hdy_value_object_new_string (_("Force encryption"));
|
||||||
|
g_object_set_data (G_OBJECT (obj),
|
||||||
|
"value", GINT_TO_POINTER (SIP_MEDIA_ENCRYPTION_FORCED));
|
||||||
|
g_list_store_insert (self->media_encryption_store, 1, obj);
|
||||||
|
g_clear_object (&obj);
|
||||||
|
|
||||||
|
hdy_combo_row_bind_name_model (self->media_encryption,
|
||||||
|
G_LIST_MODEL (self->media_encryption_store),
|
||||||
|
(HdyComboRowGetNameFunc) hdy_value_object_dup_string,
|
||||||
|
NULL, NULL);
|
||||||
|
|
||||||
self->protocols_store = g_list_store_new (HDY_TYPE_VALUE_OBJECT);
|
self->protocols_store = g_list_store_new (HDY_TYPE_VALUE_OBJECT);
|
||||||
|
|
||||||
obj = hdy_value_object_new_string ("UDP");
|
obj = hdy_value_object_new_string ("UDP");
|
||||||
|
|
|
@ -183,6 +183,13 @@
|
||||||
<signal name="notify::selected-index" handler="on_user_changed" swapped="yes"/>
|
<signal name="notify::selected-index" handler="on_user_changed" swapped="yes"/>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="HdyComboRow" id="media_encryption">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="title" translatable="yes">Media Encryption</property>
|
||||||
|
<signal name="notify::selected-index" handler="on_user_changed" swapped="yes"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
|
Loading…
Reference in a new issue