|
Packit Service |
d328f3 |
// SPDX-License-Identifier: GPL-2.0+
|
|
Packit Service |
d328f3 |
/* NetworkManager Connection editor -- Connection editor for NetworkManager
|
|
Packit Service |
d328f3 |
*
|
|
Packit Service |
d328f3 |
* (C) Copyright 2016 Atul Anand <atulhjp@gmail.com>.
|
|
Packit Service |
d328f3 |
*/
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#include "nm-default.h"
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#include "page-proxy.h"
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#include <string.h>
|
|
Packit Service |
d328f3 |
#include <errno.h>
|
|
Packit Service |
d328f3 |
#include <stdlib.h>
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#include "nm-connection-editor.h"
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
G_DEFINE_TYPE (CEPageProxy, ce_page_proxy, CE_TYPE_PAGE)
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#define CE_PAGE_PROXY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CE_TYPE_PAGE_PROXY, CEPageProxyPrivate))
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
typedef struct {
|
|
Packit Service |
d328f3 |
NMSettingProxy *setting;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Method */
|
|
Packit Service |
d328f3 |
GtkComboBox *method;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Browser Only */
|
|
Packit Service |
d328f3 |
GtkCheckButton *browser_only;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* PAC URL */
|
|
Packit Service |
d328f3 |
GtkWidget *pac_url_label;
|
|
Packit Service |
d328f3 |
GtkEntry *pac_url;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* PAC Script */
|
|
Packit Service |
d328f3 |
GtkWidget *pac_script_label;
|
|
Packit Service |
d328f3 |
GtkButton *pac_script_import_button;
|
|
Packit Service |
d328f3 |
GtkTextView *pac_script_window;
|
|
Packit Service |
d328f3 |
} CEPageProxyPrivate;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#define PROXY_METHOD_NONE 0
|
|
Packit Service |
d328f3 |
#define PROXY_METHOD_AUTO 1
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
proxy_private_init (CEPageProxy *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageProxyPrivate *priv = CE_PAGE_PROXY_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
GtkBuilder *builder;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
builder = CE_PAGE (self)->builder;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->method = GTK_COMBO_BOX (gtk_builder_get_object (builder, "proxy_method"));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->browser_only = GTK_CHECK_BUTTON (gtk_builder_get_object (builder, "proxy_browser_only_checkbutton"));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->pac_url_label = GTK_WIDGET (gtk_builder_get_object (builder, "proxy_pac_url_label"));
|
|
Packit Service |
d328f3 |
priv->pac_url = GTK_ENTRY (gtk_builder_get_object (builder, "proxy_pac_url_entry"));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->pac_script_label = GTK_WIDGET (gtk_builder_get_object (builder, "proxy_pac_script_label"));
|
|
Packit Service |
d328f3 |
priv->pac_script_import_button = GTK_BUTTON (gtk_builder_get_object (builder, "proxy_pac_script_import_button"));
|
|
Packit Service |
d328f3 |
priv->pac_script_window = GTK_TEXT_VIEW (gtk_builder_get_object (builder, "proxy_pac_script_window"));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
stuff_changed (GtkWidget *w, gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
ce_page_changed (CE_PAGE (user_data));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
method_changed (GtkComboBox *combo, gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageProxy *self = user_data;
|
|
Packit Service |
d328f3 |
CEPageProxyPrivate *priv = CE_PAGE_PROXY_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
int method = gtk_combo_box_get_active (combo);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (method == PROXY_METHOD_NONE) {
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_url_label), FALSE);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_url), FALSE);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_label), FALSE);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_import_button), FALSE);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_window), FALSE);
|
|
Packit Service |
d328f3 |
} else {
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_url_label), TRUE);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_url), TRUE);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_label), TRUE);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_import_button), TRUE);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_window), TRUE);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
import_button_clicked_cb (GtkWidget *widget, CEPageProxy *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageProxyPrivate *priv = CE_PAGE_PROXY_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
GtkWidget *dialog, *toplevel;
|
|
Packit Service |
d328f3 |
GtkTextBuffer *buffer;
|
|
Packit Service |
d328f3 |
char *filename, *script = NULL;
|
|
Packit Service |
d328f3 |
gsize len;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
toplevel = gtk_widget_get_toplevel (CE_PAGE (self)->page);
|
|
Packit Service |
d328f3 |
g_return_if_fail (toplevel);
|
|
Packit Service |
d328f3 |
g_return_if_fail (gtk_widget_is_toplevel (toplevel));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
dialog = gtk_file_chooser_dialog_new (_("Select file to import"),
|
|
Packit Service |
d328f3 |
GTK_WINDOW (toplevel),
|
|
Packit Service |
d328f3 |
GTK_FILE_CHOOSER_ACTION_OPEN,
|
|
Packit Service |
d328f3 |
_("_Cancel"), GTK_RESPONSE_CANCEL,
|
|
Packit Service |
d328f3 |
_("_Open"), GTK_RESPONSE_ACCEPT,
|
|
Packit Service |
d328f3 |
NULL);
|
|
Packit Service |
d328f3 |
gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
|
|
Packit Service |
d328f3 |
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
|
|
Packit Service |
d328f3 |
if (!filename)
|
|
Packit Service |
d328f3 |
goto out;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_file_get_contents (filename, &script, &len, NULL);
|
|
Packit Service |
d328f3 |
buffer = gtk_text_view_get_buffer (priv->pac_script_window);
|
|
Packit Service |
d328f3 |
gtk_text_buffer_set_text (buffer, script ?: "", -1);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_free (filename);
|
|
Packit Service |
d328f3 |
g_free (script);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
out:
|
|
Packit Service |
d328f3 |
gtk_widget_destroy (dialog);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
populate_ui (CEPageProxy *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageProxyPrivate *priv = CE_PAGE_PROXY_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
NMSettingProxy *setting = priv->setting;
|
|
Packit Service |
d328f3 |
NMSettingProxyMethod s_method;
|
|
Packit Service |
d328f3 |
GtkTextBuffer *buffer;
|
|
Packit Service |
d328f3 |
const char *tmp = NULL;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Method */
|
|
Packit Service |
d328f3 |
s_method = nm_setting_proxy_get_method (setting);
|
|
Packit Service |
d328f3 |
switch (s_method) {
|
|
Packit Service |
d328f3 |
case NM_SETTING_PROXY_METHOD_AUTO:
|
|
Packit Service |
d328f3 |
gtk_combo_box_set_active (priv->method, PROXY_METHOD_AUTO);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Pac Url */
|
|
Packit Service |
d328f3 |
tmp = nm_setting_proxy_get_pac_url (setting);
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (priv->pac_url, tmp ? tmp : "");
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Pac Script */
|
|
Packit Service |
d328f3 |
tmp = nm_setting_proxy_get_pac_script (setting);
|
|
Packit Service |
d328f3 |
buffer = gtk_text_view_get_buffer (priv->pac_script_window);
|
|
Packit Service |
d328f3 |
gtk_text_buffer_set_text (buffer, tmp ?: "", -1);
|
|
Packit Service |
d328f3 |
break;
|
|
Packit Service |
d328f3 |
case NM_SETTING_PROXY_METHOD_NONE:
|
|
Packit Service |
d328f3 |
gtk_combo_box_set_active (priv->method, PROXY_METHOD_NONE);
|
|
Packit Service |
d328f3 |
/* Nothing to Show */
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->method, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->browser_only, "toggled", G_CALLBACK (stuff_changed), self);
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->pac_url, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit Service |
d328f3 |
g_signal_connect (gtk_text_view_get_buffer (priv->pac_script_window), "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->browser_only),
|
|
Packit Service |
d328f3 |
nm_setting_proxy_get_browser_only (setting));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
finish_setup (CEPageProxy *self, gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageProxyPrivate *priv = CE_PAGE_PROXY_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
populate_ui (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
method_changed (priv->method, self);
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->method, "changed", G_CALLBACK (method_changed), self);
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->pac_script_import_button, "clicked", G_CALLBACK (import_button_clicked_cb), self);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
CEPage *
|
|
Packit Service |
d328f3 |
ce_page_proxy_new (NMConnectionEditor *editor,
|
|
Packit Service |
d328f3 |
NMConnection *connection,
|
|
Packit Service |
d328f3 |
GtkWindow *parent_window,
|
|
Packit Service |
d328f3 |
NMClient *client,
|
|
Packit Service |
d328f3 |
const char **out_secrets_setting_name,
|
|
Packit Service |
d328f3 |
GError **error)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageProxy *self;
|
|
Packit Service |
d328f3 |
CEPageProxyPrivate *priv;
|
|
Packit Service |
d328f3 |
NMSettingConnection *s_con;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
self = CE_PAGE_PROXY (ce_page_new (CE_TYPE_PAGE_PROXY,
|
|
Packit Service |
d328f3 |
editor,
|
|
Packit Service |
d328f3 |
connection,
|
|
Packit Service |
d328f3 |
parent_window,
|
|
Packit Service |
d328f3 |
client,
|
|
Packit Service |
d328f3 |
"/org/gnome/nm_connection_editor/ce-page-proxy.ui",
|
|
Packit Service |
d328f3 |
"ProxyPage",
|
|
Packit Service |
d328f3 |
_("Proxy")));
|
|
Packit Service |
d328f3 |
if (!self) {
|
|
Packit Service |
d328f3 |
g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Could not load proxy user interface."));
|
|
Packit Service |
d328f3 |
return NULL;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
proxy_private_init (self);
|
|
Packit Service |
d328f3 |
priv = CE_PAGE_PROXY_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
s_con = nm_connection_get_setting_connection (connection);
|
|
Packit Service |
d328f3 |
g_assert (s_con);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->setting = nm_connection_get_setting_proxy (connection);
|
|
Packit Service |
d328f3 |
g_assert (priv->setting);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_signal_connect (self, CE_PAGE_INITIALIZED, G_CALLBACK (finish_setup), NULL);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
return CE_PAGE (self);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
ui_to_setting (CEPageProxy *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageProxyPrivate *priv = CE_PAGE_PROXY_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
NMSettingConnection *s_con;
|
|
Packit Service |
d328f3 |
int method;
|
|
Packit Service |
d328f3 |
gboolean browser_only;
|
|
Packit Service |
d328f3 |
const char *pac_url;
|
|
Packit Service |
d328f3 |
GtkTextBuffer *buffer;
|
|
Packit Service |
d328f3 |
GtkTextIter start, end;
|
|
Packit Service |
d328f3 |
char *script = NULL;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
s_con = nm_connection_get_setting_connection (CE_PAGE (self)->connection);
|
|
Packit Service |
d328f3 |
g_return_if_fail (s_con != NULL);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Method */
|
|
Packit Service |
d328f3 |
method = gtk_combo_box_get_active (priv->method);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Browser Only */
|
|
Packit Service |
d328f3 |
browser_only = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->browser_only));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (method == PROXY_METHOD_NONE) {
|
|
Packit Service |
d328f3 |
g_object_set (priv->setting,
|
|
Packit Service |
d328f3 |
NM_SETTING_PROXY_METHOD, NM_SETTING_PROXY_METHOD_NONE,
|
|
Packit Service |
d328f3 |
NM_SETTING_PROXY_BROWSER_ONLY, browser_only,
|
|
Packit Service |
d328f3 |
NM_SETTING_PROXY_PAC_URL, NULL,
|
|
Packit Service |
d328f3 |
NM_SETTING_PROXY_PAC_SCRIPT, NULL,
|
|
Packit Service |
d328f3 |
NULL);
|
|
Packit Service |
d328f3 |
return;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* PAC Url */
|
|
Packit Service |
d328f3 |
pac_url = gtk_entry_get_text (priv->pac_url);
|
|
Packit Service |
d328f3 |
if (pac_url && strlen (pac_url) < 1)
|
|
Packit Service |
d328f3 |
pac_url = NULL;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* PAC Script */
|
|
Packit Service |
d328f3 |
buffer = gtk_text_view_get_buffer (priv->pac_script_window);
|
|
Packit Service |
d328f3 |
gtk_text_buffer_get_iter_at_offset (buffer, &start, 0);
|
|
Packit Service |
d328f3 |
gtk_text_buffer_get_iter_at_offset (buffer, &end, -1);
|
|
Packit Service |
d328f3 |
script = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Update NMSetting */
|
|
Packit Service |
d328f3 |
g_object_set (priv->setting,
|
|
Packit Service |
d328f3 |
NM_SETTING_PROXY_METHOD, NM_SETTING_PROXY_METHOD_AUTO,
|
|
Packit Service |
d328f3 |
NM_SETTING_PROXY_BROWSER_ONLY, browser_only,
|
|
Packit Service |
d328f3 |
NM_SETTING_PROXY_PAC_URL, pac_url,
|
|
Packit Service |
d328f3 |
NM_SETTING_PROXY_PAC_SCRIPT, nm_str_not_empty (script),
|
|
Packit Service |
d328f3 |
NULL);
|
|
Packit Service |
d328f3 |
g_free (script);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static gboolean
|
|
Packit Service |
d328f3 |
ce_page_validate_v (CEPage *page, NMConnection *connection, GError **error)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageProxy *self = CE_PAGE_PROXY (page);
|
|
Packit Service |
d328f3 |
CEPageProxyPrivate *priv = CE_PAGE_PROXY_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!priv->setting) {
|
|
Packit Service |
d328f3 |
priv->setting = (NMSettingProxy *) nm_setting_proxy_new ();
|
|
Packit Service |
d328f3 |
nm_connection_add_setting (connection, NM_SETTING (priv->setting));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
ui_to_setting (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
return nm_setting_verify (NM_SETTING (priv->setting), NULL, error);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
ce_page_proxy_init (CEPageProxy *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
ce_page_proxy_class_init (CEPageProxyClass *proxy_class)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
GObjectClass *object_class = G_OBJECT_CLASS (proxy_class);
|
|
Packit Service |
d328f3 |
CEPageClass *parent_class = CE_PAGE_CLASS (proxy_class);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_type_class_add_private (object_class, sizeof (CEPageProxyPrivate));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* virtual methods */
|
|
Packit Service |
d328f3 |
parent_class->ce_page_validate_v = ce_page_validate_v;
|
|
Packit Service |
d328f3 |
}
|