Merge branch 'main' into application-wizard-2-with-api-and-tests

* main:
  web: package up horizontal elements into their own components (#7053)
  core: bump django from 4.2.5 to 4.2.6 (#7066)
  translate: Updates for file locale/en/LC_MESSAGES/django.po in fr on branch main (#7065)
  web: bump postcss from 8.4.29 to 8.4.31 in /web (#7064)
  translate: Updates for file locale/en/LC_MESSAGES/django.po in zh-Hans on branch main (#7057)
  translate: Updates for file locale/en/LC_MESSAGES/django.po in zh_CN on branch main (#7056)
  web: bump pyright from 1.1.329 to 1.1.330 in /web (#7060)
  web: bump the storybook group in /web with 5 updates (#7059)
  web: bump the wdio group in /tests/wdio with 2 updates (#7063)
  core: bump duo-client from 5.0.1 to 5.1.0 (#7062)
  core: bump goauthentik.io/api/v3 from 3.2023083.3 to 3.2023083.4 (#7061)
  Add meta description to black box blog post (#7049)
  web/flows: fix plex login not opening new tab on mobile safari (#7050)
  web: bump API Client version (#7052)
  web/flows: bottom-align about text on flows page (#7051)
  core: bump codespell from 2.2.5 to 2.2.6 (#7046)
  core: bump coverage from 7.3.1 to 7.3.2 (#7047)
  web: laying the groundwork for future expansion (#7045)
This commit is contained in:
Ken Sternberg 2023-10-04 14:16:24 -07:00
commit 3592aae3df
59 changed files with 1721 additions and 1766 deletions

View file

@ -78,7 +78,7 @@ install: web-install website-install ## Install all requires dependencies for `
poetry install poetry install
dev-drop-db: dev-drop-db:
echo dropdb -U ${pg_user} -h ${pg_host} ${pg_name} dropdb -U ${pg_user} -h ${pg_host} ${pg_name}
# Also remove the test-db if it exists # Also remove the test-db if it exists
dropdb -U ${pg_user} -h ${pg_host} test_${pg_name} || true dropdb -U ${pg_user} -h ${pg_host} test_${pg_name} || true
echo redis-cli -n 0 flushall echo redis-cli -n 0 flushall

View file

@ -141,7 +141,7 @@ class BaseEvaluator:
"""Create event with supplied data and try to extract as much relevant data """Create event with supplied data and try to extract as much relevant data
from the context""" from the context"""
context = self._context.copy() context = self._context.copy()
# If the result was a complex variable, we don't want to re-use it # If the result was a complex variable, we don't want to reuse it
context.pop("result", None) context.pop("result", None)
context.pop("handler", None) context.pop("handler", None)
event_kwargs = context event_kwargs = context

View file

@ -380,7 +380,7 @@ class Outpost(SerializerModel, ManagedModel):
managed=managed, managed=managed,
) )
except IntegrityError: except IntegrityError:
# Integrity error happens mostly when managed is re-used # Integrity error happens mostly when managed is reused
Token.objects.filter(managed=managed).delete() Token.objects.filter(managed=managed).delete()
Token.objects.filter(identifier=self.token_identifier).delete() Token.objects.filter(identifier=self.token_identifier).delete()
return self.token return self.token

View file

@ -21,7 +21,7 @@ class OktaOAuth2Callback(OAuthCallback):
"""Okta OAuth2 Callback""" """Okta OAuth2 Callback"""
# Okta has the same quirk as azure and throws an error if the access token # Okta has the same quirk as azure and throws an error if the access token
# is set via query parameter, so we re-use the azure client # is set via query parameter, so we reuse the azure client
# see https://github.com/goauthentik/authentik/issues/1910 # see https://github.com/goauthentik/authentik/issues/1910
client_class = UserprofileHeaderAuthClient client_class = UserprofileHeaderAuthClient

View file

@ -16,7 +16,7 @@ class TwitterClient(UserprofileHeaderAuthClient):
the access token endpoint for some reason.""" the access token endpoint for some reason."""
# Twitter has the same quirk as azure and throws an error if the access token # Twitter has the same quirk as azure and throws an error if the access token
# is set via query parameter, so we re-use the azure client # is set via query parameter, so we reuse the azure client
# see https://github.com/goauthentik/authentik/issues/1910 # see https://github.com/goauthentik/authentik/issues/1910
def get_access_token(self, **request_kwargs) -> Optional[dict[str, Any]]: def get_access_token(self, **request_kwargs) -> Optional[dict[str, Any]]:

View file

@ -17,7 +17,7 @@ class Migration(migrations.Migration):
help_text=( help_text=(
"When enabled, the Phone number is only used during enrollment to verify the" "When enabled, the Phone number is only used during enrollment to verify the"
" users authenticity. Only a hash of the phone number is saved to ensure it is" " users authenticity. Only a hash of the phone number is saved to ensure it is"
" not re-used in the future." " not reused in the future."
), ),
), ),
), ),

View file

@ -56,7 +56,7 @@ class AuthenticatorSMSStage(ConfigurableStage, FriendlyNamedStage, Stage):
help_text=_( help_text=_(
"When enabled, the Phone number is only used during enrollment to verify the " "When enabled, the Phone number is only used during enrollment to verify the "
"users authenticity. Only a hash of the phone number is saved to ensure it is " "users authenticity. Only a hash of the phone number is saved to ensure it is "
"not re-used in the future." "not reused in the future."
), ),
) )

View file

@ -5884,7 +5884,7 @@
"verify_only": { "verify_only": {
"type": "boolean", "type": "boolean",
"title": "Verify only", "title": "Verify only",
"description": "When enabled, the Phone number is only used during enrollment to verify the users authenticity. Only a hash of the phone number is saved to ensure it is not re-used in the future." "description": "When enabled, the Phone number is only used during enrollment to verify the users authenticity. Only a hash of the phone number is saved to ensure it is not reused in the future."
}, },
"mapping": { "mapping": {
"type": "integer", "type": "integer",

View file

@ -96,7 +96,7 @@ func attemptProxyStart(ws *web.WebServer, u *url.URL) {
continue continue
} }
// Init tenant_tls here too since it requires an API Client, // Init tenant_tls here too since it requires an API Client,
// so we just re-use the same one as the outpost uses // so we just reuse the same one as the outpost uses
tw := tenant_tls.NewWatcher(ac.Client) tw := tenant_tls.NewWatcher(ac.Client)
go tw.Start() go tw.Start()
ws.TenantTLS = tw ws.TenantTLS = tw

2
go.mod
View file

@ -26,7 +26,7 @@ require (
github.com/sirupsen/logrus v1.9.3 github.com/sirupsen/logrus v1.9.3
github.com/spf13/cobra v1.7.0 github.com/spf13/cobra v1.7.0
github.com/stretchr/testify v1.8.4 github.com/stretchr/testify v1.8.4
goauthentik.io/api/v3 v3.2023083.3 goauthentik.io/api/v3 v3.2023083.4
golang.org/x/exp v0.0.0-20230210204819-062eb4c674ab golang.org/x/exp v0.0.0-20230210204819-062eb4c674ab
golang.org/x/oauth2 v0.12.0 golang.org/x/oauth2 v0.12.0
golang.org/x/sync v0.3.0 golang.org/x/sync v0.3.0

4
go.sum
View file

@ -346,8 +346,8 @@ go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvx
go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M=
go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8=
go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
goauthentik.io/api/v3 v3.2023083.3 h1:nfHJ5/I/jZJ3o7BKnP5hZ8tYV4kkkWw/+5GkBCQ5UkE= goauthentik.io/api/v3 v3.2023083.4 h1:WIi2+LFfBTvhxcbH/WqvhY/4EsX8bAN6mrPODq02B/w=
goauthentik.io/api/v3 v3.2023083.3/go.mod h1:zz+mEZg8rY/7eEjkMGWJ2DnGqk+zqxuybGCGrR2O4Kw= goauthentik.io/api/v3 v3.2023083.4/go.mod h1:zz+mEZg8rY/7eEjkMGWJ2DnGqk+zqxuybGCGrR2O4Kw=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=

View file

@ -65,7 +65,7 @@ def worker_exit(server: "Arbiter", worker: DjangoUvicornWorker):
def on_starting(server: "Arbiter"): def on_starting(server: "Arbiter"):
"""Attach a set of IDs that can be temporarily re-used. """Attach a set of IDs that can be temporarily reused.
Used on reloads when each worker exists twice.""" Used on reloads when each worker exists twice."""
server._worker_id_overload = set() server._worker_id_overload = set()
@ -79,7 +79,7 @@ def nworkers_changed(server: "Arbiter", new_value, old_value):
def _next_worker_id(server: "Arbiter"): def _next_worker_id(server: "Arbiter"):
"""If there are IDs open for re-use, take one. Else look for a free one.""" """If there are IDs open for reuse, take one. Else look for a free one."""
if server._worker_id_overload: if server._worker_id_overload:
return server._worker_id_overload.pop() return server._worker_id_overload.pop()
@ -90,7 +90,7 @@ def _next_worker_id(server: "Arbiter"):
def on_reload(server: "Arbiter"): def on_reload(server: "Arbiter"):
"""Add a full set of ids into overload so it can be re-used once.""" """Add a full set of ids into overload so it can be reused once."""
server._worker_id_overload = set(range(1, server.cfg.workers + 1)) server._worker_id_overload = set(range(1, server.cfg.workers + 1))

View file

@ -1857,7 +1857,7 @@ msgstr ""
msgid "" msgid ""
"When enabled, the Phone number is only used during enrollment to verify the " "When enabled, the Phone number is only used during enrollment to verify the "
"users authenticity. Only a hash of the phone number is saved to ensure it is " "users authenticity. Only a hash of the phone number is saved to ensure it is "
"not re-used in the future." "not reused in the future."
msgstr "" msgstr ""
#: authentik/stages/authenticator_sms/models.py:68 #: authentik/stages/authenticator_sms/models.py:68

View file

@ -11,6 +11,7 @@
# Titouan Petit, 2023 # Titouan Petit, 2023
# Kyllian Delaye-Maillot, 2023 # Kyllian Delaye-Maillot, 2023
# Manuel Viens, 2023 # Manuel Viens, 2023
# Mordecai, 2023
# Marc Schmitt, 2023 # Marc Schmitt, 2023
# #
#, fuzzy #, fuzzy
@ -18,7 +19,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-09-15 09:51+0000\n" "POT-Creation-Date: 2023-10-02 12:46+0000\n"
"PO-Revision-Date: 2022-09-26 16:47+0000\n" "PO-Revision-Date: 2022-09-26 16:47+0000\n"
"Last-Translator: Marc Schmitt, 2023\n" "Last-Translator: Marc Schmitt, 2023\n"
"Language-Team: French (https://app.transifex.com/authentik/teams/119923/fr/)\n" "Language-Team: French (https://app.transifex.com/authentik/teams/119923/fr/)\n"
@ -422,35 +423,35 @@ msgstr "Distribué pour l'utilisateur"
msgid "Event user" msgid "Event user"
msgstr "Évènement utilisateur" msgstr "Évènement utilisateur"
#: authentik/events/models.py:484 #: authentik/events/models.py:491
msgid "Notification Transport" msgid "Notification Transport"
msgstr "Transport de Notification" msgstr "Transport de Notification"
#: authentik/events/models.py:485 #: authentik/events/models.py:492
msgid "Notification Transports" msgid "Notification Transports"
msgstr "Transports de notification" msgstr "Transports de notification"
#: authentik/events/models.py:491 #: authentik/events/models.py:498
msgid "Notice" msgid "Notice"
msgstr "Note" msgstr "Note"
#: authentik/events/models.py:492 #: authentik/events/models.py:499
msgid "Warning" msgid "Warning"
msgstr "Avertissement" msgstr "Avertissement"
#: authentik/events/models.py:493 #: authentik/events/models.py:500
msgid "Alert" msgid "Alert"
msgstr "Alerte" msgstr "Alerte"
#: authentik/events/models.py:518 #: authentik/events/models.py:525
msgid "Notification" msgid "Notification"
msgstr "Notification" msgstr "Notification"
#: authentik/events/models.py:519 #: authentik/events/models.py:526
msgid "Notifications" msgid "Notifications"
msgstr "Notifications" msgstr "Notifications"
#: authentik/events/models.py:529 #: authentik/events/models.py:536
msgid "" msgid ""
"Select which transports should be used to notify the user. If none are " "Select which transports should be used to notify the user. If none are "
"selected, the notification will only be shown in the authentik UI." "selected, the notification will only be shown in the authentik UI."
@ -459,11 +460,11 @@ msgstr ""
"défaut, la notification sera simplement affichée dans l'interface " "défaut, la notification sera simplement affichée dans l'interface "
"utilisateur authentik." "utilisateur authentik."
#: authentik/events/models.py:537 #: authentik/events/models.py:544
msgid "Controls which severity level the created notifications will have." msgid "Controls which severity level the created notifications will have."
msgstr "Contrôle quel niveau de sévérité les notifications créées auront." msgstr "Contrôle quel niveau de sévérité les notifications créées auront."
#: authentik/events/models.py:542 #: authentik/events/models.py:549
msgid "" msgid ""
"Define which group of users this notification should be sent and shown to. " "Define which group of users this notification should be sent and shown to. "
"If left empty, Notification won't ben sent." "If left empty, Notification won't ben sent."
@ -471,19 +472,19 @@ msgstr ""
"Définir à quel groupe d'utilisateur cette notification doit être envoyée et " "Définir à quel groupe d'utilisateur cette notification doit être envoyée et "
"affichée. Si laissé vide, les notifications ne seront pas envoyées." "affichée. Si laissé vide, les notifications ne seront pas envoyées."
#: authentik/events/models.py:560 #: authentik/events/models.py:567
msgid "Notification Rule" msgid "Notification Rule"
msgstr "Règle de Notification" msgstr "Règle de Notification"
#: authentik/events/models.py:561 #: authentik/events/models.py:568
msgid "Notification Rules" msgid "Notification Rules"
msgstr "Règles de notification" msgstr "Règles de notification"
#: authentik/events/models.py:581 #: authentik/events/models.py:588
msgid "Webhook Mapping" msgid "Webhook Mapping"
msgstr "Mappage de Webhook" msgstr "Mappage de Webhook"
#: authentik/events/models.py:582 #: authentik/events/models.py:589
msgid "Webhook Mappings" msgid "Webhook Mappings"
msgstr "Mappages de Webhook" msgstr "Mappages de Webhook"
@ -2074,7 +2075,7 @@ msgstr "Appareils Duo"
msgid "" msgid ""
"When enabled, the Phone number is only used during enrollment to verify the " "When enabled, the Phone number is only used during enrollment to verify the "
"users authenticity. Only a hash of the phone number is saved to ensure it is" "users authenticity. Only a hash of the phone number is saved to ensure it is"
" not re-used in the future." " not reused in the future."
msgstr "" msgstr ""
"Si activé, le numéro de téléphone n'est utilisé que durant l'inscription " "Si activé, le numéro de téléphone n'est utilisé que durant l'inscription "
"pour vérifier l'authenticité de l'utilisateur. Seul un hachage du numéro de " "pour vérifier l'authenticité de l'utilisateur. Seul un hachage du numéro de "
@ -2331,11 +2332,11 @@ msgstr "Pas d'utilisateurs en attente."
msgid "Email sent." msgid "Email sent."
msgstr "Email envoyé." msgstr "Email envoyé."
#: authentik/stages/email/templates/email/account_confirmation.html:9 #: authentik/stages/email/templates/email/account_confirmation.html:10
msgid "Welcome!" msgid "Welcome!"
msgstr "Bienvenue !" msgstr "Bienvenue !"
#: authentik/stages/email/templates/email/account_confirmation.html:12 #: authentik/stages/email/templates/email/account_confirmation.html:19
msgid "" msgid ""
"We're excited to have you get started. First, you need to confirm your " "We're excited to have you get started. First, you need to confirm your "
"account. Just press the button below." "account. Just press the button below."
@ -2343,11 +2344,11 @@ msgstr ""
"Nous sommes ravis que vous puissiez commencer. Tout d'abord, vous devez " "Nous sommes ravis que vous puissiez commencer. Tout d'abord, vous devez "
"confirmer votre compte. Il vous suffit d'appuyer sur le bouton ci-dessous." "confirmer votre compte. Il vous suffit d'appuyer sur le bouton ci-dessous."
#: authentik/stages/email/templates/email/account_confirmation.html:21 #: authentik/stages/email/templates/email/account_confirmation.html:24
msgid "Confirm Account" msgid "Confirm Account"
msgstr "Confirmer le Compte" msgstr "Confirmer le Compte"
#: authentik/stages/email/templates/email/account_confirmation.html:30 #: authentik/stages/email/templates/email/account_confirmation.html:36
#, python-format #, python-format
msgid "" msgid ""
"\n" "\n"
@ -2358,52 +2359,52 @@ msgstr ""
" Si cela ne fonctionne pas, copier et coller ce lien dans votre navigateur : %(url)s\n" " Si cela ne fonctionne pas, copier et coller ce lien dans votre navigateur : %(url)s\n"
" " " "
#: authentik/stages/email/templates/email/account_confirmation.html:35 #: authentik/stages/email/templates/email/event_notification.html:46
msgid ""
"If you have any questions, just reply to this email—we're always happy to "
"help out."
msgstr ""
"Si vous avez des questions, répondez simplement à cet e-email - nous sommes "
"toujours heureux de vous aider."
#: authentik/stages/email/templates/email/generic.html:24
msgid "Additional Information"
msgstr "Informations Additionnelles"
#: authentik/stages/email/templates/email/password_reset.html:9
#, python-format #, python-format
msgid "" msgid ""
"\n" "\n"
" Hi %(username)s,\n" " This email was sent from the notification transport <code>%(name)s</code>.\n"
" " " "
msgstr "" msgstr ""
"\n" "\n"
"Bonjour %(username)s," " Cet email a été envoyé depuis le transport de notification <code>%(name)s</code>.\n"
" "
#: authentik/stages/email/templates/email/password_reset.html:19 #: authentik/stages/email/templates/email/password_reset.html:10
#, python-format
msgid "" msgid ""
"\n" "\n"
" You recently requested to change your password for your authentik account. Use the button below to set a new password.\n" " Hi %(username)s,\n"
" " " "
msgstr "" msgstr ""
"\n" "\n"
" Vous avez récemment demandé à changer le mot de passe de votre compte authentik. Utilisez le bouton ci-dessous pour définir un nouveau mot de passe.\n" " Salut %(username)s,\n"
" " " "
#: authentik/stages/email/templates/email/password_reset.html:33 #: authentik/stages/email/templates/email/password_reset.html:21
msgid ""
"\n"
" You recently requested to change your password for your authentik account. Use the button below to set a new password.\n"
" "
msgstr ""
"\n"
" Vous avez récemment demandé à changer le mot de passe de votre compte authentik. Utilisez le bouton ci-dessous pour définir un nouveau mot de passe.\n"
" "
#: authentik/stages/email/templates/email/password_reset.html:28
msgid "Reset Password" msgid "Reset Password"
msgstr "Réinitialiser le mot de passe" msgstr "Réinitialiser le mot de passe"
#: authentik/stages/email/templates/email/password_reset.html:45 #: authentik/stages/email/templates/email/password_reset.html:39
#, python-format #, python-format
msgid "" msgid ""
"\n" "\n"
" If you did not request a password change, please ignore this Email. The link above is valid for %(expires)s.\n" " If you did not request a password change, please ignore this Email. The link above is valid for %(expires)s.\n"
" " " "
msgstr "" msgstr ""
"\n" "\n"
" Si vous n'avez pas requis de changement de mot de passe, veuillez ignorer cet e-mail. Le lien ci-dessus est valide pendant %(expires)s.\n" " Si vous n'avez pas requis de changement de mot de passe, veuillez ignorer cet e-mail. Le lien ci-dessus est valide pendant %(expires)s.\n"
" " " "
#: authentik/stages/email/templates/email/setup.html:9 #: authentik/stages/email/templates/email/setup.html:9
msgid "authentik Test-Email" msgid "authentik Test-Email"

View file

@ -2057,7 +2057,7 @@ msgstr "Duo-apparaten"
msgid "" msgid ""
"When enabled, the Phone number is only used during enrollment to verify the " "When enabled, the Phone number is only used during enrollment to verify the "
"users authenticity. Only a hash of the phone number is saved to ensure it is" "users authenticity. Only a hash of the phone number is saved to ensure it is"
" not re-used in the future." " not reused in the future."
msgstr "" msgstr ""
"Indien ingeschakeld, wordt het telefoonnummer alleen gebruikt tijdens " "Indien ingeschakeld, wordt het telefoonnummer alleen gebruikt tijdens "
"inschrijving om de authenticiteit van de gebruiker te verifiëren. Alleen een" "inschrijving om de authenticiteit van de gebruiker te verifiëren. Alleen een"

View file

@ -1893,7 +1893,7 @@ msgstr "Duo 设备"
msgid "" msgid ""
"When enabled, the Phone number is only used during enrollment to verify the " "When enabled, the Phone number is only used during enrollment to verify the "
"users authenticity. Only a hash of the phone number is saved to ensure it is" "users authenticity. Only a hash of the phone number is saved to ensure it is"
" not re-used in the future." " not reused in the future."
msgstr "启用时,电话号码仅在注册期间用于验证用户的真实性。仅保存电话号码的哈希,以确保将来不会重复使用。" msgstr "启用时,电话号码仅在注册期间用于验证用户的真实性。仅保存电话号码的哈希,以确保将来不会重复使用。"
#: authentik/stages/authenticator_sms/models.py:68 #: authentik/stages/authenticator_sms/models.py:68

View file

@ -1893,7 +1893,7 @@ msgstr "Duo 设备"
msgid "" msgid ""
"When enabled, the Phone number is only used during enrollment to verify the " "When enabled, the Phone number is only used during enrollment to verify the "
"users authenticity. Only a hash of the phone number is saved to ensure it is" "users authenticity. Only a hash of the phone number is saved to ensure it is"
" not re-used in the future." " not reused in the future."
msgstr "启用时,电话号码仅在注册期间用于验证用户的真实性。仅保存电话号码的哈希,以确保将来不会重复使用。" msgstr "启用时,电话号码仅在注册期间用于验证用户的真实性。仅保存电话号码的哈希,以确保将来不会重复使用。"
#: authentik/stages/authenticator_sms/models.py:68 #: authentik/stages/authenticator_sms/models.py:68

128
poetry.lock generated
View file

@ -882,17 +882,17 @@ testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"]
[[package]] [[package]]
name = "codespell" name = "codespell"
version = "2.2.5" version = "2.2.6"
description = "Codespell" description = "Codespell"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.8"
files = [ files = [
{file = "codespell-2.2.5-py3-none-any.whl", hash = "sha256:efa037f54b73c84f7bd14ce8e853d5f822cdd6386ef0ff32e957a3919435b9ec"}, {file = "codespell-2.2.6-py3-none-any.whl", hash = "sha256:9ee9a3e5df0990604013ac2a9f22fa8e57669c827124a2e961fe8a1da4cacc07"},
{file = "codespell-2.2.5.tar.gz", hash = "sha256:6d9faddf6eedb692bf80c9a94ec13ab4f5fb585aabae5f3750727148d7b5be56"}, {file = "codespell-2.2.6.tar.gz", hash = "sha256:a8c65d8eb3faa03deabab6b3bbe798bea72e1799c7e9e955d57eca4096abcff9"},
] ]
[package.extras] [package.extras]
dev = ["Pygments", "build", "chardet", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli"] dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"]
hard-encoding-detection = ["chardet"] hard-encoding-detection = ["chardet"]
toml = ["tomli"] toml = ["tomli"]
types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"] types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"]
@ -921,63 +921,63 @@ files = [
[[package]] [[package]]
name = "coverage" name = "coverage"
version = "7.3.1" version = "7.3.2"
description = "Code coverage measurement for Python" description = "Code coverage measurement for Python"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "coverage-7.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd0f7429ecfd1ff597389907045ff209c8fdb5b013d38cfa7c60728cb484b6e3"}, {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"},
{file = "coverage-7.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:966f10df9b2b2115da87f50f6a248e313c72a668248be1b9060ce935c871f276"}, {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"},
{file = "coverage-7.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0575c37e207bb9b98b6cf72fdaaa18ac909fb3d153083400c2d48e2e6d28bd8e"}, {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"},
{file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:245c5a99254e83875c7fed8b8b2536f040997a9b76ac4c1da5bff398c06e860f"}, {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"},
{file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c96dd7798d83b960afc6c1feb9e5af537fc4908852ef025600374ff1a017392"}, {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"},
{file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:de30c1aa80f30af0f6b2058a91505ea6e36d6535d437520067f525f7df123887"}, {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"},
{file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:50dd1e2dd13dbbd856ffef69196781edff26c800a74f070d3b3e3389cab2600d"}, {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"},
{file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9c0c19f70d30219113b18fe07e372b244fb2a773d4afde29d5a2f7930765136"}, {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"},
{file = "coverage-7.3.1-cp310-cp310-win32.whl", hash = "sha256:770f143980cc16eb601ccfd571846e89a5fe4c03b4193f2e485268f224ab602f"}, {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"},
{file = "coverage-7.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdd088c00c39a27cfa5329349cc763a48761fdc785879220d54eb785c8a38520"}, {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"},
{file = "coverage-7.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74bb470399dc1989b535cb41f5ca7ab2af561e40def22d7e188e0a445e7639e3"}, {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"},
{file = "coverage-7.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:025ded371f1ca280c035d91b43252adbb04d2aea4c7105252d3cbc227f03b375"}, {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"},
{file = "coverage-7.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6191b3a6ad3e09b6cfd75b45c6aeeffe7e3b0ad46b268345d159b8df8d835f9"}, {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"},
{file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb0b188f30e41ddd659a529e385470aa6782f3b412f860ce22b2491c89b8593"}, {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"},
{file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c8f0df9dfd8ff745bccff75867d63ef336e57cc22b2908ee725cc552689ec8"}, {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"},
{file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eb3cd48d54b9bd0e73026dedce44773214064be93611deab0b6a43158c3d5a0"}, {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"},
{file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ac3c5b7e75acac31e490b7851595212ed951889918d398b7afa12736c85e13ce"}, {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"},
{file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b4ee7080878077af0afa7238df1b967f00dc10763f6e1b66f5cced4abebb0a3"}, {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"},
{file = "coverage-7.3.1-cp311-cp311-win32.whl", hash = "sha256:229c0dd2ccf956bf5aeede7e3131ca48b65beacde2029f0361b54bf93d36f45a"}, {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"},
{file = "coverage-7.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6f55d38818ca9596dc9019eae19a47410d5322408140d9a0076001a3dcb938c"}, {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"},
{file = "coverage-7.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5289490dd1c3bb86de4730a92261ae66ea8d44b79ed3cc26464f4c2cde581fbc"}, {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"},
{file = "coverage-7.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca833941ec701fda15414be400c3259479bfde7ae6d806b69e63b3dc423b1832"}, {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"},
{file = "coverage-7.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd694e19c031733e446c8024dedd12a00cda87e1c10bd7b8539a87963685e969"}, {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"},
{file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aab8e9464c00da5cb9c536150b7fbcd8850d376d1151741dd0d16dfe1ba4fd26"}, {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"},
{file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d38444efffd5b056fcc026c1e8d862191881143c3aa80bb11fcf9dca9ae204"}, {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"},
{file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8a07b692129b8a14ad7a37941a3029c291254feb7a4237f245cfae2de78de037"}, {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"},
{file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2829c65c8faaf55b868ed7af3c7477b76b1c6ebeee99a28f59a2cb5907a45760"}, {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"},
{file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f111a7d85658ea52ffad7084088277135ec5f368457275fc57f11cebb15607f"}, {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"},
{file = "coverage-7.3.1-cp312-cp312-win32.whl", hash = "sha256:c397c70cd20f6df7d2a52283857af622d5f23300c4ca8e5bd8c7a543825baa5a"}, {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"},
{file = "coverage-7.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:5ae4c6da8b3d123500f9525b50bf0168023313963e0e2e814badf9000dd6ef92"}, {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"},
{file = "coverage-7.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca70466ca3a17460e8fc9cea7123c8cbef5ada4be3140a1ef8f7b63f2f37108f"}, {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"},
{file = "coverage-7.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f2781fd3cabc28278dc982a352f50c81c09a1a500cc2086dc4249853ea96b981"}, {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"},
{file = "coverage-7.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6407424621f40205bbe6325686417e5e552f6b2dba3535dd1f90afc88a61d465"}, {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"},
{file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04312b036580ec505f2b77cbbdfb15137d5efdfade09156961f5277149f5e344"}, {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"},
{file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9ad38204887349853d7c313f53a7b1c210ce138c73859e925bc4e5d8fc18e7"}, {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"},
{file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:53669b79f3d599da95a0afbef039ac0fadbb236532feb042c534fbb81b1a4e40"}, {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"},
{file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:614f1f98b84eb256e4f35e726bfe5ca82349f8dfa576faabf8a49ca09e630086"}, {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"},
{file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1a317fdf5c122ad642db8a97964733ab7c3cf6009e1a8ae8821089993f175ff"}, {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"},
{file = "coverage-7.3.1-cp38-cp38-win32.whl", hash = "sha256:defbbb51121189722420a208957e26e49809feafca6afeef325df66c39c4fdb3"}, {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"},
{file = "coverage-7.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:f4f456590eefb6e1b3c9ea6328c1e9fa0f1006e7481179d749b3376fc793478e"}, {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"},
{file = "coverage-7.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f12d8b11a54f32688b165fd1a788c408f927b0960984b899be7e4c190ae758f1"}, {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"},
{file = "coverage-7.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f09195dda68d94a53123883de75bb97b0e35f5f6f9f3aa5bf6e496da718f0cb6"}, {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"},
{file = "coverage-7.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6601a60318f9c3945be6ea0f2a80571f4299b6801716f8a6e4846892737ebe4"}, {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"},
{file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d156269718670d00a3b06db2288b48527fc5f36859425ff7cec07c6b367745"}, {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"},
{file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:636a8ac0b044cfeccae76a36f3b18264edcc810a76a49884b96dd744613ec0b7"}, {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"},
{file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5d991e13ad2ed3aced177f524e4d670f304c8233edad3210e02c465351f785a0"}, {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"},
{file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:586649ada7cf139445da386ab6f8ef00e6172f11a939fc3b2b7e7c9082052fa0"}, {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"},
{file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aba512a15a3e1e4fdbfed2f5392ec221434a614cc68100ca99dcad7af29f3f8"}, {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"},
{file = "coverage-7.3.1-cp39-cp39-win32.whl", hash = "sha256:6bc6f3f4692d806831c136c5acad5ccedd0262aa44c087c46b7101c77e139140"}, {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"},
{file = "coverage-7.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:553d7094cb27db58ea91332e8b5681bac107e7242c23f7629ab1316ee73c4981"}, {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"},
{file = "coverage-7.3.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:220eb51f5fb38dfdb7e5d54284ca4d0cd70ddac047d750111a68ab1798945194"}, {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"},
{file = "coverage-7.3.1.tar.gz", hash = "sha256:6cb7fe1581deb67b782c153136541e20901aa312ceedaf1467dcb35255787952"}, {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"},
] ]
[package.extras] [package.extras]
@ -1125,13 +1125,13 @@ graph = ["objgraph (>=1.7.2)"]
[[package]] [[package]]
name = "django" name = "django"
version = "4.2.5" version = "4.2.6"
description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "Django-4.2.5-py3-none-any.whl", hash = "sha256:b6b2b5cae821077f137dc4dade696a1c2aa292f892eca28fa8d7bfdf2608ddd4"}, {file = "Django-4.2.6-py3-none-any.whl", hash = "sha256:a64d2487cdb00ad7461434320ccc38e60af9c404773a2f95ab0093b4453a3215"},
{file = "Django-4.2.5.tar.gz", hash = "sha256:5e5c1c9548ffb7796b4a8a4782e9a2e5a3df3615259fc1bfd3ebc73b646146c1"}, {file = "Django-4.2.6.tar.gz", hash = "sha256:08f41f468b63335aea0d904c5729e0250300f6a1907bf293a65499496cdbc68f"},
] ]
[package.dependencies] [package.dependencies]
@ -1367,13 +1367,13 @@ files = [
[[package]] [[package]]
name = "duo-client" name = "duo-client"
version = "5.0.1" version = "5.1.0"
description = "Reference client for Duo Security APIs" description = "Reference client for Duo Security APIs"
optional = false optional = false
python-versions = "*" python-versions = "*"
files = [ files = [
{file = "duo_client-5.0.1-py2.py3-none-any.whl", hash = "sha256:8159b93a516979ae18e985bbca46ba3bf8ec27cd7ff6db464b37fa667d49c9b5"}, {file = "duo_client-5.1.0-py2.py3-none-any.whl", hash = "sha256:5dd6e7a526ea79952c078e5a5be93a1d70d36e685fad9478188156587e85b571"},
{file = "duo_client-5.0.1.tar.gz", hash = "sha256:a13c47b0cb91e3a0d33b2f99271a0a6c2de17f92dd0ad4c649a366a0533db0c7"}, {file = "duo_client-5.1.0.tar.gz", hash = "sha256:0dd8b7223a105beca4fdbfa71d400e813d9f33250c3da5fd63e437fb571b55f2"},
] ]
[package.dependencies] [package.dependencies]

View file

@ -27436,7 +27436,7 @@ components:
type: boolean type: boolean
description: When enabled, the Phone number is only used during enrollment description: When enabled, the Phone number is only used during enrollment
to verify the users authenticity. Only a hash of the phone number is saved to verify the users authenticity. Only a hash of the phone number is saved
to ensure it is not re-used in the future. to ensure it is not reused in the future.
mapping: mapping:
type: string type: string
format: uuid format: uuid
@ -27493,7 +27493,7 @@ components:
type: boolean type: boolean
description: When enabled, the Phone number is only used during enrollment description: When enabled, the Phone number is only used during enrollment
to verify the users authenticity. Only a hash of the phone number is saved to verify the users authenticity. Only a hash of the phone number is saved
to ensure it is not re-used in the future. to ensure it is not reused in the future.
mapping: mapping:
type: string type: string
format: uuid format: uuid
@ -34530,7 +34530,7 @@ components:
type: boolean type: boolean
description: When enabled, the Phone number is only used during enrollment description: When enabled, the Phone number is only used during enrollment
to verify the users authenticity. Only a hash of the phone number is saved to verify the users authenticity. Only a hash of the phone number is saved
to ensure it is not re-used in the future. to ensure it is not reused in the future.
mapping: mapping:
type: string type: string
format: uuid format: uuid

View file

@ -9,8 +9,8 @@
"@trivago/prettier-plugin-sort-imports": "^4.2.0", "@trivago/prettier-plugin-sort-imports": "^4.2.0",
"@typescript-eslint/eslint-plugin": "^6.7.4", "@typescript-eslint/eslint-plugin": "^6.7.4",
"@typescript-eslint/parser": "^6.7.4", "@typescript-eslint/parser": "^6.7.4",
"@wdio/cli": "^8.16.18", "@wdio/cli": "^8.16.19",
"@wdio/local-runner": "^8.16.18", "@wdio/local-runner": "^8.16.19",
"@wdio/mocha-framework": "^8.16.17", "@wdio/mocha-framework": "^8.16.17",
"@wdio/spec-reporter": "^8.16.17", "@wdio/spec-reporter": "^8.16.17",
"eslint": "^8.49.0", "eslint": "^8.49.0",
@ -1067,14 +1067,14 @@
} }
}, },
"node_modules/@wdio/cli": { "node_modules/@wdio/cli": {
"version": "8.16.18", "version": "8.16.19",
"resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-8.16.18.tgz", "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-8.16.19.tgz",
"integrity": "sha512-BqVFyotsbm8fj2I3zGtCCdr1PozfDFO93uqYRO5EUMs3AFRuPbQXNmqybQhv/tPwolmajDYgFNA/ygyZqVlmzw==", "integrity": "sha512-MGpRrb56kp0n+r/Z0KMe0o4O1dFgBhhjt/O4HC5l0WcPuf5Ew19w1Nr8PoSZ5XqXklGJi0woFh68YZA1MziInA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/node": "^20.1.1", "@types/node": "^20.1.1",
"@wdio/config": "8.16.17", "@wdio/config": "8.16.17",
"@wdio/globals": "8.16.18", "@wdio/globals": "8.16.19",
"@wdio/logger": "8.16.17", "@wdio/logger": "8.16.17",
"@wdio/protocols": "8.16.5", "@wdio/protocols": "8.16.5",
"@wdio/types": "8.16.12", "@wdio/types": "8.16.12",
@ -1093,7 +1093,7 @@
"lodash.union": "^4.6.0", "lodash.union": "^4.6.0",
"read-pkg-up": "10.1.0", "read-pkg-up": "10.1.0",
"recursive-readdir": "^2.2.3", "recursive-readdir": "^2.2.3",
"webdriverio": "8.16.18", "webdriverio": "8.16.19",
"yargs": "^17.7.2", "yargs": "^17.7.2",
"yarn-install": "^1.0.0" "yarn-install": "^1.0.0"
}, },
@ -1104,7 +1104,19 @@
"node": "^16.13 || >=18" "node": "^16.13 || >=18"
} }
}, },
"node_modules/@wdio/cli/node_modules/@wdio/config": { "node_modules/@wdio/cli/node_modules/chalk": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
"dev": true,
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@wdio/config": {
"version": "8.16.17", "version": "8.16.17",
"resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.16.17.tgz", "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.16.17.tgz",
"integrity": "sha512-9+AY73Dp6N/CHzUYe4KbYV8wcKh3mpzBsMKieNlwXi1bQ3AAirTjOXzQ2BoQn6fg/Yd1GxmT3F0YsVS+bF1PmQ==", "integrity": "sha512-9+AY73Dp6N/CHzUYe4KbYV8wcKh3mpzBsMKieNlwXi1bQ3AAirTjOXzQ2BoQn6fg/Yd1GxmT3F0YsVS+bF1PmQ==",
@ -1123,241 +1135,29 @@
"node": "^16.13 || >=18" "node": "^16.13 || >=18"
} }
}, },
"node_modules/@wdio/cli/node_modules/@wdio/globals": {
"version": "8.16.18",
"resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.16.18.tgz",
"integrity": "sha512-sEeKIY5RDrQdp290/AjwM7xH1jxuzK6cydfvdZ428V1ud19i1liaSCBttbTs98FJQ3hSMiczidOyxEUAXtaluw==",
"dev": true,
"engines": {
"node": "^16.13 || >=18"
},
"optionalDependencies": {
"expect-webdriverio": "^4.2.5",
"webdriverio": "8.16.18"
}
},
"node_modules/@wdio/cli/node_modules/@wdio/logger": {
"version": "8.16.17",
"resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.16.17.tgz",
"integrity": "sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==",
"dev": true,
"dependencies": {
"chalk": "^5.1.2",
"loglevel": "^1.6.0",
"loglevel-plugin-prefix": "^0.8.4",
"strip-ansi": "^7.1.0"
},
"engines": {
"node": "^16.13 || >=18"
}
},
"node_modules/@wdio/cli/node_modules/@wdio/utils": {
"version": "8.16.17",
"resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.17.tgz",
"integrity": "sha512-jDyOrxbQRDJO0OPt9UBgnwpUIKqtRn4+R0gR5VSDrIG/in5ZZg28yer8urrIVY4yY9ut5r/22VaMHZI9LEXF5w==",
"dev": true,
"dependencies": {
"@puppeteer/browsers": "^1.6.0",
"@wdio/logger": "8.16.17",
"@wdio/types": "8.16.12",
"decamelize": "^6.0.0",
"deepmerge-ts": "^5.1.0",
"edgedriver": "^5.3.5",
"geckodriver": "^4.2.0",
"get-port": "^7.0.0",
"got": "^13.0.0",
"import-meta-resolve": "^3.0.0",
"locate-app": "^2.1.0",
"safaridriver": "^0.1.0",
"split2": "^4.2.0",
"wait-port": "^1.0.4"
},
"engines": {
"node": "^16.13 || >=18"
}
},
"node_modules/@wdio/cli/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/@wdio/cli/node_modules/chalk": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
"dev": true,
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@wdio/cli/node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@wdio/cli/node_modules/minimatch": {
"version": "9.0.3",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/@wdio/cli/node_modules/webdriver": {
"version": "8.16.17",
"resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.16.17.tgz",
"integrity": "sha512-pG5aEqK6odI9Tr9pr0+1mN6iGqUu5uc5HTVbqbEM6CSX2g035JRVQ/tavFTegCF1HI6yIquHiwAqsfPgLciAnQ==",
"dev": true,
"dependencies": {
"@types/node": "^20.1.0",
"@types/ws": "^8.5.3",
"@wdio/config": "8.16.17",
"@wdio/logger": "8.16.17",
"@wdio/protocols": "8.16.5",
"@wdio/types": "8.16.12",
"@wdio/utils": "8.16.17",
"deepmerge-ts": "^5.1.0",
"got": "^ 12.6.1",
"ky": "^0.33.0",
"ws": "^8.8.0"
},
"engines": {
"node": "^16.13 || >=18"
}
},
"node_modules/@wdio/cli/node_modules/webdriver/node_modules/got": {
"version": "12.6.1",
"resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
"integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==",
"dev": true,
"dependencies": {
"@sindresorhus/is": "^5.2.0",
"@szmarczak/http-timer": "^5.0.1",
"cacheable-lookup": "^7.0.0",
"cacheable-request": "^10.2.8",
"decompress-response": "^6.0.0",
"form-data-encoder": "^2.1.2",
"get-stream": "^6.0.1",
"http2-wrapper": "^2.1.10",
"lowercase-keys": "^3.0.0",
"p-cancelable": "^3.0.0",
"responselike": "^3.0.0"
},
"engines": {
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sindresorhus/got?sponsor=1"
}
},
"node_modules/@wdio/cli/node_modules/webdriverio": {
"version": "8.16.18",
"resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.16.18.tgz",
"integrity": "sha512-4HvywcNYJtEALbBQ7k5CE+XhiU2Ypr3hpd3P2wZkvN7+U2BSIS1cz9V1EtBDmR56e7pLz1La9kS1D3ShWm9NJA==",
"dev": true,
"dependencies": {
"@types/node": "^20.1.0",
"@wdio/config": "8.16.17",
"@wdio/logger": "8.16.17",
"@wdio/protocols": "8.16.5",
"@wdio/repl": "8.10.1",
"@wdio/types": "8.16.12",
"@wdio/utils": "8.16.17",
"archiver": "^6.0.0",
"aria-query": "^5.0.0",
"css-shorthand-properties": "^1.1.1",
"css-value": "^0.0.1",
"devtools-protocol": "^0.0.1188743",
"grapheme-splitter": "^1.0.2",
"import-meta-resolve": "^3.0.0",
"is-plain-obj": "^4.1.0",
"lodash.clonedeep": "^4.5.0",
"lodash.zip": "^4.2.0",
"minimatch": "^9.0.0",
"puppeteer-core": "^20.9.0",
"query-selector-shadow-dom": "^1.0.0",
"resq": "^1.9.1",
"rgb2hex": "0.2.5",
"serialize-error": "^11.0.1",
"webdriver": "8.16.17"
},
"engines": {
"node": "^16.13 || >=18"
},
"peerDependencies": {
"devtools": "^8.14.0"
},
"peerDependenciesMeta": {
"devtools": {
"optional": true
}
}
},
"node_modules/@wdio/config": {
"version": "8.16.12",
"resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.16.12.tgz",
"integrity": "sha512-trpIf4A3OyGKHwbOndkWogy4ph96LQxoNaF6wmypGwAj7mv523+HMICs7v6bheDNc/BHLksOnodNyZ7nb2y+vA==",
"dev": true,
"optional": true,
"dependencies": {
"@wdio/logger": "8.11.0",
"@wdio/types": "8.16.12",
"@wdio/utils": "8.16.12",
"decamelize": "^6.0.0",
"deepmerge-ts": "^5.0.0",
"glob": "^10.2.2",
"import-meta-resolve": "^3.0.0",
"read-pkg-up": "^10.0.0"
},
"engines": {
"node": "^16.13 || >=18"
}
},
"node_modules/@wdio/globals": { "node_modules/@wdio/globals": {
"version": "8.16.12", "version": "8.16.19",
"resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.16.12.tgz", "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.16.19.tgz",
"integrity": "sha512-n/FX3thfrygFH2aSrZAUDwT5hEQZ5GYg70vPiIgytmpW6OYNI3FMryO7/OJuB8HklHqIC+rGDly42rFD84BInQ==", "integrity": "sha512-KziZCYLcEvcsESJm2STkCEUKq2rhIbAP+1lyksULUdMsLoKhqW3yPrb8g6z3qj8G7yAYF8xWpKID0yQejl3UXA==",
"dev": true, "dev": true,
"optional": true,
"engines": { "engines": {
"node": "^16.13 || >=18" "node": "^16.13 || >=18"
}, },
"optionalDependencies": { "optionalDependencies": {
"expect-webdriverio": "^4.2.5", "expect-webdriverio": "^4.2.5",
"webdriverio": "8.16.12" "webdriverio": "8.16.19"
} }
}, },
"node_modules/@wdio/local-runner": { "node_modules/@wdio/local-runner": {
"version": "8.16.18", "version": "8.16.19",
"resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.16.18.tgz", "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.16.19.tgz",
"integrity": "sha512-mRYxIY4PWcL6+8deXSFeUkxA/dr8F+naCaxd6wENRLY6XQqaUJXDn/1RTaUx3ZVEwzyKfnXyX3melyzEKD5FLQ==", "integrity": "sha512-YUGF+7JCWoziFRW9/L+JSxuGKLgRiRXkRJ39iKaW97qS3MckBxLtuB4IY7gt3WJ80iDYo6IWLllRZfWtpvAT/A==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/node": "^20.1.0", "@types/node": "^20.1.0",
"@wdio/logger": "8.16.17", "@wdio/logger": "8.16.17",
"@wdio/repl": "8.10.1", "@wdio/repl": "8.10.1",
"@wdio/runner": "8.16.18", "@wdio/runner": "8.16.19",
"@wdio/types": "8.16.12", "@wdio/types": "8.16.12",
"async-exit-hook": "^2.0.1", "async-exit-hook": "^2.0.1",
"split2": "^4.1.0", "split2": "^4.1.0",
@ -1367,7 +1167,7 @@
"node": "^16.13 || >=18" "node": "^16.13 || >=18"
} }
}, },
"node_modules/@wdio/local-runner/node_modules/@wdio/logger": { "node_modules/@wdio/logger": {
"version": "8.16.17", "version": "8.16.17",
"resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.16.17.tgz", "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.16.17.tgz",
"integrity": "sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==", "integrity": "sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==",
@ -1382,33 +1182,6 @@
"node": "^16.13 || >=18" "node": "^16.13 || >=18"
} }
}, },
"node_modules/@wdio/local-runner/node_modules/chalk": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
"dev": true,
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@wdio/logger": {
"version": "8.11.0",
"resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.11.0.tgz",
"integrity": "sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==",
"dev": true,
"dependencies": {
"chalk": "^5.1.2",
"loglevel": "^1.6.0",
"loglevel-plugin-prefix": "^0.8.4",
"strip-ansi": "^7.1.0"
},
"engines": {
"node": "^16.13 || >=18"
}
},
"node_modules/@wdio/logger/node_modules/chalk": { "node_modules/@wdio/logger/node_modules/chalk": {
"version": "5.3.0", "version": "5.3.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
@ -1438,58 +1211,6 @@
"node": "^16.13 || >=18" "node": "^16.13 || >=18"
} }
}, },
"node_modules/@wdio/mocha-framework/node_modules/@wdio/logger": {
"version": "8.16.17",
"resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.16.17.tgz",
"integrity": "sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==",
"dev": true,
"dependencies": {
"chalk": "^5.1.2",
"loglevel": "^1.6.0",
"loglevel-plugin-prefix": "^0.8.4",
"strip-ansi": "^7.1.0"
},
"engines": {
"node": "^16.13 || >=18"
}
},
"node_modules/@wdio/mocha-framework/node_modules/@wdio/utils": {
"version": "8.16.17",
"resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.17.tgz",
"integrity": "sha512-jDyOrxbQRDJO0OPt9UBgnwpUIKqtRn4+R0gR5VSDrIG/in5ZZg28yer8urrIVY4yY9ut5r/22VaMHZI9LEXF5w==",
"dev": true,
"dependencies": {
"@puppeteer/browsers": "^1.6.0",
"@wdio/logger": "8.16.17",
"@wdio/types": "8.16.12",
"decamelize": "^6.0.0",
"deepmerge-ts": "^5.1.0",
"edgedriver": "^5.3.5",
"geckodriver": "^4.2.0",
"get-port": "^7.0.0",
"got": "^13.0.0",
"import-meta-resolve": "^3.0.0",
"locate-app": "^2.1.0",
"safaridriver": "^0.1.0",
"split2": "^4.2.0",
"wait-port": "^1.0.4"
},
"engines": {
"node": "^16.13 || >=18"
}
},
"node_modules/@wdio/mocha-framework/node_modules/chalk": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
"dev": true,
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@wdio/protocols": { "node_modules/@wdio/protocols": {
"version": "8.16.5", "version": "8.16.5",
"resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.16.5.tgz", "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.16.5.tgz",
@ -1524,42 +1245,15 @@
"node": "^16.13 || >=18" "node": "^16.13 || >=18"
} }
}, },
"node_modules/@wdio/reporter/node_modules/@wdio/logger": {
"version": "8.16.17",
"resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.16.17.tgz",
"integrity": "sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==",
"dev": true,
"dependencies": {
"chalk": "^5.1.2",
"loglevel": "^1.6.0",
"loglevel-plugin-prefix": "^0.8.4",
"strip-ansi": "^7.1.0"
},
"engines": {
"node": "^16.13 || >=18"
}
},
"node_modules/@wdio/reporter/node_modules/chalk": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
"dev": true,
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@wdio/runner": { "node_modules/@wdio/runner": {
"version": "8.16.18", "version": "8.16.19",
"resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.16.18.tgz", "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.16.19.tgz",
"integrity": "sha512-c30CQQjb7xc7SwvZ9pvPRpt68y1evV9igo7prvrm8pUObibGDCJFwg1b8i19BmS8x4aMG2FOeQjHvjbgyAHixA==", "integrity": "sha512-CzLxlxcRfIVzTKGeo+TO5rUmmWHjUUdRaM6/6UGNFhFCcYW5rLvfHd1ojpU7ZKxBIc/bz2RGw2/cQ8KgQbFR3g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/node": "^20.1.0", "@types/node": "^20.1.0",
"@wdio/config": "8.16.17", "@wdio/config": "8.16.17",
"@wdio/globals": "8.16.18", "@wdio/globals": "8.16.19",
"@wdio/logger": "8.16.17", "@wdio/logger": "8.16.17",
"@wdio/types": "8.16.12", "@wdio/types": "8.16.12",
"@wdio/utils": "8.16.17", "@wdio/utils": "8.16.17",
@ -1567,222 +1261,12 @@
"expect-webdriverio": "^4.2.5", "expect-webdriverio": "^4.2.5",
"gaze": "^1.1.2", "gaze": "^1.1.2",
"webdriver": "8.16.17", "webdriver": "8.16.17",
"webdriverio": "8.16.18" "webdriverio": "8.16.19"
}, },
"engines": { "engines": {
"node": "^16.13 || >=18" "node": "^16.13 || >=18"
} }
}, },
"node_modules/@wdio/runner/node_modules/@wdio/config": {
"version": "8.16.17",
"resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.16.17.tgz",
"integrity": "sha512-9+AY73Dp6N/CHzUYe4KbYV8wcKh3mpzBsMKieNlwXi1bQ3AAirTjOXzQ2BoQn6fg/Yd1GxmT3F0YsVS+bF1PmQ==",
"dev": true,
"dependencies": {
"@wdio/logger": "8.16.17",
"@wdio/types": "8.16.12",
"@wdio/utils": "8.16.17",
"decamelize": "^6.0.0",
"deepmerge-ts": "^5.0.0",
"glob": "^10.2.2",
"import-meta-resolve": "^3.0.0",
"read-pkg-up": "^10.0.0"
},
"engines": {
"node": "^16.13 || >=18"
}
},
"node_modules/@wdio/runner/node_modules/@wdio/globals": {
"version": "8.16.18",
"resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.16.18.tgz",
"integrity": "sha512-sEeKIY5RDrQdp290/AjwM7xH1jxuzK6cydfvdZ428V1ud19i1liaSCBttbTs98FJQ3hSMiczidOyxEUAXtaluw==",
"dev": true,
"engines": {
"node": "^16.13 || >=18"
},
"optionalDependencies": {
"expect-webdriverio": "^4.2.5",
"webdriverio": "8.16.18"
}
},
"node_modules/@wdio/runner/node_modules/@wdio/logger": {
"version": "8.16.17",
"resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.16.17.tgz",
"integrity": "sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==",
"dev": true,
"dependencies": {
"chalk": "^5.1.2",
"loglevel": "^1.6.0",
"loglevel-plugin-prefix": "^0.8.4",
"strip-ansi": "^7.1.0"
},
"engines": {
"node": "^16.13 || >=18"
}
},
"node_modules/@wdio/runner/node_modules/@wdio/utils": {
"version": "8.16.17",
"resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.17.tgz",
"integrity": "sha512-jDyOrxbQRDJO0OPt9UBgnwpUIKqtRn4+R0gR5VSDrIG/in5ZZg28yer8urrIVY4yY9ut5r/22VaMHZI9LEXF5w==",
"dev": true,
"dependencies": {
"@puppeteer/browsers": "^1.6.0",
"@wdio/logger": "8.16.17",
"@wdio/types": "8.16.12",
"decamelize": "^6.0.0",
"deepmerge-ts": "^5.1.0",
"edgedriver": "^5.3.5",
"geckodriver": "^4.2.0",
"get-port": "^7.0.0",
"got": "^13.0.0",
"import-meta-resolve": "^3.0.0",
"locate-app": "^2.1.0",
"safaridriver": "^0.1.0",
"split2": "^4.2.0",
"wait-port": "^1.0.4"
},
"engines": {
"node": "^16.13 || >=18"
}
},
"node_modules/@wdio/runner/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/@wdio/runner/node_modules/chalk": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
"dev": true,
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@wdio/runner/node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@wdio/runner/node_modules/minimatch": {
"version": "9.0.3",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/@wdio/runner/node_modules/webdriver": {
"version": "8.16.17",
"resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.16.17.tgz",
"integrity": "sha512-pG5aEqK6odI9Tr9pr0+1mN6iGqUu5uc5HTVbqbEM6CSX2g035JRVQ/tavFTegCF1HI6yIquHiwAqsfPgLciAnQ==",
"dev": true,
"dependencies": {
"@types/node": "^20.1.0",
"@types/ws": "^8.5.3",
"@wdio/config": "8.16.17",
"@wdio/logger": "8.16.17",
"@wdio/protocols": "8.16.5",
"@wdio/types": "8.16.12",
"@wdio/utils": "8.16.17",
"deepmerge-ts": "^5.1.0",
"got": "^ 12.6.1",
"ky": "^0.33.0",
"ws": "^8.8.0"
},
"engines": {
"node": "^16.13 || >=18"
}
},
"node_modules/@wdio/runner/node_modules/webdriver/node_modules/got": {
"version": "12.6.1",
"resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
"integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==",
"dev": true,
"dependencies": {
"@sindresorhus/is": "^5.2.0",
"@szmarczak/http-timer": "^5.0.1",
"cacheable-lookup": "^7.0.0",
"cacheable-request": "^10.2.8",
"decompress-response": "^6.0.0",
"form-data-encoder": "^2.1.2",
"get-stream": "^6.0.1",
"http2-wrapper": "^2.1.10",
"lowercase-keys": "^3.0.0",
"p-cancelable": "^3.0.0",
"responselike": "^3.0.0"
},
"engines": {
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sindresorhus/got?sponsor=1"
}
},
"node_modules/@wdio/runner/node_modules/webdriverio": {
"version": "8.16.18",
"resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.16.18.tgz",
"integrity": "sha512-4HvywcNYJtEALbBQ7k5CE+XhiU2Ypr3hpd3P2wZkvN7+U2BSIS1cz9V1EtBDmR56e7pLz1La9kS1D3ShWm9NJA==",
"dev": true,
"dependencies": {
"@types/node": "^20.1.0",
"@wdio/config": "8.16.17",
"@wdio/logger": "8.16.17",
"@wdio/protocols": "8.16.5",
"@wdio/repl": "8.10.1",
"@wdio/types": "8.16.12",
"@wdio/utils": "8.16.17",
"archiver": "^6.0.0",
"aria-query": "^5.0.0",
"css-shorthand-properties": "^1.1.1",
"css-value": "^0.0.1",
"devtools-protocol": "^0.0.1188743",
"grapheme-splitter": "^1.0.2",
"import-meta-resolve": "^3.0.0",
"is-plain-obj": "^4.1.0",
"lodash.clonedeep": "^4.5.0",
"lodash.zip": "^4.2.0",
"minimatch": "^9.0.0",
"puppeteer-core": "^20.9.0",
"query-selector-shadow-dom": "^1.0.0",
"resq": "^1.9.1",
"rgb2hex": "0.2.5",
"serialize-error": "^11.0.1",
"webdriver": "8.16.17"
},
"engines": {
"node": "^16.13 || >=18"
},
"peerDependencies": {
"devtools": "^8.14.0"
},
"peerDependenciesMeta": {
"devtools": {
"optional": true
}
}
},
"node_modules/@wdio/spec-reporter": { "node_modules/@wdio/spec-reporter": {
"version": "8.16.17", "version": "8.16.17",
"resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.16.17.tgz", "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.16.17.tgz",
@ -1824,14 +1308,13 @@
} }
}, },
"node_modules/@wdio/utils": { "node_modules/@wdio/utils": {
"version": "8.16.12", "version": "8.16.17",
"resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.12.tgz", "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.17.tgz",
"integrity": "sha512-4hXgUF5iAscZKZ6uBcV12XkKi/eOXgvF76VkCTZ4qdeaiwFY27xcd8S3BSkAMKdbEgGygrpiTKoJzSt4K0AIHg==", "integrity": "sha512-jDyOrxbQRDJO0OPt9UBgnwpUIKqtRn4+R0gR5VSDrIG/in5ZZg28yer8urrIVY4yY9ut5r/22VaMHZI9LEXF5w==",
"dev": true, "dev": true,
"optional": true,
"dependencies": { "dependencies": {
"@puppeteer/browsers": "^1.6.0", "@puppeteer/browsers": "^1.6.0",
"@wdio/logger": "8.11.0", "@wdio/logger": "8.16.17",
"@wdio/types": "8.16.12", "@wdio/types": "8.16.12",
"decamelize": "^6.0.0", "decamelize": "^6.0.0",
"deepmerge-ts": "^5.1.0", "deepmerge-ts": "^5.1.0",
@ -3115,7 +2598,8 @@
"version": "0.0.1188743", "version": "0.0.1188743",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1188743.tgz", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1188743.tgz",
"integrity": "sha512-FZDQC58vLiGR2mjSgsMzU8aEJieovMonIyxf38b775eYdIfAYgSzyAWnDf0Eq6ouF/L9qcbqR8jcQeIC34jp/w==", "integrity": "sha512-FZDQC58vLiGR2mjSgsMzU8aEJieovMonIyxf38b775eYdIfAYgSzyAWnDf0Eq6ouF/L9qcbqR8jcQeIC34jp/w==",
"dev": true "dev": true,
"peer": true
}, },
"node_modules/diff": { "node_modules/diff": {
"version": "5.1.0", "version": "5.1.0",
@ -9210,19 +8694,18 @@
} }
}, },
"node_modules/webdriver": { "node_modules/webdriver": {
"version": "8.16.12", "version": "8.16.17",
"resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.16.12.tgz", "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.16.17.tgz",
"integrity": "sha512-v6I7S7y28QvtKEJL8ciVPJ7heh4GWTf+fS0/+dowBD2UrSFb3stC47U9idVqU18UNoQFQ2FbdWBaOLXSi9xlTg==", "integrity": "sha512-pG5aEqK6odI9Tr9pr0+1mN6iGqUu5uc5HTVbqbEM6CSX2g035JRVQ/tavFTegCF1HI6yIquHiwAqsfPgLciAnQ==",
"dev": true, "dev": true,
"optional": true,
"dependencies": { "dependencies": {
"@types/node": "^20.1.0", "@types/node": "^20.1.0",
"@types/ws": "^8.5.3", "@types/ws": "^8.5.3",
"@wdio/config": "8.16.12", "@wdio/config": "8.16.17",
"@wdio/logger": "8.11.0", "@wdio/logger": "8.16.17",
"@wdio/protocols": "8.16.5", "@wdio/protocols": "8.16.5",
"@wdio/types": "8.16.12", "@wdio/types": "8.16.12",
"@wdio/utils": "8.16.12", "@wdio/utils": "8.16.17",
"deepmerge-ts": "^5.1.0", "deepmerge-ts": "^5.1.0",
"got": "^ 12.6.1", "got": "^ 12.6.1",
"ky": "^0.33.0", "ky": "^0.33.0",
@ -9237,7 +8720,6 @@
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true, "dev": true,
"optional": true,
"engines": { "engines": {
"node": ">=10" "node": ">=10"
}, },
@ -9250,7 +8732,6 @@
"resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
"integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==",
"dev": true, "dev": true,
"optional": true,
"dependencies": { "dependencies": {
"@sindresorhus/is": "^5.2.0", "@sindresorhus/is": "^5.2.0",
"@szmarczak/http-timer": "^5.0.1", "@szmarczak/http-timer": "^5.0.1",
@ -9272,24 +8753,23 @@
} }
}, },
"node_modules/webdriverio": { "node_modules/webdriverio": {
"version": "8.16.12", "version": "8.16.19",
"resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.16.12.tgz", "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.16.19.tgz",
"integrity": "sha512-JglXAu7mhlWh3sexc4owKREQfuh8JFm9O+uPd8JXYaFmSLFX/PBhgPkhb9dLRRfX00oSeb3e8rVdQfcdqdQ2Iw==", "integrity": "sha512-b63vRWWuLq7OKYTLMdCn+uvTW48sMFepEyrv8MKFJproaSOCcokw7sqJ/EcQFmqIgrZxKL/mDch+QKjxlW0ORw==",
"dev": true, "dev": true,
"optional": true,
"dependencies": { "dependencies": {
"@types/node": "^20.1.0", "@types/node": "^20.1.0",
"@wdio/config": "8.16.12", "@wdio/config": "8.16.17",
"@wdio/logger": "8.11.0", "@wdio/logger": "8.16.17",
"@wdio/protocols": "8.16.5", "@wdio/protocols": "8.16.5",
"@wdio/repl": "8.10.1", "@wdio/repl": "8.10.1",
"@wdio/types": "8.16.12", "@wdio/types": "8.16.12",
"@wdio/utils": "8.16.12", "@wdio/utils": "8.16.17",
"archiver": "^6.0.0", "archiver": "^6.0.0",
"aria-query": "^5.0.0", "aria-query": "^5.0.0",
"css-shorthand-properties": "^1.1.1", "css-shorthand-properties": "^1.1.1",
"css-value": "^0.0.1", "css-value": "^0.0.1",
"devtools-protocol": "^0.0.1188743", "devtools-protocol": "^0.0.1203626",
"grapheme-splitter": "^1.0.2", "grapheme-splitter": "^1.0.2",
"import-meta-resolve": "^3.0.0", "import-meta-resolve": "^3.0.0",
"is-plain-obj": "^4.1.0", "is-plain-obj": "^4.1.0",
@ -9301,7 +8781,7 @@
"resq": "^1.9.1", "resq": "^1.9.1",
"rgb2hex": "0.2.5", "rgb2hex": "0.2.5",
"serialize-error": "^11.0.1", "serialize-error": "^11.0.1",
"webdriver": "8.16.12" "webdriver": "8.16.17"
}, },
"engines": { "engines": {
"node": "^16.13 || >=18" "node": "^16.13 || >=18"
@ -9320,17 +8800,21 @@
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true, "dev": true,
"optional": true,
"dependencies": { "dependencies": {
"balanced-match": "^1.0.0" "balanced-match": "^1.0.0"
} }
}, },
"node_modules/webdriverio/node_modules/devtools-protocol": {
"version": "0.0.1203626",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1203626.tgz",
"integrity": "sha512-nEzHZteIUZfGCZtTiS1fRpC8UZmsfD1SiyPvaUNvS13dvKf666OAm8YTi0+Ca3n1nLEyu49Cy4+dPWpaHFJk9g==",
"dev": true
},
"node_modules/webdriverio/node_modules/minimatch": { "node_modules/webdriverio/node_modules/minimatch": {
"version": "9.0.3", "version": "9.0.3",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
"dev": true, "dev": true,
"optional": true,
"dependencies": { "dependencies": {
"brace-expansion": "^2.0.1" "brace-expansion": "^2.0.1"
}, },

View file

@ -6,8 +6,8 @@
"@trivago/prettier-plugin-sort-imports": "^4.2.0", "@trivago/prettier-plugin-sort-imports": "^4.2.0",
"@typescript-eslint/eslint-plugin": "^6.7.4", "@typescript-eslint/eslint-plugin": "^6.7.4",
"@typescript-eslint/parser": "^6.7.4", "@typescript-eslint/parser": "^6.7.4",
"@wdio/cli": "^8.16.18", "@wdio/cli": "^8.16.19",
"@wdio/local-runner": "^8.16.18", "@wdio/local-runner": "^8.16.19",
"@wdio/mocha-framework": "^8.16.17", "@wdio/mocha-framework": "^8.16.17",
"@wdio/spec-reporter": "^8.16.17", "@wdio/spec-reporter": "^8.16.17",
"eslint": "^8.49.0", "eslint": "^8.49.0",

View file

@ -1,21 +0,0 @@
import AdminPage from "./admin.page.js";
import { $ } from "@wdio/globals";
/**
* sub page containing specific selectors and methods for a specific page
*/
class ApplicationsListPage extends AdminPage {
/**
* define selectors using getter methods
*/
get startWizardButton() {
return $('>>>ak-wizard-frame button[slot="trigger"]');
}
async open() {
return await super.open("if/admin/#/core/applications");
}
}
export default new ApplicationsListPage();

View file

@ -1,4 +1,5 @@
import Page from "../page.js"; import Page from "../page.js";
import { $ } from "@wdio/globals";
export class OauthForm extends Page { export class OauthForm extends Page {
async setAuthorizationFlow(selector: string) { async setAuthorizationFlow(selector: string) {
@ -8,6 +9,10 @@ export class OauthForm extends Page {
`button*=${selector}`, `button*=${selector}`,
); );
} }
get providerName() {
return $('>>>ak-form-element-horizontal[name="name"] input');
}
} }
export default new OauthForm(); export default new OauthForm();

View file

@ -40,7 +40,7 @@ export default class Page {
} }
public async logout() { public async logout() {
await browser.url('http://localhost:9000/flows/-/default/invalidation/'); await browser.url("http://localhost:9000/flows/-/default/invalidation/");
return await this.pause() return await this.pause();
} }
} }

View file

@ -0,0 +1,53 @@
import AdminPage from "./admin.page.js";
import OauthForm from "./forms/oauth.form.js";
import { $ } from "@wdio/globals";
/**
* sub page containing specific selectors and methods for a specific page
*/
class ProviderWizardView extends AdminPage {
/**
* define selectors using getter methods
*/
oauth = OauthForm;
get wizardTitle() {
return $(">>>ak-wizard .pf-c-wizard__header h1.pf-c-title");
}
get providerList() {
return $(">>>ak-provider-wizard-initial");
}
get nextButton() {
return $(">>>ak-wizard footer button.pf-m-primary");
}
async getProviderType(type: string) {
return await this.providerList.$(`>>>input[value="${type}"]`);
}
get successMessage() {
return $('>>>[data-commit-state="success"]');
}
}
type Pair = [string, string];
// Define a getter for each provider type in the radio button collection.
const providerValues: Pair[] = [["oauth2", "oauth2Provider"]];
providerValues.forEach(([value, name]: Pair) => {
Object.defineProperties(ProviderWizardView.prototype, {
[name]: {
get: function () {
return this.providerList.$(`>>>input[id="ak-provider-${value}-form"]`);
},
},
});
});
export default new ProviderWizardView();

View file

@ -0,0 +1,47 @@
import AdminPage from "./admin.page.js";
import { $, browser } from "@wdio/globals";
import { Key } from "webdriverio";
/**
* sub page containing specific selectors and methods for a specific page
*/
class ApplicationsListPage extends AdminPage {
/**
* define selectors using getter methods
*/
get startWizardButton() {
return $('>>>ak-wizard button[slot="trigger"]');
}
get searchInput() {
return $('>>>ak-table-search input[name="search"]');
}
searchButton() {
return $('>>>ak-table-search button[type="submit"]');
}
// Sufficiently esoteric to justify having its own method
async clickSearchButton() {
await browser.execute(
function (searchButton: unknown) {
(searchButton as HTMLButtonElement).focus();
},
await $('>>>ak-table-search button[type="submit"]'),
);
return await browser.action("key").down(Key.Enter).up(Key.Enter).perform();
}
// Only use after a very precise search. :-)
async findProviderRow() {
return await $(">>>ak-provider-list td a");
}
async open() {
return await super.open("if/admin/#/core/providers");
}
}
export default new ApplicationsListPage();

View file

@ -0,0 +1,46 @@
import ProviderWizardView from "../pageobjects/provider-wizard.page.js";
import ProvidersListPage from "../pageobjects/providers-list.page.js";
import { randomId } from "../utils/index.js";
import { login } from "../utils/login.js";
import { expect } from "@wdio/globals";
async function reachTheProvider() {
await ProvidersListPage.logout();
await login();
await ProvidersListPage.open();
await expect(await ProvidersListPage.pageHeader).toHaveText("Providers");
await ProvidersListPage.startWizardButton.click();
await ProviderWizardView.wizardTitle.waitForDisplayed();
await expect(await ProviderWizardView.wizardTitle).toHaveText("New provider");
}
describe("Configure Oauth2 Providers", () => {
it("Should configure a simple LDAP Application", async () => {
const newProviderName = `New OAuth2 Provider - ${randomId()}`;
await reachTheProvider();
await ProviderWizardView.providerList.waitForDisplayed();
await ProviderWizardView.oauth2Provider.scrollIntoView();
await ProviderWizardView.oauth2Provider.click();
await ProviderWizardView.nextButton.click();
await ProviderWizardView.pause();
await ProviderWizardView.oauth.providerName.setValue(newProviderName);
await ProviderWizardView.oauth.setAuthorizationFlow(
"default-provider-authorization-explicit-consent",
);
await ProviderWizardView.nextButton.click();
await ProviderWizardView.pause();
await ProvidersListPage.searchInput.setValue(newProviderName);
await ProvidersListPage.clickSearchButton();
await ProvidersListPage.pause();
const newProvider = await ProvidersListPage.findProviderRow(newProviderName);
await newProvider.waitForDisplayed();
expect(newProvider).toExist();
expect(await newProvider.getText()).toHaveText(newProviderName);
});
});

1915
web/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -35,7 +35,7 @@
"@codemirror/theme-one-dark": "^6.1.2", "@codemirror/theme-one-dark": "^6.1.2",
"@formatjs/intl-listformat": "^7.4.2", "@formatjs/intl-listformat": "^7.4.2",
"@fortawesome/fontawesome-free": "^6.4.2", "@fortawesome/fontawesome-free": "^6.4.2",
"@goauthentik/api": "^2023.8.3-1694987749", "@goauthentik/api": "^2023.8.3-1696335052",
"@lit-labs/context": "^0.4.1", "@lit-labs/context": "^0.4.1",
"@lit-labs/task": "^3.0.2", "@lit-labs/task": "^3.0.2",
"@lit/localize": "^0.11.4", "@lit/localize": "^0.11.4",
@ -79,11 +79,11 @@
"@rollup/plugin-replace": "^5.0.2", "@rollup/plugin-replace": "^5.0.2",
"@rollup/plugin-terser": "^0.4.3", "@rollup/plugin-terser": "^0.4.3",
"@rollup/plugin-typescript": "^11.1.4", "@rollup/plugin-typescript": "^11.1.4",
"@storybook/addon-essentials": "^7.4.5", "@storybook/addon-essentials": "^7.4.6",
"@storybook/addon-links": "^7.4.5", "@storybook/addon-links": "^7.4.6",
"@storybook/blocks": "^7.1.1", "@storybook/blocks": "^7.1.1",
"@storybook/web-components": "^7.4.5", "@storybook/web-components": "^7.4.6",
"@storybook/web-components-vite": "^7.4.5", "@storybook/web-components-vite": "^7.4.6",
"@trivago/prettier-plugin-sort-imports": "^4.2.0", "@trivago/prettier-plugin-sort-imports": "^4.2.0",
"@types/chart.js": "^2.9.38", "@types/chart.js": "^2.9.38",
"@types/codemirror": "5.60.10", "@types/codemirror": "5.60.10",
@ -102,14 +102,14 @@
"lit-analyzer": "^1.2.1", "lit-analyzer": "^1.2.1",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"prettier": "^3.0.3", "prettier": "^3.0.3",
"pyright": "^1.1.329", "pyright": "^1.1.330",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"rollup": "^3.29.4", "rollup": "^3.29.4",
"rollup-plugin-copy": "^3.5.0", "rollup-plugin-copy": "^3.5.0",
"rollup-plugin-cssimport": "^1.0.3", "rollup-plugin-cssimport": "^1.0.3",
"rollup-plugin-postcss-lit": "^2.1.0", "rollup-plugin-postcss-lit": "^2.1.0",
"storybook": "^7.4.5", "storybook": "^7.4.6",
"storybook-addon-mock": "^4.3.0", "storybook-addon-mock": "^4.3.0",
"ts-lit-plugin": "^1.2.1", "ts-lit-plugin": "^1.2.1",
"tslib": "^2.6.2", "tslib": "^2.6.2",

View file

@ -92,7 +92,7 @@ export class PolicyBindingForm extends ModelForm<PolicyBinding, string> {
data.group = null; data.group = null;
break; break;
} }
console.log(data);
if (this.instance?.pk) { if (this.instance?.pk) {
return new PoliciesApi(DEFAULT_CONFIG).policiesBindingsUpdate({ return new PoliciesApi(DEFAULT_CONFIG).policiesBindingsUpdate({
policyBindingUuid: this.instance.pk, policyBindingUuid: this.instance.pk,

View file

@ -190,7 +190,7 @@ export class ProxyProviderFormPage extends ModelForm<ProxyProvider, number> {
case ProxyMode.ForwardSingle: case ProxyMode.ForwardSingle:
return html`<p class="pf-u-mb-xl"> return html`<p class="pf-u-mb-xl">
${msg( ${msg(
"Use this provider with nginx's auth_request or traefik's forwardAuth. Each application/domain needs its own provider. Additionally, on each domain, /outpost.goauthentik.io must be routed to the outpost (when using a manged outpost, this is done for you).", "Use this provider with nginx's auth_request or traefik's forwardAuth. Each application/domain needs its own provider. Additionally, on each domain, /outpost.goauthentik.io must be routed to the outpost (when using a managed outpost, this is done for you).",
)} )}
</p> </p>
<ak-form-element-horizontal <ak-form-element-horizontal

View file

@ -79,7 +79,7 @@ html > form > input {
.pf-c-login__footer { .pf-c-login__footer {
flex-grow: 2; flex-grow: 2;
display: flex; display: flex;
justify-content: start; justify-content: end;
flex-direction: column; flex-direction: column;
} }
.pf-c-login__footer ul.pf-c-list.pf-m-inline { .pf-c-login__footer ul.pf-c-list.pf-m-inline {

View file

@ -13,7 +13,7 @@ import { Application } from "@goauthentik/api";
@customElement("ak-app-icon") @customElement("ak-app-icon")
export class AppIcon extends AKElement { export class AppIcon extends AKElement {
@property({ attribute: false }) @property({ type: Object, attribute: false })
app?: Application; app?: Application;
@property() @property()

View file

@ -48,3 +48,5 @@ export class AkNumberInput extends AKElement {
</ak-form-element-horizontal> `; </ak-form-element-horizontal> `;
} }
} }
export default AkNumberInput;

View file

@ -1,5 +1,6 @@
import { AKElement } from "@goauthentik/elements/Base"; import { AKElement } from "@goauthentik/elements/Base";
import { RadioOption } from "@goauthentik/elements/forms/Radio"; import { RadioOption } from "@goauthentik/elements/forms/Radio";
import "@goauthentik/elements/forms/Radio";
import { html, nothing } from "lit"; import { html, nothing } from "lit";
import { customElement, property } from "lit/decorators.js"; import { customElement, property } from "lit/decorators.js";
@ -35,13 +36,21 @@ export class AkRadioInput<T> extends AKElement {
@property({ type: Array }) @property({ type: Array })
options: RadioOption<T>[] = []; options: RadioOption<T>[] = [];
handleInput(ev: CustomEvent) {
this.value = ev.detail.value;
}
render() { render() {
return html`<ak-form-element-horizontal return html`<ak-form-element-horizontal
label=${this.label} label=${this.label}
?required=${this.required} ?required=${this.required}
name=${this.name} name=${this.name}
> >
<ak-radio .options=${this.options} .value=${this.value}></ak-radio> <ak-radio
.options=${this.options}
.value=${this.value}
@input=${this.handleInput}
></ak-radio>
${this.help.trim() ${this.help.trim()
? html`<p class="pf-c-form__helper-radio">${this.help}</p>` ? html`<p class="pf-c-form__helper-radio">${this.help}</p>`
: nothing} : nothing}

View file

@ -83,40 +83,46 @@ export class AkSlugInput extends AKElement {
} }
slugify(ev: Event) { slugify(ev: Event) {
if (!(ev && ev.target && ev.target instanceof HTMLInputElement)) {
return;
}
// Reset 'touched' status if the slug & target have been reset
if (ev.target.value === "" && this.input.value === "") {
this.touched = false;
}
// Don't proceed if the user has hand-modified the slug
if (this.touched) {
return;
}
// A very primitive heuristic: if the previous iteration of the slug and the current // A very primitive heuristic: if the previous iteration of the slug and the current
// iteration are *similar enough*, set the input value. "Similar enough" here is defined as // iteration are *similar enough*, set the input value. "Similar enough" here is defined as
// "any event which adds or removes a character but leaves the rest of the slug looking like // "any event which adds or removes a character but leaves the rest of the slug looking like
// the previous iteration, set it to the current iteration." // the previous iteration, set it to the current iteration."
if (ev && ev.target && ev.target instanceof HTMLInputElement) { const newSlug = convertToSlug(ev.target.value);
if (this.touched) { const oldSlug = this.input.value;
if (ev.target.value === "" && this.input.value === "") { const [shorter, longer] =
this.touched = false; newSlug.length < oldSlug.length ? [newSlug, oldSlug] : [oldSlug, newSlug];
} else {
return;
}
}
const newSlug = convertToSlug(ev.target.value); if (longer.substring(0, shorter.length) !== shorter) {
const oldSlug = this.input.value; return;
const [shorter, longer] =
newSlug.length < oldSlug.length ? [newSlug, oldSlug] : [oldSlug, newSlug];
if (longer.substring(0, shorter.length) === shorter) {
this.input.value = newSlug;
// The browser, as a security measure, sets the originating HTML object to be the
// target; developers cannot change it. In order to provide a meaningful value
// to listeners, both the name and value of the host must match those of the target
// input. The name is already handled since it's both required and automatically
// forwarded to our templated input, but the value must also be set.
this.value = this.input.value;
this.dispatchEvent(
new Event("input", {
bubbles: true,
cancelable: true,
}),
);
}
} }
// The browser, as a security measure, sets the originating HTML object to be the
// target; developers cannot change it. In order to provide a meaningful value
// to listeners, both the name and value of the host must match those of the target
// input. The name is already handled since it's both required and automatically
// forwarded to our templated input, but the value must also be set.
this.value = this.input.value = newSlug;
this.dispatchEvent(
new Event("input", {
bubbles: true,
cancelable: true,
}),
);
} }
connectedCallback() { connectedCallback() {
@ -160,3 +166,5 @@ export class AkSlugInput extends AKElement {
</ak-form-element-horizontal> `; </ak-form-element-horizontal> `;
} }
} }
export default AkSlugInput;

View file

@ -62,3 +62,5 @@ export class AkTextInput extends AKElement {
</ak-form-element-horizontal> `; </ak-form-element-horizontal> `;
} }
} }
export default AkTextInput;

View file

@ -54,3 +54,5 @@ ${this.value !== undefined ? this.value : ""}</textarea
</ak-form-element-horizontal> `; </ak-form-element-horizontal> `;
} }
} }
export default AkTextareaInput;

View file

@ -0,0 +1,38 @@
import "@goauthentik/elements/messages/MessageContainer";
import { Meta } from "@storybook/web-components";
import { TemplateResult, html } from "lit";
import "../ak-app-icon";
import AkAppIcon from "../ak-app-icon";
const metadata: Meta<AkAppIcon> = {
title: "Components / App Icon",
component: "ak-app-icon",
parameters: {
docs: {
description: {
component: "A small card displaying an application icon",
},
},
},
};
export default metadata;
const container = (testItem: TemplateResult) =>
html` <div style="background: #000; padding: 2em">
<style>
li {
display: block;
}
p {
margin-top: 1em;
}
</style>
${testItem}
</div>`;
export const AppIcon = () => {
return container(html`<ak-app-icon .app=${{ name: "Demo app" }} size="pf-m-md"></ak-app-icon>`);
};

View file

@ -0,0 +1,55 @@
import "@goauthentik/elements/messages/MessageContainer";
import { Meta } from "@storybook/web-components";
import { TemplateResult, html } from "lit";
import "../ak-number-input";
import AkNumberInput from "../ak-number-input";
const metadata: Meta<AkNumberInput> = {
title: "Components / Number Input",
component: "ak-number-input",
parameters: {
docs: {
description: {
component: "A stylized value control for number input",
},
},
},
};
export default metadata;
const container = (testItem: TemplateResult) =>
html` <div style="background: #000; padding: 2em">
<style>
li {
display: block;
}
p {
margin-top: 1em;
}
</style>
${testItem}
<ul id="number-message-pad" style="color: #fff; margin-top: 1em"></ul>
</div>`;
export const NumberInput = () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const displayChange = (ev: any) => {
document.getElementById(
"number-message-pad",
)!.innerText = `Value selected: ${JSON.stringify(ev.target.value, null, 2)}`;
};
return container(
html`<ak-number-input
@input=${displayChange}
label="Test Number Input"
name="ak-test-number-input"
help="This is where you would read the help messages"
></ak-number-input>`,
);
};

View file

@ -30,7 +30,9 @@ const container = (testItem: TemplateResult) =>
margin-top: 1em; margin-top: 1em;
} }
</style> </style>
${testItem} ${testItem}
<ul id="radio-message-pad" style="margin-top: 1em"></ul> <ul id="radio-message-pad" style="margin-top: 1em"></ul>
</div>`; </div>`;
@ -40,7 +42,7 @@ const testOptions = [
{ label: "Option Three", description: html`This is option three.`, value: { weird: 3 } }, { label: "Option Three", description: html`This is option three.`, value: { weird: 3 } },
]; ];
export const ButtonWithSuccess = () => { export const RadioInput = () => {
const result = ""; const result = "";
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any

View file

@ -0,0 +1,64 @@
import "@goauthentik/elements/messages/MessageContainer";
import { Meta } from "@storybook/web-components";
import { TemplateResult, html } from "lit";
import "../ak-slug-input";
import AkSlugInput from "../ak-slug-input";
import "../ak-text-input";
const metadata: Meta<AkSlugInput> = {
title: "Components / Slug Input",
component: "ak-slug-input",
parameters: {
docs: {
description: {
component: "A stylized value control for slug input",
},
},
},
};
export default metadata;
const container = (testItem: TemplateResult) =>
html` <div style="background: #000; padding: 2em">
<style>
li {
display: block;
}
p {
margin-top: 1em;
}
</style>
${testItem}
<ul id="text-message-pad" style="color: #fff; margin-top: 1em"></ul>
</div>`;
export const SlugInput = () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const displayChange = (ev: any) => {
document.getElementById("text-message-pad")!.innerText = `Value selected: ${JSON.stringify(
ev.target.value,
null,
2,
)}`;
};
return container(
html`<ak-text-input
label="Test Text Input"
name="ak-test-text-input"
help="Type your input here"
></ak-text-input>
<ak-slug-input
@input=${displayChange}
source="ak-text-input[name=ak-test-text-input]"
label="Test Text Input"
name="ak-test-text-input"
help="Here should be the slugified version"
></ak-slug-input> `,
);
};

View file

@ -0,0 +1,63 @@
import "@goauthentik/elements/messages/MessageContainer";
import { Meta } from "@storybook/web-components";
import { TemplateResult, html } from "lit";
// Necessary because we're NOT supplying the CSS for the interiors
// in our "light" dom.
import PFSwitch from "@patternfly/patternfly/components/Switch/switch.css";
import "../ak-switch-input";
import AkSwitchInput from "../ak-switch-input";
const metadata: Meta<AkSwitchInput> = {
title: "Components / Switch Input",
component: "ak-switch-input",
parameters: {
docs: {
description: {
component: "A stylized value control for a switch-like toggle",
},
},
},
};
export default metadata;
const container = (testItem: TemplateResult) =>
html` <div style="background: #fff; padding: 2em">
<style>
li {
display: block;
}
p {
margin-top: 1em;
}
${PFSwitch};
</style>
${testItem}
<ul id="switch-message-pad" style="margin-top: 1em"></ul>
</div>`;
export const SwitchInput = () => {
const result = "";
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const displayChange = (ev: any) => {
document.getElementById(
"switch-message-pad",
)!.innerText = `Value selected: ${JSON.stringify(ev.target.checked, null, 2)}`;
};
return container(
html`<ak-switch-input
@input=${displayChange}
name="ak-test-switch-input"
label="Test Switch Toggle"
help="This is where you would read the help messages"
></ak-switch-input>
<div>${result}</div>`,
);
};

View file

@ -0,0 +1,57 @@
import "@goauthentik/elements/messages/MessageContainer";
import { Meta } from "@storybook/web-components";
import { TemplateResult, html } from "lit";
import "../ak-text-input";
import AkTextInput from "../ak-text-input";
const metadata: Meta<AkTextInput> = {
title: "Components / Text Input",
component: "ak-text-input",
parameters: {
docs: {
description: {
component: "A stylized value control for text input",
},
},
},
};
export default metadata;
const container = (testItem: TemplateResult) =>
html` <div style="background: #000; padding: 2em">
<style>
li {
display: block;
}
p {
margin-top: 1em;
}
</style>
${testItem}
<ul id="text-message-pad" style="color: #fff; margin-top: 1em"></ul>
</div>`;
export const TextInput = () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const displayChange = (ev: any) => {
document.getElementById("text-message-pad")!.innerText = `Value selected: ${JSON.stringify(
ev.target.value,
null,
2,
)}`;
};
return container(
html`<ak-text-input
@input=${displayChange}
label="Test Text Input"
name="ak-test-text-input"
help="This is where you would read the help messages"
></ak-text-input>`,
);
};

View file

@ -0,0 +1,55 @@
import "@goauthentik/elements/messages/MessageContainer";
import { Meta } from "@storybook/web-components";
import { TemplateResult, html } from "lit";
import "../ak-textarea-input";
import AkTextareaInput from "../ak-textarea-input";
const metadata: Meta<AkTextareaInput> = {
title: "Components / Textarea Input",
component: "ak-textarea-input",
parameters: {
docs: {
description: {
component: "A stylized value control for textarea input",
},
},
},
};
export default metadata;
const container = (testItem: TemplateResult) =>
html` <div style="background: #000; padding: 2em">
<style>
li {
display: block;
}
p {
margin-top: 1em;
}
</style>
${testItem}
<ul id="textarea-message-pad" style="color: #fff; margin-top: 1em"></ul>
</div>`;
export const TextareaInput = () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const displayChange = (ev: any) => {
document.getElementById(
"textarea-message-pad",
)!.innerText = `Value selected: ${JSON.stringify(ev.target.value, null, 2)}`;
};
return container(
html`<ak-textarea-input
@input=${displayChange}
label="Test Textarea Input"
name="ak-test-textarea-input"
help="This is where you would read the help messages"
></ak-textarea-input>`,
);
};

View file

@ -44,7 +44,6 @@ const container = (testItem: TemplateResult) =>
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
const displayMessage = (result: any) => { const displayMessage = (result: any) => {
console.log(result);
const doc = new DOMParser().parseFromString( const doc = new DOMParser().parseFromString(
`<li><p><i>Event</i>: ${ `<li><p><i>Event</i>: ${
"result" in result.detail ? result.detail.result.key : result.detail.error "result" in result.detail ? result.detail.result.key : result.detail.error

View file

@ -9,6 +9,8 @@ import PFForm from "@patternfly/patternfly/components/Form/form.css";
import PFRadio from "@patternfly/patternfly/components/Radio/radio.css"; import PFRadio from "@patternfly/patternfly/components/Radio/radio.css";
import PFBase from "@patternfly/patternfly/patternfly-base.css"; import PFBase from "@patternfly/patternfly/patternfly-base.css";
import { randomId } from "../utils/randomId";
export interface RadioOption<T> { export interface RadioOption<T> {
label: string; label: string;
description?: TemplateResult; description?: TemplateResult;
@ -27,6 +29,8 @@ export class Radio<T> extends CustomEmitterElement(AKElement) {
@property({ attribute: false }) @property({ attribute: false })
value?: T; value?: T;
internalId: string;
static get styles(): CSSResult[] { static get styles(): CSSResult[] {
return [ return [
PFBase, PFBase,
@ -50,6 +54,7 @@ export class Radio<T> extends CustomEmitterElement(AKElement) {
super(); super();
this.renderRadio = this.renderRadio.bind(this); this.renderRadio = this.renderRadio.bind(this);
this.buildChangeHandler = this.buildChangeHandler.bind(this); this.buildChangeHandler = this.buildChangeHandler.bind(this);
this.internalId = this.name || `radio-${randomId(8)}`;
} }
// Set the value if it's not set already. Property changes inside the `willUpdate()` method do // Set the value if it's not set already. Property changes inside the `willUpdate()` method do
@ -72,15 +77,14 @@ export class Radio<T> extends CustomEmitterElement(AKElement) {
// This is a controlled input. Stop the native event from escaping or affecting the // This is a controlled input. Stop the native event from escaping or affecting the
// value. We'll do that ourselves. // value. We'll do that ourselves.
ev.stopPropagation(); ev.stopPropagation();
ev.preventDefault();
this.value = option.value; this.value = option.value;
this.dispatchCustomEvent("change", option.value); this.dispatchCustomEvent("change", { value: option.value });
this.dispatchCustomEvent("input", option.value); this.dispatchCustomEvent("input", { value: option.value });
}; };
} }
renderRadio(option: RadioOption<T>) { renderRadio(option: RadioOption<T>, index: number) {
const elId = `${this.name}-${option.value}`; const elId = `${this.internalId}-${index}`;
const handler = this.buildChangeHandler(option); const handler = this.buildChangeHandler(option);
return html`<div class="pf-c-radio" @click=${handler}> return html`<div class="pf-c-radio" @click=${handler}>
<input <input

View file

@ -0,0 +1,8 @@
export function randomId(length = 8) {
let dt = new Date().getTime();
return "x".repeat(length).replace(/x/g, (c) => {
const r = (dt + Math.random() * 16) % 16 | 0;
dt = Math.floor(dt / 16);
return (c == "x" ? r : (r & 0x3) | 0x8).toString(16);
});
}

View file

@ -11,6 +11,8 @@ import { WebsocketClient } from "@goauthentik/common/ws";
import { Interface } from "@goauthentik/elements/Base"; import { Interface } from "@goauthentik/elements/Base";
import "@goauthentik/elements/LoadingOverlay"; import "@goauthentik/elements/LoadingOverlay";
import "@goauthentik/elements/ak-locale-context"; import "@goauthentik/elements/ak-locale-context";
import "@goauthentik/flow/sources/apple/AppleLoginInit";
import "@goauthentik/flow/sources/plex/PlexLoginInit";
import "@goauthentik/flow/stages/FlowErrorStage"; import "@goauthentik/flow/stages/FlowErrorStage";
import "@goauthentik/flow/stages/RedirectStage"; import "@goauthentik/flow/stages/RedirectStage";
import { StageHost } from "@goauthentik/flow/stages/base"; import { StageHost } from "@goauthentik/flow/stages/base";
@ -353,13 +355,11 @@ export class FlowExecutor extends Interface implements StageHost {
></ak-stage-user-login>`; ></ak-stage-user-login>`;
// Sources // Sources
case "ak-source-plex": case "ak-source-plex":
await import("@goauthentik/flow/sources/plex/PlexLoginInit");
return html`<ak-flow-source-plex return html`<ak-flow-source-plex
.host=${this as StageHost} .host=${this as StageHost}
.challenge=${this.challenge} .challenge=${this.challenge}
></ak-flow-source-plex>`; ></ak-flow-source-plex>`;
case "ak-source-oauth-apple": case "ak-source-oauth-apple":
await import("@goauthentik/flow/sources/apple/AppleLoginInit");
return html`<ak-flow-source-oauth-apple return html`<ak-flow-source-oauth-apple
.host=${this as StageHost} .host=${this as StageHost}
.challenge=${this.challenge} .challenge=${this.challenge}

View file

@ -155,7 +155,7 @@ According to the Microsoft team [contributing to Python](https://devblogs.micros
I know migration isnt fun but when youre making tradeoffs, its worth keeping it in mind as a future option. If the choice is to build now and migrate later instead of never building at all, Im going to choose migration every time. I know migration isnt fun but when youre making tradeoffs, its worth keeping it in mind as a future option. If the choice is to build now and migrate later instead of never building at all, Im going to choose migration every time.
If we start running into truly significant performance issues and I emphasize _if_ we can always migrate critical parts of the application to a different language. This will of course be fully transparent to anyone running authentik, and Id like to think of it as a last-resort, if weve already done all the opitmization possible. If we start running into truly significant performance issues and I emphasize _if_ we can always migrate critical parts of the application to a different language. This will of course be fully transparent to anyone running authentik, and Id like to think of it as a last-resort, if weve already done all the optimization possible.
### Architect your application well ### Architect your application well

View file

@ -1,5 +1,6 @@
--- ---
title: Black box security software cant keep up with open source title: Black box security software cant keep up with open source
description: "There will always be bugs and vulnerabilities in software. Accepting that, which distribution model gives you more confidence and flexibility?"
slug: 2023-09-14-black-box-security-software-cant-keep-up-with-open-source slug: 2023-09-14-black-box-security-software-cant-keep-up-with-open-source
authors: authors:
- name: Jens Langhammer - name: Jens Langhammer

View file

@ -37,7 +37,7 @@ entries:
# delete the object # delete the object
state: present state: present
# An optional list of boolean-like conditions. If all conditions match (or # An optional list of boolean-like conditions. If all conditions match (or
# no condiitons are provided) the entry will be evaluated and acted upon # no conditions are provided) the entry will be evaluated and acted upon
# as normal. Otherwise, the entry is skipped as if not defined at all. # as normal. Otherwise, the entry is skipped as if not defined at all.
# Each condition will be evaluated in Python to its boolean representation # Each condition will be evaluated in Python to its boolean representation
# bool(<condition>). Furthermore, complex conditions can be built using # bool(<condition>). Furthermore, complex conditions can be built using

View file

@ -2,7 +2,7 @@
title: "Templates" title: "Templates"
--- ---
In technical docuemntation, there are document "types" (similar to how there are data types). In technical documentation, there are document "types" (similar to how there are data types).
The most common types are: The most common types are:

View file

@ -43,7 +43,7 @@ slug: "/releases/2021.8"
- core: add new token intent and auth backend (#1284) - core: add new token intent and auth backend (#1284)
- core: add token tests for invalid intent and token auth - core: add token tests for invalid intent and token auth
- core: fix token intent not defaulting correctly - core: fix token intent not defaulting correctly
- core: handle error when ?for_user is not numberical - core: handle error when ?for_user is not numerical
- lib: move id and key generators to lib (#1286) - lib: move id and key generators to lib (#1286)
- lifecycle: rename to ak - lifecycle: rename to ak
- outpost: handle non-existent permission - outpost: handle non-existent permission

View file

@ -244,7 +244,7 @@ Changed response : **200 OK**
- providers/oauth2: add x5c (#3556) - providers/oauth2: add x5c (#3556)
- providers/proxy: fix routing based on signature in traefik and caddy - providers/proxy: fix routing based on signature in traefik and caddy
- root: make redis persistent in docker-compose - root: make redis persistent in docker-compose
- root: re-use custom log helper from config and cleanup duplicate functions - root: reuse custom log helper from config and cleanup duplicate functions
- root: shorten outpost docker healthcheck intervals - root: shorten outpost docker healthcheck intervals
- sources/ldap: start_tls before binding but without reading server info - sources/ldap: start_tls before binding but without reading server info
- sources/oauth: use GitHub's dedicated email API when no public email address is configured - sources/oauth: use GitHub's dedicated email API when no public email address is configured

View file

@ -48,6 +48,6 @@ On this page:
![Screenshot showing populated GitHub enterprise SAML settings](ghec_saml_settings.png) ![Screenshot showing populated GitHub enterprise SAML settings](ghec_saml_settings.png)
Once these fields are populated, you can use the `Test SAML configuation` button to test the authentication flow. If the flow completes successfully, you will see a green tick next to the Test button. Once these fields are populated, you can use the `Test SAML configuration` button to test the authentication flow. If the flow completes successfully, you will see a green tick next to the Test button.
Scroll down to hit the `Save` button below. Scroll down to hit the `Save` button below.

View file

@ -42,7 +42,7 @@ On this page:
- For `Public certificate`, paste the _full_ signing certificate into this field. - For `Public certificate`, paste the _full_ signing certificate into this field.
- Verify that the `Signature method` and `Digest method` match your SAML provider settings in authentik. - Verify that the `Signature method` and `Digest method` match your SAML provider settings in authentik.
Once these fields are populated, you can use the `Test SAML configuation` button to test the authentication flow. If the flow completes successfully, you will see a green tick next to the Test button. Once these fields are populated, you can use the `Test SAML configuration` button to test the authentication flow. If the flow completes successfully, you will see a green tick next to the Test button.
Scroll down to hit the `Save` button below. Scroll down to hit the `Save` button below.

View file

@ -19,7 +19,7 @@ The following placeholders will be used:
- `organizr.company` is the FQDN of the Service install. - `organizr.company` is the FQDN of the Service install.
- `authentik.company` is the FQDN of the authentik install. - `authentik.company` is the FQDN of the authentik install.
Create a new user account _(or re-use an existing)_ for organizr to use for LDAP bind under _Directory_ -> _Users_ -> _Create_, in this example called `ldapservice`. Create a new user account _(or reuse an existing)_ for organizr to use for LDAP bind under _Directory_ -> _Users_ -> _Create_, in this example called `ldapservice`.
Note the DN of this user will be `cn=ldapservice,ou=users,dc=ldap,dc=goauthentik,dc=io` Note the DN of this user will be `cn=ldapservice,ou=users,dc=ldap,dc=goauthentik,dc=io`

View file

@ -22,7 +22,7 @@ The following placeholders will be used:
### Step 1 - Service account ### Step 1 - Service account
Create a new user account _(or re-use an existing one)_ for ProFTPD to use for LDAP bind under _Directory_ -> _Users_ -> _Create_ and give the account a name, such as `ldapservice`. Create a new user account _(or reuse an existing one)_ for ProFTPD to use for LDAP bind under _Directory_ -> _Users_ -> _Create_ and give the account a name, such as `ldapservice`.
:::note :::note
On default provider settings, the DN of this user will be `cn=ldapservice,ou=users,dc=ldap,dc=goauthentik,dc=io` On default provider settings, the DN of this user will be `cn=ldapservice,ou=users,dc=ldap,dc=goauthentik,dc=io`