Adjust serializing resolved media (#67240)

This commit is contained in:
Paulus Schoutsen 2022-02-25 10:00:03 -08:00 committed by GitHub
parent 07a792019e
commit 6fd9e71b8f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 18 deletions

View file

@ -15,7 +15,9 @@ from .const import CONTENT_AUTH_EXPIRY_TIME, MEDIA_CLASS_DIRECTORY
@callback @callback
def async_process_play_media_url(hass: HomeAssistant, media_content_id: str) -> str: def async_process_play_media_url(
hass: HomeAssistant, media_content_id: str, *, allow_relative_url: bool = False
) -> str:
"""Update a media URL with authentication if it points at Home Assistant.""" """Update a media URL with authentication if it points at Home Assistant."""
if media_content_id[0] != "/" and not is_hass_url(hass, media_content_id): if media_content_id[0] != "/" and not is_hass_url(hass, media_content_id):
return media_content_id return media_content_id
@ -34,8 +36,8 @@ def async_process_play_media_url(hass: HomeAssistant, media_content_id: str) ->
) )
media_content_id = str(parsed.join(yarl.URL(signed_path))) media_content_id = str(parsed.join(yarl.URL(signed_path)))
# prepend external URL # convert relative URL to absolute URL
if media_content_id[0] == "/": if media_content_id[0] == "/" and not allow_relative_url:
media_content_id = f"{get_url(hass)}{media_content_id}" media_content_id = f"{get_url(hass)}{media_content_id}"
return media_content_id return media_content_id

View file

@ -2,21 +2,20 @@
from __future__ import annotations from __future__ import annotations
from collections.abc import Callable from collections.abc import Callable
import dataclasses
from datetime import timedelta
from typing import Any from typing import Any
from urllib.parse import quote
import voluptuous as vol import voluptuous as vol
from homeassistant.components import frontend, websocket_api from homeassistant.components import frontend, websocket_api
from homeassistant.components.http.auth import async_sign_path
from homeassistant.components.media_player import ( from homeassistant.components.media_player import (
ATTR_MEDIA_CONTENT_ID, ATTR_MEDIA_CONTENT_ID,
CONTENT_AUTH_EXPIRY_TIME, CONTENT_AUTH_EXPIRY_TIME,
BrowseError, BrowseError,
BrowseMedia, BrowseMedia,
) )
from homeassistant.components.media_player.browse_media import (
async_process_play_media_url,
)
from homeassistant.components.websocket_api import ActiveConnection from homeassistant.components.websocket_api import ActiveConnection
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.integration_platform import ( from homeassistant.helpers.integration_platform import (
@ -177,13 +176,12 @@ async def websocket_resolve_media(
connection.send_error(msg["id"], "resolve_media_failed", str(err)) connection.send_error(msg["id"], "resolve_media_failed", str(err))
return return
data = dataclasses.asdict(media) connection.send_result(
msg["id"],
if data["url"][0] == "/": {
data["url"] = async_sign_path( "url": async_process_play_media_url(
hass, hass, media.url, allow_relative_url=True
quote(data["url"]), ),
timedelta(seconds=msg["expires"]), "mime_type": media.mime_type,
) },
)
connection.send_result(msg["id"], data)

View file

@ -187,7 +187,8 @@ async def test_websocket_resolve_media(hass, hass_ws_client, filename):
assert msg["id"] == 1 assert msg["id"] == 1
assert msg["result"]["mime_type"] == media.mime_type assert msg["result"]["mime_type"] == media.mime_type
# Validate url is signed. # Validate url is relative and signed.
assert msg["result"]["url"][0] == "/"
parsed = yarl.URL(msg["result"]["url"]) parsed = yarl.URL(msg["result"]["url"])
assert parsed.path == getattr(media, "url") assert parsed.path == getattr(media, "url")
assert "authSig" in parsed.query assert "authSig" in parsed.query