PackageKit/505.patch

336 lines
12 KiB
Diff

From 02354c3a339b7f8d6661731f224e7ccf1fc34ddc Mon Sep 17 00:00:00 2001
From: Milan Crha <mcrha@redhat.com>
Date: Mon, 13 Sep 2021 19:57:12 +0200
Subject: [PATCH] pk-offline: Add flags to D-Bus invoking methods
That's currently to be able to set whether the method should be
interactive or not. The old functions call the methods as non-interactive.
Closes https://github.com/PackageKit/PackageKit/issues/504
---
client/pk-console.c | 4 +-
docs/api/PackageKit-sections.txt | 4 +
lib/packagekit-glib2/pk-offline.c | 104 ++++++++++++++++++++++++--
lib/packagekit-glib2/pk-offline.h | 31 ++++++++
lib/packagekit-glib2/pk-test-daemon.c | 4 +-
5 files changed, 138 insertions(+), 9 deletions(-)
diff --git a/client/pk-console.c b/client/pk-console.c
index 3d027e601..4fd620fec 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -2283,14 +2283,14 @@ main (int argc, char *argv[])
} else if (strcmp (mode, "offline-trigger") == 0) {
run_mainloop = FALSE;
- ret = pk_offline_trigger (PK_OFFLINE_ACTION_REBOOT, NULL, &error);
+ ret = pk_offline_trigger_with_flags (PK_OFFLINE_ACTION_REBOOT, PK_OFFLINE_FLAGS_INTERACTIVE, NULL, &error);
if (!ret)
ctx->retval = error->code;
} else if (strcmp (mode, "offline-cancel") == 0) {
run_mainloop = FALSE;
- ret = pk_offline_cancel (NULL, &error);
+ ret = pk_offline_cancel_with_flags (PK_OFFLINE_FLAGS_INTERACTIVE, NULL, &error);
if (!ret)
ctx->retval = error->code;
diff --git a/docs/api/PackageKit-sections.txt b/docs/api/PackageKit-sections.txt
index ead052f92..2020bd65d 100644
--- a/docs/api/PackageKit-sections.txt
+++ b/docs/api/PackageKit-sections.txt
@@ -525,9 +525,13 @@ pk_offline_get_action_monitor
pk_offline_get_results
pk_offline_get_results_mtime
pk_offline_cancel
+pk_offline_cancel_with_flags
pk_offline_clear_results
+pk_offline_clear_results_with_flags
pk_offline_trigger
+pk_offline_trigger_with_flags
pk_offline_trigger_upgrade
+pk_offline_trigger_upgrade_with_flags
</SECTION>
<SECTION>
diff --git a/lib/packagekit-glib2/pk-offline.c b/lib/packagekit-glib2/pk-offline.c
index 2e3870580..9030be293 100644
--- a/lib/packagekit-glib2/pk-offline.c
+++ b/lib/packagekit-glib2/pk-offline.c
@@ -95,6 +95,14 @@ pk_offline_action_from_string (const gchar *action)
return PK_OFFLINE_ACTION_UNKNOWN;
}
+static GDBusCallFlags
+pk_offline_flags_to_gdbus_call_flags (PkOfflineFlags flags)
+{
+ if ((flags & PK_OFFLINE_FLAGS_INTERACTIVE) != 0)
+ return G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION;
+ return G_DBUS_CALL_FLAGS_NONE;
+}
+
/**
* pk_offline_cancel:
* @cancellable: A #GCancellable or %NULL
@@ -102,6 +110,8 @@ pk_offline_action_from_string (const gchar *action)
*
* Cancels the offline operation that has been scheduled. If there is no
* scheduled offline operation then this method returns with success.
+ * The function always allows user interaction. To change the behavior,
+ * use pk_offline_cancel_with_flags().
*
* Return value: %TRUE for success, else %FALSE and @error set
*
@@ -109,6 +119,25 @@ pk_offline_action_from_string (const gchar *action)
**/
gboolean
pk_offline_cancel (GCancellable *cancellable, GError **error)
+{
+ return pk_offline_cancel_with_flags (PK_OFFLINE_FLAGS_INTERACTIVE, cancellable, error);
+}
+
+/**
+ * pk_offline_cancel_with_flags:
+ * @flags: bit-or of #PkOfflineFlags
+ * @cancellable: A #GCancellable or %NULL
+ * @error: A #GError or %NULL
+ *
+ * Cancels the offline operation that has been scheduled. If there is no
+ * scheduled offline operation then this method returns with success.
+ *
+ * Return value: %TRUE for success, else %FALSE and @error set
+ *
+ * Since: 1.2.5
+ **/
+gboolean
+pk_offline_cancel_with_flags (PkOfflineFlags flags, GCancellable *cancellable, GError **error)
{
g_autoptr(GDBusConnection) connection = NULL;
g_autoptr(GVariant) res = NULL;
@@ -125,7 +154,7 @@ pk_offline_cancel (GCancellable *cancellable, GError **error)
"Cancel",
NULL,
NULL,
- G_DBUS_CALL_FLAGS_NONE,
+ pk_offline_flags_to_gdbus_call_flags (flags),
-1,
cancellable,
error);
@@ -139,8 +168,10 @@ pk_offline_cancel (GCancellable *cancellable, GError **error)
* @cancellable: A #GCancellable or %NULL
* @error: A #GError or %NULL
*
- * Crears the last offline operation report, which may be success or failure.
+ * Clears the last offline operation report, which may be success or failure.
* If the report does not exist then this method returns success.
+ * The function always allows user interaction. To change the behavior,
+ * use pk_offline_clear_results_with_flags().
*
* Return value: %TRUE for success, else %FALSE and @error set
*
@@ -148,6 +179,25 @@ pk_offline_cancel (GCancellable *cancellable, GError **error)
**/
gboolean
pk_offline_clear_results (GCancellable *cancellable, GError **error)
+{
+ return pk_offline_clear_results_with_flags (PK_OFFLINE_FLAGS_INTERACTIVE, cancellable, error);
+}
+
+/**
+ * pk_offline_clear_results_with_flags:
+ * @flags: bit-or of #PkOfflineFlags
+ * @cancellable: A #GCancellable or %NULL
+ * @error: A #GError or %NULL
+ *
+ * Clears the last offline operation report, which may be success or failure.
+ * If the report does not exist then this method returns success.
+ *
+ * Return value: %TRUE for success, else %FALSE and @error set
+ *
+ * Since: 1.2.5
+ **/
+gboolean
+pk_offline_clear_results_with_flags (PkOfflineFlags flags, GCancellable *cancellable, GError **error)
{
g_autoptr(GDBusConnection) connection = NULL;
g_autoptr(GVariant) res = NULL;
@@ -164,7 +214,7 @@ pk_offline_clear_results (GCancellable *cancellable, GError **error)
"ClearResults",
NULL,
NULL,
- G_DBUS_CALL_FLAGS_NONE,
+ pk_offline_flags_to_gdbus_call_flags (flags),
-1,
cancellable,
error);
@@ -181,6 +231,8 @@ pk_offline_clear_results (GCancellable *cancellable, GError **error)
*
* Triggers the offline update so that the next reboot will perform the
* pending transaction.
+ * The function always allows user interaction. To change the behavior,
+ * use pk_offline_trigger_with_flags().
*
* Return value: %TRUE for success, else %FALSE and @error set
*
@@ -188,6 +240,26 @@ pk_offline_clear_results (GCancellable *cancellable, GError **error)
**/
gboolean
pk_offline_trigger (PkOfflineAction action, GCancellable *cancellable, GError **error)
+{
+ return pk_offline_trigger_with_flags (action, PK_OFFLINE_FLAGS_INTERACTIVE, cancellable, error);
+}
+
+/**
+ * pk_offline_trigger_with_flags:
+ * @action: a #PkOfflineAction, e.g. %PK_OFFLINE_ACTION_REBOOT
+ * @flags: bit-or of #PkOfflineFlags
+ * @cancellable: A #GCancellable or %NULL
+ * @error: A #GError or %NULL
+ *
+ * Triggers the offline update so that the next reboot will perform the
+ * pending transaction.
+ *
+ * Return value: %TRUE for success, else %FALSE and @error set
+ *
+ * Since: 1.2.5
+ **/
+gboolean
+pk_offline_trigger_with_flags (PkOfflineAction action, PkOfflineFlags flags, GCancellable *cancellable, GError **error)
{
const gchar *tmp;
g_autoptr(GDBusConnection) connection = NULL;
@@ -206,7 +278,7 @@ pk_offline_trigger (PkOfflineAction action, GCancellable *cancellable, GError **
"Trigger",
g_variant_new ("(s)", tmp),
NULL,
- G_DBUS_CALL_FLAGS_NONE,
+ pk_offline_flags_to_gdbus_call_flags (flags),
-1,
cancellable,
error);
@@ -223,6 +295,8 @@ pk_offline_trigger (PkOfflineAction action, GCancellable *cancellable, GError **
*
* Triggers the offline system upgrade so that the next reboot will perform the
* pending transaction.
+ * The function always allows user interaction. To change the behavior,
+ * use pk_offline_trigger_upgrade_with_flags().
*
* Return value: %TRUE for success, else %FALSE and @error set
*
@@ -230,6 +304,26 @@ pk_offline_trigger (PkOfflineAction action, GCancellable *cancellable, GError **
**/
gboolean
pk_offline_trigger_upgrade (PkOfflineAction action, GCancellable *cancellable, GError **error)
+{
+ return pk_offline_trigger_upgrade_with_flags (action, PK_OFFLINE_FLAGS_INTERACTIVE, cancellable, error);
+}
+
+/**
+ * pk_offline_trigger_upgrade_with_flags:
+ * @action: a #PkOfflineAction, e.g. %PK_OFFLINE_ACTION_REBOOT
+ * @flags: bit-or of #PkOfflineFlags
+ * @cancellable: A #GCancellable or %NULL
+ * @error: A #GError or %NULL
+ *
+ * Triggers the offline system upgrade so that the next reboot will perform the
+ * pending transaction.
+ *
+ * Return value: %TRUE for success, else %FALSE and @error set
+ *
+ * Since: 1.2.5
+ **/
+gboolean
+pk_offline_trigger_upgrade_with_flags (PkOfflineAction action, PkOfflineFlags flags, GCancellable *cancellable, GError **error)
{
const gchar *tmp;
g_autoptr(GDBusConnection) connection = NULL;
@@ -248,7 +342,7 @@ pk_offline_trigger_upgrade (PkOfflineAction action, GCancellable *cancellable, G
"TriggerUpgrade",
g_variant_new ("(s)", tmp),
NULL,
- G_DBUS_CALL_FLAGS_NONE,
+ pk_offline_flags_to_gdbus_call_flags (flags),
-1,
cancellable,
error);
diff --git a/lib/packagekit-glib2/pk-offline.h b/lib/packagekit-glib2/pk-offline.h
index e85179823..943e9a13b 100644
--- a/lib/packagekit-glib2/pk-offline.h
+++ b/lib/packagekit-glib2/pk-offline.h
@@ -71,6 +71,21 @@ typedef enum
PK_OFFLINE_ERROR_LAST
} PkOfflineError;
+/**
+ * PkOfflineFlags:
+ * @PK_OFFLINE_FLAGS_NONE: No specific flag
+ * @PK_OFFLINE_FLAGS_INTERACTIVE: Run the action in an interactive mode, allowing polkit authentication dialogs
+ *
+ * Flags to be used for the method invocations.
+ *
+ * Since: 1.2.5
+ */
+typedef enum
+{
+ PK_OFFLINE_FLAGS_NONE = 0,
+ PK_OFFLINE_FLAGS_INTERACTIVE = 1 << 0
+} PkOfflineFlags;
+
GQuark pk_offline_error_quark (void);
const gchar *pk_offline_action_to_string (PkOfflineAction action);
PkOfflineAction pk_offline_action_from_string (const gchar *action);
@@ -92,14 +107,30 @@ PkResults *pk_offline_get_results (GError **error);
guint64 pk_offline_get_results_mtime (GError **error);
gboolean pk_offline_cancel (GCancellable *cancellable,
GError **error);
+gboolean pk_offline_cancel_with_flags (PkOfflineFlags flags,
+ GCancellable *cancellable,
+ GError **error);
gboolean pk_offline_clear_results (GCancellable *cancellable,
GError **error);
+gboolean pk_offline_clear_results_with_flags
+ (PkOfflineFlags flags,
+ GCancellable *cancellable,
+ GError **error);
gboolean pk_offline_trigger (PkOfflineAction action,
GCancellable *cancellable,
GError **error);
+gboolean pk_offline_trigger_with_flags (PkOfflineAction action,
+ PkOfflineFlags flags,
+ GCancellable *cancellable,
+ GError **error);
gboolean pk_offline_trigger_upgrade (PkOfflineAction action,
GCancellable *cancellable,
GError **error);
+gboolean pk_offline_trigger_upgrade_with_flags
+ (PkOfflineAction action,
+ PkOfflineFlags flags,
+ GCancellable *cancellable,
+ GError **error);
G_END_DECLS
diff --git a/lib/packagekit-glib2/pk-test-daemon.c b/lib/packagekit-glib2/pk-test-daemon.c
index efa762077..b2917b07d 100644
--- a/lib/packagekit-glib2/pk-test-daemon.c
+++ b/lib/packagekit-glib2/pk-test-daemon.c
@@ -154,7 +154,7 @@ pk_test_offline_func (void)
g_assert_cmpstr (data, ==, "powertop;1.8-1.fc8;i386;fedora");
/* trigger */
- ret = pk_offline_trigger (PK_OFFLINE_ACTION_REBOOT, NULL, &error);
+ ret = pk_offline_trigger_with_flags (PK_OFFLINE_ACTION_REBOOT, PK_OFFLINE_FLAGS_INTERACTIVE, NULL, &error);
g_assert_no_error (error);
g_assert (ret);
g_assert (g_file_test (PK_OFFLINE_PREPARED_FILENAME, G_FILE_TEST_EXISTS));
@@ -163,7 +163,7 @@ pk_test_offline_func (void)
g_assert (!g_file_test (PK_OFFLINE_RESULTS_FILENAME, G_FILE_TEST_EXISTS));
/* cancel the trigger */
- ret = pk_offline_cancel (NULL, &error);
+ ret = pk_offline_cancel_with_flags (PK_OFFLINE_FLAGS_INTERACTIVE, NULL, &error);
g_assert_no_error (error);
g_assert (ret);
g_assert (g_file_test (PK_OFFLINE_PREPARED_FILENAME, G_FILE_TEST_EXISTS));