basyx commited on
Commit
044d346
·
verified ·
1 Parent(s): bf47a7f

Enforce signed media URL lifetime limits

Browse files
Files changed (1) hide show
  1. app/services/media_url_signer.py +14 -3
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
- expires = int(time.time()) + (ttl or self.settings.media_signed_url_ttl_seconds)
 
 
 
 
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
- if key is None or expires < int(time.time()):
 
 
 
 
 
37
  return False
38
  message = f"{request_id}\n{filename}\n{expires}".encode("utf-8")
39
- expected = base64.urlsafe_b64encode(hmac.new(key, message, hashlib.sha256).digest()).decode("ascii").rstrip("=")
 
 
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)