[gnome-shell/issue369] endSessionDialog: Check for PackageKit before considering updates/upgrades



commit 01d4a53feccf5a4ff4a68aaf405606047bae59ae
Author: Mario Sanchez Prada <mario igalia com>
Date:   Mon Jul 8 08:51:36 2019 +0200

    endSessionDialog: Check for PackageKit before considering updates/upgrades
    
    GNOME Shell is spitting out some errors in the journal due to its attempts
    to speak to PackageKit, which is not present on Endless OS, so let's add
    some runtime checks to make sure that PackageKit is actually available
    before assuming so and using its proxy to decide which kind of UI to
    show to the user when ending the session.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/issues/369

 js/ui/endSessionDialog.js | 58 +++++++++++++++++++++++++++++++++++++----------
 1 file changed, 46 insertions(+), 12 deletions(-)
---
diff --git a/js/ui/endSessionDialog.js b/js/ui/endSessionDialog.js
index a7db08807..183fa70b8 100644
--- a/js/ui/endSessionDialog.js
+++ b/js/ui/endSessionDialog.js
@@ -231,13 +231,32 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
         this._loginManager = LoginManager.getLoginManager();
         this._userManager = AccountsService.UserManager.get_default();
         this._user = this._userManager.get_user(GLib.get_user_name());
+        this._updatesPermission = null;
 
         this._pkOfflineProxy = new PkOfflineProxy(Gio.DBus.system,
                                                   'org.freedesktop.PackageKit',
                                                   '/org/freedesktop/PackageKit',
                                                   (proxy, error) => {
-                                                      if (error)
-                                                          log(error.message);
+                                                      if (error) {
+                                                           log(error.message);
+                                                          return;
+                                                      }
+
+                                                      // Creating a D-Bus proxy won't propagate 
SERVICE_UNKNOWN or NAME_HAS_NO_OWNER
+                                                      // errors if PackageKit is not available, but the GIO 
implementation will make
+                                                      // sure in that case that the proxy's g-name-owner is 
set to null, so check that.
+                                                      if (this._pkOfflineProxy.g_name_owner === null) {
+                                                          this._pkOfflineProxy = null;
+                                                          return;
+                                                      }
+
+                                                      // It only makes sense to check for this permission if 
PackageKit is available.
+                                                      try {
+                                                          this._updatesPermission =
+                                                              
Polkit.Permission.new_sync("org.freedesktop.packagekit.trigger-offline-update", null, null);
+                                                      } catch(e) {
+                                                          log('No permission to trigger offline updates: 
%s'.format(e.toString()));
+                                                      }
                                                   });
         this._powerProxy = new UPowerProxy(Gio.DBus.system,
                                            'org.freedesktop.UPower',
@@ -333,12 +352,6 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
         this._inhibitorSection.add_actor(this._sessionHeader);
         this._inhibitorSection.add_actor(this._sessionList);
 
-        try {
-            this._updatesPermission = 
Polkit.Permission.new_sync("org.freedesktop.packagekit.trigger-offline-update", null, null);
-        } catch (e) {
-            log('No permission to trigger offline updates: %s'.format(e.toString()));
-        }
-
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
     }
@@ -387,7 +400,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
         }
 
         // Use a different description when we are installing a system upgrade
-        if (dialogContent.upgradeDescription) {
+        // if the PackageKit proxy is available (i.e. PackageKit is available).
+        if (this._pkOfflineProxy && dialogContent.upgradeDescription) {
             let name = this._pkOfflineProxy.PreparedUpgrade['name'].deep_unpack();
             let version = this._pkOfflineProxy.PreparedUpgrade['version'].deep_unpack();
 
@@ -496,6 +510,12 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
     }
 
     _triggerOfflineUpdateReboot(callback) {
+        // Handle this gracefully if PackageKit is not available.
+        if (!this._pkOfflineProxy) {
+            callback();
+            return;
+        }
+
         this._pkOfflineProxy.TriggerRemote('reboot', (result, error) => {
             if (error)
                 log(error.message);
@@ -505,6 +525,12 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
     }
 
     _triggerOfflineUpdateShutdown(callback) {
+        // Handle this gracefully if PackageKit is not available.
+        if (!this._pkOfflineProxy) {
+            callback();
+            return;
+        }
+
         this._pkOfflineProxy.TriggerRemote('power-off', (result, error) => {
             if (error)
                 log(error.message);
@@ -514,6 +540,12 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
     }
 
     _triggerOfflineUpdateCancel(callback) {
+        // Handle this gracefully if PackageKit is not available.
+        if (!this._pkOfflineProxy) {
+            callback();
+            return;
+        }
+
         this._pkOfflineProxy.CancelRemote((result, error) => {
             if (error)
                 log(error.message);
@@ -676,7 +708,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
         this._totalSecondsToStayOpen = totalSecondsToStayOpen;
         this._type = type;
 
-        if (this._type == DialogType.RESTART) {
+        // Only consider updates and upgrades if PackageKit is available.
+        if (this._pkOfflineProxy && this._type == DialogType.RESTART) {
             if (this._pkOfflineProxy.UpdateTriggered)
                 this._type = DialogType.UPDATE_RESTART;
             else if (this._pkOfflineProxy.UpgradeTriggered)
@@ -708,8 +741,9 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
         if (dialogContent.showOtherSessions)
             this._loadSessions();
 
-        let updateTriggered = this._pkOfflineProxy.UpdateTriggered;
-        let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
+        // Only consider updates and upgrades if PackageKit is available.
+        let updateTriggered = this._pkOfflineProxy ? this._pkOfflineProxy.UpdateTriggered : false;
+        let updatePrepared = this._pkOfflineProxy ? this._pkOfflineProxy.UpdatePrepared : false;
         let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
 
         _setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText || '');


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