Merge branch 'dev' into web/issue-4880-multi-select-limitations
* dev: web: Replace calls to `rootInterface()?.tenant?` with a contextual `this.tenant` object (#7778) web: abstract `rootInterface()?.config?.capabilities.includes()` into `.can()` (#7737) web: update some locale details (#8090) web: bump the eslint group in /web with 2 updates (#8082) web: bump rollup from 4.9.2 to 4.9.4 in /web (#8083) core: bump github.com/redis/go-redis/v9 from 9.3.1 to 9.4.0 (#8085) web: bump the eslint group in /tests/wdio with 2 updates (#8086) website: bump @types/react from 18.2.46 to 18.2.47 in /website (#8088) stages/user_login: only set last_ip in session if a binding is given (#8074) providers/oauth2: fix missing nonce in token endpoint not being saved (#8073) core: bump goauthentik.io/api/v3 from 3.2023105.3 to 3.2023105.5 (#8066) providers/oauth2: fix missing nonce in id_token (#8072) rbac: fix error when looking up permissions for now uninstalled apps (#8068) web/flows: fix device picker incorrect foreground color (#8067) translate: Updates for file web/xliff/en.xlf in zh_CN (#8061) translate: Updates for file web/xliff/en.xlf in zh-Hans (#8062) website: bump postcss from 8.4.32 to 8.4.33 in /website (#8063) web: bump the sentry group in /web with 2 updates (#8064) core: bump golang.org/x/sync from 0.5.0 to 0.6.0 (#8065)
This commit is contained in:
commit
b8f0b46bb5
|
@ -490,11 +490,13 @@ class TokenView(View):
|
||||||
auth_time=self.params.authorization_code.auth_time,
|
auth_time=self.params.authorization_code.auth_time,
|
||||||
session_id=self.params.authorization_code.session_id,
|
session_id=self.params.authorization_code.session_id,
|
||||||
)
|
)
|
||||||
access_token.id_token = IDToken.new(
|
access_id_token = IDToken.new(
|
||||||
self.provider,
|
self.provider,
|
||||||
access_token,
|
access_token,
|
||||||
self.request,
|
self.request,
|
||||||
)
|
)
|
||||||
|
access_id_token.nonce = self.params.authorization_code.nonce
|
||||||
|
access_token.id_token = access_id_token
|
||||||
access_token.save()
|
access_token.save()
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
|
|
|
@ -24,7 +24,10 @@ class ExtraRoleObjectPermissionSerializer(RoleObjectPermissionSerializer):
|
||||||
|
|
||||||
def get_app_label_verbose(self, instance: GroupObjectPermission) -> str:
|
def get_app_label_verbose(self, instance: GroupObjectPermission) -> str:
|
||||||
"""Get app label from permission's model"""
|
"""Get app label from permission's model"""
|
||||||
|
try:
|
||||||
return apps.get_app_config(instance.content_type.app_label).verbose_name
|
return apps.get_app_config(instance.content_type.app_label).verbose_name
|
||||||
|
except LookupError:
|
||||||
|
return instance.content_type.app_label
|
||||||
|
|
||||||
def get_model_verbose(self, instance: GroupObjectPermission) -> str:
|
def get_model_verbose(self, instance: GroupObjectPermission) -> str:
|
||||||
"""Get model label from permission's model"""
|
"""Get model label from permission's model"""
|
||||||
|
|
|
@ -24,7 +24,10 @@ class ExtraUserObjectPermissionSerializer(UserObjectPermissionSerializer):
|
||||||
|
|
||||||
def get_app_label_verbose(self, instance: UserObjectPermission) -> str:
|
def get_app_label_verbose(self, instance: UserObjectPermission) -> str:
|
||||||
"""Get app label from permission's model"""
|
"""Get app label from permission's model"""
|
||||||
|
try:
|
||||||
return apps.get_app_config(instance.content_type.app_label).verbose_name
|
return apps.get_app_config(instance.content_type.app_label).verbose_name
|
||||||
|
except LookupError:
|
||||||
|
return instance.content_type.app_label
|
||||||
|
|
||||||
def get_model_verbose(self, instance: UserObjectPermission) -> str:
|
def get_model_verbose(self, instance: UserObjectPermission) -> str:
|
||||||
"""Get model label from permission's model"""
|
"""Get model label from permission's model"""
|
||||||
|
|
|
@ -109,6 +109,9 @@ class BoundSessionMiddleware(SessionMiddleware):
|
||||||
self.recheck_session_geo(configured_binding_geo, last_ip, new_ip)
|
self.recheck_session_geo(configured_binding_geo, last_ip, new_ip)
|
||||||
# If we got to this point without any error being raised, we need to
|
# If we got to this point without any error being raised, we need to
|
||||||
# update the last saved IP to the current one
|
# update the last saved IP to the current one
|
||||||
|
if SESSION_KEY_BINDING_NET in request.session or SESSION_KEY_BINDING_GEO in request.session:
|
||||||
|
# Only set the last IP in the session if there's a binding specified
|
||||||
|
# (== basically requires the user to be logged in)
|
||||||
request.session[SESSION_KEY_LAST_IP] = new_ip
|
request.session[SESSION_KEY_LAST_IP] = new_ip
|
||||||
AuthenticatedSession.objects.filter(session_key=request.session.session_key).update(
|
AuthenticatedSession.objects.filter(session_key=request.session.session_key).update(
|
||||||
last_ip=new_ip, last_user_agent=request.META.get("HTTP_USER_AGENT", "")
|
last_ip=new_ip, last_user_agent=request.META.get("HTTP_USER_AGENT", "")
|
||||||
|
|
6
go.mod
6
go.mod
|
@ -23,15 +23,15 @@ require (
|
||||||
github.com/nmcclain/asn1-ber v0.0.0-20170104154839-2661553a0484
|
github.com/nmcclain/asn1-ber v0.0.0-20170104154839-2661553a0484
|
||||||
github.com/pires/go-proxyproto v0.7.0
|
github.com/pires/go-proxyproto v0.7.0
|
||||||
github.com/prometheus/client_golang v1.18.0
|
github.com/prometheus/client_golang v1.18.0
|
||||||
github.com/redis/go-redis/v9 v9.3.1
|
github.com/redis/go-redis/v9 v9.4.0
|
||||||
github.com/sirupsen/logrus v1.9.3
|
github.com/sirupsen/logrus v1.9.3
|
||||||
github.com/spf13/cobra v1.8.0
|
github.com/spf13/cobra v1.8.0
|
||||||
github.com/stretchr/testify v1.8.4
|
github.com/stretchr/testify v1.8.4
|
||||||
github.com/wwt/guac v1.3.2
|
github.com/wwt/guac v1.3.2
|
||||||
goauthentik.io/api/v3 v3.2023105.3
|
goauthentik.io/api/v3 v3.2023105.5
|
||||||
golang.org/x/exp v0.0.0-20230210204819-062eb4c674ab
|
golang.org/x/exp v0.0.0-20230210204819-062eb4c674ab
|
||||||
golang.org/x/oauth2 v0.15.0
|
golang.org/x/oauth2 v0.15.0
|
||||||
golang.org/x/sync v0.5.0
|
golang.org/x/sync v0.6.0
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
layeh.com/radius v0.0.0-20210819152912-ad72663a72ab
|
layeh.com/radius v0.0.0-20210819152912-ad72663a72ab
|
||||||
)
|
)
|
||||||
|
|
12
go.sum
12
go.sum
|
@ -258,8 +258,8 @@ github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lne
|
||||||
github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=
|
github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=
|
||||||
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
|
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
|
||||||
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
|
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
|
||||||
github.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds=
|
github.com/redis/go-redis/v9 v9.4.0 h1:Yzoz33UZw9I/mFhx4MNrB6Fk+XHO1VukNcCa1+lwyKk=
|
||||||
github.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
|
github.com/redis/go-redis/v9 v9.4.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
|
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
|
||||||
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
|
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
|
||||||
|
@ -316,8 +316,8 @@ go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYO
|
||||||
go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY=
|
go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY=
|
||||||
go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
|
go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
|
||||||
go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=
|
go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=
|
||||||
goauthentik.io/api/v3 v3.2023105.3 h1:x0pMJIKkbN198OOssqA94h8bO6ft9gwG8bpZqZL7WVg=
|
goauthentik.io/api/v3 v3.2023105.5 h1:wIL3Q0jry1g4kRWpH/Dv1sQqhzuL4BLC+uP/Tar1P/g=
|
||||||
goauthentik.io/api/v3 v3.2023105.3/go.mod h1:zz+mEZg8rY/7eEjkMGWJ2DnGqk+zqxuybGCGrR2O4Kw=
|
goauthentik.io/api/v3 v3.2023105.5/go.mod h1:zz+mEZg8rY/7eEjkMGWJ2DnGqk+zqxuybGCGrR2O4Kw=
|
||||||
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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
@ -415,8 +415,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
|
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
|
||||||
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
|
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^6.17.0",
|
"@typescript-eslint/eslint-plugin": "^6.18.0",
|
||||||
"@typescript-eslint/parser": "^6.17.0",
|
"@typescript-eslint/parser": "^6.18.0",
|
||||||
"@wdio/cli": "^8.27.1",
|
"@wdio/cli": "^8.27.1",
|
||||||
"@wdio/local-runner": "^8.27.0",
|
"@wdio/local-runner": "^8.27.0",
|
||||||
"@wdio/mocha-framework": "^8.27.0",
|
"@wdio/mocha-framework": "^8.27.0",
|
||||||
|
@ -953,16 +953,16 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.0.tgz",
|
||||||
"integrity": "sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==",
|
"integrity": "sha512-3lqEvQUdCozi6d1mddWqd+kf8KxmGq2Plzx36BlkjuQe3rSTm/O98cLf0A4uDO+a5N1KD2SeEEl6fW97YHY+6w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/regexpp": "^4.5.1",
|
"@eslint-community/regexpp": "^4.5.1",
|
||||||
"@typescript-eslint/scope-manager": "6.17.0",
|
"@typescript-eslint/scope-manager": "6.18.0",
|
||||||
"@typescript-eslint/type-utils": "6.17.0",
|
"@typescript-eslint/type-utils": "6.18.0",
|
||||||
"@typescript-eslint/utils": "6.17.0",
|
"@typescript-eslint/utils": "6.18.0",
|
||||||
"@typescript-eslint/visitor-keys": "6.17.0",
|
"@typescript-eslint/visitor-keys": "6.18.0",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"graphemer": "^1.4.0",
|
"graphemer": "^1.4.0",
|
||||||
"ignore": "^5.2.4",
|
"ignore": "^5.2.4",
|
||||||
|
@ -988,15 +988,15 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/parser": {
|
"node_modules/@typescript-eslint/parser": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.0.tgz",
|
||||||
"integrity": "sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==",
|
"integrity": "sha512-v6uR68SFvqhNQT41frCMCQpsP+5vySy6IdgjlzUWoo7ALCnpaWYcz/Ij2k4L8cEsL0wkvOviCMpjmtRtHNOKzA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/scope-manager": "6.17.0",
|
"@typescript-eslint/scope-manager": "6.18.0",
|
||||||
"@typescript-eslint/types": "6.17.0",
|
"@typescript-eslint/types": "6.18.0",
|
||||||
"@typescript-eslint/typescript-estree": "6.17.0",
|
"@typescript-eslint/typescript-estree": "6.18.0",
|
||||||
"@typescript-eslint/visitor-keys": "6.17.0",
|
"@typescript-eslint/visitor-keys": "6.18.0",
|
||||||
"debug": "^4.3.4"
|
"debug": "^4.3.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -1016,13 +1016,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/scope-manager": {
|
"node_modules/@typescript-eslint/scope-manager": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.0.tgz",
|
||||||
"integrity": "sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==",
|
"integrity": "sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "6.17.0",
|
"@typescript-eslint/types": "6.18.0",
|
||||||
"@typescript-eslint/visitor-keys": "6.17.0"
|
"@typescript-eslint/visitor-keys": "6.18.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^16.0.0 || >=18.0.0"
|
"node": "^16.0.0 || >=18.0.0"
|
||||||
|
@ -1033,13 +1033,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/type-utils": {
|
"node_modules/@typescript-eslint/type-utils": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.0.tgz",
|
||||||
"integrity": "sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==",
|
"integrity": "sha512-ZeMtrXnGmTcHciJN1+u2CigWEEXgy1ufoxtWcHORt5kGvpjjIlK9MUhzHm4RM8iVy6dqSaZA/6PVkX6+r+ChjQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/typescript-estree": "6.17.0",
|
"@typescript-eslint/typescript-estree": "6.18.0",
|
||||||
"@typescript-eslint/utils": "6.17.0",
|
"@typescript-eslint/utils": "6.18.0",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"ts-api-utils": "^1.0.1"
|
"ts-api-utils": "^1.0.1"
|
||||||
},
|
},
|
||||||
|
@ -1060,9 +1060,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/types": {
|
"node_modules/@typescript-eslint/types": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.0.tgz",
|
||||||
"integrity": "sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==",
|
"integrity": "sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^16.0.0 || >=18.0.0"
|
"node": "^16.0.0 || >=18.0.0"
|
||||||
|
@ -1073,13 +1073,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/typescript-estree": {
|
"node_modules/@typescript-eslint/typescript-estree": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.0.tgz",
|
||||||
"integrity": "sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==",
|
"integrity": "sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "6.17.0",
|
"@typescript-eslint/types": "6.18.0",
|
||||||
"@typescript-eslint/visitor-keys": "6.17.0",
|
"@typescript-eslint/visitor-keys": "6.18.0",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"globby": "^11.1.0",
|
"globby": "^11.1.0",
|
||||||
"is-glob": "^4.0.3",
|
"is-glob": "^4.0.3",
|
||||||
|
@ -1125,17 +1125,17 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/utils": {
|
"node_modules/@typescript-eslint/utils": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.0.tgz",
|
||||||
"integrity": "sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==",
|
"integrity": "sha512-wiKKCbUeDPGaYEYQh1S580dGxJ/V9HI7K5sbGAVklyf+o5g3O+adnS4UNJajplF4e7z2q0uVBaTdT/yLb4XAVA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/eslint-utils": "^4.4.0",
|
"@eslint-community/eslint-utils": "^4.4.0",
|
||||||
"@types/json-schema": "^7.0.12",
|
"@types/json-schema": "^7.0.12",
|
||||||
"@types/semver": "^7.5.0",
|
"@types/semver": "^7.5.0",
|
||||||
"@typescript-eslint/scope-manager": "6.17.0",
|
"@typescript-eslint/scope-manager": "6.18.0",
|
||||||
"@typescript-eslint/types": "6.17.0",
|
"@typescript-eslint/types": "6.18.0",
|
||||||
"@typescript-eslint/typescript-estree": "6.17.0",
|
"@typescript-eslint/typescript-estree": "6.18.0",
|
||||||
"semver": "^7.5.4"
|
"semver": "^7.5.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -1150,12 +1150,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/visitor-keys": {
|
"node_modules/@typescript-eslint/visitor-keys": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.0.tgz",
|
||||||
"integrity": "sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==",
|
"integrity": "sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "6.17.0",
|
"@typescript-eslint/types": "6.18.0",
|
||||||
"eslint-visitor-keys": "^3.4.1"
|
"eslint-visitor-keys": "^3.4.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
|
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^6.17.0",
|
"@typescript-eslint/eslint-plugin": "^6.18.0",
|
||||||
"@typescript-eslint/parser": "^6.17.0",
|
"@typescript-eslint/parser": "^6.18.0",
|
||||||
"@wdio/cli": "^8.27.1",
|
"@wdio/cli": "^8.27.1",
|
||||||
"@wdio/local-runner": "^8.27.0",
|
"@wdio/local-runner": "^8.27.0",
|
||||||
"@wdio/mocha-framework": "^8.27.0",
|
"@wdio/mocha-framework": "^8.27.0",
|
||||||
|
|
|
@ -3,6 +3,92 @@
|
||||||
This is the default UI for the authentik server. The documentation is going to be a little sparse
|
This is the default UI for the authentik server. The documentation is going to be a little sparse
|
||||||
for awhile, but at least let's get started.
|
for awhile, but at least let's get started.
|
||||||
|
|
||||||
|
# The Theory of the authentik UI
|
||||||
|
|
||||||
|
In Peter Naur's 1985 essay [Programming as Theory
|
||||||
|
Building](https://pages.cs.wisc.edu/~remzi/Naur.pdf), programming is described as creating a mental
|
||||||
|
model of how a program _should_ run, then writing the code to test if the program _can_ run that
|
||||||
|
way.
|
||||||
|
|
||||||
|
The mental model for the authentik UI is straightforward. There are five "applications" within the
|
||||||
|
UI, each with its own base URL, router, and responsibilities, and each application needs as many as
|
||||||
|
three contexts in which to run.
|
||||||
|
|
||||||
|
The three contexts corresponds to objects in the API's `model` section, so let's use those names.
|
||||||
|
|
||||||
|
- The root `Config`. The root configuration object of the server, containing mostly caching and
|
||||||
|
error reporting information. This is misleading, however; the `Config` object contains some user
|
||||||
|
information, specifically a list of permissions the current user (or "no user") has.
|
||||||
|
- The root `CurrentTenant`. This describes the `Brand` information UIs should use, such as themes,
|
||||||
|
logos, favicon, and specific default flows for logging in, logging out, and recovering a user
|
||||||
|
password.
|
||||||
|
- The current `SessionUser`, the person logged in: username, display name, and various states.
|
||||||
|
(Note: the authentik server permits administrators to "impersonate" any other user in order to
|
||||||
|
debug their authentikation experience. If impersonation is active, the `user` field reflects that
|
||||||
|
user, but it also includes a field, `original`, with the administrator's information.)
|
||||||
|
|
||||||
|
(There is a fourth context object, Version, but its use is limited to displaying version information
|
||||||
|
and checking for upgrades. Just be aware that you will see it, but you will probably never interact
|
||||||
|
with it.)
|
||||||
|
|
||||||
|
There are five applications. Two (`loading` and `api-browser`) are trivial applications whose
|
||||||
|
insides are provided by third-party libraries (Patternfly and Rapidoc, respectively). The other
|
||||||
|
three are actual applications. The descriptions below are wholly from the view of the user's
|
||||||
|
experience:
|
||||||
|
|
||||||
|
- `Flow`: From a given URL, displays a form that requests information from the user to accomplish a
|
||||||
|
task. Some tasks require the user to be logged in, but many (such as logging in itself!)
|
||||||
|
obviously do not.
|
||||||
|
- `User`: Provides the user with access to the applications they can access, plus a few user
|
||||||
|
settings.
|
||||||
|
- `Admin`: Provides someone with super-user permissions access to the administrative functions of
|
||||||
|
the authentik server.
|
||||||
|
|
||||||
|
**Mental Model**
|
||||||
|
|
||||||
|
- Upon initialization, _every_ authentik UI application fetches `Config` and `CurrentTenant`. `User`
|
||||||
|
and `Admin` will also attempt to load the `SessionUser`; if there is none, the user is kicked out
|
||||||
|
to the `Flow` for logging into authentik itself.
|
||||||
|
- `Config`, `CurrentTenant`, and `SessionUser`, are provided by the `@goauthentik/api` application,
|
||||||
|
not by the codebase under `./web`. (Where you are now).
|
||||||
|
- `Flow`, `User`, and `Admin` are all called `Interfaces` and are found in
|
||||||
|
`./web/src/flow/FlowInterface`, `./web/src/user/UserInterface`, `./web/src/admin/AdminInterface`,
|
||||||
|
respectively.
|
||||||
|
|
||||||
|
Inside each of these you will find, in a hierarchal order:
|
||||||
|
|
||||||
|
- The context layer described above
|
||||||
|
- A theme managing layer
|
||||||
|
- The orchestration layer:
|
||||||
|
- web socket handler for server-generated events
|
||||||
|
- The router
|
||||||
|
- Individual routes for each vertical slice and its relationship to other objects:
|
||||||
|
|
||||||
|
Each slice corresponds to an object table on the server, and each slice _usually_ consists of the
|
||||||
|
following:
|
||||||
|
|
||||||
|
- A paginated collection display, usually using the `Table` foundation (found in
|
||||||
|
`./web/src/elements/Table`)
|
||||||
|
- The ability to view an individual object from the collection, which you may be able to:
|
||||||
|
- Edit
|
||||||
|
- Delete
|
||||||
|
- A form for creating a new object
|
||||||
|
- Tabs showing that object's relationship to other objects
|
||||||
|
- Interactive elements for changing or deleting those relationships, or creating new ones.
|
||||||
|
- The ability to create new objects with which to have that relationship, if they're not part of
|
||||||
|
the core objects (such as User->MFA authenticator apps, since the latter is not a "core" object
|
||||||
|
and has no tab of its own).
|
||||||
|
|
||||||
|
We are still a bit "all over the place" with respect to sub-units and common units; there are
|
||||||
|
folders `common`, `elements`, and `components`, and ideally they would be:
|
||||||
|
|
||||||
|
- `common`: non-UI related libraries all of our applications need
|
||||||
|
- `elements`: UI elements shared among multiple applications that do not need context
|
||||||
|
- `components`: UI elements shared among multiple that use one or more context
|
||||||
|
|
||||||
|
... but at the moment there are some context-sensitive elements, and some UI-related stuff in
|
||||||
|
`common`.
|
||||||
|
|
||||||
# Comments
|
# Comments
|
||||||
|
|
||||||
**NOTE:** The comments in this section are for specific changes to this repository that cannot be
|
**NOTE:** The comments in this section are for specific changes to this repository that cannot be
|
||||||
|
|
|
@ -3,15 +3,18 @@
|
||||||
"sourceLocale": "en",
|
"sourceLocale": "en",
|
||||||
"targetLocales": [
|
"targetLocales": [
|
||||||
"en",
|
"en",
|
||||||
"pseudo-LOCALE",
|
"de",
|
||||||
"fr",
|
|
||||||
"tr",
|
|
||||||
"es",
|
"es",
|
||||||
|
"fr",
|
||||||
|
"ko",
|
||||||
|
"nl",
|
||||||
"pl",
|
"pl",
|
||||||
"zh_TW",
|
"tr",
|
||||||
"zh-Hans",
|
"zh-Hans",
|
||||||
"zh-Hant",
|
"zh-Hant",
|
||||||
"de"
|
"zh-CN",
|
||||||
|
"zh_TW",
|
||||||
|
"pseudo-LOCALE"
|
||||||
],
|
],
|
||||||
"tsConfig": "./tsconfig.json",
|
"tsConfig": "./tsconfig.json",
|
||||||
"output": {
|
"output": {
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
"@open-wc/lit-helpers": "^0.6.0",
|
"@open-wc/lit-helpers": "^0.6.0",
|
||||||
"@patternfly/elements": "^2.4.0",
|
"@patternfly/elements": "^2.4.0",
|
||||||
"@patternfly/patternfly": "^4.224.2",
|
"@patternfly/patternfly": "^4.224.2",
|
||||||
"@sentry/browser": "^7.91.0",
|
"@sentry/browser": "^7.92.0",
|
||||||
"@sentry/tracing": "^7.91.0",
|
"@sentry/tracing": "^7.92.0",
|
||||||
"@webcomponents/webcomponentsjs": "^2.8.0",
|
"@webcomponents/webcomponentsjs": "^2.8.0",
|
||||||
"base64-js": "^1.5.1",
|
"base64-js": "^1.5.1",
|
||||||
"chart.js": "^4.4.1",
|
"chart.js": "^4.4.1",
|
||||||
|
@ -74,8 +74,8 @@
|
||||||
"@types/codemirror": "5.60.15",
|
"@types/codemirror": "5.60.15",
|
||||||
"@types/grecaptcha": "^3.0.7",
|
"@types/grecaptcha": "^3.0.7",
|
||||||
"@types/guacamole-common-js": "1.5.2",
|
"@types/guacamole-common-js": "1.5.2",
|
||||||
"@typescript-eslint/eslint-plugin": "^6.17.0",
|
"@typescript-eslint/eslint-plugin": "^6.18.0",
|
||||||
"@typescript-eslint/parser": "^6.17.0",
|
"@typescript-eslint/parser": "^6.18.0",
|
||||||
"babel-plugin-macros": "^3.1.0",
|
"babel-plugin-macros": "^3.1.0",
|
||||||
"babel-plugin-tsconfig-paths": "^1.0.3",
|
"babel-plugin-tsconfig-paths": "^1.0.3",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
|
@ -93,7 +93,7 @@
|
||||||
"pyright": "=1.1.338",
|
"pyright": "=1.1.338",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"rollup": "^4.9.2",
|
"rollup": "^4.9.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-modify": "^3.0.0",
|
"rollup-plugin-modify": "^3.0.0",
|
||||||
|
@ -4583,9 +4583,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.4.tgz",
|
||||||
"integrity": "sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==",
|
"integrity": "sha512-ub/SN3yWqIv5CWiAZPHVS1DloyZsJbtXmX4HxUTIpS0BHm9pW5iYBo2mIZi+hE3AeiTzHz33blwSnhdUo+9NpA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
|
@ -4596,9 +4596,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm64": {
|
"node_modules/@rollup/rollup-android-arm64": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.4.tgz",
|
||||||
"integrity": "sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==",
|
"integrity": "sha512-ehcBrOR5XTl0W0t2WxfTyHCR/3Cq2jfb+I4W+Ch8Y9b5G+vbAecVv0Fx/J1QKktOrgUYsIKxWAKgIpvw56IFNA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -4609,9 +4609,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-arm64": {
|
"node_modules/@rollup/rollup-darwin-arm64": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.4.tgz",
|
||||||
"integrity": "sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==",
|
"integrity": "sha512-1fzh1lWExwSTWy8vJPnNbNM02WZDS8AW3McEOb7wW+nPChLKf3WG2aG7fhaUmfX5FKw9zhsF5+MBwArGyNM7NA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -4622,9 +4622,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-x64": {
|
"node_modules/@rollup/rollup-darwin-x64": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.4.tgz",
|
||||||
"integrity": "sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==",
|
"integrity": "sha512-Gc6cukkF38RcYQ6uPdiXi70JB0f29CwcQ7+r4QpfNpQFVHXRd0DfWFidoGxjSx1DwOETM97JPz1RXL5ISSB0pA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -4635,9 +4635,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.4.tgz",
|
||||||
"integrity": "sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==",
|
"integrity": "sha512-g21RTeFzoTl8GxosHbnQZ0/JkuFIB13C3T7Y0HtKzOXmoHhewLbVTFBQZu+z5m9STH6FZ7L/oPgU4Nm5ErN2fw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
|
@ -4648,9 +4648,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.4.tgz",
|
||||||
"integrity": "sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==",
|
"integrity": "sha512-TVYVWD/SYwWzGGnbfTkrNpdE4HON46orgMNHCivlXmlsSGQOx/OHHYiQcMIOx38/GWgwr/po2LBn7wypkWw/Mg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -4661,9 +4661,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.4.tgz",
|
||||||
"integrity": "sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==",
|
"integrity": "sha512-XcKvuendwizYYhFxpvQ3xVpzje2HHImzg33wL9zvxtj77HvPStbSGI9czrdbfrf8DGMcNNReH9pVZv8qejAQ5A==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -4674,9 +4674,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.4.tgz",
|
||||||
"integrity": "sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==",
|
"integrity": "sha512-LFHS/8Q+I9YA0yVETyjonMJ3UA+DczeBd/MqNEzsGSTdNvSJa1OJZcSH8GiXLvcizgp9AlHs2walqRcqzjOi3A==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"riscv64"
|
"riscv64"
|
||||||
],
|
],
|
||||||
|
@ -4687,9 +4687,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.4.tgz",
|
||||||
"integrity": "sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==",
|
"integrity": "sha512-dIYgo+j1+yfy81i0YVU5KnQrIJZE8ERomx17ReU4GREjGtDW4X+nvkBak2xAUpyqLs4eleDSj3RrV72fQos7zw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -4700,9 +4700,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-musl": {
|
"node_modules/@rollup/rollup-linux-x64-musl": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.4.tgz",
|
||||||
"integrity": "sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==",
|
"integrity": "sha512-RoaYxjdHQ5TPjaPrLsfKqR3pakMr3JGqZ+jZM0zP2IkDtsGa4CqYaWSfQmZVgFUCgLrTnzX+cnHS3nfl+kB6ZQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -4713,9 +4713,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.4.tgz",
|
||||||
"integrity": "sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==",
|
"integrity": "sha512-T8Q3XHV+Jjf5e49B4EAaLKV74BbX7/qYBRQ8Wop/+TyyU0k+vSjiLVSHNWdVd1goMjZcbhDmYZUYW5RFqkBNHQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -4726,9 +4726,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.4.tgz",
|
||||||
"integrity": "sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==",
|
"integrity": "sha512-z+JQ7JirDUHAsMecVydnBPWLwJjbppU+7LZjffGf+Jvrxq+dVjIE7By163Sc9DKc3ADSU50qPVw0KonBS+a+HQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ia32"
|
"ia32"
|
||||||
],
|
],
|
||||||
|
@ -4739,9 +4739,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.4.tgz",
|
||||||
"integrity": "sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==",
|
"integrity": "sha512-LfdGXCV9rdEify1oxlN9eamvDSjv9md9ZVMAbNHA87xqIfFCxImxan9qZ8+Un54iK2nnqPlbnSi4R54ONtbWBw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -4752,98 +4752,98 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@sentry-internal/feedback": {
|
"node_modules/@sentry-internal/feedback": {
|
||||||
"version": "7.91.0",
|
"version": "7.92.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.91.0.tgz",
|
"resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.92.0.tgz",
|
||||||
"integrity": "sha512-SJKTSaz68F5YIwF79EttBm915M2LnacgZMYRnRumyTmMKnebGhYQLwWbZdpaDvOa1U18dgRajDX8Qed/8A3tXw==",
|
"integrity": "sha512-/jEALRtVqboxB9kcK2tag8QCO6XANTlGBb9RV3oeGXJe0DDNJXRq6wVZbfgztXJRrfgx4XVDcNt1pRVoGGG++g==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sentry/core": "7.91.0",
|
"@sentry/core": "7.92.0",
|
||||||
"@sentry/types": "7.91.0",
|
"@sentry/types": "7.92.0",
|
||||||
"@sentry/utils": "7.91.0"
|
"@sentry/utils": "7.92.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sentry-internal/tracing": {
|
"node_modules/@sentry-internal/tracing": {
|
||||||
"version": "7.91.0",
|
"version": "7.92.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.91.0.tgz",
|
"resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.92.0.tgz",
|
||||||
"integrity": "sha512-JH5y6gs6BS0its7WF2DhySu7nkhPDfZcdpAXldxzIlJpqFkuwQKLU5nkYJpiIyZz1NHYYtW5aum2bV2oCOdDRA==",
|
"integrity": "sha512-ur55vPcUUUWFUX4eVLNP71ohswK7ZZpleNZw9Y1GfLqyI+0ILQUwjtzqItJrdClvVsdRZJMRmDV40Hp9Lbb9mA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sentry/core": "7.91.0",
|
"@sentry/core": "7.92.0",
|
||||||
"@sentry/types": "7.91.0",
|
"@sentry/types": "7.92.0",
|
||||||
"@sentry/utils": "7.91.0"
|
"@sentry/utils": "7.92.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sentry/browser": {
|
"node_modules/@sentry/browser": {
|
||||||
"version": "7.91.0",
|
"version": "7.92.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.91.0.tgz",
|
"resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.92.0.tgz",
|
||||||
"integrity": "sha512-lJv3x/xekzC/biiyAsVCioq2XnKNOZhI6jY3ZzLJZClYV8eKRi7D3KCsHRvMiCdGak1d/6sVp8F4NYY+YiWy1Q==",
|
"integrity": "sha512-loMr02/zQ38u8aQhYLtIBg0i5n3ps2e3GUXrt3CdsJQdkRYfa62gcrE7SzvoEpMVHTk7VOI4fWGht8cWw/1k3A==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sentry-internal/feedback": "7.91.0",
|
"@sentry-internal/feedback": "7.92.0",
|
||||||
"@sentry-internal/tracing": "7.91.0",
|
"@sentry-internal/tracing": "7.92.0",
|
||||||
"@sentry/core": "7.91.0",
|
"@sentry/core": "7.92.0",
|
||||||
"@sentry/replay": "7.91.0",
|
"@sentry/replay": "7.92.0",
|
||||||
"@sentry/types": "7.91.0",
|
"@sentry/types": "7.92.0",
|
||||||
"@sentry/utils": "7.91.0"
|
"@sentry/utils": "7.92.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sentry/core": {
|
"node_modules/@sentry/core": {
|
||||||
"version": "7.91.0",
|
"version": "7.92.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.91.0.tgz",
|
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.92.0.tgz",
|
||||||
"integrity": "sha512-tu+gYq4JrTdrR+YSh5IVHF0fJi/Pi9y0HZ5H9HnYy+UMcXIotxf6hIEaC6ZKGeLWkGXffz2gKpQLe/g6vy/lPA==",
|
"integrity": "sha512-1Tly7YB2I1byI5xb0Cwrxs56Rhww+6mQ7m9P7rTmdC3/ijOzbEoohtYIUPwcooCEarpbEJe/tAayRx6BrH2UbQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sentry/types": "7.91.0",
|
"@sentry/types": "7.92.0",
|
||||||
"@sentry/utils": "7.91.0"
|
"@sentry/utils": "7.92.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sentry/replay": {
|
"node_modules/@sentry/replay": {
|
||||||
"version": "7.91.0",
|
"version": "7.92.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.91.0.tgz",
|
"resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.92.0.tgz",
|
||||||
"integrity": "sha512-XwbesnLLNtaVXKtDoyBB96GxJuhGi9zy3a662Ba/McmumCnkXrMQYpQPh08U7MgkTyDRgjDwm7PXDhiKpcb03g==",
|
"integrity": "sha512-G1t9Uvc9cR8VpNkElwvHIMGzykjIKikb10n0tfVd3e+rBPMCCjCPWOduwG6jZYxcvCjTpqmJh6NSLXxL/Mt4JA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sentry-internal/tracing": "7.91.0",
|
"@sentry-internal/tracing": "7.92.0",
|
||||||
"@sentry/core": "7.91.0",
|
"@sentry/core": "7.92.0",
|
||||||
"@sentry/types": "7.91.0",
|
"@sentry/types": "7.92.0",
|
||||||
"@sentry/utils": "7.91.0"
|
"@sentry/utils": "7.92.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sentry/tracing": {
|
"node_modules/@sentry/tracing": {
|
||||||
"version": "7.91.0",
|
"version": "7.92.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.91.0.tgz",
|
"resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.92.0.tgz",
|
||||||
"integrity": "sha512-IlSAMvqfCL/2TwwN4Tmk6bGMgilGruv5oIJ1GMenVZk53bHwjpjzMbd0ms8+S5zJwAgTQXoCbRhaFFrNmptteQ==",
|
"integrity": "sha512-1+TFFPVEdax4dNi68gin6MENiyGe9mOuNXfjulrP5eCzUEByus5HAxeDI/LLQ1hArfn048AzwSwKUsS2fO5sbg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sentry-internal/tracing": "7.91.0"
|
"@sentry-internal/tracing": "7.92.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sentry/types": {
|
"node_modules/@sentry/types": {
|
||||||
"version": "7.91.0",
|
"version": "7.92.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.91.0.tgz",
|
"resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.92.0.tgz",
|
||||||
"integrity": "sha512-bcQnb7J3P3equbCUc+sPuHog2Y47yGD2sCkzmnZBjvBT0Z1B4f36fI/5WjyZhTjLSiOdg3F2otwvikbMjmBDew==",
|
"integrity": "sha512-APmSOuZuoRGpbPpPeYIbMSplPjiWNLZRQa73QiXuTflW4Tu/ItDlU8hOa2+A6JKVkJCuD2EN6yUrxDGSMyNXeg==",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sentry/utils": {
|
"node_modules/@sentry/utils": {
|
||||||
"version": "7.91.0",
|
"version": "7.92.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.91.0.tgz",
|
"resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.92.0.tgz",
|
||||||
"integrity": "sha512-fvxjrEbk6T6Otu++Ax9ntlQ0sGRiwSC179w68aC3u26Wr30FAIRKqHTCCdc2jyWk7Gd9uWRT/cq+g8NG/8BfSg==",
|
"integrity": "sha512-3nEfrQ1z28b/2zgFGANPh5yMVtgwXmrasZxTvKbrAj+KWJpjrJHrIR84r9W277J44NMeZ5RhRW2uoDmuBslPnA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sentry/types": "7.91.0"
|
"@sentry/types": "7.92.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
|
@ -7266,9 +7266,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/estree": {
|
"node_modules/@types/estree": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
|
||||||
"integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==",
|
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/express": {
|
"node_modules/@types/express": {
|
||||||
|
@ -7577,16 +7577,16 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.0.tgz",
|
||||||
"integrity": "sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==",
|
"integrity": "sha512-3lqEvQUdCozi6d1mddWqd+kf8KxmGq2Plzx36BlkjuQe3rSTm/O98cLf0A4uDO+a5N1KD2SeEEl6fW97YHY+6w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/regexpp": "^4.5.1",
|
"@eslint-community/regexpp": "^4.5.1",
|
||||||
"@typescript-eslint/scope-manager": "6.17.0",
|
"@typescript-eslint/scope-manager": "6.18.0",
|
||||||
"@typescript-eslint/type-utils": "6.17.0",
|
"@typescript-eslint/type-utils": "6.18.0",
|
||||||
"@typescript-eslint/utils": "6.17.0",
|
"@typescript-eslint/utils": "6.18.0",
|
||||||
"@typescript-eslint/visitor-keys": "6.17.0",
|
"@typescript-eslint/visitor-keys": "6.18.0",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"graphemer": "^1.4.0",
|
"graphemer": "^1.4.0",
|
||||||
"ignore": "^5.2.4",
|
"ignore": "^5.2.4",
|
||||||
|
@ -7645,15 +7645,15 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/parser": {
|
"node_modules/@typescript-eslint/parser": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.0.tgz",
|
||||||
"integrity": "sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==",
|
"integrity": "sha512-v6uR68SFvqhNQT41frCMCQpsP+5vySy6IdgjlzUWoo7ALCnpaWYcz/Ij2k4L8cEsL0wkvOviCMpjmtRtHNOKzA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/scope-manager": "6.17.0",
|
"@typescript-eslint/scope-manager": "6.18.0",
|
||||||
"@typescript-eslint/types": "6.17.0",
|
"@typescript-eslint/types": "6.18.0",
|
||||||
"@typescript-eslint/typescript-estree": "6.17.0",
|
"@typescript-eslint/typescript-estree": "6.18.0",
|
||||||
"@typescript-eslint/visitor-keys": "6.17.0",
|
"@typescript-eslint/visitor-keys": "6.18.0",
|
||||||
"debug": "^4.3.4"
|
"debug": "^4.3.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -7673,13 +7673,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/scope-manager": {
|
"node_modules/@typescript-eslint/scope-manager": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.0.tgz",
|
||||||
"integrity": "sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==",
|
"integrity": "sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "6.17.0",
|
"@typescript-eslint/types": "6.18.0",
|
||||||
"@typescript-eslint/visitor-keys": "6.17.0"
|
"@typescript-eslint/visitor-keys": "6.18.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^16.0.0 || >=18.0.0"
|
"node": "^16.0.0 || >=18.0.0"
|
||||||
|
@ -7690,13 +7690,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/type-utils": {
|
"node_modules/@typescript-eslint/type-utils": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.0.tgz",
|
||||||
"integrity": "sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==",
|
"integrity": "sha512-ZeMtrXnGmTcHciJN1+u2CigWEEXgy1ufoxtWcHORt5kGvpjjIlK9MUhzHm4RM8iVy6dqSaZA/6PVkX6+r+ChjQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/typescript-estree": "6.17.0",
|
"@typescript-eslint/typescript-estree": "6.18.0",
|
||||||
"@typescript-eslint/utils": "6.17.0",
|
"@typescript-eslint/utils": "6.18.0",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"ts-api-utils": "^1.0.1"
|
"ts-api-utils": "^1.0.1"
|
||||||
},
|
},
|
||||||
|
@ -7717,9 +7717,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/types": {
|
"node_modules/@typescript-eslint/types": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.0.tgz",
|
||||||
"integrity": "sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==",
|
"integrity": "sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^16.0.0 || >=18.0.0"
|
"node": "^16.0.0 || >=18.0.0"
|
||||||
|
@ -7730,13 +7730,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/typescript-estree": {
|
"node_modules/@typescript-eslint/typescript-estree": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.0.tgz",
|
||||||
"integrity": "sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==",
|
"integrity": "sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "6.17.0",
|
"@typescript-eslint/types": "6.18.0",
|
||||||
"@typescript-eslint/visitor-keys": "6.17.0",
|
"@typescript-eslint/visitor-keys": "6.18.0",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"globby": "^11.1.0",
|
"globby": "^11.1.0",
|
||||||
"is-glob": "^4.0.3",
|
"is-glob": "^4.0.3",
|
||||||
|
@ -7815,17 +7815,17 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/utils": {
|
"node_modules/@typescript-eslint/utils": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.0.tgz",
|
||||||
"integrity": "sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==",
|
"integrity": "sha512-wiKKCbUeDPGaYEYQh1S580dGxJ/V9HI7K5sbGAVklyf+o5g3O+adnS4UNJajplF4e7z2q0uVBaTdT/yLb4XAVA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/eslint-utils": "^4.4.0",
|
"@eslint-community/eslint-utils": "^4.4.0",
|
||||||
"@types/json-schema": "^7.0.12",
|
"@types/json-schema": "^7.0.12",
|
||||||
"@types/semver": "^7.5.0",
|
"@types/semver": "^7.5.0",
|
||||||
"@typescript-eslint/scope-manager": "6.17.0",
|
"@typescript-eslint/scope-manager": "6.18.0",
|
||||||
"@typescript-eslint/types": "6.17.0",
|
"@typescript-eslint/types": "6.18.0",
|
||||||
"@typescript-eslint/typescript-estree": "6.17.0",
|
"@typescript-eslint/typescript-estree": "6.18.0",
|
||||||
"semver": "^7.5.4"
|
"semver": "^7.5.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -7873,12 +7873,12 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/visitor-keys": {
|
"node_modules/@typescript-eslint/visitor-keys": {
|
||||||
"version": "6.17.0",
|
"version": "6.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.0.tgz",
|
||||||
"integrity": "sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==",
|
"integrity": "sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "6.17.0",
|
"@typescript-eslint/types": "6.18.0",
|
||||||
"eslint-visitor-keys": "^3.4.1"
|
"eslint-visitor-keys": "^3.4.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -16426,10 +16426,13 @@
|
||||||
"integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
|
"integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
|
||||||
},
|
},
|
||||||
"node_modules/rollup": {
|
"node_modules/rollup": {
|
||||||
"version": "4.9.2",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.4.tgz",
|
||||||
"integrity": "sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==",
|
"integrity": "sha512-2ztU7pY/lrQyXSCnnoU4ICjT/tCG9cdH3/G25ERqE3Lst6vl2BCM5hL2Nw+sslAvAf+ccKsAq1SkKQALyqhR7g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@types/estree": "1.0.5"
|
||||||
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"rollup": "dist/bin/rollup"
|
"rollup": "dist/bin/rollup"
|
||||||
},
|
},
|
||||||
|
@ -16438,19 +16441,19 @@
|
||||||
"npm": ">=8.0.0"
|
"npm": ">=8.0.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@rollup/rollup-android-arm-eabi": "4.9.2",
|
"@rollup/rollup-android-arm-eabi": "4.9.4",
|
||||||
"@rollup/rollup-android-arm64": "4.9.2",
|
"@rollup/rollup-android-arm64": "4.9.4",
|
||||||
"@rollup/rollup-darwin-arm64": "4.9.2",
|
"@rollup/rollup-darwin-arm64": "4.9.4",
|
||||||
"@rollup/rollup-darwin-x64": "4.9.2",
|
"@rollup/rollup-darwin-x64": "4.9.4",
|
||||||
"@rollup/rollup-linux-arm-gnueabihf": "4.9.2",
|
"@rollup/rollup-linux-arm-gnueabihf": "4.9.4",
|
||||||
"@rollup/rollup-linux-arm64-gnu": "4.9.2",
|
"@rollup/rollup-linux-arm64-gnu": "4.9.4",
|
||||||
"@rollup/rollup-linux-arm64-musl": "4.9.2",
|
"@rollup/rollup-linux-arm64-musl": "4.9.4",
|
||||||
"@rollup/rollup-linux-riscv64-gnu": "4.9.2",
|
"@rollup/rollup-linux-riscv64-gnu": "4.9.4",
|
||||||
"@rollup/rollup-linux-x64-gnu": "4.9.2",
|
"@rollup/rollup-linux-x64-gnu": "4.9.4",
|
||||||
"@rollup/rollup-linux-x64-musl": "4.9.2",
|
"@rollup/rollup-linux-x64-musl": "4.9.4",
|
||||||
"@rollup/rollup-win32-arm64-msvc": "4.9.2",
|
"@rollup/rollup-win32-arm64-msvc": "4.9.4",
|
||||||
"@rollup/rollup-win32-ia32-msvc": "4.9.2",
|
"@rollup/rollup-win32-ia32-msvc": "4.9.4",
|
||||||
"@rollup/rollup-win32-x64-msvc": "4.9.2",
|
"@rollup/rollup-win32-x64-msvc": "4.9.4",
|
||||||
"fsevents": "~2.3.2"
|
"fsevents": "~2.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -49,8 +49,8 @@
|
||||||
"@open-wc/lit-helpers": "^0.6.0",
|
"@open-wc/lit-helpers": "^0.6.0",
|
||||||
"@patternfly/elements": "^2.4.0",
|
"@patternfly/elements": "^2.4.0",
|
||||||
"@patternfly/patternfly": "^4.224.2",
|
"@patternfly/patternfly": "^4.224.2",
|
||||||
"@sentry/browser": "^7.91.0",
|
"@sentry/browser": "^7.92.0",
|
||||||
"@sentry/tracing": "^7.91.0",
|
"@sentry/tracing": "^7.92.0",
|
||||||
"@webcomponents/webcomponentsjs": "^2.8.0",
|
"@webcomponents/webcomponentsjs": "^2.8.0",
|
||||||
"base64-js": "^1.5.1",
|
"base64-js": "^1.5.1",
|
||||||
"chart.js": "^4.4.1",
|
"chart.js": "^4.4.1",
|
||||||
|
@ -99,8 +99,8 @@
|
||||||
"@types/codemirror": "5.60.15",
|
"@types/codemirror": "5.60.15",
|
||||||
"@types/grecaptcha": "^3.0.7",
|
"@types/grecaptcha": "^3.0.7",
|
||||||
"@types/guacamole-common-js": "1.5.2",
|
"@types/guacamole-common-js": "1.5.2",
|
||||||
"@typescript-eslint/eslint-plugin": "^6.17.0",
|
"@typescript-eslint/eslint-plugin": "^6.18.0",
|
||||||
"@typescript-eslint/parser": "^6.17.0",
|
"@typescript-eslint/parser": "^6.18.0",
|
||||||
"babel-plugin-macros": "^3.1.0",
|
"babel-plugin-macros": "^3.1.0",
|
||||||
"babel-plugin-tsconfig-paths": "^1.0.3",
|
"babel-plugin-tsconfig-paths": "^1.0.3",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
|
@ -118,7 +118,7 @@
|
||||||
"pyright": "=1.1.338",
|
"pyright": "=1.1.338",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"rollup": "^4.9.2",
|
"rollup": "^4.9.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-modify": "^3.0.0",
|
"rollup-plugin-modify": "^3.0.0",
|
||||||
|
|
|
@ -7,7 +7,7 @@ import {
|
||||||
import { configureSentry } from "@goauthentik/common/sentry";
|
import { configureSentry } from "@goauthentik/common/sentry";
|
||||||
import { me } from "@goauthentik/common/users";
|
import { me } from "@goauthentik/common/users";
|
||||||
import { WebsocketClient } from "@goauthentik/common/ws";
|
import { WebsocketClient } from "@goauthentik/common/ws";
|
||||||
import { Interface } from "@goauthentik/elements/Base";
|
import { Interface } from "@goauthentik/elements/Interface";
|
||||||
import "@goauthentik/elements/ak-locale-context";
|
import "@goauthentik/elements/ak-locale-context";
|
||||||
import "@goauthentik/elements/enterprise/EnterpriseStatusBanner";
|
import "@goauthentik/elements/enterprise/EnterpriseStatusBanner";
|
||||||
import "@goauthentik/elements/messages/MessageContainer";
|
import "@goauthentik/elements/messages/MessageContainer";
|
||||||
|
|
|
@ -1,23 +1,25 @@
|
||||||
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
||||||
import { EVENT_SIDEBAR_TOGGLE, VERSION } from "@goauthentik/common/constants";
|
import { EVENT_SIDEBAR_TOGGLE, VERSION } from "@goauthentik/common/constants";
|
||||||
import { me } from "@goauthentik/common/users";
|
import { me } from "@goauthentik/common/users";
|
||||||
import { authentikConfigContext } from "@goauthentik/elements/AuthentikContexts";
|
|
||||||
import { AKElement } from "@goauthentik/elements/Base";
|
import { AKElement } from "@goauthentik/elements/Base";
|
||||||
|
import {
|
||||||
|
CapabilitiesEnum,
|
||||||
|
WithCapabilitiesConfig,
|
||||||
|
} from "@goauthentik/elements/Interface/capabilitiesProvider";
|
||||||
import { ID_REGEX, SLUG_REGEX, UUID_REGEX } from "@goauthentik/elements/router/Route";
|
import { ID_REGEX, SLUG_REGEX, UUID_REGEX } from "@goauthentik/elements/router/Route";
|
||||||
import { getRootStyle } from "@goauthentik/elements/utils/getRootStyle";
|
import { getRootStyle } from "@goauthentik/elements/utils/getRootStyle";
|
||||||
import { spread } from "@open-wc/lit-helpers";
|
import { spread } from "@open-wc/lit-helpers";
|
||||||
|
|
||||||
import { consume } from "@lit-labs/context";
|
|
||||||
import { msg, str } from "@lit/localize";
|
import { msg, str } from "@lit/localize";
|
||||||
import { TemplateResult, html, nothing } from "lit";
|
import { TemplateResult, html, nothing } from "lit";
|
||||||
import { customElement, property, state } from "lit/decorators.js";
|
import { customElement, property, state } from "lit/decorators.js";
|
||||||
import { map } from "lit/directives/map.js";
|
import { map } from "lit/directives/map.js";
|
||||||
|
|
||||||
import { AdminApi, CapabilitiesEnum, CoreApi, UiThemeEnum, Version } from "@goauthentik/api";
|
import { AdminApi, CoreApi, UiThemeEnum, Version } from "@goauthentik/api";
|
||||||
import type { Config, SessionUser, UserSelf } from "@goauthentik/api";
|
import type { SessionUser, UserSelf } from "@goauthentik/api";
|
||||||
|
|
||||||
@customElement("ak-admin-sidebar")
|
@customElement("ak-admin-sidebar")
|
||||||
export class AkAdminSidebar extends AKElement {
|
export class AkAdminSidebar extends WithCapabilitiesConfig(AKElement) {
|
||||||
@property({ type: Boolean, reflect: true })
|
@property({ type: Boolean, reflect: true })
|
||||||
open = true;
|
open = true;
|
||||||
|
|
||||||
|
@ -27,9 +29,6 @@ export class AkAdminSidebar extends AKElement {
|
||||||
@state()
|
@state()
|
||||||
impersonation: UserSelf["username"] | null = null;
|
impersonation: UserSelf["username"] | null = null;
|
||||||
|
|
||||||
@consume({ context: authentikConfigContext })
|
|
||||||
public config!: Config;
|
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
new AdminApi(DEFAULT_CONFIG).adminVersionRetrieve().then((version) => {
|
new AdminApi(DEFAULT_CONFIG).adminVersionRetrieve().then((version) => {
|
||||||
|
@ -200,7 +199,7 @@ export class AkAdminSidebar extends AKElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
renderEnterpriseMessage() {
|
renderEnterpriseMessage() {
|
||||||
return this.config?.capabilities.includes(CapabilitiesEnum.IsEnterprise)
|
return this.can(CapabilitiesEnum.IsEnterprise)
|
||||||
? html`
|
? html`
|
||||||
<ak-sidebar-item>
|
<ak-sidebar-item>
|
||||||
<span slot="label">${msg("Enterprise")}</span>
|
<span slot="label">${msg("Enterprise")}</span>
|
||||||
|
|
|
@ -74,10 +74,7 @@ export class AdminOverviewPage extends AKElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
render(): TemplateResult {
|
render(): TemplateResult {
|
||||||
let name = this.user?.user.username;
|
const name = this.user?.user.name ?? this.user?.user.username;
|
||||||
if (this.user?.user.name) {
|
|
||||||
name = this.user.user.name;
|
|
||||||
}
|
|
||||||
return html`<ak-page-header icon="" header="" description=${msg("General system status")}>
|
return html`<ak-page-header icon="" header="" description=${msg("General system status")}>
|
||||||
<span slot="header"> ${msg(str`Welcome, ${name}.`)} </span>
|
<span slot="header"> ${msg(str`Welcome, ${name}.`)} </span>
|
||||||
</ak-page-header>
|
</ak-page-header>
|
||||||
|
|
|
@ -1,13 +1,16 @@
|
||||||
import "@goauthentik/admin/applications/ProviderSelectModal";
|
import "@goauthentik/admin/applications/ProviderSelectModal";
|
||||||
import { iconHelperText } from "@goauthentik/admin/helperText";
|
import { iconHelperText } from "@goauthentik/admin/helperText";
|
||||||
import { DEFAULT_CONFIG, config } from "@goauthentik/common/api/config";
|
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
||||||
import { first } from "@goauthentik/common/utils";
|
import { first } from "@goauthentik/common/utils";
|
||||||
import "@goauthentik/components/ak-file-input";
|
import "@goauthentik/components/ak-file-input";
|
||||||
import "@goauthentik/components/ak-radio-input";
|
import "@goauthentik/components/ak-radio-input";
|
||||||
import "@goauthentik/components/ak-switch-input";
|
import "@goauthentik/components/ak-switch-input";
|
||||||
import "@goauthentik/components/ak-text-input";
|
import "@goauthentik/components/ak-text-input";
|
||||||
import "@goauthentik/components/ak-textarea-input";
|
import "@goauthentik/components/ak-textarea-input";
|
||||||
import { rootInterface } from "@goauthentik/elements/Base";
|
import {
|
||||||
|
CapabilitiesEnum,
|
||||||
|
WithCapabilitiesConfig,
|
||||||
|
} from "@goauthentik/elements/Interface/capabilitiesProvider";
|
||||||
import "@goauthentik/elements/forms/FormGroup";
|
import "@goauthentik/elements/forms/FormGroup";
|
||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
|
import "@goauthentik/elements/forms/HorizontalFormElement";
|
||||||
import "@goauthentik/elements/forms/ModalForm";
|
import "@goauthentik/elements/forms/ModalForm";
|
||||||
|
@ -22,13 +25,7 @@ import { TemplateResult, html } from "lit";
|
||||||
import { customElement, property, state } from "lit/decorators.js";
|
import { customElement, property, state } from "lit/decorators.js";
|
||||||
import { ifDefined } from "lit/directives/if-defined.js";
|
import { ifDefined } from "lit/directives/if-defined.js";
|
||||||
|
|
||||||
import {
|
import { Application, CoreApi, PolicyEngineMode, Provider } from "@goauthentik/api";
|
||||||
Application,
|
|
||||||
CapabilitiesEnum,
|
|
||||||
CoreApi,
|
|
||||||
PolicyEngineMode,
|
|
||||||
Provider,
|
|
||||||
} from "@goauthentik/api";
|
|
||||||
|
|
||||||
import "./components/ak-backchannel-input";
|
import "./components/ak-backchannel-input";
|
||||||
import "./components/ak-provider-search-input";
|
import "./components/ak-provider-search-input";
|
||||||
|
@ -48,7 +45,7 @@ export const policyOptions = [
|
||||||
];
|
];
|
||||||
|
|
||||||
@customElement("ak-application-form")
|
@customElement("ak-application-form")
|
||||||
export class ApplicationForm extends ModelForm<Application, string> {
|
export class ApplicationForm extends WithCapabilitiesConfig(ModelForm<Application, string>) {
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
this.handleConfirmBackchannelProviders = this.handleConfirmBackchannelProviders.bind(this);
|
this.handleConfirmBackchannelProviders = this.handleConfirmBackchannelProviders.bind(this);
|
||||||
|
@ -93,8 +90,7 @@ export class ApplicationForm extends ModelForm<Application, string> {
|
||||||
applicationRequest: data,
|
applicationRequest: data,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const c = await config();
|
if (this.can(CapabilitiesEnum.CanSaveMedia)) {
|
||||||
if (c.capabilities.includes(CapabilitiesEnum.CanSaveMedia)) {
|
|
||||||
const icon = this.getFormFiles()["metaIcon"];
|
const icon = this.getFormFiles()["metaIcon"];
|
||||||
if (icon || this.clearIcon) {
|
if (icon || this.clearIcon) {
|
||||||
await new CoreApi(DEFAULT_CONFIG).coreApplicationsSetIconCreate({
|
await new CoreApi(DEFAULT_CONFIG).coreApplicationsSetIconCreate({
|
||||||
|
@ -140,21 +136,21 @@ export class ApplicationForm extends ModelForm<Application, string> {
|
||||||
return html`<form class="pf-c-form pf-m-horizontal">
|
return html`<form class="pf-c-form pf-m-horizontal">
|
||||||
<ak-text-input
|
<ak-text-input
|
||||||
name="name"
|
name="name"
|
||||||
.value=${this.instance?.name}
|
value=${ifDefined(this.instance?.name)}
|
||||||
label=${msg("Name")}
|
label=${msg("Name")}
|
||||||
required
|
required
|
||||||
help=${msg("Application's display Name.")}
|
help=${msg("Application's display Name.")}
|
||||||
></ak-text-input>
|
></ak-text-input>
|
||||||
<ak-text-input
|
<ak-text-input
|
||||||
name="slug"
|
name="slug"
|
||||||
.value=${this.instance?.slug}
|
value=${ifDefined(this.instance?.slug)}
|
||||||
label=${msg("Slug")}
|
label=${msg("Slug")}
|
||||||
required
|
required
|
||||||
help=${msg("Internal application name used in URLs.")}
|
help=${msg("Internal application name used in URLs.")}
|
||||||
></ak-text-input>
|
></ak-text-input>
|
||||||
<ak-text-input
|
<ak-text-input
|
||||||
name="group"
|
name="group"
|
||||||
.value=${this.instance?.group}
|
value=${ifDefined(this.instance?.group)}
|
||||||
label=${msg("Group")}
|
label=${msg("Group")}
|
||||||
help=${msg(
|
help=${msg(
|
||||||
"Optionally enter a group name. Applications with identical groups are shown grouped together.",
|
"Optionally enter a group name. Applications with identical groups are shown grouped together.",
|
||||||
|
@ -163,7 +159,7 @@ export class ApplicationForm extends ModelForm<Application, string> {
|
||||||
<ak-provider-search-input
|
<ak-provider-search-input
|
||||||
name="provider"
|
name="provider"
|
||||||
label=${msg("Provider")}
|
label=${msg("Provider")}
|
||||||
.value=${this.instance?.provider}
|
value=${ifDefined(this.instance?.provider ?? undefined)}
|
||||||
help=${msg("Select a provider that this application should use.")}
|
help=${msg("Select a provider that this application should use.")}
|
||||||
blankable
|
blankable
|
||||||
></ak-provider-search-input>
|
></ak-provider-search-input>
|
||||||
|
@ -209,11 +205,11 @@ export class ApplicationForm extends ModelForm<Application, string> {
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
</ak-switch-input>
|
</ak-switch-input>
|
||||||
${rootInterface()?.config?.capabilities.includes(CapabilitiesEnum.CanSaveMedia)
|
${this.can(CapabilitiesEnum.CanSaveMedia)
|
||||||
? html`<ak-file-input
|
? html`<ak-file-input
|
||||||
label="${msg("Icon")}"
|
label="${msg("Icon")}"
|
||||||
name="metaIcon"
|
name="metaIcon"
|
||||||
.value=${this.instance?.metaIcon}
|
value=${ifDefined(this.instance?.metaIcon ?? undefined)}
|
||||||
current=${msg("Currently set to:")}
|
current=${msg("Currently set to:")}
|
||||||
></ak-file-input>
|
></ak-file-input>
|
||||||
${this.instance?.metaIcon
|
${this.instance?.metaIcon
|
||||||
|
|
|
@ -7,7 +7,7 @@ import "@goauthentik/components/ak-number-input";
|
||||||
import "@goauthentik/components/ak-radio-input";
|
import "@goauthentik/components/ak-radio-input";
|
||||||
import "@goauthentik/components/ak-switch-input";
|
import "@goauthentik/components/ak-switch-input";
|
||||||
import "@goauthentik/components/ak-text-input";
|
import "@goauthentik/components/ak-text-input";
|
||||||
import { rootInterface } from "@goauthentik/elements/Base";
|
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
|
||||||
import "@goauthentik/elements/forms/FormGroup";
|
import "@goauthentik/elements/forms/FormGroup";
|
||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
|
import "@goauthentik/elements/forms/HorizontalFormElement";
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ import {
|
||||||
} from "./LDAPOptionsAndHelp";
|
} from "./LDAPOptionsAndHelp";
|
||||||
|
|
||||||
@customElement("ak-application-wizard-authentication-by-ldap")
|
@customElement("ak-application-wizard-authentication-by-ldap")
|
||||||
export class ApplicationWizardApplicationDetails extends BaseProviderPanel {
|
export class ApplicationWizardApplicationDetails extends WithTenantConfig(BaseProviderPanel) {
|
||||||
render() {
|
render() {
|
||||||
const provider = this.wizard.provider as LDAPProvider | undefined;
|
const provider = this.wizard.provider as LDAPProvider | undefined;
|
||||||
const errors = this.wizard.errors.provider;
|
const errors = this.wizard.errors.provider;
|
||||||
|
@ -57,7 +57,7 @@ export class ApplicationWizardApplicationDetails extends BaseProviderPanel {
|
||||||
<ak-tenanted-flow-search
|
<ak-tenanted-flow-search
|
||||||
flowType=${FlowsInstancesListDesignationEnum.Authentication}
|
flowType=${FlowsInstancesListDesignationEnum.Authentication}
|
||||||
.currentFlow=${provider?.authorizationFlow}
|
.currentFlow=${provider?.authorizationFlow}
|
||||||
.tenantFlow=${rootInterface()?.tenant?.flowAuthentication}
|
.tenantFlow=${this.tenant.flowAuthentication}
|
||||||
required
|
required
|
||||||
></ak-tenanted-flow-search>
|
></ak-tenanted-flow-search>
|
||||||
<p class="pf-c-form__helper-text">
|
<p class="pf-c-form__helper-text">
|
||||||
|
|
|
@ -3,7 +3,7 @@ import "@goauthentik/admin/common/ak-crypto-certificate-search";
|
||||||
import "@goauthentik/admin/common/ak-flow-search/ak-tenanted-flow-search";
|
import "@goauthentik/admin/common/ak-flow-search/ak-tenanted-flow-search";
|
||||||
import { ascii_letters, digits, first, randomString } from "@goauthentik/common/utils";
|
import { ascii_letters, digits, first, randomString } from "@goauthentik/common/utils";
|
||||||
import "@goauthentik/components/ak-text-input";
|
import "@goauthentik/components/ak-text-input";
|
||||||
import { rootInterface } from "@goauthentik/elements/Base";
|
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
|
||||||
import "@goauthentik/elements/forms/FormGroup";
|
import "@goauthentik/elements/forms/FormGroup";
|
||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
|
import "@goauthentik/elements/forms/HorizontalFormElement";
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ import { FlowsInstancesListDesignationEnum, RadiusProvider } from "@goauthentik/
|
||||||
import BaseProviderPanel from "../BaseProviderPanel";
|
import BaseProviderPanel from "../BaseProviderPanel";
|
||||||
|
|
||||||
@customElement("ak-application-wizard-authentication-by-radius")
|
@customElement("ak-application-wizard-authentication-by-radius")
|
||||||
export class ApplicationWizardAuthenticationByRadius extends BaseProviderPanel {
|
export class ApplicationWizardAuthenticationByRadius extends WithTenantConfig(BaseProviderPanel) {
|
||||||
render() {
|
render() {
|
||||||
const provider = this.wizard.provider as RadiusProvider | undefined;
|
const provider = this.wizard.provider as RadiusProvider | undefined;
|
||||||
const errors = this.wizard.errors.provider;
|
const errors = this.wizard.errors.provider;
|
||||||
|
@ -42,7 +42,7 @@ export class ApplicationWizardAuthenticationByRadius extends BaseProviderPanel {
|
||||||
<ak-tenanted-flow-search
|
<ak-tenanted-flow-search
|
||||||
flowType=${FlowsInstancesListDesignationEnum.Authentication}
|
flowType=${FlowsInstancesListDesignationEnum.Authentication}
|
||||||
.currentFlow=${provider?.authorizationFlow}
|
.currentFlow=${provider?.authorizationFlow}
|
||||||
.tenantFlow=${rootInterface()?.tenant?.flowAuthentication}
|
.tenantFlow=${this.tenant.flowAuthentication}
|
||||||
required
|
required
|
||||||
></ak-tenanted-flow-search>
|
></ak-tenanted-flow-search>
|
||||||
<p class="pf-c-form__helper-text">
|
<p class="pf-c-form__helper-text">
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
import { DesignationToLabel, LayoutToLabel } from "@goauthentik/admin/flows/utils";
|
import { DesignationToLabel, LayoutToLabel } from "@goauthentik/admin/flows/utils";
|
||||||
import { AuthenticationEnum } from "@goauthentik/api/dist/models/AuthenticationEnum";
|
import { AuthenticationEnum } from "@goauthentik/api/dist/models/AuthenticationEnum";
|
||||||
import { DEFAULT_CONFIG, config } from "@goauthentik/common/api/config";
|
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
||||||
import { first } from "@goauthentik/common/utils";
|
import { first } from "@goauthentik/common/utils";
|
||||||
import { rootInterface } from "@goauthentik/elements/Base";
|
import {
|
||||||
|
CapabilitiesEnum,
|
||||||
|
WithCapabilitiesConfig,
|
||||||
|
} from "@goauthentik/elements/Interface/capabilitiesProvider";
|
||||||
import "@goauthentik/elements/forms/FormGroup";
|
import "@goauthentik/elements/forms/FormGroup";
|
||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
|
import "@goauthentik/elements/forms/HorizontalFormElement";
|
||||||
import { ModelForm } from "@goauthentik/elements/forms/ModelForm";
|
import { ModelForm } from "@goauthentik/elements/forms/ModelForm";
|
||||||
|
@ -14,7 +17,6 @@ import { customElement, property } from "lit/decorators.js";
|
||||||
import { ifDefined } from "lit/directives/if-defined.js";
|
import { ifDefined } from "lit/directives/if-defined.js";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
CapabilitiesEnum,
|
|
||||||
DeniedActionEnum,
|
DeniedActionEnum,
|
||||||
Flow,
|
Flow,
|
||||||
FlowDesignationEnum,
|
FlowDesignationEnum,
|
||||||
|
@ -24,7 +26,7 @@ import {
|
||||||
} from "@goauthentik/api";
|
} from "@goauthentik/api";
|
||||||
|
|
||||||
@customElement("ak-flow-form")
|
@customElement("ak-flow-form")
|
||||||
export class FlowForm extends ModelForm<Flow, string> {
|
export class FlowForm extends WithCapabilitiesConfig(ModelForm<Flow, string>) {
|
||||||
async loadInstance(pk: string): Promise<Flow> {
|
async loadInstance(pk: string): Promise<Flow> {
|
||||||
const flow = await new FlowsApi(DEFAULT_CONFIG).flowsInstancesRetrieve({
|
const flow = await new FlowsApi(DEFAULT_CONFIG).flowsInstancesRetrieve({
|
||||||
slug: pk,
|
slug: pk,
|
||||||
|
@ -54,8 +56,8 @@ export class FlowForm extends ModelForm<Flow, string> {
|
||||||
flowRequest: data,
|
flowRequest: data,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const c = await config();
|
|
||||||
if (c.capabilities.includes(CapabilitiesEnum.CanSaveMedia)) {
|
if (this.can(CapabilitiesEnum.CanSaveMedia)) {
|
||||||
const icon = this.getFormFiles()["background"];
|
const icon = this.getFormFiles()["background"];
|
||||||
if (icon || this.clearBackground) {
|
if (icon || this.clearBackground) {
|
||||||
await new FlowsApi(DEFAULT_CONFIG).flowsInstancesSetBackgroundCreate({
|
await new FlowsApi(DEFAULT_CONFIG).flowsInstancesSetBackgroundCreate({
|
||||||
|
@ -340,7 +342,7 @@ export class FlowForm extends ModelForm<Flow, string> {
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
</ak-form-element-horizontal>
|
</ak-form-element-horizontal>
|
||||||
${rootInterface()?.config?.capabilities.includes(CapabilitiesEnum.CanSaveMedia)
|
${this.can(CapabilitiesEnum.CanSaveMedia)
|
||||||
? html`<ak-form-element-horizontal
|
? html`<ak-form-element-horizontal
|
||||||
label=${msg("Background")}
|
label=${msg("Background")}
|
||||||
name="background"
|
name="background"
|
||||||
|
|
|
@ -118,7 +118,7 @@ export class GroupViewPage extends AKElement {
|
||||||
<div class="pf-c-description-list__text">
|
<div class="pf-c-description-list__text">
|
||||||
<ak-status-label
|
<ak-status-label
|
||||||
type="warning"
|
type="warning"
|
||||||
?good=${this.group.isSuperuser}
|
?good${this.group.isSuperuser}
|
||||||
></ak-status-label>
|
></ak-status-label>
|
||||||
</div>
|
</div>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
|
@ -9,7 +9,11 @@ import { MessageLevel } from "@goauthentik/common/messages";
|
||||||
import { uiConfig } from "@goauthentik/common/ui/config";
|
import { uiConfig } from "@goauthentik/common/ui/config";
|
||||||
import { first } from "@goauthentik/common/utils";
|
import { first } from "@goauthentik/common/utils";
|
||||||
import "@goauthentik/components/ak-status-label";
|
import "@goauthentik/components/ak-status-label";
|
||||||
import { rootInterface } from "@goauthentik/elements/Base";
|
import {
|
||||||
|
CapabilitiesEnum,
|
||||||
|
WithCapabilitiesConfig,
|
||||||
|
} from "@goauthentik/elements/Interface/capabilitiesProvider";
|
||||||
|
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
|
||||||
import "@goauthentik/elements/buttons/ActionButton";
|
import "@goauthentik/elements/buttons/ActionButton";
|
||||||
import "@goauthentik/elements/buttons/Dropdown";
|
import "@goauthentik/elements/buttons/Dropdown";
|
||||||
import "@goauthentik/elements/forms/DeleteBulkForm";
|
import "@goauthentik/elements/forms/DeleteBulkForm";
|
||||||
|
@ -33,7 +37,6 @@ import PFBanner from "@patternfly/patternfly/components/Banner/banner.css";
|
||||||
import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css";
|
import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
CapabilitiesEnum,
|
|
||||||
CoreApi,
|
CoreApi,
|
||||||
CoreUsersListTypeEnum,
|
CoreUsersListTypeEnum,
|
||||||
Group,
|
Group,
|
||||||
|
@ -107,7 +110,7 @@ export class RelatedUserAdd extends Form<{ users: number[] }> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@customElement("ak-user-related-list")
|
@customElement("ak-user-related-list")
|
||||||
export class RelatedUserList extends Table<User> {
|
export class RelatedUserList extends WithTenantConfig(WithCapabilitiesConfig(Table<User>)) {
|
||||||
expandable = true;
|
expandable = true;
|
||||||
checkbox = true;
|
checkbox = true;
|
||||||
|
|
||||||
|
@ -188,8 +191,7 @@ export class RelatedUserList extends Table<User> {
|
||||||
|
|
||||||
row(item: User): TemplateResult[] {
|
row(item: User): TemplateResult[] {
|
||||||
const canImpersonate =
|
const canImpersonate =
|
||||||
rootInterface()?.config?.capabilities.includes(CapabilitiesEnum.CanImpersonate) &&
|
this.can(CapabilitiesEnum.CanImpersonate) && item.pk !== this.me?.user.pk;
|
||||||
item.pk !== this.me?.user.pk;
|
|
||||||
return [
|
return [
|
||||||
html`<a href="#/identity/users/${item.pk}">
|
html`<a href="#/identity/users/${item.pk}">
|
||||||
<div>${item.username}</div>
|
<div>${item.username}</div>
|
||||||
|
@ -293,7 +295,7 @@ export class RelatedUserList extends Table<User> {
|
||||||
${msg("Set password")}
|
${msg("Set password")}
|
||||||
</button>
|
</button>
|
||||||
</ak-forms-modal>
|
</ak-forms-modal>
|
||||||
${rootInterface()?.tenant?.flowRecovery
|
${this.tenant?.flowRecovery
|
||||||
? html`
|
? html`
|
||||||
<ak-action-button
|
<ak-action-button
|
||||||
class="pf-m-secondary"
|
class="pf-m-secondary"
|
||||||
|
|
|
@ -3,7 +3,7 @@ import "@goauthentik/admin/common/ak-flow-search/ak-tenanted-flow-search";
|
||||||
import { BaseProviderForm } from "@goauthentik/admin/providers/BaseProviderForm";
|
import { BaseProviderForm } from "@goauthentik/admin/providers/BaseProviderForm";
|
||||||
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
||||||
import { first } from "@goauthentik/common/utils";
|
import { first } from "@goauthentik/common/utils";
|
||||||
import { rootInterface } from "@goauthentik/elements/Base";
|
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
|
||||||
import "@goauthentik/elements/forms/FormGroup";
|
import "@goauthentik/elements/forms/FormGroup";
|
||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
|
import "@goauthentik/elements/forms/HorizontalFormElement";
|
||||||
import "@goauthentik/elements/forms/Radio";
|
import "@goauthentik/elements/forms/Radio";
|
||||||
|
@ -25,7 +25,7 @@ import {
|
||||||
} from "@goauthentik/api";
|
} from "@goauthentik/api";
|
||||||
|
|
||||||
@customElement("ak-provider-ldap-form")
|
@customElement("ak-provider-ldap-form")
|
||||||
export class LDAPProviderFormPage extends BaseProviderForm<LDAPProvider> {
|
export class LDAPProviderFormPage extends WithTenantConfig(BaseProviderForm<LDAPProvider>) {
|
||||||
async loadInstance(pk: number): Promise<LDAPProvider> {
|
async loadInstance(pk: number): Promise<LDAPProvider> {
|
||||||
return new ProvidersApi(DEFAULT_CONFIG).providersLdapRetrieve({
|
return new ProvidersApi(DEFAULT_CONFIG).providersLdapRetrieve({
|
||||||
id: pk,
|
id: pk,
|
||||||
|
@ -68,7 +68,7 @@ export class LDAPProviderFormPage extends BaseProviderForm<LDAPProvider> {
|
||||||
<ak-tenanted-flow-search
|
<ak-tenanted-flow-search
|
||||||
flowType=${FlowsInstancesListDesignationEnum.Authentication}
|
flowType=${FlowsInstancesListDesignationEnum.Authentication}
|
||||||
.currentFlow=${this.instance?.authorizationFlow}
|
.currentFlow=${this.instance?.authorizationFlow}
|
||||||
.tenantFlow=${rootInterface()?.tenant?.flowAuthentication}
|
.tenantFlow=${this.tenant?.flowAuthentication}
|
||||||
required
|
required
|
||||||
></ak-tenanted-flow-search>
|
></ak-tenanted-flow-search>
|
||||||
<p class="pf-c-form__helper-text">${msg("Flow used for users to authenticate.")}</p>
|
<p class="pf-c-form__helper-text">${msg("Flow used for users to authenticate.")}</p>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { BaseProviderForm } from "@goauthentik/admin/providers/BaseProviderForm";
|
import { BaseProviderForm } from "@goauthentik/admin/providers/BaseProviderForm";
|
||||||
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
||||||
import { ascii_letters, digits, first, randomString } from "@goauthentik/common/utils";
|
import { ascii_letters, digits, first, randomString } from "@goauthentik/common/utils";
|
||||||
import { rootInterface } from "@goauthentik/elements/Base";
|
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
|
||||||
import "@goauthentik/elements/forms/FormGroup";
|
import "@goauthentik/elements/forms/FormGroup";
|
||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
|
import "@goauthentik/elements/forms/HorizontalFormElement";
|
||||||
import "@goauthentik/elements/forms/SearchSelect";
|
import "@goauthentik/elements/forms/SearchSelect";
|
||||||
|
@ -14,7 +14,7 @@ import { customElement } from "lit/decorators.js";
|
||||||
import { FlowsInstancesListDesignationEnum, ProvidersApi, RadiusProvider } from "@goauthentik/api";
|
import { FlowsInstancesListDesignationEnum, ProvidersApi, RadiusProvider } from "@goauthentik/api";
|
||||||
|
|
||||||
@customElement("ak-provider-radius-form")
|
@customElement("ak-provider-radius-form")
|
||||||
export class RadiusProviderFormPage extends BaseProviderForm<RadiusProvider> {
|
export class RadiusProviderFormPage extends WithTenantConfig(BaseProviderForm<RadiusProvider>) {
|
||||||
loadInstance(pk: number): Promise<RadiusProvider> {
|
loadInstance(pk: number): Promise<RadiusProvider> {
|
||||||
return new ProvidersApi(DEFAULT_CONFIG).providersRadiusRetrieve({
|
return new ProvidersApi(DEFAULT_CONFIG).providersRadiusRetrieve({
|
||||||
id: pk,
|
id: pk,
|
||||||
|
@ -57,7 +57,7 @@ export class RadiusProviderFormPage extends BaseProviderForm<RadiusProvider> {
|
||||||
<ak-tenanted-flow-search
|
<ak-tenanted-flow-search
|
||||||
flowType=${FlowsInstancesListDesignationEnum.Authentication}
|
flowType=${FlowsInstancesListDesignationEnum.Authentication}
|
||||||
.currentFlow=${this.instance?.authorizationFlow}
|
.currentFlow=${this.instance?.authorizationFlow}
|
||||||
.tenantFlow=${rootInterface()?.tenant?.flowAuthentication}
|
.tenantFlow=${this.tenant?.flowAuthentication}
|
||||||
required
|
required
|
||||||
></ak-tenanted-flow-search>
|
></ak-tenanted-flow-search>
|
||||||
<p class="pf-c-form__helper-text">${msg("Flow used for users to authenticate.")}</p>
|
<p class="pf-c-form__helper-text">${msg("Flow used for users to authenticate.")}</p>
|
||||||
|
|
|
@ -4,9 +4,12 @@ import { BaseSourceForm } from "@goauthentik/admin/sources/BaseSourceForm";
|
||||||
import { UserMatchingModeToLabel } from "@goauthentik/admin/sources/oauth/utils";
|
import { UserMatchingModeToLabel } from "@goauthentik/admin/sources/oauth/utils";
|
||||||
import { DEFAULT_CONFIG, config } from "@goauthentik/common/api/config";
|
import { DEFAULT_CONFIG, config } from "@goauthentik/common/api/config";
|
||||||
import { first } from "@goauthentik/common/utils";
|
import { first } from "@goauthentik/common/utils";
|
||||||
import { rootInterface } from "@goauthentik/elements/Base";
|
|
||||||
import "@goauthentik/elements/CodeMirror";
|
import "@goauthentik/elements/CodeMirror";
|
||||||
import { CodeMirrorMode } from "@goauthentik/elements/CodeMirror";
|
import { CodeMirrorMode } from "@goauthentik/elements/CodeMirror";
|
||||||
|
import {
|
||||||
|
CapabilitiesEnum,
|
||||||
|
WithCapabilitiesConfig,
|
||||||
|
} from "@goauthentik/elements/Interface/capabilitiesProvider";
|
||||||
import "@goauthentik/elements/forms/FormGroup";
|
import "@goauthentik/elements/forms/FormGroup";
|
||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
|
import "@goauthentik/elements/forms/HorizontalFormElement";
|
||||||
import "@goauthentik/elements/forms/SearchSelect";
|
import "@goauthentik/elements/forms/SearchSelect";
|
||||||
|
@ -17,7 +20,6 @@ import { customElement, property, state } from "lit/decorators.js";
|
||||||
import { ifDefined } from "lit/directives/if-defined.js";
|
import { ifDefined } from "lit/directives/if-defined.js";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
CapabilitiesEnum,
|
|
||||||
FlowsInstancesListDesignationEnum,
|
FlowsInstancesListDesignationEnum,
|
||||||
OAuthSource,
|
OAuthSource,
|
||||||
OAuthSourceRequest,
|
OAuthSourceRequest,
|
||||||
|
@ -28,7 +30,7 @@ import {
|
||||||
} from "@goauthentik/api";
|
} from "@goauthentik/api";
|
||||||
|
|
||||||
@customElement("ak-source-oauth-form")
|
@customElement("ak-source-oauth-form")
|
||||||
export class OAuthSourceForm extends BaseSourceForm<OAuthSource> {
|
export class OAuthSourceForm extends WithCapabilitiesConfig(BaseSourceForm<OAuthSource>) {
|
||||||
async loadInstance(pk: string): Promise<OAuthSource> {
|
async loadInstance(pk: string): Promise<OAuthSource> {
|
||||||
const source = await new SourcesApi(DEFAULT_CONFIG).sourcesOauthRetrieve({
|
const source = await new SourcesApi(DEFAULT_CONFIG).sourcesOauthRetrieve({
|
||||||
slug: pk,
|
slug: pk,
|
||||||
|
@ -318,7 +320,7 @@ export class OAuthSourceForm extends BaseSourceForm<OAuthSource> {
|
||||||
/>
|
/>
|
||||||
<p class="pf-c-form__helper-text">${placeholderHelperText}</p>
|
<p class="pf-c-form__helper-text">${placeholderHelperText}</p>
|
||||||
</ak-form-element-horizontal>
|
</ak-form-element-horizontal>
|
||||||
${rootInterface()?.config?.capabilities.includes(CapabilitiesEnum.CanSaveMedia)
|
${this.can(CapabilitiesEnum.CanSaveMedia)
|
||||||
? html`<ak-form-element-horizontal label=${msg("Icon")} name="icon">
|
? html`<ak-form-element-horizontal label=${msg("Icon")} name="icon">
|
||||||
<input type="file" value="" class="pf-c-form-control" />
|
<input type="file" value="" class="pf-c-form-control" />
|
||||||
${this.instance?.icon
|
${this.instance?.icon
|
||||||
|
|
|
@ -2,10 +2,13 @@ import "@goauthentik/admin/common/ak-flow-search/ak-source-flow-search";
|
||||||
import { iconHelperText, placeholderHelperText } from "@goauthentik/admin/helperText";
|
import { iconHelperText, placeholderHelperText } from "@goauthentik/admin/helperText";
|
||||||
import { BaseSourceForm } from "@goauthentik/admin/sources/BaseSourceForm";
|
import { BaseSourceForm } from "@goauthentik/admin/sources/BaseSourceForm";
|
||||||
import { UserMatchingModeToLabel } from "@goauthentik/admin/sources/oauth/utils";
|
import { UserMatchingModeToLabel } from "@goauthentik/admin/sources/oauth/utils";
|
||||||
import { DEFAULT_CONFIG, config } from "@goauthentik/common/api/config";
|
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
||||||
import { PlexAPIClient, PlexResource, popupCenterScreen } from "@goauthentik/common/helpers/plex";
|
import { PlexAPIClient, PlexResource, popupCenterScreen } from "@goauthentik/common/helpers/plex";
|
||||||
import { ascii_letters, digits, first, randomString } from "@goauthentik/common/utils";
|
import { ascii_letters, digits, first, randomString } from "@goauthentik/common/utils";
|
||||||
import { rootInterface } from "@goauthentik/elements/Base";
|
import {
|
||||||
|
CapabilitiesEnum,
|
||||||
|
WithCapabilitiesConfig,
|
||||||
|
} from "@goauthentik/elements/Interface/capabilitiesProvider";
|
||||||
import "@goauthentik/elements/forms/FormGroup";
|
import "@goauthentik/elements/forms/FormGroup";
|
||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
|
import "@goauthentik/elements/forms/HorizontalFormElement";
|
||||||
import "@goauthentik/elements/forms/SearchSelect";
|
import "@goauthentik/elements/forms/SearchSelect";
|
||||||
|
@ -16,7 +19,6 @@ import { customElement, property, state } from "lit/decorators.js";
|
||||||
import { ifDefined } from "lit/directives/if-defined.js";
|
import { ifDefined } from "lit/directives/if-defined.js";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
CapabilitiesEnum,
|
|
||||||
FlowsInstancesListDesignationEnum,
|
FlowsInstancesListDesignationEnum,
|
||||||
PlexSource,
|
PlexSource,
|
||||||
SourcesApi,
|
SourcesApi,
|
||||||
|
@ -24,7 +26,7 @@ import {
|
||||||
} from "@goauthentik/api";
|
} from "@goauthentik/api";
|
||||||
|
|
||||||
@customElement("ak-source-plex-form")
|
@customElement("ak-source-plex-form")
|
||||||
export class PlexSourceForm extends BaseSourceForm<PlexSource> {
|
export class PlexSourceForm extends WithCapabilitiesConfig(BaseSourceForm<PlexSource>) {
|
||||||
async loadInstance(pk: string): Promise<PlexSource> {
|
async loadInstance(pk: string): Promise<PlexSource> {
|
||||||
const source = await new SourcesApi(DEFAULT_CONFIG).sourcesPlexRetrieve({
|
const source = await new SourcesApi(DEFAULT_CONFIG).sourcesPlexRetrieve({
|
||||||
slug: pk,
|
slug: pk,
|
||||||
|
@ -63,8 +65,7 @@ export class PlexSourceForm extends BaseSourceForm<PlexSource> {
|
||||||
plexSourceRequest: data,
|
plexSourceRequest: data,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const c = await config();
|
if (this.can(CapabilitiesEnum.CanSaveMedia)) {
|
||||||
if (c.capabilities.includes(CapabilitiesEnum.CanSaveMedia)) {
|
|
||||||
const icon = this.getFormFiles()["icon"];
|
const icon = this.getFormFiles()["icon"];
|
||||||
if (icon || this.clearIcon) {
|
if (icon || this.clearIcon) {
|
||||||
await new SourcesApi(DEFAULT_CONFIG).sourcesAllSetIconCreate({
|
await new SourcesApi(DEFAULT_CONFIG).sourcesAllSetIconCreate({
|
||||||
|
@ -255,7 +256,7 @@ export class PlexSourceForm extends BaseSourceForm<PlexSource> {
|
||||||
/>
|
/>
|
||||||
<p class="pf-c-form__helper-text">${placeholderHelperText}</p>
|
<p class="pf-c-form__helper-text">${placeholderHelperText}</p>
|
||||||
</ak-form-element-horizontal>
|
</ak-form-element-horizontal>
|
||||||
${rootInterface()?.config?.capabilities.includes(CapabilitiesEnum.CanSaveMedia)
|
${this.can(CapabilitiesEnum.CanSaveMedia)
|
||||||
? html`<ak-form-element-horizontal label=${msg("Icon")} name="icon">
|
? html`<ak-form-element-horizontal label=${msg("Icon")} name="icon">
|
||||||
<input type="file" value="" class="pf-c-form-control" />
|
<input type="file" value="" class="pf-c-form-control" />
|
||||||
${this.instance?.icon
|
${this.instance?.icon
|
||||||
|
|
|
@ -5,7 +5,10 @@ import { BaseSourceForm } from "@goauthentik/admin/sources/BaseSourceForm";
|
||||||
import { UserMatchingModeToLabel } from "@goauthentik/admin/sources/oauth/utils";
|
import { UserMatchingModeToLabel } from "@goauthentik/admin/sources/oauth/utils";
|
||||||
import { DEFAULT_CONFIG, config } from "@goauthentik/common/api/config";
|
import { DEFAULT_CONFIG, config } from "@goauthentik/common/api/config";
|
||||||
import { first } from "@goauthentik/common/utils";
|
import { first } from "@goauthentik/common/utils";
|
||||||
import { rootInterface } from "@goauthentik/elements/Base";
|
import {
|
||||||
|
CapabilitiesEnum,
|
||||||
|
WithCapabilitiesConfig,
|
||||||
|
} from "@goauthentik/elements/Interface/capabilitiesProvider";
|
||||||
import "@goauthentik/elements/forms/FormGroup";
|
import "@goauthentik/elements/forms/FormGroup";
|
||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
|
import "@goauthentik/elements/forms/HorizontalFormElement";
|
||||||
import "@goauthentik/elements/forms/Radio";
|
import "@goauthentik/elements/forms/Radio";
|
||||||
|
@ -18,7 +21,6 @@ import { ifDefined } from "lit/directives/if-defined.js";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
BindingTypeEnum,
|
BindingTypeEnum,
|
||||||
CapabilitiesEnum,
|
|
||||||
DigestAlgorithmEnum,
|
DigestAlgorithmEnum,
|
||||||
FlowsInstancesListDesignationEnum,
|
FlowsInstancesListDesignationEnum,
|
||||||
NameIdPolicyEnum,
|
NameIdPolicyEnum,
|
||||||
|
@ -29,7 +31,7 @@ import {
|
||||||
} from "@goauthentik/api";
|
} from "@goauthentik/api";
|
||||||
|
|
||||||
@customElement("ak-source-saml-form")
|
@customElement("ak-source-saml-form")
|
||||||
export class SAMLSourceForm extends BaseSourceForm<SAMLSource> {
|
export class SAMLSourceForm extends WithCapabilitiesConfig(BaseSourceForm<SAMLSource>) {
|
||||||
@state()
|
@state()
|
||||||
clearIcon = false;
|
clearIcon = false;
|
||||||
|
|
||||||
|
@ -149,7 +151,7 @@ export class SAMLSourceForm extends BaseSourceForm<SAMLSource> {
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
</ak-form-element-horizontal>
|
</ak-form-element-horizontal>
|
||||||
${rootInterface()?.config?.capabilities.includes(CapabilitiesEnum.CanSaveMedia)
|
${this.can(CapabilitiesEnum.CanSaveMedia)
|
||||||
? html`<ak-form-element-horizontal label=${msg("Icon")} name="icon">
|
? html`<ak-form-element-horizontal label=${msg("Icon")} name="icon">
|
||||||
<input type="file" value="" class="pf-c-form-control" />
|
<input type="file" value="" class="pf-c-form-control" />
|
||||||
${this.instance?.icon
|
${this.instance?.icon
|
||||||
|
|
|
@ -12,6 +12,11 @@ import { DefaultUIConfig, uiConfig } from "@goauthentik/common/ui/config";
|
||||||
import { first } from "@goauthentik/common/utils";
|
import { first } from "@goauthentik/common/utils";
|
||||||
import "@goauthentik/components/ak-status-label";
|
import "@goauthentik/components/ak-status-label";
|
||||||
import { rootInterface } from "@goauthentik/elements/Base";
|
import { rootInterface } from "@goauthentik/elements/Base";
|
||||||
|
import {
|
||||||
|
CapabilitiesEnum,
|
||||||
|
WithCapabilitiesConfig,
|
||||||
|
} from "@goauthentik/elements/Interface/capabilitiesProvider";
|
||||||
|
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
|
||||||
import { PFSize } from "@goauthentik/elements/Spinner";
|
import { PFSize } from "@goauthentik/elements/Spinner";
|
||||||
import "@goauthentik/elements/TreeView";
|
import "@goauthentik/elements/TreeView";
|
||||||
import "@goauthentik/elements/buttons/ActionButton";
|
import "@goauthentik/elements/buttons/ActionButton";
|
||||||
|
@ -33,14 +38,7 @@ import PFAlert from "@patternfly/patternfly/components/Alert/alert.css";
|
||||||
import PFCard from "@patternfly/patternfly/components/Card/card.css";
|
import PFCard from "@patternfly/patternfly/components/Card/card.css";
|
||||||
import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css";
|
import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css";
|
||||||
|
|
||||||
import {
|
import { CoreApi, ResponseError, SessionUser, User, UserPath } from "@goauthentik/api";
|
||||||
CapabilitiesEnum,
|
|
||||||
CoreApi,
|
|
||||||
ResponseError,
|
|
||||||
SessionUser,
|
|
||||||
User,
|
|
||||||
UserPath,
|
|
||||||
} from "@goauthentik/api";
|
|
||||||
|
|
||||||
export const requestRecoveryLink = (user: User) =>
|
export const requestRecoveryLink = (user: User) =>
|
||||||
new CoreApi(DEFAULT_CONFIG)
|
new CoreApi(DEFAULT_CONFIG)
|
||||||
|
@ -93,7 +91,7 @@ const recoveryButtonStyles = css`
|
||||||
`;
|
`;
|
||||||
|
|
||||||
@customElement("ak-user-list")
|
@customElement("ak-user-list")
|
||||||
export class UserListPage extends TablePage<User> {
|
export class UserListPage extends WithTenantConfig(WithCapabilitiesConfig(TablePage<User>)) {
|
||||||
expandable = true;
|
expandable = true;
|
||||||
checkbox = true;
|
checkbox = true;
|
||||||
|
|
||||||
|
@ -244,8 +242,7 @@ export class UserListPage extends TablePage<User> {
|
||||||
|
|
||||||
row(item: User): TemplateResult[] {
|
row(item: User): TemplateResult[] {
|
||||||
const canImpersonate =
|
const canImpersonate =
|
||||||
rootInterface()?.config?.capabilities.includes(CapabilitiesEnum.CanImpersonate) &&
|
this.can(CapabilitiesEnum.CanImpersonate) && item.pk !== this.me?.user.pk;
|
||||||
item.pk !== this.me?.user.pk;
|
|
||||||
return [
|
return [
|
||||||
html`<a href="#/identity/users/${item.pk}">
|
html`<a href="#/identity/users/${item.pk}">
|
||||||
<div>${item.username}</div>
|
<div>${item.username}</div>
|
||||||
|
@ -355,7 +352,7 @@ export class UserListPage extends TablePage<User> {
|
||||||
${msg("Set password")}
|
${msg("Set password")}
|
||||||
</button>
|
</button>
|
||||||
</ak-forms-modal>
|
</ak-forms-modal>
|
||||||
${rootInterface()?.tenant?.flowRecovery
|
${this.tenant.flowRecovery
|
||||||
? html`
|
? html`
|
||||||
<ak-action-button
|
<ak-action-button
|
||||||
class="pf-m-secondary"
|
class="pf-m-secondary"
|
||||||
|
|
|
@ -22,8 +22,9 @@ import {
|
||||||
import "@goauthentik/components/ak-status-label";
|
import "@goauthentik/components/ak-status-label";
|
||||||
import "@goauthentik/components/events/ObjectChangelog";
|
import "@goauthentik/components/events/ObjectChangelog";
|
||||||
import "@goauthentik/components/events/UserEvents";
|
import "@goauthentik/components/events/UserEvents";
|
||||||
import { AKElement, rootInterface } from "@goauthentik/elements/Base";
|
import { AKElement } from "@goauthentik/elements/Base";
|
||||||
import "@goauthentik/elements/CodeMirror";
|
import "@goauthentik/elements/CodeMirror";
|
||||||
|
import { WithCapabilitiesConfig } from "@goauthentik/elements/Interface/capabilitiesProvider";
|
||||||
import "@goauthentik/elements/PageHeader";
|
import "@goauthentik/elements/PageHeader";
|
||||||
import { PFSize } from "@goauthentik/elements/Spinner";
|
import { PFSize } from "@goauthentik/elements/Spinner";
|
||||||
import "@goauthentik/elements/Tabs";
|
import "@goauthentik/elements/Tabs";
|
||||||
|
@ -60,7 +61,7 @@ import {
|
||||||
import "./UserDevicesTable";
|
import "./UserDevicesTable";
|
||||||
|
|
||||||
@customElement("ak-user-view")
|
@customElement("ak-user-view")
|
||||||
export class UserViewPage extends AKElement {
|
export class UserViewPage extends WithCapabilitiesConfig(AKElement) {
|
||||||
@property({ type: Number })
|
@property({ type: Number })
|
||||||
set userId(id: number) {
|
set userId(id: number) {
|
||||||
me().then((me) => {
|
me().then((me) => {
|
||||||
|
@ -163,8 +164,7 @@ export class UserViewPage extends AKElement {
|
||||||
|
|
||||||
renderActionButtons(user: User) {
|
renderActionButtons(user: User) {
|
||||||
const canImpersonate =
|
const canImpersonate =
|
||||||
rootInterface()?.config?.capabilities.includes(CapabilitiesEnum.CanImpersonate) &&
|
this.can(CapabilitiesEnum.CanImpersonate) && user.pk !== this.me?.user.pk;
|
||||||
user.pk !== this.me?.user.pk;
|
|
||||||
|
|
||||||
return html`<div class="ak-button-collection">
|
return html`<div class="ak-button-collection">
|
||||||
<ak-forms-modal>
|
<ak-forms-modal>
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
import { createContext } from "@lit-labs/context";
|
import { createContext } from "@lit-labs/context";
|
||||||
|
|
||||||
import { type Config } from "@goauthentik/api";
|
import type { Config, CurrentTenant } from "@goauthentik/api";
|
||||||
|
|
||||||
export const authentikConfigContext = createContext<Config>(Symbol("authentik-config-context"));
|
export const authentikConfigContext = createContext<Config>(Symbol("authentik-config-context"));
|
||||||
|
|
||||||
|
export const authentikTenantContext = createContext<CurrentTenant>(
|
||||||
|
Symbol("authentik-tenant-context"),
|
||||||
|
);
|
||||||
|
|
||||||
export default authentikConfigContext;
|
export default authentikConfigContext;
|
||||||
|
|
|
@ -1,20 +1,18 @@
|
||||||
import { config, tenant } from "@goauthentik/common/api/config";
|
|
||||||
import { EVENT_THEME_CHANGE } from "@goauthentik/common/constants";
|
import { EVENT_THEME_CHANGE } from "@goauthentik/common/constants";
|
||||||
import { UIConfig, uiConfig } from "@goauthentik/common/ui/config";
|
import { UIConfig } from "@goauthentik/common/ui/config";
|
||||||
import { adaptCSS } from "@goauthentik/common/utils";
|
import { adaptCSS } from "@goauthentik/common/utils";
|
||||||
import { authentikConfigContext } from "@goauthentik/elements/AuthentikContexts";
|
import { ensureCSSStyleSheet } from "@goauthentik/elements/utils/ensureCSSStyleSheet";
|
||||||
|
|
||||||
import { ContextProvider } from "@lit-labs/context";
|
|
||||||
import { localized } from "@lit/localize";
|
import { localized } from "@lit/localize";
|
||||||
import { CSSResult, LitElement } from "lit";
|
import { LitElement } from "lit";
|
||||||
import { state } from "lit/decorators.js";
|
|
||||||
|
|
||||||
import AKGlobal from "@goauthentik/common/styles/authentik.css";
|
import AKGlobal from "@goauthentik/common/styles/authentik.css";
|
||||||
import ThemeDark from "@goauthentik/common/styles/theme-dark.css";
|
import ThemeDark from "@goauthentik/common/styles/theme-dark.css";
|
||||||
import PFBase from "@patternfly/patternfly/patternfly-base.css";
|
|
||||||
|
|
||||||
import { Config, CurrentTenant, UiThemeEnum } from "@goauthentik/api";
|
import { Config, CurrentTenant, UiThemeEnum } from "@goauthentik/api";
|
||||||
|
|
||||||
|
import { AdoptedStyleSheetsElement } from "./types";
|
||||||
|
|
||||||
type AkInterface = HTMLElement & {
|
type AkInterface = HTMLElement & {
|
||||||
getTheme: () => Promise<UiThemeEnum>;
|
getTheme: () => Promise<UiThemeEnum>;
|
||||||
tenant?: CurrentTenant;
|
tenant?: CurrentTenant;
|
||||||
|
@ -25,13 +23,6 @@ type AkInterface = HTMLElement & {
|
||||||
export const rootInterface = <T extends AkInterface>(): T | undefined =>
|
export const rootInterface = <T extends AkInterface>(): T | undefined =>
|
||||||
(document.body.querySelector("[data-ak-interface-root]") as T) ?? undefined;
|
(document.body.querySelector("[data-ak-interface-root]") as T) ?? undefined;
|
||||||
|
|
||||||
export function ensureCSSStyleSheet(css: CSSStyleSheet | CSSResult): CSSStyleSheet {
|
|
||||||
if (css instanceof CSSResult) {
|
|
||||||
return css.styleSheet!;
|
|
||||||
}
|
|
||||||
return css;
|
|
||||||
}
|
|
||||||
|
|
||||||
let css: Promise<string[]> | undefined;
|
let css: Promise<string[]> | undefined;
|
||||||
function fetchCustomCSS(): Promise<string[]> {
|
function fetchCustomCSS(): Promise<string[]> {
|
||||||
if (!css) {
|
if (!css) {
|
||||||
|
@ -52,10 +43,6 @@ function fetchCustomCSS(): Promise<string[]> {
|
||||||
return css;
|
return css;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AdoptedStyleSheetsElement {
|
|
||||||
adoptedStyleSheets: readonly CSSStyleSheet[];
|
|
||||||
}
|
|
||||||
|
|
||||||
const QUERY_MEDIA_COLOR_LIGHT = "(prefers-color-scheme: light)";
|
const QUERY_MEDIA_COLOR_LIGHT = "(prefers-color-scheme: light)";
|
||||||
|
|
||||||
@localized()
|
@localized()
|
||||||
|
@ -175,49 +162,3 @@ export class AKElement extends LitElement {
|
||||||
this.requestUpdate();
|
this.requestUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Interface extends AKElement implements AkInterface {
|
|
||||||
@state()
|
|
||||||
tenant?: CurrentTenant;
|
|
||||||
|
|
||||||
@state()
|
|
||||||
uiConfig?: UIConfig;
|
|
||||||
|
|
||||||
_configContext = new ContextProvider(this, {
|
|
||||||
context: authentikConfigContext,
|
|
||||||
initialValue: undefined,
|
|
||||||
});
|
|
||||||
|
|
||||||
_config?: Config;
|
|
||||||
|
|
||||||
@state()
|
|
||||||
set config(c: Config) {
|
|
||||||
this._config = c;
|
|
||||||
this._configContext.setValue(c);
|
|
||||||
this.requestUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
get config(): Config | undefined {
|
|
||||||
return this._config;
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
document.adoptedStyleSheets = [...document.adoptedStyleSheets, ensureCSSStyleSheet(PFBase)];
|
|
||||||
tenant().then((tenant) => (this.tenant = tenant));
|
|
||||||
config().then((config) => (this.config = config));
|
|
||||||
this.dataset.akInterfaceRoot = "true";
|
|
||||||
}
|
|
||||||
|
|
||||||
_activateTheme(root: AdoptedStyleSheetsElement, theme: UiThemeEnum): void {
|
|
||||||
super._activateTheme(root, theme);
|
|
||||||
super._activateTheme(document, theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
async getTheme(): Promise<UiThemeEnum> {
|
|
||||||
if (!this.uiConfig) {
|
|
||||||
this.uiConfig = await uiConfig();
|
|
||||||
}
|
|
||||||
return this.uiConfig.theme?.base || UiThemeEnum.Automatic;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
import { config, tenant } from "@goauthentik/common/api/config";
|
||||||
|
import { UIConfig, uiConfig } from "@goauthentik/common/ui/config";
|
||||||
|
import {
|
||||||
|
authentikConfigContext,
|
||||||
|
authentikTenantContext,
|
||||||
|
} from "@goauthentik/elements/AuthentikContexts";
|
||||||
|
import type { AdoptedStyleSheetsElement } from "@goauthentik/elements/types";
|
||||||
|
import { ensureCSSStyleSheet } from "@goauthentik/elements/utils/ensureCSSStyleSheet";
|
||||||
|
|
||||||
|
import { ContextProvider } from "@lit-labs/context";
|
||||||
|
import { state } from "lit/decorators.js";
|
||||||
|
|
||||||
|
import PFBase from "@patternfly/patternfly/patternfly-base.css";
|
||||||
|
|
||||||
|
import { Config, CurrentTenant, UiThemeEnum } from "@goauthentik/api";
|
||||||
|
|
||||||
|
import { AKElement } from "../Base";
|
||||||
|
|
||||||
|
type AkInterface = HTMLElement & {
|
||||||
|
getTheme: () => Promise<UiThemeEnum>;
|
||||||
|
tenant?: CurrentTenant;
|
||||||
|
uiConfig?: UIConfig;
|
||||||
|
config?: Config;
|
||||||
|
};
|
||||||
|
|
||||||
|
export class Interface extends AKElement implements AkInterface {
|
||||||
|
@state()
|
||||||
|
uiConfig?: UIConfig;
|
||||||
|
|
||||||
|
_configContext = new ContextProvider(this, {
|
||||||
|
context: authentikConfigContext,
|
||||||
|
initialValue: undefined,
|
||||||
|
});
|
||||||
|
|
||||||
|
_config?: Config;
|
||||||
|
|
||||||
|
@state()
|
||||||
|
set config(c: Config) {
|
||||||
|
this._config = c;
|
||||||
|
this._configContext.setValue(c);
|
||||||
|
this.requestUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
get config(): Config | undefined {
|
||||||
|
return this._config;
|
||||||
|
}
|
||||||
|
|
||||||
|
_tenantContext = new ContextProvider(this, {
|
||||||
|
context: authentikTenantContext,
|
||||||
|
initialValue: undefined,
|
||||||
|
});
|
||||||
|
|
||||||
|
_tenant?: CurrentTenant;
|
||||||
|
|
||||||
|
@state()
|
||||||
|
set tenant(c: CurrentTenant) {
|
||||||
|
this._tenant = c;
|
||||||
|
this._tenantContext.setValue(c);
|
||||||
|
this.requestUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
get tenant(): CurrentTenant | undefined {
|
||||||
|
return this._tenant;
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
document.adoptedStyleSheets = [...document.adoptedStyleSheets, ensureCSSStyleSheet(PFBase)];
|
||||||
|
tenant().then((tenant) => (this.tenant = tenant));
|
||||||
|
config().then((config) => (this.config = config));
|
||||||
|
this.dataset.akInterfaceRoot = "true";
|
||||||
|
}
|
||||||
|
|
||||||
|
_activateTheme(root: AdoptedStyleSheetsElement, theme: UiThemeEnum): void {
|
||||||
|
super._activateTheme(root, theme);
|
||||||
|
super._activateTheme(document, theme);
|
||||||
|
}
|
||||||
|
|
||||||
|
async getTheme(): Promise<UiThemeEnum> {
|
||||||
|
if (!this.uiConfig) {
|
||||||
|
this.uiConfig = await uiConfig();
|
||||||
|
}
|
||||||
|
return this.uiConfig.theme?.base || UiThemeEnum.Automatic;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
import { authentikConfigContext } from "@goauthentik/elements/AuthentikContexts";
|
||||||
|
|
||||||
|
import { consume } from "@lit-labs/context";
|
||||||
|
import type { LitElement } from "lit";
|
||||||
|
|
||||||
|
import type { Config } from "@goauthentik/api";
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
type Constructor<T = object> = new (...args: any[]) => T;
|
||||||
|
|
||||||
|
export function WithAuthentikConfig<T extends Constructor<LitElement>>(
|
||||||
|
superclass: T,
|
||||||
|
subscribe = true,
|
||||||
|
) {
|
||||||
|
abstract class WithAkConfigProvider extends superclass {
|
||||||
|
@consume({ context: authentikConfigContext, subscribe })
|
||||||
|
public authentikConfig!: Config;
|
||||||
|
}
|
||||||
|
return WithAkConfigProvider;
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
import { authentikConfigContext } from "@goauthentik/elements/AuthentikContexts";
|
||||||
|
|
||||||
|
import { consume } from "@lit-labs/context";
|
||||||
|
import type { LitElement } from "lit";
|
||||||
|
|
||||||
|
import { CapabilitiesEnum } from "@goauthentik/api";
|
||||||
|
import { Config } from "@goauthentik/api";
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
type Constructor<T = object> = abstract new (...args: any[]) => T;
|
||||||
|
|
||||||
|
// Using a unique, lexically scoped, and locally static symbol as the field name for the context
|
||||||
|
// means that it's inaccessible to any child class looking for it. It's one of the strongest privacy
|
||||||
|
// guarantees in JavaScript.
|
||||||
|
|
||||||
|
class WCC {
|
||||||
|
public static readonly capabilitiesConfig: unique symbol = Symbol();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* withCapabilitiesContext mixes in a single method to any LitElement, `can()`, which takes a
|
||||||
|
* CapabilitiesEnum and returns true or false.
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
*
|
||||||
|
* After importing, simply mixin this function:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* export class AkMyNiftyNewFeature extends withCapabilitiesContext(AKElement) {
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* And then if you need to check on a capability:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* if (this.can(CapabilitiesEnum.IsEnterprise) { ... }
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* This code re-exports CapabilitiesEnum, so you won't have to import it on a separate line if you
|
||||||
|
* don't need anything else from the API.
|
||||||
|
*
|
||||||
|
* Passing `true` as the second mixin argument will cause the inheriting class to subscribe to the
|
||||||
|
* configuration context. Should the context be explicitly reset, all active web components that are
|
||||||
|
* currently active and subscribed to the context will automatically have a `requestUpdate()`
|
||||||
|
* triggered with the new configuration.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
export function WithCapabilitiesConfig<T extends Constructor<LitElement>>(
|
||||||
|
superclass: T,
|
||||||
|
subscribe = true,
|
||||||
|
) {
|
||||||
|
abstract class CapabilitiesContext extends superclass {
|
||||||
|
@consume({ context: authentikConfigContext, subscribe })
|
||||||
|
private [WCC.capabilitiesConfig]!: Config;
|
||||||
|
|
||||||
|
can(c: CapabilitiesEnum) {
|
||||||
|
if (!this[WCC.capabilitiesConfig]) {
|
||||||
|
throw new Error(
|
||||||
|
"ConfigContext: Attempted to access site configuration before initialization.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return this[WCC.capabilitiesConfig].capabilities.includes(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CapabilitiesContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
export { CapabilitiesEnum };
|
|
@ -0,0 +1,4 @@
|
||||||
|
import { Interface } from "./Interface";
|
||||||
|
|
||||||
|
export { Interface };
|
||||||
|
export default Interface;
|
|
@ -0,0 +1,20 @@
|
||||||
|
import { authentikTenantContext } from "@goauthentik/elements/AuthentikContexts";
|
||||||
|
|
||||||
|
import { consume } from "@lit-labs/context";
|
||||||
|
import type { LitElement } from "lit";
|
||||||
|
|
||||||
|
import type { CurrentTenant } from "@goauthentik/api";
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
type Constructor<T = object> = abstract new (...args: any[]) => T;
|
||||||
|
|
||||||
|
export function WithTenantConfig<T extends Constructor<LitElement>>(
|
||||||
|
superclass: T,
|
||||||
|
subscribe = true,
|
||||||
|
) {
|
||||||
|
abstract class WithTenantProvider extends superclass {
|
||||||
|
@consume({ context: authentikTenantContext, subscribe })
|
||||||
|
public tenant!: CurrentTenant;
|
||||||
|
}
|
||||||
|
return WithTenantProvider;
|
||||||
|
}
|
|
@ -8,7 +8,8 @@ import {
|
||||||
} from "@goauthentik/common/constants";
|
} from "@goauthentik/common/constants";
|
||||||
import { currentInterface } from "@goauthentik/common/sentry";
|
import { currentInterface } from "@goauthentik/common/sentry";
|
||||||
import { me } from "@goauthentik/common/users";
|
import { me } from "@goauthentik/common/users";
|
||||||
import { AKElement, rootInterface } from "@goauthentik/elements/Base";
|
import { AKElement } from "@goauthentik/elements/Base";
|
||||||
|
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
|
||||||
import "@patternfly/elements/pf-tooltip/pf-tooltip.js";
|
import "@patternfly/elements/pf-tooltip/pf-tooltip.js";
|
||||||
|
|
||||||
import { msg } from "@lit/localize";
|
import { msg } from "@lit/localize";
|
||||||
|
@ -23,7 +24,7 @@ import PFBase from "@patternfly/patternfly/patternfly-base.css";
|
||||||
import { EventsApi } from "@goauthentik/api";
|
import { EventsApi } from "@goauthentik/api";
|
||||||
|
|
||||||
@customElement("ak-page-header")
|
@customElement("ak-page-header")
|
||||||
export class PageHeader extends AKElement {
|
export class PageHeader extends WithTenantConfig(AKElement) {
|
||||||
@property()
|
@property()
|
||||||
icon?: string;
|
icon?: string;
|
||||||
|
|
||||||
|
@ -35,9 +36,8 @@ export class PageHeader extends AKElement {
|
||||||
|
|
||||||
@property()
|
@property()
|
||||||
set header(value: string) {
|
set header(value: string) {
|
||||||
const tenant = rootInterface()?.tenant;
|
|
||||||
const currentIf = currentInterface();
|
const currentIf = currentInterface();
|
||||||
let title = tenant?.brandingTitle || TITLE_DEFAULT;
|
let title = this.tenant?.brandingTitle || TITLE_DEFAULT;
|
||||||
if (currentIf === "admin") {
|
if (currentIf === "admin") {
|
||||||
title = `${msg("Admin")} - ${title}`;
|
title = `${msg("Admin")} - ${title}`;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,8 @@ const LOCALE_TABLE: LocaleRow[] = [
|
||||||
["es", /^es([_-]|$)/i, () => msg("Spanish"), async () => await import("@goauthentik/locales/es")],
|
["es", /^es([_-]|$)/i, () => msg("Spanish"), async () => await import("@goauthentik/locales/es")],
|
||||||
["de", /^de([_-]|$)/i, () => msg("German"), async () => await import("@goauthentik/locales/de")],
|
["de", /^de([_-]|$)/i, () => msg("German"), async () => await import("@goauthentik/locales/de")],
|
||||||
["fr", /^fr([_-]|$)/i, () => msg("French"), async () => await import("@goauthentik/locales/fr")],
|
["fr", /^fr([_-]|$)/i, () => msg("French"), async () => await import("@goauthentik/locales/fr")],
|
||||||
|
["ko", /^ko([_-]|$)/i, () => msg("Korean"), async () => await import("@goauthentik/locales/ko")],
|
||||||
|
["nl", /^nl([_-]|$)/i, () => msg("Dutch"), async () => await import("@goauthentik/locales/nl")],
|
||||||
["pl", /^pl([_-]|$)/i, () => msg("Polish"), async () => await import("@goauthentik/locales/pl")],
|
["pl", /^pl([_-]|$)/i, () => msg("Polish"), async () => await import("@goauthentik/locales/pl")],
|
||||||
["tr", /^tr([_-]|$)/i, () => msg("Turkish"), async () => await import("@goauthentik/locales/tr")],
|
["tr", /^tr([_-]|$)/i, () => msg("Turkish"), async () => await import("@goauthentik/locales/tr")],
|
||||||
["zh-Hant", /^zh[_-](HK|Hant)/i, () => msg("Chinese (traditional)"), async () => await import("@goauthentik/locales/zh-Hant")],
|
["zh-Hant", /^zh[_-](HK|Hant)/i, () => msg("Chinese (traditional)"), async () => await import("@goauthentik/locales/zh-Hant")],
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { EVENT_SIDEBAR_TOGGLE } from "@goauthentik/common/constants";
|
import { EVENT_SIDEBAR_TOGGLE } from "@goauthentik/common/constants";
|
||||||
import { first } from "@goauthentik/common/utils";
|
import { AKElement } from "@goauthentik/elements/Base";
|
||||||
import { AKElement, rootInterface } from "@goauthentik/elements/Base";
|
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
|
||||||
|
|
||||||
import { CSSResult, TemplateResult, css, html } from "lit";
|
import { CSSResult, TemplateResult, css, html } from "lit";
|
||||||
import { customElement } from "lit/decorators.js";
|
import { customElement } from "lit/decorators.js";
|
||||||
|
@ -27,7 +27,7 @@ export const DefaultTenant: CurrentTenant = {
|
||||||
};
|
};
|
||||||
|
|
||||||
@customElement("ak-sidebar-brand")
|
@customElement("ak-sidebar-brand")
|
||||||
export class SidebarBrand extends AKElement {
|
export class SidebarBrand extends WithTenantConfig(AKElement) {
|
||||||
static get styles(): CSSResult[] {
|
static get styles(): CSSResult[] {
|
||||||
return [
|
return [
|
||||||
PFBase,
|
PFBase,
|
||||||
|
@ -85,10 +85,7 @@ export class SidebarBrand extends AKElement {
|
||||||
<a href="#/" class="pf-c-page__header-brand-link">
|
<a href="#/" class="pf-c-page__header-brand-link">
|
||||||
<div class="pf-c-brand ak-brand">
|
<div class="pf-c-brand ak-brand">
|
||||||
<img
|
<img
|
||||||
src="${first(
|
src=${this.tenant?.brandingLogo ?? DefaultTenant.brandingLogo}
|
||||||
rootInterface()?.tenant?.brandingLogo,
|
|
||||||
DefaultTenant.brandingLogo,
|
|
||||||
)}"
|
|
||||||
alt="authentik Logo"
|
alt="authentik Logo"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
export interface AdoptedStyleSheetsElement {
|
||||||
|
adoptedStyleSheets: readonly CSSStyleSheet[];
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
import { CSSResult } from "lit";
|
||||||
|
|
||||||
|
export const ensureCSSStyleSheet = (css: CSSStyleSheet | CSSResult): CSSStyleSheet =>
|
||||||
|
css instanceof CSSResult ? css.styleSheet! : css;
|
|
@ -1,5 +1,5 @@
|
||||||
import { TITLE_DEFAULT } from "@goauthentik/app/common/constants";
|
import { TITLE_DEFAULT } from "@goauthentik/app/common/constants";
|
||||||
import { Interface } from "@goauthentik/elements/Base";
|
import { Interface } from "@goauthentik/elements/Interface";
|
||||||
import "@goauthentik/elements/LoadingOverlay";
|
import "@goauthentik/elements/LoadingOverlay";
|
||||||
import Guacamole from "guacamole-common-js";
|
import Guacamole from "guacamole-common-js";
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ import { globalAK } from "@goauthentik/common/global";
|
||||||
import { configureSentry } from "@goauthentik/common/sentry";
|
import { configureSentry } from "@goauthentik/common/sentry";
|
||||||
import { first } from "@goauthentik/common/utils";
|
import { first } from "@goauthentik/common/utils";
|
||||||
import { WebsocketClient } from "@goauthentik/common/ws";
|
import { WebsocketClient } from "@goauthentik/common/ws";
|
||||||
import { Interface } from "@goauthentik/elements/Base";
|
import { Interface } from "@goauthentik/elements/Interface";
|
||||||
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/apple/AppleLoginInit";
|
||||||
|
|
|
@ -89,6 +89,9 @@ export class AuthenticatorValidateStage
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
:host([theme="dark"]) .authenticator-button {
|
||||||
|
color: var(--ak-dark-foreground) !important;
|
||||||
|
}
|
||||||
i {
|
i {
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
padding: 1rem 0;
|
padding: 1rem 0;
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
import { rootInterface } from "@goauthentik/elements/Base";
|
|
||||||
import "@goauthentik/elements/Divider";
|
import "@goauthentik/elements/Divider";
|
||||||
import "@goauthentik/elements/EmptyState";
|
import "@goauthentik/elements/EmptyState";
|
||||||
|
import {
|
||||||
|
CapabilitiesEnum,
|
||||||
|
WithCapabilitiesConfig,
|
||||||
|
} from "@goauthentik/elements/Interface/capabilitiesProvider";
|
||||||
import { LOCALES } from "@goauthentik/elements/ak-locale-context/definitions";
|
import { LOCALES } from "@goauthentik/elements/ak-locale-context/definitions";
|
||||||
import "@goauthentik/elements/forms/FormElement";
|
import "@goauthentik/elements/forms/FormElement";
|
||||||
import { BaseStage } from "@goauthentik/flow/stages/base";
|
import { BaseStage } from "@goauthentik/flow/stages/base";
|
||||||
|
@ -20,7 +23,6 @@ import PFTitle from "@patternfly/patternfly/components/Title/title.css";
|
||||||
import PFBase from "@patternfly/patternfly/patternfly-base.css";
|
import PFBase from "@patternfly/patternfly/patternfly-base.css";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
CapabilitiesEnum,
|
|
||||||
PromptChallenge,
|
PromptChallenge,
|
||||||
PromptChallengeResponseRequest,
|
PromptChallengeResponseRequest,
|
||||||
PromptTypeEnum,
|
PromptTypeEnum,
|
||||||
|
@ -28,7 +30,9 @@ import {
|
||||||
} from "@goauthentik/api";
|
} from "@goauthentik/api";
|
||||||
|
|
||||||
@customElement("ak-stage-prompt")
|
@customElement("ak-stage-prompt")
|
||||||
export class PromptStage extends BaseStage<PromptChallenge, PromptChallengeResponseRequest> {
|
export class PromptStage extends WithCapabilitiesConfig(
|
||||||
|
BaseStage<PromptChallenge, PromptChallengeResponseRequest>,
|
||||||
|
) {
|
||||||
static get styles(): CSSResult[] {
|
static get styles(): CSSResult[] {
|
||||||
return [
|
return [
|
||||||
PFBase,
|
PFBase,
|
||||||
|
@ -193,10 +197,7 @@ ${prompt.initialValue}</textarea
|
||||||
</div> `;
|
</div> `;
|
||||||
})}`;
|
})}`;
|
||||||
case PromptTypeEnum.AkLocale: {
|
case PromptTypeEnum.AkLocale: {
|
||||||
const inDebug = rootInterface()?.config?.capabilities.includes(
|
const locales = this.can(CapabilitiesEnum.CanDebug)
|
||||||
CapabilitiesEnum.CanDebug,
|
|
||||||
);
|
|
||||||
const locales = inDebug
|
|
||||||
? LOCALES
|
? LOCALES
|
||||||
: LOCALES.filter((locale) => locale.code !== "debug");
|
: LOCALES.filter((locale) => locale.code !== "debug");
|
||||||
const options = locales.map(
|
const options = locales.map(
|
||||||
|
|
|
@ -15,10 +15,13 @@ export const targetLocales = [
|
||||||
`en`,
|
`en`,
|
||||||
`es`,
|
`es`,
|
||||||
`fr`,
|
`fr`,
|
||||||
|
`ko`,
|
||||||
|
`nl`,
|
||||||
`pl`,
|
`pl`,
|
||||||
`pseudo-LOCALE`,
|
`pseudo-LOCALE`,
|
||||||
`tr`,
|
`tr`,
|
||||||
`zh_TW`,
|
`zh_TW`,
|
||||||
|
`zh-CN`,
|
||||||
`zh-Hans`,
|
`zh-Hans`,
|
||||||
`zh-Hant`,
|
`zh-Hant`,
|
||||||
] as const;
|
] as const;
|
||||||
|
@ -32,10 +35,13 @@ export const allLocales = [
|
||||||
`en`,
|
`en`,
|
||||||
`es`,
|
`es`,
|
||||||
`fr`,
|
`fr`,
|
||||||
|
`ko`,
|
||||||
|
`nl`,
|
||||||
`pl`,
|
`pl`,
|
||||||
`pseudo-LOCALE`,
|
`pseudo-LOCALE`,
|
||||||
`tr`,
|
`tr`,
|
||||||
`zh_TW`,
|
`zh_TW`,
|
||||||
|
`zh-CN`,
|
||||||
`zh-Hans`,
|
`zh-Hans`,
|
||||||
`zh-Hant`,
|
`zh-Hant`,
|
||||||
] as const;
|
] as const;
|
||||||
|
|
|
@ -2,7 +2,7 @@ import { CSRFHeaderName } from "@goauthentik/common/api/middleware";
|
||||||
import { EVENT_THEME_CHANGE } from "@goauthentik/common/constants";
|
import { EVENT_THEME_CHANGE } from "@goauthentik/common/constants";
|
||||||
import { globalAK } from "@goauthentik/common/global";
|
import { globalAK } from "@goauthentik/common/global";
|
||||||
import { first, getCookie } from "@goauthentik/common/utils";
|
import { first, getCookie } from "@goauthentik/common/utils";
|
||||||
import { Interface } from "@goauthentik/elements/Base";
|
import { Interface } from "@goauthentik/elements/Interface";
|
||||||
import "@goauthentik/elements/ak-locale-context";
|
import "@goauthentik/elements/ak-locale-context";
|
||||||
import { DefaultTenant } from "@goauthentik/elements/sidebar/SidebarBrand";
|
import { DefaultTenant } from "@goauthentik/elements/sidebar/SidebarBrand";
|
||||||
import "rapidoc";
|
import "rapidoc";
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { globalAK } from "@goauthentik/common/global";
|
import { globalAK } from "@goauthentik/common/global";
|
||||||
import { Interface } from "@goauthentik/elements/Base";
|
import { Interface } from "@goauthentik/elements/Interface";
|
||||||
|
|
||||||
import { msg } from "@lit/localize";
|
import { msg } from "@lit/localize";
|
||||||
import { CSSResult, TemplateResult, css, html } from "lit";
|
import { CSSResult, TemplateResult, css, html } from "lit";
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Interface } from "@goauthentik/app/elements/Base";
|
import { Interface } from "@goauthentik/app/elements/Interface";
|
||||||
|
|
||||||
import { customElement, property } from "lit/decorators.js";
|
import { customElement, property } from "lit/decorators.js";
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ import { UserDisplay } from "@goauthentik/common/ui/config";
|
||||||
import { me } from "@goauthentik/common/users";
|
import { me } from "@goauthentik/common/users";
|
||||||
import { first } from "@goauthentik/common/utils";
|
import { first } from "@goauthentik/common/utils";
|
||||||
import { WebsocketClient } from "@goauthentik/common/ws";
|
import { WebsocketClient } from "@goauthentik/common/ws";
|
||||||
import { Interface } from "@goauthentik/elements/Base";
|
import { Interface } from "@goauthentik/elements/Interface";
|
||||||
import "@goauthentik/elements/ak-locale-context";
|
import "@goauthentik/elements/ak-locale-context";
|
||||||
import "@goauthentik/elements/buttons/ActionButton";
|
import "@goauthentik/elements/buttons/ActionButton";
|
||||||
import "@goauthentik/elements/enterprise/EnterpriseStatusBanner";
|
import "@goauthentik/elements/enterprise/EnterpriseStatusBanner";
|
||||||
|
|
|
@ -2,14 +2,15 @@ import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
||||||
import { EVENT_REFRESH } from "@goauthentik/common/constants";
|
import { EVENT_REFRESH } from "@goauthentik/common/constants";
|
||||||
import { MessageLevel } from "@goauthentik/common/messages";
|
import { MessageLevel } from "@goauthentik/common/messages";
|
||||||
import { refreshMe } from "@goauthentik/common/users";
|
import { refreshMe } from "@goauthentik/common/users";
|
||||||
import { AKElement, rootInterface } from "@goauthentik/elements/Base";
|
import { AKElement } from "@goauthentik/elements/Base";
|
||||||
|
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
|
||||||
import { showMessage } from "@goauthentik/elements/messages/MessageContainer";
|
import { showMessage } from "@goauthentik/elements/messages/MessageContainer";
|
||||||
import { StageHost } from "@goauthentik/flow/stages/base";
|
import { StageHost } from "@goauthentik/flow/stages/base";
|
||||||
import "@goauthentik/user/user-settings/details/stages/prompt/PromptStage";
|
import "@goauthentik/user/user-settings/details/stages/prompt/PromptStage";
|
||||||
|
|
||||||
import { msg } from "@lit/localize";
|
import { msg } from "@lit/localize";
|
||||||
import { CSSResult, TemplateResult, html } from "lit";
|
import { CSSResult, TemplateResult, html } from "lit";
|
||||||
import { customElement, property, state } from "lit/decorators.js";
|
import { customElement, property } from "lit/decorators.js";
|
||||||
import { unsafeHTML } from "lit/directives/unsafe-html.js";
|
import { unsafeHTML } from "lit/directives/unsafe-html.js";
|
||||||
|
|
||||||
import PFButton from "@patternfly/patternfly/components/Button/button.css";
|
import PFButton from "@patternfly/patternfly/components/Button/button.css";
|
||||||
|
@ -21,7 +22,6 @@ import PFBase from "@patternfly/patternfly/patternfly-base.css";
|
||||||
import {
|
import {
|
||||||
ChallengeChoices,
|
ChallengeChoices,
|
||||||
ChallengeTypes,
|
ChallengeTypes,
|
||||||
CurrentTenant,
|
|
||||||
FlowChallengeResponseRequest,
|
FlowChallengeResponseRequest,
|
||||||
FlowErrorChallenge,
|
FlowErrorChallenge,
|
||||||
FlowsApi,
|
FlowsApi,
|
||||||
|
@ -31,13 +31,13 @@ import {
|
||||||
} from "@goauthentik/api";
|
} from "@goauthentik/api";
|
||||||
|
|
||||||
@customElement("ak-user-settings-flow-executor")
|
@customElement("ak-user-settings-flow-executor")
|
||||||
export class UserSettingsFlowExecutor extends AKElement implements StageHost {
|
export class UserSettingsFlowExecutor
|
||||||
|
extends WithTenantConfig(AKElement, true)
|
||||||
|
implements StageHost
|
||||||
|
{
|
||||||
@property()
|
@property()
|
||||||
flowSlug?: string;
|
flowSlug?: string;
|
||||||
|
|
||||||
@state()
|
|
||||||
tenant?: CurrentTenant;
|
|
||||||
|
|
||||||
private _challenge?: ChallengeTypes;
|
private _challenge?: ChallengeTypes;
|
||||||
|
|
||||||
@property({ attribute: false })
|
@property({ attribute: false })
|
||||||
|
@ -87,7 +87,6 @@ export class UserSettingsFlowExecutor extends AKElement implements StageHost {
|
||||||
}
|
}
|
||||||
|
|
||||||
firstUpdated(): void {
|
firstUpdated(): void {
|
||||||
this.tenant = rootInterface()?.tenant;
|
|
||||||
this.flowSlug = this.tenant?.flowUserSettings;
|
this.flowSlug = this.tenant?.flowUserSettings;
|
||||||
if (!this.flowSlug) {
|
if (!this.flowSlug) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -6268,6 +6268,12 @@ Bindings to groups/users are checked against the user of the event.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s31f1afc1bfe1cb3a">
|
<trans-unit id="s31f1afc1bfe1cb3a">
|
||||||
<source>Learn more</source>
|
<source>Learn more</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sc39f6abf0daedb0f">
|
||||||
|
<source>Maximum concurrent connections</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s62418cbcd2a25498">
|
||||||
|
<source>Maximum concurrent allowed connections to this endpoint. Can be set to -1 to disable the limit.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
|
|
|
@ -6544,6 +6544,12 @@ Bindings to groups/users are checked against the user of the event.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s31f1afc1bfe1cb3a">
|
<trans-unit id="s31f1afc1bfe1cb3a">
|
||||||
<source>Learn more</source>
|
<source>Learn more</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sc39f6abf0daedb0f">
|
||||||
|
<source>Maximum concurrent connections</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s62418cbcd2a25498">
|
||||||
|
<source>Maximum concurrent allowed connections to this endpoint. Can be set to -1 to disable the limit.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
|
|
|
@ -6184,6 +6184,12 @@ Bindings to groups/users are checked against the user of the event.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s31f1afc1bfe1cb3a">
|
<trans-unit id="s31f1afc1bfe1cb3a">
|
||||||
<source>Learn more</source>
|
<source>Learn more</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sc39f6abf0daedb0f">
|
||||||
|
<source>Maximum concurrent connections</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s62418cbcd2a25498">
|
||||||
|
<source>Maximum concurrent allowed connections to this endpoint. Can be set to -1 to disable the limit.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
|
|
|
@ -8231,6 +8231,12 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s31f1afc1bfe1cb3a">
|
<trans-unit id="s31f1afc1bfe1cb3a">
|
||||||
<source>Learn more</source>
|
<source>Learn more</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sc39f6abf0daedb0f">
|
||||||
|
<source>Maximum concurrent connections</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s62418cbcd2a25498">
|
||||||
|
<source>Maximum concurrent allowed connections to this endpoint. Can be set to -1 to disable the limit.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
|
|
|
@ -6392,6 +6392,12 @@ Bindings to groups/users are checked against the user of the event.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s31f1afc1bfe1cb3a">
|
<trans-unit id="s31f1afc1bfe1cb3a">
|
||||||
<source>Learn more</source>
|
<source>Learn more</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sc39f6abf0daedb0f">
|
||||||
|
<source>Maximum concurrent connections</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s62418cbcd2a25498">
|
||||||
|
<source>Maximum concurrent allowed connections to this endpoint. Can be set to -1 to disable the limit.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
|
|
|
@ -8179,4 +8179,10 @@ Bindings to groups/users are checked against the user of the event.</source>
|
||||||
<trans-unit id="s31f1afc1bfe1cb3a">
|
<trans-unit id="s31f1afc1bfe1cb3a">
|
||||||
<source>Learn more</source>
|
<source>Learn more</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="sc39f6abf0daedb0f">
|
||||||
|
<source>Maximum concurrent connections</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s62418cbcd2a25498">
|
||||||
|
<source>Maximum concurrent allowed connections to this endpoint. Can be set to -1 to disable the limit.</source>
|
||||||
|
</trans-unit>
|
||||||
</body></file></xliff>
|
</body></file></xliff>
|
||||||
|
|
|
@ -6177,6 +6177,12 @@ Bindings to groups/users are checked against the user of the event.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s31f1afc1bfe1cb3a">
|
<trans-unit id="s31f1afc1bfe1cb3a">
|
||||||
<source>Learn more</source>
|
<source>Learn more</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sc39f6abf0daedb0f">
|
||||||
|
<source>Maximum concurrent connections</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s62418cbcd2a25498">
|
||||||
|
<source>Maximum concurrent allowed connections to this endpoint. Can be set to -1 to disable the limit.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
|
|
|
@ -8230,9 +8230,17 @@ Bindings to groups/users are checked against the user of the event.</source>
|
||||||
<source><x id="0" equiv-text="${selectedCount}"/> item(s) marked to remove.</source>
|
<source><x id="0" equiv-text="${selectedCount}"/> item(s) marked to remove.</source>
|
||||||
<trans-unit id="scc7f34824150bfb8">
|
<trans-unit id="scc7f34824150bfb8">
|
||||||
<source>Provider require enterprise.</source>
|
<source>Provider require enterprise.</source>
|
||||||
|
<target>提供程序需要企业版。</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s31f1afc1bfe1cb3a">
|
<trans-unit id="s31f1afc1bfe1cb3a">
|
||||||
<source>Learn more</source>
|
<source>Learn more</source>
|
||||||
|
<target>了解更多</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sc39f6abf0daedb0f">
|
||||||
|
<source>Maximum concurrent connections</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s62418cbcd2a25498">
|
||||||
|
<source>Maximum concurrent allowed connections to this endpoint. Can be set to -1 to disable the limit.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
|
|
|
@ -6225,6 +6225,12 @@ Bindings to groups/users are checked against the user of the event.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s31f1afc1bfe1cb3a">
|
<trans-unit id="s31f1afc1bfe1cb3a">
|
||||||
<source>Learn more</source>
|
<source>Learn more</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sc39f6abf0daedb0f">
|
||||||
|
<source>Maximum concurrent connections</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s62418cbcd2a25498">
|
||||||
|
<source>Maximum concurrent allowed connections to this endpoint. Can be set to -1 to disable the limit.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
|
|
|
@ -8203,6 +8203,14 @@ Bindings to groups/users are checked against the user of the event.</source>
|
||||||
<trans-unit id="s6dd297c217729828">
|
<trans-unit id="s6dd297c217729828">
|
||||||
<source>Determines how long a session lasts before being disconnected and requiring re-authorization.</source>
|
<source>Determines how long a session lasts before being disconnected and requiring re-authorization.</source>
|
||||||
<target>设置会话在被断开连接并需要重新授权之前持续的时间。</target>
|
<target>设置会话在被断开连接并需要重新授权之前持续的时间。</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="scc7f34824150bfb8">
|
||||||
|
<source>Provider require enterprise.</source>
|
||||||
|
<target>提供程序需要企业版。</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s31f1afc1bfe1cb3a">
|
||||||
|
<source>Learn more</source>
|
||||||
|
<target>了解更多</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
|
|
|
@ -8113,6 +8113,12 @@ Bindings to groups/users are checked against the user of the event.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s31f1afc1bfe1cb3a">
|
<trans-unit id="s31f1afc1bfe1cb3a">
|
||||||
<source>Learn more</source>
|
<source>Learn more</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sc39f6abf0daedb0f">
|
||||||
|
<source>Maximum concurrent connections</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s62418cbcd2a25498">
|
||||||
|
<source>Maximum concurrent allowed connections to this endpoint. Can be set to -1 to disable the limit.</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
"@mdx-js/react": "^3.0.0",
|
"@mdx-js/react": "^3.0.0",
|
||||||
"clsx": "^2.1.0",
|
"clsx": "^2.1.0",
|
||||||
"disqus-react": "^1.1.5",
|
"disqus-react": "^1.1.5",
|
||||||
"postcss": "^8.4.32",
|
"postcss": "^8.4.33",
|
||||||
"prism-react-renderer": "^2.3.1",
|
"prism-react-renderer": "^2.3.1",
|
||||||
"rapidoc": "^9.3.4",
|
"rapidoc": "^9.3.4",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
"@docusaurus/module-type-aliases": "3.0.1",
|
"@docusaurus/module-type-aliases": "3.0.1",
|
||||||
"@docusaurus/tsconfig": "3.0.1",
|
"@docusaurus/tsconfig": "3.0.1",
|
||||||
"@docusaurus/types": "3.0.1",
|
"@docusaurus/types": "3.0.1",
|
||||||
"@types/react": "^18.2.46",
|
"@types/react": "^18.2.47",
|
||||||
"prettier": "3.1.1",
|
"prettier": "3.1.1",
|
||||||
"typescript": "~5.3.3"
|
"typescript": "~5.3.3"
|
||||||
},
|
},
|
||||||
|
@ -4373,9 +4373,9 @@
|
||||||
"integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA=="
|
"integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA=="
|
||||||
},
|
},
|
||||||
"node_modules/@types/react": {
|
"node_modules/@types/react": {
|
||||||
"version": "18.2.46",
|
"version": "18.2.47",
|
||||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.46.tgz",
|
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.47.tgz",
|
||||||
"integrity": "sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==",
|
"integrity": "sha512-xquNkkOirwyCgoClNk85BjP+aqnIS+ckAJ8i37gAbDs14jfW/J23f2GItAf33oiUPQnqNMALiFeoM9Y5mbjpVQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/prop-types": "*",
|
"@types/prop-types": "*",
|
||||||
"@types/scheduler": "*",
|
"@types/scheduler": "*",
|
||||||
|
@ -13137,9 +13137,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "8.4.32",
|
"version": "8.4.33",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz",
|
||||||
"integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
|
"integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
"@mdx-js/react": "^3.0.0",
|
"@mdx-js/react": "^3.0.0",
|
||||||
"clsx": "^2.1.0",
|
"clsx": "^2.1.0",
|
||||||
"disqus-react": "^1.1.5",
|
"disqus-react": "^1.1.5",
|
||||||
"postcss": "^8.4.32",
|
"postcss": "^8.4.33",
|
||||||
"prism-react-renderer": "^2.3.1",
|
"prism-react-renderer": "^2.3.1",
|
||||||
"rapidoc": "^9.3.4",
|
"rapidoc": "^9.3.4",
|
||||||
"react-before-after-slider-component": "^1.1.8",
|
"react-before-after-slider-component": "^1.1.8",
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
"@docusaurus/module-type-aliases": "3.0.1",
|
"@docusaurus/module-type-aliases": "3.0.1",
|
||||||
"@docusaurus/tsconfig": "3.0.1",
|
"@docusaurus/tsconfig": "3.0.1",
|
||||||
"@docusaurus/types": "3.0.1",
|
"@docusaurus/types": "3.0.1",
|
||||||
"@types/react": "^18.2.46",
|
"@types/react": "^18.2.47",
|
||||||
"prettier": "3.1.1",
|
"prettier": "3.1.1",
|
||||||
"typescript": "~5.3.3"
|
"typescript": "~5.3.3"
|
||||||
},
|
},
|
||||||
|
|
Reference in New Issue