From f357615bfb608456887b1863aa34a39ebd1d73ef Mon Sep 17 00:00:00 2001 From: Kevin Morris Date: Tue, 14 Dec 2021 14:31:46 -0800 Subject: [PATCH] change(users.validate): users can't edit their own account types This commit also decouples testing regarding this feature into several test functions. Signed-off-by: Kevin Morris bump Signed-off-by: Kevin Morris --- aurweb/users/validate.py | 18 ++- templates/partials/account_form.html | 35 ++--- test/test_accounts_routes.py | 221 ++++++++++++++------------- 3 files changed, 146 insertions(+), 128 deletions(-) diff --git a/aurweb/users/validate.py b/aurweb/users/validate.py index 4959e316..5b2f8819 100644 --- a/aurweb/users/validate.py +++ b/aurweb/users/validate.py @@ -11,13 +11,16 @@ from typing import List, Optional, Tuple from fastapi import Request from sqlalchemy import and_ -from aurweb import config, db, l10n, models, time, util +from aurweb import config, db, l10n, logging, models, time, util +from aurweb.auth import creds from aurweb.captcha import get_captcha_answer, get_captcha_salts, get_captcha_token from aurweb.exceptions import ValidationError from aurweb.models import account_type as at from aurweb.models.account_type import ACCOUNT_TYPE_NAME from aurweb.models.ssh_pub_key import get_fingerprint +logger = logging.get_logger(__name__) + def invalid_fields(E: str = str(), U: str = str(), **kwargs) \ -> Optional[Tuple[bool, List[str]]]: @@ -171,26 +174,31 @@ def invalid_account_type(T: int = None, request: Request = None, _: l10n.Translator = None, **kwargs) -> None: if T is not None and (T := int(T)) != user.AccountTypeID: + has_cred = request.user.has_credential(creds.ACCOUNT_CHANGE_TYPE) if T not in ACCOUNT_TYPE_NAME: raise ValidationError(["Invalid account type provided."]) - elif not request.user.is_elevated(): + elif not has_cred: raise ValidationError([ "You do not have permission to change account types."]) credential_checks = { at.USER_ID: request.user.is_trusted_user, at.TRUSTED_USER_ID: request.user.is_trusted_user, - at.DEVELOPER_ID: lambda: request.user.is_developer(), + at.DEVELOPER_ID: request.user.is_developer, at.TRUSTED_USER_AND_DEV_ID: (lambda: request.user.is_trusted_user() and request.user.is_developer()) } credential_check = credential_checks.get(T) - if not credential_check(): - name = ACCOUNT_TYPE_NAME.get(T) + name = ACCOUNT_TYPE_NAME.get(T) + if not credential_check() or request.user == user: error = _("You do not have permission to change " "this user's account type to %s.") % name raise ValidationError([error]) + else: + logger.debug(f"Trusted User '{request.user.Username}' has " + f"modified '{user.Username}' account's type to" + f" {name}.") def invalid_captcha(captcha_salt: str = None, captcha: str = None, **kwargs) \ diff --git a/templates/partials/account_form.html b/templates/partials/account_form.html index 37bb85c4..fc46f8c4 100644 --- a/templates/partials/account_form.html +++ b/templates/partials/account_form.html @@ -43,24 +43,25 @@

{% if request.user.has_credential(creds.ACCOUNT_CHANGE_TYPE) %} -

- - -

+ {% if request.user != user %} +

+ + +

+ {% endif %}