Upravil jsem Google OAuth tak, že Google uživatel se hledá/vytváří přes email, ukládá auth_provider='google', provider_subject, display_name, avatar_url a po úspěšném loginu last_login_at. První Google uživatel v prázdné users tabulce dostane admin, další noví Google uživatelé viewer.
Přidal jsem AUTH_MODE=google|mixed|local: google: jen Google login, lokální/Gitea nejdou ani přes přímý endpoint mixed: Google + lokální/Gitea fallback local: jen lokální login Správa uživatelů zůstává admin-only, guard posledního admina platí pro odebrání role i deaktivaci. Přidal jsem do ní i přehled oprávnění rolí a zobrazení provider/avatar metadat. DB migrace teď přes PRAGMA table_info(users) doplňuje chybějící sloupce bez mazání/recreate existující tabulky; pokud users vůbec neexistuje, bezpečně ji vytvoří. Podporované sloupce zahrnují email, display_name, role, is_enabled, created_at, updated_at, last_login_at, auth_provider, provider_subject, plus kompatibilní sloupce pro lokální login.
This commit is contained in:
+15
-2
@@ -16,6 +16,9 @@ def list_users() -> list[dict[str, Any]]:
|
||||
con = get_connection()
|
||||
columns = _table_columns(con, "users")
|
||||
last_login_select = "last_login_at" if "last_login_at" in columns else "NULL AS last_login_at"
|
||||
auth_provider_select = "auth_provider" if "auth_provider" in columns else "NULL AS auth_provider"
|
||||
provider_subject_select = "provider_subject" if "provider_subject" in columns else "NULL AS provider_subject"
|
||||
avatar_url_select = "avatar_url" if "avatar_url" in columns else "NULL AS avatar_url"
|
||||
|
||||
rows = con.execute(
|
||||
f"""
|
||||
@@ -28,7 +31,10 @@ def list_users() -> list[dict[str, Any]]:
|
||||
COALESCE(is_enabled, 1) AS is_enabled,
|
||||
created_at,
|
||||
updated_at,
|
||||
{last_login_select}
|
||||
{last_login_select},
|
||||
{auth_provider_select},
|
||||
{provider_subject_select},
|
||||
{avatar_url_select}
|
||||
FROM users
|
||||
ORDER BY id
|
||||
"""
|
||||
@@ -43,6 +49,9 @@ def get_user(user_id: int) -> dict[str, Any] | None:
|
||||
con = get_connection()
|
||||
columns = _table_columns(con, "users")
|
||||
last_login_select = "last_login_at" if "last_login_at" in columns else "NULL AS last_login_at"
|
||||
auth_provider_select = "auth_provider" if "auth_provider" in columns else "NULL AS auth_provider"
|
||||
provider_subject_select = "provider_subject" if "provider_subject" in columns else "NULL AS provider_subject"
|
||||
avatar_url_select = "avatar_url" if "avatar_url" in columns else "NULL AS avatar_url"
|
||||
|
||||
row = con.execute(
|
||||
f"""
|
||||
@@ -55,7 +64,10 @@ def get_user(user_id: int) -> dict[str, Any] | None:
|
||||
COALESCE(is_enabled, 1) AS is_enabled,
|
||||
created_at,
|
||||
updated_at,
|
||||
{last_login_select}
|
||||
{last_login_select},
|
||||
{auth_provider_select},
|
||||
{provider_subject_select},
|
||||
{avatar_url_select}
|
||||
FROM users
|
||||
WHERE id = ?
|
||||
""",
|
||||
@@ -81,6 +93,7 @@ def count_enabled_admins(excluding_user_id: int | None = None) -> int:
|
||||
FROM users
|
||||
WHERE LOWER(COALESCE(role, '')) = 'admin'
|
||||
AND COALESCE(is_enabled, 1) = 1
|
||||
AND COALESCE(is_active, 1) = 1
|
||||
{exclusion}
|
||||
""",
|
||||
params,
|
||||
|
||||
Reference in New Issue
Block a user