17 changed files with 151 additions and 38 deletions
@ -1 +1,5 @@ |
|||||||
<h1>Welcome</h1> |
<script> |
||||||
|
import { t } from '../translations.svelte.js'; |
||||||
|
import { user } from '../user.svelte.js'; |
||||||
|
</script> |
||||||
|
<h1>{t('home.Welcome')}, {user.username}</h1> |
||||||
@ -1,3 +1,13 @@ |
|||||||
|
<script> |
||||||
|
import { t } from '../translations.svelte.js'; |
||||||
|
import { user } from '../user.svelte.js'; |
||||||
|
|
||||||
|
function logout(){ |
||||||
|
user.username = null; |
||||||
|
} |
||||||
|
</script> |
||||||
<nav> |
<nav> |
||||||
<a href="/">Home</a> |
<a href="/">{t('nav.Home')}</a> |
||||||
|
<a href="https://svelte.dev/tutorial/svelte/state" target="_blank">{t('nav.Tutorial')}</a> |
||||||
|
<a href="#" on:click={logout}>Logout</a> |
||||||
</nav> |
</nav> |
||||||
@ -0,0 +1,20 @@ |
|||||||
|
export const user = $state({ |
||||||
|
name : null |
||||||
|
}) |
||||||
|
|
||||||
|
export async function tryLogin(credentials){ |
||||||
|
var url = `${location.protocol}//${location.host.replace('5173','8080')}/api/user/login`; |
||||||
|
let response = await fetch(url,{ |
||||||
|
headers: { |
||||||
|
'Content-Type':'application/json' |
||||||
|
}, |
||||||
|
method: 'POST', |
||||||
|
body: JSON.stringify(credentials) |
||||||
|
}); |
||||||
|
if (response.ok){ |
||||||
|
const json = await response.json(); |
||||||
|
for (var key of Object.keys(json)) user[key] = json[key]; |
||||||
|
} else { |
||||||
|
alert("Login failed!"); |
||||||
|
} |
||||||
|
} |
||||||
@ -1,5 +1,6 @@ |
|||||||
rootProject.name = "Umbrella25" |
rootProject.name = "Umbrella25" |
||||||
|
|
||||||
include("backend") |
include("backend") |
||||||
include("web") |
|
||||||
include("translations") |
include("translations") |
||||||
|
include("user") |
||||||
|
include("web") |
||||||
|
|||||||
@ -1,6 +1,5 @@ |
|||||||
description = "Umbrella : Translations" |
description = "Umbrella : Translations" |
||||||
|
|
||||||
dependencies{ |
dependencies{ |
||||||
implementation("de.srsoftware:tools.http:6.0.0") |
|
||||||
implementation("org.json:json:20240303") |
implementation("org.json:json:20240303") |
||||||
} |
} |
||||||
@ -1,5 +1,12 @@ |
|||||||
{ |
{ |
||||||
'login' : { |
"home" : { |
||||||
'Login' : "Mist!" |
"Welcome" : "Willkommen" |
||||||
|
}, |
||||||
|
"login" : { |
||||||
|
"do_login" : "anmelden", |
||||||
|
"Email_or_Username": "Email oder Nutzername", |
||||||
|
"Login" : "Anmeldung", |
||||||
|
"OIDC_Login" : "Anmeldung mit OIDC", |
||||||
|
"Password" : "Passwort" |
||||||
} |
} |
||||||
} |
} |
||||||
@ -0,0 +1,6 @@ |
|||||||
|
description = "Umbrella : User" |
||||||
|
|
||||||
|
dependencies{ |
||||||
|
implementation("de.srsoftware:tools.mime:1.1.2") |
||||||
|
implementation("org.json:json:20240303") |
||||||
|
} |
||||||
@ -0,0 +1,54 @@ |
|||||||
|
/* © SRSoftware 2025 */ |
||||||
|
package de.srsoftware.umbrella.user; |
||||||
|
|
||||||
|
import com.sun.net.httpserver.HttpExchange; |
||||||
|
import de.srsoftware.tools.MimeType; |
||||||
|
import de.srsoftware.tools.Path; |
||||||
|
import de.srsoftware.tools.PathHandler; |
||||||
|
import de.srsoftware.tools.SessionToken; |
||||||
|
import org.json.JSONObject; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.UUID; |
||||||
|
|
||||||
|
import static de.srsoftware.tools.MimeType.MIME_JSON; |
||||||
|
|
||||||
|
|
||||||
|
public class UserModule extends PathHandler { |
||||||
|
|
||||||
|
private HttpExchange addCors(HttpExchange ex){ |
||||||
|
var headers = ex.getResponseHeaders(); |
||||||
|
headers.add("Allow-Origin","*"); |
||||||
|
headers.add("Access-Control-Allow-Origin","*"); |
||||||
|
headers.add("Access-Control-Allow-Headers","Content-Type"); |
||||||
|
return ex; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean doOptions(Path path, HttpExchange ex) throws IOException { |
||||||
|
return sendEmptyResponse(200,addCors(ex)); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean doPost(Path path, HttpExchange ex) throws IOException { |
||||||
|
addCors(ex); |
||||||
|
var p = path.toString(); |
||||||
|
switch (p){ |
||||||
|
case "login": return postLogin(ex); |
||||||
|
} |
||||||
|
return super.doPost(path, ex); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean postLogin(HttpExchange ex) throws IOException { |
||||||
|
var json = json(ex); |
||||||
|
if (!(json.has("username") && json.get("username") instanceof String username)) return sendContent(ex,402,"Username missing"); |
||||||
|
if (!(json.has("password") && json.get("password") instanceof String password)) return sendContent(ex,402,"Password missing"); |
||||||
|
|
||||||
|
if (!username.equals(password)) return sendContent(ex,401,"Login failed"); |
||||||
|
var sessionId = UUID.randomUUID().toString(); |
||||||
|
new SessionToken(sessionId).addTo(ex); |
||||||
|
ex.getResponseHeaders().add("Content-Type", MIME_JSON); |
||||||
|
return sendContent(ex,200,new JSONObject(Map.of("username",username)).toString()); |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue