Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • hansegucker/AlekSIS-Core
  • pinguin/AlekSIS-Core
  • AlekSIS/official/AlekSIS-Core
  • sunweaver/AlekSIS-Core
  • sggua/AlekSIS-Core
  • edward/AlekSIS-Core
  • magicfelix/AlekSIS-Core
7 results
Show changes
Commits on Source (16)
...@@ -9,6 +9,14 @@ and this project adheres to `Semantic Versioning`_. ...@@ -9,6 +9,14 @@ and this project adheres to `Semantic Versioning`_.
Unreleased Unreleased
---------- ----------
Added
~~~~~
* [OAuth] Allow apps to fill in their own claim data matching their scopes
`2.2.1_ – 2021-12-02
--------------------
Fixed Fixed
~~~~~ ~~~~~
...@@ -17,6 +25,7 @@ Fixed ...@@ -17,6 +25,7 @@ Fixed
* [OAuth] Fix OAuth claims for follow-up requests (e.g. UserInfo) * [OAuth] Fix OAuth claims for follow-up requests (e.g. UserInfo)
* [OAuth] Fix grant types checking failing on wrong types under some circumstances * [OAuth] Fix grant types checking failing on wrong types under some circumstances
* [OAuth] Re-introduce missing algorithm field in application form * [OAuth] Re-introduce missing algorithm field in application form
* Remove errornous backup folder check for S3
`2.2`_ - 2021-11-29 `2.2`_ - 2021-11-29
------------------- -------------------
...@@ -499,3 +508,4 @@ Fixed ...@@ -499,3 +508,4 @@ Fixed
.. _2.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.1 .. _2.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.1
.. _2.1.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.1.1 .. _2.1.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.1.1
.. _2.2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.2 .. _2.2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.2
.. _2.2.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.2.1
...@@ -9,6 +9,7 @@ from django.utils.translation import gettext as _ ...@@ -9,6 +9,7 @@ from django.utils.translation import gettext as _
from dynamic_preferences.registries import preference_models from dynamic_preferences.registries import preference_models
from health_check.plugins import plugin_dir from health_check.plugins import plugin_dir
from oauthlib.common import Request as OauthlibRequest
from .registries import ( from .registries import (
group_preferences_registry, group_preferences_registry,
...@@ -156,3 +157,49 @@ class CoreConfig(AppConfig): ...@@ -156,3 +157,49 @@ class CoreConfig(AppConfig):
"groups": _("Groups"), "groups": _("Groups"),
} }
return scopes return scopes
@classmethod
def get_additional_claims(cls, scopes: list[str], request: OauthlibRequest) -> dict[str, Any]:
django_request = HttpRequest()
django_request.META = request.headers
claims = {
"preferred_username": request.user.username,
}
if "profile" in scopes:
if has_person(request.user):
claims["given_name"] = request.user.person.first_name
claims["family_name"] = request.user.person.last_name
claims["profile"] = django_request.build_absolute_uri(
request.user.person.get_absolute_url()
)
if request.user.person.photo:
claims["picture"] = django_request.build_absolute_uri(
request.user.person.photo.url
)
else:
claims["given_name"] = request.user.first_name
claims["family_name"] = request.user.last_name
if "email" in scopes:
if has_person(request.user):
claims["email"] = request.user.person.email
else:
claims["email"] = request.user.email
if "address" in scopes and has_person(request.user):
claims["address"] = {
"street_address": request.user.person.street
+ " "
+ request.user.person.housenumber,
"locality": request.user.person.place,
"postal_code": request.user.person.postal_code,
}
if "groups" in scopes and has_person(request.user):
claims["groups"] = list(
request.user.person.member_of.values_list("name", flat=True).all()
)
return claims
...@@ -34,9 +34,6 @@ class BaseBackupHealthCheck(BaseHealthCheckBackend): ...@@ -34,9 +34,6 @@ class BaseBackupHealthCheck(BaseHealthCheckBackend):
def check_status(self): def check_status(self):
storage = get_storage() storage = get_storage()
backups = storage.list_backups(content_type=self.content_type) backups = storage.list_backups(content_type=self.content_type)
if not storage.storage.exists(""):
self.add_error(_("The backup folder doesn't exist."))
return
if backups: if backups:
last_backup = backups[:1] last_backup = backups[:1]
last_backup_time = dbbackup_utils.filename_to_date(last_backup[0]) last_backup_time = dbbackup_utils.filename_to_date(last_backup[0])
......
...@@ -8,6 +8,7 @@ from django.http import HttpRequest ...@@ -8,6 +8,7 @@ from django.http import HttpRequest
from dynamic_preferences.signals import preference_updated from dynamic_preferences.signals import preference_updated
from license_expression import Licensing from license_expression import Licensing
from oauthlib.common import Request as OauthlibRequest
from spdx_license_list import LICENSES from spdx_license_list import LICENSES
from .core_helpers import copyright_years from .core_helpers import copyright_years
...@@ -244,6 +245,11 @@ class AppConfig(django.apps.AppConfig): ...@@ -244,6 +245,11 @@ class AppConfig(django.apps.AppConfig):
"""Return a list of all OAuth scopes to always include for this request and application.""" """Return a list of all OAuth scopes to always include for this request and application."""
return [] return []
@classmethod
def get_additional_claims(cls, scopes: list[str], request: OauthlibRequest) -> dict[str, Any]:
"""Get claim data for requested scopes."""
return {}
def _maintain_default_data(self): def _maintain_default_data(self):
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
......
"""Helpers/overrides for django-allauth.""" """Helpers/overrides for django-allauth."""
from typing import Optional from typing import Any, Optional
from django.conf import settings from django.conf import settings
from django.http import HttpRequest from django.http import HttpRequest
...@@ -16,7 +16,6 @@ from oauth2_provider.views.mixins import ( ...@@ -16,7 +16,6 @@ from oauth2_provider.views.mixins import (
from oauthlib.common import Request as OauthlibRequest from oauthlib.common import Request as OauthlibRequest
from .apps import AppConfig from .apps import AppConfig
from .core_helpers import get_site_preferences, has_person
class OurSocialAccountAdapter(DefaultSocialAccountAdapter): class OurSocialAccountAdapter(DefaultSocialAccountAdapter):
...@@ -43,52 +42,16 @@ class OurAccountAdapter(DefaultAccountAdapter): ...@@ -43,52 +42,16 @@ class OurAccountAdapter(DefaultAccountAdapter):
class CustomOAuth2Validator(OAuth2Validator): class CustomOAuth2Validator(OAuth2Validator):
def get_additional_claims(self, request): def get_additional_claims(self, request: OauthlibRequest) -> dict[str, Any]:
django_request = HttpRequest() # Pull together scopes from request and from access token
django_request.META = request.headers
scopes = request.scopes.copy() scopes = request.scopes.copy()
if request.access_token: if request.access_token:
scopes += request.access_token.scope.split(" ") scopes += request.access_token.scope.split(" ")
claims = { claims = {}
"preferred_username": request.user.username, # Pull together claim data from all apps
} for app in AppConfig.__subclasses__():
claims.update(app.get_additional_claims(scopes, request))
if "profile" in scopes:
if has_person(request.user):
claims["given_name"] = request.user.person.first_name
claims["family_name"] = request.user.person.last_name
claims["profile"] = django_request.build_absolute_uri(
request.user.person.get_absolute_url()
)
if request.user.person.photo:
claims["picture"] = django_request.build_absolute_uri(
request.user.person.photo.url
)
else:
claims["given_name"] = request.user.first_name
claims["family_name"] = request.user.last_name
if "email" in scopes:
if has_person(request.user):
claims["email"] = request.user.person.email
else:
claims["email"] = request.user.email
if "address" in scopes and has_person(request.user):
claims["address"] = {
"street_address": request.user.person.street
+ " "
+ request.user.person.housenumber,
"locality": request.user.person.place,
"postal_code": request.user.person.postal_code,
}
if "groups" in scopes and has_person(request.user):
claims["groups"] = list(
request.user.person.member_of.values_list("name", flat=True).all()
)
return claims return claims
......
This diff is collapsed.
...@@ -83,7 +83,7 @@ django-polymorphic = "^3.0.0" ...@@ -83,7 +83,7 @@ django-polymorphic = "^3.0.0"
django-colorfield = "^0.4.0" django-colorfield = "^0.4.0"
django-bleach = "^0.9.0" django-bleach = "^0.9.0"
django-guardian = "^2.2.0" django-guardian = "^2.2.0"
rules = "^2.2" rules = "^3.0"
django-cache-memoize = "^0.1.6" django-cache-memoize = "^0.1.6"
django-haystack = "^3.1" django-haystack = "^3.1"
celery-haystack-ng = "^0.20" celery-haystack-ng = "^0.20"
......