Compare commits

...

30 Commits

Author SHA1 Message Date
619203c177 release: 2021.9.8 2021-10-10 13:12:26 +02:00
4ae476e58d Revert "build(deps): bump construct-style-sheets-polyfill in /web (#1531)"
This reverts commit 55259adf38.
2021-10-07 22:35:41 +02:00
e444d0d640 release: 2021.9.7 2021-10-06 20:57:56 +02:00
3869965b4c web/admin: fix description for flow import
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

# Conflicts:
#	web/src/locales/fr_FR.po
2021-10-06 20:51:36 +02:00
d4e1b95991 root: fix syntax error in dockerfile healthcheck
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-06 09:18:24 +02:00
2b730dec54 release: 2021.9.6 2021-10-05 22:22:54 +02:00
2aacb311bc internal: add internal healthchecking to prevent websocket errors
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 22:22:38 +02:00
40055ef01b cmd: prevent outposts from panicking when failing to get their config
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 22:22:38 +02:00
75608dce5c web: add locale detection
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

# Conflicts:
#	web/src/interfaces/locale.ts
2021-10-05 21:22:08 +02:00
b0f7083879 lifecycle: fix syntax error in ak wrapper
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 21:04:01 +02:00
62bf79ce32 root: add docker-native healthcheck for web and celery
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 20:45:38 +02:00
7a16c9cb14 root: remove redundant internal network from compose
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 20:45:38 +02:00
d29d161ac6 admin: clear update notification when notification's version matches current version
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 20:45:38 +02:00
653631ac77 Translate /web/src/locales/en.po in fr_FR (#1536)
translation completed for the source file '/web/src/locales/en.po'
on the 'fr_FR' language.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
# Conflicts:
#	web/src/locales/fr_FR.po
2021-10-05 16:24:48 +02:00
cde303e780 web: fix strings not being translated at all when matching browser locale not found
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

# Conflicts:
#	web/src/interfaces/locale.ts
2021-10-05 16:24:31 +02:00
aa359a032c build(deps): bump goauthentik.io/api from 0.202195.3 to 0.202195.4 (#1544)
Bumps [goauthentik.io/api](https://github.com/goauthentik/client-go) from 0.202195.3 to 0.202195.4.
- [Release notes](https://github.com/goauthentik/client-go/releases)
- [Commits](https://github.com/goauthentik/client-go/compare/v0.202195.3...v0.202195.4)

---
updated-dependencies:
- dependency-name: goauthentik.io/api
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-10-05 13:49:15 +02:00
6491065aab web: Update Web API Client version (#1543)
Signed-off-by: GitHub <noreply@github.com>

Co-authored-by: BeryJu <BeryJu@users.noreply.github.com>
2021-10-05 13:49:15 +02:00
79eec5a3a0 core: include group uuids in self serializer
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 13:49:14 +02:00
cd5e091937 build(deps): bump goauthentik.io/api from 0.202195.1 to 0.202195.3 (#1542)
Bumps [goauthentik.io/api](https://github.com/goauthentik/client-go) from 0.202195.1 to 0.202195.3.
- [Release notes](https://github.com/goauthentik/client-go/releases)
- [Commits](https://github.com/goauthentik/client-go/compare/v0.202195.1...v0.202195.3)

---
updated-dependencies:
- dependency-name: goauthentik.io/api
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
# Conflicts:
#	go.mod
#	go.sum
2021-10-05 13:49:11 +02:00
7ed8952803 web: Update Web API Client version (#1540)
Signed-off-by: GitHub <noreply@github.com>

Co-authored-by: BeryJu <BeryJu@users.noreply.github.com>
2021-10-05 13:48:53 +02:00
c1f302fb7c core: only return group names for user_self
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 13:48:53 +02:00
cb31e52d0e web/flows: adjust message for email stage
closes #1538

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

# Conflicts:
#	web/src/locales/fr_FR.po
2021-10-05 13:48:51 +02:00
782764ac73 api: ensure viewsets have default ordering
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 13:48:42 +02:00
d0c56325ef web/elements: fix model form always loading when viewport check is disabled
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 13:48:42 +02:00
73d57d6f82 core: make user's name field fully options
closes #1537

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 13:48:42 +02:00
2716a26887 web: Update Web API Client version (#1539)
Signed-off-by: GitHub <noreply@github.com>

Co-authored-by: BeryJu <BeryJu@users.noreply.github.com>
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
# Conflicts:
#	web/package-lock.json
#	web/package.json
2021-10-05 13:48:23 +02:00
0452537e8b web/admin: only show outpost deployment info when not embedded
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 13:47:55 +02:00
d1a1bfbbc5 web/user: don't show managed tokens in user interface
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 13:47:49 +02:00
a69fcbca9a web: fix rendering of token copy button in dark mode
closes #1528

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

# Conflicts:
#	web/src/locales/fr_FR.po
2021-10-05 13:47:29 +02:00
1ac4dacc3b outposts: fix error when comparing ports in docker controller when port mapping is disabled
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
2021-10-05 13:47:15 +02:00
45 changed files with 6339 additions and 239 deletions

View File

@ -1,5 +1,5 @@
[bumpversion] [bumpversion]
current_version = 2021.9.5 current_version = 2021.9.8
tag = True tag = True
commit = True commit = True
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)\-?(?P<release>.*) parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)\-?(?P<release>.*)

View File

@ -33,14 +33,14 @@ jobs:
with: with:
push: ${{ github.event_name == 'release' }} push: ${{ github.event_name == 'release' }}
tags: | tags: |
beryju/authentik:2021.9.5, beryju/authentik:2021.9.8,
beryju/authentik:latest, beryju/authentik:latest,
ghcr.io/goauthentik/server:2021.9.5, ghcr.io/goauthentik/server:2021.9.8,
ghcr.io/goauthentik/server:latest ghcr.io/goauthentik/server:latest
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
context: . context: .
- name: Building Docker Image (stable) - name: Building Docker Image (stable)
if: ${{ github.event_name == 'release' && !contains('2021.9.5', 'rc') }} if: ${{ github.event_name == 'release' && !contains('2021.9.8', 'rc') }}
run: | run: |
docker pull beryju/authentik:latest docker pull beryju/authentik:latest
docker tag beryju/authentik:latest beryju/authentik:stable docker tag beryju/authentik:latest beryju/authentik:stable
@ -75,14 +75,14 @@ jobs:
with: with:
push: ${{ github.event_name == 'release' }} push: ${{ github.event_name == 'release' }}
tags: | tags: |
beryju/authentik-proxy:2021.9.5, beryju/authentik-proxy:2021.9.8,
beryju/authentik-proxy:latest, beryju/authentik-proxy:latest,
ghcr.io/goauthentik/proxy:2021.9.5, ghcr.io/goauthentik/proxy:2021.9.8,
ghcr.io/goauthentik/proxy:latest ghcr.io/goauthentik/proxy:latest
file: proxy.Dockerfile file: proxy.Dockerfile
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
- name: Building Docker Image (stable) - name: Building Docker Image (stable)
if: ${{ github.event_name == 'release' && !contains('2021.9.5', 'rc') }} if: ${{ github.event_name == 'release' && !contains('2021.9.8', 'rc') }}
run: | run: |
docker pull beryju/authentik-proxy:latest docker pull beryju/authentik-proxy:latest
docker tag beryju/authentik-proxy:latest beryju/authentik-proxy:stable docker tag beryju/authentik-proxy:latest beryju/authentik-proxy:stable
@ -117,14 +117,14 @@ jobs:
with: with:
push: ${{ github.event_name == 'release' }} push: ${{ github.event_name == 'release' }}
tags: | tags: |
beryju/authentik-ldap:2021.9.5, beryju/authentik-ldap:2021.9.8,
beryju/authentik-ldap:latest, beryju/authentik-ldap:latest,
ghcr.io/goauthentik/ldap:2021.9.5, ghcr.io/goauthentik/ldap:2021.9.8,
ghcr.io/goauthentik/ldap:latest ghcr.io/goauthentik/ldap:latest
file: ldap.Dockerfile file: ldap.Dockerfile
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
- name: Building Docker Image (stable) - name: Building Docker Image (stable)
if: ${{ github.event_name == 'release' && !contains('2021.9.5', 'rc') }} if: ${{ github.event_name == 'release' && !contains('2021.9.8', 'rc') }}
run: | run: |
docker pull beryju/authentik-ldap:latest docker pull beryju/authentik-ldap:latest
docker tag beryju/authentik-ldap:latest beryju/authentik-ldap:stable docker tag beryju/authentik-ldap:latest beryju/authentik-ldap:stable
@ -175,7 +175,7 @@ jobs:
SENTRY_PROJECT: authentik SENTRY_PROJECT: authentik
SENTRY_URL: https://sentry.beryju.org SENTRY_URL: https://sentry.beryju.org
with: with:
version: authentik@2021.9.5 version: authentik@2021.9.8
environment: beryjuorg-prod environment: beryjuorg-prod
sourcemaps: './web/dist' sourcemaps: './web/dist'
url_prefix: '~/static/dist' url_prefix: '~/static/dist'

View File

@ -80,8 +80,12 @@ COPY ./lifecycle/ /lifecycle
COPY --from=builder /work/authentik /authentik-proxy COPY --from=builder /work/authentik /authentik-proxy
USER authentik USER authentik
ENV TMPDIR /dev/shm/ ENV TMPDIR /dev/shm/
ENV PYTHONUNBUFFERED 1 ENV PYTHONUNBUFFERED 1
ENV prometheus_multiproc_dir /dev/shm/ ENV prometheus_multiproc_dir /dev/shm/
ENV PATH "/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/lifecycle" ENV PATH "/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/lifecycle"
HEALTHCHECK --interval=30s --timeout=30s --start-period=60s --retries=3 CMD [ "/lifecycle/ak", "healthcheck" ]
ENTRYPOINT [ "/lifecycle/ak" ] ENTRYPOINT [ "/lifecycle/ak" ]

View File

@ -1,3 +1,3 @@
"""authentik""" """authentik"""
__version__ = "2021.9.5" __version__ = "2021.9.8"
ENV_GIT_HASH_KEY = "GIT_BUILD_HASH" ENV_GIT_HASH_KEY = "GIT_BUILD_HASH"

View File

@ -8,3 +8,8 @@ class AuthentikAdminConfig(AppConfig):
name = "authentik.admin" name = "authentik.admin"
label = "authentik_admin" label = "authentik_admin"
verbose_name = "authentik Admin" verbose_name = "authentik Admin"
def ready(self):
from authentik.admin.tasks import clear_update_notifications
clear_update_notifications.delay()

View File

@ -10,7 +10,7 @@ from requests import RequestException
from structlog.stdlib import get_logger from structlog.stdlib import get_logger
from authentik import ENV_GIT_HASH_KEY, __version__ from authentik import ENV_GIT_HASH_KEY, __version__
from authentik.events.models import Event, EventAction from authentik.events.models import Event, EventAction, Notification
from authentik.events.monitored_tasks import MonitoredTask, TaskResult, TaskResultStatus from authentik.events.monitored_tasks import MonitoredTask, TaskResult, TaskResultStatus
from authentik.lib.config import CONFIG from authentik.lib.config import CONFIG
from authentik.lib.utils.http import get_http_session from authentik.lib.utils.http import get_http_session
@ -35,6 +35,18 @@ def _set_prom_info():
) )
@CELERY_APP.task()
def clear_update_notifications():
"""Clear update notifications on startup if the notification was for the version
we're running now."""
for notification in Notification.objects.filter(event__action=EventAction.UPDATE_AVAILABLE):
if "new_version" not in notification.event.context:
continue
notification_version = notification.event.context["new_version"]
if notification_version == __version__:
notification.delete()
@CELERY_APP.task(bind=True, base=MonitoredTask) @CELERY_APP.task(bind=True, base=MonitoredTask)
def update_latest_version(self: MonitoredTask): def update_latest_version(self: MonitoredTask):
"""Update latest version info""" """Update latest version info"""

View File

@ -82,6 +82,7 @@ class TokenViewSet(UsedByMixin, ModelViewSet):
"description", "description",
"expires", "expires",
"expiring", "expiring",
"managed",
] ]
ordering = ["identifier", "expires"] ordering = ["identifier", "expires"]
permission_classes = [OwnerSuperuserPermissions] permission_classes = [OwnerSuperuserPermissions]

View File

@ -90,6 +90,9 @@ class UserSerializer(ModelSerializer):
"attributes", "attributes",
"uid", "uid",
] ]
extra_kwargs = {
"name": {"allow_blank": True},
}
class UserSelfSerializer(ModelSerializer): class UserSelfSerializer(ModelSerializer):
@ -98,9 +101,25 @@ class UserSelfSerializer(ModelSerializer):
is_superuser = BooleanField(read_only=True) is_superuser = BooleanField(read_only=True)
avatar = CharField(read_only=True) avatar = CharField(read_only=True)
groups = ListSerializer(child=GroupSerializer(), read_only=True, source="ak_groups") groups = SerializerMethodField()
uid = CharField(read_only=True) uid = CharField(read_only=True)
@extend_schema_field(
ListSerializer(
child=inline_serializer(
"UserSelfGroups",
{"name": CharField(read_only=True), "pk": CharField(read_only=True)},
)
)
)
def get_groups(self, user: User):
"""Return only the group names a user is member of"""
for group in user.ak_groups.all():
yield {
"name": group.name,
"pk": group.pk,
}
class Meta: class Meta:
model = User model = User
@ -117,6 +136,7 @@ class UserSelfSerializer(ModelSerializer):
] ]
extra_kwargs = { extra_kwargs = {
"is_active": {"read_only": True}, "is_active": {"read_only": True},
"name": {"allow_blank": True},
} }
@ -208,6 +228,7 @@ class UserViewSet(UsedByMixin, ModelViewSet):
"""User Viewset""" """User Viewset"""
queryset = User.objects.none() queryset = User.objects.none()
ordering = ["username"]
serializer_class = UserSerializer serializer_class = UserSerializer
search_fields = ["username", "name", "is_active", "email"] search_fields = ["username", "name", "is_active", "email"]
filterset_class = UsersFilter filterset_class = UsersFilter

View File

@ -108,6 +108,7 @@ class FlowViewSet(UsedByMixin, ModelViewSet):
queryset = Flow.objects.all() queryset = Flow.objects.all()
serializer_class = FlowSerializer serializer_class = FlowSerializer
lookup_field = "slug" lookup_field = "slug"
ordering = ["slug", "name"]
search_fields = ["name", "slug", "designation", "title"] search_fields = ["name", "slug", "designation", "title"]
filterset_fields = ["flow_uuid", "name", "slug", "designation"] filterset_fields = ["flow_uuid", "name", "slug", "designation"]

View File

@ -76,6 +76,9 @@ class DockerController(BaseController):
# {'HostIp': '0.0.0.0', 'HostPort': '389'}, # {'HostIp': '0.0.0.0', 'HostPort': '389'},
# {'HostIp': '::', 'HostPort': '389'} # {'HostIp': '::', 'HostPort': '389'}
# ]} # ]}
# If no ports are mapped (either mapping disabled, or host network)
if not container.ports:
return False
for port in self.deployment_ports: for port in self.deployment_ports:
key = f"{port.inner_port or port.port}/{port.protocol.lower()}" key = f"{port.inner_port or port.port}/{port.protocol.lower()}"
if key not in container.ports: if key not in container.ports:

View File

@ -87,6 +87,7 @@ class PolicyViewSet(
"promptstage": ["isnull"], "promptstage": ["isnull"],
} }
search_fields = ["name"] search_fields = ["name"]
ordering = ["name"]
def get_queryset(self): # pragma: no cover def get_queryset(self): # pragma: no cover
return Policy.objects.select_subclasses().prefetch_related("bindings", "promptstage_set") return Policy.objects.select_subclasses().prefetch_related("bindings", "promptstage_set")

View File

@ -59,14 +59,14 @@ class MetricsView(View):
class LiveView(View): class LiveView(View):
"""View for liveness probe, always returns Http 201""" """View for liveness probe, always returns Http 204"""
def dispatch(self, request: HttpRequest) -> HttpResponse: def dispatch(self, request: HttpRequest) -> HttpResponse:
return HttpResponse(status=201) return HttpResponse(status=204)
class ReadyView(View): class ReadyView(View):
"""View for readiness probe, always returns Http 201, unless sql or redis is down""" """View for readiness probe, always returns Http 204, unless sql or redis is down"""
def dispatch(self, request: HttpRequest) -> HttpResponse: def dispatch(self, request: HttpRequest) -> HttpResponse:
try: try:
@ -79,4 +79,4 @@ class ReadyView(View):
redis_conn.ping() redis_conn.ping()
except RedisError: except RedisError:
return HttpResponse(status=503) return HttpResponse(status=503)
return HttpResponse(status=201) return HttpResponse(status=204)

View File

@ -45,6 +45,9 @@ func main() {
defer common.Defer() defer common.Defer()
ac := ak.NewAPIController(*akURLActual, akToken) ac := ak.NewAPIController(*akURLActual, akToken)
if ac == nil {
os.Exit(1)
}
ac.Server = ldap.NewServer(ac) ac.Server = ldap.NewServer(ac)

View File

@ -59,6 +59,9 @@ func main() {
defer common.Defer() defer common.Defer()
ac := ak.NewAPIController(*akURLActual, akToken) ac := ak.NewAPIController(*akURLActual, akToken)
if ac == nil {
os.Exit(1)
}
ac.Server = proxyv2.NewProxyServer(ac, portOffset) ac.Server = proxyv2.NewProxyServer(ac, portOffset)

View File

@ -54,7 +54,7 @@ func main() {
u, _ := url.Parse("http://localhost:8000") u, _ := url.Parse("http://localhost:8000")
g := gounicorn.NewGoUnicorn() g := gounicorn.NewGoUnicorn()
ws := web.NewWebServer() ws := web.NewWebServer(g)
defer g.Kill() defer g.Kill()
defer ws.Shutdown() defer ws.Shutdown()
go web.RunMetricsServer() go web.RunMetricsServer()

View File

@ -7,8 +7,6 @@ services:
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- database:/var/lib/postgresql/data - database:/var/lib/postgresql/data
networks:
- internal
environment: environment:
- POSTGRES_PASSWORD=${PG_PASS:?database password required} - POSTGRES_PASSWORD=${PG_PASS:?database password required}
- POSTGRES_USER=${PG_USER:-authentik} - POSTGRES_USER=${PG_USER:-authentik}
@ -18,10 +16,8 @@ services:
redis: redis:
image: redis:alpine image: redis:alpine
restart: unless-stopped restart: unless-stopped
networks:
- internal
server: server:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2021.9.5} image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2021.9.8}
restart: unless-stopped restart: unless-stopped
command: server command: server
environment: environment:
@ -36,19 +32,15 @@ services:
- ./media:/media - ./media:/media
- ./custom-templates:/templates - ./custom-templates:/templates
- geoip:/geoip - geoip:/geoip
networks:
- internal
env_file: env_file:
- .env - .env
ports: ports:
- "0.0.0.0:9000:9000" - "0.0.0.0:9000:9000"
- "0.0.0.0:9443:9443" - "0.0.0.0:9443:9443"
worker: worker:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2021.9.5} image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2021.9.8}
restart: unless-stopped restart: unless-stopped
command: worker command: worker
networks:
- internal
environment: environment:
AUTHENTIK_REDIS__HOST: redis AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql AUTHENTIK_POSTGRESQL__HOST: postgresql
@ -83,6 +75,3 @@ volumes:
driver: local driver: local
geoip: geoip:
driver: local driver: local
networks:
internal: {}

2
go.mod
View File

@ -34,7 +34,7 @@ require (
github.com/recws-org/recws v1.3.1 github.com/recws-org/recws v1.3.1
github.com/sirupsen/logrus v1.8.1 github.com/sirupsen/logrus v1.8.1
go.mongodb.org/mongo-driver v1.5.2 // indirect go.mongodb.org/mongo-driver v1.5.2 // indirect
goauthentik.io/api v0.202192.5 goauthentik.io/api v0.202195.4
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect
golang.org/x/net v0.0.0-20210510120150-4163338589ed // indirect golang.org/x/net v0.0.0-20210510120150-4163338589ed // indirect
golang.org/x/oauth2 v0.0.0-20210323180902-22b0adad7558 golang.org/x/oauth2 v0.0.0-20210323180902-22b0adad7558

4
go.sum
View File

@ -554,8 +554,8 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
goauthentik.io/api v0.202192.5 h1:BS4E71K2uZXy1vAdGVFLJJU0KwvAkkqKg42cYv46ud0= goauthentik.io/api v0.202195.4 h1:UQMeaNW/MZsMUrmaJ3p19gve26RIn+y08m9M2QQBWek=
goauthentik.io/api v0.202192.5/go.mod h1:02nnD4FRd8lu8A1+ZuzqownBgvAhdCKzqkKX8v7JMTE= goauthentik.io/api v0.202195.4/go.mod h1:02nnD4FRd8lu8A1+ZuzqownBgvAhdCKzqkKX8v7JMTE=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=

View File

@ -17,4 +17,4 @@ func OutpostUserAgent() string {
return fmt.Sprintf("authentik-outpost@%s (build=%s)", VERSION, BUILD()) return fmt.Sprintf("authentik-outpost@%s (build=%s)", VERSION, BUILD())
} }
const VERSION = "2021.9.5" const VERSION = "2021.9.8"

View File

@ -1,10 +1,13 @@
package gounicorn package gounicorn
import ( import (
"net/http"
"os" "os"
"os/exec" "os/exec"
"time"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"goauthentik.io/internal/outpost/ak"
) )
type GoUnicorn struct { type GoUnicorn struct {
@ -12,6 +15,7 @@ type GoUnicorn struct {
p *exec.Cmd p *exec.Cmd
started bool started bool
killed bool killed bool
alive bool
} }
func NewGoUnicorn() *GoUnicorn { func NewGoUnicorn() *GoUnicorn {
@ -20,6 +24,7 @@ func NewGoUnicorn() *GoUnicorn {
log: logger, log: logger,
started: false, started: false,
killed: false, killed: false,
alive: false,
} }
g.initCmd() g.initCmd()
return g return g
@ -35,6 +40,10 @@ func (g *GoUnicorn) initCmd() {
g.p.Stderr = os.Stderr g.p.Stderr = os.Stderr
} }
func (g *GoUnicorn) IsRunning() bool {
return g.alive
}
func (g *GoUnicorn) Start() error { func (g *GoUnicorn) Start() error {
if g.killed { if g.killed {
g.log.Debug("Not restarting gunicorn since we're killed") g.log.Debug("Not restarting gunicorn since we're killed")
@ -44,9 +53,38 @@ func (g *GoUnicorn) Start() error {
g.initCmd() g.initCmd()
} }
g.started = true g.started = true
go g.healthcheck()
return g.p.Run() return g.p.Run()
} }
func (g *GoUnicorn) healthcheck() {
g.log.Debug("starting healthcheck")
h := &http.Client{
Transport: ak.NewUserAgentTransport("goauthentik.io go proxy healthcheck", http.DefaultTransport),
}
check := func() bool {
res, err := h.Get("http://localhost:8000/-/health/live/")
if err == nil && res.StatusCode == 204 {
g.alive = true
return true
}
return false
}
// Default healthcheck is every 1 second on startup
// once we've been healthy once, increase to 30 seconds
for range time.Tick(time.Second) {
if check() {
g.log.Info("backend is alive, backing off with healthchecks")
break
}
g.log.Debug("backend not alive yet")
}
for range time.Tick(30 * time.Second) {
check()
}
}
func (g *GoUnicorn) Kill() { func (g *GoUnicorn) Kill() {
g.killed = true g.killed = true
err := g.p.Process.Kill() err := g.p.Process.Kill()

View File

@ -40,6 +40,10 @@ func (ws *WebServer) configureProxy() {
ws.proxyErrorHandler(rw, r, fmt.Errorf("proxy not running")) ws.proxyErrorHandler(rw, r, fmt.Errorf("proxy not running"))
}) })
ws.m.PathPrefix("/").HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { ws.m.PathPrefix("/").HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
if !ws.p.IsRunning() {
ws.proxyErrorHandler(rw, r, fmt.Errorf("authentik core not running yet"))
return
}
host := web.GetHost(r) host := web.GetHost(r)
before := time.Now() before := time.Now()
if ws.ProxyServer != nil { if ws.ProxyServer != nil {
@ -59,8 +63,12 @@ func (ws *WebServer) configureProxy() {
} }
func (ws *WebServer) proxyErrorHandler(rw http.ResponseWriter, req *http.Request, err error) { func (ws *WebServer) proxyErrorHandler(rw http.ResponseWriter, req *http.Request, err error) {
ws.log.WithError(err).Warning("proxy error") ws.log.Warning(err.Error())
rw.WriteHeader(http.StatusBadGateway) rw.WriteHeader(http.StatusBadGateway)
_, err = rw.Write([]byte("authentik starting..."))
if err != nil {
ws.log.WithError(err).Warning("failed to write error message")
}
} }
func (ws *WebServer) proxyModifyResponse(r *http.Response) error { func (ws *WebServer) proxyModifyResponse(r *http.Response) error {

View File

@ -11,6 +11,7 @@ import (
"github.com/pires/go-proxyproto" "github.com/pires/go-proxyproto"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"goauthentik.io/internal/config" "goauthentik.io/internal/config"
"goauthentik.io/internal/gounicorn"
"goauthentik.io/internal/outpost/proxyv2" "goauthentik.io/internal/outpost/proxyv2"
) )
@ -27,9 +28,10 @@ type WebServer struct {
m *mux.Router m *mux.Router
lh *mux.Router lh *mux.Router
log *log.Entry log *log.Entry
p *gounicorn.GoUnicorn
} }
func NewWebServer() *WebServer { func NewWebServer(g *gounicorn.GoUnicorn) *WebServer {
l := log.WithField("logger", "authentik.g.web") l := log.WithField("logger", "authentik.g.web")
mainHandler := mux.NewRouter() mainHandler := mux.NewRouter()
if config.G.ErrorReporting.Enabled { if config.G.ErrorReporting.Enabled {
@ -46,6 +48,7 @@ func NewWebServer() *WebServer {
m: mainHandler, m: mainHandler,
lh: logginRouter, lh: logginRouter,
log: l, log: l,
p: g,
} }
ws.configureStatic() ws.configureStatic()
ws.configureProxy() ws.configureProxy()

View File

@ -26,10 +26,14 @@ function check_if_root {
chpst -u authentik:$GROUP env HOME=/authentik $1 chpst -u authentik:$GROUP env HOME=/authentik $1
} }
MODE_FILE="/tmp/authentik-mode"
if [[ "$1" == "server" ]]; then if [[ "$1" == "server" ]]; then
echo "server" > $MODE_FILE
python -m lifecycle.migrate python -m lifecycle.migrate
/authentik-proxy /authentik-proxy
elif [[ "$1" == "worker" ]]; then elif [[ "$1" == "worker" ]]; then
echo "worker" > $MODE_FILE
check_if_root "celery -A authentik.root.celery worker --autoscale 3,1 -E -B -s /tmp/celerybeat-schedule -Q authentik,authentik_scheduled,authentik_events" check_if_root "celery -A authentik.root.celery worker --autoscale 3,1 -E -B -s /tmp/celerybeat-schedule -Q authentik,authentik_scheduled,authentik_events"
elif [[ "$1" == "backup" ]]; then elif [[ "$1" == "backup" ]]; then
python -m manage dbbackup --clean python -m manage dbbackup --clean
@ -42,6 +46,13 @@ elif [[ "$1" == "test" ]]; then
touch /unittest.xml touch /unittest.xml
chown authentik:authentik /unittest.xml chown authentik:authentik /unittest.xml
check_if_root "python -m manage test authentik" check_if_root "python -m manage test authentik"
elif [[ "$1" == "healthcheck" ]]; then
mode=$(cat $MODE_FILE)
if [[ $mode == "server" ]]; then
curl --user-agent "goauthentik.io lifecycle Healthcheck" -I http://localhost:9000/-/health/ready/
elif [[ $mode == "worker" ]]; then
celery -A authentik.root.celery inspect ping -d celery@$HOSTNAME
fi
else else
python -m manage "$@" python -m manage "$@"
fi fi

View File

@ -1,7 +1,7 @@
openapi: 3.0.3 openapi: 3.0.3
info: info:
title: authentik title: authentik
version: 2021.9.5 version: 2021.9.8
description: Making authentication simple. description: Making authentication simple.
contact: contact:
email: hello@beryju.org email: hello@beryju.org
@ -2318,6 +2318,10 @@ paths:
- app_password - app_password
- recovery - recovery
- verification - verification
- in: query
name: managed
schema:
type: string
- name: ordering - name: ordering
required: false required: false
in: query in: query
@ -29205,7 +29209,7 @@ components:
groups: groups:
type: array type: array
items: items:
$ref: '#/components/schemas/Group' $ref: '#/components/schemas/UserSelfGroups'
readOnly: true readOnly: true
email: email:
type: string type: string
@ -29227,6 +29231,18 @@ components:
- pk - pk
- uid - uid
- username - username
UserSelfGroups:
type: object
properties:
name:
type: string
readOnly: true
pk:
type: string
readOnly: true
required:
- name
- pk
UserSelfRequest: UserSelfRequest:
type: object type: object
description: |- description: |-

307
web/package-lock.json generated
View File

@ -15,10 +15,11 @@
"@babel/preset-env": "^7.15.6", "@babel/preset-env": "^7.15.6",
"@babel/preset-typescript": "^7.15.0", "@babel/preset-typescript": "^7.15.0",
"@fortawesome/fontawesome-free": "^5.15.4", "@fortawesome/fontawesome-free": "^5.15.4",
"@goauthentik/api": "^2021.9.4-1633366097", "@goauthentik/api": "^2021.9.5-1633432270",
"@lingui/cli": "^3.11.1", "@lingui/cli": "^3.12.1",
"@lingui/core": "^3.11.1", "@lingui/core": "^3.12.1",
"@lingui/macro": "^3.11.1", "@lingui/detect-locale": "^3.12.1",
"@lingui/macro": "^3.12.1",
"@patternfly/patternfly": "^4.135.2", "@patternfly/patternfly": "^4.135.2",
"@polymer/iron-form": "^3.0.1", "@polymer/iron-form": "^3.0.1",
"@polymer/paper-input": "^3.2.1", "@polymer/paper-input": "^3.2.1",
@ -30,16 +31,16 @@
"@squoosh/cli": "^0.7.2", "@squoosh/cli": "^0.7.2",
"@trivago/prettier-plugin-sort-imports": "^2.0.4", "@trivago/prettier-plugin-sort-imports": "^2.0.4",
"@types/chart.js": "^2.9.34", "@types/chart.js": "^2.9.34",
"@types/codemirror": "5.60.3", "@types/codemirror": "5.60.4",
"@types/grecaptcha": "^3.0.3", "@types/grecaptcha": "^3.0.3",
"@typescript-eslint/eslint-plugin": "^4.31.2", "@typescript-eslint/eslint-plugin": "^4.33.0",
"@typescript-eslint/parser": "^4.31.2", "@typescript-eslint/parser": "^4.33.0",
"@webcomponents/webcomponentsjs": "^2.6.0", "@webcomponents/webcomponentsjs": "^2.6.0",
"babel-plugin-macros": "^3.1.0", "babel-plugin-macros": "^3.1.0",
"base64-js": "^1.5.1", "base64-js": "^1.5.1",
"chart.js": "^3.5.1", "chart.js": "^3.5.1",
"chartjs-adapter-moment": "^1.0.0", "chartjs-adapter-moment": "^1.0.0",
"codemirror": "^5.63.0", "codemirror": "^5.63.1",
"construct-style-sheets-polyfill": "^2.4.16", "construct-style-sheets-polyfill": "^2.4.16",
"eslint": "^7.32.0", "eslint": "^7.32.0",
"eslint-config-google": "^0.14.0", "eslint-config-google": "^0.14.0",
@ -51,7 +52,7 @@
"moment": "^2.29.1", "moment": "^2.29.1",
"prettier": "^2.4.1", "prettier": "^2.4.1",
"rapidoc": "^9.1.3", "rapidoc": "^9.1.3",
"rollup": "^2.57.0", "rollup": "^2.58.0",
"rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-commonjs": "^10.1.0",
"rollup-plugin-copy": "^3.4.0", "rollup-plugin-copy": "^3.4.0",
"rollup-plugin-cssimport": "^1.0.2", "rollup-plugin-cssimport": "^1.0.2",
@ -1691,9 +1692,9 @@
} }
}, },
"node_modules/@goauthentik/api": { "node_modules/@goauthentik/api": {
"version": "2021.9.4-1633366097", "version": "2021.9.5-1633432270",
"resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2021.9.4-1633366097.tgz", "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2021.9.5-1633432270.tgz",
"integrity": "sha512-k0RX5kHNfkgmciwPD6a7o8Movj9nfYt/uqvuJ0+5ptttJTDkB177c+okS0hqBtZF8n1u662w85gMvffAYrvU/Q==" "integrity": "sha512-uKhaYImCzX8BLWQZD5vY5mClfUtZeGEn7/o+dNztOs6viOCbWSRuYvE1tnTqxKjKw2Yoe2YaWURfA7zweSxUng=="
}, },
"node_modules/@humanwhocodes/config-array": { "node_modules/@humanwhocodes/config-array": {
"version": "0.5.0", "version": "0.5.0",
@ -1793,13 +1794,13 @@
} }
}, },
"node_modules/@lingui/babel-plugin-extract-messages": { "node_modules/@lingui/babel-plugin-extract-messages": {
"version": "3.11.1", "version": "3.12.1",
"resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.11.1.tgz", "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.12.1.tgz",
"integrity": "sha512-MAsZ0BYIsHh08dptT7bA6Jsh1ixO1sBU8eNDtobkZaZ78SXIUMUYCy9e3T9D/RYpecgDGaFUf2djctTqguMgmQ==", "integrity": "sha512-5x119XBpWe3gYUDTgwkoTFqeI60beFRdEL1HnArFkrWfhaGqUK8SjzpqO7NtN335IIBU3SPtGXKsI4NPkJQ8TA==",
"dependencies": { "dependencies": {
"@babel/generator": "^7.11.6", "@babel/generator": "^7.11.6",
"@babel/runtime": "^7.11.2", "@babel/runtime": "^7.11.2",
"@lingui/conf": "^3.11.1", "@lingui/conf": "^3.12.1",
"mkdirp": "^1.0.4" "mkdirp": "^1.0.4"
}, },
"engines": { "engines": {
@ -1807,17 +1808,17 @@
} }
}, },
"node_modules/@lingui/cli": { "node_modules/@lingui/cli": {
"version": "3.11.1", "version": "3.12.1",
"resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-3.11.1.tgz", "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-3.12.1.tgz",
"integrity": "sha512-piKjrGjiornzX18Lt6EhyICAHEGH9wio0KaOXKyCjHqPw8sQnC4AZv0iyZqTACVYL+0ROsrtNd/xgDMYNSQgeA==", "integrity": "sha512-Z3klth+zD3+oqkDEhm1cTuI1Z9K/lyZD615cUQXPxLZRn9dokZ+9enoJNiese412VMNvcp/dtYC+wfyMpYX2PQ==",
"dependencies": { "dependencies": {
"@babel/generator": "^7.11.6", "@babel/generator": "^7.11.6",
"@babel/parser": "^7.11.5", "@babel/parser": "^7.11.5",
"@babel/plugin-syntax-jsx": "^7.10.4", "@babel/plugin-syntax-jsx": "^7.10.4",
"@babel/runtime": "^7.11.2", "@babel/runtime": "^7.11.2",
"@babel/types": "^7.11.5", "@babel/types": "^7.11.5",
"@lingui/babel-plugin-extract-messages": "^3.11.1", "@lingui/babel-plugin-extract-messages": "^3.12.1",
"@lingui/conf": "^3.11.1", "@lingui/conf": "^3.12.1",
"babel-plugin-macros": "^3.0.1", "babel-plugin-macros": "^3.0.1",
"bcp-47": "^1.0.7", "bcp-47": "^1.0.7",
"chalk": "^4.1.0", "chalk": "^4.1.0",
@ -1920,9 +1921,9 @@
} }
}, },
"node_modules/@lingui/conf": { "node_modules/@lingui/conf": {
"version": "3.11.1", "version": "3.12.1",
"resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-3.11.1.tgz", "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-3.12.1.tgz",
"integrity": "sha512-WoEdtDAiI+TR7Gz2F7VMZQyIGZFP2b4qT3JO3gLuGzHY6a6DCqOMojqUuo6KHFQrUoUtebI/1Yn7gAxVH1xcWQ==", "integrity": "sha512-asTFAUTf8zxYU+fI1MxggJD/o4BenT/rE4IJ/+ngaf1cbzBo71lXmhSYkIa8/vTZrdHDSuXGzIL43f1D9BF6YA==",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.11.2", "@babel/runtime": "^7.11.2",
"@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2", "@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2",
@ -2000,9 +2001,9 @@
} }
}, },
"node_modules/@lingui/core": { "node_modules/@lingui/core": {
"version": "3.11.1", "version": "3.12.1",
"resolved": "https://registry.npmjs.org/@lingui/core/-/core-3.11.1.tgz", "resolved": "https://registry.npmjs.org/@lingui/core/-/core-3.12.1.tgz",
"integrity": "sha512-qHMo47SbwFFx3IwXbMRafIMZH2tTYebrQhvAu5wH9OabI+bqbVWbTOLSAXzX/gDZqxMQWIrr2ndrah0aPZk6EQ==", "integrity": "sha512-MkZgkaaBcFtmUXdck9YNMTMTwCRogUif8Ll4Wyqz0re2Ydo7fdwGFBkacYjOc787R5/UmZr2F21OtPqSbaoaJg==",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.11.2", "@babel/runtime": "^7.11.2",
"make-plural": "^6.2.2", "make-plural": "^6.2.2",
@ -2012,13 +2013,21 @@
"node": ">=10.0.0" "node": ">=10.0.0"
} }
}, },
"node_modules/@lingui/detect-locale": {
"version": "3.12.1",
"resolved": "https://registry.npmjs.org/@lingui/detect-locale/-/detect-locale-3.12.1.tgz",
"integrity": "sha512-/apP+LscyRuh+CIf42+LNuYmEsceNA/rh6N3iqebNcEsOcIzLA8v6dq1llzDOlfd3SxEj7xP9Kfhn6Vnp+78+Q==",
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/@lingui/macro": { "node_modules/@lingui/macro": {
"version": "3.11.1", "version": "3.12.1",
"resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-3.11.1.tgz", "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-3.12.1.tgz",
"integrity": "sha512-rSzvBs4Gasn6VO8msYA0/Bw285jUOBoLAVxURt6XaH45NXnJiWnDtEOD/DhQcuggDKbaWwz13lXOiRfUP0zG6g==", "integrity": "sha512-CszdqDnaCo5cnbg6RROYnYtYGOADPhJuRf9U9t2aL9IsN+N7pSQAMdMLbjYkEMT/V8Cjon33ZjLgeGihe0FhSA==",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.11.2", "@babel/runtime": "^7.11.2",
"@lingui/conf": "^3.11.1", "@lingui/conf": "^3.12.1",
"ramda": "^0.27.1" "ramda": "^0.27.1"
}, },
"engines": { "engines": {
@ -2562,9 +2571,9 @@
} }
}, },
"node_modules/@types/codemirror": { "node_modules/@types/codemirror": {
"version": "5.60.3", "version": "5.60.4",
"resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.3.tgz", "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.4.tgz",
"integrity": "sha512-dVX8Vsio70u4la9LGi1jjmaqtcdMMZUYalO5QY5EWy4XKrNjewNm9cy2K5XvP+puzLzum417gmJ9w7F6bVR1XA==", "integrity": "sha512-SUQgBj9jZ+xj75zgwfgQZt0CManWBISN/YsE0xRmPwO6uDyLNpXO8bn2m59tpevsFw+eQdmx+qY1WjOrUgMDgw==",
"dependencies": { "dependencies": {
"@types/tern": "*" "@types/tern": "*"
} }
@ -2708,14 +2717,15 @@
"integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw=="
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz",
"integrity": "sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA==", "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==",
"dependencies": { "dependencies": {
"@typescript-eslint/experimental-utils": "4.31.2", "@typescript-eslint/experimental-utils": "4.33.0",
"@typescript-eslint/scope-manager": "4.31.2", "@typescript-eslint/scope-manager": "4.33.0",
"debug": "^4.3.1", "debug": "^4.3.1",
"functional-red-black-tree": "^1.0.1", "functional-red-black-tree": "^1.0.1",
"ignore": "^5.1.8",
"regexpp": "^3.1.0", "regexpp": "^3.1.0",
"semver": "^7.3.5", "semver": "^7.3.5",
"tsutils": "^3.21.0" "tsutils": "^3.21.0"
@ -2737,6 +2747,14 @@
} }
} }
}, },
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
"version": "5.1.8",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
"integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
"engines": {
"node": ">= 4"
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
"version": "7.3.5", "version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
@ -2752,14 +2770,14 @@
} }
}, },
"node_modules/@typescript-eslint/experimental-utils": { "node_modules/@typescript-eslint/experimental-utils": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz",
"integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==",
"dependencies": { "dependencies": {
"@types/json-schema": "^7.0.7", "@types/json-schema": "^7.0.7",
"@typescript-eslint/scope-manager": "4.31.2", "@typescript-eslint/scope-manager": "4.33.0",
"@typescript-eslint/types": "4.31.2", "@typescript-eslint/types": "4.33.0",
"@typescript-eslint/typescript-estree": "4.31.2", "@typescript-eslint/typescript-estree": "4.33.0",
"eslint-scope": "^5.1.1", "eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0" "eslint-utils": "^3.0.0"
}, },
@ -2775,13 +2793,13 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz",
"integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==",
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "4.31.2", "@typescript-eslint/scope-manager": "4.33.0",
"@typescript-eslint/types": "4.31.2", "@typescript-eslint/types": "4.33.0",
"@typescript-eslint/typescript-estree": "4.31.2", "@typescript-eslint/typescript-estree": "4.33.0",
"debug": "^4.3.1" "debug": "^4.3.1"
}, },
"engines": { "engines": {
@ -2801,12 +2819,12 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz",
"integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "4.31.2", "@typescript-eslint/types": "4.33.0",
"@typescript-eslint/visitor-keys": "4.31.2" "@typescript-eslint/visitor-keys": "4.33.0"
}, },
"engines": { "engines": {
"node": "^8.10.0 || ^10.13.0 || >=11.10.1" "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
@ -2817,9 +2835,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz",
"integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==",
"engines": { "engines": {
"node": "^8.10.0 || ^10.13.0 || >=11.10.1" "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
}, },
@ -2829,12 +2847,12 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz",
"integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "4.31.2", "@typescript-eslint/types": "4.33.0",
"@typescript-eslint/visitor-keys": "4.31.2", "@typescript-eslint/visitor-keys": "4.33.0",
"debug": "^4.3.1", "debug": "^4.3.1",
"globby": "^11.0.3", "globby": "^11.0.3",
"is-glob": "^4.0.1", "is-glob": "^4.0.1",
@ -2869,11 +2887,11 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz",
"integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "4.31.2", "@typescript-eslint/types": "4.33.0",
"eslint-visitor-keys": "^2.0.0" "eslint-visitor-keys": "^2.0.0"
}, },
"engines": { "engines": {
@ -3605,9 +3623,9 @@
} }
}, },
"node_modules/codemirror": { "node_modules/codemirror": {
"version": "5.63.0", "version": "5.63.1",
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.63.0.tgz", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.63.1.tgz",
"integrity": "sha512-KlLWRPggDg2rBD1Mx7/EqEhaBdy+ybBCVh/efgjBDsPpMeEu6MbTAJzIT4TuCzvmbTEgvKOGzVT6wdBTNusqrg==" "integrity": "sha512-baivaNZreZOGh1/tYyTvCupC9NeWk7qlZeGUDi4nFKj/J0JU8FYKZND4QqLw70P7HOttlCt4JJAOj9GoIhHEkA=="
}, },
"node_modules/collection-visit": { "node_modules/collection-visit": {
"version": "1.0.0", "version": "1.0.0",
@ -7080,9 +7098,9 @@
} }
}, },
"node_modules/rollup": { "node_modules/rollup": {
"version": "2.57.0", "version": "2.58.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.57.0.tgz", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz",
"integrity": "sha512-bKQIh1rWKofRee6mv8SrF2HdP6pea5QkwBZSMImJysFj39gQuiV8MEPBjXOCpzk3wSYp63M2v2wkWBmFC8O/rg==", "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==",
"bin": { "bin": {
"rollup": "dist/bin/rollup" "rollup": "dist/bin/rollup"
}, },
@ -9760,9 +9778,9 @@
"integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==" "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg=="
}, },
"@goauthentik/api": { "@goauthentik/api": {
"version": "2021.9.4-1633366097", "version": "2021.9.5-1633432270",
"resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2021.9.4-1633366097.tgz", "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2021.9.5-1633432270.tgz",
"integrity": "sha512-k0RX5kHNfkgmciwPD6a7o8Movj9nfYt/uqvuJ0+5ptttJTDkB177c+okS0hqBtZF8n1u662w85gMvffAYrvU/Q==" "integrity": "sha512-uKhaYImCzX8BLWQZD5vY5mClfUtZeGEn7/o+dNztOs6viOCbWSRuYvE1tnTqxKjKw2Yoe2YaWURfA7zweSxUng=="
}, },
"@humanwhocodes/config-array": { "@humanwhocodes/config-array": {
"version": "0.5.0", "version": "0.5.0",
@ -9837,28 +9855,28 @@
} }
}, },
"@lingui/babel-plugin-extract-messages": { "@lingui/babel-plugin-extract-messages": {
"version": "3.11.1", "version": "3.12.1",
"resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.11.1.tgz", "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.12.1.tgz",
"integrity": "sha512-MAsZ0BYIsHh08dptT7bA6Jsh1ixO1sBU8eNDtobkZaZ78SXIUMUYCy9e3T9D/RYpecgDGaFUf2djctTqguMgmQ==", "integrity": "sha512-5x119XBpWe3gYUDTgwkoTFqeI60beFRdEL1HnArFkrWfhaGqUK8SjzpqO7NtN335IIBU3SPtGXKsI4NPkJQ8TA==",
"requires": { "requires": {
"@babel/generator": "^7.11.6", "@babel/generator": "^7.11.6",
"@babel/runtime": "^7.11.2", "@babel/runtime": "^7.11.2",
"@lingui/conf": "^3.11.1", "@lingui/conf": "^3.12.1",
"mkdirp": "^1.0.4" "mkdirp": "^1.0.4"
} }
}, },
"@lingui/cli": { "@lingui/cli": {
"version": "3.11.1", "version": "3.12.1",
"resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-3.11.1.tgz", "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-3.12.1.tgz",
"integrity": "sha512-piKjrGjiornzX18Lt6EhyICAHEGH9wio0KaOXKyCjHqPw8sQnC4AZv0iyZqTACVYL+0ROsrtNd/xgDMYNSQgeA==", "integrity": "sha512-Z3klth+zD3+oqkDEhm1cTuI1Z9K/lyZD615cUQXPxLZRn9dokZ+9enoJNiese412VMNvcp/dtYC+wfyMpYX2PQ==",
"requires": { "requires": {
"@babel/generator": "^7.11.6", "@babel/generator": "^7.11.6",
"@babel/parser": "^7.11.5", "@babel/parser": "^7.11.5",
"@babel/plugin-syntax-jsx": "^7.10.4", "@babel/plugin-syntax-jsx": "^7.10.4",
"@babel/runtime": "^7.11.2", "@babel/runtime": "^7.11.2",
"@babel/types": "^7.11.5", "@babel/types": "^7.11.5",
"@lingui/babel-plugin-extract-messages": "^3.11.1", "@lingui/babel-plugin-extract-messages": "^3.12.1",
"@lingui/conf": "^3.11.1", "@lingui/conf": "^3.12.1",
"babel-plugin-macros": "^3.0.1", "babel-plugin-macros": "^3.0.1",
"bcp-47": "^1.0.7", "bcp-47": "^1.0.7",
"chalk": "^4.1.0", "chalk": "^4.1.0",
@ -9931,9 +9949,9 @@
} }
}, },
"@lingui/conf": { "@lingui/conf": {
"version": "3.11.1", "version": "3.12.1",
"resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-3.11.1.tgz", "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-3.12.1.tgz",
"integrity": "sha512-WoEdtDAiI+TR7Gz2F7VMZQyIGZFP2b4qT3JO3gLuGzHY6a6DCqOMojqUuo6KHFQrUoUtebI/1Yn7gAxVH1xcWQ==", "integrity": "sha512-asTFAUTf8zxYU+fI1MxggJD/o4BenT/rE4IJ/+ngaf1cbzBo71lXmhSYkIa8/vTZrdHDSuXGzIL43f1D9BF6YA==",
"requires": { "requires": {
"@babel/runtime": "^7.11.2", "@babel/runtime": "^7.11.2",
"@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2", "@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2",
@ -9989,22 +10007,27 @@
} }
}, },
"@lingui/core": { "@lingui/core": {
"version": "3.11.1", "version": "3.12.1",
"resolved": "https://registry.npmjs.org/@lingui/core/-/core-3.11.1.tgz", "resolved": "https://registry.npmjs.org/@lingui/core/-/core-3.12.1.tgz",
"integrity": "sha512-qHMo47SbwFFx3IwXbMRafIMZH2tTYebrQhvAu5wH9OabI+bqbVWbTOLSAXzX/gDZqxMQWIrr2ndrah0aPZk6EQ==", "integrity": "sha512-MkZgkaaBcFtmUXdck9YNMTMTwCRogUif8Ll4Wyqz0re2Ydo7fdwGFBkacYjOc787R5/UmZr2F21OtPqSbaoaJg==",
"requires": { "requires": {
"@babel/runtime": "^7.11.2", "@babel/runtime": "^7.11.2",
"make-plural": "^6.2.2", "make-plural": "^6.2.2",
"messageformat-parser": "^4.1.3" "messageformat-parser": "^4.1.3"
} }
}, },
"@lingui/detect-locale": {
"version": "3.12.1",
"resolved": "https://registry.npmjs.org/@lingui/detect-locale/-/detect-locale-3.12.1.tgz",
"integrity": "sha512-/apP+LscyRuh+CIf42+LNuYmEsceNA/rh6N3iqebNcEsOcIzLA8v6dq1llzDOlfd3SxEj7xP9Kfhn6Vnp+78+Q=="
},
"@lingui/macro": { "@lingui/macro": {
"version": "3.11.1", "version": "3.12.1",
"resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-3.11.1.tgz", "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-3.12.1.tgz",
"integrity": "sha512-rSzvBs4Gasn6VO8msYA0/Bw285jUOBoLAVxURt6XaH45NXnJiWnDtEOD/DhQcuggDKbaWwz13lXOiRfUP0zG6g==", "integrity": "sha512-CszdqDnaCo5cnbg6RROYnYtYGOADPhJuRf9U9t2aL9IsN+N7pSQAMdMLbjYkEMT/V8Cjon33ZjLgeGihe0FhSA==",
"requires": { "requires": {
"@babel/runtime": "^7.11.2", "@babel/runtime": "^7.11.2",
"@lingui/conf": "^3.11.1", "@lingui/conf": "^3.12.1",
"ramda": "^0.27.1" "ramda": "^0.27.1"
} }
}, },
@ -10465,9 +10488,9 @@
} }
}, },
"@types/codemirror": { "@types/codemirror": {
"version": "5.60.3", "version": "5.60.4",
"resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.3.tgz", "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.4.tgz",
"integrity": "sha512-dVX8Vsio70u4la9LGi1jjmaqtcdMMZUYalO5QY5EWy4XKrNjewNm9cy2K5XvP+puzLzum417gmJ9w7F6bVR1XA==", "integrity": "sha512-SUQgBj9jZ+xj75zgwfgQZt0CManWBISN/YsE0xRmPwO6uDyLNpXO8bn2m59tpevsFw+eQdmx+qY1WjOrUgMDgw==",
"requires": { "requires": {
"@types/tern": "*" "@types/tern": "*"
} }
@ -10610,19 +10633,25 @@
"integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw=="
}, },
"@typescript-eslint/eslint-plugin": { "@typescript-eslint/eslint-plugin": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz",
"integrity": "sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA==", "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==",
"requires": { "requires": {
"@typescript-eslint/experimental-utils": "4.31.2", "@typescript-eslint/experimental-utils": "4.33.0",
"@typescript-eslint/scope-manager": "4.31.2", "@typescript-eslint/scope-manager": "4.33.0",
"debug": "^4.3.1", "debug": "^4.3.1",
"functional-red-black-tree": "^1.0.1", "functional-red-black-tree": "^1.0.1",
"ignore": "^5.1.8",
"regexpp": "^3.1.0", "regexpp": "^3.1.0",
"semver": "^7.3.5", "semver": "^7.3.5",
"tsutils": "^3.21.0" "tsutils": "^3.21.0"
}, },
"dependencies": { "dependencies": {
"ignore": {
"version": "5.1.8",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
"integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw=="
},
"semver": { "semver": {
"version": "7.3.5", "version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
@ -10634,50 +10663,50 @@
} }
}, },
"@typescript-eslint/experimental-utils": { "@typescript-eslint/experimental-utils": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz",
"integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==",
"requires": { "requires": {
"@types/json-schema": "^7.0.7", "@types/json-schema": "^7.0.7",
"@typescript-eslint/scope-manager": "4.31.2", "@typescript-eslint/scope-manager": "4.33.0",
"@typescript-eslint/types": "4.31.2", "@typescript-eslint/types": "4.33.0",
"@typescript-eslint/typescript-estree": "4.31.2", "@typescript-eslint/typescript-estree": "4.33.0",
"eslint-scope": "^5.1.1", "eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0" "eslint-utils": "^3.0.0"
} }
}, },
"@typescript-eslint/parser": { "@typescript-eslint/parser": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz",
"integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==",
"requires": { "requires": {
"@typescript-eslint/scope-manager": "4.31.2", "@typescript-eslint/scope-manager": "4.33.0",
"@typescript-eslint/types": "4.31.2", "@typescript-eslint/types": "4.33.0",
"@typescript-eslint/typescript-estree": "4.31.2", "@typescript-eslint/typescript-estree": "4.33.0",
"debug": "^4.3.1" "debug": "^4.3.1"
} }
}, },
"@typescript-eslint/scope-manager": { "@typescript-eslint/scope-manager": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz",
"integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==",
"requires": { "requires": {
"@typescript-eslint/types": "4.31.2", "@typescript-eslint/types": "4.33.0",
"@typescript-eslint/visitor-keys": "4.31.2" "@typescript-eslint/visitor-keys": "4.33.0"
} }
}, },
"@typescript-eslint/types": { "@typescript-eslint/types": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz",
"integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==" "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ=="
}, },
"@typescript-eslint/typescript-estree": { "@typescript-eslint/typescript-estree": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz",
"integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==",
"requires": { "requires": {
"@typescript-eslint/types": "4.31.2", "@typescript-eslint/types": "4.33.0",
"@typescript-eslint/visitor-keys": "4.31.2", "@typescript-eslint/visitor-keys": "4.33.0",
"debug": "^4.3.1", "debug": "^4.3.1",
"globby": "^11.0.3", "globby": "^11.0.3",
"is-glob": "^4.0.1", "is-glob": "^4.0.1",
@ -10696,11 +10725,11 @@
} }
}, },
"@typescript-eslint/visitor-keys": { "@typescript-eslint/visitor-keys": {
"version": "4.31.2", "version": "4.33.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz",
"integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==",
"requires": { "requires": {
"@typescript-eslint/types": "4.31.2", "@typescript-eslint/types": "4.33.0",
"eslint-visitor-keys": "^2.0.0" "eslint-visitor-keys": "^2.0.0"
} }
}, },
@ -11215,9 +11244,9 @@
"integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
}, },
"codemirror": { "codemirror": {
"version": "5.63.0", "version": "5.63.1",
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.63.0.tgz", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.63.1.tgz",
"integrity": "sha512-KlLWRPggDg2rBD1Mx7/EqEhaBdy+ybBCVh/efgjBDsPpMeEu6MbTAJzIT4TuCzvmbTEgvKOGzVT6wdBTNusqrg==" "integrity": "sha512-baivaNZreZOGh1/tYyTvCupC9NeWk7qlZeGUDi4nFKj/J0JU8FYKZND4QqLw70P7HOttlCt4JJAOj9GoIhHEkA=="
}, },
"collection-visit": { "collection-visit": {
"version": "1.0.0", "version": "1.0.0",
@ -13816,9 +13845,9 @@
} }
}, },
"rollup": { "rollup": {
"version": "2.57.0", "version": "2.58.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.57.0.tgz", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz",
"integrity": "sha512-bKQIh1rWKofRee6mv8SrF2HdP6pea5QkwBZSMImJysFj39gQuiV8MEPBjXOCpzk3wSYp63M2v2wkWBmFC8O/rg==", "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==",
"requires": { "requires": {
"fsevents": "~2.3.2" "fsevents": "~2.3.2"
} }

View File

@ -17,7 +17,8 @@
"sourceLocale": "en", "sourceLocale": "en",
"locales": [ "locales": [
"en", "en",
"pseudo-LOCALE" "pseudo-LOCALE",
"fr_FR"
], ],
"formatOptions": { "formatOptions": {
"lineNumbers": false "lineNumbers": false
@ -47,10 +48,11 @@
"@babel/preset-env": "^7.15.6", "@babel/preset-env": "^7.15.6",
"@babel/preset-typescript": "^7.15.0", "@babel/preset-typescript": "^7.15.0",
"@fortawesome/fontawesome-free": "^5.15.4", "@fortawesome/fontawesome-free": "^5.15.4",
"@goauthentik/api": "^2021.9.4-1633366097", "@goauthentik/api": "^2021.9.5-1633432270",
"@lingui/cli": "^3.11.1", "@lingui/cli": "^3.12.1",
"@lingui/core": "^3.11.1", "@lingui/core": "^3.12.1",
"@lingui/macro": "^3.11.1", "@lingui/detect-locale": "^3.12.1",
"@lingui/macro": "^3.12.1",
"@patternfly/patternfly": "^4.135.2", "@patternfly/patternfly": "^4.135.2",
"@polymer/iron-form": "^3.0.1", "@polymer/iron-form": "^3.0.1",
"@polymer/paper-input": "^3.2.1", "@polymer/paper-input": "^3.2.1",
@ -62,16 +64,16 @@
"@squoosh/cli": "^0.7.2", "@squoosh/cli": "^0.7.2",
"@trivago/prettier-plugin-sort-imports": "^2.0.4", "@trivago/prettier-plugin-sort-imports": "^2.0.4",
"@types/chart.js": "^2.9.34", "@types/chart.js": "^2.9.34",
"@types/codemirror": "5.60.3", "@types/codemirror": "5.60.4",
"@types/grecaptcha": "^3.0.3", "@types/grecaptcha": "^3.0.3",
"@typescript-eslint/eslint-plugin": "^4.31.2", "@typescript-eslint/eslint-plugin": "^4.33.0",
"@typescript-eslint/parser": "^4.31.2", "@typescript-eslint/parser": "^4.33.0",
"@webcomponents/webcomponentsjs": "^2.6.0", "@webcomponents/webcomponentsjs": "^2.6.0",
"babel-plugin-macros": "^3.1.0", "babel-plugin-macros": "^3.1.0",
"base64-js": "^1.5.1", "base64-js": "^1.5.1",
"chart.js": "^3.5.1", "chart.js": "^3.5.1",
"chartjs-adapter-moment": "^1.0.0", "chartjs-adapter-moment": "^1.0.0",
"codemirror": "^5.63.0", "codemirror": "^5.63.1",
"construct-style-sheets-polyfill": "^2.4.16", "construct-style-sheets-polyfill": "^2.4.16",
"eslint": "^7.32.0", "eslint": "^7.32.0",
"eslint-config-google": "^0.14.0", "eslint-config-google": "^0.14.0",
@ -83,7 +85,7 @@
"moment": "^2.29.1", "moment": "^2.29.1",
"prettier": "^2.4.1", "prettier": "^2.4.1",
"rapidoc": "^9.1.3", "rapidoc": "^9.1.3",
"rollup": "^2.57.0", "rollup": "^2.58.0",
"rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-commonjs": "^10.1.0",
"rollup-plugin-copy": "^3.4.0", "rollup-plugin-copy": "^3.4.0",
"rollup-plugin-cssimport": "^1.0.2", "rollup-plugin-cssimport": "^1.0.2",

View File

@ -3,7 +3,7 @@ export const SUCCESS_CLASS = "pf-m-success";
export const ERROR_CLASS = "pf-m-danger"; export const ERROR_CLASS = "pf-m-danger";
export const PROGRESS_CLASS = "pf-m-in-progress"; export const PROGRESS_CLASS = "pf-m-in-progress";
export const CURRENT_CLASS = "pf-m-current"; export const CURRENT_CLASS = "pf-m-current";
export const VERSION = "2021.9.5"; export const VERSION = "2021.9.8";
export const PAGE_SIZE = 20; export const PAGE_SIZE = 20;
export const TITLE_DEFAULT = "authentik"; export const TITLE_DEFAULT = "authentik";
export const ROUTE_SEPARATOR = ";"; export const ROUTE_SEPARATOR = ";";

View File

@ -1,5 +1,7 @@
import { ChartData } from "chart.js"; import { ChartData } from "chart.js";
import { t } from "@lingui/macro";
import { customElement } from "lit/decorators"; import { customElement } from "lit/decorators";
import { AdminApi, LoginMetrics } from "@goauthentik/api"; import { AdminApi, LoginMetrics } from "@goauthentik/api";
@ -17,7 +19,7 @@ export class AdminLoginsChart extends AKChart<LoginMetrics> {
return { return {
datasets: [ datasets: [
{ {
label: "Failed Logins", label: t`Failed Logins`,
backgroundColor: "rgba(201, 25, 11, .5)", backgroundColor: "rgba(201, 25, 11, .5)",
spanGaps: true, spanGaps: true,
data: data:
@ -29,7 +31,7 @@ export class AdminLoginsChart extends AKChart<LoginMetrics> {
}) || [], }) || [],
}, },
{ {
label: "Successful Logins", label: t`Successful Logins`,
backgroundColor: "rgba(189, 229, 184, .5)", backgroundColor: "rgba(189, 229, 184, .5)",
spanGaps: true, spanGaps: true,
data: data:

View File

@ -1,5 +1,7 @@
import { ChartData } from "chart.js"; import { ChartData } from "chart.js";
import { t } from "@lingui/macro";
import { customElement, property } from "lit/decorators"; import { customElement, property } from "lit/decorators";
import { Coordinate, CoreApi } from "@goauthentik/api"; import { Coordinate, CoreApi } from "@goauthentik/api";
@ -22,7 +24,7 @@ export class ApplicationAuthorizeChart extends AKChart<Coordinate[]> {
return { return {
datasets: [ datasets: [
{ {
label: "Authorizations", label: t`Authorizations`,
backgroundColor: "rgba(189, 229, 184, .5)", backgroundColor: "rgba(189, 229, 184, .5)",
spanGaps: true, spanGaps: true,
data: data:

View File

@ -1,5 +1,7 @@
import { ChartData } from "chart.js"; import { ChartData } from "chart.js";
import { t } from "@lingui/macro";
import { customElement, property } from "lit/decorators"; import { customElement, property } from "lit/decorators";
import { CoreApi, UserMetrics } from "@goauthentik/api"; import { CoreApi, UserMetrics } from "@goauthentik/api";
@ -22,7 +24,7 @@ export class UserChart extends AKChart<UserMetrics> {
return { return {
datasets: [ datasets: [
{ {
label: "Failed Logins", label: t`Failed Logins`,
backgroundColor: "rgba(201, 25, 11, .5)", backgroundColor: "rgba(201, 25, 11, .5)",
spanGaps: true, spanGaps: true,
data: data:
@ -34,7 +36,7 @@ export class UserChart extends AKChart<UserMetrics> {
}) || [], }) || [],
}, },
{ {
label: "Successful Logins", label: t`Successful Logins`,
backgroundColor: "rgba(189, 229, 184, .5)", backgroundColor: "rgba(189, 229, 184, .5)",
spanGaps: true, spanGaps: true,
data: data:
@ -46,7 +48,7 @@ export class UserChart extends AKChart<UserMetrics> {
}) || [], }) || [],
}, },
{ {
label: "Application authorizations", label: t`Application authorizations`,
backgroundColor: "rgba(43, 154, 243, .5)", backgroundColor: "rgba(43, 154, 243, .5)",
spanGaps: true, spanGaps: true,
data: data:

View File

@ -48,10 +48,10 @@ export abstract class ModelForm<T, PKT extends string | number> extends Form<T>
} }
render(): TemplateResult { render(): TemplateResult {
if (this._instancePk) { if (this._instancePk && !this._initialLoad) {
if ( if (
// if we're in viewport now and haven't loaded AND have a PK set, load now // if we're in viewport now and haven't loaded AND have a PK set, load now
(this.isInViewport && !this._initialLoad) || this.isInViewport ||
// Or if we don't check for viewport in some cases // Or if we don't check for viewport in some cases
!this.viewportCheck !this.viewportCheck
) { ) {

View File

@ -37,7 +37,7 @@ export class EmailStage extends BaseStage<EmailChallenge, EmailChallengeResponse
}} }}
> >
<div class="pf-c-form__group"> <div class="pf-c-form__group">
<p>${t`Check your Emails for a password reset link.`}</p> <p>${t`Check your Inbox for a verification email.`}</p>
</div> </div>
<div class="pf-c-form__group pf-m-action"> <div class="pf-c-form__group pf-m-action">

View File

@ -1,16 +1,28 @@
import { en } from "make-plural/plurals"; import { en, fr } from "make-plural/plurals";
import { i18n } from "@lingui/core"; import { i18n } from "@lingui/core";
import { detect, fromUrl, fromStorage, fromNavigator } from "@lingui/detect-locale";
import { messages as localeEN } from "../locales/en"; import { messages as localeEN } from "../locales/en";
import { messages as localeFR_FR } from "../locales/fr_FR";
import { messages as localeDEBUG } from "../locales/pseudo-LOCALE"; import { messages as localeDEBUG } from "../locales/pseudo-LOCALE";
i18n.loadLocaleData("en", { plurals: en }); i18n.loadLocaleData("en", { plurals: en });
i18n.loadLocaleData("debug", { plurals: en }); i18n.loadLocaleData("debug", { plurals: en });
i18n.loadLocaleData("fr_FR", { plurals: fr });
i18n.load("en", localeEN); i18n.load("en", localeEN);
i18n.load("fr_FR", localeFR_FR);
i18n.load("debug", localeDEBUG); i18n.load("debug", localeDEBUG);
i18n.activate("en");
if (window.location.search.includes("debugLocale")) { const DEFAULT_FALLBACK = () => "en";
i18n.activate("debug");
const detected =
detect(fromUrl("lang"), fromStorage("lang"), fromNavigator(), DEFAULT_FALLBACK) ||
DEFAULT_FALLBACK();
if (detected in i18n._messages) {
console.debug(`authentik/locale: Activating detected locale '${detected}'`);
i18n.activate(detected);
} else {
console.debug(`authentik/locale: No locale for '${detected}', falling back to en`);
i18n.activate(DEFAULT_FALLBACK());
} }

View File

@ -44,6 +44,10 @@ msgstr "(Format: hours=-1;minutes=-2;seconds=-3)."
msgid "-" msgid "-"
msgstr "-" msgstr "-"
#: src/pages/flows/FlowImportForm.ts
msgid ".akflow files, which can be found on goauthentik.io and can be exported by authentik."
msgstr ".akflow files, which can be found on goauthentik.io and can be exported by authentik."
#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts #: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts
msgid "6 digits, widely compatible" msgid "6 digits, widely compatible"
msgstr "6 digits, widely compatible" msgstr "6 digits, widely compatible"
@ -478,7 +482,6 @@ msgstr "Background image"
#: src/pages/flows/FlowForm.ts #: src/pages/flows/FlowForm.ts
#: src/pages/flows/FlowForm.ts #: src/pages/flows/FlowForm.ts
#: src/pages/flows/FlowImportForm.ts
msgid "Background shown during execution." msgid "Background shown during execution."
msgstr "Background shown during execution." msgstr "Background shown during execution."
@ -706,9 +709,13 @@ msgstr "Check outposts."
msgid "Check status" msgid "Check status"
msgstr "Check status" msgstr "Check status"
#:
#~ msgid "Check your Emails for a password reset link."
#~ msgstr "Check your Emails for a password reset link."
#: src/flows/stages/email/EmailStage.ts #: src/flows/stages/email/EmailStage.ts
msgid "Check your Emails for a password reset link." msgid "Check your Inbox for a verification email."
msgstr "Check your Emails for a password reset link." msgstr "Check your Inbox for a verification email."
#: src/pages/stages/prompt/PromptForm.ts #: src/pages/stages/prompt/PromptForm.ts
msgid "Checkbox" msgid "Checkbox"
@ -978,9 +985,9 @@ msgstr "Cookie domain"
msgid "Copy" msgid "Copy"
msgstr "Copy" msgstr "Copy"
#: src/user/user-settings/tokens/UserTokenList.ts #:
msgid "Copy Key" #~ msgid "Copy Key"
msgstr "Copy Key" #~ msgstr "Copy Key"
#: src/pages/providers/saml/SAMLProviderViewPage.ts #: src/pages/providers/saml/SAMLProviderViewPage.ts
msgid "Copy download URL" msgid "Copy download URL"
@ -4630,6 +4637,10 @@ msgstr "Token count"
msgid "Token expiry" msgid "Token expiry"
msgstr "Token expiry" msgstr "Token expiry"
#: src/pages/tokens/TokenListPage.ts
msgid "Token is managed by authentik."
msgstr "Token is managed by authentik."
#: src/pages/providers/oauth2/OAuth2ProviderForm.ts #: src/pages/providers/oauth2/OAuth2ProviderForm.ts
#: src/pages/providers/proxy/ProxyProviderForm.ts #: src/pages/providers/proxy/ProxyProviderForm.ts
msgid "Token validity" msgid "Token validity"

5898
web/src/locales/fr_FR.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -44,6 +44,10 @@ msgstr ""
msgid "-" msgid "-"
msgstr "" msgstr ""
#: src/pages/flows/FlowImportForm.ts
msgid ".akflow files, which can be found on goauthentik.io and can be exported by authentik."
msgstr ""
#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts #: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts
msgid "6 digits, widely compatible" msgid "6 digits, widely compatible"
msgstr "" msgstr ""
@ -474,7 +478,6 @@ msgstr ""
#: src/pages/flows/FlowForm.ts #: src/pages/flows/FlowForm.ts
#: src/pages/flows/FlowForm.ts #: src/pages/flows/FlowForm.ts
#: src/pages/flows/FlowImportForm.ts
msgid "Background shown during execution." msgid "Background shown during execution."
msgstr "" msgstr ""
@ -702,8 +705,12 @@ msgstr ""
msgid "Check status" msgid "Check status"
msgstr "" msgstr ""
#:
#~ msgid "Check your Emails for a password reset link."
#~ msgstr ""
#: src/flows/stages/email/EmailStage.ts #: src/flows/stages/email/EmailStage.ts
msgid "Check your Emails for a password reset link." msgid "Check your Inbox for a verification email."
msgstr "" msgstr ""
#: src/pages/stages/prompt/PromptForm.ts #: src/pages/stages/prompt/PromptForm.ts
@ -972,9 +979,9 @@ msgstr ""
msgid "Copy" msgid "Copy"
msgstr "" msgstr ""
#: src/user/user-settings/tokens/UserTokenList.ts #:
msgid "Copy Key" #~ msgid "Copy Key"
msgstr "" #~ msgstr ""
#: src/pages/providers/saml/SAMLProviderViewPage.ts #: src/pages/providers/saml/SAMLProviderViewPage.ts
msgid "Copy download URL" msgid "Copy download URL"
@ -4615,6 +4622,10 @@ msgstr ""
msgid "Token expiry" msgid "Token expiry"
msgstr "" msgstr ""
#: src/pages/tokens/TokenListPage.ts
msgid "Token is managed by authentik."
msgstr ""
#: src/pages/providers/oauth2/OAuth2ProviderForm.ts #: src/pages/providers/oauth2/OAuth2ProviderForm.ts
#: src/pages/providers/proxy/ProxyProviderForm.ts #: src/pages/providers/proxy/ProxyProviderForm.ts
msgid "Token validity" msgid "Token validity"

View File

@ -30,7 +30,9 @@ export class FlowImportForm extends Form<Flow> {
return html`<form class="pf-c-form pf-m-horizontal"> return html`<form class="pf-c-form pf-m-horizontal">
<ak-form-element-horizontal label=${t`Flow`} name="flow"> <ak-form-element-horizontal label=${t`Flow`} name="flow">
<input type="file" value="" class="pf-c-form-control" /> <input type="file" value="" class="pf-c-form-control" />
<p class="pf-c-form__helper-text">${t`Background shown during execution.`}</p> <p class="pf-c-form__helper-text">
${t`.akflow files, which can be found on goauthentik.io and can be exported by authentik.`}
</p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</form>`; </form>`;
} }

View File

@ -103,11 +103,13 @@ export class OutpostListPage extends TablePage<Outpost> {
<i class="fas fa-edit"></i> <i class="fas fa-edit"></i>
</button> </button>
</ak-forms-modal> </ak-forms-modal>
<ak-outpost-deployment-modal .outpost=${item} size=${PFSize.Medium}> ${item.managed !== "goauthentik.io/outposts/embedded"
? html`<ak-outpost-deployment-modal .outpost=${item} size=${PFSize.Medium}>
<button slot="trigger" class="pf-c-button pf-m-tertiary"> <button slot="trigger" class="pf-c-button pf-m-tertiary">
${t`View Deployment Info`} ${t`View Deployment Info`}
</button> </button>
</ak-outpost-deployment-modal>`, </ak-outpost-deployment-modal>`
: html``}`,
]; ];
} }

View File

@ -105,7 +105,10 @@ export class TokenListPage extends TablePage<Token> {
row(item: Token): TemplateResult[] { row(item: Token): TemplateResult[] {
return [ return [
html`${item.identifier}`, html`<div>
<div>${item.identifier}</div>
${item.managed ? html`<small>${t`Token is managed by authentik.`}</small>` : html``}
</div>`,
html`<a href="#/identity/users/${item.userObj?.pk}">${item.userObj?.username}</a>`, html`<a href="#/identity/users/${item.userObj?.pk}">${item.userObj?.username}</a>`,
html`${item.expiring ? t`Yes` : t`No`}`, html`${item.expiring ? t`Yes` : t`No`}`,
html`${item.expiring ? item.expires?.toLocaleString() : t`-`}`, html`${item.expiring ? item.expires?.toLocaleString() : t`-`}`,
@ -123,7 +126,10 @@ export class TokenListPage extends TablePage<Token> {
<i class="fas fa-edit"></i> <i class="fas fa-edit"></i>
</button> </button>
</ak-forms-modal> </ak-forms-modal>
<ak-token-copy-button identifier="${item.identifier}"> <ak-token-copy-button
class="pf-c-button pf-m-plain"
identifier="${item.identifier}"
>
<i class="fas fa-copy"></i> <i class="fas fa-copy"></i>
</ak-token-copy-button> </ak-token-copy-button>
`, `,

View File

@ -58,12 +58,11 @@ export class UserForm extends ModelForm<User, number> {
${t`Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.`} ${t`Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.`}
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
<ak-form-element-horizontal label=${t`Name`} ?required=${true} name="name"> <ak-form-element-horizontal label=${t`Name`} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
class="pf-c-form-control" class="pf-c-form-control"
required
/> />
<p class="pf-c-form__helper-text">${t`User's display name.`}</p> <p class="pf-c-form__helper-text">${t`User's display name.`}</p>
</ak-form-element-horizontal> </ak-form-element-horizontal>

View File

@ -55,12 +55,11 @@ export class UserSelfForm extends ModelForm<UserSelf, number> {
${t`Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.`} ${t`Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.`}
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
<ak-form-element-horizontal label=${t`Name`} ?required=${true} name="name"> <ak-form-element-horizontal label=${t`Name`} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
class="pf-c-form-control" class="pf-c-form-control"
required
/> />
<p class="pf-c-form__helper-text">${t`User's display name.`}</p> <p class="pf-c-form__helper-text">${t`User's display name.`}</p>
</ak-form-element-horizontal> </ak-form-element-horizontal>

View File

@ -37,6 +37,7 @@ export class UserTokenList extends Table<Token> {
page: page, page: page,
pageSize: PAGE_SIZE, pageSize: PAGE_SIZE,
search: this.search || "", search: this.search || "",
managed: "",
}); });
} }
@ -151,8 +152,11 @@ export class UserTokenList extends Table<Token> {
<i class="fas fa-edit"></i> <i class="fas fa-edit"></i>
</button> </button>
</ak-forms-modal> </ak-forms-modal>
<ak-token-copy-button identifier="${item.identifier}"> <ak-token-copy-button
${t`Copy Key`} class="pf-c-button pf-m-plain"
identifier="${item.identifier}"
>
<i class="fas fa-copy"></i>
</ak-token-copy-button> </ak-token-copy-button>
`, `,
]; ];

View File

@ -12,9 +12,9 @@ This installation method is for test-setups and small-scale productive setups.
## Preparation ## Preparation
Download the latest `docker-compose.yml` from [here](https://raw.githubusercontent.com/goauthentik/authentik/version/2021.9.5/docker-compose.yml). Place it in a directory of your choice. Download the latest `docker-compose.yml` from [here](https://raw.githubusercontent.com/goauthentik/authentik/version/2021.9.8/docker-compose.yml). Place it in a directory of your choice.
To optionally deploy a different version run `echo AUTHENTIK_TAG=2021.9.5 >> .env` To optionally deploy a different version run `echo AUTHENTIK_TAG=2021.9.8 >> .env`
If this is a fresh authentik install run the following commands to generate a password: If this is a fresh authentik install run the following commands to generate a password:

View File

@ -13,7 +13,7 @@ version: "3.5"
services: services:
authentik_proxy: authentik_proxy:
image: ghcr.io/goauthentik/proxy:2021.9.5 image: ghcr.io/goauthentik/proxy:2021.9.8
# Optionally specify which networks the container should be # Optionally specify which networks the container should be
# might be needed to reach the core authentik server # might be needed to reach the core authentik server
# networks: # networks:
@ -40,7 +40,7 @@ version: "3.5"
services: services:
authentik_ldap: authentik_ldap:
image: ghcr.io/goauthentik/ldap:2021.9.5 image: ghcr.io/goauthentik/ldap:2021.9.8
# Optionally specify which networks the container should be # Optionally specify which networks the container should be
# might be needed to reach the core authentik server # might be needed to reach the core authentik server
# networks: # networks:

View File

@ -14,7 +14,7 @@ metadata:
app.kubernetes.io/instance: __OUTPOST_NAME__ app.kubernetes.io/instance: __OUTPOST_NAME__
app.kubernetes.io/managed-by: goauthentik.io app.kubernetes.io/managed-by: goauthentik.io
app.kubernetes.io/name: authentik-proxy app.kubernetes.io/name: authentik-proxy
app.kubernetes.io/version: 2021.9.5 app.kubernetes.io/version: 2021.9.8
name: authentik-outpost-api name: authentik-outpost-api
stringData: stringData:
authentik_host: "__AUTHENTIK_URL__" authentik_host: "__AUTHENTIK_URL__"
@ -29,7 +29,7 @@ metadata:
app.kubernetes.io/instance: __OUTPOST_NAME__ app.kubernetes.io/instance: __OUTPOST_NAME__
app.kubernetes.io/managed-by: goauthentik.io app.kubernetes.io/managed-by: goauthentik.io
app.kubernetes.io/name: authentik-proxy app.kubernetes.io/name: authentik-proxy
app.kubernetes.io/version: 2021.9.5 app.kubernetes.io/version: 2021.9.8
name: authentik-outpost name: authentik-outpost
spec: spec:
ports: ports:
@ -54,7 +54,7 @@ metadata:
app.kubernetes.io/instance: __OUTPOST_NAME__ app.kubernetes.io/instance: __OUTPOST_NAME__
app.kubernetes.io/managed-by: goauthentik.io app.kubernetes.io/managed-by: goauthentik.io
app.kubernetes.io/name: authentik-proxy app.kubernetes.io/name: authentik-proxy
app.kubernetes.io/version: 2021.9.5 app.kubernetes.io/version: 2021.9.8
name: authentik-outpost name: authentik-outpost
spec: spec:
selector: selector:
@ -62,14 +62,14 @@ spec:
app.kubernetes.io/instance: __OUTPOST_NAME__ app.kubernetes.io/instance: __OUTPOST_NAME__
app.kubernetes.io/managed-by: goauthentik.io app.kubernetes.io/managed-by: goauthentik.io
app.kubernetes.io/name: authentik-proxy app.kubernetes.io/name: authentik-proxy
app.kubernetes.io/version: 2021.9.5 app.kubernetes.io/version: 2021.9.8
template: template:
metadata: metadata:
labels: labels:
app.kubernetes.io/instance: __OUTPOST_NAME__ app.kubernetes.io/instance: __OUTPOST_NAME__
app.kubernetes.io/managed-by: goauthentik.io app.kubernetes.io/managed-by: goauthentik.io
app.kubernetes.io/name: authentik-proxy app.kubernetes.io/name: authentik-proxy
app.kubernetes.io/version: 2021.9.5 app.kubernetes.io/version: 2021.9.8
spec: spec:
containers: containers:
- env: - env:
@ -88,7 +88,7 @@ spec:
secretKeyRef: secretKeyRef:
key: authentik_host_insecure key: authentik_host_insecure
name: authentik-outpost-api name: authentik-outpost-api
image: ghcr.io/goauthentik/proxy:2021.9.5 image: ghcr.io/goauthentik/proxy:2021.9.8
name: proxy name: proxy
ports: ports:
- containerPort: 9000 - containerPort: 9000
@ -110,7 +110,7 @@ metadata:
app.kubernetes.io/instance: __OUTPOST_NAME__ app.kubernetes.io/instance: __OUTPOST_NAME__
app.kubernetes.io/managed-by: goauthentik.io app.kubernetes.io/managed-by: goauthentik.io
app.kubernetes.io/name: authentik-proxy app.kubernetes.io/name: authentik-proxy
app.kubernetes.io/version: 2021.9.5 app.kubernetes.io/version: 2021.9.8
name: authentik-outpost name: authentik-outpost
spec: spec:
rules: rules: