Changeset View
Changeset View
Standalone View
Standalone View
swh/deposit/api/common.py
Show First 20 Lines • Show All 146 Lines • ▼ Show 20 Lines | class AuthenticatedAPIView(APIView): | ||||
permission_classes: Sequence[Type[BasePermission]] = (IsAuthenticated,) | permission_classes: Sequence[Type[BasePermission]] = (IsAuthenticated,) | ||||
class APIBase(APIConfig, AuthenticatedAPIView, metaclass=ABCMeta): | class APIBase(APIConfig, AuthenticatedAPIView, metaclass=ABCMeta): | ||||
"""Base deposit request class sharing multiple common behaviors. | """Base deposit request class sharing multiple common behaviors. | ||||
""" | """ | ||||
_client: Optional[DepositClient] = None | |||||
def _read_headers(self, request: Request) -> ParsedRequestHeaders: | def _read_headers(self, request: Request) -> ParsedRequestHeaders: | ||||
"""Read and unify the necessary headers from the request (those are | """Read and unify the necessary headers from the request (those are | ||||
not stored in the same location or not properly formatted). | not stored in the same location or not properly formatted). | ||||
Args: | Args: | ||||
request: Input request | request: Input request | ||||
Returns: | Returns: | ||||
▲ Show 20 Lines • Show All 690 Lines • ▼ Show 20 Lines | ) -> Dict[str, Any]: | ||||
"""Permit the child class to enrich additional checks. | """Permit the child class to enrich additional checks. | ||||
Returns: | Returns: | ||||
dict with 'error' detailing the problem. | dict with 'error' detailing the problem. | ||||
""" | """ | ||||
return {} | return {} | ||||
def get_client(self, request) -> Optional[DepositClient]: | |||||
"""Returns a DepositClient if request.user.username is not None""" | |||||
username = request.user.username | |||||
if username is None: | |||||
return None | |||||
if self._client is None: | |||||
try: | |||||
self._client = DepositClient.objects.get( # type: ignore | |||||
username=username | |||||
) | |||||
except DepositClient.DoesNotExist: | |||||
raise DepositError(NOT_FOUND, f"Unknown client name {username}") | |||||
assert self._client.username == username | |||||
return self._client | |||||
def checks( | def checks( | ||||
self, request: Request, collection_name: str, deposit: Optional[Deposit] = None | self, request: Request, collection_name: str, deposit: Optional[Deposit] = None | ||||
) -> ParsedRequestHeaders: | ) -> ParsedRequestHeaders: | ||||
if deposit is None: | if deposit is None: | ||||
collection = get_collection_by_name(collection_name) | collection = get_collection_by_name(collection_name) | ||||
else: | else: | ||||
assert collection_name == deposit.collection.name | assert collection_name == deposit.collection.name | ||||
collection = deposit.collection | collection = deposit.collection | ||||
username = request.user.username | client = self.get_client(request) | ||||
if username: # unauthenticated request can have the username empty | if client: # unauthenticated request can have the username empty | ||||
try: | |||||
self._client: DepositClient = DepositClient.objects.get( # type: ignore | |||||
username=username | |||||
) | |||||
except DepositClient.DoesNotExist: | |||||
raise DepositError(NOT_FOUND, f"Unknown client name {username}") | |||||
collection_id = collection.id | collection_id = collection.id | ||||
collections = self._client.collections | collections = client.collections | ||||
assert collections is not None | assert collections is not None | ||||
if collection_id not in collections: | if collection_id not in collections: | ||||
raise DepositError( | raise DepositError( | ||||
FORBIDDEN, | FORBIDDEN, | ||||
f"Client {username} cannot access collection {collection_name}", | f"Client {client.username} cannot access collection " | ||||
f"{collection_name}", | |||||
) | ) | ||||
headers = self._read_headers(request) | headers = self._read_headers(request) | ||||
if deposit is not None: | if deposit is not None: | ||||
self.restrict_access(request, headers, deposit) | self.restrict_access(request, headers, deposit) | ||||
if headers.on_behalf_of: | if headers.on_behalf_of: | ||||
▲ Show 20 Lines • Show All 252 Lines • Show Last 20 Lines |