| 3468 | |
| 3469 | |
| 3470 | def decode_signed_value( |
| 3471 | secret: _CookieSecretTypes, |
| 3472 | name: str, |
| 3473 | value: Union[None, str, bytes], |
| 3474 | max_age_days: float = 31, |
| 3475 | clock: Optional[Callable[[], float]] = None, |
| 3476 | min_version: Optional[int] = None, |
| 3477 | ) -> Optional[bytes]: |
| 3478 | if clock is None: |
| 3479 | clock = time.time |
| 3480 | if min_version is None: |
| 3481 | min_version = DEFAULT_SIGNED_VALUE_MIN_VERSION |
| 3482 | if min_version > 2: |
| 3483 | raise ValueError("Unsupported min_version %d" % min_version) |
| 3484 | if not value: |
| 3485 | return None |
| 3486 | |
| 3487 | value = utf8(value) |
| 3488 | version = _get_version(value) |
| 3489 | |
| 3490 | if version < min_version: |
| 3491 | return None |
| 3492 | if version == 1: |
| 3493 | assert not isinstance(secret, dict) |
| 3494 | return _decode_signed_value_v1(secret, name, value, max_age_days, clock) |
| 3495 | elif version == 2: |
| 3496 | return _decode_signed_value_v2(secret, name, value, max_age_days, clock) |
| 3497 | else: |
| 3498 | return None |
| 3499 | |
| 3500 | |
| 3501 | def _decode_signed_value_v1( |