diff options
Diffstat (limited to 'pysite')
| -rw-r--r-- | pysite/constants.py | 1 | ||||
| -rw-r--r-- | pysite/decorators.py | 28 | 
2 files changed, 25 insertions, 4 deletions
diff --git a/pysite/constants.py b/pysite/constants.py index 3ccebf18..6339267d 100644 --- a/pysite/constants.py +++ b/pysite/constants.py @@ -20,6 +20,7 @@ class ValidationTypes(Enum):  OWNER_ROLE = 267627879762755584  ADMIN_ROLE = 267628507062992896  MODERATOR_ROLE = 267629731250176001 +DEVOPS_ROLE = 409416496733880320  HELPER_ROLE = 267630620367257601  SERVER_ID = 267624335836053506 diff --git a/pysite/decorators.py b/pysite/decorators.py index 447c17e4..3e07c6d2 100644 --- a/pysite/decorators.py +++ b/pysite/decorators.py @@ -2,14 +2,34 @@  import os  from functools import wraps  from json import JSONDecodeError -from typing import List -from flask import request +from flask import request, redirect, url_for  from schema import Schema, SchemaError +from werkzeug.exceptions import Forbidden +from pysite.base_route import APIView, BaseView  from pysite.constants import ErrorCodes, ValidationTypes +def require_roles(*roles: int): +    def inner_decorator(f): + +        @wraps(f) +        def inner(self: BaseView, *args, **kwargs): +            data = self.user_data + +            if data: +                for role in roles: +                    if role in data["roles"]: +                        return f(self, *args, **kwargs) + +                raise Forbidden() +            return redirect(url_for("discord.login")) +        return inner + +    return inner_decorator + +  def api_key(f):      """      Decorator to check if X-API-Key is valid. @@ -18,7 +38,7 @@ def api_key(f):      """      @wraps(f) -    def inner(self, *args, **kwargs): +    def inner(self: APIView, *args, **kwargs):          if not request.headers.get("X-API-Key") == os.environ.get("BOT_API_KEY"):              return self.error(ErrorCodes.invalid_api_key)          return f(self, *args, **kwargs) @@ -39,7 +59,7 @@ def api_params(schema: Schema, validation_type: ValidationTypes = ValidationType      def inner_decorator(f):          @wraps(f) -        def inner(self, *args, **kwargs): +        def inner(self: BaseView, *args, **kwargs):              if validation_type == ValidationTypes.json:                  try:                      if not request.is_json:  |