187 lines
6.9 KiB
Python
187 lines
6.9 KiB
Python
#!/usr/bin/env python3
|
|
"""Users management module"""
|
|
# pylint: disable=too-few-public-methods
|
|
|
|
import typing
|
|
import strawberry
|
|
from selfprivacy_api.graphql import IsAuthenticated
|
|
from selfprivacy_api.graphql.common_types.user import User, UserMutationReturn
|
|
from selfprivacy_api.graphql.mutations.mutation_interface import (
|
|
MutationReturnInterface,
|
|
)
|
|
from selfprivacy_api.utils import (
|
|
WriteUserData,
|
|
ReadUserData,
|
|
is_username_forbidden,
|
|
validate_ssh_public_key,
|
|
)
|
|
|
|
|
|
@strawberry.input
|
|
class SshMutationsInput:
|
|
"""Input type for ssh mutation"""
|
|
|
|
username: str
|
|
sshKey: str
|
|
|
|
|
|
@strawberry.type
|
|
class UserMutations:
|
|
"""Mutations ssh"""
|
|
|
|
@strawberry.mutation(permission_classes=[IsAuthenticated])
|
|
def create_ssh(self, settings: SshMutationsInput) -> UserMutationReturn:
|
|
"""Create a new ssh"""
|
|
with ReadUserData() as data:
|
|
if settings.username == "root":
|
|
return UserMutationReturn(
|
|
success=False,
|
|
message="Error: Use /ssh/key/send to add root keys",
|
|
code=400,
|
|
user=User("root", data["ssh"]["rootKeys"]),
|
|
)
|
|
|
|
if not validate_ssh_public_key(settings.sshKey):
|
|
return UserMutationReturn(
|
|
success=False,
|
|
message="Error: Invalid key type. Only ssh-ed25519 and ssh-rsa are supported",
|
|
code=400,
|
|
user=User("root", data["ssh"]["rootKeys"]),
|
|
)
|
|
|
|
with WriteUserData() as data:
|
|
if settings.username == data["username"]:
|
|
if "sshKeys" not in data:
|
|
data["sshKeys"] = []
|
|
# Return 409 if key already in array
|
|
for key in data["sshKeys"]:
|
|
if key == settings.sshKey:
|
|
|
|
return UserMutationReturn(
|
|
success=False,
|
|
message="Error: Key already exists",
|
|
code=409,
|
|
user=User(data["username"], data["sshKeys"]),
|
|
)
|
|
data["sshKeys"].append(settings.sshKey)
|
|
|
|
return UserMutationReturn(
|
|
success=True,
|
|
message="New SSH key successfully written",
|
|
code=201,
|
|
user=User(data["username"], data["sshKeys"]),
|
|
)
|
|
|
|
if "users" not in data:
|
|
data["users"] = []
|
|
for user in data["users"]:
|
|
if user["username"] == settings.username:
|
|
if "sshKeys" not in user:
|
|
user["sshKeys"] = []
|
|
# Return 409 if key already in array
|
|
for key in user["sshKeys"]:
|
|
if key == settings.sshKey:
|
|
|
|
return UserMutationReturn(
|
|
success=False,
|
|
message="Error: Key already exists",
|
|
code=409,
|
|
user=User(user["username"], user["sshKeys"]),
|
|
)
|
|
|
|
user["sshKeys"].append(settings.sshKey)
|
|
|
|
return UserMutationReturn(
|
|
success=True,
|
|
message="New SSH key successfully written",
|
|
code=201,
|
|
user=User(user["username"], user["sshKeys"]),
|
|
)
|
|
|
|
return UserMutationReturn(
|
|
success=False,
|
|
message="Error: User not found",
|
|
code=404,
|
|
user=None,
|
|
)
|
|
|
|
@strawberry.mutation(permission_classes=[IsAuthenticated])
|
|
def delete_ssh(self, settings: SshMutationsInput) -> UserMutationReturn:
|
|
"""Delete ssh"""
|
|
|
|
with WriteUserData() as data:
|
|
if settings.username == "root":
|
|
if "ssh" not in data:
|
|
data["ssh"] = {}
|
|
if "rootKeys" not in data["ssh"]:
|
|
data["ssh"]["rootKeys"] = []
|
|
# Return 404 if key not in array
|
|
for key in data["ssh"]["rootKeys"]:
|
|
if key == settings.sshKey:
|
|
data["ssh"]["rootKeys"].remove(key)
|
|
# If rootKeys became zero length, delete it
|
|
if len(data["ssh"]["rootKeys"]) == 0:
|
|
del data["ssh"]["rootKeys"]
|
|
return UserMutationReturn(
|
|
success=True,
|
|
message="SSH key deleted",
|
|
code=200,
|
|
user=User("root", data["ssh"]["rootKeys"]),
|
|
)
|
|
return UserMutationReturn(
|
|
success=False,
|
|
message="Error: Key not found",
|
|
code=404,
|
|
user=User("root", data["ssh"]["rootKeys"]),
|
|
)
|
|
if settings.username == data["username"]:
|
|
if "sshKeys" not in data:
|
|
data["sshKeys"] = []
|
|
# Return 404 if key not in array
|
|
for key in data["sshKeys"]:
|
|
if key == settings.sshKey:
|
|
data["sshKeys"].remove(key)
|
|
return UserMutationReturn(
|
|
success=True,
|
|
message="SSH key deleted",
|
|
code=200,
|
|
user=User("root", data["ssh"]["rootKeys"]),
|
|
)
|
|
|
|
return UserMutationReturn(
|
|
success=False,
|
|
message="Error: Key not found",
|
|
code=404,
|
|
user=User(data["username"], data["sshKeys"]),
|
|
)
|
|
if "users" not in data:
|
|
data["users"] = []
|
|
for user in data["users"]:
|
|
if user["username"] == settings.username:
|
|
if "sshKeys" not in user:
|
|
user["sshKeys"] = []
|
|
# Return 404 if key not in array
|
|
for key in user["sshKeys"]:
|
|
if key == settings.sshKey:
|
|
user["sshKeys"].remove(key)
|
|
return UserMutationReturn(
|
|
success=True,
|
|
message="SSH key deleted",
|
|
code=200,
|
|
user=User(settings.username, user["sshKeys"]),
|
|
)
|
|
|
|
return UserMutationReturn(
|
|
success=False,
|
|
message="Error: Key not found",
|
|
code=404,
|
|
user=User(settings.username, user["sshKeys"]),
|
|
)
|
|
|
|
return UserMutationReturn(
|
|
success=False,
|
|
message="Error: User not found",
|
|
code=404,
|
|
user=None,
|
|
)
|