Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ logging.level.web=DEBUG
```

Your pekId can be found in the console log of the Spring app when signing in with AuthSCH.
The`cmsch.website-default-url`property's IP address needs
The `cmsch.website-default-url` property's IP address needs
to be either `localhost` or the IP of your current device running your Spring app on your network.

Once created, edit the `CMSchApplication` Run Configuration's Spring Boot Active Profiles to use (see image down below)
Expand Down
25 changes: 13 additions & 12 deletions backend/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
id("org.springframework.boot") version "4.0.2"
id("org.springframework.boot") version "4.0.4"
id("io.spring.dependency-management") version "1.1.7"
id("org.owasp.dependencycheck") version "12.2.0"
kotlin("jvm") version "2.3.0"
kotlin("plugin.spring") version "2.3.0"
id("org.sonarqube") version "7.2.2.6593"
kotlin("jvm") version "2.3.20"
kotlin("plugin.spring") version "2.3.20"
id("org.sonarqube") version "7.2.3.7755"
}

group = "hu.bme.sch"
Expand Down Expand Up @@ -41,17 +42,17 @@
mavenCentral()
}

tasks.named<KotlinCompilationTask<*>>("compileKotlin").configure {
compilerOptions.optIn.add("kotlin.uuid.ExperimentalUuidApi")
}

dependencies {
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
developmentOnly("org.springframework.boot:spring-boot-devtools")
implementation("tools.jackson.dataformat:jackson-dataformat-csv")
implementation("tools.jackson.module:jackson-module-kotlin")
implementation("com.fasterxml.uuid:java-uuid-generator:5.2.0")
implementation("com.github.spullara.mustache.java:compiler:0.9.14")
implementation("com.google.firebase:firebase-admin:9.7.1") {
exclude(module = "google-cloud-firestore")
exclude(module = "google-cloud-storage")
}
implementation("com.google.auth:google-auth-library-oauth2-http:1.43.0")

Check warning on line 55 in backend/build.gradle.kts

View check run for this annotation

SonarQubeCloud / [cmsch] SonarCloud Code Analysis

Do not hardcode version numbers.

See more on https://sonarcloud.io/project/issues?id=kir-dev_cmsch-backend&issues=AZ0NQ-6VwcQd4B6oo49Q&open=AZ0NQ-6VwcQd4B6oo49Q&pullRequest=1018
implementation("com.google.zxing:core:3.5.4")
implementation("com.google.zxing:javase:3.5.4")
implementation("com.itextpdf:itext-core:9.5.0")
Expand All @@ -60,7 +61,7 @@
runtimeOnly("io.jsonwebtoken:jjwt-impl")
runtimeOnly("io.jsonwebtoken:jjwt-jackson")
implementation("io.jsonwebtoken:jjwt-api")
implementation(platform("io.micrometer:micrometer-bom:1.16.2"))
implementation(platform("io.micrometer:micrometer-bom:1.16.4"))
runtimeOnly("io.micrometer:micrometer-core")
runtimeOnly("io.micrometer:micrometer-observation")
runtimeOnly("io.micrometer:micrometer-registry-prometheus")
Expand All @@ -74,7 +75,7 @@
implementation("org.jetbrains.kotlin:kotlin-scripting-jvm-host")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2")
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:3.0.1")
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:3.0.2")

Check warning on line 78 in backend/build.gradle.kts

View check run for this annotation

SonarQubeCloud / [cmsch] SonarCloud Code Analysis

Do not hardcode version numbers.

See more on https://sonarcloud.io/project/issues?id=kir-dev_cmsch-backend&issues=AZ0WcWE9ynbVXazX4vEq&open=AZ0WcWE9ynbVXazX4vEq&pullRequest=1018
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-oauth2-client")
Expand All @@ -84,7 +85,7 @@
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-webclient")
implementation("org.springframework.session:spring-session-jdbc")
implementation("software.amazon.awssdk:s3:2.41.19")
implementation("software.amazon.awssdk:s3:2.42.18")

Check warning on line 88 in backend/build.gradle.kts

View check run for this annotation

SonarQubeCloud / [cmsch] SonarCloud Code Analysis

Do not hardcode version numbers.

See more on https://sonarcloud.io/project/issues?id=kir-dev_cmsch-backend&issues=AZzsuD10uzevaEjDYDdo&open=AZzsuD10uzevaEjDYDdo&pullRequest=1018
runtimeOnly("com.h2database:h2")
runtimeOnly("org.postgresql:postgresql")
testImplementation("org.springframework.boot:spring-boot-starter-test")
Expand Down
49 changes: 0 additions & 49 deletions backend/docs/event.md

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ class NovaIntegrationService(
@Retryable(value = [ SQLException::class ], maxRetries = 5, delay = 500L, multiplier = 1.5)
@Transactional(readOnly = false, isolation = Isolation.SERIALIZABLE)
fun setAvatarStatus(email: String, status: Boolean, rejectionMessage: String?) {
val user = userRepository.findByEmail(email).orElse(null) ?: return
val user = userRepository.findByEmailIgnoreCase(email).orElse(null) ?: return

taskRepository.ifPresent { tasks ->
tasks.findAllByTag(AVATAR_TAG).forEach { task ->
Expand All @@ -215,7 +215,7 @@ class NovaIntegrationService(
@Retryable(value = [ SQLException::class ], maxRetries = 5, delay = 500L, multiplier = 1.5)
@Transactional(readOnly = false, isolation = Isolation.SERIALIZABLE)
fun setCvStatus(email: String, status: Boolean, rejectionMessage: String?) {
val user = userRepository.findByEmail(email).orElse(null) ?: return
val user = userRepository.findByEmailIgnoreCase(email).orElse(null) ?: return

taskRepository.ifPresent { tasks ->
tasks.findAllByTag(CV_TAG).forEach { task ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,19 @@ class AdmissionComponent(
final override val menuDisplayName = null

final override var minRole by MinRoleSettingRef(MinRoleSettingRef.ALL_ROLES, minRoleToEdit = RoleType.NOBODY,
fieldName = "Jogosultságok", description = "Melyik roleokkal nyitható meg az oldal"
fieldName = "Jogosultságok", description = "Mely szerepkörökkel nyitható meg az oldal"
)


/// -------------------------------------------------------------------------------------------------------------------

val controlGroup by SettingGroup(fieldName = "Beléptetés működése")

var onlyAcceptApprovedForms by BooleanSettingRef(fieldName = "Csak az elfogadott formok számítanak",
description = "Ha be van kapcsolva, akkor csak az elfogadott és nem elutasított formok számítanak. Csak akkor működik, ha a forms komponens be van kapcsolva.")
var onlyAcceptApprovedForms by BooleanSettingRef(fieldName = "Csak az elfogadott űrlapok számítanak",
description = "Bekapcsolt állapotban csak az elfogadott és nem elutasított űrlapok (formok) számítanak. Csak akkor működik, ha az űrlapok (forms) komponens aktív.")

var saveEntryLog by BooleanSettingRef(defaultValue = true, fieldName = "Beléptetések mentése",
description = "Ha be van kapcsolva, akkor minden beengedés logolva van")
description = "Bekapcsolt állapotban a rendszer minden beléptetést naplóz")

/// -------------------------------------------------------------------------------------------------------------------

Expand All @@ -65,16 +65,16 @@ class AdmissionComponent(
val userAccessGroup by SettingGroup(fieldName = "Felhasználók hozzáférése",
description = "Ha nincs tiltólistán, akkor a legmagasabb beállított hozzáférést fogja megkapni")

var vipUsers by StringSettingRef(fieldName = "USER hozzáférésű felhasználók",
var vipUsers by StringSettingRef(fieldName = "VIP hozzáférésű felhasználók",
description = "A felhasználók CMSCH-ID-jei felsorolva és vesszővel (,) elválasztva")

var performerUsers by StringSettingRef(fieldName = "USER hozzáférésű felhasználók",
var performerUsers by StringSettingRef(fieldName = "PERFORMER hozzáférésű felhasználók",
description = "A felhasználók CMSCH-ID-jei felsorolva és vesszővel (,) elválasztva")

var organizerUsers by StringSettingRef(fieldName = "USER hozzáférésű felhasználók",
var organizerUsers by StringSettingRef(fieldName = "ORGANIZER hozzáférésű felhasználók",
description = "A felhasználók CMSCH-ID-jei felsorolva és vesszővel (,) elválasztva")

var leadOrganizerUsers by StringSettingRef(fieldName = "USER hozzáférésű felhasználók",
var leadOrganizerUsers by StringSettingRef(fieldName = "LEAD_ORGANIZER hozzáférésű felhasználók",
description = "A felhasználók CMSCH-ID-jei felsorolva és vesszővel (,) elválasztva")

var userUsers by StringSettingRef(fieldName = "USER hozzáférésű felhasználók",
Expand All @@ -86,10 +86,10 @@ class AdmissionComponent(
description = "Ha nincs tiltólistán, akkor a legmagasabb beállított hozzáférést fogja megkapni")

var grantUserTo by EnumSettingRef(RoleType.SUPERUSER, fieldName = "USER hozzáférés",
description = "A kiválasztott rangtól és felette mindenki USER hozzáférést kap")
description = "A kiválasztott szerepkörtől és felette mindenki USER hozzáférést kap")

var grantOrganizerTo by EnumSettingRef(RoleType.SUPERUSER, fieldName = "ORGANIZER hozzáférés",
description = "A kiválasztott rangtól és felette mindenki ORGANIZER hozzáférést kap")
description = "A kiválasztott szerepkörtől és felette mindenki ORGANIZER hozzáférést kap")

/// -------------------------------------------------------------------------------------------------------------------

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,33 @@ class AdmissionComponentController(
adminMenuService,
AdmissionComponent::class.java,
component,
ControlPermissions.PERMISSION_CONTROL_ADMISSION,
componentCategoryName = "Beléptetés",
componentMenuName = "Jogosultságok",
menuService = menuService,
auditLogService = auditLogService,
storageService = storageService
) {
ControlPermissions.PERMISSION_CONTROL_ADMISSION,
componentCategoryName = "Beléptetés",
componentMenuName = "Jogosultságok",
menuService = menuService,
auditLogService = auditLogService,
storageService = storageService,
documentationMarkdown = """
A **Beléptetés** (Admission) komponens a rendezvényre való bejutást és a helyszíni jegyellenőrzést kezeli. Lehetővé teszi a hozzáférési szintek finomhangolását csoportok, felhasználók és szerepkörök alapján.

## Beállítások

A **Komponens beállításai** menüpontban konfigurálhatod a beléptetési szabályokat:

- **Beléptetés működése** – szabályozható a belépési naplózás és az űrlapalapú beléptetés (csak elfogadott jelentkezéssel engedjen be).
- **Csoportok hozzáférése** – csoportonként (pl. VIP, Szervezők, Fellépők) definiálható a hozzáférési szint.
- **Felhasználók hozzáférése** – egyedi CMSCH ID alapján adható kiemelt hozzáférés.
- **Szerepkörök hozzáférése** – globális szabályok a felhasználói szerepkörök (pl. STAFF, ADMIN) szerinti beléptetéshez.
- **Tiltólista** – csoportok vagy egyének kizárása a beléptetésből.
- **Jegyek** – BME Jegy integráció és a korábbi belépések számának megjelenítése a beolvasónál.

## Funkciók

- **Hozzáférési szintek** – támogatott szintek: USER, VIP, PERFORMER, ORGANIZER, LEAD_ORGANIZER. A rendszer mindig a felhasználó számára elérhető legmagasabb szintet veszi alapul.
- **Naplózás** – minden sikeres és sikertelen belépési kísérlet rögzíthető az utólagos ellenőrzéshez.
"""
)
{
init {
adminMenuService.registerEntry(AdmissionComponent::class.java.simpleName, AdminMenuEntry(
"Beléptetés",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class ApplicationComponent(

final override var minRole by MinRoleSettingRef(defaultValue = MinRoleSettingRef.ALL_ROLES,
fieldName = "Jogosultságok", minRoleToEdit = RoleType.NOBODY,
description = "Melyik roleokkal nyitható meg az oldal")
description = "Mely szerepkörökkel nyitható meg az oldal")

/// -------------------------------------------------------------------------------------------------------------------

Expand All @@ -43,51 +43,51 @@ class ApplicationComponent(
var warningMessage by StringSettingRef(fieldName = "Megjelenő üzenet")

var warningLevel by StringSettingRef(fieldName = "Üzenet fontossági szintje",
description = "lehet: success, info, warning, error")
description = "Lehetséges értékek: success, info, warning, error")

/// -------------------------------------------------------------------------------------------------------------------

val siteGroup by SettingGroup(fieldName = "Oldal beállítások")

var siteName by StringSettingRef(defaultValue = "Király Esemény", fieldName = "Oldal neve",
description = "Oldal vagy esemény neve")
description = "Az oldal vagy esemény neve")

var defaultComponent by StringSettingRef(defaultValue = "/home", fieldName = "Kezdő komponens",
description = "Az a komponens ami kezdőlapként töltődik be")
description = "A kezdőlapként betöltődő komponens útvonala")

/// -------------------------------------------------------------------------------------------------------------------

val adminGroup by SettingGroup(fieldName = "Admin oldal beállításai")

var adminPanelName by StringSettingRef(defaultValue = "ADMIN", fieldName = "Admin panel neve",
description = "Az admin panel neve", serverSideOnly = true)
description = "Az admin panelen megjelenő név", serverSideOnly = true)

var isLive by BooleanSettingRef(fieldName = "Production oldal",
description = "Ha be van kapcsolva akkor az oldal productionben van", serverSideOnly = true)
description = "Bekapcsolt állapotban az oldal éles (production) módban fut", serverSideOnly = true)

var siteUrl by StringSettingRef(defaultValue = "http://localhost:3000/",
fieldName = "Oldal URL-je",
description = "Az elején van protokoll megnevezés és / jellel végződik", serverSideOnly = true)
description = "A protokollal kezdődő és / jellel végződő URL", serverSideOnly = true)

var adminSiteUrl by StringSettingRef(defaultValue = "http://localhost:8080/",
fieldName = "Admin Oldal URL-je",
description = "Az elején van protokoll megnevezés és / jellel végződik", serverSideOnly = true)
description = "A protokollal kezdődő és / jellel végződő URL", serverSideOnly = true)

var adminBrandColor by StringSettingRef(
defaultValue = "#00F460", type = SettingType.COLOR,
fieldName = "Admin menü színe", description = "Ez lesz az admin oldal színe", serverSideOnly = true,
fieldName = "Admin menü színe", description = "Az admin felület alapszíne", serverSideOnly = true,
)

var motd by StringSettingRef(defaultValue = "Message of the day", fieldName = "MOTD",
description = "Ez jelenik meg belépés után", serverSideOnly = true)
description = "Bejelentkezés után megjelenő üzenet", serverSideOnly = true)

var staffMessage by StringSettingRef(defaultValue = "...", type = SettingType.LONG_TEXT_MARKDOWN,
fieldName = "Szolgálati közlemény",
description = "Ez fog megjelenni az admin oldal kezdőlapján", serverSideOnly = true)
description = "Az admin oldal kezdőlapján megjelenő szöveg", serverSideOnly = true)

var documentsForOrganizers by StringSettingRef(defaultValue = "[]", type = SettingType.LONG_TEXT,
fieldName = "Linkelt doksik", serverSideOnly = true,
description = "Linkelt doksik az admin oldal kezdőlapján. Ikonok: sheets, docs, drive, calendar, forms, youtube, slides. Formátum: [{\"type\":\"sheets\",\"url\":\"https://xy\",\"title\":\"Title\",\"visible\":true}]")
fieldName = "Linkelt dokumentumok", serverSideOnly = true,
description = "Az admin oldal kezdőlapján linkelt dokumentumok. Ikonok: sheets, docs, drive, calendar, forms, youtube, slides. Formátum: [{\"type\":\"sheets\",\"url\":\"https://xy\",\"title\":\"Title\",\"visible\":true}]")

override fun onPersist() {
super.onPersist()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,17 @@ class ApplicationComponentController(
adminMenuService,
ApplicationComponent::class.java,
component,
PERMISSION_CONTROL_APP,
"Admin",
"Oldal beállítások",
componentMenuIcon = "functions",
menuService = menuService,
insertComponentCategory = false,
componentCategory = ApplicationComponent.FUNCTIONALITIES_CATEGORY,
auditLogService = auditLogService,
storageService = storageService
) {
PERMISSION_CONTROL_APP,
"Admin",
"Oldal beállítások",
componentMenuIcon = "functions",
menuService = menuService,
insertComponentCategory = false,
componentCategory = ApplicationComponent.FUNCTIONALITIES_CATEGORY,
auditLogService = auditLogService,
storageService = storageService,
)
{

override fun onUpdate() {
adminMenuService.invalidateSiteContext()
Expand Down
Loading
Loading