From 9f9716ee01bf7191c5a351ef7fa9949b12ef58e1 Mon Sep 17 00:00:00 2001 From: Codeglitches <80821713+Codeglitches@users.noreply.github.com> Date: Fri, 26 Mar 2021 17:51:19 +0100 Subject: [PATCH] Check S3_IGNORE_SUBDOMAIN_BUCKETNAME environment variable (#3796) * Check S3_IGNORE_SUBDOMAIN_BUCKETNAME environment variable * move S3_IGNORE_SUBDOMAIN_BUCKETNAME environment variable to settings --- moto/s3/responses.py | 3 +++ moto/s3/utils.py | 4 ++-- moto/settings.py | 4 ++++ tests/compat.py | 5 +++++ tests/test_s3/test_s3_utils.py | 13 ++++++------- tests/test_s3/test_server.py | 10 ++++++++++ 6 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 tests/compat.py diff --git a/moto/s3/responses.py b/moto/s3/responses.py index 0a8c53a82..4dcf76fa9 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -27,6 +27,7 @@ from moto.packages.httpretty.core import HTTPrettyRequest from moto.core.responses import _TemplateEnvironmentMixin, ActionAuthenticatorMixin from moto.core.utils import path_url from moto.core import ACCOUNT_ID +from moto.settings import S3_IGNORE_SUBDOMAIN_BUCKETNAME from moto.s3bucket_path.utils import ( bucket_name_from_url as bucketpath_bucket_name_from_url, @@ -186,6 +187,8 @@ class ResponseObject(_TemplateEnvironmentMixin, ActionAuthenticatorMixin): return template.render(buckets=all_buckets) def subdomain_based_buckets(self, request): + if S3_IGNORE_SUBDOMAIN_BUCKETNAME: + return False host = request.headers.get("host", request.headers.get("Host")) if not host: host = urlparse(request.url).netloc diff --git a/moto/s3/utils.py b/moto/s3/utils.py index d89997dfd..7294c9ca7 100644 --- a/moto/s3/utils.py +++ b/moto/s3/utils.py @@ -1,12 +1,12 @@ from __future__ import unicode_literals import logging -import os import re import six from six.moves.urllib.parse import urlparse, unquote, quote from requests.structures import CaseInsensitiveDict import sys +from moto.settings import S3_IGNORE_SUBDOMAIN_BUCKETNAME log = logging.getLogger(__name__) @@ -26,7 +26,7 @@ user_settable_fields = { def bucket_name_from_url(url): - if os.environ.get("S3_IGNORE_SUBDOMAIN_BUCKETNAME", "") in ["1", "true"]: + if S3_IGNORE_SUBDOMAIN_BUCKETNAME: return None domain = urlparse(url).netloc diff --git a/moto/settings.py b/moto/settings.py index 5cb6cfcf8..2694ac6f4 100644 --- a/moto/settings.py +++ b/moto/settings.py @@ -6,6 +6,10 @@ INITIAL_NO_AUTH_ACTION_COUNT = float( ) DEFAULT_CONTAINER_REGISTRY = os.environ.get("DEFAULT_CONTAINER_REGISTRY", "docker.io") +S3_IGNORE_SUBDOMAIN_BUCKETNAME = os.environ.get( + "S3_IGNORE_SUBDOMAIN_BUCKETNAME", "" +) in ["1", "true"] + def get_sf_execution_history_type(): """ diff --git a/tests/compat.py b/tests/compat.py new file mode 100644 index 000000000..4af2156f7 --- /dev/null +++ b/tests/compat.py @@ -0,0 +1,5 @@ +try: + from unittest.mock import patch +except ImportError: + # for python 2.7 + from mock import patch diff --git a/tests/test_s3/test_s3_utils.py b/tests/test_s3/test_s3_utils.py index 64d1c2ca8..37fed92ff 100644 --- a/tests/test_s3/test_s3_utils.py +++ b/tests/test_s3/test_s3_utils.py @@ -1,5 +1,4 @@ from __future__ import unicode_literals -import os import pytest from sure import expect from moto.s3.utils import ( @@ -9,6 +8,7 @@ from moto.s3.utils import ( clean_key_name, undo_clean_key_name, ) +from tests.compat import patch def test_base_url(): @@ -25,12 +25,11 @@ def test_localhost_without_bucket(): expect(bucket_name_from_url("https://www.localhost:5000/def")).should.equal(None) -def test_force_ignore_subdomain_for_bucketnames(): - os.environ["S3_IGNORE_SUBDOMAIN_BUCKETNAME"] = "1" - expect( - bucket_name_from_url("https://subdomain.localhost:5000/abc/resource") - ).should.equal(None) - del os.environ["S3_IGNORE_SUBDOMAIN_BUCKETNAME"] +def test_force_ignore_subdomain_for_bucketnames(monkeypatch): + with patch("moto.s3.utils.S3_IGNORE_SUBDOMAIN_BUCKETNAME", True): + expect( + bucket_name_from_url("https://subdomain.localhost:5000/abc/resource") + ).should.equal(None) def test_versioned_key_store(): diff --git a/tests/test_s3/test_server.py b/tests/test_s3/test_server.py index a81600db5..19fdd2a2a 100644 --- a/tests/test_s3/test_server.py +++ b/tests/test_s3/test_server.py @@ -7,6 +7,7 @@ import sure # noqa from flask.testing import FlaskClient import moto.server as server +from tests.compat import patch """ Test the different server responses @@ -56,6 +57,15 @@ def test_s3_server_bucket_create(): res.data.should.equal(b"test value") +def test_s3_server_ignore_subdomain_for_bucketnames(): + with patch("moto.s3.responses.S3_IGNORE_SUBDOMAIN_BUCKETNAME", True): + test_client = authenticated_client() + + res = test_client.put("/mybucket", "http://foobaz.localhost:5000/") + res.status_code.should.equal(200) + res.data.should.contain(b"mybucket") + + def test_s3_server_bucket_versioning(): test_client = authenticated_client()