45 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from functools import wraps
 | |
| from typing import Any
 | |
| 
 | |
| from quart import g
 | |
| 
 | |
| from foxnouns.exceptions import ErrorCode, ForbiddenError, UnsupportedEndpointError
 | |
| 
 | |
| 
 | |
| def require_auth(*, scope: str | None = None):
 | |
|     """Decorator that requires a token with the given scopes.
 | |
|     If no token is given or the required scopes aren't set on it, execution is aborted."""
 | |
| 
 | |
|     def decorator(func):
 | |
|         @wraps(func)
 | |
|         async def wrapper(*args, **kwargs):
 | |
|             if "user" not in g or "token" not in g:
 | |
|                 raise ForbiddenError("Not authenticated", type=ErrorCode.Forbidden)
 | |
| 
 | |
|             if scope and not g.token.has_scope(scope):
 | |
|                 raise ForbiddenError(
 | |
|                     f"Missing scope '{scope}'", type=ErrorCode.MissingScope
 | |
|                 )
 | |
| 
 | |
|             return await func(*args, **kwargs)
 | |
| 
 | |
|         return wrapper
 | |
| 
 | |
|     return decorator
 | |
| 
 | |
| 
 | |
| def require_config_key(*, keys: list[Any]):
 | |
|     """Decorator that requires one or more config keys to be set.
 | |
|     If any of them are None, execution is aborted."""
 | |
| 
 | |
|     def decorator(func):
 | |
|         @wraps(func)
 | |
|         async def wrapper(*args, **kwargs):
 | |
|             for key in keys:
 | |
|                 if not key:
 | |
|                     raise UnsupportedEndpointError()
 | |
|             return await func(*args, **kwargs)
 | |
| 
 | |
|         return wrapper
 | |
| 
 | |
|     return decorator
 |