def configure(self, config: dict, json_key: str='signed_url') -> dict:
"""Configure the signed URLs.
:param config: (dict) Configuration dictionary.
:param json_key: (str) Key of the signed URLs list in dict.
:raises: TypeError: invalid argument type.
:raises: ValueError: dict content is invalid, or json_key is not a str.
:return: (dict) Loaded settings: {"ttl": int, "protect": list}.
"""
_cfg = config.get(json_key, None)
if _cfg is None:
self.__secret = None
self.__ts_key = ''
self.__sig_key = ''
return {'ttl': None, 'protect': []}
if isinstance(_cfg, dict) is False:
raise TypeError(f"JSON key '{json_key}' must be a dict.")
_secret = _cfg.get('secret', '')
self.check_non_empty_string(_secret)
_ttl_seconds = _cfg.get('ttl')
self.check_ttl_seconds(_ttl_seconds)
_protect = _cfg.get('protect')
if isinstance(_protect, (list, tuple)) is False:
raise ValueError('signed_url.protect must be a list.')
_query_keys = _cfg.get('query_keys', {})
if isinstance(_query_keys, dict) is False:
raise ValueError('signed_url.query_keys must be a dict.')
ts_key = _query_keys.get('ts', self.__ts_key)
self.check_non_empty_string(ts_key)
sig_key = _query_keys.get('sig', self.__sig_key)
self.check_non_empty_string(sig_key)
self.__secret = _secret.encode('utf-8')
self.__ts_key = ts_key
self.__sig_key = sig_key
return {'ttl': _ttl_seconds, 'protect': _protect}