diff mbox series

[v3] fetch2: Add path control to BB_ALLOWED_NETWORKS #bitbake

Message ID 2D8Y.1675772137721512677.cmXP@lists.openembedded.org
State New
Headers show
Series [v3] fetch2: Add path control to BB_ALLOWED_NETWORKS #bitbake | expand

Commit Message

Anders Jørgensen Feb. 7, 2023, 12:15 p.m. UTC
From 2ec3567b1a7a765b7047140fd35dc885872cc376 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Anders=20J=C3=B8rgensen?= <anders.joergensen@advent.energy>
Date: Wed, 1 Feb 2023 13:08:11 +0100
Subject: [PATCH] fetch2: Add path control to BB_ALLOWED_NETWORKS

Make it able to add path control to the allowed network, so e.g. it is only possible to access own repositories at a given host

Eg.
BB_ALLOWED_NETWORKS="bitbucket.org/your_company"
The fetcher will be able to download from bitbucket.org/your_company but not from bitbucket.org/other_company

Signed-off-by: Anders Joergensen <anders.joergensen@advent.energy>
---
.../bitbake-user-manual-ref-variables.rst     |  4 ++++
lib/bb/fetch2/__init__.py                     | 23 +++++++++++++++----
lib/bb/tests/fetch.py                         | 12 ++++++++++
3 files changed, 35 insertions(+), 4 deletions(-)

--
2.34.1

Comments

Quentin Schulz Feb. 7, 2023, 1:45 p.m. UTC | #1
Hi Anders,

On 2/7/23 13:15, Anders Jørgensen via lists.openembedded.org wrote:
>  From 2ec3567b1a7a765b7047140fd35dc885872cc376 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Anders=20J=C3=B8rgensen?= <anders.joergensen@advent.energy>
> Date: Wed, 1 Feb 2023 13:08:11 +0100
> Subject: [PATCH] fetch2: Add path control to BB_ALLOWED_NETWORKS
> 
> Make it able to add path control to the allowed network, so e.g. it is only possible to access own repositories at a given host
> 
> Eg.
> BB_ALLOWED_NETWORKS="bitbucket.org/your_company"
> The fetcher will be able to download from bitbucket.org/your_company but not from bitbucket.org/other_company
> 
> Signed-off-by: Anders Joergensen <anders.joergensen@advent.energy>
> ---
> .../bitbake-user-manual-ref-variables.rst     |  4 ++++
> lib/bb/fetch2/__init__.py                     | 23 +++++++++++++++----
> lib/bb/tests/fetch.py                         | 12 ++++++++++
> 3 files changed, 35 insertions(+), 4 deletions(-)
> 
> diff --git a/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst b/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst
> index 09d09a8d..7d370668 100644
> --- a/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst
> +++ b/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst
> @@ -79,6 +79,10 @@ overview of their function and contents.
> For example, ``*.foo.bar`` is supported, while ``*aa.foo.bar``
> is not.
> 
> +      -  Limited path control is also possible like. ::

Can you explain what the example is supposed to do here?

e.g. a few line above we have:
"""
For example, the following setting matches ``git.gnu.org``, 
``ftp.gnu.org``, and ``foo.git.gnu.org``. ::
"""
So I'm expecting something more explicit here too.

> +
> +            BB_ALLOWED_NETWORKS = "github.com/your_project bitbucket.org/your_company"

Then indentation seems a bit odd here, the previous code-block in the 
paragraph just above has a three-space indent and here you have way more.

> +
> -  Mirrors not in the host list are skipped and logged in debug.
> 
> -  Attempts to access networks not in the host list cause a failure.
> diff --git a/lib/bb/fetch2/__init__.py b/lib/bb/fetch2/__init__.py
> index 5a7a6024..d90d9cc9 100644
> --- a/lib/bb/fetch2/__init__.py
> +++ b/lib/bb/fetch2/__init__.py
> @@ -1165,12 +1165,27 @@ def trusted_network(d, url):
> 
> network = network.split(':')[0]
> network = network.lower()
> +    path = path.lower()
> +

Something's not right here. Python won't allow this indent in the middle 
of the code without actually being in an if, for-loop, while-loop, 
try-catch, function definition, class definition.

How are you sending the patch? Usually one is supposed to create the 
patch locally, commit it, then use git send-email (with possibly git 
format-patch before as an optional step). https://git-send-email.io/ 
should help you figure the details out. I believe this should fix the 
odd indentation here (if the original commit was properly created of 
course).

You can also use git-send-email to send the mail to yourself and then 
try to apply it yourself locally on master branch and see if it works.

Cheers,
Quentin
diff mbox series

Patch

diff --git a/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst b/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst
index 09d09a8d..7d370668 100644
--- a/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst
+++ b/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.rst
@@ -79,6 +79,10 @@  overview of their function and contents.
For example, ``*.foo.bar`` is supported, while ``*aa.foo.bar``
is not.

+      -  Limited path control is also possible like. ::
+
+            BB_ALLOWED_NETWORKS = "github.com/your_project bitbucket.org/your_company"
+
-  Mirrors not in the host list are skipped and logged in debug.

-  Attempts to access networks not in the host list cause a failure.
diff --git a/lib/bb/fetch2/__init__.py b/lib/bb/fetch2/__init__.py
index 5a7a6024..d90d9cc9 100644
--- a/lib/bb/fetch2/__init__.py
+++ b/lib/bb/fetch2/__init__.py
@@ -1165,12 +1165,27 @@  def trusted_network(d, url):

network = network.split(':')[0]
network = network.lower()
+    path = path.lower()
+
+    for host_path in trusted_hosts.split(" "):
+        host_path = host_path.lower()
+        is_trusted = False
+        split_data = host_path.split("/", 1)
+        host = split_data[0]
+        trusted_path = None
+        if len(split_data) == 2:
+            trusted_path = "/" + split_data[1]

-    for host in trusted_hosts.split(" "):
-        host = host.lower()
if host.startswith("*.") and ("." + network).endswith(host[1:]):
-            return True
-        if host == network:
+            is_trusted = True
+        elif host == network:
+            is_trusted = True
+
+        if trusted_path and is_trusted:
+            if not path.startswith(trusted_path):
+                is_trusted = False
+
+        if is_trusted:
return True

return False
diff --git a/lib/bb/tests/fetch.py b/lib/bb/tests/fetch.py
index f3890321..3fbe7a01 100644
--- a/lib/bb/tests/fetch.py
+++ b/lib/bb/tests/fetch.py
@@ -1323,6 +1323,18 @@  class TrustedNetworksTest(FetcherTest):
self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org server2.org server3.org")
self.assertFalse(bb.fetch.trusted_network(self.d, url))

+    def test_trusted_network_path(self):
+        # Ensure trusted_network returns true when the host and path IS in the list.
+        url = "git://Someserver.org/RightPath/foo;rev=1;branch=master"
+        self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org/rightpath server2.org")
+        self.assertTrue(bb.fetch.trusted_network(self.d, url))
+
+    def test_untrusted_network_path(self):
+        # Ensure trusted_network returns False when the host is in list but the path is wrong.
+        url = "git://Someserver.org/WrongPath/foo;rev=1;branch=master"
+        self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org/rightpath server2.org")
+        self.assertFalse(bb.fetch.trusted_network(self.d, url))
+
class URLHandle(unittest.TestCase):

datatable = {