#1051852 python-apt does not recognise 'signed-by' parameter

Package:
python3-apt
Source:
python3-apt
Description:
Python 3 interface to libapt-pkg
Submitter:
zzaimeche
Date:
2023-09-13 16:39:04 UTC
Severity:
normal
#1051852#5
Date:
2023-09-13 16:27:13 UTC
From:
To:
The current code does not handle sources which include the 'signed-by'
option.
These are interpreted as invalid, although signed-by is listed as a
valid
option for ubuntu source lists here:
https://manpages.ubuntu.com/manpages/focal/en/man5/sources.list.5.html .

I'm not sure whether it's supported for debian or not,
but I couldn't find a better place to report the issue,
so hopefully this is the right place! :)

When 'signed-by' is not recognised, it causes knock-on effects,
for example when using salt to add repos to /etc/apt/sources.list,
there will be duplicate entries.

This is where the 'signed-by' parameter would need to be added:
https://salsa.debian.org/apt-team/python-apt/-/blob/main/aptsources/sourceslist.py#L240

And below is a patch that has fixed the issue for us
(it's a little old so we may need to adjust the line numbers, but the
rest should be the same).
Best Wishes,
Zara

@@ -, +, @@
---
  aptsources/sourceslist.py | 27 ++++++++++++++++++++-------
  1 file changed, 20 insertions(+), 7 deletions(-)
--- a/aptsources/sourceslist.py
+++ a/aptsources/sourceslist.py
@@ -92,6 +92,7 @@ class SourceEntry(object):
          self.type = ""               # what type (deb, deb-src)
          self.architectures = []      # architectures
          self.trusted = None          # Trusted
+        self.signed_by = ""          # gpg
          self.uri = ""                # base-uri
          self.dist = ""               # distribution (dapper, edgy, etc)
          self.comps = []              # list of available componetns
(may empty)
@@ -198,6 +199,8 @@ class SourceEntry(object):
                          self.architectures = value.split(",")
                      elif key == "trusted":
                          self.trusted = apt_pkg.string_to_bool(value)
+                    elif key == "signed-by":
+                        self.signed_by = value
                      else:
                          self.invalid = True
@@ -239,13 +242,23 @@ class SourceEntry(object):
          line += self.type
-        if self.architectures and self.trusted is not None:
-            line += " [arch=%s trusted=%s]" % (
-                ",".join(self.architectures), "yes" if self.trusted
else "no")
-        elif self.trusted is not None:
-            line += " [trusted=%s]" % ("yes" if self.trusted else "no")
-        elif self.architectures:
-            line += " [arch=%s]" % ",".join(self.architectures)
+        repo_opts = {}
+
+        if self.architectures:
+            repo_opts["arch"] = ",".join(self.architectures)
+
+        if self.trusted is not None:
+            repo_opts["trusted"] = "yes" if self.trusted else "no"
+
+        if self.signed_by:
+            repo_opts["signed-by"] = self.signed_by
+
+        if repo_opts:
+            _opts_str = ""
+            for key in repo_opts:
+                _opts_str += "%s=%s " % (key, repo_opts[key])
+            line += " [%s]" % _opts_str.strip()
+
          line += " %s %s" % (self.uri, self.dist)
          if len(self.comps) > 0:
              line += " " + " ".join(self.comps)
--