Compare commits
	
		
			30 Commits
		
	
	
		
			version/20
			...
			version-20
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 619203c177 | |||
| 4ae476e58d | |||
| e444d0d640 | |||
| 3869965b4c | |||
| d4e1b95991 | |||
| 2b730dec54 | |||
| 2aacb311bc | |||
| 40055ef01b | |||
| 75608dce5c | |||
| b0f7083879 | |||
| 62bf79ce32 | |||
| 7a16c9cb14 | |||
| d29d161ac6 | |||
| 653631ac77 | |||
| cde303e780 | |||
| aa359a032c | |||
| 6491065aab | |||
| 79eec5a3a0 | |||
| cd5e091937 | |||
| 7ed8952803 | |||
| c1f302fb7c | |||
| cb31e52d0e | |||
| 782764ac73 | |||
| d0c56325ef | |||
| 73d57d6f82 | |||
| 2716a26887 | |||
| 0452537e8b | |||
| d1a1bfbbc5 | |||
| a69fcbca9a | |||
| 1ac4dacc3b | 
| @ -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>.*) | ||||||
|  | |||||||
							
								
								
									
										20
									
								
								.github/workflows/release-publish.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								.github/workflows/release-publish.yml
									
									
									
									
										vendored
									
									
								
							| @ -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' | ||||||
|  | |||||||
| @ -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" ] | ||||||
|  | |||||||
| @ -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" | ||||||
|  | |||||||
| @ -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() | ||||||
|  | |||||||
| @ -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""" | ||||||
|  | |||||||
| @ -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] | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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"] | ||||||
|  |  | ||||||
|  | |||||||
| @ -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: | ||||||
|  | |||||||
| @ -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") | ||||||
|  | |||||||
| @ -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) | ||||||
|  | |||||||
| @ -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) | ||||||
|  |  | ||||||
|  | |||||||
| @ -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) | ||||||
|  |  | ||||||
|  | |||||||
| @ -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() | ||||||
|  | |||||||
| @ -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
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @ -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
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							| @ -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= | ||||||
|  | |||||||
| @ -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" | ||||||
|  | |||||||
| @ -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() | ||||||
|  | |||||||
| @ -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 { | ||||||
|  | |||||||
| @ -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() | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								lifecycle/ak
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								lifecycle/ak
									
									
									
									
									
								
							| @ -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 | ||||||
|  | |||||||
							
								
								
									
										20
									
								
								schema.yml
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								schema.yml
									
									
									
									
									
								
							| @ -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
									
									
									
								
							
							
						
						
									
										307
									
								
								web/package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -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" | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -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", | ||||||
|  | |||||||
| @ -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 = ";"; | ||||||
|  | |||||||
| @ -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: | ||||||
|  | |||||||
| @ -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: | ||||||
|  | |||||||
| @ -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: | ||||||
|  | |||||||
| @ -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 | ||||||
|             ) { |             ) { | ||||||
|  | |||||||
| @ -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"> | ||||||
|  | |||||||
| @ -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()); | ||||||
| } | } | ||||||
|  | |||||||
| @ -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
									
								
							
							
						
						
									
										5898
									
								
								web/src/locales/fr_FR.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -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" | ||||||
|  | |||||||
| @ -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>`; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -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" | ||||||
|                     <button slot="trigger" class="pf-c-button pf-m-tertiary"> |                     ? html`<ak-outpost-deployment-modal .outpost=${item} size=${PFSize.Medium}> | ||||||
|                         ${t`View Deployment Info`} |                           <button slot="trigger" class="pf-c-button pf-m-tertiary"> | ||||||
|                     </button> |                               ${t`View Deployment Info`} | ||||||
|                 </ak-outpost-deployment-modal>`, |                           </button> | ||||||
|  |                       </ak-outpost-deployment-modal>` | ||||||
|  |                     : html``}`, | ||||||
|         ]; |         ]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | |||||||
| @ -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> | ||||||
|             `, |             `, | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|             `, |             `, | ||||||
|         ]; |         ]; | ||||||
|  | |||||||
| @ -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: | ||||||
|  |  | ||||||
|  | |||||||
| @ -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: | ||||||
|  | |||||||
| @ -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: | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	