### fix: v28 verbessere Same-Origin-Strategie und Fehlerbehandlung
All checks were successful
Build and Publish Docker Images / build-and-push (., backend/services/mail/Dockerfile, mail-service, mail-service) (push) Successful in 5m46s
Build and Publish Docker Images / build-and-push (., config/docker/caddy/web-app/Dockerfile, web-app, web-app) (push) Successful in 4m40s

- **PlatformConfig.wasmJs.kt:** API-URLs auf leere Strings geändert (Root-Proxy).
- **OnlineNennungFormular:** Fehlermeldungen bei Versandfehlern präzisiert.
- **NennungRemoteRepository:** Detaillierte Fehlerrückmeldungen hinzugefügt.
- **Caddyfile:** Reverse Proxy angepasst, Header und Strategie-Version aktualisiert.
- **WebMainScreen:** Versionsmarker auf `v2026-04-23.28 - SAME-ORIGIN v2` aktualisiert.
This commit is contained in:
Stefan Mogeritsch 2026-04-23 15:40:11 +02:00
parent 251647a6ab
commit 3f291c907c
5 changed files with 26 additions and 15 deletions

View File

@ -20,18 +20,19 @@
# Same-Origin Strategy: Alle /api/* Anfragen werden intern an den Mail-Service weitergeleitet # Same-Origin Strategy: Alle /api/* Anfragen werden intern an den Mail-Service weitergeleitet
# Dadurch sieht der Browser nur noch app.mo-code.at und CORS wird hinfällig. # Dadurch sieht der Browser nur noch app.mo-code.at und CORS wird hinfällig.
handle /api/* { handle /api/* {
# Wir entfernen das /api Präfix bevor wir es an den Service weitergeben # Wir leiten direkt weiter, der mail-service erwartet /api/mail/...
uri strip_prefix /api reverse_proxy mail-service:8085 {
header_up Host {upstream_hostport}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
}
# CORS Header zur Sicherheit trotzdem mitsenden (Nuclear Option v3)
header { header {
Access-Control-Allow-Origin "*" Access-Control-Allow-Origin "*"
Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
Access-Control-Allow-Headers "*" Access-Control-Allow-Headers "*"
X-Caddy-Strategy "same-origin-v27" X-Caddy-Strategy "same-origin-v28"
} }
reverse_proxy mail-service:8085
} }
handle /health { handle /health {

View File

@ -7,8 +7,8 @@ package at.mocode.frontend.core.network
@Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") @Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
actual object PlatformConfig { actual object PlatformConfig {
actual fun resolveMailServiceUrl(): String { actual fun resolveMailServiceUrl(): String {
// SAME-ORIGIN Strategy: Use relative path to bypass CORS // SAME-ORIGIN Strategy: Use root for proxying
return "/api" return ""
} }
actual fun resolveKeycloakUrl(): String { actual fun resolveKeycloakUrl(): String {
@ -20,8 +20,8 @@ actual object PlatformConfig {
} }
actual fun resolveApiBaseUrl(): String { actual fun resolveApiBaseUrl(): String {
// SAME-ORIGIN Strategy: Use relative path to bypass CORS // SAME-ORIGIN Strategy: Use root for proxying
return "/api" return ""
} }
} }

View File

@ -92,11 +92,21 @@ class NennungRemoteRepository(private val client: HttpClient) {
) )
// Wir senden an den mail-service (URL dynamisch aufgelöst) // Wir senden an den mail-service (URL dynamisch aufgelöst)
client.post("$mailServiceUrl/api/mail/nennung") { val fullUrl = "$mailServiceUrl/api/mail/nennung"
println("Sende Nennung an URL: $fullUrl")
val response = client.post(fullUrl) {
contentType(ContentType.Application.Json) contentType(ContentType.Application.Json)
setBody(request) setBody(request)
} }
Result.success(Unit)
if (response.status.isSuccess()) {
Result.success(Unit)
} else {
val errorText = "Server meldet Fehler: ${response.status.value} ${response.status.description}"
println(errorText)
Result.failure(Exception(errorText))
}
} catch (e: Exception) { } catch (e: Exception) {
Result.failure(e) Result.failure(e)
} }

View File

@ -401,7 +401,7 @@ fun OnlineNennungFormular(
onNennenAbgeschickt(payload) { success, error -> onNennenAbgeschickt(payload) { success, error ->
isLoading = false isLoading = false
if (!success) { if (!success) {
errorMessage = error ?: "Ein unbekannter Fehler ist aufgetreten." errorMessage = "Senden fehlgeschlagen: " + (error ?: "Netzwerkfehler oder Server nicht erreichbar.")
} }
} }
} }
@ -443,7 +443,7 @@ fun OnlineNennungFormular(
onNennenAbgeschickt(payload) { success, error -> onNennenAbgeschickt(payload) { success, error ->
isLoading = false isLoading = false
if (!success) { if (!success) {
errorMessage = error ?: "Ein unbekannter Fehler ist aufgetreten." errorMessage = "Senden fehlgeschlagen: " + (error ?: "Netzwerkfehler oder Server nicht erreichbar.")
} }
} }
}, },

View File

@ -126,7 +126,7 @@ fun MainAppContent() {
// Dezentraler Versions-Marker in der unteren rechten Ecke // Dezentraler Versions-Marker in der unteren rechten Ecke
Box(modifier = Modifier.fillMaxSize().padding(8.dp), contentAlignment = Alignment.BottomEnd) { Box(modifier = Modifier.fillMaxSize().padding(8.dp), contentAlignment = Alignment.BottomEnd) {
Text( Text(
text = "v2026-04-23.27 - SAME-ORIGIN PROXY", text = "v2026-04-23.28 - SAME-ORIGIN v2",
style = MaterialTheme.typography.labelSmall, style = MaterialTheme.typography.labelSmall,
color = Color.LightGray.copy(alpha = 0.5f) color = Color.LightGray.copy(alpha = 0.5f)
) )