diff --git a/app/blueprints/oauth/__init__.py b/app/blueprints/oauth/__init__.py
index 8d6f21d4..9b71e249 100644
--- a/app/blueprints/oauth/__init__.py
+++ b/app/blueprints/oauth/__init__.py
@@ -15,15 +15,15 @@
# along with this program. If not, see .
import urllib.parse as urlparse
-from typing import Optional
from urllib.parse import urlencode
+import typing
from flask import Blueprint, render_template, redirect, url_for, request, jsonify, abort, make_response, flash
from flask_babel import lazy_gettext, gettext
from flask_login import current_user, login_required
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, URLField
-from wtforms.validators import InputRequired, Length
+from wtforms.validators import InputRequired, Length, Optional
from app import csrf
from app.blueprints.users.settings import get_setting_tabs
@@ -33,7 +33,7 @@ from app.utils import random_string, add_audit_log
bp = Blueprint("oauth", __name__)
-def build_redirect_url(url: str, code: str, state: Optional[str]):
+def build_redirect_url(url: str, code: str, state: typing.Optional[str]):
params = {"code": code}
if state is not None:
params["state"] = state
@@ -165,6 +165,7 @@ def list_clients(username):
class OAuthClientForm(FlaskForm):
title = StringField(lazy_gettext("Title"), [InputRequired(), Length(5, 30)])
+ description = StringField(lazy_gettext("Description"), [Optional()])
redirect_url = URLField(lazy_gettext("Redirect URL"), [InputRequired(), Length(5, 123)])
submit = SubmitField(lazy_gettext("Save"))
diff --git a/app/templates/oauth/authorize.html b/app/templates/oauth/authorize.html
index 66b1eb16..23b2feb7 100644
--- a/app/templates/oauth/authorize.html
+++ b/app/templates/oauth/authorize.html
@@ -80,6 +80,12 @@
+ {% if client.description %}
+
+
{{ _("About %(title)s", title=client.title) }}
+
{{ client.description }}
+
+ {% endif %}
{% if not client.approved %}