@@ -295,18 +295,15 @@ async def load_dotenv(self, envvar_prefix: str = "API_KEY_"):
295295 raise ConfigurationError (f"No environment variables found with prefix '{ envvar_prefix } '" )
296296
297297 for key , api_key in zip (list_keys , list_api_key ):
298- global_prefix , key_id , key_secret = self ._get_parts (api_key )
298+ parsed = self ._get_parts (api_key )
299299
300300 await self .create (
301301 name = key ,
302- key_id = key_id ,
303- key_secret = key_secret ,
302+ key_id = parsed . key_id ,
303+ key_secret = parsed . key_secret ,
304304 )
305305
306306 async def get_by_id (self , id_ : str ) -> ApiKey :
307- if id_ .strip () == "" :
308- raise KeyNotProvided ("No API key provided" )
309-
310307 entity = await self ._repo .get_by_id (id_ )
311308
312309 if entity is None :
@@ -315,9 +312,6 @@ async def get_by_id(self, id_: str) -> ApiKey:
315312 return entity
316313
317314 async def get_by_key_id (self , key_id : str ) -> ApiKey :
318- if not key_id .strip ():
319- raise KeyNotProvided ("No API key key_id provided (key_id cannot be empty)" )
320-
321315 entity = await self ._repo .get_by_key_id (key_id )
322316
323317 if entity is None :
@@ -426,20 +420,10 @@ def _parse_and_validate_key(self, api_key: Optional[str]) -> ParsedApiKey:
426420 KeyNotProvided: If the key is None or empty.
427421 InvalidKey: If the format or prefix is invalid.
428422 """
429- if api_key is None :
423+ if api_key is None or api_key . strip () == "" :
430424 raise KeyNotProvided ("Api key must be provided (not given)" )
431425
432- global_prefix , key_id , key_secret = self ._get_parts (api_key )
433-
434- if global_prefix != self .global_prefix :
435- raise InvalidKey ("Api key is invalid (wrong global prefix)" )
436-
437- return ParsedApiKey (
438- global_prefix = global_prefix ,
439- key_id = key_id ,
440- key_secret = key_secret ,
441- raw = api_key ,
442- )
426+ return self ._get_parts (api_key )
443427
444428 async def _verify_entity (self , entity : ApiKey , key_secret : str , required_scopes : List [str ]) -> ApiKey :
445429 """Verify that an entity can authenticate with the provided secret.
@@ -458,18 +442,17 @@ async def _verify_entity(self, entity: ApiKey, key_secret: str, required_scopes:
458442 InvalidKey: If the hash does not match.
459443 InvalidScopes: If scopes are insufficient.
460444 """
461- assert entity .key_hash is not None , "key_hash must be set for existing API keys" # nosec B101
445+ # Todo: IDK if this line ise usefully
446+ # assert entity.key_hash is not None, "key_hash must be set for existing API keys" # nosec B101
462447
463- entity .ensure_can_authenticate ( )
448+ entity .ensure_valid ( scopes = required_scopes )
464449
465450 if not self ._hasher .verify (entity .key_hash , key_secret ):
466451 raise InvalidKey ("API key is invalid (hash mismatch)" )
467452
468- entity .ensure_valid_scopes (required_scopes )
469-
470453 return await self .touch (entity )
471454
472- def _get_parts (self , api_key : str ) -> Tuple [ str , str , str ] :
455+ def _get_parts (self , api_key : str ) -> ParsedApiKey :
473456 """Extract the parts of the API key string.
474457
475458 Args:
@@ -486,10 +469,20 @@ def _get_parts(self, api_key: str) -> Tuple[str, str, str]:
486469 if len (parts ) != 3 :
487470 raise InvalidKey ("API key format is invalid (wrong number of segments)." )
488471
489- if not all (parts ):
472+ if not all (p . strip () for p in parts ):
490473 raise InvalidKey ("API key format is invalid (empty segment)." )
491474
492- return parts [0 ], parts [1 ], parts [2 ]
475+ parsed_api_key = ParsedApiKey (
476+ global_prefix = parts [0 ],
477+ key_id = parts [1 ],
478+ key_secret = parts [2 ],
479+ raw = api_key ,
480+ )
481+
482+ if parsed_api_key .global_prefix != self .global_prefix :
483+ raise InvalidKey ("Api key is invalid (wrong global prefix)" )
484+
485+ return parsed_api_key
493486
494487 async def touch (self , entity : ApiKey ) -> ApiKey :
495488 """Update last_used_at to now and persist the change."""
0 commit comments