mirror of
https://git.srhtnin.garden/sarah/SaraView.git
synced 2026-10-15 02:43:17 +02:00
Added groups and restricted access.
This commit is contained in:
1 parent
8aa223bc7b
commit
9a5b9530a3
17 files changed
+1406
-66
No files matched your search
+54
-3
@@ -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}")
|
||||
Reference in new issue
Block a user