### fix: v28 verbessere Same-Origin-Strategie und Fehlerbehandlung
All checks were successful
All checks were successful
- **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:
parent
251647a6ab
commit
3f291c907c
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user