Spaces:
Running
Running
Enforce signed media URL lifetime limits
Browse files
app/services/media_url_signer.py
CHANGED
|
@@ -24,7 +24,11 @@ class MediaURLSigner:
|
|
| 24 |
key = self._key()
|
| 25 |
if key is None:
|
| 26 |
return None
|
| 27 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
message = f"{request_id}\n{filename}\n{expires}".encode("utf-8")
|
| 29 |
digest = hmac.new(key, message, hashlib.sha256).digest()
|
| 30 |
token = base64.urlsafe_b64encode(digest).decode("ascii").rstrip("=")
|
|
@@ -33,8 +37,15 @@ class MediaURLSigner:
|
|
| 33 |
|
| 34 |
def verify(self, request_id: str, filename: str, expires: int, signature: str) -> bool:
|
| 35 |
key = self._key()
|
| 36 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
return False
|
| 38 |
message = f"{request_id}\n{filename}\n{expires}".encode("utf-8")
|
| 39 |
-
expected = base64.urlsafe_b64encode(
|
|
|
|
|
|
|
| 40 |
return hmac.compare_digest(expected, signature)
|
|
|
|
| 24 |
key = self._key()
|
| 25 |
if key is None:
|
| 26 |
return None
|
| 27 |
+
requested_ttl = self.settings.media_signed_url_ttl_seconds if ttl is None else ttl
|
| 28 |
+
# A caller may request a shorter link, but cannot mint a link longer
|
| 29 |
+
# than the configured maximum lifetime.
|
| 30 |
+
lifetime = max(1, min(int(requested_ttl), self.settings.media_signed_url_ttl_seconds))
|
| 31 |
+
expires = int(time.time()) + lifetime
|
| 32 |
message = f"{request_id}\n{filename}\n{expires}".encode("utf-8")
|
| 33 |
digest = hmac.new(key, message, hashlib.sha256).digest()
|
| 34 |
token = base64.urlsafe_b64encode(digest).decode("ascii").rstrip("=")
|
|
|
|
| 37 |
|
| 38 |
def verify(self, request_id: str, filename: str, expires: int, signature: str) -> bool:
|
| 39 |
key = self._key()
|
| 40 |
+
now = int(time.time())
|
| 41 |
+
if (
|
| 42 |
+
key is None
|
| 43 |
+
or expires <= now
|
| 44 |
+
or expires > now + self.settings.media_signed_url_ttl_seconds
|
| 45 |
+
):
|
| 46 |
return False
|
| 47 |
message = f"{request_id}\n{filename}\n{expires}".encode("utf-8")
|
| 48 |
+
expected = base64.urlsafe_b64encode(
|
| 49 |
+
hmac.new(key, message, hashlib.sha256).digest()
|
| 50 |
+
).decode("ascii").rstrip("=")
|
| 51 |
return hmac.compare_digest(expected, signature)
|