[gnome-software: 6/8] packagekit: Merge packagekit-proxy plugin into packagekit




commit d1902d2773217e2515e6d47fbcac885adb74460e
Author: Philip Withnall <pwithnall endlessos org>
Date:   Thu May 20 15:46:28 2021 +0100

    packagekit: Merge packagekit-proxy plugin into packagekit
    
    Signed-off-by: Philip Withnall <pwithnall endlessos org>

 contrib/gnome-software.spec.in                  |   1 -
 plugins/packagekit/gs-plugin-packagekit-proxy.c | 316 ------------------------
 plugins/packagekit/gs-plugin-packagekit.c       | 299 +++++++++++++++++++++-
 plugins/packagekit/meson.build                  |  13 -
 plugins/rpm-ostree/gs-plugin-rpm-ostree.c       |   1 -
 5 files changed, 296 insertions(+), 334 deletions(-)
---
diff --git a/contrib/gnome-software.spec.in b/contrib/gnome-software.spec.in
index 9aaaa2e8e..49beee6ea 100644
--- a/contrib/gnome-software.spec.in
+++ b/contrib/gnome-software.spec.in
@@ -163,7 +163,6 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop
 %{gs_plugin_dir}/libgs_plugin_icons.so
 %{gs_plugin_dir}/libgs_plugin_modalias.so
 %{gs_plugin_dir}/libgs_plugin_os-release.so
-%{gs_plugin_dir}/libgs_plugin_packagekit-proxy.so
 %{gs_plugin_dir}/libgs_plugin_packagekit-refine-repos.so
 %{gs_plugin_dir}/libgs_plugin_packagekit-refresh.so
 %{gs_plugin_dir}/libgs_plugin_packagekit-upgrade.so
diff --git a/plugins/packagekit/gs-plugin-packagekit.c b/plugins/packagekit/gs-plugin-packagekit.c
index 210c95bd9..d86b585c0 100644
--- a/plugins/packagekit/gs-plugin-packagekit.c
+++ b/plugins/packagekit/gs-plugin-packagekit.c
@@ -4,15 +4,17 @@
  * Copyright (C) 2013-2016 Richard Hughes <richard hughsie com>
  * Copyright (C) 2014-2018 Kalev Lember <klember redhat com>
  * Copyright (C) 2017 Canonical Ltd
+ * Copyright (C) 2013 Matthias Clasen <mclasen redhat com>
  *
  * SPDX-License-Identifier: GPL-2.0+
  */
 
 #include <config.h>
 
-#include <packagekit-glib2/packagekit.h>
-
 #include <gnome-software.h>
+#include <gsettings-desktop-schemas/gdesktop-enums.h>
+#include <packagekit-glib2/packagekit.h>
+#include <string.h>
 
 #include "packagekit-common.h"
 #include "gs-markdown.h"
@@ -24,6 +26,8 @@
  * sources and the ability to add and remove packages. Supports package history
  * and converting URIs to apps.
  *
+ * Supports setting the session proxy on the system PackageKit instance.
+ *
  * Requires:    | [source-id]
  * Refines:     | [source-id], [source], [update-details], [management-plugin]
  */
@@ -45,6 +49,13 @@ struct GsPluginData {
 
        PkClient                *client_url_to_app;
        GMutex                   client_mutex_url_to_app;
+
+       PkControl               *control_proxy;
+       GSettings               *settings_proxy;
+       GSettings               *settings_http;
+       GSettings               *settings_https;
+       GSettings               *settings_ftp;
+       GSettings               *settings_socks;
 };
 
 static void gs_plugin_packagekit_updates_changed_cb (PkControl *control, GsPlugin *plugin);
@@ -53,6 +64,10 @@ static gboolean gs_plugin_packagekit_refine_history (GsPlugin      *plugin,
                                                      GsAppList     *list,
                                                      GCancellable  *cancellable,
                                                      GError       **error);
+static void gs_plugin_packagekit_proxy_changed_cb (GSettings   *settings,
+                                                   const gchar *key,
+                                                   GsPlugin    *plugin);
+static void reload_proxy_settings (GsPlugin *plugin, GCancellable *cancellable);
 
 void
 gs_plugin_initialize (GsPlugin *plugin)
@@ -92,6 +107,25 @@ gs_plugin_initialize (GsPlugin *plugin)
        pk_client_set_cache_age (priv->client_url_to_app, G_MAXUINT);
        pk_client_set_interactive (priv->client_url_to_app, gs_plugin_has_flags (plugin, 
GS_PLUGIN_FLAGS_INTERACTIVE));
 
+       /* proxy */
+       priv->control_proxy = pk_control_new ();
+       priv->settings_proxy = g_settings_new ("org.gnome.system.proxy");
+       g_signal_connect (priv->settings_proxy, "changed",
+                         G_CALLBACK (gs_plugin_packagekit_proxy_changed_cb), plugin);
+
+       priv->settings_http = g_settings_new ("org.gnome.system.proxy.http");
+       priv->settings_https = g_settings_new ("org.gnome.system.proxy.https");
+       priv->settings_ftp = g_settings_new ("org.gnome.system.proxy.ftp");
+       priv->settings_socks = g_settings_new ("org.gnome.system.proxy.socks");
+       g_signal_connect (priv->settings_http, "changed",
+                         G_CALLBACK (gs_plugin_packagekit_proxy_changed_cb), plugin);
+       g_signal_connect (priv->settings_https, "changed",
+                         G_CALLBACK (gs_plugin_packagekit_proxy_changed_cb), plugin);
+       g_signal_connect (priv->settings_ftp, "changed",
+                         G_CALLBACK (gs_plugin_packagekit_proxy_changed_cb), plugin);
+       g_signal_connect (priv->settings_socks, "changed",
+                         G_CALLBACK (gs_plugin_packagekit_proxy_changed_cb), plugin);
+
        /* need pkgname and ID */
        gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "appstream");
 }
@@ -121,6 +155,14 @@ gs_plugin_destroy (GsPlugin *plugin)
        /* url-to-app */
        g_mutex_clear (&priv->client_mutex_url_to_app);
        g_object_unref (priv->client_url_to_app);
+
+       /* proxy */
+       g_object_unref (priv->control_proxy);
+       g_object_unref (priv->settings_proxy);
+       g_object_unref (priv->settings_http);
+       g_object_unref (priv->settings_https);
+       g_object_unref (priv->settings_ftp);
+       g_object_unref (priv->settings_socks);
 }
 
 static gboolean
@@ -1694,10 +1736,16 @@ gboolean
 gs_plugin_setup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
+
        priv->connection_history = g_bus_get_sync (G_BUS_TYPE_SYSTEM,
                                                   cancellable,
                                                   error);
-       return priv->connection_history != NULL;
+       if (priv->connection_history == NULL)
+               return FALSE;
+
+       reload_proxy_settings (plugin, cancellable);
+
+       return TRUE;
 }
 
 static gboolean
@@ -2288,3 +2336,248 @@ gs_plugin_url_to_app (GsPlugin *plugin,
 
        return TRUE;
 }
+
+static gchar *
+get_proxy_http (GsPlugin *plugin)
+{
+       GsPluginData *priv = gs_plugin_get_data (plugin);
+       gboolean ret;
+       GString *string = NULL;
+       gint port;
+       GDesktopProxyMode proxy_mode;
+       g_autofree gchar *host = NULL;
+       g_autofree gchar *password = NULL;
+       g_autofree gchar *username = NULL;
+
+       proxy_mode = g_settings_get_enum (priv->settings_proxy, "mode");
+       if (proxy_mode != G_DESKTOP_PROXY_MODE_MANUAL)
+               return NULL;
+
+       host = g_settings_get_string (priv->settings_http, "host");
+       if (host == NULL || host[0] == '\0')
+               return NULL;
+
+       port = g_settings_get_int (priv->settings_http, "port");
+
+       ret = g_settings_get_boolean (priv->settings_http,
+                                     "use-authentication");
+       if (ret) {
+               username = g_settings_get_string (priv->settings_http,
+                                                 "authentication-user");
+               password = g_settings_get_string (priv->settings_http,
+                                                 "authentication-password");
+       }
+
+       /* make PackageKit proxy string */
+       string = g_string_new ("");
+       if (username != NULL || password != NULL) {
+               if (username != NULL)
+                       g_string_append_printf (string, "%s", username);
+               if (password != NULL)
+                       g_string_append_printf (string, ":%s", password);
+               g_string_append (string, "@");
+       }
+       g_string_append (string, host);
+       if (port > 0)
+               g_string_append_printf (string, ":%i", port);
+       return g_string_free (string, FALSE);
+}
+
+static gchar *
+get_proxy_https (GsPlugin *plugin)
+{
+       GsPluginData *priv = gs_plugin_get_data (plugin);
+       GString *string = NULL;
+       gint port;
+       GDesktopProxyMode proxy_mode;
+       g_autofree gchar *host = NULL;
+
+       proxy_mode = g_settings_get_enum (priv->settings_proxy, "mode");
+       if (proxy_mode != G_DESKTOP_PROXY_MODE_MANUAL)
+               return NULL;
+
+       host = g_settings_get_string (priv->settings_https, "host");
+       if (host == NULL || host[0] == '\0')
+               return NULL;
+       port = g_settings_get_int (priv->settings_https, "port");
+       if (port == 0)
+               return NULL;
+
+       /* make PackageKit proxy string */
+       string = g_string_new (host);
+       if (port > 0)
+               g_string_append_printf (string, ":%i", port);
+       return g_string_free (string, FALSE);
+}
+
+static gchar *
+get_proxy_ftp (GsPlugin *plugin)
+{
+       GsPluginData *priv = gs_plugin_get_data (plugin);
+       GString *string = NULL;
+       gint port;
+       GDesktopProxyMode proxy_mode;
+       g_autofree gchar *host = NULL;
+
+       proxy_mode = g_settings_get_enum (priv->settings_proxy, "mode");
+       if (proxy_mode != G_DESKTOP_PROXY_MODE_MANUAL)
+               return NULL;
+
+       host = g_settings_get_string (priv->settings_ftp, "host");
+       if (host == NULL || host[0] == '\0')
+               return NULL;
+       port = g_settings_get_int (priv->settings_ftp, "port");
+       if (port == 0)
+               return NULL;
+
+       /* make PackageKit proxy string */
+       string = g_string_new (host);
+       if (port > 0)
+               g_string_append_printf (string, ":%i", port);
+       return g_string_free (string, FALSE);
+}
+
+static gchar *
+get_proxy_socks (GsPlugin *plugin)
+{
+       GsPluginData *priv = gs_plugin_get_data (plugin);
+       GString *string = NULL;
+       gint port;
+       GDesktopProxyMode proxy_mode;
+       g_autofree gchar *host = NULL;
+
+       proxy_mode = g_settings_get_enum (priv->settings_proxy, "mode");
+       if (proxy_mode != G_DESKTOP_PROXY_MODE_MANUAL)
+               return NULL;
+
+       host = g_settings_get_string (priv->settings_socks, "host");
+       if (host == NULL || host[0] == '\0')
+               return NULL;
+       port = g_settings_get_int (priv->settings_socks, "port");
+       if (port == 0)
+               return NULL;
+
+       /* make PackageKit proxy string */
+       string = g_string_new (host);
+       if (port > 0)
+               g_string_append_printf (string, ":%i", port);
+       return g_string_free (string, FALSE);
+}
+
+static gchar *
+get_no_proxy (GsPlugin *plugin)
+{
+       GsPluginData *priv = gs_plugin_get_data (plugin);
+       GString *string = NULL;
+       GDesktopProxyMode proxy_mode;
+       g_autofree gchar **hosts = NULL;
+       guint i;
+
+       proxy_mode = g_settings_get_enum (priv->settings_proxy, "mode");
+       if (proxy_mode != G_DESKTOP_PROXY_MODE_MANUAL)
+               return NULL;
+
+       hosts = g_settings_get_strv (priv->settings_proxy, "ignore-hosts");
+       if (hosts == NULL)
+               return NULL;
+
+       /* make PackageKit proxy string */
+       string = g_string_new ("");
+       for (i = 0; hosts[i] != NULL; i++) {
+               if (i == 0)
+                       g_string_assign (string, hosts[i]);
+               else
+                       g_string_append_printf (string, ",%s", hosts[i]);
+               g_free (hosts[i]);
+       }
+
+       return g_string_free (string, FALSE);
+}
+
+static gchar *
+get_pac (GsPlugin *plugin)
+{
+       GsPluginData *priv = gs_plugin_get_data (plugin);
+       GDesktopProxyMode proxy_mode;
+       gchar *url = NULL;
+
+       proxy_mode = g_settings_get_enum (priv->settings_proxy, "mode");
+       if (proxy_mode != G_DESKTOP_PROXY_MODE_AUTO)
+               return NULL;
+
+       url = g_settings_get_string (priv->settings_proxy, "autoconfig-url");
+       if (url == NULL)
+               return NULL;
+
+       return url;
+}
+
+static void
+set_proxy_cb (GObject *object, GAsyncResult *res, gpointer user_data)
+{
+       g_autoptr(GError) error = NULL;
+       if (!pk_control_set_proxy_finish (PK_CONTROL (object), res, &error)) {
+               if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+                       g_warning ("failed to set proxies: %s", error->message);
+       }
+}
+
+static void
+reload_proxy_settings (GsPlugin *plugin, GCancellable *cancellable)
+{
+       GsPluginData *priv = gs_plugin_get_data (plugin);
+       g_autofree gchar *proxy_http = NULL;
+       g_autofree gchar *proxy_https = NULL;
+       g_autofree gchar *proxy_ftp = NULL;
+       g_autofree gchar *proxy_socks = NULL;
+       g_autofree gchar *no_proxy = NULL;
+       g_autofree gchar *pac = NULL;
+       g_autoptr(GError) error = NULL;
+       g_autoptr(GPermission) permission = NULL;
+
+       /* only if we can achieve the action *without* an auth dialog */
+       permission = gs_utils_get_permission ("org.freedesktop.packagekit."
+                                             "system-network-proxy-configure",
+                                             cancellable, &error);
+       if (permission == NULL) {
+               g_debug ("not setting proxy as no permission: %s", error->message);
+               return;
+       }
+       if (!g_permission_get_allowed (permission)) {
+               g_debug ("not setting proxy as no auth requested");
+               return;
+       }
+
+       proxy_http = get_proxy_http (plugin);
+       proxy_https = get_proxy_https (plugin);
+       proxy_ftp = get_proxy_ftp (plugin);
+       proxy_socks = get_proxy_socks (plugin);
+       no_proxy = get_no_proxy (plugin);
+       pac = get_pac (plugin);
+
+       g_debug ("Setting proxies (http: %s, https: %s, ftp: %s, socks: %s, "
+                "no_proxy: %s, pac: %s)",
+                proxy_http, proxy_https, proxy_ftp, proxy_socks,
+                no_proxy, pac);
+
+       pk_control_set_proxy2_async (priv->control_proxy,
+                                    proxy_http,
+                                    proxy_https,
+                                    proxy_ftp,
+                                    proxy_socks,
+                                    no_proxy,
+                                    pac,
+                                    cancellable,
+                                    set_proxy_cb,
+                                    plugin);
+}
+
+static void
+gs_plugin_packagekit_proxy_changed_cb (GSettings *settings,
+                                      const gchar *key,
+                                      GsPlugin *plugin)
+{
+       if (!gs_plugin_get_enabled (plugin))
+               return;
+       reload_proxy_settings (plugin, NULL);
+}
diff --git a/plugins/packagekit/meson.build b/plugins/packagekit/meson.build
index 1b6d17c13..9beac3afc 100644
--- a/plugins/packagekit/meson.build
+++ b/plugins/packagekit/meson.build
@@ -95,19 +95,6 @@ shared_module(
   dependencies : [ plugin_libs, packagekit ],
 )
 
-shared_module(
-  'gs_plugin_packagekit-proxy',
-sources : 'gs-plugin-packagekit-proxy.c',
-  include_directories : [
-    include_directories('../..'),
-    include_directories('../../lib'),
-  ],
-  install : true,
-  install_dir: plugin_dir,
-  c_args : cargs,
-  dependencies : [ plugin_libs, packagekit ],
-)
-
 if get_option('tests')
   cargs += ['-DTESTDATADIR="' + join_paths(meson.current_source_dir(), 'tests') + '"']
   e = executable(
diff --git a/plugins/rpm-ostree/gs-plugin-rpm-ostree.c b/plugins/rpm-ostree/gs-plugin-rpm-ostree.c
index 90874593b..5d9265dad 100644
--- a/plugins/rpm-ostree/gs-plugin-rpm-ostree.c
+++ b/plugins/rpm-ostree/gs-plugin-rpm-ostree.c
@@ -68,7 +68,6 @@ gs_plugin_initialize (GsPlugin *plugin)
         * more sense to use a custom plugin instead of using PackageKit.
         */
        gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_CONFLICTS, "packagekit");
-       gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_CONFLICTS, "packagekit-proxy");
        gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_CONFLICTS, "packagekit-refine-repos");
        gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_CONFLICTS, "packagekit-refresh");
        gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_CONFLICTS, "packagekit-upgrade");


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]