import gnome-settings-daemon-3.32.0-13.el8

c8-beta imports/c8-beta/gnome-settings-daemon-3.32.0-13.el8
CentOS Sources 2 years ago committed by Stepan Oksanichenko
parent 9582f7df60
commit 646ba50930

@ -0,0 +1,125 @@
From a8115378fd876bfd4c3871428cdc16134ed484b1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Tue, 5 Jan 2021 11:11:18 +0100
Subject: [PATCH] media-keys: Mark screen cast as stopped if it was signalled
as such
gnome-shell now sends a 'Stopped' signal if it was stopped without
gsd-media-keys itself being the stopper.
---
plugins/media-keys/gsd-media-keys-manager.c | 52 +++++++++++++++++++--
1 file changed, 49 insertions(+), 3 deletions(-)
diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c
index 4d251f08..a526d5cf 100644
--- a/plugins/media-keys/gsd-media-keys-manager.c
+++ b/plugins/media-keys/gsd-media-keys-manager.c
@@ -210,6 +210,7 @@ struct GsdMediaKeysManagerPrivate
guint screencast_timeout_id;
gboolean screencast_recording;
GCancellable *screencast_cancellable;
+ guint screencast_stopped_signal_id;
/* Rotation */
guint iio_sensor_watch_id;
@@ -2346,20 +2347,26 @@ do_rfkill_action (GsdMediaKeysManager *manager,
}
static void
-screencast_stop (GsdMediaKeysManager *manager)
+screencast_stopped (GsdMediaKeysManager *manager)
{
if (manager->priv->screencast_timeout_id > 0) {
g_source_remove (manager->priv->screencast_timeout_id);
manager->priv->screencast_timeout_id = 0;
}
+ manager->priv->screencast_recording = FALSE;
+}
+
+static void
+screencast_stop (GsdMediaKeysManager *manager)
+{
+ screencast_stopped (manager);
+
g_dbus_proxy_call (manager->priv->screencast_proxy,
"StopScreencast", NULL,
G_DBUS_CALL_FLAGS_NONE, -1,
manager->priv->screencast_cancellable,
NULL, NULL);
-
- manager->priv->screencast_recording = FALSE;
}
static gboolean
@@ -2835,6 +2842,21 @@ initialize_volume_handler (GsdMediaKeysManager *manager)
gnome_settings_profile_end ("gvc_mixer_control_new");
}
+
+static void
+on_screencast_stopped (GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer data)
+{
+ GsdMediaKeysManager *manager = data;
+
+ screencast_stopped (manager);
+}
+
static void
on_screencast_proxy_ready (GObject *source,
GAsyncResult *result,
@@ -2850,7 +2872,20 @@ on_screencast_proxy_ready (GObject *source,
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
g_warning ("Failed to create proxy for screencast: %s", error->message);
g_error_free (error);
+ return;
}
+
+ manager->priv->screencast_stopped_signal_id =
+ g_dbus_connection_signal_subscribe (manager->priv->connection,
+ SHELL_DBUS_NAME ".Screencast",
+ SHELL_DBUS_NAME ".Screencast",
+ "Stopped",
+ SHELL_DBUS_PATH "/Screencast",
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ on_screencast_stopped,
+ manager,
+ NULL);
}
static void
@@ -2901,6 +2936,11 @@ shell_presence_changed (GsdMediaKeysManager *manager)
on_screencast_proxy_ready, manager);
g_free (name_owner);
} else {
+ if (manager->priv->screencast_stopped_signal_id)
+ g_dbus_connection_signal_unsubscribe (manager->priv->connection,
+ manager->priv->screencast_stopped_signal_id);
+ manager->priv->screencast_stopped_signal_id = 0;
+
g_ptr_array_set_size (manager->priv->keys, 0);
g_clear_object (&manager->priv->key_grabber);
g_clear_object (&manager->priv->screencast_proxy);
@@ -3091,6 +3131,12 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager)
priv->reenable_power_button_timer_id = 0;
}
+ if (priv->screencast_stopped_signal_id) {
+ g_dbus_connection_signal_unsubscribe (priv->connection,
+ priv->screencast_stopped_signal_id);
+ priv->screencast_stopped_signal_id = 0;
+ }
+
g_clear_pointer (&manager->priv->ca, ca_context_destroy);
#if HAVE_GUDEV
--
2.27.0

@ -1,249 +0,0 @@
From ca35861a54b9f9413e4db8486a2786ba771a0271 Mon Sep 17 00:00:00 2001
From: Kalev Lember <klember@redhat.com>
Date: Thu, 27 Jun 2019 16:12:00 +0200
Subject: [PATCH] subman: Add InstalledProducts dbus property for g-c-c
---
plugins/subman/gsd-subscription-manager.c | 135 ++++++++++++++++++++++
1 file changed, 135 insertions(+)
diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c
index 08b13fa6..a8c18a26 100644
--- a/plugins/subman/gsd-subscription-manager.c
+++ b/plugins/subman/gsd-subscription-manager.c
@@ -1,6 +1,7 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
*
* Copyright (C) 2019 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2019 Kalev Lember <klember@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -44,6 +45,7 @@ static const gchar introspection_xml[] =
" <arg type='a{sv}' name='options' direction='in'/>"
" </method>"
" <method name='Unregister'/>"
+" <property name='InstalledProducts' type='aa{sv}' access='read'/>"
" <property name='SubscriptionStatus' type='u' access='read'/>"
" </interface>"
"</node>";
@@ -72,6 +74,7 @@ struct GsdSubscriptionManagerPrivate
GDBusProxy *proxies[_RHSM_INTERFACE_LAST];
const gchar *userlang; /* owned by GLib internally */
GHashTable *config; /* str:str */
+ GPtrArray *installed_products;
gchar *address;
GTimer *timer_last_notified;
@@ -92,6 +95,32 @@ static void gsd_subscription_manager_finalize (GObject *objec
G_DEFINE_TYPE (GsdSubscriptionManager, gsd_subscription_manager, G_TYPE_OBJECT)
+typedef struct
+{
+ gchar *product_name;
+ gchar *product_id;
+ gchar *version;
+ gchar *arch;
+ gchar *status;
+ gchar *starts;
+ gchar *ends;
+} ProductData;
+
+static void
+product_data_free (ProductData *product)
+{
+ g_free (product->product_name);
+ g_free (product->product_id);
+ g_free (product->version);
+ g_free (product->arch);
+ g_free (product->status);
+ g_free (product->starts);
+ g_free (product->ends);
+ g_free (product);
+}
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (ProductData, product_data_free);
+
static gpointer manager_object = NULL;
GQuark
@@ -120,6 +149,32 @@ _client_subscription_status_from_text (const gchar *status_txt)
return GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN;
}
+static GVariant *
+_make_installed_products_variant (GPtrArray *installed_products)
+{
+ GVariantBuilder builder;
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}"));
+
+ for (guint i = 0; i < installed_products->len; i++) {
+ ProductData *product = g_ptr_array_index (installed_products, i);
+ g_auto(GVariantDict) dict;
+
+ g_variant_dict_init (&dict, NULL);
+
+ g_variant_dict_insert (&dict, "product-name", "s", product->product_name);
+ g_variant_dict_insert (&dict, "product-id", "s", product->product_id);
+ g_variant_dict_insert (&dict, "version", "s", product->version);
+ g_variant_dict_insert (&dict, "arch", "s", product->arch);
+ g_variant_dict_insert (&dict, "status", "s", product->status);
+ g_variant_dict_insert (&dict, "starts", "s", product->starts);
+ g_variant_dict_insert (&dict, "ends", "s", product->ends);
+
+ g_variant_builder_add_value (&builder, g_variant_dict_end (&dict));
+ }
+
+ return g_variant_builder_end (&builder);
+}
+
static void
_emit_property_changed (GsdSubscriptionManager *manager,
const gchar *property_name,
@@ -154,6 +209,69 @@ _emit_property_changed (GsdSubscriptionManager *manager,
g_variant_builder_clear (&invalidated_builder);
}
+static gboolean
+_client_installed_products_update (GsdSubscriptionManager *manager, GError **error)
+{
+ GsdSubscriptionManagerPrivate *priv = manager->priv;
+ JsonNode *json_root;
+ JsonArray *json_products_array;
+ const gchar *json_txt = NULL;
+ g_autoptr(GVariant) val = NULL;
+ g_autoptr(JsonParser) json_parser = json_parser_new ();
+
+ val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_PRODUCTS],
+ "ListInstalledProducts",
+ g_variant_new ("(sa{sv}s)",
+ "" /* filter_string */,
+ NULL /* proxy_options */,
+ priv->userlang),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL, error);
+ if (val == NULL)
+ return FALSE;
+ g_variant_get (val, "(&s)", &json_txt);
+ g_debug ("Products.ListInstalledProducts JSON: %s", json_txt);
+ if (!json_parser_load_from_data (json_parser, json_txt, -1, error))
+ return FALSE;
+ json_root = json_parser_get_root (json_parser);
+ json_products_array = json_node_get_array (json_root);
+ if (json_products_array == NULL) {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA,
+ "no InstalledProducts array in %s", json_txt);
+ return FALSE;
+ }
+
+ g_ptr_array_set_size (priv->installed_products, 0);
+
+ for (guint i = 0; i < json_array_get_length (json_products_array); i++) {
+ JsonArray *json_product = json_array_get_array_element (json_products_array, i);
+ g_autoptr(ProductData) product = g_new0 (ProductData, 1);
+
+ if (json_product == NULL)
+ continue;
+ if (json_array_get_length (json_product) < 8) {
+ g_debug ("Unexpected number of array elements in InstalledProducts JSON");
+ continue;
+ }
+
+ product->product_name = g_strdup (json_array_get_string_element (json_product, 0));
+ product->product_id = g_strdup (json_array_get_string_element (json_product, 1));
+ product->version = g_strdup (json_array_get_string_element (json_product, 2));
+ product->arch = g_strdup (json_array_get_string_element (json_product, 3));
+ product->status = g_strdup (json_array_get_string_element (json_product, 4));
+ product->starts = g_strdup (json_array_get_string_element (json_product, 6));
+ product->ends = g_strdup (json_array_get_string_element (json_product, 7));
+
+ g_ptr_array_add (priv->installed_products, g_steal_pointer (&product));
+ }
+
+ /* emit notification for g-c-c */
+ _emit_property_changed (manager, "InstalledProducts",
+ _make_installed_products_variant (priv->installed_products));
+
+ return TRUE;
+}
+
static gboolean
_client_subscription_status_update (GsdSubscriptionManager *manager, GError **error)
{
@@ -450,6 +568,8 @@ _client_register_with_keys (GsdSubscriptionManager *manager,
return FALSE;
if (!_client_subscription_status_update (manager, error))
return FALSE;
+ if (!_client_installed_products_update (manager, error))
+ return FALSE;
_client_maybe__show_notification (manager);
/* success */
@@ -497,6 +617,8 @@ _client_register (GsdSubscriptionManager *manager,
return FALSE;
if (!_client_subscription_status_update (manager, error))
return FALSE;
+ if (!_client_installed_products_update (manager, error))
+ return FALSE;
_client_maybe__show_notification (manager);
return TRUE;
}
@@ -523,6 +645,8 @@ _client_unregister (GsdSubscriptionManager *manager, GError **error)
return FALSE;
if (!_client_subscription_status_update (manager, error))
return FALSE;
+ if (!_client_installed_products_update (manager, error))
+ return FALSE;
_client_maybe__show_notification (manager);
return TRUE;
}
@@ -575,6 +699,10 @@ _subman_proxy_signal_cb (GDBusProxy *proxy,
g_warning ("failed to update subscription status: %s", error->message);
g_clear_error (&error);
}
+ if (!_client_installed_products_update (manager, &error)) {
+ g_warning ("failed to update installed products: %s", error->message);
+ g_clear_error (&error);
+ }
_client_maybe__show_notification (manager);
}
@@ -640,6 +768,8 @@ _client_load (GsdSubscriptionManager *manager, GError **error)
return FALSE;
if (!_client_subscription_status_update (manager, error))
return FALSE;
+ if (!_client_installed_products_update (manager, error))
+ return FALSE;
if (!_client_syspurpose_update (manager, error))
return FALSE;
@@ -703,6 +833,7 @@ gsd_subscription_manager_init (GsdSubscriptionManager *manager)
{
GsdSubscriptionManagerPrivate *priv = manager->priv = GSD_SUBSCRIPTION_MANAGER_GET_PRIVATE (manager);
+ priv->installed_products = g_ptr_array_new_with_free_func ((GDestroyNotify) product_data_free);
priv->timer_last_notified = g_timer_new ();
/* expired */
@@ -767,6 +898,7 @@ gsd_subscription_manager_finalize (GObject *object)
g_clear_object (&manager->priv->bus_cancellable);
}
+ g_clear_pointer (&manager->priv->installed_products, g_ptr_array_unref);
g_clear_pointer (&manager->priv->introspection_data, g_dbus_node_info_unref);
g_clear_object (&manager->priv->connection);
g_clear_object (&manager->priv->notification_expired);
@@ -884,6 +1016,9 @@ handle_get_property (GDBusConnection *connection,
if (g_strcmp0 (property_name, "SubscriptionStatus") == 0)
return g_variant_new_uint32 (priv->subscription_status);
+ if (g_strcmp0 (property_name, "InstalledProducts") == 0)
+ return _make_installed_products_variant (priv->installed_products);
+
g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
"Failed to get property: %s", property_name);
return NULL;
--
2.21.0

@ -1,7 +1,68 @@
diff -urNp gnome-settings-daemon-3.32.0.old/meson.build gnome-settings-daemon-3.32.0/meson.build
--- gnome-settings-daemon-3.32.0.old/meson.build 2019-06-17 13:01:46.867338656 +0100
+++ gnome-settings-daemon-3.32.0/meson.build 2019-06-17 13:01:59.245311865 +0100
@@ -97,6 +97,7 @@ libcanberra_gtk_dep = dependency('libcan
From bee6d42503ec9b56f6e10704db02bcedb6a4fdf1 Mon Sep 17 00:00:00 2001
From: Richard Hughes <rhughes@redhat.com>
Date: Thu, 20 Aug 2020 11:16:09 -0400
Subject: [PATCH 01/15] subman: Add a new plugin to provide system subscription
registration
---
meson.build | 1 +
plugins/meson.build | 1 +
plugins/subman/README.md | 56 +
plugins/subman/gsd-subman-common.c | 36 +
plugins/subman/gsd-subman-common.h | 40 +
plugins/subman/gsd-subman-helper.c | 378 +++++++
plugins/subman/gsd-subscription-manager.c | 982 ++++++++++++++++++
plugins/subman/gsd-subscription-manager.h | 63 ++
plugins/subman/main.c | 8 +
plugins/subman/meson.build | 56 +
...ome.SettingsDaemon.Subscription.desktop.in | 9 +
...ettings-daemon.plugins.subman.policy.in.in | 27 +
...gnome.settings-daemon.plugins.subman.rules | 7 +
13 files changed, 1664 insertions(+)
create mode 100644 plugins/subman/README.md
create mode 100644 plugins/subman/gsd-subman-common.c
create mode 100644 plugins/subman/gsd-subman-common.h
create mode 100644 plugins/subman/gsd-subman-helper.c
create mode 100644 plugins/subman/gsd-subscription-manager.c
create mode 100644 plugins/subman/gsd-subscription-manager.h
create mode 100644 plugins/subman/main.c
create mode 100644 plugins/subman/meson.build
create mode 100644 plugins/subman/org.gnome.SettingsDaemon.Subscription.desktop.in
create mode 100644 plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in
create mode 100644 plugins/subman/org.gnome.settings-daemon.plugins.subman.rules
diff --git a/meson.build b/meson.build
index 1632ea05..27bf8c4c 100644
--- a/meson.build
+++ b/meson.build
@@ -70,60 +70,61 @@ if gsd_buildtype.contains('debug')
]
compiler_flags = cc.get_supported_arguments(test_cflags)
elif gsd_buildtype.contains('release')
common_flags += ['-DG_DISABLE_CAST_CHECKS']
endif
# Workaround for meson's bug
# https://github.com/mesonbuild/meson/pull/1896
if get_option('b_ndebug') == true
common_flags += ['-DG_DISABLE_ASSERT']
endif
add_project_arguments(common_flags + compiler_flags, language: 'c')
glib_dep = dependency('glib-2.0', version: '>= 2.56')
colord_dep = dependency('colord', version: '>= 1.0.2')
geocode_glib_dep = dependency('geocode-glib-1.0', version: '>= 3.10.0')
gio_dep = dependency('gio-2.0', version: '>= 2.53.0')
gio_unix_dep = dependency('gio-unix-2.0')
gnome_desktop_dep = dependency('gnome-desktop-3.0', version: '>= 3.11.1')
gsettings_desktop_dep = dependency('gsettings-desktop-schemas', version: '>= 3.27.90')
gtk_dep = dependency('gtk+-3.0', version: '>= 3.15.3')
gtk_x11_dep = dependency('gtk+-x11-3.0')
gweather_dep = dependency('gweather-3.0', version: '>= 3.9.5')
lcms_dep = dependency('lcms2', version: '>= 2.2')
libcanberra_gtk_dep = dependency('libcanberra-gtk3')
libgeoclue_dep = dependency('libgeoclue-2.0', version: '>= 2.3.1')
libnotify_dep = dependency('libnotify', version: '>= 0.7.3')
libpulse_mainloop_glib_dep = dependency('libpulse-mainloop-glib', version: '>= 2.0')
@ -9,10 +70,40 @@ diff -urNp gnome-settings-daemon-3.32.0.old/meson.build gnome-settings-daemon-3.
pango_dep = dependency('pango', version: '>= 1.20.0')
polkit_gobject_dep = dependency('polkit-gobject-1', version: '>= 0.103')
upower_glib_dep = dependency('upower-glib', version: '>= 0.99.0')
diff -urNp gnome-settings-daemon-3.32.0.old/plugins/meson.build gnome-settings-daemon-3.32.0/plugins/meson.build
--- gnome-settings-daemon-3.32.0.old/plugins/meson.build 2019-06-17 13:01:46.867338656 +0100
+++ gnome-settings-daemon-3.32.0/plugins/meson.build 2019-06-17 13:01:59.245311865 +0100
@@ -3,6 +3,7 @@ enabled_plugins = [
x11_dep = dependency('x11')
m_dep = cc.find_library('m')
dl_dep = cc.find_library('dl')
# ALSA integration (default enabled)
enable_alsa = get_option('alsa')
assert(enable_alsa or not host_is_linux, 'ALSA is not optional on Linux platforms')
libgvc = subproject(
'gvc',
default_options: [
'static=true',
'alsa=' + enable_alsa.to_string()
]
)
libgvc_dep = libgvc.get_variable('libgvc_dep')
# GUdev integration (default enabled)
enable_gudev = get_option('gudev')
if enable_gudev
gudev_dep = dependency('gudev-1.0')
endif
config_h.set10('HAVE_GUDEV', enable_gudev)
if host_is_linux
assert(enable_gudev, 'GUdev is not optional on Linux platforms')
endif
diff --git a/plugins/meson.build b/plugins/meson.build
index 3c4d42ac..4c9caf47 100644
--- a/plugins/meson.build
+++ b/plugins/meson.build
@@ -1,35 +1,36 @@
enabled_plugins = [
['a11y-settings', 'A11ySettings'],
['account', 'Account'],
['clipboard', 'Clipboard'],
['color', 'Color'],
@ -20,9 +111,100 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/meson.build gnome-settings-d
['datetime', 'Datetime'],
['dummy', ''],
['power', 'Power'],
diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subman-common.c gnome-settings-daemon-3.32.0/plugins/subman/gsd-subman-common.c
--- gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subman-common.c 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.32.0/plugins/subman/gsd-subman-common.c 2019-06-17 13:01:59.246311863 +0100
['housekeeping', 'Housekeeping'],
['keyboard', 'Keyboard'],
['media-keys', 'MediaKeys'],
['mouse', 'Mouse'],
['screensaver-proxy', 'ScreensaverProxy'],
['sharing', 'Sharing'],
['sound', 'Sound'],
['xsettings', 'XSettings']
]
if enable_smartcard
enabled_plugins += [['smartcard', 'Smartcard']]
endif
if enable_wacom
enabled_plugins += [['wacom', 'Wacom']]
endif
if enable_cups
enabled_plugins += [['print-notifications', 'PrintNotifications']]
endif
if enable_rfkill
enabled_plugins += [['rfkill', 'Rfkill']]
endif
plugins_conf = configuration_data()
diff --git a/plugins/subman/README.md b/plugins/subman/README.md
new file mode 100644
index 00000000..3e1cc3cd
--- /dev/null
+++ b/plugins/subman/README.md
@@ -0,0 +1,56 @@
+GNOME Settings Daemon: Subscription Manager Plugin
+==================================================
+
+Testing:
+
+To add a test acccount on subscription.rhsm.stage.redhat.com, use Ethel:
+http://account-manager-stage.app.eng.rdu2.redhat.com/#view
+
+Register with a username and password
+-------------------------------------
+
+ gdbus call \
+ --session \
+ --dest org.gnome.SettingsDaemon.Subscription \
+ --object-path /org/gnome/SettingsDaemon/Subscription \
+ --method org.gnome.SettingsDaemon.Subscription.Register "{'kind':<'username'>,'hostname':<'subscription.rhsm.stage.redhat.com'>,'username':<'rhughes_test'>,'password':<'barbaz'>}"
+
+To register with a certificate
+------------------------------
+
+ gdbus call \
+ --session \
+ --dest org.gnome.SettingsDaemon.Subscription \
+ --object-path /org/gnome/SettingsDaemon/Subscription \
+ --method org.gnome.SettingsDaemon.Subscription.Register "{'kind':<'key'>,'hostname':<'subscription.rhsm.stage.redhat.com'>,'organisation':<'foo'>,'activation-key':<'barbaz'>}"
+
+To unregister
+-------------
+
+ gdbus call \
+ --session \
+ --dest org.gnome.SettingsDaemon.Subscription \
+ --object-path /org/gnome/SettingsDaemon/Subscription \
+ --method org.gnome.SettingsDaemon.Subscription.Unregister
+
+Debugging
+---------
+
+Get the UNIX socket using `Subscription.Register` then call something like:
+
+ sudo G_MESSAGES_DEBUG=all ./plugins/subman/gsd-subman-helper \
+ --address="unix:abstract=/var/run/dbus-ulGB1wfnbn,guid=71e6bf329d861ce366df7a1d5d036a5b" \
+ --kind="register-with-username" \
+ --username="rhughes_test" \
+ --password="barbaz" \
+ --hostname="subscription.rhsm.stage.redhat.com" \
+ --organisation=""
+
+You can all see some basic debugging running `rhsmd` in the foreground:
+
+ sudo /usr/libexec/rhsmd -d -k
+
+Known Limitations
+=================
+
+Proxy servers are not supported, nor are custom host ports or prefixes.
diff --git a/plugins/subman/gsd-subman-common.c b/plugins/subman/gsd-subman-common.c
new file mode 100644
index 00000000..e515131e
--- /dev/null
+++ b/plugins/subman/gsd-subman-common.c
@@ -0,0 +1,36 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
@ -60,9 +242,11 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subman-common.c g
+ return "partially-valid";
+ return "unknown";
+}
diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subman-common.h gnome-settings-daemon-3.32.0/plugins/subman/gsd-subman-common.h
--- gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subman-common.h 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.32.0/plugins/subman/gsd-subman-common.h 2019-06-17 13:01:59.246311863 +0100
diff --git a/plugins/subman/gsd-subman-common.h b/plugins/subman/gsd-subman-common.h
new file mode 100644
index 00000000..fccf9f6a
--- /dev/null
+++ b/plugins/subman/gsd-subman-common.h
@@ -0,0 +1,40 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
@ -104,9 +288,11 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subman-common.h g
+G_END_DECLS
+
+#endif /* __GSD_SUBMAN_COMMON_H */
diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subman-helper.c gnome-settings-daemon-3.32.0/plugins/subman/gsd-subman-helper.c
--- gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subman-helper.c 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.32.0/plugins/subman/gsd-subman-helper.c 2019-06-17 13:01:59.247311860 +0100
diff --git a/plugins/subman/gsd-subman-helper.c b/plugins/subman/gsd-subman-helper.c
new file mode 100644
index 00000000..182f7190
--- /dev/null
+++ b/plugins/subman/gsd-subman-helper.c
@@ -0,0 +1,378 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
@ -486,10 +672,12 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subman-helper.c g
+
+ return EXIT_SUCCESS;
+}
diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subscription-manager.c gnome-settings-daemon-3.32.0/plugins/subman/gsd-subscription-manager.c
--- gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subscription-manager.c 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.32.0/plugins/subman/gsd-subscription-manager.c 2019-06-17 13:01:59.247311860 +0100
@@ -0,0 +1,998 @@
diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c
new file mode 100644
index 00000000..08b13fa6
--- /dev/null
+++ b/plugins/subman/gsd-subscription-manager.c
@@ -0,0 +1,982 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2019 Richard Hughes <richard@hughsie.com>
@ -566,7 +754,6 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subscription-mana
+ GHashTable *config; /* str:str */
+ gchar *address;
+
+ guint check_registration_timeout_id;
+ GTimer *timer_last_notified;
+ NotifyNotification *notification_expired;
+ NotifyNotification *notification_registered;
@ -613,6 +800,40 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subscription-mana
+ return GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN;
+}
+
+static void
+_emit_property_changed (GsdSubscriptionManager *manager,
+ const gchar *property_name,
+ GVariant *property_value)
+{
+ GsdSubscriptionManagerPrivate *priv = manager->priv;
+ GVariantBuilder builder;
+ GVariantBuilder invalidated_builder;
+
+ /* not yet connected */
+ if (priv->connection == NULL)
+ return;
+
+ /* build the dict */
+ g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
+ g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
+ g_variant_builder_add (&builder,
+ "{sv}",
+ property_name,
+ property_value);
+ g_dbus_connection_emit_signal (priv->connection,
+ NULL,
+ GSD_SUBSCRIPTION_DBUS_PATH,
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged",
+ g_variant_new ("(sa{sv}as)",
+ GSD_SUBSCRIPTION_DBUS_INTERFACE,
+ &builder,
+ &invalidated_builder),
+ NULL);
+ g_variant_builder_clear (&builder);
+ g_variant_builder_clear (&invalidated_builder);
+}
+
+static gboolean
+_client_subscription_status_update (GsdSubscriptionManager *manager, GError **error)
+{
@ -651,6 +872,13 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subscription-mana
+ status_txt = json_object_get_string_member (json_obj, "status");
+ g_debug ("Entitlement.GetStatus: %s", status_txt);
+ priv->subscription_status = _client_subscription_status_from_text (status_txt);
+
+ /* emit notification for g-c-c */
+ if (priv->subscription_status != priv->subscription_status_last) {
+ _emit_property_changed (manager, "SubscriptionStatus",
+ g_variant_new_uint32 (priv->subscription_status));
+ }
+
+ return TRUE;
+}
+
@ -1128,40 +1356,6 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subscription-mana
+}
+
+static void
+emit_property_changed (GsdSubscriptionManager *manager,
+ const gchar *property_name,
+ GVariant *property_value)
+{
+ GsdSubscriptionManagerPrivate *priv = manager->priv;
+ GVariantBuilder builder;
+ GVariantBuilder invalidated_builder;
+
+ /* not yet connected */
+ if (priv->connection == NULL)
+ return;
+
+ /* build the dict */
+ g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
+ g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
+ g_variant_builder_add (&builder,
+ "{sv}",
+ property_name,
+ property_value);
+ g_dbus_connection_emit_signal (priv->connection,
+ NULL,
+ GSD_SUBSCRIPTION_DBUS_PATH,
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged",
+ g_variant_new ("(sa{sv}as)",
+ GSD_SUBSCRIPTION_DBUS_INTERFACE,
+ &builder,
+ &invalidated_builder),
+ NULL);
+ g_variant_builder_clear (&builder);
+ g_variant_builder_clear (&invalidated_builder);
+}
+
+static void
+_launch_info_overview (void)
+{
+ const gchar *argv[] = { "gnome-control-center", "info-overview", NULL };
@ -1264,25 +1458,9 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subscription-mana
+ manager->priv->name_id = 0;
+ }
+
+ if (manager->priv->check_registration_timeout_id)
+ g_source_remove (manager->priv->check_registration_timeout_id);
+
+ G_OBJECT_CLASS (gsd_subscription_manager_parent_class)->finalize (object);
+}
+
+static gboolean
+nlight_forced_timeout_cb (gpointer user_data)
+{
+ GsdSubscriptionManager *manager = GSD_SUBSCRIPTION_MANAGER (user_data);
+ GsdSubscriptionManagerPrivate *priv = manager->priv;
+
+ priv->check_registration_timeout_id = 0;
+ emit_property_changed (manager, "SubscriptionStatus",
+ g_variant_new_boolean (TRUE));
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+handle_method_call (GDBusConnection *connection,
+ const gchar *sender,
@ -1294,11 +1472,9 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subscription-mana
+ gpointer user_data)
+{
+ GsdSubscriptionManager *manager = GSD_SUBSCRIPTION_MANAGER (user_data);
+ GsdSubscriptionManagerPrivate *priv = manager->priv;
+ g_autoptr(GError) error = NULL;
+
+ if (g_strcmp0 (method_name, "Register") == 0) {
+ guint32 duration = 0;
+ const gchar *organisation = NULL;
+ const gchar *hostname = NULL;
+
@ -1356,10 +1532,6 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subscription-mana
+
+ return;
+ }
+ if (priv->check_registration_timeout_id)
+ g_source_remove (priv->check_registration_timeout_id);
+ priv->check_registration_timeout_id = g_timeout_add_seconds (duration, nlight_forced_timeout_cb, manager);
+
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ } else if (g_strcmp0 (method_name, "Unregister") == 0) {
+ if (!_client_unregister (manager, &error)) {
@ -1488,9 +1660,11 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subscription-mana
+
+ return GSD_SUBSCRIPTION_MANAGER (manager_object);
+}
diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subscription-manager.h gnome-settings-daemon-3.32.0/plugins/subman/gsd-subscription-manager.h
--- gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subscription-manager.h 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.32.0/plugins/subman/gsd-subscription-manager.h 2019-06-17 13:01:59.248311858 +0100
diff --git a/plugins/subman/gsd-subscription-manager.h b/plugins/subman/gsd-subscription-manager.h
new file mode 100644
index 00000000..6a524b1b
--- /dev/null
+++ b/plugins/subman/gsd-subscription-manager.h
@@ -0,0 +1,63 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
@ -1555,9 +1729,11 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/gsd-subscription-mana
+G_END_DECLS
+
+#endif /* __GSD_SUBSCRIPTION_MANAGER_H */
diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/main.c gnome-settings-daemon-3.32.0/plugins/subman/main.c
--- gnome-settings-daemon-3.32.0.old/plugins/subman/main.c 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.32.0/plugins/subman/main.c 2019-06-17 13:01:59.248311858 +0100
diff --git a/plugins/subman/main.c b/plugins/subman/main.c
new file mode 100644
index 00000000..28ac995b
--- /dev/null
+++ b/plugins/subman/main.c
@@ -0,0 +1,8 @@
+#define NEW gsd_subscription_manager_new
+#define START gsd_subscription_manager_start
@ -1567,9 +1743,11 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/main.c gnome-settings
+#include "gsd-subscription-manager.h"
+
+#include "daemon-skeleton-gtk.h"
diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/meson.build gnome-settings-daemon-3.32.0/plugins/subman/meson.build
--- gnome-settings-daemon-3.32.0.old/plugins/subman/meson.build 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.32.0/plugins/subman/meson.build 2019-06-17 13:01:59.248311858 +0100
diff --git a/plugins/subman/meson.build b/plugins/subman/meson.build
new file mode 100644
index 00000000..bfd073b6
--- /dev/null
+++ b/plugins/subman/meson.build
@@ -0,0 +1,56 @@
+sources = files(
+ 'gsd-subscription-manager.c',
@ -1627,10 +1805,27 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/meson.build gnome-set
+ install_rpath: gsd_pkglibdir,
+ install_dir: gsd_libexecdir
+)
diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in gnome-settings-daemon-3.32.0/plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in
--- gnome-settings-daemon-3.32.0.old/plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.32.0/plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in 2019-06-17 13:01:59.248311858 +0100
@@ -0,0 +1,28 @@
diff --git a/plugins/subman/org.gnome.SettingsDaemon.Subscription.desktop.in b/plugins/subman/org.gnome.SettingsDaemon.Subscription.desktop.in
new file mode 100644
index 00000000..14fe5915
--- /dev/null
+++ b/plugins/subman/org.gnome.SettingsDaemon.Subscription.desktop.in
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Type=Application
+Name=GNOME Settings Daemon's subscription manager plugin
+Exec=@libexecdir@/gsd-subman
+OnlyShowIn=GNOME;
+NoDisplay=true
+X-GNOME-Autostart-Phase=Initialization
+X-GNOME-Autostart-Notify=true
+X-GNOME-AutoRestart=true
diff --git a/plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in b/plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in
new file mode 100644
index 00000000..59e9fdd4
--- /dev/null
+++ b/plugins/subman/org.gnome.settings-daemon.plugins.subman.policy.in.in
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE policyconfig PUBLIC
+ "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
@ -1658,10 +1853,11 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/org.gnome.settings-da
+ </action>
+
+</policyconfig>
+
diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/org.gnome.settings-daemon.plugins.subman.rules gnome-settings-daemon-3.32.0/plugins/subman/org.gnome.settings-daemon.plugins.subman.rules
--- gnome-settings-daemon-3.32.0.old/plugins/subman/org.gnome.settings-daemon.plugins.subman.rules 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.32.0/plugins/subman/org.gnome.settings-daemon.plugins.subman.rules 2019-06-17 13:01:59.248311858 +0100
diff --git a/plugins/subman/org.gnome.settings-daemon.plugins.subman.rules b/plugins/subman/org.gnome.settings-daemon.plugins.subman.rules
new file mode 100644
index 00000000..1ed3a0ea
--- /dev/null
+++ b/plugins/subman/org.gnome.settings-daemon.plugins.subman.rules
@@ -0,0 +1,7 @@
+polkit.addRule(function(action, subject) {
+ if (action.id == "org.gnome.settings-daemon.plugins.subman.register" &&
@ -1670,271 +1866,6 @@ diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/org.gnome.settings-da
+ return polkit.Result.YES;
+ }
+});
diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/org.gnome.SettingsDaemon.Subscription.desktop.in gnome-settings-daemon-3.32.0/plugins/subman/org.gnome.SettingsDaemon.Subscription.desktop.in
--- gnome-settings-daemon-3.32.0.old/plugins/subman/org.gnome.SettingsDaemon.Subscription.desktop.in 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.32.0/plugins/subman/org.gnome.SettingsDaemon.Subscription.desktop.in 2019-06-17 13:01:59.248311858 +0100
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Type=Application
+Name=GNOME Settings Daemon's subscription manager plugin
+Exec=@libexecdir@/gsd-subman
+OnlyShowIn=GNOME;
+NoDisplay=true
+X-GNOME-Autostart-Phase=Initialization
+X-GNOME-Autostart-Notify=true
+X-GNOME-AutoRestart=true
diff -urNp gnome-settings-daemon-3.32.0.old/plugins/subman/README.md gnome-settings-daemon-3.32.0/plugins/subman/README.md
--- gnome-settings-daemon-3.32.0.old/plugins/subman/README.md 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.32.0/plugins/subman/README.md 2019-06-17 13:01:59.246311863 +0100
@@ -0,0 +1,56 @@
+GNOME Settings Daemon: Subscription Manager Plugin
+==================================================
+
+Testing:
+
+To add a test acccount on subscription.rhsm.stage.redhat.com, use Ethel:
+http://account-manager-stage.app.eng.rdu2.redhat.com/#view
+
+Register with a username and password
+-------------------------------------
+
+ gdbus call \
+ --session \
+ --dest org.gnome.SettingsDaemon.Subscription \
+ --object-path /org/gnome/SettingsDaemon/Subscription \
+ --method org.gnome.SettingsDaemon.Subscription.Register "{'kind':<'username'>,'hostname':<'subscription.rhsm.stage.redhat.com'>,'username':<'rhughes_test'>,'password':<'barbaz'>}"
+
+To register with a certificate
+------------------------------
+
+ gdbus call \
+ --session \
+ --dest org.gnome.SettingsDaemon.Subscription \
+ --object-path /org/gnome/SettingsDaemon/Subscription \
+ --method org.gnome.SettingsDaemon.Subscription.Register "{'kind':<'key'>,'hostname':<'subscription.rhsm.stage.redhat.com'>,'organisation':<'foo'>,'activation-key':<'barbaz'>}"
+
+To unregister
+-------------
+
+ gdbus call \
+ --session \
+ --dest org.gnome.SettingsDaemon.Subscription \
+ --object-path /org/gnome/SettingsDaemon/Subscription \
+ --method org.gnome.SettingsDaemon.Subscription.Unregister
+
+Debugging
+---------
+
+Get the UNIX socket using `Subscription.Register` then call something like:
+
+ sudo G_MESSAGES_DEBUG=all ./plugins/subman/gsd-subman-helper \
+ --address="unix:abstract=/var/run/dbus-ulGB1wfnbn,guid=71e6bf329d861ce366df7a1d5d036a5b" \
+ --kind="register-with-username" \
+ --username="rhughes_test" \
+ --password="barbaz" \
+ --hostname="subscription.rhsm.stage.redhat.com" \
+ --organisation=""
+
+You can all see some basic debugging running `rhsmd` in the foreground:
+
+ sudo /usr/libexec/rhsmd -d -k
+
+Known Limitations
+=================
+
+Proxy servers are not supported, nor are custom host ports or prefixes.
From b35d9c75a7d9f51b24b86461a16dde323be91c2b Mon Sep 17 00:00:00 2001
From: Richard Hughes <richard@hughsie.com>
Date: Thu, 20 Jun 2019 15:14:29 +0100
Subject: [PATCH 1/2] f
---
plugins/subman/gsd-subscription-manager.c | 98 ++++++++++-------------
1 file changed, 41 insertions(+), 57 deletions(-)
diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c
index 0f6466f8..37e53ed9 100644
--- a/plugins/subman/gsd-subscription-manager.c
+++ b/plugins/subman/gsd-subscription-manager.c
@@ -74,7 +74,6 @@ struct GsdSubscriptionManagerPrivate
GHashTable *config; /* str:str */
gchar *address;
- guint check_registration_timeout_id;
GTimer *timer_last_notified;
NotifyNotification *notification_expired;
NotifyNotification *notification_registered;
@@ -121,6 +120,40 @@ _client_subscription_status_from_text (const gchar *status_txt)
return GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN;
}
+static void
+_emit_property_changed (GsdSubscriptionManager *manager,
+ const gchar *property_name,
+ GVariant *property_value)
+{
+ GsdSubscriptionManagerPrivate *priv = manager->priv;
+ GVariantBuilder builder;
+ GVariantBuilder invalidated_builder;
+
+ /* not yet connected */
+ if (priv->connection == NULL)
+ return;
+
+ /* build the dict */
+ g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
+ g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
+ g_variant_builder_add (&builder,
+ "{sv}",
+ property_name,
+ property_value);
+ g_dbus_connection_emit_signal (priv->connection,
+ NULL,
+ GSD_SUBSCRIPTION_DBUS_PATH,
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged",
+ g_variant_new ("(sa{sv}as)",
+ GSD_SUBSCRIPTION_DBUS_INTERFACE,
+ &builder,
+ &invalidated_builder),
+ NULL);
+ g_variant_builder_clear (&builder);
+ g_variant_builder_clear (&invalidated_builder);
+}
+
static gboolean
_client_subscription_status_update (GsdSubscriptionManager *manager, GError **error)
{
@@ -159,6 +192,13 @@ _client_subscription_status_update (GsdSubscriptionManager *manager, GError **er
status_txt = json_object_get_string_member (json_obj, "status");
g_debug ("Entitlement.GetStatus: %s", status_txt);
priv->subscription_status = _client_subscription_status_from_text (status_txt);
+
+ /* enit notification for g-c-c */
+ if (priv->subscription_status != priv->subscription_status_last) {
+ _emit_property_changed (manager, "SubscriptionStatus",
+ g_variant_new_uint32 (priv->subscription_status));
+ }
+
return TRUE;
}
@@ -635,40 +675,6 @@ gsd_subscription_manager_class_init (GsdSubscriptionManagerClass *klass)
g_type_class_add_private (klass, sizeof (GsdSubscriptionManagerPrivate));
}
-static void
-emit_property_changed (GsdSubscriptionManager *manager,
- const gchar *property_name,
- GVariant *property_value)
-{
- GsdSubscriptionManagerPrivate *priv = manager->priv;
- GVariantBuilder builder;
- GVariantBuilder invalidated_builder;
-
- /* not yet connected */
- if (priv->connection == NULL)
- return;
-
- /* build the dict */
- g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
- g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
- g_variant_builder_add (&builder,
- "{sv}",
- property_name,
- property_value);
- g_dbus_connection_emit_signal (priv->connection,
- NULL,
- GSD_SUBSCRIPTION_DBUS_PATH,
- "org.freedesktop.DBus.Properties",
- "PropertiesChanged",
- g_variant_new ("(sa{sv}as)",
- GSD_SUBSCRIPTION_DBUS_INTERFACE,
- &builder,
- &invalidated_builder),
- NULL);
- g_variant_builder_clear (&builder);
- g_variant_builder_clear (&invalidated_builder);
-}
-
static void
_launch_info_overview (void)
{
@@ -772,25 +778,9 @@ gsd_subscription_manager_finalize (GObject *object)
manager->priv->name_id = 0;
}
- if (manager->priv->check_registration_timeout_id)
- g_source_remove (manager->priv->check_registration_timeout_id);
-
G_OBJECT_CLASS (gsd_subscription_manager_parent_class)->finalize (object);
}
-static gboolean
-nlight_forced_timeout_cb (gpointer user_data)
-{
- GsdSubscriptionManager *manager = GSD_SUBSCRIPTION_MANAGER (user_data);
- GsdSubscriptionManagerPrivate *priv = manager->priv;
-
- priv->check_registration_timeout_id = 0;
- emit_property_changed (manager, "SubscriptionStatus",
- g_variant_new_boolean (TRUE));
-
- return G_SOURCE_REMOVE;
-}
-
static void
handle_method_call (GDBusConnection *connection,
const gchar *sender,
@@ -802,11 +792,9 @@ handle_method_call (GDBusConnection *connection,
gpointer user_data)
{
GsdSubscriptionManager *manager = GSD_SUBSCRIPTION_MANAGER (user_data);
- GsdSubscriptionManagerPrivate *priv = manager->priv;
g_autoptr(GError) error = NULL;
if (g_strcmp0 (method_name, "Register") == 0) {
- guint32 duration = 0;
const gchar *organisation = NULL;
const gchar *hostname = NULL;
@@ -864,10 +852,6 @@ handle_method_call (GDBusConnection *connection,
return;
}
- if (priv->check_registration_timeout_id)
- g_source_remove (priv->check_registration_timeout_id);
- priv->check_registration_timeout_id = g_timeout_add_seconds (duration, nlight_forced_timeout_cb, manager);
-
g_dbus_method_invocation_return_value (invocation, NULL);
} else if (g_strcmp0 (method_name, "Unregister") == 0) {
if (!_client_unregister (manager, &error)) {
--
2.21.0
From 3635202b7039cac15c258674e2170622ed0d5a42 Mon Sep 17 00:00:00 2001
From: Kalev Lember <klember@redhat.com>
Date: Tue, 25 Jun 2019 14:12:04 +0200
Subject: [PATCH 2/2] subman: trivial: Fix typo
---
plugins/subman/gsd-subscription-manager.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c
index 37e53ed9..08b13fa6 100644
--- a/plugins/subman/gsd-subscription-manager.c
+++ b/plugins/subman/gsd-subscription-manager.c
@@ -193,7 +193,7 @@ _client_subscription_status_update (GsdSubscriptionManager *manager, GError **er
g_debug ("Entitlement.GetStatus: %s", status_txt);
priv->subscription_status = _client_subscription_status_from_text (status_txt);
- /* enit notification for g-c-c */
+ /* emit notification for g-c-c */
if (priv->subscription_status != priv->subscription_status_last) {
_emit_property_changed (manager, "SubscriptionStatus",
g_variant_new_uint32 (priv->subscription_status));
--
2.21.0
2.30.0

@ -1,77 +0,0 @@
From 298355d8b3d5a85b99e74a06e936a0113797bf2a Mon Sep 17 00:00:00 2001
From: Kalev Lember <klember@redhat.com>
Date: Fri, 28 Jun 2019 18:10:36 +0200
Subject: [PATCH] subman: Increase RHSM dbus call timeouts
Increase the dbus timeouts to 5 minutes as the register/unregister calls
seem to routinely take more than a minute.
---
plugins/subman/gsd-subman-helper.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/plugins/subman/gsd-subman-helper.c b/plugins/subman/gsd-subman-helper.c
index 182f7190..af7a82e9 100644
--- a/plugins/subman/gsd-subman-helper.c
+++ b/plugins/subman/gsd-subman-helper.c
@@ -28,6 +28,8 @@
#include <gio/gio.h>
#include <json-glib/json-glib.h>
+#define DBUS_TIMEOUT 300000 /* 5 minutes */
+
static void
_helper_convert_error (const gchar *json_txt, GError **error)
{
@@ -94,7 +96,8 @@ _helper_unregister (GError **error)
proxy_options,
""), /* lang */
G_DBUS_CALL_FLAGS_NONE,
- -1, NULL, error);
+ DBUS_TIMEOUT,
+ NULL, error);
return res != NULL;
}
@@ -127,7 +130,8 @@ _helper_auto_attach (GError **error)
proxy_options,
""), /* lang */
G_DBUS_CALL_FLAGS_NONE,
- -1, NULL, error);
+ DBUS_TIMEOUT,
+ NULL, error);
if (res == NULL)
return FALSE;
g_variant_get (res, "(&s)", &str);
@@ -158,7 +162,8 @@ _helper_save_config (const gchar *key, const gchar *value, GError **error)
g_variant_new_string (value),
""), /* lang */
G_DBUS_CALL_FLAGS_NONE,
- -1, NULL, error);
+ DBUS_TIMEOUT,
+ NULL, error);
return res != NULL;
}
@@ -305,7 +310,8 @@ main (int argc, char *argv[])
subman_conopts,
userlang),
G_DBUS_CALL_FLAGS_NO_AUTO_START,
- -1, NULL, &error_local);
+ DBUS_TIMEOUT,
+ NULL, &error_local);
if (res == NULL) {
g_dbus_error_strip_remote_error (error_local);
_helper_convert_error (error_local->message, &error);
@@ -339,7 +345,8 @@ main (int argc, char *argv[])
subman_conopts,
userlang),
G_DBUS_CALL_FLAGS_NO_AUTO_START,
- -1, NULL, &error_local);
+ DBUS_TIMEOUT,
+ NULL, &error_local);
if (res == NULL) {
g_dbus_error_strip_remote_error (error_local);
_helper_convert_error (error_local->message, &error);
--
2.21.0

@ -0,0 +1,768 @@
From f723ed1078e050c4d966d40b2aea74970c74279c Mon Sep 17 00:00:00 2001
From: Kalev Lember <klember@redhat.com>
Date: Thu, 27 Jun 2019 16:12:00 +0200
Subject: [PATCH 02/15] subman: Add InstalledProducts dbus property for g-c-c
---
plugins/subman/gsd-subscription-manager.c | 135 ++++++++++++++++++++++
1 file changed, 135 insertions(+)
diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c
index 08b13fa6..a8c18a26 100644
--- a/plugins/subman/gsd-subscription-manager.c
+++ b/plugins/subman/gsd-subscription-manager.c
@@ -1,186 +1,304 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
*
* Copyright (C) 2019 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2019 Kalev Lember <klember@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*
*/
#include "config.h"
#include <glib/gi18n.h>
#include <gdk/gdk.h>
#include <gtk/gtk.h>
#include <json-glib/json-glib.h>
#include <libnotify/notify.h>
#include "gnome-settings-profile.h"
#include "gsd-subman-common.h"
#include "gsd-subscription-manager.h"
#define GSD_DBUS_NAME "org.gnome.SettingsDaemon"
#define GSD_DBUS_PATH "/org/gnome/SettingsDaemon"
#define GSD_DBUS_BASE_INTERFACE "org.gnome.SettingsDaemon"
#define GSD_SUBSCRIPTION_DBUS_NAME GSD_DBUS_NAME ".Subscription"
#define GSD_SUBSCRIPTION_DBUS_PATH GSD_DBUS_PATH "/Subscription"
#define GSD_SUBSCRIPTION_DBUS_INTERFACE GSD_DBUS_BASE_INTERFACE ".Subscription"
static const gchar introspection_xml[] =
"<node>"
" <interface name='org.gnome.SettingsDaemon.Subscription'>"
" <method name='Register'>"
" <arg type='a{sv}' name='options' direction='in'/>"
" </method>"
" <method name='Unregister'/>"
+" <property name='InstalledProducts' type='aa{sv}' access='read'/>"
" <property name='SubscriptionStatus' type='u' access='read'/>"
" </interface>"
"</node>";
#define GSD_SUBSCRIPTION_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_SUBSCRIPTION_MANAGER, GsdSubscriptionManagerPrivate))
typedef enum {
_RHSM_INTERFACE_CONFIG,
_RHSM_INTERFACE_REGISTER_SERVER,
_RHSM_INTERFACE_ATTACH,
_RHSM_INTERFACE_ENTITLEMENT,
_RHSM_INTERFACE_PRODUCTS,
_RHSM_INTERFACE_CONSUMER,
_RHSM_INTERFACE_SYSPURPOSE,
_RHSM_INTERFACE_LAST
} _RhsmInterface;
struct GsdSubscriptionManagerPrivate
{
/* D-Bus */
guint name_id;
GDBusNodeInfo *introspection_data;
GDBusConnection *connection;
GCancellable *bus_cancellable;
GDBusProxy *proxies[_RHSM_INTERFACE_LAST];
const gchar *userlang; /* owned by GLib internally */
GHashTable *config; /* str:str */
+ GPtrArray *installed_products;
gchar *address;
GTimer *timer_last_notified;
NotifyNotification *notification_expired;
NotifyNotification *notification_registered;
NotifyNotification *notification_registration_required;
GsdSubmanSubscriptionStatus subscription_status;
GsdSubmanSubscriptionStatus subscription_status_last;
};
enum {
PROP_0,
};
static void gsd_subscription_manager_class_init (GsdSubscriptionManagerClass *klass);
static void gsd_subscription_manager_init (GsdSubscriptionManager *subscription_manager);
static void gsd_subscription_manager_finalize (GObject *object);
G_DEFINE_TYPE (GsdSubscriptionManager, gsd_subscription_manager, G_TYPE_OBJECT)
+typedef struct
+{
+ gchar *product_name;
+ gchar *product_id;
+ gchar *version;
+ gchar *arch;
+ gchar *status;
+ gchar *starts;
+ gchar *ends;
+} ProductData;
+
+static void
+product_data_free (ProductData *product)
+{
+ g_free (product->product_name);
+ g_free (product->product_id);
+ g_free (product->version);
+ g_free (product->arch);
+ g_free (product->status);
+ g_free (product->starts);
+ g_free (product->ends);
+ g_free (product);
+}
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (ProductData, product_data_free);
+
static gpointer manager_object = NULL;
GQuark
gsd_subscription_manager_error_quark (void)
{
static GQuark quark = 0;
if (!quark)
quark = g_quark_from_static_string ("gsd_subscription_manager_error");
return quark;
}
static GsdSubmanSubscriptionStatus
_client_subscription_status_from_text (const gchar *status_txt)
{
if (g_strcmp0 (status_txt, "Unknown") == 0)
return GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN;
if (g_strcmp0 (status_txt, "Current") == 0)
return GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID;
if (g_strcmp0 (status_txt, "Invalid") == 0)
return GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID;
if (g_strcmp0 (status_txt, "Disabled") == 0)
return GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED;
if (g_strcmp0 (status_txt, "Insufficient") == 0)
return GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID;
g_warning ("Unknown subscription status: %s", status_txt); // 'Current'?
return GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN;
}
+static GVariant *
+_make_installed_products_variant (GPtrArray *installed_products)
+{
+ GVariantBuilder builder;
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}"));
+
+ for (guint i = 0; i < installed_products->len; i++) {
+ ProductData *product = g_ptr_array_index (installed_products, i);
+ g_auto(GVariantDict) dict;
+
+ g_variant_dict_init (&dict, NULL);
+
+ g_variant_dict_insert (&dict, "product-name", "s", product->product_name);
+ g_variant_dict_insert (&dict, "product-id", "s", product->product_id);
+ g_variant_dict_insert (&dict, "version", "s", product->version);
+ g_variant_dict_insert (&dict, "arch", "s", product->arch);
+ g_variant_dict_insert (&dict, "status", "s", product->status);
+ g_variant_dict_insert (&dict, "starts", "s", product->starts);
+ g_variant_dict_insert (&dict, "ends", "s", product->ends);
+
+ g_variant_builder_add_value (&builder, g_variant_dict_end (&dict));
+ }
+
+ return g_variant_builder_end (&builder);
+}
+
static void
_emit_property_changed (GsdSubscriptionManager *manager,
const gchar *property_name,
GVariant *property_value)
{
GsdSubscriptionManagerPrivate *priv = manager->priv;
GVariantBuilder builder;
GVariantBuilder invalidated_builder;
/* not yet connected */
if (priv->connection == NULL)
return;
/* build the dict */
g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
g_variant_builder_add (&builder,
"{sv}",
property_name,
property_value);
g_dbus_connection_emit_signal (priv->connection,
NULL,
GSD_SUBSCRIPTION_DBUS_PATH,
"org.freedesktop.DBus.Properties",
"PropertiesChanged",
g_variant_new ("(sa{sv}as)",
GSD_SUBSCRIPTION_DBUS_INTERFACE,
&builder,
&invalidated_builder),
NULL);
g_variant_builder_clear (&builder);
g_variant_builder_clear (&invalidated_builder);
}
+static gboolean
+_client_installed_products_update (GsdSubscriptionManager *manager, GError **error)
+{
+ GsdSubscriptionManagerPrivate *priv = manager->priv;
+ JsonNode *json_root;
+ JsonArray *json_products_array;
+ const gchar *json_txt = NULL;
+ g_autoptr(GVariant) val = NULL;
+ g_autoptr(JsonParser) json_parser = json_parser_new ();
+
+ val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_PRODUCTS],
+ "ListInstalledProducts",
+ g_variant_new ("(sa{sv}s)",
+ "" /* filter_string */,
+ NULL /* proxy_options */,
+ priv->userlang),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL, error);
+ if (val == NULL)
+ return FALSE;
+ g_variant_get (val, "(&s)", &json_txt);
+ g_debug ("Products.ListInstalledProducts JSON: %s", json_txt);
+ if (!json_parser_load_from_data (json_parser, json_txt, -1, error))
+ return FALSE;
+ json_root = json_parser_get_root (json_parser);
+ json_products_array = json_node_get_array (json_root);
+ if (json_products_array == NULL) {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA,
+ "no InstalledProducts array in %s", json_txt);
+ return FALSE;
+ }
+
+ g_ptr_array_set_size (priv->installed_products, 0);
+
+ for (guint i = 0; i < json_array_get_length (json_products_array); i++) {
+ JsonArray *json_product = json_array_get_array_element (json_products_array, i);
+ g_autoptr(ProductData) product = g_new0 (ProductData, 1);
+
+ if (json_product == NULL)
+ continue;
+ if (json_array_get_length (json_product) < 8) {
+ g_debug ("Unexpected number of array elements in InstalledProducts JSON");
+ continue;
+ }
+
+ product->product_name = g_strdup (json_array_get_string_element (json_product, 0));
+ product->product_id = g_strdup (json_array_get_string_element (json_product, 1));
+ product->version = g_strdup (json_array_get_string_element (json_product, 2));
+ product->arch = g_strdup (json_array_get_string_element (json_product, 3));
+ product->status = g_strdup (json_array_get_string_element (json_product, 4));
+ product->starts = g_strdup (json_array_get_string_element (json_product, 6));
+ product->ends = g_strdup (json_array_get_string_element (json_product, 7));
+
+ g_ptr_array_add (priv->installed_products, g_steal_pointer (&product));
+ }
+
+ /* emit notification for g-c-c */
+ _emit_property_changed (manager, "InstalledProducts",
+ _make_installed_products_variant (priv->installed_products));
+
+ return TRUE;
+}
+
static gboolean
_client_subscription_status_update (GsdSubscriptionManager *manager, GError **error)
{
GsdSubscriptionManagerPrivate *priv = manager->priv;
JsonNode *json_root;
JsonObject *json_obj;
const gchar *json_txt = NULL;
const gchar *status_txt = NULL;
g_autoptr(GVariant) val = NULL;
g_autoptr(JsonParser) json_parser = json_parser_new ();
/* save old value */
priv->subscription_status_last = priv->subscription_status;
val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_ENTITLEMENT],
"GetStatus",
g_variant_new ("(ss)",
"", /* assumed as 'now' */
priv->userlang),
G_DBUS_CALL_FLAGS_NONE,
-1, NULL, error);
if (val == NULL)
return FALSE;
g_variant_get (val, "(&s)", &json_txt);
g_debug ("Entitlement.GetStatus JSON: %s", json_txt);
if (!json_parser_load_from_data (json_parser, json_txt, -1, error))
return FALSE;
json_root = json_parser_get_root (json_parser);
json_obj = json_node_get_object (json_root);
if (!json_object_has_member (json_obj, "status")) {
@@ -423,185 +541,195 @@ _client_register_with_keys (GsdSubscriptionManager *manager,
GError **error)
{
GsdSubscriptionManagerPrivate *priv = manager->priv;
g_autoptr(GSubprocess) subprocess = NULL;
/* apparently: "we can't send registration credentials over the regular
* system or session bus since those aren't really locked down..." */
if (!_client_register_start (manager, error))
return FALSE;
g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper");
subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error,
"pkexec", LIBEXECDIR "/gsd-subman-helper",
"--kind", "register-with-key",
"--address", priv->address,
"--hostname", hostname,
"--organisation", organisation,
"--activation-key", activation_key,
NULL);
if (subprocess == NULL) {
g_prefix_error (error, "failed to find pkexec: ");
return FALSE;
}
if (!_client_subprocess_wait_check (subprocess, error))
return FALSE;
/* FIXME: also do on error? */
if (!_client_register_stop (manager, error))
return FALSE;
if (!_client_subscription_status_update (manager, error))
return FALSE;
+ if (!_client_installed_products_update (manager, error))
+ return FALSE;
_client_maybe__show_notification (manager);
/* success */
return TRUE;
}
static gboolean
_client_register (GsdSubscriptionManager *manager,
const gchar *hostname,
const gchar *organisation,
const gchar *username,
const gchar *password,
GError **error)
{
GsdSubscriptionManagerPrivate *priv = manager->priv;
g_autoptr(GSubprocess) subprocess = NULL;
/* fallback */
if (organisation == NULL)
organisation = "";
/* apparently: "we can't send registration credentials over the regular
* system or session bus since those aren't really locked down..." */
if (!_client_register_start (manager, error))
return FALSE;
g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper");
subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error,
"pkexec", LIBEXECDIR "/gsd-subman-helper",
"--kind", "register-with-username",
"--address", priv->address,
"--hostname", hostname,
"--organisation", organisation,
"--username", username,
"--password", password,
NULL);
if (subprocess == NULL) {
g_prefix_error (error, "failed to find pkexec: ");
return FALSE;
}
if (!_client_subprocess_wait_check (subprocess, error))
return FALSE;
/* FIXME: also do on error? */
if (!_client_register_stop (manager, error))
return FALSE;
if (!_client_subscription_status_update (manager, error))
return FALSE;
+ if (!_client_installed_products_update (manager, error))
+ return FALSE;
_client_maybe__show_notification (manager);
return TRUE;
}
static gboolean
_client_unregister (GsdSubscriptionManager *manager, GError **error)
{
g_autoptr(GSubprocess) subprocess = NULL;
/* apparently: "we can't send registration credentials over the regular
* system or session bus since those aren't really locked down..." */
if (!_client_register_start (manager, error))
return FALSE;
g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper");
subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error,
"pkexec", LIBEXECDIR "/gsd-subman-helper",
"--kind", "unregister",
NULL);
if (subprocess == NULL) {
g_prefix_error (error, "failed to find pkexec: ");
return FALSE;
}
if (!_client_subprocess_wait_check (subprocess, error))
return FALSE;
if (!_client_subscription_status_update (manager, error))
return FALSE;
+ if (!_client_installed_products_update (manager, error))
+ return FALSE;
_client_maybe__show_notification (manager);
return TRUE;
}
static gboolean
_client_update_config (GsdSubscriptionManager *manager, GError **error)
{
GsdSubscriptionManagerPrivate *priv = manager->priv;
g_autoptr(GVariant) val = NULL;
g_autoptr(GVariant) val_server = NULL;
g_autoptr(GVariantDict) dict = NULL;
GVariantIter iter;
gchar *key;
gchar *value;
val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_CONFIG],
"GetAll",
g_variant_new ("(s)", priv->userlang),
G_DBUS_CALL_FLAGS_NONE,
-1, NULL, error);
if (val == NULL)
return FALSE;
dict = g_variant_dict_new (g_variant_get_child_value (val, 0));
val_server = g_variant_dict_lookup_value (dict, "server", G_VARIANT_TYPE("a{ss}"));
if (val_server != NULL) {
g_variant_iter_init (&iter, val_server);
while (g_variant_iter_next (&iter, "{ss}", &key, &value)) {
g_debug ("%s=%s", key, value);
g_hash_table_insert (priv->config,
g_steal_pointer (&key),
g_steal_pointer (&value));
}
}
return TRUE;
}
static void
_subman_proxy_signal_cb (GDBusProxy *proxy,
const gchar *sender_name,
const gchar *signal_name,
GVariant *parameters,
GsdSubscriptionManager *manager)
{
g_autoptr(GError) error = NULL;
if (!_client_syspurpose_update (manager, &error)) {
g_warning ("failed to update syspurpose: %s", error->message);
g_clear_error (&error);
}
if (!_client_subscription_status_update (manager, &error)) {
g_warning ("failed to update subscription status: %s", error->message);
g_clear_error (&error);
}
+ if (!_client_installed_products_update (manager, &error)) {
+ g_warning ("failed to update installed products: %s", error->message);
+ g_clear_error (&error);
+ }
_client_maybe__show_notification (manager);
}
static void
_client_unload (GsdSubscriptionManager *manager)
{