diff --git a/CHANGES.rst b/CHANGES.rst index 7440ef84..ed7ae6b0 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,10 +3,14 @@ All notable changes to this project will be documented in this file. The format is based on `Keep a Changelog `_, and this project adheres to `Semantic Versioning `_. +[0.0.17] - XXXX-XX-XX +===================== + Fixed ***** - Fixed group deletion button. :pr:`80` +- Fixed post requests in oidc clients views. :pr:`81` [0.0.16] - 2022-12-15 ===================== diff --git a/canaille/oidc/clients.py b/canaille/oidc/clients.py index 75fda9ae..cf3516ca 100644 --- a/canaille/oidc/clients.py +++ b/canaille/oidc/clients.py @@ -1,7 +1,7 @@ import datetime -import wtforms from canaille.flaskutils import permissions_needed +from canaille.oidc.forms import ClientAdd from canaille.oidc.models import Client from flask import abort from flask import Blueprint @@ -9,9 +9,8 @@ from flask import flash from flask import redirect from flask import request from flask import url_for -from flask_babel import lazy_gettext as _ +from flask_babel import gettext as _ from flask_themer import render_template -from flask_wtf import FlaskForm from werkzeug.security import gen_salt @@ -27,118 +26,6 @@ def index(user): ) -def client_audiences(): - return [(client.dn, client.client_name) for client in Client.all()] - - -class ClientAdd(FlaskForm): - client_name = wtforms.StringField( - _("Name"), - validators=[wtforms.validators.DataRequired()], - render_kw={"placeholder": "Client Name"}, - ) - contacts = wtforms.EmailField( - _("Contact"), - validators=[wtforms.validators.Optional()], - render_kw={"placeholder": "admin@mydomain.tld"}, - ) - client_uri = wtforms.URLField( - _("URI"), - validators=[wtforms.validators.DataRequired()], - render_kw={"placeholder": "https://mydomain.tld"}, - ) - redirect_uris = wtforms.URLField( - _("Redirect URIs"), - validators=[wtforms.validators.DataRequired()], - render_kw={"placeholder": "https://mydomain.tld/callback"}, - ) - post_logout_redirect_uris = wtforms.URLField( - _("Post logout redirect URIs"), - validators=[wtforms.validators.Optional()], - render_kw={"placeholder": "https://mydomain.tld/you-have-been-disconnected"}, - ) - grant_types = wtforms.SelectMultipleField( - _("Grant types"), - validators=[wtforms.validators.DataRequired()], - choices=[ - ("password", "password"), - ("authorization_code", "authorization_code"), - ("implicit", "implicit"), - ("hybrid", "hybrid"), - ("refresh_token", "refresh_token"), - ], - default=["authorization_code", "refresh_token"], - ) - scope = wtforms.StringField( - _("Scope"), - validators=[wtforms.validators.Optional()], - default="openid profile email", - render_kw={"placeholder": "openid profile"}, - ) - response_types = wtforms.SelectMultipleField( - _("Response types"), - validators=[wtforms.validators.DataRequired()], - choices=[("code", "code"), ("token", "token"), ("id_token", "id_token")], - default=["code"], - ) - token_endpoint_auth_method = wtforms.SelectField( - _("Token Endpoint Auth Method"), - validators=[wtforms.validators.DataRequired()], - choices=[ - ("client_secret_basic", "client_secret_basic"), - ("client_secret_post", "client_secret_post"), - ("none", "none"), - ], - default="client_secret_basic", - ) - audience = wtforms.SelectMultipleField( - _("Token audiences"), - validators=[wtforms.validators.Optional()], - choices=client_audiences, - validate_choice=False, - ) - logo_uri = wtforms.URLField( - _("Logo URI"), - validators=[wtforms.validators.Optional()], - render_kw={"placeholder": "https://mydomain.tld/logo.png"}, - ) - tos_uri = wtforms.URLField( - _("Terms of service URI"), - validators=[wtforms.validators.Optional()], - render_kw={"placeholder": "https://mydomain.tld/tos.html"}, - ) - policy_uri = wtforms.URLField( - _("Policy URI"), - validators=[wtforms.validators.Optional()], - render_kw={"placeholder": "https://mydomain.tld/policy.html"}, - ) - software_id = wtforms.StringField( - _("Software ID"), - validators=[wtforms.validators.Optional()], - render_kw={"placeholder": "xyz"}, - ) - software_version = wtforms.StringField( - _("Software Version"), - validators=[wtforms.validators.Optional()], - render_kw={"placeholder": "1.0"}, - ) - jwk = wtforms.StringField( - _("JWK"), - validators=[wtforms.validators.Optional()], - render_kw={"placeholder": ""}, - ) - jwks_uri = wtforms.URLField( - _("JKW URI"), - validators=[wtforms.validators.Optional()], - render_kw={"placeholder": ""}, - ) - preconsent = wtforms.BooleanField( - _("Pre-consent"), - validators=[wtforms.validators.Optional()], - default=False, - ) - - @bp.route("/add", methods=["GET", "POST"]) @permissions_needed("manage_oidc") def add(user): diff --git a/canaille/oidc/forms.py b/canaille/oidc/forms.py index 4423515b..9109b083 100644 --- a/canaille/oidc/forms.py +++ b/canaille/oidc/forms.py @@ -1,6 +1,120 @@ import wtforms +from canaille.oidc.models import Client +from flask_babel import lazy_gettext as _ from flask_wtf import FlaskForm class LogoutForm(FlaskForm): answer = wtforms.SubmitField() + + +def client_audiences(): + return [(client.dn, client.client_name) for client in Client.all()] + + +class ClientAdd(FlaskForm): + client_name = wtforms.StringField( + _("Name"), + validators=[wtforms.validators.DataRequired()], + render_kw={"placeholder": "Client Name"}, + ) + contacts = wtforms.EmailField( + _("Contact"), + validators=[wtforms.validators.Optional()], + render_kw={"placeholder": "admin@mydomain.tld"}, + ) + client_uri = wtforms.URLField( + _("URI"), + validators=[wtforms.validators.DataRequired()], + render_kw={"placeholder": "https://mydomain.tld"}, + ) + redirect_uris = wtforms.URLField( + _("Redirect URIs"), + validators=[wtforms.validators.DataRequired()], + render_kw={"placeholder": "https://mydomain.tld/callback"}, + ) + post_logout_redirect_uris = wtforms.URLField( + _("Post logout redirect URIs"), + validators=[wtforms.validators.Optional()], + render_kw={"placeholder": "https://mydomain.tld/you-have-been-disconnected"}, + ) + grant_types = wtforms.SelectMultipleField( + _("Grant types"), + validators=[wtforms.validators.DataRequired()], + choices=[ + ("password", "password"), + ("authorization_code", "authorization_code"), + ("implicit", "implicit"), + ("hybrid", "hybrid"), + ("refresh_token", "refresh_token"), + ], + default=["authorization_code", "refresh_token"], + ) + scope = wtforms.StringField( + _("Scope"), + validators=[wtforms.validators.Optional()], + default="openid profile email", + render_kw={"placeholder": "openid profile"}, + ) + response_types = wtforms.SelectMultipleField( + _("Response types"), + validators=[wtforms.validators.DataRequired()], + choices=[("code", "code"), ("token", "token"), ("id_token", "id_token")], + default=["code"], + ) + token_endpoint_auth_method = wtforms.SelectField( + _("Token Endpoint Auth Method"), + validators=[wtforms.validators.DataRequired()], + choices=[ + ("client_secret_basic", "client_secret_basic"), + ("client_secret_post", "client_secret_post"), + ("none", "none"), + ], + default="client_secret_basic", + ) + audience = wtforms.SelectMultipleField( + _("Token audiences"), + validators=[wtforms.validators.Optional()], + choices=client_audiences, + validate_choice=False, + ) + logo_uri = wtforms.URLField( + _("Logo URI"), + validators=[wtforms.validators.Optional()], + render_kw={"placeholder": "https://mydomain.tld/logo.png"}, + ) + tos_uri = wtforms.URLField( + _("Terms of service URI"), + validators=[wtforms.validators.Optional()], + render_kw={"placeholder": "https://mydomain.tld/tos.html"}, + ) + policy_uri = wtforms.URLField( + _("Policy URI"), + validators=[wtforms.validators.Optional()], + render_kw={"placeholder": "https://mydomain.tld/policy.html"}, + ) + software_id = wtforms.StringField( + _("Software ID"), + validators=[wtforms.validators.Optional()], + render_kw={"placeholder": "xyz"}, + ) + software_version = wtforms.StringField( + _("Software Version"), + validators=[wtforms.validators.Optional()], + render_kw={"placeholder": "1.0"}, + ) + jwk = wtforms.StringField( + _("JWK"), + validators=[wtforms.validators.Optional()], + render_kw={"placeholder": ""}, + ) + jwks_uri = wtforms.URLField( + _("JKW URI"), + validators=[wtforms.validators.Optional()], + render_kw={"placeholder": ""}, + ) + preconsent = wtforms.BooleanField( + _("Pre-consent"), + validators=[wtforms.validators.Optional()], + default=False, + )