1.0.7 типоооо и фиксы
This commit is contained in:
@@ -115,6 +115,8 @@ mvn clean package
|
|||||||
|
|
||||||
### Благодарность
|
### Благодарность
|
||||||
Glitch135 - За бета-тест лаунчера и фидбеки
|
Glitch135 - За бета-тест лаунчера и фидбеки
|
||||||
|
|
||||||
|
### помощь
|
||||||
Я был бы рад если нашлись люди кто мог бы помочь в разработке лаунчера и добавления к нему хотя бы базового UI чтоб было намногл удобнее работать с ним
|
Я был бы рад если нашлись люди кто мог бы помочь в разработке лаунчера и добавления к нему хотя бы базового UI чтоб было намногл удобнее работать с ним
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>me.sashegdev</groupId>
|
<groupId>me.sashegdev</groupId>
|
||||||
<artifactId>ZernMCLauncher</artifactId>
|
<artifactId>ZernMCLauncher</artifactId>
|
||||||
<version>1.0.6</version>
|
<version>1.0.7</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package me.sashegdev.zernmc.launcher.auth;
|
|||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
import com.google.gson.annotations.SerializedName;
|
import com.google.gson.annotations.SerializedName;
|
||||||
import me.sashegdev.zernmc.launcher.utils.Config;
|
import me.sashegdev.zernmc.launcher.utils.Config;
|
||||||
import me.sashegdev.zernmc.launcher.utils.ZAnsi;
|
import me.sashegdev.zernmc.launcher.utils.ZAnsi;
|
||||||
@@ -141,16 +143,18 @@ public class AuthManager {
|
|||||||
|
|
||||||
private static String extractError(String body) {
|
private static String extractError(String body) {
|
||||||
try {
|
try {
|
||||||
int idx = body.indexOf("\"detail\"");
|
JsonObject json = JsonParser.parseString(body).getAsJsonObject();
|
||||||
if (idx != -1) {
|
if (json.has("detail")) {
|
||||||
int s = body.indexOf("\"", idx + 9) + 1;
|
return json.get("detail").getAsString();
|
||||||
int e = body.indexOf("\"", s);
|
}
|
||||||
if (e > s) return body.substring(s, e);
|
if (json.has("error")) {
|
||||||
|
return json.get("error").getAsString();
|
||||||
}
|
}
|
||||||
} catch (Exception ignored) {}
|
} catch (Exception ignored) {}
|
||||||
return "Неизвестная ошибка";
|
return body.length() > 200 ? body.substring(0, 200) + "..." : body;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ====================== ВНУТРЕННИЕ КЛАССЫ ======================
|
// ====================== ВНУТРЕННИЕ КЛАССЫ ======================
|
||||||
|
|
||||||
public static class AuthSession {
|
public static class AuthSession {
|
||||||
|
|||||||
+19
-3
@@ -80,7 +80,7 @@ def init_db():
|
|||||||
last_login REAL
|
last_login REAL
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS passes ( -- НОВАЯ ТАБЛИЦА
|
CREATE TABLE IF NOT EXISTS passes (
|
||||||
code TEXT PRIMARY KEY, -- ZERN-XXXXXX
|
code TEXT PRIMARY KEY, -- ZERN-XXXXXX
|
||||||
is_used BOOLEAN DEFAULT 0,
|
is_used BOOLEAN DEFAULT 0,
|
||||||
activated_by INTEGER REFERENCES users(id),
|
activated_by INTEGER REFERENCES users(id),
|
||||||
@@ -96,6 +96,13 @@ def init_db():
|
|||||||
activated_at REAL NOT NULL,
|
activated_at REAL NOT NULL,
|
||||||
PRIMARY KEY (user_id, pass_code)
|
PRIMARY KEY (user_id, pass_code)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS refresh_tokens (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||||
|
token_hash TEXT NOT NULL,
|
||||||
|
expires_at REAL NOT NULL
|
||||||
|
);
|
||||||
""")
|
""")
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
@@ -143,7 +150,7 @@ async def register(body: RegisterRequest, request: Request):
|
|||||||
conn = get_db()
|
conn = get_db()
|
||||||
try:
|
try:
|
||||||
if conn.execute("SELECT 1 FROM users WHERE username = ? COLLATE NOCASE", (body.username,)).fetchone():
|
if conn.execute("SELECT 1 FROM users WHERE username = ? COLLATE NOCASE", (body.username,)).fetchone():
|
||||||
raise HTTPException(409, "Имя пользователя уже занято")
|
raise HTTPException(status_code=409, detail="Имя пользователя уже занято")
|
||||||
|
|
||||||
uuid = generate_uuid()
|
uuid = generate_uuid()
|
||||||
pw_hash = hash_password(body.password)
|
pw_hash = hash_password(body.password)
|
||||||
@@ -156,11 +163,20 @@ async def register(body: RegisterRequest, request: Request):
|
|||||||
user_id = conn.lastrowid
|
user_id = conn.lastrowid
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
||||||
return _issue_tokens(conn, user_id, body.username, uuid)
|
# Вызываем функцию и явно преобразуем в dict, чтобы избежать проблем сериализации
|
||||||
|
tokens = _issue_tokens(conn, user_id, body.username, uuid)
|
||||||
|
return tokens.model_dump() if hasattr(tokens, "model_dump") else tokens
|
||||||
|
|
||||||
|
except HTTPException:
|
||||||
|
raise
|
||||||
|
except Exception as e:
|
||||||
|
logger.error("Register error", exc_info=True)
|
||||||
|
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|
||||||
finally:
|
finally:
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@router.post("/login", response_model=TokenResponse)
|
@router.post("/login", response_model=TokenResponse)
|
||||||
async def login(body: LoginRequest, request: Request):
|
async def login(body: LoginRequest, request: Request):
|
||||||
conn = get_db()
|
conn = get_db()
|
||||||
|
|||||||
@@ -869,6 +869,15 @@ async def api_my_passes(request: Request):
|
|||||||
return {"passes": passes, "has_active": any(p["is_active"] for p in passes)}
|
return {"passes": passes, "has_active": any(p["is_active"] for p in passes)}
|
||||||
|
|
||||||
|
|
||||||
|
@app.exception_handler(Exception)
|
||||||
|
async def global_exception_handler(request: Request, exc: Exception):
|
||||||
|
logger.error("Unhandled exception", exc_info=True)
|
||||||
|
return JSONResponse(
|
||||||
|
status_code=500,
|
||||||
|
content={"detail": "Internal Server Error", "type": type(exc).__name__}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# Cleanup on shutdown
|
# Cleanup on shutdown
|
||||||
@app.on_event("shutdown")
|
@app.on_event("shutdown")
|
||||||
async def shutdown_proxy():
|
async def shutdown_proxy():
|
||||||
|
|||||||
Reference in New Issue
Block a user