Protect vs Bucket containing html chars 48/73248/1
authorCédric Ollivier <cedric.ollivier@orange.com>
Fri, 4 Mar 2022 09:01:29 +0000 (10:01 +0100)
committerCédric Ollivier <cedric.ollivier@orange.com>
Fri, 4 Mar 2022 09:02:06 +0000 (10:02 +0100)
It allows dumping MTS output files.

Change-Id: I2b35ee81a764573a9d17cb3a225cb5febed5fa46
Signed-off-by: Cédric Ollivier <cedric.ollivier@orange.com>
xtesting/core/campaign.py

index 5ca47d6..daab853 100644 (file)
@@ -15,9 +15,9 @@ import logging.config
 import mimetypes
 import os
 import re
+import urllib
 import zipfile
 
-from urllib.parse import urlparse
 import boto3
 from boto3.s3.transfer import TransferConfig
 import botocore
@@ -121,25 +121,28 @@ class Campaign():
             multipart_threshold = 5 * 1024 ** 5 if "google" in os.environ[
                 "S3_ENDPOINT_URL"] else 8 * 1024 * 1024
             tconfig = TransferConfig(multipart_threshold=multipart_threshold)
-            bucket_name = urlparse(dst_s3_url).netloc
+            bucket_name = urllib.parse.urlparse(dst_s3_url).netloc
             s3path = re.search(
-                '^/*(.*)/*$', urlparse(dst_s3_url).path).group(1)
+                '^/*(.*)/*$', urllib.parse.urlparse(dst_s3_url).path).group(1)
             prefix = os.path.join(s3path, build_tag)
             # pylint: disable=no-member
             for s3_object in b3resource.Bucket(bucket_name).objects.filter(
                     Prefix=f"{prefix}/"):
-                path, _ = os.path.split(s3_object.key)
+                path, _ = os.path.split(
+                    urllib.parse.unquote_plus(s3_object.key))
                 lpath = re.sub(f'^{s3path}/*', '', path)
                 if lpath and not os.path.exists(lpath):
                     os.makedirs(lpath)
+                Campaign.__logger.info(
+                    "Downloading %s",
+                    re.sub(f'^{s3path}/*', '',
+                           urllib.parse.unquote_plus(s3_object.key)))
                 # pylint: disable=no-member
                 b3resource.Bucket(bucket_name).download_file(
-                    s3_object.key,
-                    re.sub(f'^{s3path}/*', '', s3_object.key),
+                    urllib.parse.unquote_plus(s3_object.key),
+                    re.sub(f'^{s3path}/*', '',
+                           urllib.parse.unquote_plus(s3_object.key)),
                     Config=tconfig)
-                Campaign.__logger.info(
-                    "Downloading %s",
-                    re.sub(f'^{s3path}/*', '', s3_object.key))
             return Campaign.EX_OK
         except Exception:  # pylint: disable=broad-except
             Campaign.__logger.exception("Cannot publish the artifacts")
@@ -184,9 +187,9 @@ class Campaign():
             multipart_threshold = 5 * 1024 ** 5 if "google" in os.environ[
                 "S3_ENDPOINT_URL"] else 8 * 1024 * 1024
             tconfig = TransferConfig(multipart_threshold=multipart_threshold)
-            bucket_name = urlparse(dst_s3_url).netloc
+            bucket_name = urllib.parse.urlparse(dst_s3_url).netloc
             mime_type = mimetypes.guess_type(f'{build_tag}.zip')
-            path = urlparse(dst_s3_url).path.strip("/")
+            path = urllib.parse.urlparse(dst_s3_url).path.strip("/")
             # pylint: disable=no-member
             b3resource.Bucket(bucket_name).upload_file(
                 f'{build_tag}.zip',