2021-06-14 21:30:01 +00:00
|
|
|
# Copyright (C) 2018-2021 by BDE ENS Paris-Saclay
|
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
2021-12-23 20:59:37 +00:00
|
|
|
from oauth2_provider.oauth2_validators import OAuth2Validator
|
2021-06-14 21:30:01 +00:00
|
|
|
from oauth2_provider.scopes import BaseScopes
|
|
|
|
from member.models import Club
|
2021-06-15 19:31:51 +00:00
|
|
|
from note_kfet.middlewares import get_current_request
|
2021-06-14 21:30:01 +00:00
|
|
|
|
|
|
|
from .backends import PermissionBackend
|
|
|
|
from .models import Permission
|
|
|
|
|
|
|
|
|
|
|
|
class PermissionScopes(BaseScopes):
|
|
|
|
"""
|
|
|
|
An OAuth2 scope is defined by a permission object and a club.
|
|
|
|
A token will have a subset of permissions from the owner of the application,
|
|
|
|
and can be useful to make queries through the API with limited privileges.
|
|
|
|
"""
|
|
|
|
|
|
|
|
def get_all_scopes(self):
|
|
|
|
return {f"{p.id}_{club.id}": f"{p.description} (club {club.name})"
|
|
|
|
for p in Permission.objects.all() for club in Club.objects.all()}
|
|
|
|
|
|
|
|
def get_available_scopes(self, application=None, request=None, *args, **kwargs):
|
|
|
|
if not application:
|
|
|
|
return []
|
|
|
|
return [f"{p.id}_{p.membership.club.id}"
|
|
|
|
for t in Permission.PERMISSION_TYPES
|
2021-06-15 19:31:51 +00:00
|
|
|
for p in PermissionBackend.get_raw_permissions(get_current_request(), t[0])]
|
2021-06-14 21:30:01 +00:00
|
|
|
|
|
|
|
def get_default_scopes(self, application=None, request=None, *args, **kwargs):
|
|
|
|
if not application:
|
|
|
|
return []
|
|
|
|
return [f"{p.id}_{p.membership.club.id}"
|
2021-06-15 19:31:51 +00:00
|
|
|
for p in PermissionBackend.get_raw_permissions(get_current_request(), 'view')]
|
2021-12-23 20:59:37 +00:00
|
|
|
|
|
|
|
|
|
|
|
class PermissionOAuth2Validator(OAuth2Validator):
|
|
|
|
def validate_scopes(self, client_id, scopes, client, request, *args, **kwargs):
|
|
|
|
"""
|
|
|
|
User can request as many scope as he wants, including invalid scopes,
|
|
|
|
but it will have only the permissions he has.
|
|
|
|
|
|
|
|
This allows clients to request more permission to get finally a
|
|
|
|
subset of permissions.
|
|
|
|
"""
|
|
|
|
|
|
|
|
valid_scopes = set()
|
|
|
|
|
|
|
|
for t in Permission.PERMISSION_TYPES:
|
|
|
|
for p in PermissionBackend.get_raw_permissions(get_current_request(), t[0]):
|
|
|
|
scope = f"{p.id}_{p.membership.club.id}"
|
|
|
|
if scope in scopes:
|
|
|
|
valid_scopes.add(scope)
|
|
|
|
|
|
|
|
request.scopes = valid_scopes
|
|
|
|
|
|
|
|
return valid_scopes
|