Added groups and restricted access.

This commit is contained in:
sarah committed 2026-09-21 06:52:31 +02:00
1 parent 8aa223bc7b
commit 9a5b9530a3
17 files changed
+1406 -66

No files matched your search

+54 -3
View File
@@ -12,6 +12,7 @@ import tomli_w
from Settings import GetDataDirectory
from Groups import AddMember, AdminGroupName, GetGroupsForUser
Pbkdf2Iterations = 260_000
@@ -96,11 +97,13 @@ def CreateUser(Username: str, Password: str, IsAdmin: bool, Colour: str = Defaul
Users[Username] = {
"PasswordHash": HashPassword(Password),
"IsAdmin": IsAdmin,
"Colour": Colour,
}
SaveUsers(Users)
if IsAdmin:
AddMember(AdminGroupName, Username)
def UpdateUserColour(Username: str, Colour: str) -> None:
if Colour not in UserColourOptions:
@@ -115,6 +118,44 @@ def UpdateUserColour(Username: str, Colour: str) -> None:
SaveUsers(Users)
def RenameUser(OldUsername: str, NewUsername: str) -> None:
NewUsername = NewUsername.strip()
if not NewUsername:
raise ValueError("Username cannot be empty.")
if NewUsername == OldUsername:
return
Users = LoadUsers()
if OldUsername not in Users:
raise ValueError("User not found.")
if NewUsername in Users:
raise ValueError(f"User '{NewUsername}' already exists.")
Users[NewUsername] = Users.pop(OldUsername)
SaveUsers(Users)
def ChangePassword(Username: str, CurrentPassword: str, NewPassword: str) -> None:
User = GetUser(Username)
if User is None:
raise ValueError("User not found.")
if not VerifyPassword(CurrentPassword, User["PasswordHash"]):
raise ValueError("Current password is incorrect.")
if not NewPassword:
raise ValueError("New password cannot be empty.")
Users = LoadUsers()
Users[Username]["PasswordHash"] = HashPassword(NewPassword)
SaveUsers(Users)
def VerifyLogin(Username: str, Password: str) -> dict[str, Any] | None:
User = GetUser(Username)
@@ -126,7 +167,7 @@ def VerifyLogin(Username: str, Password: str) -> dict[str, Any] | None:
return {
"Username": Username,
"IsAdmin": User.get("IsAdmin", False),
"IsAdmin": AdminGroupName in GetGroupsForUser(Username),
"Colour": User.get("Colour", DefaultUserColour),
}
@@ -136,7 +177,7 @@ def ListUsers() -> list[dict[str, Any]]:
return [
{
"Username": Name,
"IsAdmin": Data.get("IsAdmin", False),
"IsAdmin": AdminGroupName in GetGroupsForUser(Name),
"Colour": Data.get("Colour", DefaultUserColour),
}
for Name, Data in Users.items()
@@ -168,3 +209,13 @@ def GetAvatarPath(Username: str) -> Path | None:
Matches = sorted(Directory.glob(f"{Username}.*"))
return Matches[0] if Matches else None
def RenameUserAvatar(OldUsername: str, NewUsername: str) -> None:
Directory = GetAvatarDirectory()
if not Directory.is_dir():
return
for ExistingPath in Directory.glob(f"{OldUsername}.*"):
ExistingPath.rename(Directory / f"{NewUsername}{ExistingPath.suffix}")