[elbe-devel] [PATCH v2] soapclient: Fix base64 encoding

Olivier Dion dion at linutronix.de
Tue Jul 21 02:33:45 CEST 2020


In Py2, binascii.b2a_base64 returns a 'str' object, but in Py3
a 'bytes' object is returned.

The soap service apparently get confused when the data is a 'bytes'
object and will somehow add an extra 4 bytes at the end of the data.
This is the reason why cdrom upload did not work, because the upload
got corrupted.

Thus, the static method 'upload_file' defined for ClientAction can be
used by sub-classes.  This method ensures that the data is of type
'str'.

Signed-off-by: Olivier Dion <dion at linutronix.de>
---
 elbepack/soapclient.py | 64 +++++++++++++++++++++++-------------------
 1 file changed, 35 insertions(+), 29 deletions(-)

diff --git a/elbepack/soapclient.py b/elbepack/soapclient.py
index a465b615..c8acc217 100644
--- a/elbepack/soapclient.py
+++ b/elbepack/soapclient.py
@@ -146,6 +146,26 @@ class ClientAction(object):
     def __init__(self, node):
         self.node = node
 
+    @staticmethod
+    def upload_file(append, build_dir, filename):
+
+        size = 1024 * 1024
+
+        with open(filename, "rb") as f:
+
+            while True:
+
+                bin_data = f.read(size)
+                data = binascii.b2a_base64(bin_data)
+
+                if not isinstance(data, str):
+                    data = data.decode("ascii")
+
+                append(build_dir, data)
+
+                if len(bin_data) != size:
+                    break
+
     def execute(self, _client, _opt, _args):
         raise NotImplementedError('execute() not implemented')
 
@@ -331,7 +351,12 @@ class SetXmlAction(ClientAction):
         part = 0
         with open(filename, "rb") as fp:
             while True:
-                xml_base64 = binascii.b2a_base64(fp.read(size)).decode('ascii')
+
+                xml_base64 = binascii.b2a_base64(fp.read(size))
+
+                if not isinstance(xml_base64, str):
+                    xml_base64 = xml_base64.decode('ascii')
+
                 # finish upload
                 if len(xml_base64) == 1:
                     part = client.service.upload_file(builddir,
@@ -634,7 +659,6 @@ class SetCdromAction(ClientAction):
         ClientAction.__init__(self, node)
 
     def execute(self, client, _opt, args):
-        size = 1024 * 1024
 
         if len(args) != 2:
             print(
@@ -645,17 +669,10 @@ class SetCdromAction(ClientAction):
         builddir = args[0]
         filename = args[1]
 
-        fp = open(filename, "rb")
         client.service.start_cdrom(builddir)
-        while True:
-            bindata = fp.read(size)
-            client.service.append_cdrom(builddir, binascii.b2a_base64(bindata))
-            if len(bindata) != size:
-                break
-
+        self.upload_file(client.service.append_cdrom, builddir, filename)
         client.service.finish_cdrom(builddir)
 
-
 ClientAction.register(SetCdromAction)
 
 
@@ -667,7 +684,6 @@ class SetOrigAction(ClientAction):
         ClientAction.__init__(self, node)
 
     def execute(self, client, _opt, args):
-        size = 1024 * 1024
 
         if len(args) != 2:
             print(
@@ -678,18 +694,10 @@ class SetOrigAction(ClientAction):
         builddir = args[0]
         filename = args[1]
 
-        fp = open(filename, "r")
         client.service.start_upload_orig(builddir, os.path.basename(filename))
-        while True:
-            bindata = fp.read(size)
-            client.service.append_upload_orig(
-                builddir, binascii.b2a_base64(bindata))
-            if len(bindata) != size:
-                break
-
+        self.upload_file(client.service.append_upload_orig, builddir, filename)
         client.service.finish_upload_orig(builddir)
 
-
 ClientAction.register(SetOrigAction)
 
 
@@ -723,7 +731,6 @@ class SetPdebuilderAction(ClientAction):
         ClientAction.__init__(self, node)
 
     def execute(self, client, opt, args):
-        size = 1024 * 1024
 
         if len(args) != 2 and len(args) != 3:
             print("usage: elbe control set_pdebuild "
@@ -733,15 +740,8 @@ class SetPdebuilderAction(ClientAction):
         builddir = args[0]
         filename = args[1]
 
-        fp = open(filename, "r")
         client.service.start_pdebuild(builddir)
-        while True:
-            bindata = fp.read(size)
-            client.service.append_pdebuild(
-                builddir, binascii.b2a_base64(bindata))
-            if len(bindata) != size:
-                break
-
+        self.upload_file(client.service.append_pdebuild, builddir, filename)
         client.service.finish_pdebuild(builddir, opt.cpuset,
                                        opt.profile, opt.cross)
 
@@ -901,6 +901,7 @@ class UploadPackageAction(RepoAction):
     def __init__(self, node):
         RepoAction.__init__(self, node)
 
+    # pylint: disable=arguments-differ
     @staticmethod
     def upload_file(client, f, builddir):
         # Uploads file f into builddir in intivm
@@ -908,7 +909,12 @@ class UploadPackageAction(RepoAction):
         part = 0
         with open(f, "rb") as fp:
             while True:
+
                 xml_base64 = binascii.b2a_base64(fp.read(size))
+
+                if not isinstance(xml_base64, str):
+                    xml_base64 = xml_base64.decode("ascii")
+
                 # finish upload
                 if len(xml_base64) == 1:
                     part = client.service.upload_file(builddir,
-- 
2.27.0



More information about the elbe-devel mailing list