Users can choose their favourite display name

This commit is contained in:
Éloi Rivard 2022-12-02 18:47:16 +01:00
parent 8ba6d2f7cf
commit 9e75ef3478
13 changed files with 75 additions and 9 deletions

View file

@ -3,6 +3,11 @@ All notable changes to this project will be documented in this file.
The format is based on `Keep a Changelog <https://keepachangelog.com/en/1.0.0/>`_,
and this project adheres to `Semantic Versioning <https://semver.org/spec/v2.0.0.html>`_.
Added
*****
- User can chose their favourite display name. :pr:`77`
[0.0.14] - 2022-11-29
=====================

View file

@ -131,7 +131,17 @@ GROUP_BASE = "ou=groups,dc=mydomain,dc=tld"
[ACL.DEFAULT]
PERMISSIONS = ["edit_self", "use_oidc"]
READ = ["uid", "groups"]
WRITE = ["givenName", "sn", "userPassword", "telephoneNumber", "jpegPhoto", "mail", "labeledURI", "preferredLanguage"]
WRITE = [
"givenName",
"sn",
"displayName",
"userPassword",
"telephoneNumber",
"jpegPhoto",
"mail",
"labeledURI",
"preferredLanguage",
]
[ACL.ADMIN]
FILTER = "memberof=cn=moderators,ou=groups,dc=mydomain,dc=tld"
@ -172,7 +182,7 @@ PHONE_NUMBER = "{{ user.telephoneNumber[0] }}"
EMAIL = "{{ user.mail[0] }}"
GIVEN_NAME = "{{ user.givenName[0] }}"
FAMILY_NAME = "{{ user.sn[0] }}"
PREFERRED_USERNAME = "{{ user.displayName[0] }}"
PREFERRED_USERNAME = "{{ user.displayName }}"
LOCALE = "{{ user.preferredLanguage[0] }}"
ADDRESS = "{{ user.postalAddress[0] }}"
PICTURE = "{% if user.jpegPhoto %}{{ url_for('account.photo', uid=user.uid[0], field='jpegPhoto', _external=True) }}{% endif %}"

View file

@ -123,6 +123,15 @@ PROFILE_FORM_FIELDS = dict(
"autocorrect": "off",
},
),
displayName=wtforms.StringField(
_("Display Name"),
validators=[wtforms.validators.Optional()],
render_kw={
"placeholder": _("Johnny"),
"spellcheck": "false",
"autocorrect": "off",
},
),
mail=wtforms.EmailField(
_("Email address"),
validators=[wtforms.validators.DataRequired(), wtforms.validators.Email()],

View file

@ -118,9 +118,12 @@
{% if "sn" in form %}
{% block sn_field scoped %}{{ render_field(form.sn) }}{% endblock %}
{% endif %}
</div>
{% if "displayName" in form %}
{% block display_name_field scoped %}{{ render_field(form.displayName) }}{% endblock %}
{% endif %}
{% if "jpegPhoto" in form %}</div></div>{% endif %}
{% if "mail" in form %}

View file

@ -132,7 +132,17 @@ GROUP_BASE = "ou=groups,dc=mydomain,dc=tld"
[ACL.DEFAULT]
PERMISSIONS = ["use_oidc"]
READ = ["uid", "groups"]
WRITE = ["jpegPhoto", "givenName", "sn", "userPassword", "telephoneNumber", "mail", "labeledURI", "preferredLanguage"]
WRITE = [
"jpegPhoto",
"givenName",
"sn",
"displayName",
"userPassword",
"telephoneNumber",
"mail",
"labeledURI",
"preferredLanguage",
]
[ACL.ADMIN]
FILTER = "memberof=cn=admins,ou=groups,dc=mydomain,dc=tld"
@ -178,7 +188,7 @@ PHONE_NUMBER = "{{ user.telephoneNumber[0] }}"
EMAIL = "{{ user.mail[0] }}"
GIVEN_NAME = "{{ user.givenName[0] }}"
FAMILY_NAME = "{{ user.sn[0] }}"
PREFERRED_USERNAME = "{{ user.displayName[0] }}"
PREFERRED_USERNAME = "{{ user.displayName }}"
LOCALE = "{{ user.preferredLanguage[0] }}"
ADDRESS = "{{ user.postalAddress[0] }}"
PICTURE = "{% if user.jpegPhoto %}{{ url_for('account.photo', uid=user.uid[0], field='jpegPhoto', _external=True) }}{% endif %}"

View file

@ -132,7 +132,18 @@ GROUP_BASE = "ou=groups,dc=mydomain,dc=tld"
[ACL.DEFAULT]
PERMISSIONS = ["edit_self", "use_oidc"]
READ = ["uid", "groups"]
WRITE = ["jpegPhoto", "givenName", "sn", "userPassword", "telephoneNumber", "mail", "labeledURI", "postalAddress", "preferredLanguage"]
WRITE = [
"jpegPhoto",
"givenName",
"sn",
"displayName",
"userPassword",
"telephoneNumber",
"mail",
"labeledURI",
"postalAddress",
"preferredLanguage",
]
[ACL.ADMIN]
FILTER = "memberof=cn=admins,ou=groups,dc=mydomain,dc=tld"
@ -178,7 +189,7 @@ PHONE_NUMBER = "{{ user.telephoneNumber[0] }}"
EMAIL = "{{ user.mail[0] }}"
GIVEN_NAME = "{{ user.givenName[0] }}"
FAMILY_NAME = "{{ user.sn[0] }}"
PREFERRED_USERNAME = "{{ user.displayName[0] }}"
PREFERRED_USERNAME = "{{ user.displayName }}"
LOCALE = "{{ user.preferredLanguage[0] }}"
ADDRESS = "{{ user.postalAddress[0] }}"
PICTURE = "{% if user.jpegPhoto %}{{ url_for('account.photo', uid=user.uid[0], field='jpegPhoto', _external=True) }}{% endif %}"

View file

@ -167,6 +167,7 @@ def configuration(slapd_server, smtpd, keypair_path):
"givenName",
"jpegPhoto",
"sn",
"displayName",
"userPassword",
"telephoneNumber",
"postalAddress",
@ -206,7 +207,7 @@ def configuration(slapd_server, smtpd, keypair_path):
"EMAIL": "{{ user.mail[0] }}",
"GIVEN_NAME": "{{ user.givenName[0] }}",
"FAMILY_NAME": "{{ user.sn[0] }}",
"PREFERRED_USERNAME": "{{ user.displayName[0] }}",
"PREFERRED_USERNAME": "{{ user.displayName }}",
"LOCALE": "{{ user.preferredLanguage[0] }}",
"PICTURE": "{% if user.jpegPhoto %}{{ url_for('account.photo', uid=user.uid[0], field='jpegPhoto', _external=True) }}{% endif %}",
},
@ -250,6 +251,7 @@ def user(app, slapd_connection):
uid="user",
mail="john@doe.com",
userPassword="{SSHA}fw9DYeF/gHTHuVMepsQzVYAkffGcU8Fz",
displayName="Johnny",
)
u.save()
yield u

View file

@ -93,6 +93,7 @@ def test_authorization_code_flow(
assert {
"name": "John (johnny) Doe",
"family_name": "Doe",
"preferred_username": "Johnny",
"email": "john@doe.com",
"sub": "user",
"groups": [],
@ -161,6 +162,7 @@ def test_authorization_code_flow_preconsented(
assert {
"name": "John (johnny) Doe",
"family_name": "Doe",
"preferred_username": "Johnny",
"sub": "user",
} == res.json
@ -231,6 +233,7 @@ def test_logout_login(testclient, logged_user, client):
assert {
"name": "John (johnny) Doe",
"family_name": "Doe",
"preferred_username": "Johnny",
"sub": "user",
} == res.json
@ -312,6 +315,7 @@ def test_refresh_token(testclient, user, client):
assert {
"name": "John (johnny) Doe",
"family_name": "Doe",
"preferred_username": "Johnny",
"sub": "user",
} == res.json
@ -378,6 +382,7 @@ def test_code_challenge(testclient, logged_user, client):
assert {
"name": "John (johnny) Doe",
"family_name": "Doe",
"preferred_username": "Johnny",
"sub": "user",
} == res.json
@ -705,6 +710,7 @@ def test_authorization_code_request_scope_too_large(
assert {
"name": "John (johnny) Doe",
"family_name": "Doe",
"preferred_username": "Johnny",
"sub": "user",
} == res.json

View file

@ -49,6 +49,7 @@ def test_oauth_hybrid(testclient, slapd_connection, user, client):
assert {
"name": "John (johnny) Doe",
"family_name": "Doe",
"preferred_username": "Johnny",
"sub": "user",
} == res.json
@ -94,5 +95,6 @@ def test_oidc_hybrid(
assert {
"name": "John (johnny) Doe",
"family_name": "Doe",
"preferred_username": "Johnny",
"sub": "user",
} == res.json

View file

@ -46,6 +46,7 @@ def test_oauth_implicit(testclient, user, client):
"name": "John (johnny) Doe",
"sub": "user",
"family_name": "Doe",
"preferred_username": "Johnny",
} == res.json
client.grant_types = ["code"]
@ -102,6 +103,7 @@ def test_oidc_implicit(testclient, keypair, user, client, other_client):
"name": "John (johnny) Doe",
"sub": "user",
"family_name": "Doe",
"preferred_username": "Johnny",
} == res.json
client.grant_types = ["code"]
@ -161,6 +163,7 @@ def test_oidc_implicit_with_group(
"name": "John (johnny) Doe",
"sub": "user",
"family_name": "Doe",
"preferred_username": "Johnny",
"groups": ["foo"],
} == res.json

View file

@ -30,7 +30,7 @@ DEFAULT_JWT_MAPPING_CONFIG = {
"EMAIL": "{{ user.mail[0] }}",
"GIVEN_NAME": "{{ user.givenName[0] }}",
"FAMILY_NAME": "{{ user.sn[0] }}",
"PREFERRED_USERNAME": "{{ user.displayName[0] }}",
"PREFERRED_USERNAME": "{{ user.displayName }}",
"LOCALE": "{{ user.preferredLanguage[0] }}",
}
@ -49,6 +49,7 @@ def test_generate_user_standard_claims_with_default_config(
"email": "john@doe.com",
"sub": "user",
"locale": "fr",
"preferred_username": "Johnny",
}

View file

@ -32,6 +32,7 @@ def test_password_flow_basic(testclient, user, client):
"name": "John (johnny) Doe",
"sub": "user",
"family_name": "Doe",
"preferred_username": "Johnny",
"groups": [],
} == res.json
@ -69,5 +70,6 @@ def test_password_flow_post(testclient, user, client):
"name": "John (johnny) Doe",
"sub": "user",
"family_name": "Doe",
"preferred_username": "Johnny",
"groups": [],
} == res.json

View file

@ -42,6 +42,7 @@ def test_edition(
res.form["uid"] = "toto"
res.form["givenName"] = "given_name"
res.form["sn"] = "family_name"
res.form["displayName"] = "display_name"
res.form["mail"] = "email@mydomain.tld"
res.form["telephoneNumber"] = "555-666-777"
res.form["postalAddress"] = "postal_address"
@ -61,6 +62,7 @@ def test_edition(
assert ["user"] == logged_user.uid
assert ["given_name"] == logged_user.givenName
assert ["family_name"] == logged_user.sn
assert "display_name" == logged_user.displayName
assert ["email@mydomain.tld"] == logged_user.mail
assert ["555-666-777"] == logged_user.telephoneNumber
assert ["postal_address"] == logged_user.postalAddress