diff options
author | 2023-08-26 16:01:54 +0600 | |
---|---|---|
committer | 2023-08-26 16:01:54 +0600 | |
commit | 22b47d8f27c3d4558f1df2d79cad7a63fd7cc871 (patch) | |
tree | 4f9e55dec008a3f1de61cabfb577fe254ae6e36e /debian | |
parent | 70faa8e9a0ff3cba74b4f753e257d56b768fcbd2 (diff) | |
download | aptdaemon-22b47d8f27c3d4558f1df2d79cad7a63fd7cc871.tar.gz aptdaemon-22b47d8f27c3d4558f1df2d79cad7a63fd7cc871.zip |
Drop unused patches
Signed-off-by: Mubashshir <ahm@jadupc.com>
Diffstat (limited to '')
35 files changed, 0 insertions, 3907 deletions
diff --git a/debian/patches/CVE-2020-15703.patch b/debian/patches/CVE-2020-15703.patch deleted file mode 100644 index caf9360..0000000 --- a/debian/patches/CVE-2020-15703.patch +++ /dev/null @@ -1,16 +0,0 @@ -Description: Reject locales with full path - _parse_localename() treats "/tmp/a." as a locale with language "/tmp/a" and - empty region, so add an extra safety check. -Author: Julian Andres Klode <juliank@ubuntu.com> -Bug: https://bugs.launchpad.net/ubuntu/+source/aptdaemon/+bug/1888235 ---- a/aptdaemon/core.py -+++ b/aptdaemon/core.py -@@ -821,6 +821,8 @@ class Transaction(DBusObject): - """ - if self.status != enums.STATUS_SETTING_UP: - raise errors.TransactionAlreadyRunning() -+ if "/" in str(locale_str): -+ raise ValueError("Security exception: Absolute path for locale") - try: - # ensure locale string is str() and not dbus.String() - (lang, encoding) = locale._parse_localename(str(locale_str)) diff --git a/debian/patches/CVE-2020-16128.patch b/debian/patches/CVE-2020-16128.patch deleted file mode 100644 index 4e10f9f..0000000 --- a/debian/patches/CVE-2020-16128.patch +++ /dev/null @@ -1,166 +0,0 @@ -Description: Fix file existence disclosures (CVE-2020-16128) - Move set_euid_egid into aptdaemon.utils and use it when setting - Terminal and DebConfSocket properties, to ensure our checks only - have access to the same objects the user has. - . - Rewrite the checks so that they avoid extra os.access lookups and - have correct error handling for os.open() in the terminal, and - os.stat() in the debconf case. -Author: Julian Andres Klode <juliank@ubuntu.com> -Bug-Ubuntu: https://bugs.launchpad.net/bugs/1899513 ---- a/aptdaemon/core.py -+++ b/aptdaemon/core.py -@@ -60,7 +60,7 @@ from . import enums - from defer import inline_callbacks, return_value, Deferred - from defer.utils import dbus_deferred_method - from . import policykit1 --from .utils import split_package_id -+from .utils import split_package_id, set_euid_egid - from .worker import DummyWorker - from .worker.aptworker import (AptWorker, - trans_only_installs_pkgs_from_high_trust_repos) -@@ -1107,24 +1107,28 @@ class Transaction(DBusObject): - """ - if self.status != enums.STATUS_SETTING_UP: - raise errors.TransactionAlreadyRunning() -- if not os.access(ttyname, os.W_OK): -- raise errors.AptDaemonError("Pty device does not exist: " -- "%s" % ttyname) -- if not os.stat(ttyname)[4] == self.uid: -- raise errors.AptDaemonError("Pty device '%s' has to be owned by" -- "the owner of the transaction " -- "(uid %s) " % (ttyname, self.uid)) -- if os.path.dirname(ttyname) != "/dev/pts": -- raise errors.AptDaemonError("%s isn't a tty" % ttyname) -- try: -- slave_fd = os.open(ttyname, os.O_RDWR | os.O_NOCTTY) -- if os.isatty(slave_fd): -- self.terminal = dbus.String(ttyname) -- self.PropertyChanged("Terminal", self.terminal) -- else: -+ with set_euid_egid(self.uid, self.gid): -+ if os.path.dirname(ttyname) != "/dev/pts": - raise errors.AptDaemonError("%s isn't a tty" % ttyname) -- finally: -- os.close(slave_fd) -+ -+ slave_fd = None -+ try: -+ slave_fd = os.open(ttyname, os.O_RDWR | os.O_NOCTTY) -+ except Exception: -+ raise errors.AptDaemonError("Could not open %s" % ttyname) -+ else: -+ if os.fstat(slave_fd).st_uid != self.uid: -+ raise errors.AptDaemonError("Pty device '%s' has to be owned by" -+ "the owner of the transaction " -+ "(uid %s) " % (ttyname, self.uid)) -+ if os.isatty(slave_fd): -+ self.terminal = dbus.String(ttyname) -+ self.PropertyChanged("Terminal", self.terminal) -+ else: -+ raise errors.AptDaemonError("%s isn't a tty" % ttyname) -+ finally: -+ if slave_fd is not None: -+ os.close(slave_fd) - - def _set_debconf(self, debconf_socket): - """Set the socket of the debconf proxy. -@@ -1140,13 +1144,17 @@ class Transaction(DBusObject): - """ - if self.status != enums.STATUS_SETTING_UP: - raise errors.TransactionAlreadyRunning() -- if not os.access(debconf_socket, os.W_OK): -- raise errors.AptDaemonError("socket does not exist: " -- "%s" % debconf_socket) -- if not os.stat(debconf_socket)[4] == self.uid: -- raise errors.AptDaemonError("socket '%s' has to be owned by the " -- "owner of the " -- "transaction" % debconf_socket) -+ with set_euid_egid(self.uid, self.gid): -+ try: -+ stat = os.stat(debconf_socket) -+ except Exception: -+ raise errors.AptDaemonError("socket status could not be read: " -+ "%s" % debconf_socket) -+ else: -+ if stat.st_uid != self.uid: -+ raise errors.AptDaemonError("socket '%s' has to be owned by the " -+ "owner of the " -+ "transaction" % debconf_socket) - self.debconf = dbus.String(debconf_socket) - self.PropertyChanged("DebconfSocket", self.debconf) - ---- a/aptdaemon/worker/aptworker.py -+++ b/aptdaemon/worker/aptworker.py -@@ -58,6 +58,7 @@ from . import BaseWorker - from ..enums import * - from ..errors import * - from .. import lock -+from ..utils import set_euid_egid - from ..progress import ( - DaemonOpenProgress, - DaemonInstallProgress, -@@ -90,25 +91,6 @@ USE_HTTP="yes" - """ - - --@contextlib.contextmanager --def set_euid_egid(uid, gid): -- # no need to drop privs -- if os.getuid() != 0 and os.getgid() != 0: -- yield -- return -- # temporary drop privs -- os.setegid(gid) -- old_groups = os.getgroups() -- os.setgroups([gid]) -- os.seteuid(uid) -- try: -- yield -- finally: -- os.seteuid(os.getuid()) -- os.setegid(os.getgid()) -- os.setgroups(old_groups) -- -- - def trans_only_installs_pkgs_from_high_trust_repos(trans, - whitelist=set()): - """Return True if this transaction only touches packages in the ---- a/aptdaemon/utils.py -+++ b/aptdaemon/utils.py -@@ -24,7 +24,9 @@ __author__ = "Sebastian Heinlein <devel@ - - __all__ = ("deprecated", "IsoCodes") - -+import os - import sys -+import contextlib - import gettext - import functools - import warnings -@@ -58,6 +60,25 @@ def deprecated(func): - return new_func - - -+@contextlib.contextmanager -+def set_euid_egid(uid, gid): -+ # no need to drop privs -+ if os.getuid() != 0 and os.getgid() != 0: -+ yield -+ return -+ # temporary drop privs -+ os.setegid(gid) -+ old_groups = os.getgroups() -+ os.setgroups([gid]) -+ os.seteuid(uid) -+ try: -+ yield -+ finally: -+ os.seteuid(os.getuid()) -+ os.setegid(os.getgid()) -+ os.setgroups(old_groups) -+ -+ - class IsoCodes(object): - - """Provides access to the iso-codes language, script and country diff --git a/debian/patches/CVE-2020-27349.patch b/debian/patches/CVE-2020-27349.patch deleted file mode 100644 index 230ed4a..0000000 --- a/debian/patches/CVE-2020-27349.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 5d6e1ca82a07ef1739dfea20ad17f077ceccfdcf Mon Sep 17 00:00:00 2001 -From: Julian Andres Klode <julian.klode@canonical.com> -Date: Tue, 1 Dec 2020 12:25:00 +0100 -Subject: [PATCH] Check PolicyKit before simulating local install - (CVE-2020-27349) - -Given that we are opening a deb here as root that is controlled -by a non-root user, without any authorization, this is a whole -lot of safety issues. - -Bug-Ubuntu: https://bugs.launchpad.net/bugs/1899193/ ---- - aptdaemon/core.py | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/aptdaemon/core.py b/aptdaemon/core.py -index 885b30b..6043b17 100644 ---- a/aptdaemon/core.py -+++ b/aptdaemon/core.py -@@ -1073,6 +1073,8 @@ class Transaction(DBusObject): - def _simulate_real(self): - if self._simulated_cb: - raise errors.TransactionAlreadySimulating() -+ if self.role == enums.ROLE_INSTALL_FILE: -+ yield self._check_auth() - self.queue.worker.simulate(self) - deferred = Deferred() - if self._idle_watch is not None: --- -2.29.2 - diff --git a/debian/patches/allow-unauthenticated.patch b/debian/patches/allow-unauthenticated.patch deleted file mode 100644 index 7c84232..0000000 --- a/debian/patches/allow-unauthenticated.patch +++ /dev/null @@ -1,23 +0,0 @@ -Description: Forward allow_unauthenticated to python-apt - Forward the allow_unauthenticated flag to python-apt so packages can continue - to be downloaded without them being authenticated, avoiding breakage with recent - python-apt uploads. -Author: Julian Andres Klode <juliank@ubuntu.com> -Origin: vendor -Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/python-apt/+bug/1858973 ---- a/aptdaemon/worker/aptworker.py -+++ b/aptdaemon/worker/aptworker.py -@@ -1068,7 +1068,12 @@ class AptWorker(BaseWorker): - end=install_range[1]) - with self._frozen_status(): - try: -- self._cache.commit(fetch_progress, inst_progress) -+ # This was backported as -+ if "allow_unauthenticated" in apt.Cache.commit.__doc__: -+ self._cache.commit(fetch_progress, inst_progress, -+ allow_unauthenticated=trans.allow_unauthenticated) -+ else: -+ self._cache.commit(fetch_progress, inst_progress) - except apt.cache.FetchFailedException as error: - raise TransactionFailed(ERROR_PACKAGE_DOWNLOAD_FAILED, - str(error)) diff --git a/debian/patches/apport-report.patch b/debian/patches/apport-report.patch deleted file mode 100644 index c715386..0000000 --- a/debian/patches/apport-report.patch +++ /dev/null @@ -1,24 +0,0 @@ -Description: write apport reports the right way -Author: Brian Murray <brian@ubuntu.com> -Origin: vendor -Bug-Ubuntu: http://launchpad.net/bugs/1700810 -Forwarded: not-needed -Last-Update: 2020-05-11 ---- -This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ -Index: aptdaemon-1.1.1+bzr982/aptdaemon/crash.py -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/aptdaemon/crash.py -+++ aptdaemon-1.1.1+bzr982/aptdaemon/crash.py -@@ -69,9 +69,8 @@ def create_report(error, traceback, tran - uid = os.path.basename(trans.tid) - - # Write report -- report_path = apport.fileutils.make_report_path(report, uid) -- if not os.path.exists(report_path): -- report.write(open(report_path, 'wb')) -+ with apport.fileutils.make_report_file(report, uid) as f: -+ report.write(f) - - if __name__ == "__main__": - apt_pkg.init_config() diff --git a/debian/patches/dbus_timeout.patch b/debian/patches/dbus_timeout.patch deleted file mode 100644 index 569f450..0000000 --- a/debian/patches/dbus_timeout.patch +++ /dev/null @@ -1,63 +0,0 @@ -=== modified file 'aptdaemon/client.py' -Index: aptdaemon/aptdaemon/client.py -=================================================================== ---- aptdaemon.orig/aptdaemon/client.py -+++ aptdaemon/aptdaemon/client.py -@@ -47,6 +47,10 @@ from .errors import convert_dbus_excepti - __all__ = ("AptTransaction", "AptClient", "get_transaction", "get_aptdaemon") - - -+# the default timeout for dbus method calls -+_APTDAEMON_DBUS_TIMEOUT = 86400 -+ -+ - class AptTransaction(GObject.Object): - - """Represents an aptdaemon transaction. -@@ -704,7 +708,8 @@ class AptTransaction(GObject.Object): - try: - return self._iface.RunAfter(transaction.tid, - error_handler=error_handler, -- reply_handler=reply_handler) -+ reply_handler=reply_handler, -+ timeout=_APTDAEMON_DBUS_TIMEOUT) - except Exception as error: - if error_handler: - error_handler(error) -@@ -727,7 +732,8 @@ class AptTransaction(GObject.Object): - """ - try: - return self._iface.Run(error_handler=error_handler, -- reply_handler=reply_handler) -+ reply_handler=reply_handler, -+ timeout=_APTDAEMON_DBUS_TIMEOUT) - except Exception as error: - if error_handler: - error_handler(error) -@@ -1609,10 +1615,11 @@ class AptClient(object): - if async: - deferred = defer.Deferred() - dbus_method(reply_handler=deferred.callback, -- error_handler=deferred.errback, *args, timeout=86400) -+ error_handler=deferred.errback, *args, -+ timeout=_APTDAEMON_DBUS_TIMEOUT) - tid = yield deferred - else: -- tid = dbus_method(*args, timeout=86400) -+ tid = dbus_method(*args, timeout=_APTDAEMON_DBUS_TIMEOUT) - trans = AptTransaction(tid, self.bus) - if self._locale: - yield trans.set_locale(self._locale) -Index: aptdaemon/aptdaemon/core.py -=================================================================== ---- aptdaemon.orig/aptdaemon/core.py -+++ aptdaemon/aptdaemon/core.py -@@ -83,7 +83,7 @@ APTDAEMON_DBUS_SERVICE = 'org.debian.apt - APTDAEMON_TRANSACTION_DBUS_INTERFACE = 'org.debian.apt.transaction' - - APTDAEMON_IDLE_CHECK_INTERVAL = 60 --APTDAEMON_IDLE_TIMEOUT = 5 * 60 -+APTDAEMON_IDLE_TIMEOUT = 10 * 60 - - # Maximum allowed time between the creation of a transaction and its queuing - TRANSACTION_IDLE_TIMEOUT = 300 diff --git a/debian/patches/do-not-raise-stopiteration.patch b/debian/patches/do-not-raise-stopiteration.patch deleted file mode 100644 index 7813b36..0000000 --- a/debian/patches/do-not-raise-stopiteration.patch +++ /dev/null @@ -1,68 +0,0 @@ -Description: Adjust stopping generators for PEP479 - Adjust aptdaemon for PEP479, where raise StopIteration - stopped working and should become return. -Author: Julian Andres Klode <juliank@ubuntu.com> -Last-Update: 2019-03-27 - ---- aptdaemon-1.1.1+bzr982.orig/aptdaemon/core.py -+++ aptdaemon-1.1.1+bzr982/aptdaemon/core.py -@@ -935,7 +935,7 @@ class Transaction(DBusObject): - self.progress = 9 - yield self._simulate_real() - else: -- raise StopIteration -+ return - - @inline_callbacks - def _check_auth(self): -@@ -946,7 +946,7 @@ class Transaction(DBusObject): - self.status = enums.STATUS_AUTHENTICATING - action = self.ROLE_ACTION_MAP[self.role] - if action is None: -- raise StopIteration -+ return - # Special case if InstallPackages only touches stuff from the - # high trust whitelist - if (self.role in (enums.ROLE_INSTALL_PACKAGES, -@@ -1028,16 +1028,16 @@ class Transaction(DBusObject): - else: - self.status = enums.STATUS_CANCELLING - self.exit = enums.EXIT_CANCELLED -- raise StopIteration -+ return - if self.tid in self.queue.limbo: - self.exit = enums.EXIT_CANCELLED -- raise StopIteration -+ return - elif self.cancellable: - log_trans.debug("Setting cancel event") - self.cancelled = True - self.status = enums.STATUS_CANCELLING - self.paused = False -- raise StopIteration -+ return - raise errors.AptDaemonError("Could not cancel transaction") - - # pylint: disable-msg=C0103,C0322 ---- aptdaemon-1.1.1+bzr982.orig/aptdaemon/networking.py -+++ aptdaemon-1.1.1+bzr982/aptdaemon/networking.py -@@ -177,7 +177,7 @@ class NetworkManagerMonitor(NetworkMonit - def _on_nm_active_conn_props_changed(self, props): - """Callback if properties of the active connection changed.""" - if "Default" not in props: -- raise StopIteration -+ return - yield self.get_network_state() - - @inline_callbacks ---- aptdaemon-1.1.1+bzr982.orig/doc/source/aptdaemon.client.rst -+++ aptdaemon-1.1.1+bzr982/doc/source/aptdaemon.client.rst -@@ -91,7 +91,7 @@ code in a synchronous way: - ... transaction = yield apt_client.update() - ... except errors.NotAuthorizedError: - ... print "You are not allowed to update the cache!" -- ... raise StopIteration -+ ... return - ... yield transaction.set_locale("de_DE") - ... yield transaction.run() - ... print "Transaction has started" diff --git a/debian/patches/drop_pkcompat.patch b/debian/patches/drop_pkcompat.patch deleted file mode 100644 index 64980a7..0000000 --- a/debian/patches/drop_pkcompat.patch +++ /dev/null @@ -1,2068 +0,0 @@ -From: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com> -Subject: Drop pkcompat PackageKit compatibility module. - -Just use straight PackageKit. - ---- - ---- - aptdaemon/core.py | 12 - aptdaemon/pkcompat.py | 2022 -------------------------------------------------- - 2 files changed, 2 insertions(+), 2032 deletions(-) - -Index: b/aptdaemon/core.py -=================================================================== ---- a/aptdaemon/core.py -+++ b/aptdaemon/core.py -@@ -1445,22 +1445,14 @@ class AptDaemon(DBusObject): - load_plugins = not options.disable_plugins - try: - from .worker.pkworker import AptPackageKitWorker -- from . import pkcompat -- except ImportError: -- self.worker = AptWorker(options.chroot, load_plugins) -- else: - self.worker = AptPackageKitWorker(options.chroot, - load_plugins) -+ except: -+ self.worker = AptWorker(options.chroot, load_plugins) - self.queue = TransactionQueue(self.worker) - self.queue.connect("queue-changed", self._on_queue_changed) - # keep state of the last information about reboot required - self._reboot_required = self.worker.is_reboot_required() -- try: -- self.packagekit = pkcompat.PackageKit(self.queue, connect, bus) -- except dbus.exceptions.NameExistsException: -- log.warning("PackageKit is already running") -- except NameError: -- pass - log.debug("Daemon was initialized") - - def _on_queue_changed(self, queue): -Index: b/aptdaemon/pkcompat.py -=================================================================== ---- a/aptdaemon/pkcompat.py -+++ /dev/null -@@ -1,2022 +0,0 @@ --# !/usr/bin/env python --# -*- coding: utf-8 -*- --""" --Provides a limited compatibility layer to PackageKit -- --Copyright (C) 2007 Ali Sabil <ali.sabil@gmail.com> --Copyright (C) 2007 Tom Parker <palfrey@tevp.net> --Copyright (C) 2008-2011 Sebastian Heinlein <glatzor@ubuntu.com> -- --Licensed under the GNU General Public License Version 2 -- --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. --""" -- --__author__ = "Sebastian Heinlein <devel@glatzor.de>" -- --import datetime --import glob --import gzip --import locale --import logging --import os --import platform --import re --import subprocess --import tempfile --import time --import uuid -- --from defer import inline_callbacks, return_value --from defer.utils import dbus_deferred_method --import dbus --from gi.repository import GObject, GLib --from gi.repository import PackageKitGlib as pk -- --# for optional plugin support --try: -- import pkg_resources --except ImportError: -- pkg_resources = None -- --from . import policykit1 --from . import core --from .core import APTDAEMON_TRANSACTION_DBUS_INTERFACE --from . import enums as aptd_enums --from .errors import TransactionFailed --from . import errors --from .progress import DaemonAcquireProgress --from . import worker --from . import networking --from .pkutils import (bitfield_summarize, bitfield_add, bitfield_remove, -- bitfield_contains) --from .utils import split_package_id -- -- --pklog = logging.getLogger("AptDaemon.PackageKit") -- --# Check if update-manager-core is installed to get aware of the --# latest distro releases --try: -- from UpdateManager.Core.MetaRelease import MetaReleaseCore --except ImportError: -- META_RELEASE_SUPPORT = False --else: -- META_RELEASE_SUPPORT = True -- --PACKAGEKIT_DBUS_INTERFACE = "org.freedesktop.PackageKit" --PACKAGEKIT_DBUS_SERVICE = "org.freedesktop.PackageKit" --PACKAGEKIT_DBUS_PATH = "/org/freedesktop/PackageKit" -- --PACKAGEKIT_TRANS_DBUS_INTERFACE = "org.freedesktop.PackageKit.Transaction" --PACKAGEKIT_TRANS_DBUS_SERVICE = "org.freedesktop.PackageKit.Transaction" -- --MAP_EXIT_ENUM = { -- aptd_enums.EXIT_SUCCESS: pk.ExitEnum.SUCCESS, -- aptd_enums.EXIT_CANCELLED: pk.ExitEnum.CANCELLED, -- aptd_enums.EXIT_FAILED: pk.ExitEnum.FAILED, -- aptd_enums.EXIT_FAILED: pk.ExitEnum.FAILED, -- aptd_enums.EXIT_PREVIOUS_FAILED: pk.ExitEnum.FAILED} -- --MAP_STATUS_ENUM = { -- aptd_enums.STATUS_AUTHENTICATING: pk.StatusEnum.WAITING_FOR_AUTH, -- aptd_enums.STATUS_SETTING_UP: pk.StatusEnum.SETUP, -- aptd_enums.STATUS_QUERY: pk.StatusEnum.QUERY, -- aptd_enums.STATUS_WAITING: pk.StatusEnum.WAIT, -- aptd_enums.STATUS_RUNNING: pk.StatusEnum.RUNNING, -- aptd_enums.STATUS_CANCELLING: pk.StatusEnum.CANCEL, -- aptd_enums.STATUS_CLEANING_UP: pk.StatusEnum.CLEANUP, -- aptd_enums.STATUS_COMMITTING: pk.StatusEnum.COMMIT, -- aptd_enums.STATUS_DOWNLOADING: pk.StatusEnum.DOWNLOAD, -- aptd_enums.STATUS_DOWNLOADING_REPO: pk.StatusEnum.DOWNLOAD_REPOSITORY, -- aptd_enums.STATUS_FINISHED: pk.StatusEnum.FINISHED, -- aptd_enums.STATUS_LOADING_CACHE: pk.StatusEnum.LOADING_CACHE, -- aptd_enums.STATUS_RESOLVING_DEP: pk.StatusEnum.DEP_RESOLVE, -- aptd_enums.STATUS_RUNNING: pk.StatusEnum.RUNNING, -- aptd_enums.STATUS_WAITING_LOCK: pk.StatusEnum.WAITING_FOR_LOCK, -- aptd_enums.STATUS_WAITING_MEDIUM: pk.StatusEnum.UNKNOWN, -- aptd_enums.STATUS_WAITING_CONFIG_FILE_PROMPT: pk.StatusEnum.UNKNOWN} -- --MAP_ERROR_ENUM = { -- aptd_enums.ERROR_CACHE_BROKEN: pk.ErrorEnum.NO_CACHE, -- aptd_enums.ERROR_DEP_RESOLUTION_FAILED: ( -- pk.ErrorEnum.DEP_RESOLUTION_FAILED), -- aptd_enums.ERROR_INCOMPLETE_INSTALL: pk.ErrorEnum.NO_CACHE, -- aptd_enums.ERROR_INVALID_PACKAGE_FILE: ( -- pk.ErrorEnum.PACKAGE_CORRUPT), -- aptd_enums.ERROR_KEY_NOT_INSTALLED: pk.ErrorEnum.GPG_FAILURE, -- aptd_enums.ERROR_KEY_NOT_REMOVED: pk.ErrorEnum.GPG_FAILURE, -- aptd_enums.ERROR_NOT_REMOVE_ESSENTIAL_PACKAGE: ( -- pk.ErrorEnum.PACKAGE_FAILED_TO_REMOVE), -- aptd_enums.ERROR_NO_CACHE: pk.ErrorEnum.NO_CACHE, -- aptd_enums.ERROR_NO_LOCK: pk.ErrorEnum.CANNOT_GET_LOCK, -- aptd_enums.ERROR_NO_PACKAGE: pk.ErrorEnum.PACKAGE_NOT_FOUND, -- aptd_enums.ERROR_PACKAGE_ALREADY_INSTALLED: ( -- pk.ErrorEnum.PACKAGE_ALREADY_INSTALLED), -- aptd_enums.ERROR_PACKAGE_DOWNLOAD_FAILED: ( -- pk.ErrorEnum.PACKAGE_DOWNLOAD_FAILED), -- aptd_enums.ERROR_PACKAGE_MANAGER_FAILED: ( -- pk.ErrorEnum.TRANSACTION_ERROR), -- aptd_enums.ERROR_PACKAGE_NOT_INSTALLED: ( -- pk.ErrorEnum.PACKAGE_NOT_INSTALLED), -- aptd_enums.ERROR_PACKAGE_UNAUTHENTICATED: ( -- pk.ErrorEnum.BAD_GPG_SIGNATURE), -- aptd_enums.ERROR_PACKAGE_UPTODATE: ( -- pk.ErrorEnum.NO_PACKAGES_TO_UPDATE), -- aptd_enums.ERROR_REPO_DOWNLOAD_FAILED: ( -- pk.ErrorEnum.REPO_NOT_AVAILABLE), -- aptd_enums.ERROR_UNREADABLE_PACKAGE_FILE: ( -- pk.ErrorEnum.INVALID_PACKAGE_FILE), -- aptd_enums.ERROR_SYSTEM_ALREADY_UPTODATE: ( -- pk.ErrorEnum.NO_PACKAGES_TO_UPDATE), -- aptd_enums.ERROR_NOT_AUTHORIZED: pk.ErrorEnum.NOT_AUTHORIZED, -- aptd_enums.ERROR_AUTH_FAILED: pk.ErrorEnum.NOT_AUTHORIZED} -- --MAP_PACKAGE_ENUM = { -- aptd_enums.PKG_CONFIGURING: pk.InfoEnum.INSTALLING, -- aptd_enums.PKG_DISAPPEARING: pk.InfoEnum.UNKNOWN, -- aptd_enums.PKG_INSTALLED: pk.InfoEnum.FINISHED, -- aptd_enums.PKG_INSTALLING: pk.InfoEnum.INSTALLING, -- aptd_enums.PKG_PREPARING_INSTALL: pk.InfoEnum.PREPARING, -- aptd_enums.PKG_PREPARING_PURGE: pk.InfoEnum.PREPARING, -- aptd_enums.PKG_PREPARING_REMOVE: pk.InfoEnum.PREPARING, -- aptd_enums.PKG_PURGED: pk.InfoEnum.FINISHED, -- aptd_enums.PKG_PURGING: pk.InfoEnum.REMOVING, -- aptd_enums.PKG_REMOVED: pk.InfoEnum.FINISHED, -- aptd_enums.PKG_REMOVING: pk.InfoEnum.REMOVING, -- aptd_enums.PKG_RUNNING_TRIGGER: pk.InfoEnum.CLEANUP, -- aptd_enums.PKG_UNKNOWN: pk.InfoEnum.UNKNOWN, -- aptd_enums.PKG_UNPACKING: pk.InfoEnum.DECOMPRESSING, -- aptd_enums.PKG_UPGRADING: pk.InfoEnum.UPDATING} -- --MAP_POLICY = { -- "org.freedesktop.packagekit.cancel-foreign": ( -- policykit1.PK_ACTION_CANCEL_FOREIGN), -- "org.freedesktop.packagekit.package-install": ( -- policykit1.PK_ACTION_INSTALL_OR_REMOVE_PACKAGES), -- "org.freedesktop.packagekit.package-install-untrusted": ( -- policykit1.PK_ACTION_INSTALL_OR_REMOVE_PACKAGES), -- "org.freedesktop.packagekit.system-trust-signing-key": ( -- policykit1.PK_ACTION_CHANGE_REPOSITORY), -- "org.freedesktop.packagekit.package-eula-accept": ( -- policykit1.PK_ACTION_INSTALL_OR_REMOVE_PACKAGES), -- "org.freedesktop.packagekit.package-remove": ( -- policykit1.PK_ACTION_INSTALL_OR_REMOVE_PACKAGES), -- "org.freedesktop.packagekit.system-update": ( -- policykit1.PK_ACTION_UPGRADE_PACKAGES), -- "org.freedesktop.packagekit.system-sources-configure": ( -- policykit1.PK_ACTION_CHANGE_REPOSITORY), -- "org.freedesktop.packagekit.system-sources-refresh": ( -- policykit1.PK_ACTION_UPDATE_CACHE), -- "org.freedesktop.packagekit.system-network-proxy-configure": ( -- policykit1.PK_ACTION_SET_PROXY), -- "org.freedesktop.packagekit.device-rebind": ( -- policykit1.PK_ACTION_INSTALL_OR_REMOVE_PACKAGES), -- "org.freedesktop.packagekit.upgrade-system": ( -- policykit1.PK_ACTION_UPGRADE_PACKAGES), -- "org.freedesktop.packagekit.repair-system": ( -- policykit1.PK_ACTION_INSTALL_OR_REMOVE_PACKAGES), -- "org.freedesktop.packagekit.trigger-offline-update": ( -- policykit1.PK_ACTION_UPGRADE_PACKAGES), -- "org.freedesktop.packagekit.clear-offline-update": ( -- policykit1.PK_ACTION_UPGRADE_PACKAGES)} -- -- --class PackageKit(core.DBusObject): -- -- """Provides a limited set of the PackageKit system D-Bus API.""" -- -- def __init__(self, queue, connect=True, bus=None): -- """Initialize a new PackageKit compatibility layer. -- -- Keyword arguments: -- connect -- if the daemon should connect to the D-Bus (default is True) -- bus -- the D-Bus to connect to (defaults to the system bus) -- """ -- pklog.info("Initializing PackageKit compat layer") -- bus_name = None -- bus_path = None -- if connect is True: -- if bus is None: -- bus = dbus.SystemBus() -- self.bus = bus -- bus_path = PACKAGEKIT_DBUS_PATH -- bus_name = dbus.service.BusName(PACKAGEKIT_DBUS_SERVICE, self.bus) -- core.DBusObject.__init__(self, bus_name, bus_path) -- self._updates_changed_timeout_id = None -- self._updates_changed = False -- self.queue = queue -- self.queue.worker.connect("transaction-done", -- self._on_transaction_done) -- self.queue.connect("queue-changed", self._on_queue_changed) -- self._distro_id = None -- self.netmon = networking.get_network_monitor() -- self.netmon.connect("network-state-changed", -- self._on_network_state_changed) -- self._get_network_state() -- -- @inline_callbacks -- def _get_network_state(self): -- """Helper to defer the network state checking.""" -- yield self.netmon.get_network_state() -- -- # SIGNALS -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE, -- signature="") -- def RestartSchedule(self): -- """A system restart has been sceduled.""" -- pass -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE, -- signature="as") -- def TransactionListChanged(self, transactions): -- """The transaction list has changed, because either a transaction -- has finished or a new transaction created. -- -- :param transactions: A list of transaction ID's. -- :type transactions: as -- """ -- pklog.debug("Emitting TransactionListChanged signal: %s", transactions) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE, -- signature="") -- def UpdatesChanged(self): -- """This signal is emitted when the number of updates has changed.""" -- pklog.debug("Emitting UpdatesChanged signal") -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE, -- signature="") -- def RepoListChanged(self): -- """This signal is emitted when the repository list has changed.""" -- pass -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE, -- signature="") -- def Changed(self): -- """This signal is emitted when a property on the interface changes.""" -- pklog.debug("Emitting PackageKit Changed()") -- -- # METHODS -- -- # pylint: disable-msg=C0103,C0322 -- @dbus_deferred_method(PACKAGEKIT_DBUS_INTERFACE, -- in_signature="s", out_signature="u", -- sender_keyword="sender") -- def CanAuthorize(self, action_id, sender): -- """Allows a client to find out if it would be allowed to authorize -- an action. -- -- :param action_id: The action ID, e.g. -- org.freedesktop.packagekit.system-network-proxy-configure -- :returns: The result, either yes, no or interactive. -- """ -- pklog.info("CanAuthorize() was called: %s", str(action_id)) -- return self._can_authorize(action_id, sender) -- -- @inline_callbacks -- def _can_authorize(self, action_id, sender): -- try: -- action_id_aptd = MAP_POLICY[action_id] -- except KeyError: -- return_value(pk.AuthorizeEnum.UNKNOWN) -- try: -- policykit1.check_authorization_by_name( -- self, action_id, flags=policykit1.CHECK_AUTH_NONE) -- except policykit1.NotAuthorizedError: -- return_value(pk.AuthorizeEnum.NO) -- except policykit1.AuthorizationFailed: -- # check_authorization_* behaves a little bit different if the -- # flags are set to NONE instead of INTERACTIVE -- return_value(pk.AuthorizeEnum.INTERACTIVE) -- except: -- return_value(pk.AuthorizeEnum.UNKNOWN) -- return_value(pk.AuthorizeEnum.YES) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE, -- in_signature="s", out_signature="") -- def StateHasChanged(self, reason): -- """This method suggests to PackageKit that the package backend state -- may have changed. This allows plugins to the native package manager -- to suggest that PackageKit drops it's caches. -- -- :param reason: -- The reason of the state change. Valid reasons are resume or -- posttrans. Resume is given a lower priority than posttrans. -- """ -- pklog.info("StateHasChanged() was called: %s", str(reason)) -- self._updates_changed = True -- if reason == "cache-update": -- self._check_updates_changed(timeout=30) -- elif reason == "resume": -- self._check_updates_changed(timeout=180) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus_deferred_method(PACKAGEKIT_DBUS_INTERFACE, -- in_signature="", out_signature="o", -- sender_keyword="sender") -- def CreateTransaction(self, sender): -- """Gets a new transaction ID from the daemon. -- -- :returns: The tid, e.g. 45_dafeca_checkpoint32 -- """ -- pklog.info("CreateTransaction() was called") -- return self._create_transaction(sender) -- -- @inline_callbacks -- def _create_transaction(self, sender): -- pid, uid, gid, cmdline = yield policykit1.get_proc_info_from_dbus_name( -- sender, self.bus) -- pktrans = PackageKitTransaction( -- pid, uid, gid, cmdline, self.queue, sender) -- return_value(pktrans.tid) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE, -- in_signature="", out_signature="s") -- def GetDaemonState(self): -- """Return the state of the currently running transactions.""" -- pklog.info("GetDaemonState() was called") -- # FIXME: Add some useful data here -- return "All is fine!" -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE, -- in_signature="", out_signature="ao") -- def GetTransactionList(self): -- """Gets the transaction list of any transactions that are in -- progress. -- -- :returns: A list of transaction ID's -- """ -- pklog.info("GetTransactionList() was called") -- return self._get_transaction_list() -- -- # HELPERS -- -- def _get_properties(self, iface): -- """Helper to get the properties of a D-Bus interface.""" -- if iface == PACKAGEKIT_DBUS_INTERFACE: -- return { -- # Claim that we are a current version -- "VersionMajor": dbus.UInt32(0), -- "VersionMinor": dbus.UInt32(8), -- "VersionMicro": dbus.UInt32(9), -- "BackendName": dbus.String("aptdaemon"), -- "BackendDescription": dbus.String("Compatibility layer"), -- "BackendAuthor": dbus.String(__author__), -- "Groups": dbus.UInt64(self.queue.worker.groups), -- "Provides": dbus.UInt64(self.queue.worker.provides), -- "Filters": dbus.UInt64(self.queue.worker.filters), -- "Roles": dbus.UInt64(self.queue.worker.roles), -- "MimeTypes": dbus.Array(self.queue.worker.mime_types, -- signature="s"), -- "Locked": dbus.Boolean(False), -- "NetworkState": dbus.UInt32(self.netmon.state), -- "DistroId": dbus.String(self._get_distro_id())} -- else: -- return {} -- -- def _get_distro_id(self): -- """Return information about the distibution.""" -- if self._distro_id is None: -- distro, version, _codename = platform.dist() -- self._distro_id = "%s;%s;%s" % (distro or "unknown", -- version or "unknown", -- self.queue.worker.NATIVE_ARCH) -- return self._distro_id -- -- def _on_network_state_changed(self, mon, state): -- self.Changed() -- self.PropertiesChanged(PACKAGEKIT_DBUS_INTERFACE, -- {"NetworkState": dbus.UInt32(state)}, []) -- -- def _on_queue_changed(self, queue): -- self.TransactionListChanged(self._get_transaction_list()) -- self._check_updates_changed() -- -- def _get_transaction_list(self): -- pk_transactions = [] -- for trans in self.queue.items: -- # We currently only emit PackageKit transaction -- # FIXME: Should we use MergedTransaction for all transactions and -- # ROLE_UNKOWN for aptdaemon only transactions? -- try: -- pk_transactions.append(trans.pktrans.tid) -- except AttributeError: -- pass -- try: -- pk_transactions.append(self.queue.worker.trans.pktrans.tid) -- except AttributeError: -- pass -- return pk_transactions -- -- def _on_transaction_done(self, worker, trans): -- # If a cache modifing transaction is completed schedule an -- # UpdatesChanged signal -- if trans.role in (aptd_enums.ROLE_INSTALL_FILE, -- aptd_enums.ROLE_INSTALL_PACKAGES, -- aptd_enums.ROLE_REMOVE_PACKAGES, -- aptd_enums.ROLE_UPGRADE_PACKAGES, -- aptd_enums.ROLE_COMMIT_PACKAGES, -- aptd_enums.ROLE_UPGRADE_SYSTEM, -- aptd_enums.ROLE_FIX_BROKEN_DEPENDS): -- self._updates_changed = True -- self._check_updates_changed() -- elif trans.role == aptd_enums.ROLE_UPDATE_CACHE: -- self._updates_changed = True -- self._check_updates_changed(timeout=30) -- -- def _check_updates_changed(self, timeout=60): -- """After the queue was processed schedule a delayed UpdatesChanged -- signal if required. -- """ -- if not self.queue.items and self._updates_changed: -- if self._updates_changed_timeout_id: -- # If we already have a scheduled UpdatesChanged signal -- # delay it even further -- pklog.debug("UpdatesChanged signal re-scheduled") -- GLib.source_remove(self._updates_changed_timeout_id) -- else: -- pklog.debug("UpdatesChanged signal scheduled") -- self._updates_changed_timeout_id = \ -- GLib.timeout_add_seconds(timeout, -- self._delayed_updates_changed) -- -- def _delayed_updates_changed(self): -- """Emit the UpdatesChanged signal and clear the timeout.""" -- self.UpdatesChanged() -- self._updates_changed_timeout_id = None -- self._updates_changed = False -- return False -- -- --class MergedTransaction(core.Transaction): -- -- """Overlay of an Aptdaemon transaction which also provides the -- PackageKit object and its interfaces. -- """ -- -- def __init__(self, pktrans, role, queue, connect=True, -- bus=None, packages=None, kwargs=None): -- core.Transaction.__init__(self, pktrans.tid[1:], role, queue, -- pktrans.pid, pktrans.uid, pktrans.gid, -- pktrans.cmdline, pktrans.sender, -- connect, bus, packages, kwargs) -- self.pktrans = pktrans -- self.run_time = 0 -- -- @inline_callbacks -- def _run(self, sender): -- """Run the transaction and convert exceptions to PackageKit ones.""" -- try: -- yield core.Transaction._run(self, sender) -- except (TransactionFailed, errors.NotAuthorizedError, -- errors.AuthorizationFailed): -- # It is sufficient for PackageKit if the exit state and error -- # code of the transaction are set. So silently drop the execp -- if self.error: -- pass -- except Exception as error: -- raise error -- -- @inline_callbacks -- def _check_auth(self): -- """Override the auth method to allow simulates without any -- authorization. -- """ -- if bitfield_contains(self.pktrans.flags, -- pk.TransactionFlagEnum.SIMULATE): -- raise StopIteration -- else: -- yield core.Transaction._check_auth(self) -- -- @inline_callbacks -- def _check_simulated(self): -- """Skip simulate calls for simulated transactions.""" -- if bitfield_contains(self.pktrans.flags, -- pk.TransactionFlagEnum.SIMULATE): -- raise StopIteration -- else: -- yield core.Transaction._check_simulated(self) -- -- def _set_status(self, enum): -- core.Transaction._set_status(self, enum) -- self.pktrans.status = get_pk_status_enum(enum) -- -- status = property(core.Transaction._get_status, _set_status) -- -- def _set_progress(self, percent): -- core.Transaction._set_progress(self, percent) -- self.pktrans.percentage = self._progress -- -- progress = property(core.Transaction._get_progress, _set_progress) -- -- def _set_progress_details(self, details): -- core.Transaction._set_progress_details(self, details) -- self.pktrans.download_size_remaing = int(details[3]) - int(details[2]) -- self.pktrans.speed = int(details[4]) -- self.pktrans.remaining_time = int(details[5]) -- self.pktrans.elapsed_time = int(time.time() - self.pktrans.start_time) -- -- progress_details = property(core.Transaction._get_progress_details, -- _set_progress_details) -- -- def _set_progress_package(self, progress): -- core.Transaction._set_progress_package(self, progress) -- pkg_name, enum = progress -- # Ignore dpkg triggers -- if enum == aptd_enums.PKG_RUNNING_TRIGGER or pkg_name == "dpkg-exec": -- return -- try: -- id = self.pktrans.pkg_id_cache[pkg_name] -- except KeyError: -- id = get_pk_package_id(pkg_name) -- self.emit_package(get_pk_package_enum(enum), id, "") -- -- progress_package = property(core.Transaction._get_progress_package, -- _set_progress_package) -- -- def _set_progress_download(self, progress_download): -- core.Transaction._set_progress_download(self, progress_download) -- prog_enum = progress_download[1] -- prog_name = progress_download[2] -- total_size = progress_download[3] -- partial_size = progress_download[4] -- -- try: -- id = self.pktrans.pkg_id_cache[prog_name] -- except KeyError: -- return -- self.pktrans.Package(pk.InfoEnum.DOWNLOADING, id, "") -- if prog_enum == aptd_enums.DOWNLOAD_IDLE: -- percentage = 0 -- elif prog_enum == aptd_enums.DOWNLOAD_FETCHING and total_size > 0: -- percentage = partial_size * 100 / total_size -- elif prog_enum == aptd_enums.DOWNLOAD_DONE: -- percentage = 100 -- else: -- # In the case of an error -- percentage = 0 -- self.pktrans.ItemProgress(id, pk.InfoEnum.DOWNLOADING, percentage) -- -- progress_download = property(core.Transaction._get_progress_download, -- _set_progress_download) -- -- def _set_exit(self, enum): -- core.Transaction._set_exit(self, enum) -- self.pktrans.exit = get_pk_exit_enum(enum) -- -- exit = property(core.Transaction._get_exit, _set_exit) -- -- def _set_error(self, excep): -- core.Transaction._set_error(self, excep) -- self.pktrans.ErrorCode(get_pk_error_enum(excep.code), -- self._error_property[1]) -- -- error = property(core.Transaction._get_error, _set_error) -- -- def _remove_from_connection_no_raise(self): -- core.Transaction._remove_from_connection_no_raise(self) -- if self.pktrans is None: -- return False -- self.pktrans.Destroy() -- try: -- self.pktrans.remove_from_connection() -- except LookupError as error: -- pklog.debug("remove_from_connection() raised LookupError: %s", -- error) -- finally: -- self.pktrans.trans = None -- self.pktrans = None -- return False -- -- def emit_details(self, package_id, license, group, detail, url, size): -- self.pktrans.Details(package_id, license, group, detail, url, size) -- -- def emit_files(self, id, file_list): -- self.pktrans.Files(id, file_list) -- -- def emit_package(self, info, id, summary): -- if id.startswith("dpkg-exec;"): -- # PackageKit would show a non existing package -- pklog.debug("Don't emit Package() signal for the dpkg trigger") -- return -- self.pktrans.Package(info, id, summary) -- self.pktrans.last_package = id -- -- def emit_update_detail(self, package_id, updates, obsoletes, vendor_urls, -- bugzilla_urls, cve_urls, restart, update_text, -- changelog, state, issued, updated): -- self.pktrans.UpdateDetail(package_id, updates, obsoletes, vendor_urls, -- bugzilla_urls, cve_urls, restart, -- update_text, changelog, state, issued, -- updated) -- -- --class PackageKitTransaction(core.DBusObject): -- -- """Provides a PackageKit transaction object.""" -- -- def __init__(self, pid, uid, gid, cmdline, queue, sender, -- connect=True, bus=None): -- pklog.info("Initializing PackageKit transaction") -- bus_name = None -- bus_path = None -- self.tid = "/%s" % uuid.uuid4().hex -- if connect is True: -- if bus is None: -- bus = dbus.SystemBus() -- self.bus = bus -- bus_path = self.tid -- bus_name = dbus.service.BusName(PACKAGEKIT_DBUS_SERVICE, bus) -- core.DBusObject.__init__(self, bus_name, bus_path) -- self.queue = queue -- self.hints = {} -- self.start_time = time.time() -- self._elapsed_time = dbus.UInt32(0) -- self._remaining_time = dbus.UInt32(0) -- self._download_size_remaining = dbus.UInt64(0) -- self._speed = dbus.UInt32(0) -- self._caller_active = True -- self._allow_cancel = False -- self._percentage = dbus.UInt32(0) -- self._status = pk.StatusEnum.SETUP -- self._last_package = "" -- self.uid = dbus.UInt32(uid) -- self.gid = dbus.UInt32(gid) -- self.pid = pid -- self.cmdline = cmdline -- self.role = pk.RoleEnum.UNKNOWN -- self.sender = sender -- self.trans = None -- self.flags = pk.TransactionFlagEnum.NONE -- self.pkg_id_cache = {} -- -- @property -- def allow_cancel(self): -- return self._allow_cancel -- -- @allow_cancel.setter -- def allow_cancel(self, value): -- self._allow_cancel = dbus.Boolean(value) -- self.PropertiesChanged(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- {"AllowCancel": self._allow_cancel}, []) -- self.Changed() -- -- @property -- def last_package(self): -- return self._last_package -- -- @last_package.setter -- def last_package(self, value): -- self._last_package = dbus.String(value) -- self.PropertiesChanged(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- {"LastPackage": self._last_package}, []) -- self.Changed() -- -- @property -- def caller_active(self): -- return self._caller_active -- -- @caller_active.setter -- def caller_active(self, value): -- self._caller_active = dbus.Boolean(value) -- self.PropertiesChanged(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- {"CallerActive": self._caller_active}, []) -- self.Changed() -- -- @property -- def percentage(self): -- return self._percentage -- -- @percentage.setter -- def percentage(self, progress): -- self._percentage = dbus.UInt32(progress) -- self.PropertiesChanged(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- {"Percentage": self._percentage}, []) -- self.Changed() -- -- @property -- def status(self): -- return self._status -- -- @status.setter -- def status(self, enum): -- self._status = dbus.UInt32(enum) -- self.PropertiesChanged(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- {"Status": self._status}, []) -- self.Changed() -- -- @property -- def elapsed_time(self): -- return self._elapsed_time -- -- @elapsed_time.setter -- def elapsed_time(self, ela): -- self._elpased_time = dbus.UInt32(ela) -- self.PropertiesChanged(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- {"ElapsedTime": self._elapsed_time}, []) -- self.Changed() -- -- @property -- def remaining_time(self): -- return self._remaining_time -- -- @remaining_time.setter -- def remaining_time(self, value): -- self._remaining_time = dbus.UInt32(value) -- self.PropertiesChanged(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- {"RemainingTime": self._remaining_time}, []) -- self.Changed() -- -- @property -- def download_size_remaining(self): -- return self._download_size_remaining -- -- @download_size_remaining.setter -- def download_size_remaining(self, value): -- self._download_size_remaining = dbus.UInt64(value) -- self.PropertiesChanged(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- {"DownloadSizeRemaining": -- self._download_size_remaining}, []) -- self.Changed() -- -- @property -- def speed(self): -- return self._speed -- -- @speed.setter -- def speed(self, speed): -- self._speed = dbus.UInt32(speed) -- self.PropertiesChanged(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- {"Speed": self._speed}, []) -- self.Changed() -- -- @property -- def exit(self): -- return self._exit -- -- @exit.setter -- def exit(self, enum): -- self._exit = enum -- self.run_time = int((time.time() - self.start_time) * 1000) -- # The time could go backwards ... -- if self.run_time < 0: -- self.run_time = 0 -- if enum == pk.ExitEnum.CANCELLED: -- self.ErrorCode(pk.ErrorEnum.TRANSACTION_CANCELLED, "") -- self.status = pk.StatusEnum.FINISHED -- self.Finished(enum, self.run_time) -- -- # SIGNALS -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_TRANS_DBUS_INTERFACE, -- signature="osbuusus") -- def Transaction(self, object_path, timespec, succeeded, role, duration, -- data, uid, cmdline): -- """This signal is sent when more details are required about a -- specific transaction. -- -- :param object_path: The transaction ID of the old transaction. -- :param timespec: The timespec of the old transaction in ISO8601 format. -- :param succeeded: If the transaction succeeded. -- :param role: The role enumerated type. -- :param duration: The duration of the transaction in milliseconds. -- :param data: Any data associated -- :param uid: The user ID of the user that scheduled the action. -- :param cmdline: The command line of the tool that scheduled the action, -- e.g. /usr/bin/gpk-application. -- """ -- pklog.debug("Emitting Transaction signal: %s, %s, %s, %s, %s, %s, " -- "%s, %s", object_path, timespec, succeeded, -- pk.role_enum_to_string(role), duration, data, uid, -- cmdline) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_TRANS_DBUS_INTERFACE, -- signature="us") -- def ErrorCode(self, code, details): -- """This signal is used to report errors back to the session program. -- Errors should only be send on fatal abort. -- -- :param code: Enumerated type, e.g. no-network. -- :param details: Long description or error, e.g. "failed to connect" -- -- :type code: u -- :type details: s -- """ -- pklog.debug("Emitting ErrorCode signal: %s, %s", -- pk.error_enum_to_string(code), details) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_TRANS_DBUS_INTERFACE, -- signature="") -- def Changed(self): -- """This signal is emitted when a property on the interface changes.""" -- pklog.debug("Emitting Changed signal") -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_TRANS_DBUS_INTERFACE, -- signature="") -- def Destroy(self): -- """This signal is sent when the transaction has been destroyed -- and is no longer available for use.""" -- pklog.debug("Emitting Destroy signal") -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_TRANS_DBUS_INTERFACE, -- signature="uu") -- def Finished(self, exit_enum, runtime): -- """This signal is used to signal that the transaction has finished. -- :param exit: The PkExitEnum describing the exit status of the -- transaction. -- :param runtime: The amount of time in milliseconds that the -- transaction ran for. -- -- :type exit: s -- :type runtime: u -- """ -- pklog.debug("Emitting Finished signal: %s, %s", -- pk.exit_enum_to_string(exit_enum), runtime) -- pass -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_TRANS_DBUS_INTERFACE, -- signature="ssusst") -- def Details(self, package_id, license, group, detail, url, size): -- """This signal allows the backend to convey more details about the -- package. -- -- :param package_id: The package ID -- -- :param license: -- The license string, e.g. GPLv2+ or BSD and (MPLv1.1 or GPLv2+). -- Moredetails about the correct way to format licensing strings can -- be found on the Fedora packaging wiki. -- :param group: -- The enumerated package group description -- :param detail: -- The multi-line package description. If formatting is required, -- then markdown syntax should be used, e.g. This is **critically** -- important -- :param url: -- The upstream project homepage -- :param size: -- The size of the package in bytes. This should be the size of the -- entire package file, not the size of the files installed on the -- system. If the package is not installed, and already downloaded -- and present in the package manager cache, then this value should -- be set to zero. -- """ -- pklog.debug("Emitting Details signal for %s", package_id) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_TRANS_DBUS_INTERFACE, -- signature="us") -- def Message(self, kind, details): -- """This signal is sent when the backend wants to send a message to -- the session. -- -- The message will be shown after the transaction has been completed. -- """ -- pklog.debug("Emitting Message signal: %s, %s", kind, details) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_TRANS_DBUS_INTERFACE, -- signature="sas") -- def Files(self, package_id, file_list): -- """This signal is used to push file lists from the backend to the -- session. -- -- :param package_id: -- The Package ID that called the method. -- :param file_list: -- The file list -- """ -- pklog.debug("Emitting Files signal: %s, %s", package_id, file_list) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_TRANS_DBUS_INTERFACE, -- signature="suu") -- def ItemProgress(self, package_id, status, percentage): -- """This signal allows the backend to send information about -- package or repository progress when using Simultanous mode. -- -- :param package_id: The package ID -- :param status: -- The status enumerated value that is being completed -- :param percentage: -- The percentage of this action is completed -- """ -- pklog.debug("Emitting ItemProgress signal for %s: %s, %s", -- package_id, pk.info_enum_to_string(status), percentage) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_TRANS_DBUS_INTERFACE, -- signature="sasasasasasussuss") -- def UpdateDetail(self, package_id, updates, obsoletes, vendor_urls, -- bugzilla_urls, cve_urls, restart, update_text, changelog, -- state, issued, updated): -- """This signal is sent when more details are required about a -- specific update. -- -- :param package_id: The package ID -- :param updates: -- A list of package_id's that are to be updated. -- :param obsoletes: -- A list of package_id's that are to be obsoleted. -- :param vendor_urls: -- A URL with more details on the update, e.g. a page with more -- information on the update. The format of this command should -- be http://www.foo.org/page.html?4567;Update to SELinux -- :param bugzilla_urls: -- A bugzilla URL with more details on the update. If no URL is -- available then this field should be left empty. -- :param cve_urls: -- A CVE URL with more details on the security advisory. -- :param restart: -- A valid restart type, e.g. system. -- :param update_text: -- The update text describing the update. If formatting is required, -- then markdown syntax should be used, e.g. This is **critically** -- important. -- :param changelog: -- The ChangeLog text describing the changes since the last version. -- :param state: -- The state of the update, e.g. stable or testing. -- :param issued: -- The ISO8601 encoded date that the update was issued. -- :param updated: -- The ISO8601 encoded date that the update was updated. -- """ -- pklog.debug("Emitting UpdateDetail signal for %s", package_id) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_TRANS_DBUS_INTERFACE, -- signature="uss") -- def Package(self, info, package_id, summary): -- """This signal allows the backend to communicate packages to the -- session. -- -- If updating, as packages are updated then emit them to the screen. -- This allows a summary to be presented after the transaction. -- When returning results from a search always return installed -- before available for the same package name. -- -- :param info: A valid info enumerated type -- :param package_id: This identifier is of the form -- name;version;arch;data in a single string and is meant to -- represent a single package unique across all local and remote -- data stores. For a remote, not-installed package the data -- field should be set as the repository identifier or repository -- name. The data field for an installed package must be prefixed -- with installed as this is used to identify which packages are -- installable or installed in the client tools. As a special -- extension, if the package manager is able to track which -- repository a package was originally installed from, then the data -- field can be set to installed:REPO-NAME which allows the frontend -- client to advise the user of the package origin. The data field -- for a non-installed local package must be local as this signifies -- a repository name is not available and that package resides -- locally on the client system rather than in any specific -- repository. -- :param summary: The one line package summary, e.g. Clipart for -- OpenOffice -- """ -- pklog.debug("Emitting Package signal: %s, %s, %s'", -- pk.info_enum_to_string(info), package_id, summary[:10]) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_TRANS_DBUS_INTERFACE, -- signature="sss") -- def DistroUpgrade(self, distro_type, name, summary): -- """This signal allows the backend to communicate distribution upgrades -- to the session. -- :param type: A valid upgrade string enumerated type, e.g. stable -- or unstable -- :param name: The short name of the distribution, e.g. Fedora Core -- 10 RC1 -- :param summary: The multi-line description of the release -- """ -- pklog.debug("Emitting DistroUpgrade signal: %s, %s, %s", -- pk.distro_upgrade_enum_to_string(distro_type), -- name, summary) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.signal(dbus_interface=PACKAGEKIT_TRANS_DBUS_INTERFACE, -- signature="us") -- def RequireRestart(self, restart_type, package_id): -- """This signal is sent when the session client should notify the user -- that a restart is required to get all changes into effect. -- -- :param package_id: -- The Package ID of the package tiggering the restart -- :param file_list: -- One of system, application or session -- """ -- pklog.debug("Emitting RequireRestart signal: %s, %s", -- pk.restart_enum_to_string(restart_type), package_id) -- -- # METHODS -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="as", out_signature="") -- def SetHints(self, hints): -- """This method allows the calling session to set transaction hints -- for the package manager which can change as the transaction runs. -- -- This method can be sent before the transaction has been run or -- whilst it is running. There is no limit to the number of times -- this method can be sent, although some backends may only use the -- values that were set before the transaction was started. -- -- Each parameter value is optional. -- -- :param hints: The values as an array of strings, for example -- ['locale=en_GB.utf8','interactive=false','cache-age=3600'] -- """ -- pklog.info("SetHints() was called: %s", get_string_from_array(hints)) -- for hint in hints: -- key, value = hint.split("=", 1) -- if key not in ["locale", "idle", "background", "interactive", -- "cache-age", "frontend-socket"]: -- raise Exception("Invalid option %s" % key) -- self.hints[key] = value -- -- # pylint: disable-msg=C0103,C0322 -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="", out_signature="", -- sender_keyword="sender") -- def Cancel(self, sender): -- """This method cancels a transaction that is already running.""" -- if self.trans: -- return self.trans._cancel(sender) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="tasbb", out_signature="", -- sender_keyword="sender") -- def RemovePackages(self, flags, package_ids, allow_deps, autoremove, -- sender): -- """This method removes packages from the local system. -- -- This method typically emits Progress, Status and Error and Package. -- -- Package enumerated types should be downloading, updating, -- installing or removing. -- -- :param flags: If the transaction should be simulated or prepared -- :param package_ids: An array of package IDs. -- :param allow_deps: -- Either true or false. If true allow other packages to be removed -- with the package, but false should cause the script to abort if -- other packages are dependant on the package. -- :param autoremove: -- Either true or false. This option is only really interesting on -- embedded devices with a limited amount of flash storage. It -- suggests to the packagekit backend that dependencies installed at -- the same time as the package should also be removed if they are not -- required by anything else. For instance, if you install OpenOffice, -- it might download libneon as a dependency. When auto_remove is set -- to true, and you remove OpenOffice then libneon will also get -- removed automatically. -- """ -- pklog.info("RemovePackages() was called: %s, %s", -- get_string_from_flags(flags), -- get_string_from_array(package_ids)) -- return self._remove_packages(flags, package_ids, allow_deps, -- autoremove, sender) -- -- @inline_callbacks -- def _remove_packages(self, flags, package_ids, allow_deps, autoremove, -- sender): -- self.role = pk.RoleEnum.REMOVE_PACKAGES -- self.flags = flags -- self.trans = self._get_merged_trans(aptd_enums.ROLE_REMOVE_PACKAGES, -- pkg_ids=package_ids, -- pkg_type=aptd_enums.PKGS_REMOVE) -- yield self.trans._set_property(APTDAEMON_TRANSACTION_DBUS_INTERFACE, -- "RemoveObsoletedDepends", autoremove, -- sender) -- # FIXME: Implement allow_deps -- yield self.trans._run(sender) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="tas", out_signature="", -- sender_keyword="sender") -- def UpdatePackages(self, flags, package_ids, sender): -- """This method updates existing packages on the local system. -- -- The installer should always update extra packages automatically -- to fulfil dependencies. -- -- This should allow an application to find out what package owns a -- file on the system. -- -- This method typically emits Progress, Status and Error and Package. -- -- :param flags: -- If the transaction is only allowed to install trusted packages. -- Unsigned packages should not be installed if the flags -- contains ONLY_TRUSED. -- If this method is can only install trusted packages, and -- the packages are unsigned, then the backend will send a -- ErrorCode(missing-gpg-signature). On recieving this error, the -- client may choose to retry with ONLY_TRUSTED set after -- gaining further authentication. -- : param package_ids: An array of package IDs. -- """ -- pklog.info("UpdatePackages() was called: %s, %s", -- get_string_from_flags(flags), -- get_string_from_array(package_ids)) -- return self._update_packages(flags, package_ids, sender) -- -- @inline_callbacks -- def _update_packages(self, flags, package_ids, sender): -- self.role = pk.RoleEnum.UPDATE_PACKAGES -- self.flags = flags -- self.trans = self._get_merged_trans(aptd_enums.ROLE_UPGRADE_PACKAGES, -- pkg_ids=package_ids, -- pkg_type=aptd_enums.PKGS_UPGRADE) -- yield self.trans._set_property( -- APTDAEMON_TRANSACTION_DBUS_INTERFACE, -- "AllowUnauthenticated", -- not bitfield_contains(flags, -- pk.TransactionFlagEnum.ONLY_TRUSTED), -- sender) -- yield self.trans._run(sender) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="uas", out_signature="", -- sender_keyword="sender") -- def InstallPackages(self, flags, package_ids, sender): -- """This method installs new packages on the local system. -- -- The installer should always install extra packages automatically -- as the use could call GetDepends prior to the install if a -- confirmation is required in the UI. -- -- This method typically emits Progress, Status and Error and Package. -- -- Package enumerated types should be downloading, updating, -- installing or removing. -- -- :param flags: -- If the transaction is only allowed to install trusted packages. -- Unsigned packages should not be installed if the flags -- contains ONLY_TRUSED. -- If this method is can only install trusted packages, and -- the packages are unsigned, then the backend will send a -- ErrorCode(missing-gpg-signature). On recieving this error, the -- client may choose to retry with ONLY_TRUSTED set after -- gaining further authentication. -- : param package_ids: An array of package IDs. -- """ -- pklog.info("InstallPackages() was called: %s, %s", -- get_string_from_flags(flags), -- get_string_from_array(package_ids)) -- return self._install_packages(flags, package_ids, sender) -- -- @inline_callbacks -- def _install_packages(self, flags, package_ids, sender): -- self.role = pk.RoleEnum.INSTALL_PACKAGES -- self.flags = flags -- self.trans = self._get_merged_trans(aptd_enums.ROLE_INSTALL_PACKAGES, -- pkg_ids=package_ids, -- pkg_type=aptd_enums.PKGS_INSTALL) -- yield self.trans._set_property( -- APTDAEMON_TRANSACTION_DBUS_INTERFACE, -- "AllowUnauthenticated", -- not bitfield_contains(flags, -- pk.TransactionFlagEnum.ONLY_TRUSTED), -- sender) -- yield self.trans._run(sender) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus.service.method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="su", out_signature="", -- sender_keyword="sender") -- def UpgradeSystem(self, distro_id, upgrade_kind, sender): -- """This method updates existing packages on the local system. -- -- The installer should always update extra packages automatically -- to fulfil dependencies. -- -- This should allow an application to find out what package owns a -- file on the system. -- -- This method typically emits Progress, Status and Error and Package. -- -- :param distro_id: The distribution id to upgrade to, e.g. saucy -- :param upgrade_kind: -- The type of upgrade e.g. minimal, default or complete. -- Minimal upgrades will download the smallest amount of data -- before launching a installer. -- The default is to download enough data to launch a full graphical -- installer, but a complete upgrade will be required if there is no -- internet access during install time. -- """ -- pklog.info("UpgradeSystem() was called") -- GLib.idle_add(self._fail_not_implemented) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="t", out_signature="", -- sender_keyword="sender") -- def RepairSystem(self, flags, sender): -- """This method recovers the package managment system from e.g. -- unsatisified dependencies of installed packages. -- -- :param flags: -- If the transaction is only allowed to install trusted packages. -- Unsigned packages should not be installed if the flags -- contains ONLY_TRUSED. -- If this method is can only install trusted packages, and -- the packages are unsigned, then the backend will send a -- ErrorCode(missing-gpg-signature). On recieving this error, the -- client may choose to retry with ONLY_TRUSTED set after -- gaining further authentication. -- """ -- pklog.info("RepairSystem() was called") -- return self._repair_system(flags, sender) -- -- @inline_callbacks -- def _repair_system(self, flags, sender): -- self.role = pk.RoleEnum.REPAIR_SYSTEM -- self.flags = flags -- self.trans = self._get_merged_trans(aptd_enums.ROLE_FIX_BROKEN_DEPENDS) -- yield self.trans._set_property( -- APTDAEMON_TRANSACTION_DBUS_INTERFACE, -- "AllowUnauthenticated", -- not bitfield_contains(flags, -- pk.TransactionFlagEnum.ONLY_TRUSTED), -- sender) -- yield self.trans._run(sender) -- -- # pylint: disable-msg=C0103,C0322 -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="b", out_signature="", -- sender_keyword="sender") -- def RefreshCache(self, force, sender): -- """This method should fetch updated meta-data for all enabled -- repositories. -- -- When fetching each software source, ensure to emit RepoDetail for -- the current source to give the user interface some extra details. -- Be sure to have the "enabled" field set to true, otherwise you -- wouldn't be fetching that source. -- -- This method typically emits Progress, Error and RepoDetail. -- -- :param force: If the caches should be cleaned and reloaded even if -- there is valid, up to date data. -- """ -- pklog.info("RefreshCache() was called") -- self.role = pk.RoleEnum.REFRESH_CACHE -- return self._refresh_cache(force, sender) -- -- @inline_callbacks -- def _refresh_cache(self, force, sender): -- self.trans = self._get_merged_trans(aptd_enums.ROLE_UPDATE_CACHE, -- kwargs={"sources_list": None}) -- yield self.trans._run(sender) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="as", out_signature="", -- sender_keyword="sender") -- def GetUpdateDetail(self, package_ids, sender): -- """This method returns details about a specific update. -- -- This method typically emits UpdateDetail and Error -- -- :param package_ids: An array of package IDs. -- """ -- pklog.info("GetUpdateDetail() was called") -- self.role = pk.RoleEnum.GET_UPDATE_DETAIL -- kwargs = {"package_ids": package_ids} -- return self._run_query(kwargs, sender) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="t", out_signature="", -- sender_keyword="sender") -- def GetUpdates(self, filter, sender): -- """This method should return a list of packages that are installed -- and are upgradable. It should only return the newest update for -- each installed package. -- -- This method typically emits Progress, Error and Package. -- -- :param filter: A correct filter, e.g. none or installed;~devel -- """ -- pklog.info("GetUpdates() was called") -- self.role = pk.RoleEnum.GET_UPDATES -- kwargs = {"filters": filter} -- return self._run_query(kwargs, sender) -- -- @dbus.service.method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="", out_signature="", -- sender_keyword="sender") -- def GetDistroUpgrades(self, sender): -- """This method should return a list of distribution upgrades that are -- available. It should not return updates, only major upgrades. -- -- This method typically emits DistroUpgrade, Error -- """ -- pklog.info("GetDistroUpgrades() was called") -- self.role = pk.RoleEnum.GET_DISTRO_UPGRADES -- self.status = pk.StatusEnum.RUNNING -- GLib.idle_add(defer_idle, self._get_distro_upgrades) -- -- def _get_distro_upgrades(self): -- # FIXME: Should go into the worker after the threading branch is merged -- # It allows to run a nested loop until the download is finished -- self.allow_cancel = False -- self.percentage = 101 -- self.status = pk.StatusEnum.DOWNLOAD_UPDATEINFO -- -- if META_RELEASE_SUPPORT is False: -- self.ErrorCode(pk.ErrorEnum.INTERNAL_ERROR, -- "Please make sure that update-manager-core is" -- "correctly installed.") -- self.exit = pk.ExitEnum.FAILED -- return -- -- # FIXME Evil to start the download during init -- meta_release = GMetaRelease() -- meta_release.connect("download-done", -- self._on_distro_upgrade_download_done) -- -- def _on_distro_upgrade_download_done(self, meta_release): -- # FIXME: Add support for description -- if meta_release.new_dist is not None: -- self.DistroUpgrade("stable", -- "%s %s" % (meta_release.new_dist.name, -- meta_release.new_dist.version), -- "The latest stable release") -- self.exit = pk.ExitEnum.SUCCESS -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="tas", out_signature="", -- sender_keyword="sender") -- def Resolve(self, filter, packages, sender): -- """This method turns a single package name into a package_id suitable -- for the other methods. -- -- If the package is a fully formed package_id, then this should be -- treated as an exact package match. This is useful to find the summary -- or installed status of a package_id returned from other methods. -- -- This method typically emits Error and Package. -- -- Package enumerated types should be available or installed. -- -- :param filter: A correct filter, e.g. none or installed;~devel -- :param packages: -- An array of package names, e.g. scribus-clipart. The package -- names are case sensitive, so for instance: Resolve('Packagekit') -- would not match PackageKit. As a special case, if Resolve() is -- called with a name prefixed with @ then this should be treated as -- a category, for example: @web-development. In this instance, a -- meta-package should be emitted, for example: -- web-development;;;meta with the correct installed status and -- summary for the category. -- """ -- pklog.info("Resolve() was called: %s", get_string_from_array(packages)) -- self.role = pk.RoleEnum.RESOLVE -- kwargs = {"filters": filter, "packages": packages} -- return self._run_query(kwargs, sender) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="t", out_signature="", -- sender_keyword="sender") -- def GetPackages(self, filter, sender): -- """This method returns all the packages without a search term. -- -- This method typically emits Progress, Error and Package. -- -- Package enumerated types should be available or installed. -- -- :param filter: A correct filter, e.g. none or installed;~devel -- """ -- pklog.info("GetPackages() was called") -- self.role = pk.RoleEnum.GET_PACKAGES -- kwargs = {"filters": filter} -- return self._run_query(kwargs, sender) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="as", out_signature="", -- sender_keyword="sender") -- def GetDetails(self, package_ids, sender): -- """This method should return all the details about a specific -- package_id. -- -- This method typically emits Progress, Status and Error and Details. -- -- :param package_ids: An array of package IDs. -- """ -- pklog.info("GetDetails() was called") -- self.role = pk.RoleEnum.GET_DETAILS -- kwargs = {"package_ids": package_ids} -- return self._run_query(kwargs, sender) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="as", out_signature="", -- sender_keyword="sender") -- def GetFiles(self, package_ids, sender): -- """This method should return the file list of the package_id. -- -- This method typically emits Progress, Status and Error and Files. -- -- :param package_ids: An array of package IDs. -- """ -- pklog.info("GetFiles() was called") -- self.role = pk.RoleEnum.GET_FILES -- kwargs = {"package_ids": package_ids} -- return self._run_query(kwargs, sender) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="tas", out_signature="", -- sender_keyword="sender") -- def SearchFiles(self, filter, values, sender): -- """This method searches for files on the local system and files in -- available packages. -- -- This should search for files. This should allow an application to -- find out what package owns a file on the system. -- -- This method typically emits Progress, Error and Package. -- -- Package enumerated types should be available or installed. -- -- :param filter: A correct filter, e.g. none or installed;~devel -- :param values: -- A filename or fully qualified path and filename on the system. -- If the search term begins with a / it will be assumed the entire -- path has been given and only packages that contain this exact -- path and filename will be returned. If the search term does not -- start with / then it should be treated as a single filename, -- which can be in any directory. The search is case sensitive, -- and should not be escaped or surrounded in quotes. -- """ -- pklog.info("SearchFiles() was called") -- self.role = pk.RoleEnum.SEARCH_FILE -- kwargs = {"filters": filter, -- "values": values} -- return self._run_query(kwargs, sender) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="tas", out_signature="", -- sender_keyword="sender") -- def SearchDetails(self, filter, values, sender): -- """This method allows deeper searching than SearchName(). -- -- Do not refresh the package cache. This should be fast. This is very -- similar to search-name. This should search as much data as possible, -- including, if possible repo names, package summaries, descriptions, -- licenses and URLs. -- -- Try to emit installed before available packages first, as it allows -- the client program to perform the GUI filtering and matching whilst -- the daemon is running the transaction. -- -- If the backend includes installed and available versions of the same -- package when searching then the available version will have to be -- filtered in the backend. -- -- This method typically emits Progress, Error and Package. -- -- Package enumerated types should be available or installed. -- -- :param filter: A correct filter, e.g. none or installed;~devel -- :param values: -- A single word search term with no wildcard chars. The search term -- can contain many words separated by spaces. In this case, the -- search operator is AND. For example, search of gnome power should -- returns gnome-power-manager but not gnomesword or powertop. -- The search should not be treated as case sensitive. -- """ -- pklog.info("SearchDetails() was called") -- self.role = pk.RoleEnum.SEARCH_DETAILS -- kwargs = {"filters": filter, -- "values": values} -- return self._run_query(kwargs, sender) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="tas", out_signature="", -- sender_keyword="sender") -- def SearchGroups(self, filter, values, sender): -- """This method returns packages from a given group enumerated type. -- -- Do not refresh the package cache. This should be fast. -- -- Try to emit installed before available packages first, as it -- allows the client program to perform the GUI filtering and matching -- whilst the daemon is running the transaction. -- -- If the backend includes installed and available versions of the same -- package when searching then the available version will have to be -- filtered in the backend. -- -- This method typically emits Progress, Error and Package. -- -- Package enumerated types should be available or installed. -- -- :param filter: A correct filter, e.g. none or installed;~devel -- :param values: -- An enumerated group type, or unknown. The search cannot contain -- spaces. The following recommendations are made below: If the values -- strings are prefixed with category: then the request is treated -- as a 'category search', for example: category:web-development. -- repo: then the request is treated as a 'repository search', for -- example: repo:fedora-debuginfo. In this instance all packages that -- were either installed from, or can be installed from the -- fedora-debuginfo source would be returned. -- """ -- pklog.info("SearchGroups() was called") -- self.role = pk.RoleEnum.SEARCH_GROUP -- kwargs = {"filters": filter, -- "values": values} -- return self._run_query(kwargs, sender) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="tas", out_signature="", -- sender_keyword="sender") -- def SearchNames(self, filter, values, sender): -- """This method searches the package database by package name. -- -- Try to emit installed before available packages first, as it -- allows the client program to perform the GUI filtering and matching -- whilst the daemon is running the transaction. -- -- If the backend includes installed and available versions of the same -- package when searching then the available version will have to be -- filtered in the backend. -- -- The search methods should return all results in all repositories. -- This may mean that multiple versions of package are returned. If this -- is not what is wanted by the client program, then the newest filter -- should be used. -- -- This method typically emits Progress, Error and Package. -- -- Package enumerated types should be available or installed. -- -- :param filter: A correct filter, e.g. none or installed;~devel -- :param values: -- A single word search term with no wildcard chars. The search term -- can contain many words separated by spaces. In this case, the -- search operator is AND. For example, search of gnome power should -- returns gnome-power-manager but not gnomesword or powertop. -- The search should not be treated as case sensitive. -- """ -- pklog.info("SearchNames() was called") -- self.role = pk.RoleEnum.SEARCH_NAME -- kwargs = {"filters": filter, -- "values": values} -- return self._run_query(kwargs, sender) -- -- @dbus.service.method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="s", out_signature="", -- sender_keyword="sender") -- def AcceptEula(self, eula_id, sender): -- """This method allows the user to accept a end user licence agreement. -- -- :param eula_id: A valid EULA ID -- """ -- self.role = pk.RoleEnum.ACCEPT_EULA -- GLib.idle_add(self._fail_not_implemented) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="bas", out_signature="", -- sender_keyword="sender") -- def DownloadPackages(self, store_in_cache, package_ids, sender): -- """This method downloads packages into a temporary directory. -- -- This method should emit one Files signal for each package that -- is downloaded, with the file list set as the name of the complete -- downloaded file and directory, so for example: -- -- DownloadPackages('hal;0.1.2;i386;fedora', -- 'hal-info;2009-09-07;no-arch;updates') should send two signals, -- e.g. Files('hal;0.1.2;i386;fedora', '/tmp/hal-0.1.2.i386.rpm') -- and Files('hal-info;2009-09-07;no-arch;updates', -- '/tmp/hal-info-2009-09-07.noarch.rpm'). -- -- :param store_in_cache: -- If the downloaded files should be stored in the system package -- cache rather than copied into a newly created directory. See the -- developer docs for more details on how this is supposed to work. -- :param package_ids: An array of package IDs. -- """ -- pklog.info("DownloadPackages() was called: %s", -- get_string_from_array(package_ids)) -- self.role = pk.RoleEnum.DOWNLOAD_PACKAGES -- kwargs = {"store_in_cache": store_in_cache, -- "package_ids": package_ids} -- return self._run_query(kwargs, sender) -- -- @dbus.service.method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="u", out_signature="", -- sender_keyword="sender") -- def GetOldTransactions(self, number, sender): -- """This method allows a client to view details for old transactions. -- -- :param number: -- The number of past transactions, or 0 for all known transactions. -- """ -- pklog.info("GetOldTransactions() was called: %s", str(number)) -- self.role = pk.RoleEnum.GET_OLD_TRANSACTIONS -- GLib.idle_add(self._fail_not_implemented) -- -- @dbus.service.method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="t", out_signature="", -- sender_keyword="sender") -- def GetRepoList(self, filter, sender): -- """This method returns the list of repositories used in the system. -- -- This method should emit RepoDetail. -- -- :param filter: A correct filter, e.g. none or installed;~devel -- """ -- pklog.info("GetRepoList() was called") -- self.role = pk.RoleEnum.GET_REPO_LIST -- GLib.idle_add(self._fail_not_implemented) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="tas", out_signature="", -- sender_keyword="sender") -- def InstallFiles(self, flags, full_paths, sender): -- """This method installs local package files onto the local system. -- -- The installer should always install extra dependant packages -- automatically. -- -- This method typically emits Progress, Status and Error and Package. -- -- Package enumerated types should be downloading, updating, installing -- or removing. -- -- :param flags: -- If the transaction is only allowed to install trusted packages. -- Unsigned packages should not be installed if the flags -- contains ONLY_TRUSED. -- If this method is can only install trusted packages, and -- the packages are unsigned, then the backend will send a -- ErrorCode(missing-gpg-signature). On recieving this error, the -- client may choose to retry with ONLY_TRUSTED set after -- gaining further authentication. -- :param full_paths: An array of full path and filenames to packages. -- """ -- pklog.info("InstallFiles() was called: %s, %s", -- get_string_from_flags(flags), -- get_string_from_array(full_paths)) -- return self._install_files(flags, full_paths, sender) -- -- @inline_callbacks -- def _install_files(self, flags, full_paths, sender): -- self.role = pk.RoleEnum.INSTALL_FILES -- self.flags = flags -- # Python-APT only supports installing one file -- if len(full_paths) != 1: -- self.ErrorCode(pk.ErrorEnum.NOT_SUPPORTED, -- "Only one package can be " -- "installed at the same time.") -- self.exit = pk.ExitEnum.FAILED -- raise StopIteration -- path = full_paths[0] -- if not os.path.abspath(path): -- self.ErrorCode(pk.ErrorEnum.NOT_SUPPORTED, -- "Path is not absolute: %s") -- self.exit = pk.ExitEnum.FAILED -- raise StopIteration -- if not os.path.isfile(path): -- self.ErrorCode(pk.ErrorEnum.INVALID_PACKAGE_FILE, -- "File doesn't exist: %s" % path) -- self.exit = pk.ExitEnum.FAILED -- raise StopIteration -- -- kwargs = {"path": path, -- "force": True} -- self.trans = self._get_merged_trans(aptd_enums.ROLE_INSTALL_FILE, -- kwargs=kwargs) -- yield self.trans._run(sender) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="uss", out_signature="", -- sender_keyword="sender") -- def InstallSignature(self, sig_type, key_id, package_id, sender): -- """This method allows us to install new security keys. -- -- :param sig_type: A key type, e.g. gpg -- :param key_id: A key ID, e.g. BB7576AC -- :param package_id: -- A PackageID for the package that the user is trying to install -- (ignored) -- """ -- pklog.info("InstallSignature() was called: %s", str(key_id)) -- self.role = pk.RoleEnum.INSTALL_SIGNATURE -- kwargs = {"sig_type": sig_type, -- "key_id": key_id, -- "package_id": package_id} -- return self._run_query(kwargs, sender) -- -- @dbus.service.method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="sss", out_signature="", -- sender_keyword="sender") -- def RepoSetData(self, repo_id, parameter, value, sender): -- """This method allows arbitary data to be passed to the repository -- handler. -- -- :param repo_id: -- A repository identifier, e.g. fedora-development-debuginfo -- :param parameter: -- The backend specific value, e.g. set-download-url. -- :param value: -- The backend specific value, e.g. http://foo.bar.org/baz. -- """ -- pklog.info("RepoSetData() was called: %s, %s, %s", -- str(repo_id), str(parameter), str(value)) -- self.role = pk.RoleEnum.REPO_SET_DATA -- GLib.idle_add(self._fail_not_implemented) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="sb", out_signature="", -- sender_keyword="sender") -- def RepoEnable(self, repo_id, enabled, sender): -- """This method enables the repository specified. -- -- :param repo_id: -- A repository identifier, e.g. fedora-development-debuginfo or an -- apt source ("deb http://... unstable main") -- :param enabled: true if enabled, false if disabled. -- """ -- pklog.info("RepoEnable() was called(): %s, %s", -- str(repo_id), str(enabled)) -- self.role = pk.RoleEnum.REPO_ENABLE -- kwargs = {"repo_id": repo_id, -- "enabled": enabled} -- return self._run_query(kwargs, sender) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="tsas", out_signature="", -- sender_keyword="sender") -- def WhatProvides(self, filter, type, values, sender): -- """This method returns packages that provide the supplied attributes. -- This method is useful for finding out what package(s) provide a -- modalias or GStreamer codec string. -- -- This method typically emits Progress, Status and Error and Package. -- -- Package enumerated types should be available or installed. -- -- :param filter: -- A correct filter, e.g. none or installed;~devel -- :param type: -- A PkProvideType, e.g. PK_PROVIDES_ENUM_CODEC. -- :param values: -- The data to send to the backend to get the packages. Note: This -- is backend specific. -- """ -- pklog.info("WhatProvides() was called") -- self.role = pk.RoleEnum.WHAT_PROVIDES -- kwargs = {"filters": filter, -- "provides_type": type, -- "values": values} -- return self._run_query(kwargs, sender) -- -- @dbus.service.method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="", out_signature="", -- sender_keyword="sender") -- def GetCategories(self, sender): -- pklog.info("GetCategories() was called") -- """This method return the collection categories""" -- self.role = pk.RoleEnum.GET_CATEGORIES -- GLib.idle_add(self._fail_not_implemented) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="tasb", out_signature="", -- sender_keyword="sender") -- def GetRequires(self, filter, package_ids, recursive, sender): -- """This method returns packages that depend on this package. This is -- useful to know, as if package_id is being removed, we can warn the -- user what else would be removed. -- -- This method typically emits Progress, Status and Error and Package. -- -- Package enumerated types should be available or installed. -- -- :param filter: A correct filter, e.g. none or installed;~devel -- :param package_ids: An array of package IDs. -- :param recursive: -- Either true or false. If yes then the requirements should be -- returned for all packages returned. This means if -- gnome-power-manager depends on NetworkManager and NetworkManager -- depends on HAL, then GetRequires on HAL should return both -- gnome-power-manager and NetworkManager. -- """ -- pklog.info("GetRequires() was called") -- self.role = pk.RoleEnum.GET_REQUIRES -- kwargs = {"filters": filter, -- "package_ids": package_ids, -- "recursive": recursive} -- return self._run_query(kwargs, sender) -- -- @dbus_deferred_method(PACKAGEKIT_TRANS_DBUS_INTERFACE, -- in_signature="tasb", out_signature="", -- sender_keyword="sender") -- def GetDepends(self, filter, package_ids, recursive, sender): -- """This method returns packages that this package depends on. -- -- This method typically emits Progress, Status and Error and Package. -- -- Package enumerated types should be available or installed. -- -- :param filter: A correct filter, e.g. none or installed;~devel -- :param package_ids: An array of package IDs. -- :param recursive: -- Either true or false. If yes then the requirements should be -- returned for all packages returned. This means if -- gnome-power-manager depends on NetworkManager and NetworkManager -- depends on HAL, then GetDepends on gnome-power-manager should -- return both HAL and NetworkManager. -- """ -- pklog.info("GetDepends() was called") -- self.role = pk.RoleEnum.GET_DEPENDS -- kwargs = {"filters": filter, -- "package_ids": package_ids, -- "recursive": recursive} -- return self._run_query(kwargs, sender) -- -- # HELPERS -- -- def _fail_not_implemented(self): -- self.ErrorCode(pk.ErrorEnum.NOT_SUPPORTED, "Unimplemented method") -- self.exit = pk.ExitEnum.FAILED -- return False -- -- def _get_properties(self, iface): -- """Helper to get the properties of a D-Bus interface.""" -- if iface == PACKAGEKIT_TRANS_DBUS_INTERFACE: -- return {"Role": dbus.UInt32(self.role), -- "Status": dbus.UInt32(self.status), -- "LastPackage": dbus.String(self.last_package), -- "Uid": dbus.UInt32(self.uid), -- "Percentage": dbus.UInt32(self.percentage), -- "AllowCancel": dbus.Boolean(self.allow_cancel), -- "CallerActive": dbus.Boolean(self.caller_active), -- "ElapsedTime": dbus.UInt32(self.elapsed_time), -- "RemainingTime": dbus.UInt32(self.remaining_time), -- "DownloadSizeRemaining": dbus.UInt64( -- self.download_size_remaining), -- "TransactionFlags": dbus.UInt64(self.flags), -- "Speed": dbus.UInt32(self.speed) -- } -- else: -- return {} -- -- @inline_callbacks -- def _run_query(self, kwargs, sender): -- self.trans = self._get_merged_trans(aptd_enums.ROLE_PK_QUERY, -- kwargs=kwargs) -- yield self.trans._run(sender) -- -- def _get_aptd_package_id(self, pk_id): -- """Convert a PackageKit Package ID to the apt syntax. -- e.g. xterm;235;i386;installed to xterm:i386=235 -- """ -- name, version, arch, data = pk_id.split(";") -- id = name -- if arch != self.queue.worker.NATIVE_ARCH and arch != "all": -- id += ":%s" % arch -- if version: -- id += "=%s" % version -- return id -- -- def _get_merged_trans(self, role, pkg_ids=None, pkg_type=None, -- kwargs=None): -- if pkg_ids: -- packages = [[], [], [], [], [], []] -- packages[pkg_type] = [self._get_aptd_package_id(pkg) -- for pkg in pkg_ids] -- else: -- packages = None -- if self.trans: -- raise Exception("%s: Transaction may only run once." % -- pk.ErrorEnum.TRANSACTION_FAILED) -- trans = MergedTransaction(self, role, self.queue, -- packages=packages, kwargs=kwargs) -- try: -- trans._set_locale(self.hints["locale"]) -- except (KeyError, ValueError): -- # If the locale isn't vaild or supported a ValueError -- # will be raised -- pass -- try: -- trans._set_debconf(self.hints["frontend-socket"]) -- except KeyError: -- pass -- self.queue.limbo[trans.tid] = trans -- return trans -- -- --if META_RELEASE_SUPPORT: -- -- class GMetaRelease(GObject.GObject, MetaReleaseCore): -- -- __gsignals__ = {"download-done": (GObject.SignalFlags.RUN_FIRST, -- None, -- ())} -- -- def __init__(self): -- GObject.GObject.__init__(self) -- MetaReleaseCore.__init__(self, False, False) -- -- def download(self): -- MetaReleaseCore.download(self) -- self.emit("download-done") -- -- --def get_pk_exit_enum(enum): -- try: -- return MAP_EXIT_ENUM[enum] -- except KeyError: -- return pk.ExitEnum.UNKNOWN -- -- --def get_pk_status_enum(enum): -- try: -- return MAP_STATUS_ENUM[enum] -- except KeyError: -- return pk.StatusEnum.UNKNOWN -- -- --def get_pk_package_enum(enum): -- try: -- return MAP_PACKAGE_ENUM[enum] -- except KeyError: -- return pk.InfoEnum.UNKNOWN -- -- --def get_pk_error_enum(enum): -- try: -- return MAP_ERROR_ENUM[enum] -- except KeyError: -- return pk.ErrorEnum.UNKNOWN -- -- --def get_pk_package_id(pk_id, data=""): -- """Convert an AptDaemon package ID to the PackageKit syntax. -- e.g. xterm:i368=235; to xterm;235;i386;installed -- """ -- # FIXME add arch support -- name, version, release = split_package_id(pk_id) -- try: -- name, arch = name.split(":", 1) -- except ValueError: -- arch = "" -- if version is None: -- version = "" -- if release is None: -- release = "" -- return "%s;%s;%s;%s" % (name, version, arch, data or release) -- -- --def defer_idle(func, *args): -- func(*args) -- return False -- -- --def get_string_from_flags(flags): -- """Return a human readable string of the applied transaction flags.""" -- ret = "" -- if flags == pk.TransactionFlagEnum.NONE: -- return "simulate" -- if bitfield_contains(flags, pk.TransactionFlagEnum.SIMULATE): -- ret += " simulate" -- if bitfield_contains(flags, pk.TransactionFlagEnum.ONLY_DOWNLOAD): -- ret += " only-download" -- if bitfield_contains(flags, pk.TransactionFlagEnum.ONLY_TRUSTED): -- ret += " only-trusted" -- return ret.strip() -- -- --def get_string_from_array(array): -- """Convert a DBus Array to a human readable format""" -- return [str(value) for value in array] -- -- --# vim: ts=4 et sts=4 diff --git a/debian/patches/failing-tests.patch b/debian/patches/failing-tests.patch deleted file mode 100644 index f871fde..0000000 --- a/debian/patches/failing-tests.patch +++ /dev/null @@ -1,85 +0,0 @@ -Description: Fix tests - Various test fixes, and disabling of broken ones -Author: Julian Andres Klode <julian.klode@canonical.com> ---- -This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ ---- a/tests/test_lock.py -+++ b/tests/test_lock.py -@@ -74,7 +74,7 @@ class LockTest(unittest.TestCase): - # Lock! - aptdaemon.worker.aptworker.lock.status_lock.acquire() - self.assertEqual(2, subprocess.call(self.dpkg_cmd, env=self.env)) -- self.assertEqual(100, subprocess.call(self.apt_cmd, env=self.env, -+ self.assertEqual(0, subprocess.call(self.apt_cmd, env=self.env, - shell=True)) - # Relase and all should work again! - aptdaemon.worker.aptworker.lock.status_lock.release() -@@ -105,7 +105,7 @@ class LockTest(unittest.TestCase): - # Dpkg and apt-get doen't care about the lock as long as there aren't - # any downloads required - self.assertEqual(0, subprocess.call(self.dpkg_cmd, env=self.env)) -- self.assertEqual(0, subprocess.call(self.apt_cmd, env=self.env, -+ self.assertEqual(100, subprocess.call(self.apt_cmd, env=self.env, - shell=True)) - self.assertEqual(100, subprocess.call(self.inst_cmd, env=self.env, - shell=True)) ---- a/tests/test_pep8.py -+++ b/tests/test_pep8.py -@@ -26,6 +26,7 @@ import subprocess - import unittest - - -+@unittest.skip("Does not work") - class AptDaemonPep8TestCase(unittest.TestCase): - - def test(self): ---- a/tests/test_pk.py -+++ b/tests/test_pk.py -@@ -34,6 +34,7 @@ REPO_PATH = os.path.join(aptdaemon.test. - DEBUG = True - - -+@unittest.skip("Removed PackageKit compat") - class PackageKitTest(aptdaemon.test.AptDaemonTestCase): - - """Test the PackageKit compatibility layer.""" ---- a/tests/test_progress.py -+++ b/tests/test_progress.py -@@ -8,11 +8,17 @@ import mock - import sys - import unittest - -+import aptdaemon.test - from aptdaemon.progress import DaemonOpenProgress - - - class TestProgress(unittest.TestCase): - -+ def setUp(self): -+ self.chroot = aptdaemon.test.Chroot() -+ self.chroot.setup() -+ self.addCleanup(self.chroot.remove) -+ - def test_open_progress(self): - transaction = mock.Mock() - begin = 0 ---- a/aptdaemon/test.py -+++ b/aptdaemon/test.py -@@ -75,6 +75,7 @@ class Chroot(object): - os.makedirs(os.path.join(self.path, "etc/apt/apt.conf.d")) - os.makedirs(os.path.join(self.path, "etc/apt/sources.list.d")) - os.makedirs(os.path.join(self.path, "etc/apt/preferences.d")) -+ os.makedirs(os.path.join(self.path, "etc/apt/trusted.gpg.d")) - os.makedirs(os.path.join(self.path, "var/log")) - os.makedirs(os.path.join(self.path, "media")) - ---- a/tests/test_client.py -+++ b/tests/test_client.py -@@ -77,6 +77,7 @@ class ClientTest(aptdaemon.test.AptDaemo - self.chroot.setup() - self.addCleanup(self.chroot.remove) - self.chroot.add_test_repository() -+ self.chroot.add_trusted_key() - # Start aptdaemon with the chroot on the session bus - self.start_dbus_daemon() - self.bus = dbus.bus.BusConnection(self.dbus_address) diff --git a/debian/patches/fix-dependency-solving.patch b/debian/patches/fix-dependency-solving.patch deleted file mode 100644 index 56779fe..0000000 --- a/debian/patches/fix-dependency-solving.patch +++ /dev/null @@ -1,97 +0,0 @@ -Description: Fix dependency solving - The install_protect() method was deprecated ages ago, and there are all - sorts of issues here. - . - So first of all, remove the install_protect() call as it was removed in apt - 1.9. - . - Secondly, do not pass auto_fix=True to mark_install(), as that creates its - own solver for each package and solves just that packages dependencies, which - causes odd results (the package could no longer be marked for install after - calling mark_install if its dependencies cannot be satisfied) - . - Thirdly, move the whole marking bits below any changes to the candidate - version so we actually mark the correct version for install. This worked - OK-ish before, because the install_protect() call would re-mark the packages, - but ugh, it's just crazy. -Author: Julian Andres Klode <juliank@ubuntu.com> ---- a/aptdaemon/worker/aptworker.py -+++ b/aptdaemon/worker/aptworker.py -@@ -338,7 +338,6 @@ class AptWorker(BaseWorker): - def _resolve_depends(self, trans, resolver): - """Resolve the dependencies using the given ProblemResolver.""" - self._call_plugins("modify_cache_before", resolver) -- resolver.install_protect() - try: - resolver.resolve() - except SystemError: -@@ -421,9 +420,7 @@ class AptWorker(BaseWorker): - raise TransactionFailed( - ERROR_PACKAGE_ALREADY_INSTALLED, - _("Package %s is already installed"), pkg_name) -- pkg.mark_install(False, True, from_user) -- resolver.clear(pkg) -- resolver.protect(pkg) -+ - if pkg_ver: - try: - pkg.candidate = pkg.versions[pkg_ver] -@@ -434,6 +431,10 @@ class AptWorker(BaseWorker): - elif pkg_rel: - self._set_candidate_release(pkg, pkg_rel) - -+ pkg.mark_install(False, False, from_user) -+ resolver.clear(pkg) -+ resolver.protect(pkg) -+ - def enable_distro_comp(self, trans, component): - """Enable given component in the sources list. - -@@ -777,10 +778,7 @@ class AptWorker(BaseWorker): - _("Package %s isn't installed"), - pkg_name) - auto = pkg.is_auto_installed -- pkg.mark_install(False, True, True) -- pkg.mark_auto(auto) -- resolver.clear(pkg) -- resolver.protect(pkg) -+ - if pkg_ver: - if pkg.installed and pkg.installed.version < pkg_ver: - # FIXME: We need a new error enum -@@ -805,6 +803,11 @@ class AptWorker(BaseWorker): - "downgrade %s to"), - pkg_name) - -+ pkg.mark_install(False, False, True) -+ pkg.mark_auto(auto) -+ resolver.clear(pkg) -+ resolver.protect(pkg) -+ - def _mark_packages_for_upgrade(self, packages, resolver): - """Mark packages for upgrade.""" - for pkg_name, pkg_ver, pkg_rel in [self._split_package_id(pkg) -@@ -820,10 +823,7 @@ class AptWorker(BaseWorker): - _("Package %s isn't installed"), - pkg_name) - auto = pkg.is_auto_installed -- pkg.mark_install(False, True, True) -- pkg.mark_auto(auto) -- resolver.clear(pkg) -- resolver.protect(pkg) -+ - if pkg_ver: - if (pkg.installed and - apt_pkg.version_compare(pkg.installed.version, -@@ -849,6 +849,11 @@ class AptWorker(BaseWorker): - elif pkg_rel: - self._set_candidate_release(pkg, pkg_rel) - -+ pkg.mark_install(False, False, True) -+ pkg.mark_auto(auto) -+ resolver.clear(pkg) -+ resolver.protect(pkg) -+ - @staticmethod - def _set_candidate_release(pkg, release): - """Set the candidate of a package to the one from the given release.""" diff --git a/debian/patches/fix-high-trust-pkcompat.diff b/debian/patches/fix-high-trust-pkcompat.diff deleted file mode 100644 index 6084b5c..0000000 --- a/debian/patches/fix-high-trust-pkcompat.diff +++ /dev/null @@ -1,16 +0,0 @@ -Index: aptdaemon/aptdaemon/worker/aptworker.py -=================================================================== ---- aptdaemon.orig/aptdaemon/worker/aptworker.py -+++ aptdaemon/aptdaemon/worker/aptworker.py -@@ -113,8 +113,10 @@ def trans_only_installs_pkgs_from_high_t - # paranoia(2): we must want to install something - if not trans.packages[PKGS_INSTALL]: - return False -+ # we only care about the name, not the version -+ pkgs = [pkg.split("=")[0] for pkg in trans.packages[PKGS_INSTALL]] - # if the install packages matches the whitelisted set we are good -- return set(trans.packages[PKGS_INSTALL]) == set(trans.high_trust_packages) -+ return set(pkgs) == set(trans.high_trust_packages) - - - def read_high_trust_repository_dir(whitelist_cfg_d): diff --git a/debian/patches/fix-installation.patch b/debian/patches/fix-installation.patch deleted file mode 100644 index c961842..0000000 --- a/debian/patches/fix-installation.patch +++ /dev/null @@ -1,18 +0,0 @@ -Description: Don't consider the "data" when installing a package - this is usually "Ubuntu" and isn't useful to pass to apt. -Author: Justin McPherson <justin.mcpherson@canonical.com> -Forwarded: https://code.launchpad.net/~justinmcp/aptdaemon/1352654/+merge/243354 -Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/aptdaemon/+bug/1352654 - -Index: b/aptdaemon/pkcompat.py -=================================================================== ---- a/aptdaemon/pkcompat.py -+++ b/aptdaemon/pkcompat.py -@@ -1904,8 +1904,6 @@ - id += ":%s" % arch - if version: - id += "=%s" % version -- if data and data not in ["local", "installed"]: -- id += "/%s" % data - return id - - def _get_merged_trans(self, role, pkg_ids=None, pkg_type=None, diff --git a/debian/patches/fix-some-deprecated-code.patch b/debian/patches/fix-some-deprecated-code.patch deleted file mode 100644 index 2cbca09..0000000 --- a/debian/patches/fix-some-deprecated-code.patch +++ /dev/null @@ -1,182 +0,0 @@ -Description: Fix some deprecated code -Author: Gunnar Hjalmarsson <gunnarhj@ubuntu.com> -Bug-Ubuntu: https://launchpad.net/bugs/1951985 -Last-Update: 2021-11-23 ---- - aptdaemon/client.py | 52 ++++++++++++++++++++++++++-------------------------- - aptdaemon/errors.py | 2 +- - aptdaemon/gtk3widgets.py | 6 +++--- - 3 files changed, 30 insertions(+), 30 deletions(-) - -diff --git a/aptdaemon/client.py b/aptdaemon/client.py -index c9fccd2..db032a3 100644 ---- a/aptdaemon/client.py -+++ b/aptdaemon/client.py -@@ -385,10 +385,10 @@ class AptTransaction(GObject.Object): - dependencies before the transaction will be executed. - """ - -- __gsignals__ = {"finished": (GObject.SIGNAL_RUN_FIRST, -+ __gsignals__ = {"finished": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_STRING,)), -- "dependencies-changed": (GObject.SIGNAL_RUN_FIRST, -+ "dependencies-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_PYOBJECT, - GObject.TYPE_PYOBJECT, -@@ -397,37 +397,37 @@ class AptTransaction(GObject.Object): - GObject.TYPE_PYOBJECT, - GObject.TYPE_PYOBJECT, - GObject.TYPE_PYOBJECT)), -- "download-changed": (GObject.SIGNAL_RUN_FIRST, -+ "download-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_INT64,)), -- "space-changed": (GObject.SIGNAL_RUN_FIRST, -+ "space-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_INT64,)), -- "error": (GObject.SIGNAL_RUN_FIRST, -+ "error": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_STRING, GObject.TYPE_STRING)), -- "role-changed": (GObject.SIGNAL_RUN_FIRST, -+ "role-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_STRING,)), -- "terminal-attached-changed": (GObject.SIGNAL_RUN_FIRST, -+ "terminal-attached-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_BOOLEAN,)), -- "cancellable-changed": (GObject.SIGNAL_RUN_FIRST, -+ "cancellable-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_BOOLEAN,)), -- "meta-data-changed": (GObject.SIGNAL_RUN_FIRST, -+ "meta-data-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_PYOBJECT,)), -- "status-changed": (GObject.SIGNAL_RUN_FIRST, -+ "status-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_STRING,)), -- "status-details-changed": (GObject.SIGNAL_RUN_FIRST, -+ "status-details-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_STRING,)), -- "progress-changed": (GObject.SIGNAL_RUN_FIRST, -+ "progress-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_INT,)), -- "progress-details-changed": (GObject.SIGNAL_RUN_FIRST, -+ "progress-details-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_INT, - GObject.TYPE_INT, -@@ -435,7 +435,7 @@ class AptTransaction(GObject.Object): - GObject.TYPE_INT64, - GObject.TYPE_INT, - GObject.TYPE_INT64)), -- "progress-download-changed": (GObject.SIGNAL_RUN_FIRST, -+ "progress-download-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_STRING, - GObject.TYPE_STRING, -@@ -443,7 +443,7 @@ class AptTransaction(GObject.Object): - GObject.TYPE_INT64, - GObject.TYPE_INT64, - GObject.TYPE_STRING)), -- "packages-changed": (GObject.SIGNAL_RUN_FIRST, -+ "packages-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_PYOBJECT, - GObject.TYPE_PYOBJECT, -@@ -451,39 +451,39 @@ class AptTransaction(GObject.Object): - GObject.TYPE_PYOBJECT, - GObject.TYPE_PYOBJECT, - GObject.TYPE_PYOBJECT)), -- "unauthenticated-changed": (GObject.SIGNAL_RUN_FIRST, -+ "unauthenticated-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_PYOBJECT,)), -- "paused": (GObject.SIGNAL_RUN_FIRST, -+ "paused": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - ()), -- "resumed": (GObject.SIGNAL_RUN_FIRST, -+ "resumed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - ()), -- "allow-unauthenticated-changed": (GObject.SIGNAL_RUN_FIRST, -+ "allow-unauthenticated-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_BOOLEAN,)), - "remove-obsoleted-depends-changed": ( -- GObject.SIGNAL_RUN_FIRST, -+ GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_BOOLEAN,)), -- "locale-changed": (GObject.SIGNAL_RUN_FIRST, -+ "locale-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_STRING,)), -- "terminal-changed": (GObject.SIGNAL_RUN_FIRST, -+ "terminal-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_STRING,)), -- "debconf-socket-changed": (GObject.SIGNAL_RUN_FIRST, -+ "debconf-socket-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_STRING,)), -- "http-proxy-changed": (GObject.SIGNAL_RUN_FIRST, -+ "http-proxy-changed": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_STRING,)), -- "medium-required": (GObject.SIGNAL_RUN_FIRST, -+ "medium-required": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_STRING, - GObject.TYPE_STRING)), -- "config-file-conflict": (GObject.SIGNAL_RUN_FIRST, -+ "config-file-conflict": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, - (GObject.TYPE_STRING, - GObject.TYPE_STRING)), -diff --git a/aptdaemon/errors.py b/aptdaemon/errors.py -index 4783179..cd98d6e 100644 ---- a/aptdaemon/errors.py -+++ b/aptdaemon/errors.py -@@ -174,7 +174,7 @@ def convert_dbus_exception(func): - This decorator requires introspection to the decorated function. So it - cannot be used on any already decorated method. - """ -- argnames, varargs, kwargs, defaults = inspect.getargspec(func) -+ argnames, varargs, kwargs, defaults = inspect.getfullargspec(func)[:4] - - @wraps(func) - def _convert_dbus_exception(*args, **kwargs): -diff --git a/aptdaemon/gtk3widgets.py b/aptdaemon/gtk3widgets.py -index af9faec..5c99c1d 100644 ---- a/aptdaemon/gtk3widgets.py -+++ b/aptdaemon/gtk3widgets.py -@@ -562,7 +562,7 @@ class AptProgressDialog(Gtk.Dialog): - features a progress bar, cancel button, status icon and label - """ - -- __gsignals__ = {"finished": (GObject.SIGNAL_RUN_FIRST, -+ __gsignals__ = {"finished": (GObject.SignalFlags.RUN_FIRST, - GObject.TYPE_NONE, ())} - - def __init__(self, transaction=None, parent=None, terminal=True, -@@ -1086,8 +1086,8 @@ class AptConfigFileConflictDialog(_ExpandableDialog): - return _ExpandableDialog.run(self) - - --REGEX_RANGE = "^@@ \-(?P<from_start>[0-9]+)(?:,(?P<from_context>[0-9]+))? " \ -- "\+(?P<to_start>[0-9]+)(?:,(?P<to_context>[0-9]+))? @@" -+REGEX_RANGE = "^@@ \\-(?P<from_start>[0-9]+)(?:,(?P<from_context>[0-9]+))? " \ -+ "\\+(?P<to_start>[0-9]+)(?:,(?P<to_context>[0-9]+))? @@" - - - class DiffView(Gtk.TextView): diff --git a/debian/patches/frontend-locking.patch b/debian/patches/frontend-locking.patch deleted file mode 100644 index 1045124..0000000 --- a/debian/patches/frontend-locking.patch +++ /dev/null @@ -1,56 +0,0 @@ -Description: Various locking fixes (LP: #1831981) - - Implement frontend locking - - Adjust locking order to match APT - - Use reverse order for unlocking -Author: Julian Andres Klode <juliank@ubuntu.com> -Bug-Ubuntu: https://bugs.launchpad.net/bugs/1831981 - ---- a/aptdaemon/lock.py -+++ b/aptdaemon/lock.py -@@ -118,6 +118,7 @@ apt_pkg.init() - #: The lock for dpkg status file - _status_dir = os.path.dirname(apt_pkg.config.find_file("Dir::State::status")) - status_lock = FileLock(os.path.join(_status_dir, "lock")) -+frontend_lock = FileLock(os.path.join(_status_dir, "lock-frontend")) - - #: The lock for the package archive - _archives_dir = apt_pkg.config.find_dir("Dir::Cache::Archives") -@@ -131,19 +132,25 @@ lists_lock = FileLock(os.path.join( - def acquire(): - """Acquire an exclusive lock for the package management system.""" - try: -- for lock in archive_lock, status_lock, lists_lock: -+ for lock in frontend_lock, status_lock, archive_lock, lists_lock: - if not lock.locked: - lock.acquire() - except: - release() - raise - -+ os.environ['DPKG_FRONTEND_LOCKED'] = '1' - - def release(): - """Release an exclusive lock for the package management system.""" -- for lock in archive_lock, status_lock, lists_lock: -+ for lock in lists_lock, archive_lock, status_lock, frontend_lock: - lock.release() - -+ try: -+ del os.environ['DPKG_FRONTEND_LOCKED'] -+ except KeyError: -+ pass -+ - - def wait_for_lock(trans, alt_lock=None): - """Acquire the system lock or the optionally given one. If the lock ---- a/aptdaemon/worker/aptworker.py -+++ b/aptdaemon/worker/aptworker.py -@@ -198,6 +198,8 @@ class AptWorker(BaseWorker): - apt_pkg.config["DPkg::Options::"] = ("--log=%s/var/log/dpkg.log" % - chroot) - status_file = apt_pkg.config.find_file("Dir::State::status") -+ lock.frontend_lock.path = os.path.join(os.path.dirname(status_file), -+ "lock-frontend") - lock.status_lock.path = os.path.join(os.path.dirname(status_file), - "lock") - archives_dir = apt_pkg.config.find_dir("Dir::Cache::Archives") diff --git a/debian/patches/gdk-gtk-versions.py b/debian/patches/gdk-gtk-versions.py deleted file mode 100644 index ce1e950..0000000 --- a/debian/patches/gdk-gtk-versions.py +++ /dev/null @@ -1,13 +0,0 @@ -Index: aptdaemon-1.1.1+bzr982/aptdaemon/gtk3widgets.py -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/aptdaemon/gtk3widgets.py -+++ aptdaemon-1.1.1+bzr982/aptdaemon/gtk3widgets.py -@@ -40,6 +40,8 @@ import re - - import gi - gi.require_version("Vte", "2.91") -+gi.require_version("Gdk", "3.0") -+gi.require_version("Gtk", "3.0") - - import apt_pkg - from gi.repository import GObject diff --git a/debian/patches/key_value_typo.patch b/debian/patches/key_value_typo.patch deleted file mode 100644 index b286df1..0000000 --- a/debian/patches/key_value_typo.patch +++ /dev/null @@ -1,18 +0,0 @@ -Description: Remove trailing comma, was causing a TypeError. -Author: Justin McPherson <justin.mcpherson@canonical.com> -Forwarded: https://code.launchpad.net/~justinmcp/aptdaemon/1352654/+merge/243354 -Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/aptdaemon/+bug/1352654 -=== modified file 'aptdaemon/aptdaemon/worker/aptworker.py' -Index: aptdaemon-1.1.1+bzr982/aptdaemon/worker/aptworker.py -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/aptdaemon/worker/aptworker.py -+++ aptdaemon-1.1.1+bzr982/aptdaemon/worker/aptworker.py -@@ -1511,7 +1511,7 @@ class AptWorker(BaseWorker): - key = "APT::Periodic::AutocleanInterval" - return apt_pkg.config.find_i(key, 0) - elif option == "UnattendedUpgrade": -- key = "APT::Periodic::Unattended-Upgrade", -+ key = "APT::Periodic::Unattended-Upgrade" - return apt_pkg.config.find_b(key, False) - elif option == "GetPopconParticipation": - return self._get_popcon_pariticipation() diff --git a/debian/patches/lintian_deprecated_error.patch b/debian/patches/lintian_deprecated_error.patch deleted file mode 100644 index a9b0309..0000000 --- a/debian/patches/lintian_deprecated_error.patch +++ /dev/null @@ -1,20 +0,0 @@ -Description: don't list deprecated lintian case -Author: Sebastien Bacher <seb128@ubuntu.com> -Forwarded: https://code.launchpad.net/~seb128/aptdaemon/lintian-upx-deprecated/+merge/272924 -Bug-Ubuntu: https://launchpad.net/bugs/1490169 -=== modified file 'aptdaemon/data/lintian/ubuntu/aptdaemon.profile' -Index: aptdaemon-1.1.1+bzr982/data/lintian/ubuntu/aptdaemon.profile -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/data/lintian/ubuntu/aptdaemon.profile -+++ aptdaemon-1.1.1+bzr982/data/lintian/ubuntu/aptdaemon.profile -@@ -5,9 +5,8 @@ Disable-Tags: - FSSTND-dir-in-usr, - FSSTND-dir-in-var, - arch-dependent-file-in-usr-share, -- binary-file-compressed-with-upx, - binary-or-shlib-defines-rpath, -- control-interpreter-in-usr-local, -+ control-interpreter-in-usr-local, - copyright-contains-dh_make-todo-boilerplate, - copyright-file-compressed, - copyright-file-is-symlink, diff --git a/debian/patches/lock-is-held-typo.patch b/debian/patches/lock-is-held-typo.patch deleted file mode 100644 index 5220b7d..0000000 --- a/debian/patches/lock-is-held-typo.patch +++ /dev/null @@ -1,15 +0,0 @@ -Description: Fix typo hold vs held. -Author: Julian Andres Klode <juliank@ubuntu.com> -Last-Update: 2019-06-21 - ---- aptdaemon-1.1.1+bzr982.orig/aptdaemon/lock.py -+++ aptdaemon-1.1.1+bzr982/aptdaemon/lock.py -@@ -45,7 +45,7 @@ class LockFailedError(Exception): - """ - msg = "Could not acquire lock on %s." % flock - if process: -- msg += " The lock is hold by %s." % process -+ msg += " The lock is held by %s." % process - Exception.__init__(self, msg) - self.flock = flock - self.process = process diff --git a/debian/patches/lp1153725-temporary-workaround.patch b/debian/patches/lp1153725-temporary-workaround.patch deleted file mode 100644 index 8332058..0000000 --- a/debian/patches/lp1153725-temporary-workaround.patch +++ /dev/null @@ -1,25 +0,0 @@ -Description: Skip expected failures due to LP: #1153725. - Remove this when the actual bug is fixed or when we have a better patch. -Author: Barry Warsaw <barry@ubuntu.com> -Forwarded: not-needed - -Index: aptdaemon-1.0/tests/test_high_trust_repository_whitelist.py -=================================================================== ---- aptdaemon-1.0.orig/tests/test_high_trust_repository_whitelist.py 2013-03-18 14:24:18.377381909 +0100 -+++ aptdaemon-1.0/tests/test_high_trust_repository_whitelist.py 2013-03-18 14:24:43.493382864 +0100 -@@ -72,6 +72,7 @@ - self.worker.connect("transaction-simulated", - lambda w, t: self.loop.quit()) - -+ @unittest.expectedFailure - def test_read_high_trust_repository_whitelist_dir(self): - whitelist = read_high_trust_repository_dir( - os.path.join(aptdaemon.test.get_tests_dir(), -@@ -167,6 +168,7 @@ - self.start_fake_polkitd(PK_ACTION) - time.sleep(1) - -+ @unittest.expectedFailure - def test_high_trust_polkit_ok(self): - self.client = aptdaemon.client.AptClient(self.bus) - # test that the high trust whitelist works diff --git a/debian/patches/lp1356823.diff b/debian/patches/lp1356823.diff deleted file mode 100644 index db7efb4..0000000 --- a/debian/patches/lp1356823.diff +++ /dev/null @@ -1,13 +0,0 @@ -=== modified file 'aptdaemon/pkcompat.py' ---- old/aptdaemon/pkcompat.py 2014-06-26 07:07:15 +0000 -+++ new/aptdaemon/pkcompat.py 2015-04-16 15:04:08 +0000 -@@ -586,6 +586,8 @@ - - def _remove_from_connection_no_raise(self): - core.Transaction._remove_from_connection_no_raise(self) -+ if self.pktrans is None: -+ return False - self.pktrans.Destroy() - try: - self.pktrans.remove_from_connection() - diff --git a/debian/patches/lp1439769-aptdaemon-autoinstall.patch b/debian/patches/lp1439769-aptdaemon-autoinstall.patch deleted file mode 100644 index 91120c9..0000000 --- a/debian/patches/lp1439769-aptdaemon-autoinstall.patch +++ /dev/null @@ -1,50 +0,0 @@ -Description: Take a flag to indicate whether a requested package is auto-installed - The aptdaemon API takes a complete list of packages to be installed, - including dependencies. This means that all packages are marked as - "selected" by the "user" for installation, even if on the other end of the - API they were selected for installation only to resolve dependencies of - other packages. - . - This patch adds an optional "auto" flag to the list of packages passed from - the client, so that aptdaemon can pass this information on to apt. -Author: Michael Vogt <mvo@ubuntu.com> -Bug-Ubuntu: https://bugs.launchpad.net/bugs/1439769 - -=== modified file 'aptdaemon/core.py' -Index: wily/aptdaemon/core.py -=================================================================== ---- wily.orig/aptdaemon/core.py -+++ wily/aptdaemon/core.py -@@ -2069,6 +2069,10 @@ class AptDaemon(DBusObject): - """ - for fullname in pkg_names: - name, version, release = split_package_id(fullname) -+ name, sep, auto_flag = name.partition("#") -+ if not auto_flag in ("", "auto"): -+ raise errors.AptDaemonError("%s isn't a valid flag" % -+ auto_flag) - if not re.match(REGEX_VALID_PACKAGENAME, name): - raise errors.AptDaemonError("%s isn't a valid package name" % - name) -Index: wily/aptdaemon/worker/aptworker.py -=================================================================== ---- wily.orig/aptdaemon/worker/aptworker.py -+++ wily/aptdaemon/worker/aptworker.py -@@ -388,6 +388,8 @@ class AptWorker(BaseWorker): - """Mark packages for installation.""" - for pkg_name, pkg_ver, pkg_rel in [self._split_package_id(pkg) - for pkg in packages]: -+ pkg_name, sep, auto_marker = pkg_name.partition("#") -+ from_user = (auto_marker != "auto") - try: - pkg = self._cache[pkg_name] - except KeyError: -@@ -417,7 +419,7 @@ class AptWorker(BaseWorker): - raise TransactionFailed( - ERROR_PACKAGE_ALREADY_INSTALLED, - _("Package %s is already installed"), pkg_name) -- pkg.mark_install(False, True, True) -+ pkg.mark_install(False, True, from_user) - resolver.clear(pkg) - resolver.protect(pkg) - if pkg_ver: diff --git a/debian/patches/lp1449587.diff b/debian/patches/lp1449587.diff deleted file mode 100644 index 16f82b6..0000000 --- a/debian/patches/lp1449587.diff +++ /dev/null @@ -1,363 +0,0 @@ -=== modified file 'aptdaemon/core.py' -Index: aptdaemon-1.1.1+bzr982/aptdaemon/core.py -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/aptdaemon/core.py 2015-06-11 09:18:21.910695506 -0400 -+++ aptdaemon-1.1.1+bzr982/aptdaemon/core.py 2015-06-11 09:18:21.906695457 -0400 -@@ -324,7 +324,7 @@ - "DebconfSocket", "MetaData", "Locale", - "RemoveObsoleteDepends") - -- def __init__(self, tid, role, queue, pid, uid, cmdline, sender, -+ def __init__(self, tid, role, queue, pid, uid, gid, cmdline, sender, - connect=True, bus=None, packages=None, kwargs=None): - """Initialize a new Transaction instance. - -@@ -360,6 +360,7 @@ - kwargs = {} - self.queue = queue - self.uid = uid -+ self.gid = gid - self.locale = dbus.String("") - self.allow_unauthenticated = dbus.Boolean(False) - self.remove_obsoleted_depends = dbus.Boolean(False) -@@ -1521,11 +1522,12 @@ - @inline_callbacks - def _create_trans(self, role, sender, packages=None, kwargs=None): - """Helper method which returns the tid of a new transaction.""" -- pid, uid, cmdline = ( -+ pid, uid, gid, cmdline = ( - yield policykit1.get_proc_info_from_dbus_name(sender, self.bus)) - tid = uuid.uuid4().hex -- trans = Transaction(tid, role, self.queue, pid, uid, cmdline, sender, -- packages=packages, kwargs=kwargs, bus=self.bus) -+ trans = Transaction( -+ tid, role, self.queue, pid, uid, gid, cmdline, sender, -+ packages=packages, kwargs=kwargs, bus=self.bus) - self.queue.limbo[trans.tid] = trans - return_value(trans.tid) - -Index: aptdaemon-1.1.1+bzr982/aptdaemon/pkcompat.py -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/aptdaemon/pkcompat.py 2015-06-11 09:18:21.910695506 -0400 -+++ aptdaemon-1.1.1+bzr982/aptdaemon/pkcompat.py 2015-06-11 09:18:21.910695506 -0400 -@@ -334,9 +334,10 @@ - - @inline_callbacks - def _create_transaction(self, sender): -- pid, uid, cmdline = yield policykit1.get_proc_info_from_dbus_name( -+ pid, uid, gid, cmdline = yield policykit1.get_proc_info_from_dbus_name( - sender, self.bus) -- pktrans = PackageKitTransaction(pid, uid, cmdline, self.queue, sender) -+ pktrans = PackageKitTransaction( -+ pid, uid, gid, cmdline, self.queue, sender) - return_value(pktrans.tid) - - # pylint: disable-msg=C0103,C0322 -@@ -468,7 +469,7 @@ - def __init__(self, pktrans, role, queue, connect=True, - bus=None, packages=None, kwargs=None): - core.Transaction.__init__(self, pktrans.tid[1:], role, queue, -- pktrans.pid, pktrans.uid, -+ pktrans.pid, pktrans.uid, pktrans.gid, - pktrans.cmdline, pktrans.sender, - connect, bus, packages, kwargs) - self.pktrans = pktrans -@@ -626,7 +627,7 @@ - - """Provides a PackageKit transaction object.""" - -- def __init__(self, pid, uid, cmdline, queue, sender, -+ def __init__(self, pid, uid, gid, cmdline, queue, sender, - connect=True, bus=None): - pklog.info("Initializing PackageKit transaction") - bus_name = None -@@ -652,6 +653,7 @@ - self._status = pk.StatusEnum.SETUP - self._last_package = "" - self.uid = dbus.UInt32(uid) -+ self.gid = dbus.UInt32(gid) - self.pid = pid - self.cmdline = cmdline - self.role = pk.RoleEnum.UNKNOWN -Index: aptdaemon-1.1.1+bzr982/aptdaemon/policykit1.py -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/aptdaemon/policykit1.py 2015-06-11 09:18:21.910695506 -0400 -+++ aptdaemon-1.1.1+bzr982/aptdaemon/policykit1.py 2015-06-11 09:18:21.910695506 -0400 -@@ -161,12 +161,15 @@ - bus = dbus.SystemBus() - pid = yield get_pid_from_dbus_name(dbus_name, bus) - with open("/proc/%s/status" % pid) as proc: -- values = [v for v in proc.readlines() if v.startswith("Uid:")] -+ lines = proc.readlines() -+ uid_values = [v for v in lines if v.startswith("Uid:")] -+ gid_values = [v for v in lines if v.startswith("Gid:")] - # instead of ", encoding='utf8'" we use the "rb"/decode() here for - # py2 compatibility - with open("/proc/%s/cmdline" % pid, "rb") as cmdline_file: - cmdline = cmdline_file.read().decode("utf-8") -- uid = int(values[0].split()[1]) -- return_value((pid, uid, cmdline)) -+ uid = int(uid_values[0].split()[1]) -+ gid = int(gid_values[0].split()[1]) -+ return_value((pid, uid, gid, cmdline)) - - # vim:ts=4:sw=4:et -Index: aptdaemon-1.1.1+bzr982/aptdaemon/progress.py -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/aptdaemon/progress.py 2015-06-11 09:18:21.910695506 -0400 -+++ aptdaemon-1.1.1+bzr982/aptdaemon/progress.py 2015-06-11 09:18:21.910695506 -0400 -@@ -628,6 +628,11 @@ - - def _child(self, path): - # Avoid running lintian as root -+ try: -+ os.setgroups([self.transaction.gid]) -+ except OSError: -+ pass -+ os.setgid(self.transaction.gid) - os.setuid(self.transaction.uid) - - if platform.dist()[1] == "debian": -Index: aptdaemon-1.1.1+bzr982/aptdaemon/worker/aptworker.py -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/aptdaemon/worker/aptworker.py 2015-06-11 09:18:21.910695506 -0400 -+++ aptdaemon-1.1.1+bzr982/aptdaemon/worker/aptworker.py 2015-06-11 09:18:21.910695506 -0400 -@@ -91,6 +91,25 @@ - """ - - -+@contextlib.contextmanager -+def set_euid_egid(uid, gid): -+ # no need to drop privs -+ if os.getuid() != 0 and os.getgid() != 0: -+ yield -+ return -+ # temporary drop privs -+ os.setegid(gid) -+ old_groups = os.getgroups() -+ os.setgroups([gid]) -+ os.seteuid(uid) -+ try: -+ yield -+ finally: -+ os.seteuid(os.getuid()) -+ os.setegid(os.getgid()) -+ os.setgroups(old_groups) -+ -+ - def trans_only_installs_pkgs_from_high_trust_repos(trans, - whitelist=set()): - """Return True if this transaction only touches packages in the -@@ -1199,8 +1218,16 @@ - - :returns: An apt.debfile.Debfile instance. - """ -- if not os.path.isfile(path): -- raise TransactionFailed(ERROR_UNREADABLE_PACKAGE_FILE, path) -+ # This code runs as root for simulate and simulate requires no -+ # authentication - so we need to ensure we do not leak information -+ # about files here (LP: #1449587, CVE-2015-1323) -+ # -+ # Note that the actual lintian run is also droping privs (real, -+ # not just seteuid) -+ with set_euid_egid(trans.uid, trans.gid): -+ if not os.path.isfile(path): -+ raise TransactionFailed(ERROR_UNREADABLE_PACKAGE_FILE, path) -+ - if not force and os.path.isfile("/usr/bin/lintian"): - with DaemonLintianProgress(trans) as progress: - progress.run(path) -Index: aptdaemon-1.1.1+bzr982/tests/test_high_trust_repository_whitelist.py -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/tests/test_high_trust_repository_whitelist.py 2015-06-11 09:18:21.910695506 -0400 -+++ aptdaemon-1.1.1+bzr982/tests/test_high_trust_repository_whitelist.py 2015-06-11 09:18:21.910695506 -0400 -@@ -115,7 +115,7 @@ - ("Ubuntu", "", "silly.*")) - # a high-trust whitelisted pkg and a non-whitelisted one - trans = Transaction(None, enums.ROLE_INSTALL_PACKAGES, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - packages=[["silly-base", "other-pkg"], [], [], [], - [], []]) -@@ -127,7 +127,7 @@ - trans, self.worker._high_trust_repositories)) - # whitelisted only - trans = Transaction(None, enums.ROLE_INSTALL_PACKAGES, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - packages=[["silly-base"], [], [], [], [], []]) - self.worker.simulate(trans) -Index: aptdaemon-1.1.1+bzr982/tests/test_worker.py -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/tests/test_worker.py 2015-06-11 09:18:21.910695506 -0400 -+++ aptdaemon-1.1.1+bzr982/tests/test_worker.py 2015-06-11 09:18:21.910695506 -0400 -@@ -77,7 +77,8 @@ - self.chroot.add_repository("/does/not/exist", copy_list=False) - # Only update the repository from the working snippet - trans = Transaction(None, enums.ROLE_UPDATE_CACHE, -- self.queue, os.getpid(), os.getuid(), sys.argv[0], -+ self.queue, os.getpid(), os.getuid(), -+ os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - kwargs={"sources_list": "test.list"}) - self.worker.simulate(trans) -@@ -99,7 +100,7 @@ - "silly-base_0.1-0_all.deb")) - # Install the package - trans = Transaction(None, enums.ROLE_UPGRADE_SYSTEM, -- self.queue, os.getpid(), -+ self.queue, os.getpid(), os.getgid(), - os.getuid(), sys.argv[0], - "org.debian.apt.test", connect=False, - kwargs={"safe_mode": False}) -@@ -130,7 +131,7 @@ - self.chroot.add_test_repository(copy_sig=False) - # Install the package - trans = Transaction(None, enums.ROLE_INSTALL_PACKAGES, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - packages=[["silly-base"], [], [], [], [], []]) - self.worker.simulate(trans) -@@ -144,7 +145,7 @@ - - # Allow installation of unauthenticated packages - trans = Transaction(None, enums.ROLE_INSTALL_PACKAGES, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - packages=[["silly-base"], [], [], [], [], []]) - trans.allow_unauthenticated = True -@@ -164,7 +165,7 @@ - self.chroot.add_test_repository() - # Install the package - trans = Transaction(None, enums.ROLE_INSTALL_PACKAGES, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - packages=[["silly-depend-base"], [], [], [], - [], []]) -@@ -193,7 +194,7 @@ - Architecture: all - Auto-Installed: 1""") - trans = Transaction(None, enums.ROLE_REMOVE_PACKAGES, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - packages=[[], [], ["silly-depend-base"], [], - [], []]) -@@ -219,7 +220,7 @@ - "silly-depend-base_0.1-0_all.deb"]: - self.chroot.install_debfile(os.path.join(REPO_PATH, pkg)) - trans = Transaction(None, enums.ROLE_REMOVE_PACKAGES, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - packages=[[], [], ["silly-base"], [], [], []]) - self.worker.simulate(trans) -@@ -240,7 +241,7 @@ - pass - # Don't allow to remove essential packages - trans = Transaction(None, enums.ROLE_REMOVE_PACKAGES, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - packages=[[], [], ["silly-essential"], [], [], []]) - self.worker.run(trans) -@@ -263,7 +264,7 @@ - Architecture: all - Auto-Installed: 1""") - trans = Transaction(None, enums.ROLE_COMMIT_PACKAGES, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - packages=[[], [], [], [], - ["silly-base=0.1-0update1"], []]) -@@ -283,7 +284,7 @@ - pkg = os.path.join(REPO_PATH, "silly-base_0.1-0update1_all.deb") - self.chroot.install_debfile(pkg) - trans = Transaction(None, enums.ROLE_COMMIT_PACKAGES, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - packages=[[], [], [], [], [], - ["silly-base=0.1-0"]]) -@@ -301,7 +302,7 @@ - for pkg in ["silly-base_0.1-0_all.deb", "silly-config_0.1-0_all.deb"]: - self.chroot.install_debfile(os.path.join(REPO_PATH, pkg)) - trans = Transaction(None, enums.ROLE_REMOVE_PACKAGES, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - packages=[[], [], [], ["silly-config"], [], []]) - self.worker.run(trans) -@@ -324,7 +325,7 @@ - pkg = os.path.join(REPO_PATH, - "silly-depend-base-lintian-broken_0.1-0_all.deb") - trans = Transaction(None, enums.ROLE_INSTALL_FILE, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - kwargs={"path": os.path.join(REPO_PATH, pkg), - "force": False}) -@@ -359,7 +360,7 @@ - self.chroot.install_debfile(os.path.join(REPO_PATH, pkg_base)) - pkg = os.path.join(REPO_PATH, "silly-bully_0.1-0_all.deb") - trans = Transaction(None, enums.ROLE_INSTALL_FILE, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - kwargs={"path": os.path.join(REPO_PATH, pkg), - "force": True}) -@@ -379,7 +380,7 @@ - """ - pkg = os.path.join(REPO_PATH, "silly-base_0.1-0_all.deb") - trans = Transaction(None, enums.ROLE_INSTALL_FILE, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, - kwargs={"path": os.path.join(REPO_PATH, pkg), - "force": True}) -@@ -400,7 +401,7 @@ - for pkg in ["silly-base_0.1-0_all.deb", "silly-broken_0.1-0_all.deb"]: - self.chroot.install_debfile(os.path.join(REPO_PATH, pkg), True) - trans = Transaction(None, enums.ROLE_FIX_BROKEN_DEPENDS, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False) - self.worker.simulate(trans) - self.loop.run() -@@ -420,7 +421,7 @@ - """ - self.chroot.add_test_repository() - trans = Transaction(None, enums.ROLE_COMMIT_PACKAGES, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", - packages=[["silly-broken"], [], [], [], [], []], - connect=False) -@@ -459,7 +460,7 @@ - - self.chroot.add_test_repository() - trans = Transaction(None, enums.ROLE_ADD_LICENSE_KEY, self.queue, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", - kwargs={"pkg_name": "silly-license", - "json_token": "lalelu", -Index: aptdaemon-1.1.1+bzr982/tests/_test_py2_string_handling.py -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/tests/_test_py2_string_handling.py 2012-12-29 18:40:46.000000000 -0500 -+++ aptdaemon-1.1.1+bzr982/tests/_test_py2_string_handling.py 2015-06-11 09:47:02.608070571 -0400 -@@ -49,7 +49,8 @@ - self.start_dbus_daemon() - self.dbus = dbus.bus.BusConnection(self.dbus_address) - self.trans = Transaction(None, "role-test", None, -- os.getpid(), os.getuid(), sys.argv[0], -+ os.getpid(), os.getuid(), os.getgid(), -+ sys.argv[0], - "org.debian.apt.test", bus=self.dbus) - - def test(self): diff --git a/debian/patches/lp1487087.diff b/debian/patches/lp1487087.diff deleted file mode 100644 index fdab301..0000000 --- a/debian/patches/lp1487087.diff +++ /dev/null @@ -1,21 +0,0 @@ -Description: .assert_called() is not a valid mock method, and its presence - masks a failing test. Under Python 3.5, an AttributeError is raised whereas - in earlier Python's this just silently passed. Since the intent of the test - can't be determined, for now just skip it. We don't use @unittest.skip - though because there is apparently some test leakage, so that if this entire - test is skipped, other tests fail. -Author: Barry Warsaw <barry@ubuntu.com> -Bug: https://bugs.launchpad.net/aptdaemon/+bug/1487087 - ---- a/tests/test_high_trust_repository_whitelist.py -+++ b/tests/test_high_trust_repository_whitelist.py -@@ -96,7 +96,8 @@ - "data/high-trust-repository-whitelist-broken.cfg")) - self.assertEqual(whitelist, set()) - # ensure we log a error if the config file is broken -- mock_log.error.assert_called() -+ # Skip due to LP: #1487087 -+ #mock_log.error.assert_called() - - @patch("aptdaemon.worker.log") - def test_read_high_trust_repository_whitelist_not_there(self, mock_log): diff --git a/debian/patches/lp1623856-window-height.patch b/debian/patches/lp1623856-window-height.patch deleted file mode 100644 index a042895..0000000 --- a/debian/patches/lp1623856-window-height.patch +++ /dev/null @@ -1,15 +0,0 @@ -Description: Set the minimum scrolled window height -Author: Martin Wimpress -Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/update-manager/+bug/1623856 - -=== modified file 'aptdaemon/gtk3widgets.py' ---- a/aptdaemon/gtk3widgets.py -+++ b/aptdaemon/gtk3widgets.py -@@ -338,6 +338,7 @@ - self.download_scrolled.set_policy(Gtk.PolicyType.NEVER, - Gtk.PolicyType.AUTOMATIC) - self.download_scrolled.add(self.download_view) -+ self.download_scrolled.set_min_content_height(200) - hbox = Gtk.HBox() - hbox.pack_start(self.download_scrolled, True, True, 0) - if self.terminal: diff --git a/debian/patches/lp1689668-config-file-window.patch b/debian/patches/lp1689668-config-file-window.patch deleted file mode 100644 index 15d05c5..0000000 --- a/debian/patches/lp1689668-config-file-window.patch +++ /dev/null @@ -1,13 +0,0 @@ -Index: aptdaemon-1.1.1+bzr982/aptdaemon/gtk3widgets.py -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/aptdaemon/gtk3widgets.py -+++ aptdaemon-1.1.1+bzr982/aptdaemon/gtk3widgets.py -@@ -1066,7 +1066,7 @@ class AptConfigFileConflictDialog(_Expan - "the configuration file?") % from_path - msg = _("If you don't know why the file is there already, it is " - "usually safe to replace it.") -- scrolled = Gtk.ScrolledWindow() -+ scrolled = Gtk.ScrolledWindow(hexpand=True, vexpand=True) - scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - scrolled.set_shadow_type(Gtk.ShadowType.ETCHED_IN) - self.diffview = DiffView() diff --git a/debian/patches/lp1690541-details-open-twice.patch b/debian/patches/lp1690541-details-open-twice.patch deleted file mode 100644 index 329515f..0000000 --- a/debian/patches/lp1690541-details-open-twice.patch +++ /dev/null @@ -1,12 +0,0 @@ -Index: aptdaemon-1.1.1+bzr982/aptdaemon/gtk3widgets.py -=================================================================== ---- aptdaemon-1.1.1+bzr982.orig/aptdaemon/gtk3widgets.py -+++ aptdaemon-1.1.1+bzr982/aptdaemon/gtk3widgets.py -@@ -395,6 +395,7 @@ class AptTerminal(Vte.Terminal): - self._master, self._slave = pty.openpty() - self._ttyname = os.ttyname(self._slave) - self.set_size(80, 24) -+ self.set_vexpand(True) - self.set_pty(Vte.Pty.new_foreign_sync(self._master)) - if transaction is not None: - self.set_transaction(transaction) diff --git a/debian/patches/native-arch.patch b/debian/patches/native-arch.patch deleted file mode 100644 index a0c37fa..0000000 --- a/debian/patches/native-arch.patch +++ /dev/null @@ -1,17 +0,0 @@ -Description: Fix NATIVE_ARCH not being defined -Author: Justin McPherson <justin.mcpherson@canonical.com> -Forwarded: https://code.launchpad.net/~justinmcp/aptdaemon/1352654/+merge/243354 - -Index: b/aptdaemon/pkcompat.py -=================================================================== ---- a/aptdaemon/pkcompat.py -+++ b/aptdaemon/pkcompat.py -@@ -392,7 +392,7 @@ - distro, version, _codename = platform.dist() - self._distro_id = "%s;%s;%s" % (distro or "unknown", - version or "unknown", -- NATIVE_ARCH) -+ self.queue.worker.NATIVE_ARCH) - return self._distro_id - - def _on_network_state_changed(self, mon, state): diff --git a/debian/patches/pep8-accommodations.diff b/debian/patches/pep8-accommodations.diff deleted file mode 100644 index 68ee5e4..0000000 --- a/debian/patches/pep8-accommodations.diff +++ /dev/null @@ -1,35 +0,0 @@ -Description: Various accommodations so that the PEP 8 tests don't cause - autopkgtests to fail. These include fixing the --exclude argument, adding - more files to the exclude pattern, and ignoring E402, which is bogus; see - https://github.com/PyCQA/pep8/issues/394. I also fixed one legitimate - looking violation. -Author: Barry Warsaw <barry@ubuntu.com> -Bug: https://bugs.launchpad.net/aptdaemon/+bug/1486646 - ---- a/tests/test_pep8.py -+++ b/tests/test_pep8.py -@@ -30,9 +30,11 @@ - - def test(self): - """Check if the source code matches the PEP8 style conventions.""" -- subprocess.check_call(["pep8", "--statistics", "--show-source", -- "--show-pep8", "--exclude", "pkenums.py", -- "aptdaemon", "tests"]) -+ subprocess.check_call([ -+ "pep8", "--statistics", "--show-source", -+ "--show-pep8", "--exclude", -+ "pkenums.py,aptdaemon,tests,debian,doc,.pc,gtk3-demo.py,setup.py", -+ "--ignore=E402"]) - - - if __name__ == "__main__": ---- a/apport/aptdaemon.py -+++ b/apport/aptdaemon.py -@@ -28,6 +28,7 @@ - - apt_pkg.init() - -+ - def add_info(report): - """Collect and append additional information about a crash. - diff --git a/debian/patches/pk-debconf-helper.patch b/debian/patches/pk-debconf-helper.patch deleted file mode 100644 index 9e672c7..0000000 --- a/debian/patches/pk-debconf-helper.patch +++ /dev/null @@ -1,40 +0,0 @@ -Description: Use PackageKit debconf socket -Author: Julian Andres Klode <julian.klode@canonical.com> -Bug-Ubuntu: https://bugs.launchpad.net/bugs/1726068 -Last-Update: 2019-05-24 <YYYY-MM-DD, last update of the meta-information, optional> ---- -This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ ---- a/aptdaemon/client.py -+++ b/aptdaemon/client.py -@@ -888,6 +888,16 @@ class AptTransaction(GObject.Object): - _reply_handler = lambda: reply_handler(self) - else: - _reply_handler = None -+ -+ pk_socket = "/run/user/%d/pk-debconf-socket" % os.getuid() -+ if os.path.exists(pk_socket): -+ self._proxy.Set("org.debian.apt.transaction", "DebconfSocket", -+ pk_socket, -+ dbus_interface=dbus.PROPERTIES_IFACE, -+ reply_handler=_reply_handler, -+ error_handler=error_handler) -+ return -+ - self._debconf_helper = debconf.DebconfProxy(frontend) - self._proxy.Set("org.debian.apt.transaction", "DebconfSocket", - self._debconf_helper.socket_path, ---- a/aptdaemon/core.py -+++ b/aptdaemon/core.py -@@ -368,7 +368,11 @@ class Transaction(DBusObject): - self.pid = pid - self.http_proxy = dbus.String("") - self.terminal = dbus.String("") -- self.debconf = dbus.String("") -+ pk_socket = "/run/user/%d/pk-debconf-socket" % self.uid -+ if os.path.exists(pk_socket): -+ self.debconf = dbus.String(pk_socket) -+ else: -+ self.debconf = dbus.String("") - self.kwargs = kwargs - self._translation = None - # The transaction which should be executed after this one diff --git a/debian/patches/pk1.1.1_compat.patch b/debian/patches/pk1.1.1_compat.patch deleted file mode 100644 index a744413..0000000 --- a/debian/patches/pk1.1.1_compat.patch +++ /dev/null @@ -1,29 +0,0 @@ -From: Michael Vogt <mvo@ubuntu.com> -Subject: Remove API that is no longer available in PK 1.1.1 - ---- - aptdaemon/worker/pkworker.py | 6 ------ - 1 file changed, 6 deletions(-) - ---- a/aptdaemon/worker/pkworker.py -+++ b/aptdaemon/worker/pkworker.py -@@ -172,8 +172,6 @@ - pk.RoleEnum.GET_UPDATE_DETAIL, - pk.RoleEnum.GET_PACKAGES, - pk.RoleEnum.GET_DETAILS, -- pk.RoleEnum.GET_DEPENDS, -- pk.RoleEnum.GET_REQUIRES, - pk.RoleEnum.SEARCH_NAME, - pk.RoleEnum.SEARCH_DETAILS, - pk.RoleEnum.SEARCH_GROUP, -@@ -289,10 +287,6 @@ - self.search_details(trans, **trans.kwargs) - elif trans.pktrans.role == pk.RoleEnum.SEARCH_FILE: - self.search_files(trans, **trans.kwargs) -- elif trans.pktrans.role == pk.RoleEnum.GET_DEPENDS: -- self.get_depends(trans, **trans.kwargs) -- elif trans.pktrans.role == pk.RoleEnum.GET_REQUIRES: -- self.get_requires(trans, **trans.kwargs) - elif trans.pktrans.role == pk.RoleEnum.GET_DETAILS: - self.get_details(trans, **trans.kwargs) - elif trans.pktrans.role == pk.RoleEnum.DOWNLOAD_PACKAGES: diff --git a/debian/patches/py3_inheritable.patch b/debian/patches/py3_inheritable.patch deleted file mode 100644 index f642733..0000000 --- a/debian/patches/py3_inheritable.patch +++ /dev/null @@ -1,14 +0,0 @@ -=== modified file 'aptdaemon/progress.py' ---- a/aptdaemon/progress.py 2014-02-07 20:40:15 +0000 -+++ b/aptdaemon/progress.py 2014-04-11 11:58:33 +0000 -@@ -395,6 +395,9 @@ - self.last_activity = 0 - self.child_pid = 0 - self.status_parent_fd, self.status_child_fd = os.pipe() -+ if hasattr(os, "set_inheritable"): -+ os.set_inheritable(self.status_parent_fd, True) -+ os.set_inheritable(self.status_child_fd, True) - self.output = "" - self._line_buffer = "" - - diff --git a/debian/patches/python3.7-compat.patch b/debian/patches/python3.7-compat.patch deleted file mode 100644 index 867c6d2..0000000 --- a/debian/patches/python3.7-compat.patch +++ /dev/null @@ -1,53 +0,0 @@ -Description: do not use 'async' as a variable name - It is a keyword in Python 3.7. -Author: Michael Hudson-Doyle <michael.hudson@ubuntu.com> -Origin: vendor -Last-Update: 2018-08-02 ---- -This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ ---- a/aptdaemon/client.py -+++ b/aptdaemon/client.py -@@ -1567,17 +1567,17 @@ - - def _run_transaction(self, method_name, args, wait, reply_handler, - error_handler): -- async = reply_handler and error_handler -+ async_ = reply_handler and error_handler - try: - deferred = self._run_transaction_helper(method_name, args, wait, -- async) -+ async_) - except Exception as error: -- if async: -+ if async_: - error_handler(error) - return - else: - raise -- if async: -+ if async_: - def on_error(error): - """Convert the DeferredException to a normal exception.""" - try: -@@ -1609,10 +1609,10 @@ - return trans - - @defer.inline_callbacks -- def _run_transaction_helper(self, method_name, args, wait, async): -+ def _run_transaction_helper(self, method_name, args, wait, async_): - daemon = get_aptdaemon(self.bus) - dbus_method = daemon.get_dbus_method(method_name) -- if async: -+ if async_: - deferred = defer.Deferred() - dbus_method(reply_handler=deferred.callback, - error_handler=deferred.errback, *args, -@@ -1626,7 +1626,7 @@ - if self.terminal: - yield trans.set_terminal(self.terminal) - yield trans.sync() -- if wait and async: -+ if wait and async_: - deferred_wait = defer.Deferred() - sig = trans.connect("finished", - lambda trans, exit: diff --git a/debian/patches/remove-lintian-scanning-of-local-packages.patch b/debian/patches/remove-lintian-scanning-of-local-packages.patch deleted file mode 100644 index 64f20a4..0000000 --- a/debian/patches/remove-lintian-scanning-of-local-packages.patch +++ /dev/null @@ -1,180 +0,0 @@ -From: Michael Hudson-Doyle <michael.hudson@canonical.com> -Date: Thu, 1 Aug 2019 12:13:07 +1200 -Subject: Remove lintian scanning of local packages. - -lintian has changed in Debian in ways that break this feature and -removing it seems like a better use of time than fixing it. ---- - aptdaemon/progress.py | 30 +----------------------------- - aptdaemon/worker/aptworker.py | 12 ------------ - setup.py | 4 ---- - tests/test_pk.py | 6 +++--- - tests/test_worker.py | 14 ++------------ - 5 files changed, 6 insertions(+), 60 deletions(-) - -diff --git a/aptdaemon/progress.py b/aptdaemon/progress.py -index 0a0cd7b..5312c5a 100644 ---- a/aptdaemon/progress.py -+++ b/aptdaemon/progress.py -@@ -14,8 +14,7 @@ __author__ = "Sebastian Heinlein <devel@glatzor.de>" - - __all__ = ("DaemonAcquireProgress", "DaemonOpenProgress", - "DaemonInstallProgress", "DaemonDpkgInstallProgress", -- "DaemonForkProgress", "DaemonDpkgRecoverProgress", -- "DaemonLintianProgress") -+ "DaemonForkProgress", "DaemonDpkgRecoverProgress") - - import locale - import logging -@@ -622,33 +621,6 @@ class DaemonForkProgress(object): - return False - - --class DaemonLintianProgress(DaemonForkProgress): -- -- """Performs a lintian call.""" -- -- def _child(self, path): -- # Avoid running lintian as root -- try: -- os.setgroups([self.transaction.gid]) -- except OSError: -- pass -- os.setgid(self.transaction.gid) -- os.setuid(self.transaction.uid) -- -- if platform.dist()[1] == "debian": -- profile = "debian/aptdaemon" -- else: -- profile = "ubuntu/aptdaemon" -- # If HOME isn't set lintian won't try to load user profiles -- os.unsetenv("HOME") -- -- lintian_path = apt_pkg.config.find_file("Dir::Bin::Lintian", -- "/usr/bin/lintian") -- os.execlp(lintian_path, lintian_path, "--no-cfg", "--fail-on-warnings", -- "--profile", profile, path) -- os._exit(1) -- -- - class DaemonInstallProgress(DaemonForkProgress): - - """Progress to execute APT package operations in a child process.""" -diff --git a/aptdaemon/worker/aptworker.py b/aptdaemon/worker/aptworker.py -index 5211365..d936e10 100644 ---- a/aptdaemon/worker/aptworker.py -+++ b/aptdaemon/worker/aptworker.py -@@ -66,7 +66,6 @@ from ..progress import ( - DaemonDpkgInstallProgress, - DaemonDpkgReconfigureProgress, - DaemonDpkgRecoverProgress, -- DaemonLintianProgress, - DaemonForkProgress) - - log = logging.getLogger("AptDaemon.Worker") -@@ -1230,21 +1229,10 @@ class AptWorker(BaseWorker): - # This code runs as root for simulate and simulate requires no - # authentication - so we need to ensure we do not leak information - # about files here (LP: #1449587, CVE-2015-1323) -- # -- # Note that the actual lintian run is also droping privs (real, -- # not just seteuid) - with set_euid_egid(trans.uid, trans.gid): - if not os.path.isfile(path): - raise TransactionFailed(ERROR_UNREADABLE_PACKAGE_FILE, path) - -- if not force and os.path.isfile("/usr/bin/lintian"): -- with DaemonLintianProgress(trans) as progress: -- progress.run(path) -- # FIXME: Add an error to catch return state 2 (failure) -- if progress._child_exit != 0: -- raise TransactionFailed(ERROR_INVALID_PACKAGE_FILE, -- "Lintian check results for %s:" -- "\n%s" % (path, progress.output)) - try: - deb = apt.debfile.DebPackage(path, self._cache) - except IOError: -diff --git a/setup.py b/setup.py -index 45273df..c08cb5e 100755 ---- a/setup.py -+++ b/setup.py -@@ -50,10 +50,6 @@ setup(name="aptdaemon", - ("share/dbus-1/system-services/", - ["data/org.debian.apt.service", - "data/org.freedesktop.PackageKit.service"]), -- ("share/lintian/profiles/ubuntu/", -- ["data/lintian/ubuntu/aptdaemon.profile"]), -- ("share/lintian/profiles/debian/", -- ["data/lintian/debian/aptdaemon.profile"]), - ("share/man/man1", - ["doc/aptd.1", "doc/aptdcon.1"]), - ("share/man/man7", -diff --git a/tests/test_pk.py b/tests/test_pk.py -index dd386b4..1c73632 100644 ---- a/tests/test_pk.py -+++ b/tests/test_pk.py -@@ -119,9 +119,9 @@ class PackageKitTest(aptdaemon.test.AptDaemonTestCase): - def test_install_files(self): - """Test installing local package files.""" - -- path_pkg_lintian_fail = os.path.join( -+ path_pkg_config = os.path.join( - REPO_PATH, -- "silly-depend-base-lintian-broken_0.1-0_all.deb") -+ "silly-config_.1-0_all.deb") - path_pkg = os.path.join( - REPO_PATH, - "silly-depend-base_0.1-0_all.deb") -@@ -131,7 +131,7 @@ class PackageKitTest(aptdaemon.test.AptDaemonTestCase): - # Fail if more than package should be installed - try: - client.install_files(pk.TransactionFlagEnum.NONE, -- [path_pkg_lintian_fail, path_pkg], None, -+ [path_pkg_config, path_pkg], None, - lambda p, t, d: True, None) - except GLib.GError as error: - self.assertTrue("Only one package" in error.message) -diff --git a/tests/test_worker.py b/tests/test_worker.py -index 474be13..e82ace0 100644 ---- a/tests/test_worker.py -+++ b/tests/test_worker.py -@@ -315,15 +315,12 @@ Auto-Installed: 1""") - "etc/silly-packages.cfg")), - "Configuration file wasn't removed.") - -- @unittest.skipUnless( -- os.path.exists('/usr/share/lintian/profiles/debian/aptdaemon.profile'), -- 'this test needs aptdaemon installed, for the lintian profiles') - def test_install_file(self): - """Test the installation of a local package file.""" - # test - self.chroot.add_test_repository() - pkg = os.path.join(REPO_PATH, -- "silly-depend-base-lintian-broken_0.1-0_all.deb") -+ "silly-depend-base_0.1-0_all.deb") - trans = Transaction(None, enums.ROLE_INSTALL_FILE, self.queue, - os.getpid(), os.getuid(), os.getgid(), sys.argv[0], - "org.debian.apt.test", connect=False, -@@ -331,13 +328,6 @@ Auto-Installed: 1""") - "force": False}) - self.worker.simulate(trans) - self.loop.run() -- self.assertIn("wrong-file-owner-uid-or-gid", trans.error.details) -- self.assertEqual(trans.error.code, enums.ERROR_INVALID_PACKAGE_FILE, -- "Lintian failed to detect a broken package") -- # Now allow to install invalid packages -- trans.kwargs["force"] = True -- self.worker.simulate(trans) -- self.loop.run() - self.assertEqual(trans.depends[enums.PKGS_INSTALL], - ["silly-base=0.1-0update1"]) - self.assertTrue(trans.space > 0) -@@ -347,7 +337,7 @@ Auto-Installed: 1""") - "%s: %s" % (trans._error_property[0], - trans._error_property[1])) - self.worker._cache.open() -- pkg = self.worker._cache["silly-depend-base-lintian-broken"] -+ pkg = self.worker._cache["silly-depend-base"] - self.assertTrue(pkg.is_installed) - - def test_install_conflicting_file(self): diff --git a/debian/patches/series b/debian/patches/series deleted file mode 100644 index 0202a08..0000000 --- a/debian/patches/series +++ /dev/null @@ -1,33 +0,0 @@ -fix-high-trust-pkcompat.diff -dbus_timeout.patch -py3_inheritable.patch -lp1356823.diff -lp1449587.diff -pep8-accommodations.diff -lp1487087.diff -fix-installation.patch -native-arch.patch -key_value_typo.patch -lintian_deprecated_error.patch -lp1439769-aptdaemon-autoinstall.patch -drop_pkcompat.patch -pk1.1.1_compat.patch -lp1623856-window-height.patch -lp1689668-config-file-window.patch -lp1690541-details-open-twice.patch -python3.7-compat.patch -do-not-raise-stopiteration.patch -pk-debconf-helper.patch -failing-tests.patch -frontend-locking.patch -lock-is-held-typo.patch -fix-dependency-solving.patch -remove-lintian-scanning-of-local-packages.patch -allow-unauthenticated.patch -apport-report.patch -CVE-2020-15703.patch -test-with-timeout.patch -CVE-2020-16128.patch -CVE-2020-27349.patch -fix-some-deprecated-code.patch -gdk-gtk-versions.py diff --git a/debian/patches/test-with-timeout.patch b/debian/patches/test-with-timeout.patch deleted file mode 100644 index 8a51396..0000000 --- a/debian/patches/test-with-timeout.patch +++ /dev/null @@ -1,15 +0,0 @@ -Description: Run tests with a timeout - Tests are getting stuck for almost 3 hours because we race somewhere and end up - getting stuck waiting for calls that never happen. -Author: Julian Andres Klode <juliank@ubuntu.com> ---- a/aptdaemon/test.py -+++ b/aptdaemon/test.py -@@ -223,7 +223,7 @@ class AptDaemonTestCase(unittest.TestCas - path = "/usr/sbin/aptd" - else: - path = os.path.join(dir, "../aptd") -- cmd = ["python3", path, "--disable-timeout", "--disable-plugins", -+ cmd = ["python3", path, "--disable-plugins", - "--chroot", chroot] - if debug: - cmd.append("--debug") |