From e05d2474088bee74432c7ebc794ce4fa25094925 Mon Sep 17 00:00:00 2001 From: thecosmos Date: Wed, 29 Apr 2020 18:38:23 +0530 Subject: [PATCH] Add requires_authorization utility --- README.md | 3 ++- docs/api.rst | 5 +++++ docs/introduction.rst | 3 ++- flask_discord/__init__.py | 8 +++++--- flask_discord/utils.py | 24 ++++++++++++++++++++++++ tests/test_app.py | 8 +++++++- 6 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 flask_discord/utils.py diff --git a/README.md b/README.md index a65cec0..419671f 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ python3 -m pip install Flask-Discord ### Basic Example ```python from flask import Flask, redirect, url_for -from flask_discord import DiscordOAuth2Session +from flask_discord import DiscordOAuth2Session, requires_authorization app = Flask(__name__) @@ -40,6 +40,7 @@ def callback(): @app.route("/me/") +@requires_authorization def me(): user = discord.fetch_user() return f""" diff --git a/docs/api.rst b/docs/api.rst index 7dc414c..f232c9d 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -40,6 +40,11 @@ Models :inherited-members: +Utilities + +.. py:function:: flask_discord.requires_authorization + + Exceptions ---------- diff --git a/docs/introduction.rst b/docs/introduction.rst index e455698..28205aa 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -43,7 +43,7 @@ in exchange for fetching user's details and display them on web page. .. code-block:: python3 from flask import Flask, redirect, url_for - from flask_discord import DiscordOAuth2Session + from flask_discord import DiscordOAuth2Session, requires_authorization app = Flask(__name__) @@ -70,6 +70,7 @@ in exchange for fetching user's details and display them on web page. @app.route("/me/") + @requires_authorization def me(): user = discord.fetch_user() return f""" diff --git a/flask_discord/__init__.py b/flask_discord/__init__.py index 8cf60b8..b6164b5 100644 --- a/flask_discord/__init__.py +++ b/flask_discord/__init__.py @@ -1,14 +1,16 @@ -from .client import DiscordOAuth2Session - from .exceptions import * +from .utils import * + +from .client import DiscordOAuth2Session __all__ = [ "DiscordOAuth2Session", + "requires_authorization", "HttpException", "Unauthorized", ] -__version__ = "0.1.10" +__version__ = "0.1.11" diff --git a/flask_discord/utils.py b/flask_discord/utils.py new file mode 100644 index 0000000..7eec90a --- /dev/null +++ b/flask_discord/utils.py @@ -0,0 +1,24 @@ +"""Few utility functions and decorators.""" +import functools + +from . import exceptions +from flask import current_app + + +# Decorators. + +def requires_authorization(view): + """A decorator for flask views which raises exception :py:class:`flask_discord.exceptions.Unauthorized` if the user + is not authorized from Discord OAuth2. + + """ + + # TODO: Add support to validate scopes. + + @functools.wraps(view) + def wrapper(*args, **kwargs): + if not current_app.discord.authorized: + raise exceptions.Unauthorized + return view(*args, **kwargs) + + return wrapper diff --git a/tests/test_app.py b/tests/test_app.py index 242c7fc..1edeba1 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -1,7 +1,7 @@ import os from flask import Flask, redirect, url_for -from flask_discord import DiscordOAuth2Session +from flask_discord import DiscordOAuth2Session, requires_authorization app = Flask(__name__) @@ -79,5 +79,11 @@ def logout(): return redirect(url_for(".index")) +@app.route("/secret/") +@requires_authorization +def secret(): + return os.urandom(16) + + if __name__ == "__main__": app.run(debug=True)