You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by ak...@apache.org on 2024/03/11 14:48:42 UTC

(buildstream-plugins) branch abderrahim/auth-header-format created (now 750b2ff)

This is an automated email from the ASF dual-hosted git repository.

akitouni pushed a change to branch abderrahim/auth-header-format
in repository https://gitbox.apache.org/repos/asf/buildstream-plugins.git


      at 750b2ff  cargo: add support for auth-header-format

This branch includes the following new commits:

     new 750b2ff  cargo: add support for auth-header-format

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(buildstream-plugins) 01/01: cargo: add support for auth-header-format

Posted by ak...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

akitouni pushed a commit to branch abderrahim/auth-header-format
in repository https://gitbox.apache.org/repos/asf/buildstream-plugins.git

commit 750b2ff44d84883bd054056ec41ab89ee5f2a30b
Author: Abderrahim Kitouni <ab...@codethink.co.uk>
AuthorDate: Mon Mar 11 15:48:09 2024 +0100

    cargo: add support for auth-header-format
---
 src/buildstream_plugins/sources/_utils.py | 25 +++++++++++++++++++++----
 src/buildstream_plugins/sources/cargo.py  |  8 ++++++--
 2 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/src/buildstream_plugins/sources/_utils.py b/src/buildstream_plugins/sources/_utils.py
index 27dfeb3..5ce9abc 100644
--- a/src/buildstream_plugins/sources/_utils.py
+++ b/src/buildstream_plugins/sources/_utils.py
@@ -59,25 +59,42 @@ def _parse_netrc():
 
 
 class _UrlOpenerCreator:
-    def __init__(self, netrc_config):
+    def __init__(self, netrc_config, auth_header_format):
         self.netrc_config = netrc_config
+        self.auth_header_format = auth_header_format
 
     def get_url_opener(self):
-        if self.netrc_config:
+        if not self.auth_header_format and self.netrc_config:
             netrc_pw_mgr = _NetrcPasswordManager(self.netrc_config)
             http_auth = urllib.request.HTTPBasicAuthHandler(netrc_pw_mgr)
             return urllib.request.build_opener(http_auth)
         return urllib.request.build_opener()
 
 
-def download_file(url, etag, directory):
-    opener_creator = _UrlOpenerCreator(_parse_netrc())
+def download_file(url, etag, directory, auth_header_format=""):
+    opener_creator = _UrlOpenerCreator(_parse_netrc(), auth_header_format)
     opener = opener_creator.get_url_opener()
     default_name = os.path.basename(url)
     request = urllib.request.Request(url)
     request.add_header("Accept", "*/*")
     request.add_header("User-Agent", "BuildStream/2")
 
+    if opener_creator.auth_header_format:
+        if not opener_creator.netrc_config:
+            raise SourceError("Authorization header format specified without supporting netrc")
+
+        parts = urllib.parse.urlsplit(url)
+        entry = opener_creator.netrc_config.authenticators(parts.hostname)
+        if not entry:
+            raise SourceError(
+                "Authorization header format specified without provided password",
+                detail="No password specified in netrc for hostname: {}".format(parts.hostname),
+            )
+
+        _, _, password = entry
+        auth_header = opener_creator.auth_header_format.format(password=password)
+        request.add_header("Authorization", auth_header)
+
     if etag is not None:
         request.add_header("If-None-Match", etag)
 
diff --git a/src/buildstream_plugins/sources/cargo.py b/src/buildstream_plugins/sources/cargo.py
index d40420a..cf02ae6 100644
--- a/src/buildstream_plugins/sources/cargo.py
+++ b/src/buildstream_plugins/sources/cargo.py
@@ -114,6 +114,8 @@ class Crate(SourceFetcher):
         self.mark_download_url(self.url)
         self.cargo.mark_download_url(self.url, primary=False)
 
+        self.auth_header_format = None
+
     ########################################################
     #     SourceFetcher API method implementations         #
     ########################################################
@@ -127,8 +129,10 @@ class Crate(SourceFetcher):
         if os.path.isfile(self._get_mirror_file()):
             return  # pragma: nocover
 
+        extra_data = {}
         # Download the crate
-        crate_url = self.cargo.translate_url(self.url, alias_override=alias_override)
+        crate_url = self.cargo.translate_url(self.url, alias_override=alias_override, extra_data=extra_data)
+        self.auth_header_format = extra_data.get("auth-header-format")
         with self.cargo.timed_activity("Downloading: {}".format(crate_url), silent_nested=True):
             sha256 = self._download(crate_url)
             if self.sha is not None and sha256 != self.sha:
@@ -210,7 +214,7 @@ class Crate(SourceFetcher):
             etag = None
 
         with self.cargo.tempdir() as td:
-            local_file, etag, error = download_file(url, etag, td)
+            local_file, etag, error = download_file(url, etag, td, self.auth_header_format)
 
             if error:
                 raise SourceError("{}: Error mirroring {}: {}".format(self, url, error), temporary=True)