diff --git a/js/ui/endSessionDialog.js b/js/ui/endSessionDialog.js index a7db08807..f4950ba84 100644 --- a/js/ui/endSessionDialog.js +++ b/js/ui/endSessionDialog.js @@ -231,14 +231,13 @@ 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); - }); + this._onPkOfflineProxyCreated.bind(this)); + this._powerProxy = new UPowerProxy(Gio.DBus.system, 'org.freedesktop.UPower', '/org/freedesktop/UPower', @@ -333,16 +332,33 @@ 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'); } + _onPkOfflineProxyCreated(proxy, error) { + 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())); + } + } + _onDestroy() { this._user.disconnect(this._userLoadedId); this._user.disconnect(this._userChangedId); @@ -387,7 +403,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 +513,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 +528,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 +543,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 +711,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 +744,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 || '');