Ensure internal/external URL have no path (#54304)
* Ensure internal/external URL have no path * Fix comment typo Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
This commit is contained in:
@@ -10,6 +10,7 @@ import re
|
||||
import shutil
|
||||
from types import ModuleType
|
||||
from typing import Any, Callable
|
||||
from urllib.parse import urlparse
|
||||
|
||||
from awesomeversion import AwesomeVersion
|
||||
import voluptuous as vol
|
||||
@@ -161,6 +162,19 @@ def _no_duplicate_auth_mfa_module(
|
||||
return configs
|
||||
|
||||
|
||||
def _filter_bad_internal_external_urls(conf: dict) -> dict:
|
||||
"""Filter internal/external URL with a path."""
|
||||
for key in CONF_INTERNAL_URL, CONF_EXTERNAL_URL:
|
||||
if key in conf and urlparse(conf[key]).path not in ("", "/"):
|
||||
# We warn but do not fix, because if this was incorrectly configured,
|
||||
# adjusting this value might impact security.
|
||||
_LOGGER.warning(
|
||||
"Invalid %s set. It's not allowed to have a path (/bla)", key
|
||||
)
|
||||
|
||||
return conf
|
||||
|
||||
|
||||
PACKAGES_CONFIG_SCHEMA = cv.schema_with_slug_keys( # Package names are slugs
|
||||
vol.Schema({cv.string: vol.Any(dict, list, None)}) # Component config
|
||||
)
|
||||
@@ -188,59 +202,64 @@ CUSTOMIZE_CONFIG_SCHEMA = vol.Schema(
|
||||
}
|
||||
)
|
||||
|
||||
CORE_CONFIG_SCHEMA = CUSTOMIZE_CONFIG_SCHEMA.extend(
|
||||
{
|
||||
CONF_NAME: vol.Coerce(str),
|
||||
CONF_LATITUDE: cv.latitude,
|
||||
CONF_LONGITUDE: cv.longitude,
|
||||
CONF_ELEVATION: vol.Coerce(int),
|
||||
vol.Optional(CONF_TEMPERATURE_UNIT): cv.temperature_unit,
|
||||
CONF_UNIT_SYSTEM: cv.unit_system,
|
||||
CONF_TIME_ZONE: cv.time_zone,
|
||||
vol.Optional(CONF_INTERNAL_URL): cv.url,
|
||||
vol.Optional(CONF_EXTERNAL_URL): cv.url,
|
||||
vol.Optional(CONF_ALLOWLIST_EXTERNAL_DIRS): vol.All(
|
||||
cv.ensure_list, [vol.IsDir()] # pylint: disable=no-value-for-parameter
|
||||
),
|
||||
vol.Optional(LEGACY_CONF_WHITELIST_EXTERNAL_DIRS): vol.All(
|
||||
cv.ensure_list, [vol.IsDir()] # pylint: disable=no-value-for-parameter
|
||||
),
|
||||
vol.Optional(CONF_ALLOWLIST_EXTERNAL_URLS): vol.All(cv.ensure_list, [cv.url]),
|
||||
vol.Optional(CONF_PACKAGES, default={}): PACKAGES_CONFIG_SCHEMA,
|
||||
vol.Optional(CONF_AUTH_PROVIDERS): vol.All(
|
||||
cv.ensure_list,
|
||||
[
|
||||
auth_providers.AUTH_PROVIDER_SCHEMA.extend(
|
||||
{
|
||||
CONF_TYPE: vol.NotIn(
|
||||
["insecure_example"],
|
||||
"The insecure_example auth provider"
|
||||
" is for testing only.",
|
||||
)
|
||||
}
|
||||
)
|
||||
],
|
||||
_no_duplicate_auth_provider,
|
||||
),
|
||||
vol.Optional(CONF_AUTH_MFA_MODULES): vol.All(
|
||||
cv.ensure_list,
|
||||
[
|
||||
auth_mfa_modules.MULTI_FACTOR_AUTH_MODULE_SCHEMA.extend(
|
||||
{
|
||||
CONF_TYPE: vol.NotIn(
|
||||
["insecure_example"],
|
||||
"The insecure_example mfa module is for testing only.",
|
||||
)
|
||||
}
|
||||
)
|
||||
],
|
||||
_no_duplicate_auth_mfa_module,
|
||||
),
|
||||
# pylint: disable=no-value-for-parameter
|
||||
vol.Optional(CONF_MEDIA_DIRS): cv.schema_with_slug_keys(vol.IsDir()),
|
||||
vol.Optional(CONF_LEGACY_TEMPLATES): cv.boolean,
|
||||
vol.Optional(CONF_CURRENCY): cv.currency,
|
||||
}
|
||||
CORE_CONFIG_SCHEMA = vol.All(
|
||||
CUSTOMIZE_CONFIG_SCHEMA.extend(
|
||||
{
|
||||
CONF_NAME: vol.Coerce(str),
|
||||
CONF_LATITUDE: cv.latitude,
|
||||
CONF_LONGITUDE: cv.longitude,
|
||||
CONF_ELEVATION: vol.Coerce(int),
|
||||
vol.Optional(CONF_TEMPERATURE_UNIT): cv.temperature_unit,
|
||||
CONF_UNIT_SYSTEM: cv.unit_system,
|
||||
CONF_TIME_ZONE: cv.time_zone,
|
||||
vol.Optional(CONF_INTERNAL_URL): cv.url,
|
||||
vol.Optional(CONF_EXTERNAL_URL): cv.url,
|
||||
vol.Optional(CONF_ALLOWLIST_EXTERNAL_DIRS): vol.All(
|
||||
cv.ensure_list, [vol.IsDir()] # pylint: disable=no-value-for-parameter
|
||||
),
|
||||
vol.Optional(LEGACY_CONF_WHITELIST_EXTERNAL_DIRS): vol.All(
|
||||
cv.ensure_list, [vol.IsDir()] # pylint: disable=no-value-for-parameter
|
||||
),
|
||||
vol.Optional(CONF_ALLOWLIST_EXTERNAL_URLS): vol.All(
|
||||
cv.ensure_list, [cv.url]
|
||||
),
|
||||
vol.Optional(CONF_PACKAGES, default={}): PACKAGES_CONFIG_SCHEMA,
|
||||
vol.Optional(CONF_AUTH_PROVIDERS): vol.All(
|
||||
cv.ensure_list,
|
||||
[
|
||||
auth_providers.AUTH_PROVIDER_SCHEMA.extend(
|
||||
{
|
||||
CONF_TYPE: vol.NotIn(
|
||||
["insecure_example"],
|
||||
"The insecure_example auth provider"
|
||||
" is for testing only.",
|
||||
)
|
||||
}
|
||||
)
|
||||
],
|
||||
_no_duplicate_auth_provider,
|
||||
),
|
||||
vol.Optional(CONF_AUTH_MFA_MODULES): vol.All(
|
||||
cv.ensure_list,
|
||||
[
|
||||
auth_mfa_modules.MULTI_FACTOR_AUTH_MODULE_SCHEMA.extend(
|
||||
{
|
||||
CONF_TYPE: vol.NotIn(
|
||||
["insecure_example"],
|
||||
"The insecure_example mfa module is for testing only.",
|
||||
)
|
||||
}
|
||||
)
|
||||
],
|
||||
_no_duplicate_auth_mfa_module,
|
||||
),
|
||||
# pylint: disable=no-value-for-parameter
|
||||
vol.Optional(CONF_MEDIA_DIRS): cv.schema_with_slug_keys(vol.IsDir()),
|
||||
vol.Optional(CONF_LEGACY_TEMPLATES): cv.boolean,
|
||||
vol.Optional(CONF_CURRENCY): cv.currency,
|
||||
}
|
||||
),
|
||||
_filter_bad_internal_external_urls,
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user