From 1045b619ea63afd89c8de8daae3c7c9d0ee3be5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20Istv=C3=A1n?= Date: Tue, 4 Nov 2025 22:15:34 +0100 Subject: [PATCH] Fix executiveAt check by reading from the official AuthSCH field --- .../schpincer/model/SchPincerOidcUser.kt | 27 ++++++++++++++++--- .../service/SchPincerOidcUserService.kt | 2 +- .../kotlin/hu/kirdev/schpincer/web/Utility.kt | 10 +++---- src/main/resources/banner.txt | 3 +-- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/main/kotlin/hu/kirdev/schpincer/model/SchPincerOidcUser.kt b/src/main/kotlin/hu/kirdev/schpincer/model/SchPincerOidcUser.kt index 59cbc42..ea54b32 100644 --- a/src/main/kotlin/hu/kirdev/schpincer/model/SchPincerOidcUser.kt +++ b/src/main/kotlin/hu/kirdev/schpincer/model/SchPincerOidcUser.kt @@ -5,12 +5,14 @@ import org.springframework.security.oauth2.core.oidc.user.OidcUser enum class CardType { DO, KB, AB } data class CircleMembership(val id: Long, val name: String, val title: List) +data class ExecutiveAt(val id: Long, val name: String) data class Entrant(val groupId: Long, val groupName: String, val entrantType: String) class SchPincerOidcUser(private val oidcUser: OidcUser) : OidcUser by oidcUser { val internalId get() = subject var extraAuthorities: List = listOf() val memberships = parseCircleMemberships() + val executiveAtCircles = parseExecutiveAt() val entrants = parseEntrants() val cardType = getCardType(entrants) @@ -28,14 +30,27 @@ class SchPincerOidcUser(private val oidcUser: OidcUser) : OidcUser by oidcUser { return card } + private fun parseExecutiveAt(): List { + val executiveAt = oidcUser.getClaim>>("pek.sch.bme.hu:executiveAt/v1") ?: listOf() + return executiveAt.mapNotNull { + runCatching { + ExecutiveAt( + (it["id"] as Number).toLong(), + it["name"].toString(), + ) + }.getOrNull() + } + } + private fun parseCircleMemberships(): List { val memberships = oidcUser.getClaim>>("pek.sch.bme.hu:activeMemberships/v1") ?: listOf() return memberships.mapNotNull { runCatching { CircleMembership( - it["id"] as Long, + (it["id"] as Number).toLong(), it["name"].toString(), - (it["title"] as List<*>).map { it.toString() }) + (it["title"] as List<*>).map { it.toString() }, + ) }.getOrNull() } } @@ -43,7 +58,13 @@ class SchPincerOidcUser(private val oidcUser: OidcUser) : OidcUser by oidcUser { private fun parseEntrants(): List { val entrants = oidcUser.getClaim>>("pek.sch.bme.hu:entrants/v1") ?: listOf() return entrants.mapNotNull { - runCatching { Entrant(it["groupId"] as Long, it["groupName"].toString(), it["entrantType"].toString()) }.getOrNull() + runCatching { + Entrant( + (it["id"] as Number).toLong(), + it["groupName"].toString(), + it["entrantType"].toString(), + ) + }.getOrNull() } } diff --git a/src/main/kotlin/hu/kirdev/schpincer/service/SchPincerOidcUserService.kt b/src/main/kotlin/hu/kirdev/schpincer/service/SchPincerOidcUserService.kt index 90173e7..8699ed6 100644 --- a/src/main/kotlin/hu/kirdev/schpincer/service/SchPincerOidcUserService.kt +++ b/src/main/kotlin/hu/kirdev/schpincer/service/SchPincerOidcUserService.kt @@ -23,7 +23,7 @@ open class SchPincerOidcUserService( val authschUser = super.loadUser(userRequest) ?: return null val schPincerUser = SchPincerOidcUser(authschUser) - val ownedCircles = getOwnedCircleIds(schPincerUser.memberships, circleService) + val ownedCircles = getOwnedCircleIds(schPincerUser.executiveAtCircles, circleService) if (userService.exists(schPincerUser.internalId)) { val user = userService.getById(schPincerUser.internalId) user.email = schPincerUser.email diff --git a/src/main/kotlin/hu/kirdev/schpincer/web/Utility.kt b/src/main/kotlin/hu/kirdev/schpincer/web/Utility.kt index 898bef1..21afc43 100644 --- a/src/main/kotlin/hu/kirdev/schpincer/web/Utility.kt +++ b/src/main/kotlin/hu/kirdev/schpincer/web/Utility.kt @@ -2,7 +2,7 @@ package hu.kirdev.schpincer.web import hu.kirdev.schpincer.config.Role import hu.kirdev.schpincer.dto.CircleMemberRole -import hu.kirdev.schpincer.model.CircleMembership +import hu.kirdev.schpincer.model.ExecutiveAt import hu.kirdev.schpincer.model.SchPincerOidcUser import hu.kirdev.schpincer.service.CircleService import hu.kirdev.schpincer.service.UserService @@ -70,12 +70,10 @@ fun Authentication?.getUserIfPresent() = if (hasUser()) getUser() else null fun Authentication?.getUserId() = (this?.principal as? SchPincerOidcUser)?.internalId fun Authentication?.getOwnedCircles(circleService: CircleService) = - getOwnedCircleIds((this?.principal!! as SchPincerOidcUser).memberships, circleService) + getOwnedCircleIds((this?.principal!! as SchPincerOidcUser).executiveAtCircles, circleService) -fun getOwnedCircleIds(memberships: List, circleService: CircleService): List { - return memberships - .filter { it.title.any { it.lowercase().matches("^k[oö]rvezet[oöő]$".toRegex()) } } - .mapNotNull { circleService.findByVirGroupId(it.id)?.id } +fun getOwnedCircleIds(executiveAt: List, circleService: CircleService): List { + return executiveAt.mapNotNull { circleService.findByVirGroupId(it.id)?.id } } diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt index f4f1d00..e6811b7 100644 --- a/src/main/resources/banner.txt +++ b/src/main/resources/banner.txt @@ -2,9 +2,8 @@ / __|/ __| || | | _ \_ _| \| |/ __| __| _ \ \__ \ (__| __ | [] | _/| || .` | (__| _|| / |___/\___|_||_| |_| |___|_|\_|\___|___|_|_\ - :: SCH-PINCÉR :: Startup completed + :: SCH-PINCÉR :: Project lead: Szabo Gergely Contributors: Albi, Beni, Berci, Isti, Schámi, Szabó Beni, Trisz Github: https://github.com/kir-dev/sch-pincer - Profiles: ${spring.profiles.active} Spring Boot: ${spring-boot.formatted-version}