Check S3_IGNORE_SUBDOMAIN_BUCKETNAME environment variable (#3796)

* Check S3_IGNORE_SUBDOMAIN_BUCKETNAME environment variable

* move S3_IGNORE_SUBDOMAIN_BUCKETNAME environment variable to settings
This commit is contained in:
Codeglitches 2021-03-26 17:51:19 +01:00 committed by GitHub
parent 1761be46e3
commit 9f9716ee01
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 30 additions and 9 deletions

View File

@ -27,6 +27,7 @@ from moto.packages.httpretty.core import HTTPrettyRequest
from moto.core.responses import _TemplateEnvironmentMixin, ActionAuthenticatorMixin from moto.core.responses import _TemplateEnvironmentMixin, ActionAuthenticatorMixin
from moto.core.utils import path_url from moto.core.utils import path_url
from moto.core import ACCOUNT_ID from moto.core import ACCOUNT_ID
from moto.settings import S3_IGNORE_SUBDOMAIN_BUCKETNAME
from moto.s3bucket_path.utils import ( from moto.s3bucket_path.utils import (
bucket_name_from_url as bucketpath_bucket_name_from_url, bucket_name_from_url as bucketpath_bucket_name_from_url,
@ -186,6 +187,8 @@ class ResponseObject(_TemplateEnvironmentMixin, ActionAuthenticatorMixin):
return template.render(buckets=all_buckets) return template.render(buckets=all_buckets)
def subdomain_based_buckets(self, request): def subdomain_based_buckets(self, request):
if S3_IGNORE_SUBDOMAIN_BUCKETNAME:
return False
host = request.headers.get("host", request.headers.get("Host")) host = request.headers.get("host", request.headers.get("Host"))
if not host: if not host:
host = urlparse(request.url).netloc host = urlparse(request.url).netloc

View File

@ -1,12 +1,12 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import logging import logging
import os
import re import re
import six import six
from six.moves.urllib.parse import urlparse, unquote, quote from six.moves.urllib.parse import urlparse, unquote, quote
from requests.structures import CaseInsensitiveDict from requests.structures import CaseInsensitiveDict
import sys import sys
from moto.settings import S3_IGNORE_SUBDOMAIN_BUCKETNAME
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -26,7 +26,7 @@ user_settable_fields = {
def bucket_name_from_url(url): def bucket_name_from_url(url):
if os.environ.get("S3_IGNORE_SUBDOMAIN_BUCKETNAME", "") in ["1", "true"]: if S3_IGNORE_SUBDOMAIN_BUCKETNAME:
return None return None
domain = urlparse(url).netloc domain = urlparse(url).netloc

View File

@ -6,6 +6,10 @@ INITIAL_NO_AUTH_ACTION_COUNT = float(
) )
DEFAULT_CONTAINER_REGISTRY = os.environ.get("DEFAULT_CONTAINER_REGISTRY", "docker.io") 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(): def get_sf_execution_history_type():
""" """

5
tests/compat.py Normal file
View File

@ -0,0 +1,5 @@
try:
from unittest.mock import patch
except ImportError:
# for python 2.7
from mock import patch

View File

@ -1,5 +1,4 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import os
import pytest import pytest
from sure import expect from sure import expect
from moto.s3.utils import ( from moto.s3.utils import (
@ -9,6 +8,7 @@ from moto.s3.utils import (
clean_key_name, clean_key_name,
undo_clean_key_name, undo_clean_key_name,
) )
from tests.compat import patch
def test_base_url(): 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) expect(bucket_name_from_url("https://www.localhost:5000/def")).should.equal(None)
def test_force_ignore_subdomain_for_bucketnames(): def test_force_ignore_subdomain_for_bucketnames(monkeypatch):
os.environ["S3_IGNORE_SUBDOMAIN_BUCKETNAME"] = "1" with patch("moto.s3.utils.S3_IGNORE_SUBDOMAIN_BUCKETNAME", True):
expect( expect(
bucket_name_from_url("https://subdomain.localhost:5000/abc/resource") bucket_name_from_url("https://subdomain.localhost:5000/abc/resource")
).should.equal(None) ).should.equal(None)
del os.environ["S3_IGNORE_SUBDOMAIN_BUCKETNAME"]
def test_versioned_key_store(): def test_versioned_key_store():

View File

@ -7,6 +7,7 @@ import sure # noqa
from flask.testing import FlaskClient from flask.testing import FlaskClient
import moto.server as server import moto.server as server
from tests.compat import patch
""" """
Test the different server responses Test the different server responses
@ -56,6 +57,15 @@ def test_s3_server_bucket_create():
res.data.should.equal(b"test value") 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(): def test_s3_server_bucket_versioning():
test_client = authenticated_client() test_client = authenticated_client()