diff options
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/fetch2/__init__.py | 53 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/fetch.py | 37 |
2 files changed, 90 insertions, 0 deletions
diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py index 36c955473a..68f65a97e0 100644 --- a/bitbake/lib/bb/fetch2/__init__.py +++ b/bitbake/lib/bb/fetch2/__init__.py | |||
@@ -61,6 +61,17 @@ class BBFetchException(Exception): | |||
61 | def __str__(self): | 61 | def __str__(self): |
62 | return self.msg | 62 | return self.msg |
63 | 63 | ||
64 | class UntrustedUrl(BBFetchException): | ||
65 | """Exception raised when encountering a host not listed in BB_ALLOWED_NETWORKS""" | ||
66 | def __init__(self, url, message=''): | ||
67 | if message: | ||
68 | msg = message | ||
69 | else: | ||
70 | msg = "The URL: '%s' is not trusted and cannot be used" % url | ||
71 | self.url = url | ||
72 | BBFetchException.__init__(self, msg) | ||
73 | self.args = (url,) | ||
74 | |||
64 | class MalformedUrl(BBFetchException): | 75 | class MalformedUrl(BBFetchException): |
65 | """Exception raised when encountering an invalid url""" | 76 | """Exception raised when encountering an invalid url""" |
66 | def __init__(self, url, message=''): | 77 | def __init__(self, url, message=''): |
@@ -852,6 +863,11 @@ def build_mirroruris(origud, mirrors, ld): | |||
852 | newuri = uri_replace(ud, find, replace, replacements, ld) | 863 | newuri = uri_replace(ud, find, replace, replacements, ld) |
853 | if not newuri or newuri in uris or newuri == origud.url: | 864 | if not newuri or newuri in uris or newuri == origud.url: |
854 | continue | 865 | continue |
866 | |||
867 | if not trusted_network(ld, newuri): | ||
868 | logger.debug(1, "Mirror %s not in the list of trusted networks, skipping" % (newuri)) | ||
869 | continue | ||
870 | |||
855 | try: | 871 | try: |
856 | newud = FetchData(newuri, ld) | 872 | newud = FetchData(newuri, ld) |
857 | newud.setup_localpath(ld) | 873 | newud.setup_localpath(ld) |
@@ -972,6 +988,41 @@ def try_mirrors(d, origud, mirrors, check = False): | |||
972 | return ret | 988 | return ret |
973 | return None | 989 | return None |
974 | 990 | ||
991 | def trusted_network(d, url): | ||
992 | """ | ||
993 | Use a trusted url during download if networking is enabled and | ||
994 | BB_ALLOWED_NETWORKS is set globally or for a specific recipe. | ||
995 | Note: modifies SRC_URI & mirrors. | ||
996 | """ | ||
997 | if d.getVar('BB_NO_NETWORK', True) == "1": | ||
998 | return True | ||
999 | |||
1000 | pkgname = d.expand(d.getVar('PN')) | ||
1001 | trusted_hosts = d.getVarFlag('BB_ALLOWED_NETWORKS', pkgname) | ||
1002 | |||
1003 | if not trusted_hosts: | ||
1004 | trusted_hosts = d.getVar('BB_ALLOWED_NETWORKS', True) | ||
1005 | |||
1006 | # Not enabled. | ||
1007 | if not trusted_hosts: | ||
1008 | return True | ||
1009 | |||
1010 | scheme, network, path, user, passwd, param = decodeurl(url) | ||
1011 | |||
1012 | if not network: | ||
1013 | return True | ||
1014 | |||
1015 | network = network.lower() | ||
1016 | |||
1017 | for host in trusted_hosts.split(" "): | ||
1018 | host = host.lower() | ||
1019 | if host.startswith("*.") and ("." + network).endswith(host[1:]): | ||
1020 | return True | ||
1021 | if host == network: | ||
1022 | return True | ||
1023 | |||
1024 | return False | ||
1025 | |||
975 | def srcrev_internal_helper(ud, d, name): | 1026 | def srcrev_internal_helper(ud, d, name): |
976 | """ | 1027 | """ |
977 | Return: | 1028 | Return: |
@@ -1530,6 +1581,8 @@ class Fetch(object): | |||
1530 | firsterr = None | 1581 | firsterr = None |
1531 | if not localpath and ((not verify_donestamp(ud, self.d)) or m.need_update(ud, self.d)): | 1582 | if not localpath and ((not verify_donestamp(ud, self.d)) or m.need_update(ud, self.d)): |
1532 | try: | 1583 | try: |
1584 | if not trusted_network(self.d, ud.url): | ||
1585 | raise UntrustedUrl(ud.url) | ||
1533 | logger.debug(1, "Trying Upstream") | 1586 | logger.debug(1, "Trying Upstream") |
1534 | m.download(ud, self.d) | 1587 | m.download(ud, self.d) |
1535 | if hasattr(m, "build_mirror_data"): | 1588 | if hasattr(m, "build_mirror_data"): |
diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py index d56ef49948..d3f7b6ac6c 100644 --- a/bitbake/lib/bb/tests/fetch.py +++ b/bitbake/lib/bb/tests/fetch.py | |||
@@ -547,6 +547,43 @@ class FetcherNetworkTest(FetcherTest): | |||
547 | os.chdir(os.path.dirname(self.unpackdir)) | 547 | os.chdir(os.path.dirname(self.unpackdir)) |
548 | fetcher.unpack(self.unpackdir) | 548 | fetcher.unpack(self.unpackdir) |
549 | 549 | ||
550 | def test_trusted_network(self): | ||
551 | # Ensure trusted_network returns False when the host IS in the list. | ||
552 | url = "git://Someserver.org/foo;rev=1" | ||
553 | self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org someserver.org server2.org server3.org") | ||
554 | self.assertTrue(bb.fetch.trusted_network(self.d, url)) | ||
555 | |||
556 | def test_wild_trusted_network(self): | ||
557 | # Ensure trusted_network returns true when the *.host IS in the list. | ||
558 | url = "git://Someserver.org/foo;rev=1" | ||
559 | self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org server2.org server3.org") | ||
560 | self.assertTrue(bb.fetch.trusted_network(self.d, url)) | ||
561 | |||
562 | def test_prefix_wild_trusted_network(self): | ||
563 | # Ensure trusted_network returns true when the prefix matches *.host. | ||
564 | url = "git://git.Someserver.org/foo;rev=1" | ||
565 | self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org server2.org server3.org") | ||
566 | self.assertTrue(bb.fetch.trusted_network(self.d, url)) | ||
567 | |||
568 | def test_two_prefix_wild_trusted_network(self): | ||
569 | # Ensure trusted_network returns true when the prefix matches *.host. | ||
570 | url = "git://something.git.Someserver.org/foo;rev=1" | ||
571 | self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org server2.org server3.org") | ||
572 | self.assertTrue(bb.fetch.trusted_network(self.d, url)) | ||
573 | |||
574 | def test_untrusted_network(self): | ||
575 | # Ensure trusted_network returns False when the host is NOT in the list. | ||
576 | url = "git://someserver.org/foo;rev=1" | ||
577 | self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org server2.org server3.org") | ||
578 | self.assertFalse(bb.fetch.trusted_network(self.d, url)) | ||
579 | |||
580 | def test_wild_untrusted_network(self): | ||
581 | # Ensure trusted_network returns False when the host is NOT in the list. | ||
582 | url = "git://*.someserver.org/foo;rev=1" | ||
583 | self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org server2.org server3.org") | ||
584 | self.assertFalse(bb.fetch.trusted_network(self.d, url)) | ||
585 | |||
586 | |||
550 | class URLHandle(unittest.TestCase): | 587 | class URLHandle(unittest.TestCase): |
551 | 588 | ||
552 | datatable = { | 589 | datatable = { |