Compare commits
	
		
			44 Commits
		
	
	
		
			version/20
			...
			version/20
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c55f503b9b | |||
| a908cad976 | |||
| c2586557d8 | |||
| 01c80a82e2 | |||
| 0d47654651 | |||
| 1183095833 | |||
| c281b11bdc | |||
| 61fe45a58c | |||
| d43aab479c | |||
| 7f8383427a | |||
| a06d6cf33d | |||
| 5b7cb205c9 | |||
| 293a932d20 | |||
| fff901ff03 | |||
| f47c936295 | |||
| 88d5aec618 | |||
| 96ae68cf09 | |||
| 63b3434b6f | |||
| 947ecec02b | |||
| 1c2b452406 | |||
| 47777529ac | |||
| 949095c376 | |||
| 4b112c2799 | |||
| 291a2516b1 | |||
| 4dcfd021e2 | |||
| ca50848db3 | |||
| 0bb3e3c558 | |||
| e4b25809ab | |||
| 7bf932f8e2 | |||
| 99d04528b0 | |||
| e48d172036 | |||
| c2388137a8 | |||
| 650e2cbc38 | |||
| b32800ea71 | |||
| e1c0c0b20c | |||
| fe39e39dcd | |||
| 883f213b03 | |||
| 538996f617 | |||
| 2f4c92deb9 | |||
| ef335ec083 | |||
| 07b09df3fe | |||
| e70e031a1f | |||
| c7ba183dc0 | |||
| 3ed23a37ea | 
| @ -1,5 +1,5 @@ | ||||
| [bumpversion] | ||||
| current_version = 2022.1.2 | ||||
| current_version = 2022.1.3 | ||||
| tag = True | ||||
| commit = True | ||||
| parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)\-?(?P<release>.*) | ||||
|  | ||||
							
								
								
									
										16
									
								
								.github/workflows/ci-outpost.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.github/workflows/ci-outpost.yml
									
									
									
									
										vendored
									
									
								
							| @ -30,9 +30,25 @@ jobs: | ||||
|             -w /app \ | ||||
|             golangci/golangci-lint:v1.43 \ | ||||
|             golangci-lint run -v --timeout 200s | ||||
|   test-unittest: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - uses: actions/setup-go@v2 | ||||
|         with: | ||||
|           go-version: "^1.17" | ||||
|       - name: Get dependencies | ||||
|         run: | | ||||
|           go get github.com/axw/gocov/gocov | ||||
|           go get github.com/AlekSi/gocov-xml | ||||
|           go get github.com/jstemmer/go-junit-report | ||||
|       - name: Go unittests | ||||
|         run: | | ||||
|           go test -timeout 0 -v -race -coverprofile=coverage.out -covermode=atomic -cover ./... | go-junit-report > junit.xml | ||||
|   ci-outpost-mark: | ||||
|     needs: | ||||
|       - lint-golint | ||||
|       - test-unittest | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - run: echo mark | ||||
|  | ||||
							
								
								
									
										14
									
								
								.github/workflows/release-publish.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								.github/workflows/release-publish.yml
									
									
									
									
										vendored
									
									
								
							| @ -30,14 +30,14 @@ jobs: | ||||
|         with: | ||||
|           push: ${{ github.event_name == 'release' }} | ||||
|           tags: | | ||||
|             beryju/authentik:2022.1.2, | ||||
|             beryju/authentik:2022.1.3, | ||||
|             beryju/authentik:latest, | ||||
|             ghcr.io/goauthentik/server:2022.1.2, | ||||
|             ghcr.io/goauthentik/server:2022.1.3, | ||||
|             ghcr.io/goauthentik/server:latest | ||||
|           platforms: linux/amd64,linux/arm64 | ||||
|           context: . | ||||
|       - name: Building Docker Image (stable) | ||||
|         if: ${{ github.event_name == 'release' && !contains('2022.1.2', 'rc') }} | ||||
|         if: ${{ github.event_name == 'release' && !contains('2022.1.3', 'rc') }} | ||||
|         run: | | ||||
|           docker pull beryju/authentik:latest | ||||
|           docker tag beryju/authentik:latest beryju/authentik:stable | ||||
| @ -78,14 +78,14 @@ jobs: | ||||
|         with: | ||||
|           push: ${{ github.event_name == 'release' }} | ||||
|           tags: | | ||||
|             beryju/authentik-${{ matrix.type }}:2022.1.2, | ||||
|             beryju/authentik-${{ matrix.type }}:2022.1.3, | ||||
|             beryju/authentik-${{ matrix.type }}:latest, | ||||
|             ghcr.io/goauthentik/${{ matrix.type }}:2022.1.2, | ||||
|             ghcr.io/goauthentik/${{ matrix.type }}:2022.1.3, | ||||
|             ghcr.io/goauthentik/${{ matrix.type }}:latest | ||||
|           file: ${{ matrix.type }}.Dockerfile | ||||
|           platforms: linux/amd64,linux/arm64 | ||||
|       - name: Building Docker Image (stable) | ||||
|         if: ${{ github.event_name == 'release' && !contains('2022.1.2', 'rc') }} | ||||
|         if: ${{ github.event_name == 'release' && !contains('2022.1.3', 'rc') }} | ||||
|         run: | | ||||
|           docker pull beryju/authentik-${{ matrix.type }}:latest | ||||
|           docker tag beryju/authentik-${{ matrix.type }}:latest beryju/authentik-${{ matrix.type }}:stable | ||||
| @ -170,7 +170,7 @@ jobs: | ||||
|           SENTRY_PROJECT: authentik | ||||
|           SENTRY_URL: https://sentry.beryju.org | ||||
|         with: | ||||
|           version: authentik@2022.1.2 | ||||
|           version: authentik@2022.1.3 | ||||
|           environment: beryjuorg-prod | ||||
|           sourcemaps: './web/dist' | ||||
|           url_prefix: '~/static/dist' | ||||
|  | ||||
							
								
								
									
										3
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								Makefile
									
									
									
									
									
								
							| @ -15,6 +15,9 @@ test-e2e-provider: | ||||
| test-e2e-rest: | ||||
| 	coverage run manage.py test tests/e2e/test_flows* tests/e2e/test_source* | ||||
|  | ||||
| test-go: | ||||
| 	go test -timeout 0 -v -race -cover ./... | ||||
|  | ||||
| test: | ||||
| 	coverage run manage.py test authentik | ||||
| 	coverage html | ||||
|  | ||||
| @ -57,4 +57,4 @@ DigitalOcean provides development and testing resources for authentik. | ||||
|     </a> | ||||
| </p> | ||||
|  | ||||
| Netlify hosts the [goauthentik.io](goauthentik.io) site. | ||||
| Netlify hosts the [goauthentik.io](https://goauthentik.io) site. | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| from os import environ | ||||
| from typing import Optional | ||||
|  | ||||
| __version__ = "2022.1.2" | ||||
| __version__ = "2022.1.3" | ||||
| ENV_GIT_HASH_KEY = "GIT_BUILD_HASH" | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -28,7 +28,7 @@ class ProxyDockerController(DockerController): | ||||
|         labels["traefik.enable"] = "true" | ||||
|         labels[ | ||||
|             f"traefik.http.routers.{traefik_name}-router.rule" | ||||
|         ] = f"Host({','.join(hosts)}) && PathPrefix('/akprox')" | ||||
|         ] = f"Host({','.join(hosts)}) && PathPrefix(`/akprox`)" | ||||
|         labels[f"traefik.http.routers.{traefik_name}-router.tls"] = "true" | ||||
|         labels[f"traefik.http.routers.{traefik_name}-router.service"] = f"{traefik_name}-service" | ||||
|         labels[ | ||||
|  | ||||
| @ -18,7 +18,7 @@ from hashlib import sha512 | ||||
| from json import dumps | ||||
| from tempfile import gettempdir | ||||
| from time import time | ||||
| from urllib.parse import quote | ||||
| from urllib.parse import quote_plus | ||||
|  | ||||
| import structlog | ||||
| from celery.schedules import crontab | ||||
| @ -220,7 +220,7 @@ if CONFIG.y_bool("redis.tls", False): | ||||
|     REDIS_CELERY_TLS_REQUIREMENTS = f"?ssl_cert_reqs={CONFIG.y('redis.tls_reqs')}" | ||||
| _redis_url = ( | ||||
|     f"{REDIS_PROTOCOL_PREFIX}:" | ||||
|     f"{quote(CONFIG.y('redis.password'))}@{quote(CONFIG.y('redis.host'))}:" | ||||
|     f"{quote_plus(CONFIG.y('redis.password'))}@{quote_plus(CONFIG.y('redis.host'))}:" | ||||
|     f"{int(CONFIG.y('redis.port'))}" | ||||
| ) | ||||
|  | ||||
| @ -347,6 +347,7 @@ LOCALE_PATHS = ["./locale"] | ||||
| # Celery settings | ||||
| # Add a 10 minute timeout to all Celery tasks. | ||||
| CELERY_TASK_SOFT_TIME_LIMIT = 600 | ||||
| CELERY_WORKER_MAX_TASKS_PER_CHILD = 50 | ||||
| CELERY_BEAT_SCHEDULE = { | ||||
|     "clean_expired_models": { | ||||
|         "task": "authentik.core.tasks.clean_expired_models", | ||||
|  | ||||
| @ -8,6 +8,7 @@ import ( | ||||
| 	log "github.com/sirupsen/logrus" | ||||
|  | ||||
| 	"goauthentik.io/internal/common" | ||||
| 	"goauthentik.io/internal/debug" | ||||
| 	"goauthentik.io/internal/outpost/ak" | ||||
| 	"goauthentik.io/internal/outpost/ldap" | ||||
| ) | ||||
| @ -27,6 +28,7 @@ func main() { | ||||
| 			log.FieldKeyTime: "timestamp", | ||||
| 		}, | ||||
| 	}) | ||||
| 	go debug.EnableDebugServer() | ||||
| 	akURL, found := os.LookupEnv("AUTHENTIK_HOST") | ||||
| 	if !found { | ||||
| 		fmt.Println("env AUTHENTIK_HOST not set!") | ||||
|  | ||||
| @ -9,6 +9,7 @@ import ( | ||||
| 	log "github.com/sirupsen/logrus" | ||||
|  | ||||
| 	"goauthentik.io/internal/common" | ||||
| 	"goauthentik.io/internal/debug" | ||||
| 	"goauthentik.io/internal/outpost/ak" | ||||
| 	"goauthentik.io/internal/outpost/proxyv2" | ||||
| ) | ||||
| @ -32,6 +33,7 @@ func main() { | ||||
| 			log.FieldKeyTime: "timestamp", | ||||
| 		}, | ||||
| 	}) | ||||
| 	go debug.EnableDebugServer() | ||||
| 	akURL, found := os.LookupEnv("AUTHENTIK_HOST") | ||||
| 	if !found { | ||||
| 		fmt.Println("env AUTHENTIK_HOST not set!") | ||||
|  | ||||
| @ -11,6 +11,7 @@ import ( | ||||
| 	"goauthentik.io/internal/common" | ||||
| 	"goauthentik.io/internal/config" | ||||
| 	"goauthentik.io/internal/constants" | ||||
| 	"goauthentik.io/internal/debug" | ||||
| 	"goauthentik.io/internal/gounicorn" | ||||
| 	"goauthentik.io/internal/outpost/ak" | ||||
| 	"goauthentik.io/internal/outpost/proxyv2" | ||||
| @ -28,6 +29,7 @@ func main() { | ||||
| 			log.FieldKeyTime: "timestamp", | ||||
| 		}, | ||||
| 	}) | ||||
| 	go debug.EnableDebugServer() | ||||
| 	l := log.WithField("logger", "authentik.root") | ||||
| 	config.DefaultConfig() | ||||
| 	err := config.LoadConfig("./authentik/lib/default.yml") | ||||
|  | ||||
| @ -17,7 +17,7 @@ services: | ||||
|     image: redis:alpine | ||||
|     restart: unless-stopped | ||||
|   server: | ||||
|     image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2022.1.2} | ||||
|     image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2022.1.3} | ||||
|     restart: unless-stopped | ||||
|     command: server | ||||
|     environment: | ||||
| @ -38,7 +38,7 @@ services: | ||||
|       - "0.0.0.0:${AUTHENTIK_PORT_HTTP:-9000}:9000" | ||||
|       - "0.0.0.0:${AUTHENTIK_PORT_HTTPS:-9443}:9443" | ||||
|   worker: | ||||
|     image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2022.1.2} | ||||
|     image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2022.1.3} | ||||
|     restart: unless-stopped | ||||
|     command: worker | ||||
|     environment: | ||||
|  | ||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @ -26,7 +26,9 @@ require ( | ||||
| 	github.com/pkg/errors v0.9.1 | ||||
| 	github.com/pquerna/cachecontrol v0.0.0-20201205024021-ac21108117ac // indirect | ||||
| 	github.com/prometheus/client_golang v1.12.0 | ||||
| 	github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b // indirect | ||||
| 	github.com/sirupsen/logrus v1.8.1 | ||||
| 	github.com/stretchr/testify v1.7.0 // indirect | ||||
| 	goauthentik.io/api v0.2021125.1 | ||||
| 	golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c | ||||
| 	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c | ||||
|  | ||||
							
								
								
									
										3
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								go.sum
									
									
									
									
									
								
							| @ -489,6 +489,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O | ||||
| github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= | ||||
| github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= | ||||
| github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= | ||||
| github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b h1:aUNXCGgukb4gtY99imuIeoh8Vr0GSwAlYxPAhqZrpFc= | ||||
| github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg= | ||||
| github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
| github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
| github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
| @ -515,6 +517,7 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn | ||||
| github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= | ||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= | ||||
| github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= | ||||
| github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||
|  | ||||
| @ -25,4 +25,4 @@ func OutpostUserAgent() string { | ||||
| 	return fmt.Sprintf("authentik-outpost@%s", FullVersion()) | ||||
| } | ||||
|  | ||||
| const VERSION = "2022.1.2" | ||||
| const VERSION = "2022.1.3" | ||||
|  | ||||
							
								
								
									
										24
									
								
								internal/debug/debug.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								internal/debug/debug.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| package debug | ||||
|  | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"net/http/pprof" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	log "github.com/sirupsen/logrus" | ||||
| ) | ||||
|  | ||||
| func EnableDebugServer() { | ||||
| 	l := log.WithField("logger", "authentik.go_debugger") | ||||
| 	if deb := os.Getenv("AUTHENTIK_DEBUG"); strings.ToLower(deb) != "true" { | ||||
| 		l.Info("not enabling debug server, set `AUTHENTIK_DEBUG` to `true` to enable it.") | ||||
| 	} | ||||
| 	h := http.NewServeMux() | ||||
| 	h.HandleFunc("/debug/pprof/", pprof.Index) | ||||
| 	h.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) | ||||
| 	h.HandleFunc("/debug/pprof/profile", pprof.Profile) | ||||
| 	h.HandleFunc("/debug/pprof/symbol", pprof.Symbol) | ||||
| 	h.HandleFunc("/debug/pprof/trace", pprof.Trace) | ||||
| 	l.Println(http.ListenAndServe("0.0.0.0:9900", nil)) | ||||
| } | ||||
							
								
								
									
										66
									
								
								internal/outpost/ak/test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								internal/outpost/ak/test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,66 @@ | ||||
| package ak | ||||
|  | ||||
| import ( | ||||
| 	"encoding/base64" | ||||
| 	"fmt" | ||||
| 	"math/rand" | ||||
| 	"net/http" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/google/uuid" | ||||
| 	"github.com/gorilla/securecookie" | ||||
| 	log "github.com/sirupsen/logrus" | ||||
| 	"goauthentik.io/api" | ||||
| ) | ||||
|  | ||||
| func TestSecret() string { | ||||
| 	return base64.RawURLEncoding.EncodeToString(securecookie.GenerateRandomKey(32)) | ||||
| } | ||||
|  | ||||
| func MockConfig() api.Config { | ||||
| 	return *api.NewConfig( | ||||
| 		*api.NewErrorReportingConfig(false, "test", false, 0.0), | ||||
| 		[]api.CapabilitiesEnum{}, | ||||
| 		100, | ||||
| 		100, | ||||
| 		100, | ||||
| 		100, | ||||
| 	) | ||||
| } | ||||
|  | ||||
| func MockAK(outpost api.Outpost, globalConfig api.Config) *APIController { | ||||
| 	config := api.NewConfiguration() | ||||
| 	config.HTTPClient = &http.Client{ | ||||
| 		Transport: GetTLSTransport(), | ||||
| 	} | ||||
| 	token := TestSecret() | ||||
| 	config.AddDefaultHeader("Authorization", fmt.Sprintf("Bearer %s", token)) | ||||
|  | ||||
| 	// create the API client, with the transport | ||||
| 	apiClient := api.NewAPIClient(config) | ||||
|  | ||||
| 	log := log.WithField("logger", "authentik.outpost.ak-api-controller") | ||||
|  | ||||
| 	log.WithField("name", outpost.Name).Debug("Fetched outpost configuration") | ||||
|  | ||||
| 	log.Debug("Fetched global configuration") | ||||
|  | ||||
| 	// doGlobalSetup is called by the OnRefresh handler, which ticks on start | ||||
| 	// doGlobalSetup(outpost, akConfig) | ||||
|  | ||||
| 	ac := &APIController{ | ||||
| 		Client:       apiClient, | ||||
| 		GlobalConfig: globalConfig, | ||||
|  | ||||
| 		token:  token, | ||||
| 		logger: log, | ||||
|  | ||||
| 		reloadOffset:        time.Duration(rand.Intn(10)) * time.Second, | ||||
| 		instanceUUID:        uuid.New(), | ||||
| 		Outpost:             outpost, | ||||
| 		wsBackoffMultiplier: 1, | ||||
| 		refreshHandlers:     make([]func(), 0), | ||||
| 	} | ||||
| 	ac.logger.WithField("offset", ac.reloadOffset.String()).Debug("HA Reload offset") | ||||
| 	return ac | ||||
| } | ||||
| @ -16,6 +16,7 @@ import ( | ||||
| 	"goauthentik.io/internal/outpost/ldap/flags" | ||||
| 	"goauthentik.io/internal/outpost/ldap/metrics" | ||||
| 	"goauthentik.io/internal/outpost/ldap/server" | ||||
| 	"goauthentik.io/internal/outpost/ldap/utils" | ||||
| ) | ||||
|  | ||||
| const ContextUserKey = "ak_user" | ||||
| @ -35,7 +36,7 @@ func NewDirectBinder(si server.LDAPServerInstance) *DirectBinder { | ||||
| } | ||||
|  | ||||
| func (db *DirectBinder) GetUsername(dn string) (string, error) { | ||||
| 	if !strings.HasSuffix(strings.ToLower(dn), strings.ToLower(db.si.GetBaseDN())) { | ||||
| 	if !utils.HasSuffixNoCase(dn, db.si.GetBaseDN()) { | ||||
| 		return "", errors.New("invalid base DN") | ||||
| 	} | ||||
| 	dns, err := goldap.ParseDN(dn) | ||||
|  | ||||
| @ -140,26 +140,26 @@ func (pi *ProviderInstance) GetNeededObjects(scope int, baseDN string, filterOC | ||||
| 	// If our requested base DN doesn't match any of the container DNs, then | ||||
| 	// we're probably loading a user or group. If it does, then make sure our | ||||
| 	// scope will eventually take us to users or groups. | ||||
| 	if (baseDN == pi.BaseDN || strings.HasSuffix(baseDN, pi.UserDN)) && utils.IncludeObjectClass(filterOC, ldapConstants.GetUserOCs()) { | ||||
| 	if (strings.EqualFold(baseDN, pi.BaseDN) || utils.HasSuffixNoCase(baseDN, pi.UserDN)) && utils.IncludeObjectClass(filterOC, ldapConstants.GetUserOCs()) { | ||||
| 		if baseDN != pi.UserDN && baseDN != pi.BaseDN || | ||||
| 			baseDN == pi.BaseDN && scope > 1 || | ||||
| 			baseDN == pi.UserDN && scope > 0 { | ||||
| 			strings.EqualFold(baseDN, pi.BaseDN) && scope > 1 || | ||||
| 			strings.EqualFold(baseDN, pi.UserDN) && scope > 0 { | ||||
| 			needUsers = true | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (baseDN == pi.BaseDN || strings.HasSuffix(baseDN, pi.GroupDN)) && utils.IncludeObjectClass(filterOC, ldapConstants.GetGroupOCs()) { | ||||
| 	if (strings.EqualFold(baseDN, pi.BaseDN) || utils.HasSuffixNoCase(baseDN, pi.GroupDN)) && utils.IncludeObjectClass(filterOC, ldapConstants.GetGroupOCs()) { | ||||
| 		if baseDN != pi.GroupDN && baseDN != pi.BaseDN || | ||||
| 			baseDN == pi.BaseDN && scope > 1 || | ||||
| 			baseDN == pi.GroupDN && scope > 0 { | ||||
| 			strings.EqualFold(baseDN, pi.BaseDN) && scope > 1 || | ||||
| 			strings.EqualFold(baseDN, pi.GroupDN) && scope > 0 { | ||||
| 			needGroups = true | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (baseDN == pi.BaseDN || strings.HasSuffix(baseDN, pi.VirtualGroupDN)) && utils.IncludeObjectClass(filterOC, ldapConstants.GetVirtualGroupOCs()) { | ||||
| 	if (strings.EqualFold(baseDN, pi.BaseDN) || utils.HasSuffixNoCase(baseDN, pi.VirtualGroupDN)) && utils.IncludeObjectClass(filterOC, ldapConstants.GetVirtualGroupOCs()) { | ||||
| 		if baseDN != pi.VirtualGroupDN && baseDN != pi.BaseDN || | ||||
| 			baseDN == pi.BaseDN && scope > 1 || | ||||
| 			baseDN == pi.VirtualGroupDN && scope > 0 { | ||||
| 			strings.EqualFold(baseDN, pi.BaseDN) && scope > 1 || | ||||
| 			strings.EqualFold(baseDN, pi.VirtualGroupDN) && scope > 0 { | ||||
| 			needUsers = true | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -36,7 +36,7 @@ func NewDirectSearcher(si server.LDAPServerInstance) *DirectSearcher { | ||||
|  | ||||
| func (ds *DirectSearcher) Search(req *search.Request) (ldap.ServerSearchResult, error) { | ||||
| 	accsp := sentry.StartSpan(req.Context(), "authentik.providers.ldap.search.check_access") | ||||
| 	baseDN := strings.ToLower(ds.si.GetBaseDN()) | ||||
| 	baseDN := ds.si.GetBaseDN() | ||||
|  | ||||
| 	filterOC, err := ldap.GetFilterObjectClass(req.Filter) | ||||
| 	if err != nil { | ||||
| @ -59,7 +59,7 @@ func (ds *DirectSearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 		}).Inc() | ||||
| 		return ldap.ServerSearchResult{ResultCode: ldap.LDAPResultInsufficientAccessRights}, fmt.Errorf("Search Error: Anonymous BindDN not allowed %s", req.BindDN) | ||||
| 	} | ||||
| 	if !strings.HasSuffix(req.BindDN, ","+baseDN) { | ||||
| 	if !utils.HasSuffixNoCase(req.BindDN, ","+baseDN) { | ||||
| 		metrics.RequestsRejected.With(prometheus.Labels{ | ||||
| 			"outpost_name": ds.si.GetOutpostName(), | ||||
| 			"type":         "search", | ||||
| @ -105,7 +105,7 @@ func (ds *DirectSearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 	scope := req.SearchRequest.Scope | ||||
| 	needUsers, needGroups := ds.si.GetNeededObjects(scope, req.BaseDN, filterOC) | ||||
|  | ||||
| 	if scope >= 0 && req.BaseDN == baseDN { | ||||
| 	if scope >= 0 && strings.EqualFold(req.BaseDN, baseDN) { | ||||
| 		if utils.IncludeObjectClass(filterOC, constants.GetDomainOCs()) { | ||||
| 			entries = append(entries, ds.si.GetBaseEntry()) | ||||
| 		} | ||||
| @ -209,8 +209,8 @@ func (ds *DirectSearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 		return ldap.ServerSearchResult{ResultCode: ldap.LDAPResultOperationsError}, err | ||||
| 	} | ||||
|  | ||||
| 	if scope >= 0 && (req.BaseDN == ds.si.GetBaseDN() || strings.HasSuffix(req.BaseDN, ds.si.GetBaseUserDN())) { | ||||
| 		singleu := strings.HasSuffix(req.BaseDN, ","+ds.si.GetBaseUserDN()) | ||||
| 	if scope >= 0 && (strings.EqualFold(req.BaseDN, ds.si.GetBaseDN()) || utils.HasSuffixNoCase(req.BaseDN, ds.si.GetBaseUserDN())) { | ||||
| 		singleu := utils.HasSuffixNoCase(req.BaseDN, ","+ds.si.GetBaseUserDN()) | ||||
|  | ||||
| 		if !singleu && utils.IncludeObjectClass(filterOC, constants.GetContainerOCs()) { | ||||
| 			entries = append(entries, utils.GetContainerEntry(filterOC, ds.si.GetBaseUserDN(), constants.OUUsers)) | ||||
| @ -220,7 +220,7 @@ func (ds *DirectSearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 		if scope >= 0 && users != nil && utils.IncludeObjectClass(filterOC, constants.GetUserOCs()) { | ||||
| 			for _, u := range *users { | ||||
| 				entry := ds.si.UserEntry(u) | ||||
| 				if req.BaseDN == entry.DN || !singleu { | ||||
| 				if strings.EqualFold(req.BaseDN, entry.DN) || !singleu { | ||||
| 					entries = append(entries, entry) | ||||
| 				} | ||||
| 			} | ||||
| @ -229,8 +229,8 @@ func (ds *DirectSearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 		scope += 1 // Return the scope to what it was before we descended | ||||
| 	} | ||||
|  | ||||
| 	if scope >= 0 && (req.BaseDN == ds.si.GetBaseDN() || strings.HasSuffix(req.BaseDN, ds.si.GetBaseGroupDN())) { | ||||
| 		singleg := strings.HasSuffix(req.BaseDN, ","+ds.si.GetBaseGroupDN()) | ||||
| 	if scope >= 0 && (strings.EqualFold(req.BaseDN, ds.si.GetBaseDN()) || utils.HasSuffixNoCase(req.BaseDN, ds.si.GetBaseGroupDN())) { | ||||
| 		singleg := utils.HasSuffixNoCase(req.BaseDN, ","+ds.si.GetBaseGroupDN()) | ||||
|  | ||||
| 		if !singleg && utils.IncludeObjectClass(filterOC, constants.GetContainerOCs()) { | ||||
| 			entries = append(entries, utils.GetContainerEntry(filterOC, ds.si.GetBaseGroupDN(), constants.OUGroups)) | ||||
| @ -240,7 +240,7 @@ func (ds *DirectSearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 		if scope >= 0 && groups != nil && utils.IncludeObjectClass(filterOC, constants.GetGroupOCs()) { | ||||
| 			for _, g := range *groups { | ||||
| 				entry := group.FromAPIGroup(g, ds.si).Entry() | ||||
| 				if req.BaseDN == entry.DN || !singleg { | ||||
| 				if strings.EqualFold(req.BaseDN, entry.DN) || !singleg { | ||||
| 					entries = append(entries, entry) | ||||
| 				} | ||||
| 			} | ||||
| @ -249,8 +249,8 @@ func (ds *DirectSearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 		scope += 1 // Return the scope to what it was before we descended | ||||
| 	} | ||||
|  | ||||
| 	if scope >= 0 && (req.BaseDN == ds.si.GetBaseDN() || strings.HasSuffix(req.BaseDN, ds.si.GetBaseVirtualGroupDN())) { | ||||
| 		singlevg := strings.HasSuffix(req.BaseDN, ","+ds.si.GetBaseVirtualGroupDN()) | ||||
| 	if scope >= 0 && (strings.EqualFold(req.BaseDN, ds.si.GetBaseDN()) || utils.HasSuffixNoCase(req.BaseDN, ds.si.GetBaseVirtualGroupDN())) { | ||||
| 		singlevg := utils.HasSuffixNoCase(req.BaseDN, ","+ds.si.GetBaseVirtualGroupDN()) | ||||
|  | ||||
| 		if !singlevg || utils.IncludeObjectClass(filterOC, constants.GetContainerOCs()) { | ||||
| 			entries = append(entries, utils.GetContainerEntry(filterOC, ds.si.GetBaseVirtualGroupDN(), constants.OUVirtualGroups)) | ||||
| @ -260,7 +260,7 @@ func (ds *DirectSearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 		if scope >= 0 && users != nil && utils.IncludeObjectClass(filterOC, constants.GetVirtualGroupOCs()) { | ||||
| 			for _, u := range *users { | ||||
| 				entry := group.FromAPIUser(u, ds.si).Entry() | ||||
| 				if req.BaseDN == entry.DN || !singlevg { | ||||
| 				if strings.EqualFold(req.BaseDN, entry.DN) || !singlevg { | ||||
| 					entries = append(entries, entry) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| @ -39,7 +39,7 @@ func NewMemorySearcher(si server.LDAPServerInstance) *MemorySearcher { | ||||
|  | ||||
| func (ms *MemorySearcher) Search(req *search.Request) (ldap.ServerSearchResult, error) { | ||||
| 	accsp := sentry.StartSpan(req.Context(), "authentik.providers.ldap.search.check_access") | ||||
| 	baseDN := strings.ToLower(ms.si.GetBaseDN()) | ||||
| 	baseDN := ms.si.GetBaseDN() | ||||
|  | ||||
| 	filterOC, err := ldap.GetFilterObjectClass(req.Filter) | ||||
| 	if err != nil { | ||||
| @ -62,7 +62,7 @@ func (ms *MemorySearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 		}).Inc() | ||||
| 		return ldap.ServerSearchResult{ResultCode: ldap.LDAPResultInsufficientAccessRights}, fmt.Errorf("Search Error: Anonymous BindDN not allowed %s", req.BindDN) | ||||
| 	} | ||||
| 	if !strings.HasSuffix(req.BindDN, ","+baseDN) { | ||||
| 	if !utils.HasSuffixNoCase(req.BindDN, ","+baseDN) { | ||||
| 		metrics.RequestsRejected.With(prometheus.Labels{ | ||||
| 			"outpost_name": ms.si.GetOutpostName(), | ||||
| 			"type":         "search", | ||||
| @ -92,7 +92,7 @@ func (ms *MemorySearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 	scope := req.SearchRequest.Scope | ||||
| 	needUsers, needGroups := ms.si.GetNeededObjects(scope, req.BaseDN, filterOC) | ||||
|  | ||||
| 	if scope >= 0 && req.BaseDN == baseDN { | ||||
| 	if scope >= 0 && strings.EqualFold(req.BaseDN, baseDN) { | ||||
| 		if utils.IncludeObjectClass(filterOC, constants.GetDomainOCs()) { | ||||
| 			entries = append(entries, ms.si.GetBaseEntry()) | ||||
| 		} | ||||
| @ -155,8 +155,8 @@ func (ms *MemorySearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 		return ldap.ServerSearchResult{ResultCode: ldap.LDAPResultOperationsError}, err | ||||
| 	} | ||||
|  | ||||
| 	if scope >= 0 && (req.BaseDN == ms.si.GetBaseDN() || strings.HasSuffix(req.BaseDN, ms.si.GetBaseUserDN())) { | ||||
| 		singleu := strings.HasSuffix(req.BaseDN, ","+ms.si.GetBaseUserDN()) | ||||
| 	if scope >= 0 && (strings.EqualFold(req.BaseDN, ms.si.GetBaseDN()) || utils.HasSuffixNoCase(req.BaseDN, ms.si.GetBaseUserDN())) { | ||||
| 		singleu := utils.HasSuffixNoCase(req.BaseDN, ","+ms.si.GetBaseUserDN()) | ||||
|  | ||||
| 		if !singleu && utils.IncludeObjectClass(filterOC, constants.GetContainerOCs()) { | ||||
| 			entries = append(entries, utils.GetContainerEntry(filterOC, ms.si.GetBaseUserDN(), constants.OUUsers)) | ||||
| @ -166,7 +166,7 @@ func (ms *MemorySearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 		if scope >= 0 && users != nil && utils.IncludeObjectClass(filterOC, constants.GetUserOCs()) { | ||||
| 			for _, u := range *users { | ||||
| 				entry := ms.si.UserEntry(u) | ||||
| 				if req.BaseDN == entry.DN || !singleu { | ||||
| 				if strings.EqualFold(req.BaseDN, entry.DN) || !singleu { | ||||
| 					entries = append(entries, entry) | ||||
| 				} | ||||
| 			} | ||||
| @ -175,8 +175,8 @@ func (ms *MemorySearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 		scope += 1 // Return the scope to what it was before we descended | ||||
| 	} | ||||
|  | ||||
| 	if scope >= 0 && (req.BaseDN == ms.si.GetBaseDN() || strings.HasSuffix(req.BaseDN, ms.si.GetBaseGroupDN())) { | ||||
| 		singleg := strings.HasSuffix(req.BaseDN, ","+ms.si.GetBaseGroupDN()) | ||||
| 	if scope >= 0 && (strings.EqualFold(req.BaseDN, ms.si.GetBaseDN()) || utils.HasSuffixNoCase(req.BaseDN, ms.si.GetBaseGroupDN())) { | ||||
| 		singleg := utils.HasSuffixNoCase(req.BaseDN, ","+ms.si.GetBaseGroupDN()) | ||||
|  | ||||
| 		if !singleg && utils.IncludeObjectClass(filterOC, constants.GetContainerOCs()) { | ||||
| 			entries = append(entries, utils.GetContainerEntry(filterOC, ms.si.GetBaseGroupDN(), constants.OUGroups)) | ||||
| @ -185,7 +185,7 @@ func (ms *MemorySearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
|  | ||||
| 		if scope >= 0 && groups != nil && utils.IncludeObjectClass(filterOC, constants.GetGroupOCs()) { | ||||
| 			for _, g := range groups { | ||||
| 				if req.BaseDN == g.DN || !singleg { | ||||
| 				if strings.EqualFold(req.BaseDN, g.DN) || !singleg { | ||||
| 					entries = append(entries, g.Entry()) | ||||
| 				} | ||||
| 			} | ||||
| @ -194,8 +194,8 @@ func (ms *MemorySearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 		scope += 1 // Return the scope to what it was before we descended | ||||
| 	} | ||||
|  | ||||
| 	if scope >= 0 && (req.BaseDN == ms.si.GetBaseDN() || strings.HasSuffix(req.BaseDN, ms.si.GetBaseVirtualGroupDN())) { | ||||
| 		singlevg := strings.HasSuffix(req.BaseDN, ","+ms.si.GetBaseVirtualGroupDN()) | ||||
| 	if scope >= 0 && (strings.EqualFold(req.BaseDN, ms.si.GetBaseDN()) || utils.HasSuffixNoCase(req.BaseDN, ms.si.GetBaseVirtualGroupDN())) { | ||||
| 		singlevg := utils.HasSuffixNoCase(req.BaseDN, ","+ms.si.GetBaseVirtualGroupDN()) | ||||
|  | ||||
| 		if !singlevg && utils.IncludeObjectClass(filterOC, constants.GetContainerOCs()) { | ||||
| 			entries = append(entries, utils.GetContainerEntry(filterOC, ms.si.GetBaseVirtualGroupDN(), constants.OUVirtualGroups)) | ||||
| @ -205,7 +205,7 @@ func (ms *MemorySearcher) Search(req *search.Request) (ldap.ServerSearchResult, | ||||
| 		if scope >= 0 && users != nil && utils.IncludeObjectClass(filterOC, constants.GetVirtualGroupOCs()) { | ||||
| 			for _, u := range *users { | ||||
| 				entry := group.FromAPIUser(u, ms.si).Entry() | ||||
| 				if req.BaseDN == entry.DN || !singlevg { | ||||
| 				if strings.EqualFold(req.BaseDN, entry.DN) || !singlevg { | ||||
| 					entries = append(entries, entry) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| @ -26,7 +26,6 @@ type Request struct { | ||||
| func NewRequest(bindDN string, searchReq ldap.SearchRequest, conn net.Conn) (*Request, *sentry.Span) { | ||||
| 	rid := uuid.New().String() | ||||
| 	bindDN = strings.ToLower(bindDN) | ||||
| 	searchReq.BaseDN = strings.ToLower(searchReq.BaseDN) | ||||
| 	span := sentry.StartSpan(context.TODO(), "authentik.providers.ldap.search", sentry.TransactionName("authentik.providers.ldap.search")) | ||||
| 	span.Description = fmt.Sprintf("%s (%s)", searchReq.BaseDN, ldap.ScopeMap[searchReq.Scope]) | ||||
| 	span.SetTag("request_uid", rid) | ||||
|  | ||||
| @ -2,6 +2,7 @@ package utils | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/nmcclain/ldap" | ||||
| 	log "github.com/sirupsen/logrus" | ||||
| @ -117,3 +118,7 @@ func GetContainerEntry(filterOC string, dn string, ou string) *ldap.Entry { | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func HasSuffixNoCase(s1 string, s2 string) bool { | ||||
| 	return strings.HasSuffix(strings.ToLower(s1), strings.ToLower(s2)) | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| package utils | ||||
|  | ||||
| import ( | ||||
| 	"strings" | ||||
|  | ||||
| 	goldap "github.com/go-ldap/ldap/v3" | ||||
| 	ber "github.com/nmcclain/asn1-ber" | ||||
| 	"github.com/nmcclain/ldap" | ||||
| @ -41,7 +43,7 @@ func parseFilterForGroupSingle(req api.ApiCoreGroupsListRequest, f *ber.Packet) | ||||
| 	// Switch on type of the value, then check the key | ||||
| 	switch vv := v.(type) { | ||||
| 	case string: | ||||
| 		switch k { | ||||
| 		switch strings.ToLower(k.(string)) { | ||||
| 		case "cn": | ||||
| 			return req.Name(vv), false | ||||
| 		case "member": | ||||
| @ -54,7 +56,7 @@ func parseFilterForGroupSingle(req api.ApiCoreGroupsListRequest, f *ber.Packet) | ||||
| 			username := userDN.RDNs[0].Attributes[0].Value | ||||
| 			// If the DN's first ou is virtual-groups, ignore this filter | ||||
| 			if len(userDN.RDNs) > 1 { | ||||
| 				if userDN.RDNs[1].Attributes[0].Value == constants.OUVirtualGroups || userDN.RDNs[1].Attributes[0].Value == constants.OUGroups { | ||||
| 				if strings.EqualFold(userDN.RDNs[1].Attributes[0].Value, constants.OUVirtualGroups) || strings.EqualFold(userDN.RDNs[1].Attributes[0].Value, constants.OUGroups) { | ||||
| 					// Since we know we're not filtering anything, skip this request | ||||
| 					return req, true | ||||
| 				} | ||||
|  | ||||
| @ -2,6 +2,7 @@ package application | ||||
|  | ||||
| import ( | ||||
| 	"encoding/base64" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| @ -57,6 +58,7 @@ func (a *Application) addHeaders(headers http.Header, c *Claims) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // getTraefikForwardUrl See https://doc.traefik.io/traefik/middlewares/forwardauth/ | ||||
| func (a *Application) getTraefikForwardUrl(r *http.Request) *url.URL { | ||||
| 	u, err := url.Parse(fmt.Sprintf( | ||||
| 		"%s://%s%s", | ||||
| @ -72,26 +74,32 @@ func (a *Application) getTraefikForwardUrl(r *http.Request) *url.URL { | ||||
| 	return u | ||||
| } | ||||
|  | ||||
| func (a *Application) IsAllowlisted(r *http.Request) bool { | ||||
| 	url := r.URL | ||||
| 	// In Forward auth mode, we can't directly match against the requested URL | ||||
| 	// Since that would be /akprox/auth/... | ||||
| 	if a.Mode() == api.PROXYMODE_FORWARD_SINGLE || a.Mode() == api.PROXYMODE_FORWARD_DOMAIN { | ||||
| 		// For traefik, we can get the Upstream URL from headers | ||||
| 		// For nginx we can attempt to as well, but it's not guaranteed to work. | ||||
| 		if strings.HasPrefix(r.URL.Path, "/akprox/auth") { | ||||
| 			url = a.getTraefikForwardUrl(r) | ||||
| 		} | ||||
| // getNginxForwardUrl See https://github.com/kubernetes/ingress-nginx/blob/main/rootfs/etc/nginx/template/nginx.tmpl | ||||
| func (a *Application) getNginxForwardUrl(r *http.Request) *url.URL { | ||||
| 	h := r.Header.Get("X-Original-URL") | ||||
| 	if len(h) < 1 { | ||||
| 		a.log.WithError(errors.New("blank URL")).Warning("blank URL") | ||||
| 		return r.URL | ||||
| 	} | ||||
| 	for _, u := range a.UnauthenticatedRegex { | ||||
| 	u, err := url.Parse(h) | ||||
| 	if err != nil { | ||||
| 		a.log.WithError(err).Warning("failed to parse URL from nginx") | ||||
| 		return r.URL | ||||
| 	} | ||||
| 	a.log.WithField("url", u.String()).Trace("nginx forwarded url") | ||||
| 	return u | ||||
| } | ||||
|  | ||||
| func (a *Application) IsAllowlisted(u *url.URL) bool { | ||||
| 	for _, ur := range a.UnauthenticatedRegex { | ||||
| 		var testString string | ||||
| 		if a.Mode() == api.PROXYMODE_PROXY || a.Mode() == api.PROXYMODE_FORWARD_SINGLE { | ||||
| 			testString = url.Path | ||||
| 			testString = u.Path | ||||
| 		} else { | ||||
| 			testString = url.String() | ||||
| 			testString = u.String() | ||||
| 		} | ||||
| 		a.log.WithField("regex", u.String()).WithField("url", testString).Trace("Matching URL against allow list") | ||||
| 		if u.MatchString(testString) { | ||||
| 		if ur.MatchString(testString) { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -25,13 +25,15 @@ func (a *Application) configureForward() error { | ||||
| } | ||||
|  | ||||
| func (a *Application) forwardHandleTraefik(rw http.ResponseWriter, r *http.Request) { | ||||
| 	a.log.WithField("header", r.Header).Trace("tracing headers for debug") | ||||
| 	fwd := a.getTraefikForwardUrl(r) | ||||
| 	claims, err := a.getClaims(r) | ||||
| 	if claims != nil && err == nil { | ||||
| 		a.addHeaders(rw.Header(), claims) | ||||
| 		rw.Header().Set("User-Agent", r.Header.Get("User-Agent")) | ||||
| 		a.log.WithField("headers", rw.Header()).Trace("headers written to forward_auth") | ||||
| 		return | ||||
| 	} else if claims == nil && a.IsAllowlisted(r) { | ||||
| 	} else if claims == nil && a.IsAllowlisted(fwd) { | ||||
| 		a.log.Trace("path can be accessed without authentication") | ||||
| 		return | ||||
| 	} | ||||
| @ -45,15 +47,18 @@ func (a *Application) forwardHandleTraefik(rw http.ResponseWriter, r *http.Reque | ||||
| 	if *a.proxyConfig.Mode == api.PROXYMODE_FORWARD_SINGLE { | ||||
| 		host = web.GetHost(r) | ||||
| 	} else if *a.proxyConfig.Mode == api.PROXYMODE_FORWARD_DOMAIN { | ||||
| 		eh, _ := url.Parse(a.proxyConfig.ExternalHost) | ||||
| 		host = eh.Host | ||||
| 		eh, err := url.Parse(a.proxyConfig.ExternalHost) | ||||
| 		if err != nil { | ||||
| 			a.log.WithField("host", a.proxyConfig.ExternalHost).WithError(err).Warning("invalid external_host") | ||||
| 		} else { | ||||
| 			host = eh.Host | ||||
| 		} | ||||
| 	} | ||||
| 	// set the redirect flag to the current URL we have, since we redirect | ||||
| 	// to a (possibly) different domain, but we want to be redirected back | ||||
| 	// to the application | ||||
| 	// see https://doc.traefik.io/traefik/middlewares/forwardauth/ | ||||
| 	// X-Forwarded-Uri is only the path, so we need to build the entire URL | ||||
| 	s.Values[constants.SessionRedirect] = a.getTraefikForwardUrl(r).String() | ||||
| 	s.Values[constants.SessionRedirect] = fwd.String() | ||||
| 	err = s.Save(r, rw) | ||||
| 	if err != nil { | ||||
| 		a.log.WithError(err).Warning("failed to save session before redirect") | ||||
| @ -69,6 +74,8 @@ func (a *Application) forwardHandleTraefik(rw http.ResponseWriter, r *http.Reque | ||||
| } | ||||
|  | ||||
| func (a *Application) forwardHandleNginx(rw http.ResponseWriter, r *http.Request) { | ||||
| 	a.log.WithField("header", r.Header).Trace("tracing headers for debug") | ||||
| 	fwd := a.getNginxForwardUrl(r) | ||||
| 	claims, err := a.getClaims(r) | ||||
| 	if claims != nil && err == nil { | ||||
| 		a.addHeaders(rw.Header(), claims) | ||||
| @ -76,13 +83,20 @@ func (a *Application) forwardHandleNginx(rw http.ResponseWriter, r *http.Request | ||||
| 		rw.WriteHeader(200) | ||||
| 		a.log.WithField("headers", rw.Header()).Trace("headers written to forward_auth") | ||||
| 		return | ||||
| 	} else if claims == nil && a.IsAllowlisted(r) { | ||||
| 	} else if claims == nil && a.IsAllowlisted(fwd) { | ||||
| 		a.log.Trace("path can be accessed without authentication") | ||||
| 		return | ||||
| 	} | ||||
| 	fwu := a.getTraefikForwardUrl(r) | ||||
| 	if fwu.String() != r.URL.String() { | ||||
| 		if strings.HasPrefix(fwu.Path, "/akprox") { | ||||
|  | ||||
| 	s, _ := a.sessions.Get(r, constants.SeesionName) | ||||
| 	s.Values[constants.SessionRedirect] = fwd.String() | ||||
| 	err = s.Save(r, rw) | ||||
| 	if err != nil { | ||||
| 		a.log.WithError(err).Warning("failed to save session before redirect") | ||||
| 	} | ||||
|  | ||||
| 	if fwd.String() != r.URL.String() { | ||||
| 		if strings.HasPrefix(fwd.Path, "/akprox") { | ||||
| 			a.log.WithField("url", r.URL.String()).Trace("path begins with /akprox, allowing access") | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
							
								
								
									
										122
									
								
								internal/outpost/proxyv2/application/mode_forward_nginx_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								internal/outpost/proxyv2/application/mode_forward_nginx_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,122 @@ | ||||
| package application | ||||
|  | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"net/http/httptest" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"goauthentik.io/api" | ||||
| 	"goauthentik.io/internal/outpost/proxyv2/constants" | ||||
| ) | ||||
|  | ||||
| func TestForwardHandleNginx_Single_Blank(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	req, _ := http.NewRequest("GET", "/akprox/auth/nginx", nil) | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.forwardHandleNginx(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, http.StatusUnauthorized, rr.Code) | ||||
| } | ||||
|  | ||||
| func TestForwardHandleNginx_Single_Skip(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	req, _ := http.NewRequest("GET", "/akprox/auth/nginx", nil) | ||||
| 	req.Header.Set("X-Original-URL", "http://test.goauthentik.io/skip") | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.forwardHandleNginx(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, http.StatusOK, rr.Code) | ||||
| } | ||||
|  | ||||
| func TestForwardHandleNginx_Single_Headers(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	req, _ := http.NewRequest("GET", "/akprox/auth/nginx", nil) | ||||
| 	req.Header.Set("X-Original-URL", "http://test.goauthentik.io/app") | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.forwardHandleNginx(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, rr.Code, http.StatusUnauthorized) | ||||
|  | ||||
| 	s, _ := a.sessions.Get(req, constants.SeesionName) | ||||
| 	assert.Equal(t, "http://test.goauthentik.io/app", s.Values[constants.SessionRedirect]) | ||||
| } | ||||
|  | ||||
| func TestForwardHandleNginx_Single_Claims(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	req, _ := http.NewRequest("GET", "/akprox/auth/nginx", nil) | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.forwardHandleNginx(rr, req) | ||||
|  | ||||
| 	s, _ := a.sessions.Get(req, constants.SeesionName) | ||||
| 	s.Values[constants.SessionClaims] = Claims{ | ||||
| 		Sub: "foo", | ||||
| 		Proxy: ProxyClaims{ | ||||
| 			UserAttributes: map[string]interface{}{ | ||||
| 				"username": "foo", | ||||
| 				"password": "bar", | ||||
| 				"additionalHeaders": map[string]interface{}{ | ||||
| 					"foo": "bar", | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	err := a.sessions.Save(req, rr, s) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | ||||
| 	rr = httptest.NewRecorder() | ||||
| 	a.forwardHandleNginx(rr, req) | ||||
|  | ||||
| 	h := rr.Result().Header | ||||
|  | ||||
| 	assert.Equal(t, []string{"Basic Zm9vOmJhcg=="}, h["Authorization"]) | ||||
| 	assert.Equal(t, []string{"bar"}, h["Foo"]) | ||||
| 	assert.Equal(t, []string{""}, h["User-Agent"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Email"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Groups"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Jwt"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Meta-App"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Meta-Jwks"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Meta-Outpost"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Name"]) | ||||
| 	assert.Equal(t, []string{"foo"}, h["X-Authentik-Uid"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Username"]) | ||||
| } | ||||
|  | ||||
| func TestForwardHandleNginx_Domain_Blank(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	a.proxyConfig.Mode = api.PROXYMODE_FORWARD_DOMAIN.Ptr() | ||||
| 	a.proxyConfig.CookieDomain = api.PtrString("foo") | ||||
| 	req, _ := http.NewRequest("GET", "/akprox/auth/nginx", nil) | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.forwardHandleNginx(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, http.StatusUnauthorized, rr.Code) | ||||
|  | ||||
| 	s, _ := a.sessions.Get(req, constants.SeesionName) | ||||
| 	assert.Equal(t, "/akprox/auth/nginx", s.Values[constants.SessionRedirect]) | ||||
| } | ||||
|  | ||||
| func TestForwardHandleNginx_Domain_Header(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	a.proxyConfig.Mode = api.PROXYMODE_FORWARD_DOMAIN.Ptr() | ||||
| 	a.proxyConfig.CookieDomain = api.PtrString("foo") | ||||
| 	a.proxyConfig.ExternalHost = "http://auth.test.goauthentik.io" | ||||
| 	req, _ := http.NewRequest("GET", "/akprox/auth/nginx", nil) | ||||
| 	req.Header.Set("X-Original-URL", "http://test.goauthentik.io/app") | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.forwardHandleNginx(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, http.StatusUnauthorized, rr.Code) | ||||
|  | ||||
| 	s, _ := a.sessions.Get(req, constants.SeesionName) | ||||
| 	assert.Equal(t, "http://test.goauthentik.io/app", s.Values[constants.SessionRedirect]) | ||||
| } | ||||
| @ -0,0 +1,141 @@ | ||||
| package application | ||||
|  | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"net/http/httptest" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"goauthentik.io/api" | ||||
| 	"goauthentik.io/internal/outpost/proxyv2/constants" | ||||
| ) | ||||
|  | ||||
| func TestForwardHandleTraefik_Single_Blank(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	req, _ := http.NewRequest("GET", "/akprox/auth/traefik", nil) | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.forwardHandleTraefik(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, http.StatusTemporaryRedirect, rr.Code) | ||||
| 	loc, _ := rr.Result().Location() | ||||
| 	assert.Equal(t, "/akprox/start", loc.String()) | ||||
|  | ||||
| 	s, _ := a.sessions.Get(req, constants.SeesionName) | ||||
| 	// Since we're not setting the traefik specific headers, expect it to redirect to the auth URL | ||||
| 	assert.Equal(t, "/akprox/auth/traefik", s.Values[constants.SessionRedirect]) | ||||
| } | ||||
|  | ||||
| func TestForwardHandleTraefik_Single_Skip(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	req, _ := http.NewRequest("GET", "/akprox/auth/traefik", nil) | ||||
| 	req.Header.Set("X-Forwarded-Proto", "http") | ||||
| 	req.Header.Set("X-Forwarded-Host", "test.goauthentik.io") | ||||
| 	req.Header.Set("X-Forwarded-Uri", "/skip") | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.forwardHandleTraefik(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, http.StatusOK, rr.Code) | ||||
| } | ||||
|  | ||||
| func TestForwardHandleTraefik_Single_Headers(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	req, _ := http.NewRequest("GET", "/akprox/auth/traefik", nil) | ||||
| 	req.Header.Set("X-Forwarded-Proto", "http") | ||||
| 	req.Header.Set("X-Forwarded-Host", "test.goauthentik.io") | ||||
| 	req.Header.Set("X-Forwarded-Uri", "/app") | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.forwardHandleTraefik(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, rr.Code, http.StatusTemporaryRedirect) | ||||
| 	loc, _ := rr.Result().Location() | ||||
| 	assert.Equal(t, loc.String(), "http://test.goauthentik.io/akprox/start") | ||||
|  | ||||
| 	s, _ := a.sessions.Get(req, constants.SeesionName) | ||||
| 	assert.Equal(t, "http://test.goauthentik.io/app", s.Values[constants.SessionRedirect]) | ||||
| } | ||||
|  | ||||
| func TestForwardHandleTraefik_Single_Claims(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	req, _ := http.NewRequest("GET", "/akprox/auth/traefik", nil) | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.forwardHandleTraefik(rr, req) | ||||
|  | ||||
| 	s, _ := a.sessions.Get(req, constants.SeesionName) | ||||
| 	s.Values[constants.SessionClaims] = Claims{ | ||||
| 		Sub: "foo", | ||||
| 		Proxy: ProxyClaims{ | ||||
| 			UserAttributes: map[string]interface{}{ | ||||
| 				"username": "foo", | ||||
| 				"password": "bar", | ||||
| 				"additionalHeaders": map[string]interface{}{ | ||||
| 					"foo": "bar", | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	err := a.sessions.Save(req, rr, s) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | ||||
| 	rr = httptest.NewRecorder() | ||||
| 	a.forwardHandleTraefik(rr, req) | ||||
|  | ||||
| 	h := rr.Result().Header | ||||
|  | ||||
| 	assert.Equal(t, []string{"Basic Zm9vOmJhcg=="}, h["Authorization"]) | ||||
| 	assert.Equal(t, []string{"bar"}, h["Foo"]) | ||||
| 	assert.Equal(t, []string{""}, h["User-Agent"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Email"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Groups"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Jwt"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Meta-App"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Meta-Jwks"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Meta-Outpost"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Name"]) | ||||
| 	assert.Equal(t, []string{"foo"}, h["X-Authentik-Uid"]) | ||||
| 	assert.Equal(t, []string{""}, h["X-Authentik-Username"]) | ||||
| } | ||||
|  | ||||
| func TestForwardHandleTraefik_Domain_Blank(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	a.proxyConfig.Mode = api.PROXYMODE_FORWARD_DOMAIN.Ptr() | ||||
| 	a.proxyConfig.CookieDomain = api.PtrString("foo") | ||||
| 	req, _ := http.NewRequest("GET", "/akprox/auth/traefik", nil) | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.forwardHandleTraefik(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, http.StatusTemporaryRedirect, rr.Code) | ||||
| 	loc, _ := rr.Result().Location() | ||||
| 	assert.Equal(t, "/akprox/start", loc.String()) | ||||
|  | ||||
| 	s, _ := a.sessions.Get(req, constants.SeesionName) | ||||
| 	// Since we're not setting the traefik specific headers, expect it to redirect to the auth URL | ||||
| 	assert.Equal(t, "/akprox/auth/traefik", s.Values[constants.SessionRedirect]) | ||||
| } | ||||
|  | ||||
| func TestForwardHandleTraefik_Domain_Header(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	a.proxyConfig.Mode = api.PROXYMODE_FORWARD_DOMAIN.Ptr() | ||||
| 	a.proxyConfig.CookieDomain = api.PtrString("foo") | ||||
| 	a.proxyConfig.ExternalHost = "http://auth.test.goauthentik.io" | ||||
| 	req, _ := http.NewRequest("GET", "/akprox/auth/traefik", nil) | ||||
| 	req.Header.Set("X-Forwarded-Proto", "http") | ||||
| 	req.Header.Set("X-Forwarded-Host", "test.goauthentik.io") | ||||
| 	req.Header.Set("X-Forwarded-Uri", "/app") | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.forwardHandleTraefik(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, http.StatusTemporaryRedirect, rr.Code) | ||||
| 	loc, _ := rr.Result().Location() | ||||
| 	assert.Equal(t, "http://auth.test.goauthentik.io/akprox/start", loc.String()) | ||||
|  | ||||
| 	s, _ := a.sessions.Get(req, constants.SeesionName) | ||||
| 	assert.Equal(t, "http://test.goauthentik.io/app", s.Values[constants.SessionRedirect]) | ||||
| } | ||||
| @ -35,7 +35,7 @@ func (a *Application) configureProxy() error { | ||||
| 	rp.ModifyResponse = a.proxyModifyResponse | ||||
| 	a.mux.PathPrefix("/").HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { | ||||
| 		claims, err := a.getClaims(r) | ||||
| 		if claims == nil && a.IsAllowlisted(r) { | ||||
| 		if claims == nil && a.IsAllowlisted(r.URL) { | ||||
| 			a.log.Trace("path can be accessed without authentication") | ||||
| 		} else if claims == nil && err != nil { | ||||
| 			a.redirectToStart(rw, r) | ||||
| @ -79,5 +79,6 @@ func (a *Application) proxyModifyRequest(u *url.URL) func(req *http.Request) { | ||||
| } | ||||
|  | ||||
| func (a *Application) proxyModifyResponse(res *http.Response) error { | ||||
| 	res.Header.Set("X-Powered-By", "authentik_proxy2") | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
							
								
								
									
										40
									
								
								internal/outpost/proxyv2/application/test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								internal/outpost/proxyv2/application/test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | ||||
| package application | ||||
|  | ||||
| import ( | ||||
| 	"net/http" | ||||
|  | ||||
| 	"github.com/quasoft/memstore" | ||||
| 	"goauthentik.io/api" | ||||
| 	"goauthentik.io/internal/outpost/ak" | ||||
| ) | ||||
|  | ||||
| func newTestApplication() *Application { | ||||
| 	a, _ := NewApplication( | ||||
| 		api.ProxyOutpostConfig{ | ||||
| 			Name:                       ak.TestSecret(), | ||||
| 			ClientId:                   api.PtrString(ak.TestSecret()), | ||||
| 			ClientSecret:               api.PtrString(ak.TestSecret()), | ||||
| 			CookieSecret:               api.PtrString(ak.TestSecret()), | ||||
| 			CookieDomain:               api.PtrString(""), | ||||
| 			Mode:                       api.PROXYMODE_FORWARD_SINGLE.Ptr(), | ||||
| 			SkipPathRegex:              api.PtrString("/skip.*"), | ||||
| 			BasicAuthEnabled:           api.PtrBool(true), | ||||
| 			BasicAuthUserAttribute:     api.PtrString("username"), | ||||
| 			BasicAuthPasswordAttribute: api.PtrString("password"), | ||||
| 		}, | ||||
| 		http.DefaultClient, | ||||
| 		nil, | ||||
| 		ak.MockAK( | ||||
| 			api.Outpost{ | ||||
| 				Config: map[string]interface{}{ | ||||
| 					"authentik_host": ak.TestSecret(), | ||||
| 				}, | ||||
| 			}, | ||||
| 			ak.MockConfig(), | ||||
| 		), | ||||
| 	) | ||||
| 	a.sessions = memstore.NewMemStore( | ||||
| 		[]byte(ak.TestSecret()), | ||||
| 	) | ||||
| 	return a | ||||
| } | ||||
| @ -26,21 +26,14 @@ func (a *Application) redirectToStart(rw http.ResponseWriter, r *http.Request) { | ||||
| 	if err == nil { | ||||
| 		a.log.WithError(err).Warning("failed to decode session") | ||||
| 	} | ||||
| 	redirectUrl := r.URL.String() | ||||
| 	// simple way to copy the URL | ||||
| 	u, _ := url.Parse(redirectUrl) | ||||
| 	// In proxy and forward_single mode we only have one URL that we route on | ||||
| 	// if we somehow got here without that URL, make sure we're at least redirected back to it | ||||
| 	if a.Mode() == api.PROXYMODE_PROXY || a.Mode() == api.PROXYMODE_FORWARD_SINGLE { | ||||
| 		u.Host = a.proxyConfig.ExternalHost | ||||
| 	} | ||||
| 	redirectUrl := urlJoin(a.proxyConfig.ExternalHost, r.URL.Path) | ||||
| 	if a.Mode() == api.PROXYMODE_FORWARD_DOMAIN { | ||||
| 		dom := strings.TrimPrefix(*a.proxyConfig.CookieDomain, ".") | ||||
| 		// In forward_domain we only check that the current URL's host | ||||
| 		// ends with the cookie domain (remove the leading period if set) | ||||
| 		if !strings.HasSuffix(r.URL.Hostname(), dom) { | ||||
| 			a.log.WithField("url", r.URL.String()).WithField("cd", dom).Warning("Invalid redirect found") | ||||
| 			redirectUrl = "" | ||||
| 			redirectUrl = a.proxyConfig.ExternalHost | ||||
| 		} | ||||
| 	} | ||||
| 	s.Values[constants.SessionRedirect] = redirectUrl | ||||
|  | ||||
							
								
								
									
										81
									
								
								internal/outpost/proxyv2/application/utils_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								internal/outpost/proxyv2/application/utils_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,81 @@ | ||||
| package application | ||||
|  | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"net/http/httptest" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"goauthentik.io/api" | ||||
| 	"goauthentik.io/internal/outpost/proxyv2/constants" | ||||
| ) | ||||
|  | ||||
| func TestRedirectToStart_Proxy(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	a.proxyConfig.Mode = api.PROXYMODE_PROXY.Ptr() | ||||
| 	a.proxyConfig.ExternalHost = "https://test.goauthentik.io" | ||||
| 	req, _ := http.NewRequest("GET", "/foo/bar/baz", nil) | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.redirectToStart(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, http.StatusFound, rr.Code) | ||||
| 	loc, _ := rr.Result().Location() | ||||
| 	assert.Equal(t, "https://test.goauthentik.io/akprox/start", loc.String()) | ||||
|  | ||||
| 	s, _ := a.sessions.Get(req, constants.SeesionName) | ||||
| 	assert.Equal(t, "https://test.goauthentik.io/foo/bar/baz", s.Values[constants.SessionRedirect]) | ||||
| } | ||||
|  | ||||
| func TestRedirectToStart_Forward(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	a.proxyConfig.Mode = api.PROXYMODE_FORWARD_SINGLE.Ptr() | ||||
| 	a.proxyConfig.ExternalHost = "https://test.goauthentik.io" | ||||
| 	req, _ := http.NewRequest("GET", "/foo/bar/baz", nil) | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.redirectToStart(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, http.StatusFound, rr.Code) | ||||
| 	loc, _ := rr.Result().Location() | ||||
| 	assert.Equal(t, "https://test.goauthentik.io/akprox/start", loc.String()) | ||||
|  | ||||
| 	s, _ := a.sessions.Get(req, constants.SeesionName) | ||||
| 	assert.Equal(t, "https://test.goauthentik.io/foo/bar/baz", s.Values[constants.SessionRedirect]) | ||||
| } | ||||
|  | ||||
| func TestRedirectToStart_Forward_Domain_Invalid(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	a.proxyConfig.CookieDomain = api.PtrString("foo") | ||||
| 	a.proxyConfig.Mode = api.PROXYMODE_FORWARD_DOMAIN.Ptr() | ||||
| 	a.proxyConfig.ExternalHost = "https://test.goauthentik.io" | ||||
| 	req, _ := http.NewRequest("GET", "/foo/bar/baz", nil) | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.redirectToStart(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, http.StatusFound, rr.Code) | ||||
| 	loc, _ := rr.Result().Location() | ||||
| 	assert.Equal(t, "https://test.goauthentik.io/akprox/start", loc.String()) | ||||
|  | ||||
| 	s, _ := a.sessions.Get(req, constants.SeesionName) | ||||
| 	assert.Equal(t, "https://test.goauthentik.io", s.Values[constants.SessionRedirect]) | ||||
| } | ||||
|  | ||||
| func TestRedirectToStart_Forward_Domain(t *testing.T) { | ||||
| 	a := newTestApplication() | ||||
| 	a.proxyConfig.CookieDomain = api.PtrString("goauthentik.io") | ||||
| 	a.proxyConfig.Mode = api.PROXYMODE_FORWARD_DOMAIN.Ptr() | ||||
| 	a.proxyConfig.ExternalHost = "https://test.goauthentik.io" | ||||
| 	req, _ := http.NewRequest("GET", "/foo/bar/baz", nil) | ||||
|  | ||||
| 	rr := httptest.NewRecorder() | ||||
| 	a.redirectToStart(rr, req) | ||||
|  | ||||
| 	assert.Equal(t, http.StatusFound, rr.Code) | ||||
| 	loc, _ := rr.Result().Location() | ||||
| 	assert.Equal(t, "https://test.goauthentik.io/akprox/start", loc.String()) | ||||
|  | ||||
| 	s, _ := a.sessions.Get(req, constants.SeesionName) | ||||
| 	assert.Equal(t, "https://test.goauthentik.io", s.Values[constants.SessionRedirect]) | ||||
| } | ||||
| @ -46,7 +46,7 @@ func NewProxyServer(ac *ak.APIController, portOffset int) *ProxyServer { | ||||
| 	rootMux.Use(func(h http.Handler) http.Handler { | ||||
| 		return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { | ||||
| 			h.ServeHTTP(rw, r) | ||||
| 			rw.Header().Set("Server", "authentik_proxy2") | ||||
| 			rw.Header().Set("X-Powered-By", "authentik_proxy2") | ||||
| 		}) | ||||
| 	}) | ||||
|  | ||||
| @ -91,7 +91,7 @@ func (ps *ProxyServer) TimerFlowCacheExpiry() {} | ||||
| func (ps *ProxyServer) GetCertificate(serverName string) *tls.Certificate { | ||||
| 	app, ok := ps.apps[serverName] | ||||
| 	if !ok { | ||||
| 		ps.log.WithField("server-name", serverName).Debug("app does not exist") | ||||
| 		ps.log.WithField("server-name", serverName).Debug("failed to get certificate for ServerName") | ||||
| 		return nil | ||||
| 	} | ||||
| 	if app.Cert == nil { | ||||
| @ -151,17 +151,14 @@ func (ps *ProxyServer) Start() error { | ||||
| 	wg.Add(3) | ||||
| 	go func() { | ||||
| 		defer wg.Done() | ||||
| 		ps.log.Debug("Starting HTTP Server...") | ||||
| 		ps.ServeHTTP() | ||||
| 	}() | ||||
| 	go func() { | ||||
| 		defer wg.Done() | ||||
| 		ps.log.Debug("Starting HTTPs Server...") | ||||
| 		ps.ServeHTTPS() | ||||
| 	}() | ||||
| 	go func() { | ||||
| 		defer wg.Done() | ||||
| 		ps.log.Debug("Starting Metrics Server...") | ||||
| 		metrics.RunServer() | ||||
| 	}() | ||||
| 	return nil | ||||
|  | ||||
| @ -74,6 +74,6 @@ func (ws *WebServer) proxyErrorHandler(rw http.ResponseWriter, req *http.Request | ||||
| } | ||||
|  | ||||
| func (ws *WebServer) proxyModifyResponse(r *http.Response) error { | ||||
| 	r.Header.Set("server", "authentik") | ||||
| 	r.Header.Set("X-Powered-By", "authentik") | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @ -69,6 +69,7 @@ if [[ "$1" == "server" ]]; then | ||||
|     python -m lifecycle.migrate | ||||
|     /authentik-proxy | ||||
| elif [[ "$1" == "worker" ]]; then | ||||
|     wait_for_db | ||||
|     echo "worker" > $MODE_FILE | ||||
|     check_if_root "celery -A authentik.root.celery worker -Ofair --max-tasks-per-child=1 --autoscale 3,1 -E -B -s /tmp/celerybeat-schedule -Q authentik,authentik_scheduled,authentik_events" | ||||
| elif [[ "$1" == "flower" ]]; then | ||||
|  | ||||
| @ -23,6 +23,9 @@ if os.path.exists("/dev/shm"):  # nosec | ||||
|  | ||||
| os.environ.setdefault("DJANGO_SETTINGS_MODULE", "authentik.root.settings") | ||||
|  | ||||
| max_requests = 1000 | ||||
| max_requests_jitter = 50 | ||||
|  | ||||
| logconfig_dict = { | ||||
|     "version": 1, | ||||
|     "disable_existing_loggers": False, | ||||
|  | ||||
| @ -26,9 +26,13 @@ def j_print(event: str, log_level: str = "info", **kwargs): | ||||
|     print(dumps(data), file=stderr) | ||||
|  | ||||
|  | ||||
| j_print("Starting authentik bootstrap") | ||||
|  | ||||
| # Sanity check, ensure SECRET_KEY is set before we even check for database connectivity | ||||
| if CONFIG.y("secret_key") is None or len(CONFIG.y("secret_key")) == 0: | ||||
|     j_print("----------------------------------------------------------------------") | ||||
|     j_print("Secret key missing, check https://goauthentik.io/docs/installation/.") | ||||
|     j_print("----------------------------------------------------------------------") | ||||
|     sysexit(1) | ||||
|  | ||||
|  | ||||
| @ -45,7 +49,9 @@ while True: | ||||
|         break | ||||
|     except OperationalError as exc: | ||||
|         sleep(1) | ||||
|         j_print(f"PostgreSQL Connection failed, retrying... ({exc})") | ||||
|         j_print(f"PostgreSQL connection failed, retrying... ({exc})") | ||||
|     finally: | ||||
|         j_print("PostgreSQL connection successful") | ||||
|  | ||||
| REDIS_PROTOCOL_PREFIX = "redis://" | ||||
| if CONFIG.y_bool("redis.tls", False): | ||||
| @ -63,3 +69,7 @@ while True: | ||||
|     except RedisError as exc: | ||||
|         sleep(1) | ||||
|         j_print(f"Redis Connection failed, retrying... ({exc})", redis_url=REDIS_URL) | ||||
|     finally: | ||||
|         j_print("Redis Connection successful") | ||||
|  | ||||
| j_print("Finished authentik bootstrap") | ||||
|  | ||||
							
								
								
									
										139
									
								
								poetry.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										139
									
								
								poetry.lock
									
									
									
										generated
									
									
									
								
							| @ -163,11 +163,11 @@ visualize = ["graphviz (>0.5.1)", "Twisted (>=16.1.1)"] | ||||
|  | ||||
| [[package]] | ||||
| name = "bandit" | ||||
| version = "1.7.1" | ||||
| version = "1.7.2" | ||||
| description = "Security oriented static analyser for python code." | ||||
| category = "dev" | ||||
| optional = false | ||||
| python-versions = ">=3.5" | ||||
| python-versions = ">=3.7" | ||||
|  | ||||
| [package.dependencies] | ||||
| colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} | ||||
| @ -175,6 +175,11 @@ GitPython = ">=1.0.1" | ||||
| PyYAML = ">=5.3.1" | ||||
| stevedore = ">=1.20.0" | ||||
|  | ||||
| [package.extras] | ||||
| test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "toml"] | ||||
| toml = ["toml"] | ||||
| yaml = ["pyyaml"] | ||||
|  | ||||
| [[package]] | ||||
| name = "bcrypt" | ||||
| version = "3.2.0" | ||||
| @ -227,14 +232,14 @@ uvloop = ["uvloop (>=0.15.2)"] | ||||
|  | ||||
| [[package]] | ||||
| name = "boto3" | ||||
| version = "1.20.41" | ||||
| version = "1.20.43" | ||||
| description = "The AWS SDK for Python" | ||||
| category = "main" | ||||
| optional = false | ||||
| python-versions = ">= 3.6" | ||||
|  | ||||
| [package.dependencies] | ||||
| botocore = ">=1.23.41,<1.24.0" | ||||
| botocore = ">=1.23.43,<1.24.0" | ||||
| jmespath = ">=0.7.1,<1.0.0" | ||||
| s3transfer = ">=0.5.0,<0.6.0" | ||||
|  | ||||
| @ -243,7 +248,7 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] | ||||
|  | ||||
| [[package]] | ||||
| name = "botocore" | ||||
| version = "1.23.41" | ||||
| version = "1.23.43" | ||||
| description = "Low-level, data-driven core of boto 3." | ||||
| category = "main" | ||||
| optional = false | ||||
| @ -490,11 +495,11 @@ python-versions = "*" | ||||
|  | ||||
| [[package]] | ||||
| name = "coverage" | ||||
| version = "6.2" | ||||
| version = "6.3" | ||||
| description = "Code coverage measurement for Python" | ||||
| category = "dev" | ||||
| optional = false | ||||
| python-versions = ">=3.6" | ||||
| python-versions = ">=3.7" | ||||
|  | ||||
| [package.dependencies] | ||||
| tomli = {version = "*", optional = true, markers = "extra == \"toml\""} | ||||
| @ -1608,7 +1613,7 @@ urllib3 = {version = ">=1.26,<2.0", extras = ["secure"]} | ||||
|  | ||||
| [[package]] | ||||
| name = "sentry-sdk" | ||||
| version = "1.5.3" | ||||
| version = "1.5.4" | ||||
| description = "Python client for Sentry (https://sentry.io)" | ||||
| category = "main" | ||||
| optional = false | ||||
| @ -1898,11 +1903,11 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] | ||||
|  | ||||
| [[package]] | ||||
| name = "uvicorn" | ||||
| version = "0.17.0" | ||||
| version = "0.17.0.post1" | ||||
| description = "The lightning-fast ASGI server." | ||||
| category = "main" | ||||
| optional = false | ||||
| python-versions = "*" | ||||
| python-versions = ">=3.7" | ||||
|  | ||||
| [package.dependencies] | ||||
| asgiref = ">=3.4.0" | ||||
| @ -2188,14 +2193,17 @@ automat = [ | ||||
|     {file = "Automat-20.2.0.tar.gz", hash = "sha256:7979803c74610e11ef0c0d68a2942b152df52da55336e0c9d58daf1831cbdf33"}, | ||||
| ] | ||||
| bandit = [ | ||||
|     {file = "bandit-1.7.1-py3-none-any.whl", hash = "sha256:f5acd838e59c038a159b5c621cf0f8270b279e884eadd7b782d7491c02add0d4"}, | ||||
|     {file = "bandit-1.7.1.tar.gz", hash = "sha256:a81b00b5436e6880fa8ad6799bc830e02032047713cbb143a12939ac67eb756c"}, | ||||
|     {file = "bandit-1.7.2-py3-none-any.whl", hash = "sha256:e20402cadfd126d85b68ed4c8862959663c8c372dbbb1fca8f8e2c9f55a067ec"}, | ||||
|     {file = "bandit-1.7.2.tar.gz", hash = "sha256:6d11adea0214a43813887bfe71a377b5a9955e4c826c8ffd341b494e3ab25260"}, | ||||
| ] | ||||
| bcrypt = [ | ||||
|     {file = "bcrypt-3.2.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b589229207630484aefe5899122fb938a5b017b0f4349f769b8c13e78d99a8fd"}, | ||||
|     {file = "bcrypt-3.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c95d4cbebffafcdd28bd28bb4e25b31c50f6da605c81ffd9ad8a3d1b2ab7b1b6"}, | ||||
|     {file = "bcrypt-3.2.0-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:63d4e3ff96188e5898779b6057878fecf3f11cfe6ec3b313ea09955d587ec7a7"}, | ||||
|     {file = "bcrypt-3.2.0-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:cd1ea2ff3038509ea95f687256c46b79f5fc382ad0aa3664d200047546d511d1"}, | ||||
|     {file = "bcrypt-3.2.0-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:cdcdcb3972027f83fe24a48b1e90ea4b584d35f1cc279d76de6fc4b13376239d"}, | ||||
|     {file = "bcrypt-3.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a0584a92329210fcd75eb8a3250c5a941633f8bfaf2a18f81009b097732839b7"}, | ||||
|     {file = "bcrypt-3.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:56e5da069a76470679f312a7d3d23deb3ac4519991a0361abc11da837087b61d"}, | ||||
|     {file = "bcrypt-3.2.0-cp36-abi3-win32.whl", hash = "sha256:a67fb841b35c28a59cebed05fbd3e80eea26e6d75851f0574a9273c80f3e9b55"}, | ||||
|     {file = "bcrypt-3.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:81fec756feff5b6818ea7ab031205e1d323d8943d237303baca2c5f9c7846f34"}, | ||||
|     {file = "bcrypt-3.2.0.tar.gz", hash = "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29"}, | ||||
| @ -2209,12 +2217,12 @@ black = [ | ||||
|     {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, | ||||
| ] | ||||
| boto3 = [ | ||||
|     {file = "boto3-1.20.41-py3-none-any.whl", hash = "sha256:aaddf6cf93568b734ad62fd96991775bccc7f016e93ff4e98dc1aa4f7586440c"}, | ||||
|     {file = "boto3-1.20.41.tar.gz", hash = "sha256:fb02467a6e8109c7db994ba77fa2e8381ed129ce312988d8ef23edf6e3a3c7f1"}, | ||||
|     {file = "boto3-1.20.43-py3-none-any.whl", hash = "sha256:50611d4707e967f1300e897c196db98cfc1b0ab95eca5d46d3b56a1c8e2a27b5"}, | ||||
|     {file = "boto3-1.20.43.tar.gz", hash = "sha256:219cba1d078b3c0f3bd1678ee355e07c4a07ea75ee75adee6c306d89d60c555c"}, | ||||
| ] | ||||
| botocore = [ | ||||
|     {file = "botocore-1.23.41-py3-none-any.whl", hash = "sha256:41104e1c976c9c410387b3c7d265466b314f287a1c13fd4b543768135301058a"}, | ||||
|     {file = "botocore-1.23.41.tar.gz", hash = "sha256:9137c59c4eb1dee60ae3c710e94f56119a1b33b0b17ff3ad878fc2f4ce77843a"}, | ||||
|     {file = "botocore-1.23.43-py3-none-any.whl", hash = "sha256:22c88a653a026439f2e9b0ade154fafe0eaaaea3fee6e080102d90ec4271284e"}, | ||||
|     {file = "botocore-1.23.43.tar.gz", hash = "sha256:f8c60dff90a7aea7f84908f0e4e778890d4f08c883d2da111c15c10d7c199102"}, | ||||
| ] | ||||
| bump2version = [ | ||||
|     {file = "bump2version-1.0.1-py2.py3-none-any.whl", hash = "sha256:37f927ea17cde7ae2d7baf832f8e80ce3777624554a653006c9144f8017fe410"}, | ||||
| @ -2344,53 +2352,50 @@ constantly = [ | ||||
|     {file = "constantly-15.1.0.tar.gz", hash = "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35"}, | ||||
| ] | ||||
| coverage = [ | ||||
|     {file = "coverage-6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6dbc1536e105adda7a6312c778f15aaabe583b0e9a0b0a324990334fd458c94b"}, | ||||
|     {file = "coverage-6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174cf9b4bef0db2e8244f82059a5a72bd47e1d40e71c68ab055425172b16b7d0"}, | ||||
|     {file = "coverage-6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b8c845527eae547a2a6617d336adc56394050c3ed8a6918683646328fbb6da"}, | ||||
|     {file = "coverage-6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c7912d1526299cb04c88288e148c6c87c0df600eca76efd99d84396cfe00ef1d"}, | ||||
|     {file = "coverage-6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d2033d5db1d58ae2d62f095e1aefb6988af65b4b12cb8987af409587cc0739"}, | ||||
|     {file = "coverage-6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3feac4084291642165c3a0d9eaebedf19ffa505016c4d3db15bfe235718d4971"}, | ||||
|     {file = "coverage-6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:276651978c94a8c5672ea60a2656e95a3cce2a3f31e9fb2d5ebd4c215d095840"}, | ||||
|     {file = "coverage-6.2-cp310-cp310-win32.whl", hash = "sha256:f506af4f27def639ba45789fa6fde45f9a217da0be05f8910458e4557eed020c"}, | ||||
|     {file = "coverage-6.2-cp310-cp310-win_amd64.whl", hash = "sha256:3f7c17209eef285c86f819ff04a6d4cbee9b33ef05cbcaae4c0b4e8e06b3ec8f"}, | ||||
|     {file = "coverage-6.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:13362889b2d46e8d9f97c421539c97c963e34031ab0cb89e8ca83a10cc71ac76"}, | ||||
|     {file = "coverage-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22e60a3ca5acba37d1d4a2ee66e051f5b0e1b9ac950b5b0cf4aa5366eda41d47"}, | ||||
|     {file = "coverage-6.2-cp311-cp311-win_amd64.whl", hash = "sha256:b637c57fdb8be84e91fac60d9325a66a5981f8086c954ea2772efe28425eaf64"}, | ||||
|     {file = "coverage-6.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f467bbb837691ab5a8ca359199d3429a11a01e6dfb3d9dcc676dc035ca93c0a9"}, | ||||
|     {file = "coverage-6.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2641f803ee9f95b1f387f3e8f3bf28d83d9b69a39e9911e5bfee832bea75240d"}, | ||||
|     {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1219d760ccfafc03c0822ae2e06e3b1248a8e6d1a70928966bafc6838d3c9e48"}, | ||||
|     {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a2b5b52be0a8626fcbffd7e689781bf8c2ac01613e77feda93d96184949a98e"}, | ||||
|     {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8e2c35a4c1f269704e90888e56f794e2d9c0262fb0c1b1c8c4ee44d9b9e77b5d"}, | ||||
|     {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5d6b09c972ce9200264c35a1d53d43ca55ef61836d9ec60f0d44273a31aa9f17"}, | ||||
|     {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e3db840a4dee542e37e09f30859f1612da90e1c5239a6a2498c473183a50e781"}, | ||||
|     {file = "coverage-6.2-cp36-cp36m-win32.whl", hash = "sha256:4e547122ca2d244f7c090fe3f4b5a5861255ff66b7ab6d98f44a0222aaf8671a"}, | ||||
|     {file = "coverage-6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:01774a2c2c729619760320270e42cd9e797427ecfddd32c2a7b639cdc481f3c0"}, | ||||
|     {file = "coverage-6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb8b8ee99b3fffe4fd86f4c81b35a6bf7e4462cba019997af2fe679365db0c49"}, | ||||
|     {file = "coverage-6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:619346d57c7126ae49ac95b11b0dc8e36c1dd49d148477461bb66c8cf13bb521"}, | ||||
|     {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a7726f74ff63f41e95ed3a89fef002916c828bb5fcae83b505b49d81a066884"}, | ||||
|     {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfd9386c1d6f13b37e05a91a8583e802f8059bebfccde61a418c5808dea6bbfa"}, | ||||
|     {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:17e6c11038d4ed6e8af1407d9e89a2904d573be29d51515f14262d7f10ef0a64"}, | ||||
|     {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c254b03032d5a06de049ce8bca8338a5185f07fb76600afff3c161e053d88617"}, | ||||
|     {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dca38a21e4423f3edb821292e97cec7ad38086f84313462098568baedf4331f8"}, | ||||
|     {file = "coverage-6.2-cp37-cp37m-win32.whl", hash = "sha256:600617008aa82032ddeace2535626d1bc212dfff32b43989539deda63b3f36e4"}, | ||||
|     {file = "coverage-6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bf154ba7ee2fd613eb541c2bc03d3d9ac667080a737449d1a3fb342740eb1a74"}, | ||||
|     {file = "coverage-6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9afb5b746781fc2abce26193d1c817b7eb0e11459510fba65d2bd77fe161d9e"}, | ||||
|     {file = "coverage-6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edcada2e24ed68f019175c2b2af2a8b481d3d084798b8c20d15d34f5c733fa58"}, | ||||
|     {file = "coverage-6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9c8c4283e17690ff1a7427123ffb428ad6a52ed720d550e299e8291e33184dc"}, | ||||
|     {file = "coverage-6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f614fc9956d76d8a88a88bb41ddc12709caa755666f580af3a688899721efecd"}, | ||||
|     {file = "coverage-6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9365ed5cce5d0cf2c10afc6add145c5037d3148585b8ae0e77cc1efdd6aa2953"}, | ||||
|     {file = "coverage-6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8bdfe9ff3a4ea37d17f172ac0dff1e1c383aec17a636b9b35906babc9f0f5475"}, | ||||
|     {file = "coverage-6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:63c424e6f5b4ab1cf1e23a43b12f542b0ec2e54f99ec9f11b75382152981df57"}, | ||||
|     {file = "coverage-6.2-cp38-cp38-win32.whl", hash = "sha256:49dbff64961bc9bdd2289a2bda6a3a5a331964ba5497f694e2cbd540d656dc1c"}, | ||||
|     {file = "coverage-6.2-cp38-cp38-win_amd64.whl", hash = "sha256:9a29311bd6429be317c1f3fe4bc06c4c5ee45e2fa61b2a19d4d1d6111cb94af2"}, | ||||
|     {file = "coverage-6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03b20e52b7d31be571c9c06b74746746d4eb82fc260e594dc662ed48145e9efd"}, | ||||
|     {file = "coverage-6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:215f8afcc02a24c2d9a10d3790b21054b58d71f4b3c6f055d4bb1b15cecce685"}, | ||||
|     {file = "coverage-6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a4bdeb0a52d1d04123b41d90a4390b096f3ef38eee35e11f0b22c2d031222c6c"}, | ||||
|     {file = "coverage-6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c332d8f8d448ded473b97fefe4a0983265af21917d8b0cdcb8bb06b2afe632c3"}, | ||||
|     {file = "coverage-6.2-cp39-cp39-win32.whl", hash = "sha256:6e1394d24d5938e561fbeaa0cd3d356207579c28bd1792f25a068743f2d5b282"}, | ||||
|     {file = "coverage-6.2-cp39-cp39-win_amd64.whl", hash = "sha256:86f2e78b1eff847609b1ca8050c9e1fa3bd44ce755b2ec30e70f2d3ba3844644"}, | ||||
|     {file = "coverage-6.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:5829192582c0ec8ca4a2532407bc14c2f338d9878a10442f5d03804a95fac9de"}, | ||||
|     {file = "coverage-6.2.tar.gz", hash = "sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8"}, | ||||
|     {file = "coverage-6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8071e7d9ba9f457fc674afc3de054450be2c9b195c470147fbbc082468d8ff7"}, | ||||
|     {file = "coverage-6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86c91c511853dfda81c2cf2360502cb72783f4b7cebabef27869f00cbe1db07d"}, | ||||
|     {file = "coverage-6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4ce3b647bd1792d4394f5690d9df6dc035b00bcdbc5595099c01282a59ae01"}, | ||||
|     {file = "coverage-6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a491e159294d756e7fc8462f98175e2d2225e4dbe062cca7d3e0d5a75ba6260"}, | ||||
|     {file = "coverage-6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d008e0f67ac800b0ca04d7914b8501312c8c6c00ad8c7ba17754609fae1231a"}, | ||||
|     {file = "coverage-6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4578728c36de2801c1deb1c6b760d31883e62e33f33c7ba8f982e609dc95167d"}, | ||||
|     {file = "coverage-6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7ee317486593193e066fc5e98ac0ce712178c21529a85c07b7cb978171f25d53"}, | ||||
|     {file = "coverage-6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2bc85664b06ba42d14bb74d6ddf19d8bfc520cb660561d2d9ce5786ae72f71b5"}, | ||||
|     {file = "coverage-6.3-cp310-cp310-win32.whl", hash = "sha256:27a94db5dc098c25048b0aca155f5fac674f2cf1b1736c5272ba28ead2fc267e"}, | ||||
|     {file = "coverage-6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bde4aeabc0d1b2e52c4036c54440b1ad05beeca8113f47aceb4998bb7471e2c2"}, | ||||
|     {file = "coverage-6.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:509c68c3e2015022aeda03b003dd68fa19987cdcf64e9d4edc98db41cfc45d30"}, | ||||
|     {file = "coverage-6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e4ff163602c5c77e7bb4ea81ba5d3b793b4419f8acd296aae149370902cf4e92"}, | ||||
|     {file = "coverage-6.3-cp311-cp311-win_amd64.whl", hash = "sha256:d1675db48490e5fa0b300f6329ecb8a9a37c29b9ab64fa9c964d34111788ca2d"}, | ||||
|     {file = "coverage-6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7eed8459a2b81848cafb3280b39d7d49950d5f98e403677941c752e7e7ee47cb"}, | ||||
|     {file = "coverage-6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b4285fde5286b946835a1a53bba3ad41ef74285ba9e8013e14b5ea93deaeafc"}, | ||||
|     {file = "coverage-6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4748349734110fd32d46ff8897b561e6300d8989a494ad5a0a2e4f0ca974fc7"}, | ||||
|     {file = "coverage-6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:823f9325283dc9565ba0aa2d240471a93ca8999861779b2b6c7aded45b58ee0f"}, | ||||
|     {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fff16a30fdf57b214778eff86391301c4509e327a65b877862f7c929f10a4253"}, | ||||
|     {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:da1a428bdbe71f9a8c270c7baab29e9552ac9d0e0cba5e7e9a4c9ee6465d258d"}, | ||||
|     {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7d82c610a2e10372e128023c5baf9ce3d270f3029fe7274ff5bc2897c68f1318"}, | ||||
|     {file = "coverage-6.3-cp37-cp37m-win32.whl", hash = "sha256:11e61c5548ecf74ea1f8b059730b049871f0e32b74f88bd0d670c20c819ad749"}, | ||||
|     {file = "coverage-6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0c3525b1a182c8ffc9bca7e56b521e0c2b8b3e82f033c8e16d6d721f1b54d6"}, | ||||
|     {file = "coverage-6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a189036c50dcd56100746139a459f0d27540fef95b09aba03e786540b8feaa5f"}, | ||||
|     {file = "coverage-6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32168001f33025fd756884d56d01adebb34e6c8c0b3395ca8584cdcee9c7c9d2"}, | ||||
|     {file = "coverage-6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5d79c9af3f410a2b5acad91258b4ae179ee9c83897eb9de69151b179b0227f5"}, | ||||
|     {file = "coverage-6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:85c5fc9029043cf8b07f73fbb0a7ab6d3b717510c3b5642b77058ea55d7cacde"}, | ||||
|     {file = "coverage-6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7596aa2f2b8fa5604129cfc9a27ad9beec0a96f18078cb424d029fdd707468d"}, | ||||
|     {file = "coverage-6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ce443a3e6df90d692c38762f108fc4c88314bf477689f04de76b3f252e7a351c"}, | ||||
|     {file = "coverage-6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:012157499ec4f135fc36cd2177e3d1a1840af9b236cbe80e9a5ccfc83d912a69"}, | ||||
|     {file = "coverage-6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a34d313105cdd0d3644c56df2d743fe467270d6ab93b5d4a347eb9fec8924d6"}, | ||||
|     {file = "coverage-6.3-cp38-cp38-win32.whl", hash = "sha256:6e78b1e25e5c5695dea012be473e442f7094d066925604be20b30713dbd47f89"}, | ||||
|     {file = "coverage-6.3-cp38-cp38-win_amd64.whl", hash = "sha256:433b99f7b0613bdcdc0b00cc3d39ed6d756797e3b078d2c43f8a38288520aec6"}, | ||||
|     {file = "coverage-6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ed3244b415725f08ca3bdf02ed681089fd95e9465099a21c8e2d9c5d6ca2606"}, | ||||
|     {file = "coverage-6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab4fc4b866b279740e0d917402f0e9a08683e002f43fa408e9655818ed392196"}, | ||||
|     {file = "coverage-6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8582e9280f8d0f38114fe95a92ae8d0790b56b099d728cc4f8a2e14b1c4a18c"}, | ||||
|     {file = "coverage-6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c72bb4679283c6737f452eeb9b2a0e570acaef2197ad255fb20162adc80bea76"}, | ||||
|     {file = "coverage-6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca29c352389ea27a24c79acd117abdd8a865c6eb01576b6f0990cd9a4e9c9f48"}, | ||||
|     {file = "coverage-6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:152cc2624381df4e4e604e21bd8e95eb8059535f7b768c1fb8b8ae0b26f47ab0"}, | ||||
|     {file = "coverage-6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:51372e24b1f7143ee2df6b45cff6a721f3abe93b1e506196f3ffa4155c2497f7"}, | ||||
|     {file = "coverage-6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:72d9d186508325a456475dd05b1756f9a204c7086b07fffb227ef8cee03b1dc2"}, | ||||
|     {file = "coverage-6.3-cp39-cp39-win32.whl", hash = "sha256:649df3641eb351cdfd0d5533c92fc9df507b6b2bf48a7ef8c71ab63cbc7b5c3c"}, | ||||
|     {file = "coverage-6.3-cp39-cp39-win_amd64.whl", hash = "sha256:e67ccd53da5958ea1ec833a160b96357f90859c220a00150de011b787c27b98d"}, | ||||
|     {file = "coverage-6.3-pp36.pp37.pp38-none-any.whl", hash = "sha256:27ac7cb84538e278e07569ceaaa6f807a029dc194b1c819a9820b9bb5dbf63ab"}, | ||||
|     {file = "coverage-6.3.tar.gz", hash = "sha256:987a84ff98a309994ca77ed3cc4b92424f824278e48e4bf7d1bb79a63cfe2099"}, | ||||
| ] | ||||
| cryptography = [ | ||||
|     {file = "cryptography-36.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:73bc2d3f2444bcfeac67dd130ff2ea598ea5f20b40e36d19821b4df8c9c5037b"}, | ||||
| @ -3245,8 +3250,8 @@ selenium = [ | ||||
|     {file = "selenium-4.1.0-py3-none-any.whl", hash = "sha256:27e7b64df961d609f3d57237caa0df123abbbe22d038f2ec9e332fb90ec1a939"}, | ||||
| ] | ||||
| sentry-sdk = [ | ||||
|     {file = "sentry-sdk-1.5.3.tar.gz", hash = "sha256:141da032f0fa4c56f9af6b361fda57360af1789576285bd1944561f9c274f9c0"}, | ||||
|     {file = "sentry_sdk-1.5.3-py2.py3-none-any.whl", hash = "sha256:9aeff2a47f4038460296b920bf4d269284e8454e1c67547ee002ccafd9c2442b"}, | ||||
|     {file = "sentry-sdk-1.5.4.tar.gz", hash = "sha256:f7e54567937ebcbe938c4df1075ec891587faeb7c74184b88cf2894e47c86116"}, | ||||
|     {file = "sentry_sdk-1.5.4-py2.py3-none-any.whl", hash = "sha256:4fc7960a82c95d906a0514cf4d9aacba1743eb9863a5b7c2a01c525a7d9b21e6"}, | ||||
| ] | ||||
| service-identity = [ | ||||
|     {file = "service-identity-21.1.0.tar.gz", hash = "sha256:6e6c6086ca271dc11b033d17c3a8bea9f24ebff920c587da090afc9519419d34"}, | ||||
| @ -3386,8 +3391,8 @@ urllib3 = [ | ||||
|     {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"}, | ||||
| ] | ||||
| uvicorn = [ | ||||
|     {file = "uvicorn-0.17.0-py3-none-any.whl", hash = "sha256:0b89c91bb8fe84c4bded9996af13c4b8c0de799d29bffeaa0c8ad298f2be0934"}, | ||||
|     {file = "uvicorn-0.17.0.tar.gz", hash = "sha256:192c2422b056a3beb512c6c260bf77a7a884204a4ae41856719c1913ead63bbb"}, | ||||
|     {file = "uvicorn-0.17.0.post1-py3-none-any.whl", hash = "sha256:fa166e6c3d58e23ff5a1a3543b079c7b28aa057ab1388201e4b34a49ec05da72"}, | ||||
|     {file = "uvicorn-0.17.0.post1.tar.gz", hash = "sha256:60a149248181920a73b2e97aec1dacec5501618867f041a228b2519d91a62a91"}, | ||||
| ] | ||||
| uvloop = [ | ||||
|     {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, | ||||
|  | ||||
| @ -92,7 +92,7 @@ addopts = "-p no:celery --junitxml=unittest.xml" | ||||
|  | ||||
| [tool.poetry] | ||||
| name = "authentik" | ||||
| version = "2022.1.2" | ||||
| version = "2022.1.3" | ||||
| description = "" | ||||
| authors = ["Jens Langhammer <jens.langhammer@beryju.org>"] | ||||
|  | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| openapi: 3.0.3 | ||||
| info: | ||||
|   title: authentik | ||||
|   version: 2022.1.2 | ||||
|   version: 2022.1.3 | ||||
|   description: Making authentication simple. | ||||
|   contact: | ||||
|     email: hello@beryju.org | ||||
|  | ||||
							
								
								
									
										514
									
								
								web/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										514
									
								
								web/package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -14,14 +14,14 @@ | ||||
|                 "@babel/plugin-transform-runtime": "^7.16.10", | ||||
|                 "@babel/preset-env": "^7.16.11", | ||||
|                 "@babel/preset-typescript": "^7.16.7", | ||||
|                 "@formatjs/intl-listformat": "^6.5.0", | ||||
|                 "@formatjs/intl-listformat": "^6.5.1", | ||||
|                 "@fortawesome/fontawesome-free": "^5.15.4", | ||||
|                 "@goauthentik/api": "^2022.1.1-1642874681", | ||||
|                 "@goauthentik/api": "^2022.1.2-1643057053", | ||||
|                 "@jackfranklin/rollup-plugin-markdown": "^0.3.0", | ||||
|                 "@lingui/cli": "^3.13.1", | ||||
|                 "@lingui/core": "^3.13.1", | ||||
|                 "@lingui/detect-locale": "^3.13.1", | ||||
|                 "@lingui/macro": "^3.13.1", | ||||
|                 "@lingui/cli": "^3.13.2", | ||||
|                 "@lingui/core": "^3.13.2", | ||||
|                 "@lingui/detect-locale": "^3.13.2", | ||||
|                 "@lingui/macro": "^3.13.2", | ||||
|                 "@patternfly/patternfly": "^4.164.2", | ||||
|                 "@polymer/iron-form": "^3.0.1", | ||||
|                 "@polymer/paper-input": "^3.2.1", | ||||
| @ -30,15 +30,15 @@ | ||||
|                 "@rollup/plugin-node-resolve": "^13.1.3", | ||||
|                 "@rollup/plugin-replace": "^3.0.1", | ||||
|                 "@rollup/plugin-typescript": "^8.3.0", | ||||
|                 "@sentry/browser": "^6.16.1", | ||||
|                 "@sentry/tracing": "^6.16.1", | ||||
|                 "@sentry/browser": "^6.17.2", | ||||
|                 "@sentry/tracing": "^6.17.2", | ||||
|                 "@squoosh/cli": "^0.7.2", | ||||
|                 "@trivago/prettier-plugin-sort-imports": "^3.1.1", | ||||
|                 "@types/chart.js": "^2.9.35", | ||||
|                 "@types/codemirror": "5.60.5", | ||||
|                 "@types/grecaptcha": "^3.0.3", | ||||
|                 "@typescript-eslint/eslint-plugin": "^5.10.0", | ||||
|                 "@typescript-eslint/parser": "^5.10.0", | ||||
|                 "@typescript-eslint/eslint-plugin": "^5.10.1", | ||||
|                 "@typescript-eslint/parser": "^5.10.1", | ||||
|                 "@webcomponents/webcomponentsjs": "^2.6.0", | ||||
|                 "babel-plugin-macros": "^3.1.0", | ||||
|                 "base64-js": "^1.5.1", | ||||
| @ -46,18 +46,18 @@ | ||||
|                 "chartjs-adapter-moment": "^1.0.0", | ||||
|                 "codemirror": "^5.65.1", | ||||
|                 "construct-style-sheets-polyfill": "^3.0.5", | ||||
|                 "country-flag-icons": "^1.4.19", | ||||
|                 "country-flag-icons": "^1.4.20", | ||||
|                 "eslint": "^8.7.0", | ||||
|                 "eslint-config-google": "^0.14.0", | ||||
|                 "eslint-plugin-custom-elements": "0.0.4", | ||||
|                 "eslint-plugin-lit": "^1.6.1", | ||||
|                 "flowchart.js": "^1.17.0", | ||||
|                 "fuse.js": "^6.5.3", | ||||
|                 "lit": "^2.1.1", | ||||
|                 "lit": "^2.1.2", | ||||
|                 "moment": "^2.29.1", | ||||
|                 "prettier": "^2.5.1", | ||||
|                 "rapidoc": "^9.1.4", | ||||
|                 "rollup": "^2.66.0", | ||||
|                 "rollup": "^2.66.1", | ||||
|                 "rollup-plugin-copy": "^3.4.0", | ||||
|                 "rollup-plugin-cssimport": "^1.0.2", | ||||
|                 "rollup-plugin-minify-html-literals": "^1.2.6", | ||||
| @ -1717,28 +1717,28 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@formatjs/ecma402-abstract": { | ||||
|             "version": "1.11.1", | ||||
|             "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.1.tgz", | ||||
|             "integrity": "sha512-tgtNODZUGuUI6PAcnvaLZpGrZLVkXnnAvgzOiueYMzFdOdcOw4iH1WKhCe3+r6VR8rHKToJ2HksUGNCB+zt/bg==", | ||||
|             "version": "1.11.2", | ||||
|             "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.2.tgz", | ||||
|             "integrity": "sha512-qDgOL0vtfJ51cc0pRbFB/oXc4qDbamG22Z6h/QWy6FBxaQgppiy8JF0iYbmNO35cC8r88bQGsgfd/eM6/eTEQQ==", | ||||
|             "dependencies": { | ||||
|                 "@formatjs/intl-localematcher": "0.2.22", | ||||
|                 "@formatjs/intl-localematcher": "0.2.23", | ||||
|                 "tslib": "^2.1.0" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@formatjs/intl-listformat": { | ||||
|             "version": "6.5.0", | ||||
|             "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-6.5.0.tgz", | ||||
|             "integrity": "sha512-gVyAV5QWWtq84MK4cAyJITW+Wb74c2+FT+wa8jhSPxXUky9B5z/k/Ff7or4Vb3KV0YYZuVBQ/vMIoD8Gr182ww==", | ||||
|             "version": "6.5.1", | ||||
|             "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-6.5.1.tgz", | ||||
|             "integrity": "sha512-ijsOM7J7aNnGx+1JYUGWgMAcisnK0CxdlPx7KJpUXKj9Mf2Ph28H2WMTL1h1xv9T7SSvH0Nd6asI0Qw4ffw17w==", | ||||
|             "dependencies": { | ||||
|                 "@formatjs/ecma402-abstract": "1.11.1", | ||||
|                 "@formatjs/intl-localematcher": "0.2.22", | ||||
|                 "@formatjs/ecma402-abstract": "1.11.2", | ||||
|                 "@formatjs/intl-localematcher": "0.2.23", | ||||
|                 "tslib": "^2.1.0" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@formatjs/intl-localematcher": { | ||||
|             "version": "0.2.22", | ||||
|             "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.22.tgz", | ||||
|             "integrity": "sha512-z+TvbHW8Q/g2l7/PnfUl0mV9gWxV4d0HT6GQyzkO5QI6QjCvCZGiztnmLX7zoyS16uSMvZ2PoMDfSK9xvZkRRA==", | ||||
|             "version": "0.2.23", | ||||
|             "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.23.tgz", | ||||
|             "integrity": "sha512-oCe2TOciTtB1bEbJ85EvYrXQxD0epusmVJfJ7AduO0tlbXP42CmDIYIH2CZ+kP2GE+PTLQD1Hbt9kpOpl939MQ==", | ||||
|             "dependencies": { | ||||
|                 "tslib": "^2.1.0" | ||||
|             } | ||||
| @ -1753,9 +1753,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@goauthentik/api": { | ||||
|             "version": "2022.1.1-1642874681", | ||||
|             "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2022.1.1-1642874681.tgz", | ||||
|             "integrity": "sha512-MOFu1g/5dvQu+BTj8qqc2IMT9fpBICqzERkC949JiDxDSqHg0kuqmxe23vPnFceryQM5zktTBJ+VxXjzR9lX3g==" | ||||
|             "version": "2022.1.2-1643057053", | ||||
|             "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2022.1.2-1643057053.tgz", | ||||
|             "integrity": "sha512-UWi49e9KodhubB4zOYHdf+Kwm7Skn6Z4J1EDI3Stu2SDQfsQlU0U4NrOfKnaD7WI6QVjzAK/K+6+bODSQQtOmw==" | ||||
|         }, | ||||
|         "node_modules/@humanwhocodes/config-array": { | ||||
|             "version": "0.9.2", | ||||
| @ -1865,13 +1865,13 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@lingui/babel-plugin-extract-messages": { | ||||
|             "version": "3.13.1", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.13.1.tgz", | ||||
|             "integrity": "sha512-K0ekhQI49ZTE90bVxvndqdxO80X1ZjacVdznWn4RJq6EEN9ElppMKkWUmAe/vfHGJRCH/2aUIp73xvaXPJPbGg==", | ||||
|             "version": "3.13.2", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.13.2.tgz", | ||||
|             "integrity": "sha512-SyvwfrPqkyj9XM2CB/YK25o0Zi+B8ikoCENwqNSk7201n80YfOJoksc6lQ3X/QODqvy+iuOsiQrVT3qzKblOmg==", | ||||
|             "dependencies": { | ||||
|                 "@babel/generator": "^7.11.6", | ||||
|                 "@babel/runtime": "^7.11.2", | ||||
|                 "@lingui/conf": "^3.13.1", | ||||
|                 "@lingui/conf": "^3.13.2", | ||||
|                 "mkdirp": "^1.0.4" | ||||
|             }, | ||||
|             "engines": { | ||||
| @ -1879,17 +1879,17 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@lingui/cli": { | ||||
|             "version": "3.13.1", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-3.13.1.tgz", | ||||
|             "integrity": "sha512-JGfbdAn1qxHBjuhnLeERMhCLe7UXSFafqq9S//g3+VNHKHfVHfa0CKFUmISMDKMLFdKmbdJCZpYU3DRZNrUGyQ==", | ||||
|             "version": "3.13.2", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-3.13.2.tgz", | ||||
|             "integrity": "sha512-wPYlsKI7hx1hyntc6enUVUdKVwBM8XW+DnwHslWWw4ShMNvh98gLgAOW1ajXtUym7x0WTjhR+/s436hdxfZ/Og==", | ||||
|             "dependencies": { | ||||
|                 "@babel/generator": "^7.11.6", | ||||
|                 "@babel/parser": "^7.11.5", | ||||
|                 "@babel/plugin-syntax-jsx": "^7.10.4", | ||||
|                 "@babel/runtime": "^7.11.2", | ||||
|                 "@babel/types": "^7.11.5", | ||||
|                 "@lingui/babel-plugin-extract-messages": "^3.13.1", | ||||
|                 "@lingui/conf": "^3.13.1", | ||||
|                 "@lingui/babel-plugin-extract-messages": "^3.13.2", | ||||
|                 "@lingui/conf": "^3.13.2", | ||||
|                 "babel-plugin-macros": "^3.0.1", | ||||
|                 "bcp-47": "^1.0.7", | ||||
|                 "chalk": "^4.1.0", | ||||
| @ -1992,9 +1992,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@lingui/conf": { | ||||
|             "version": "3.13.1", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-3.13.1.tgz", | ||||
|             "integrity": "sha512-xWJVdgNiGqYzkYIxHg4c6KqSNleN5/96M2ly+GzBOmA5H75r4hz27DfQpxuC4FuBUAPC+Mk1HTBO9/aFO0BCZg==", | ||||
|             "version": "3.13.2", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-3.13.2.tgz", | ||||
|             "integrity": "sha512-JhiIBxnh2X4QmLP0/+dnTBc7xnZ6qk5MRsQtJqkEOWGFl09CTrha5uPVqjr5MgkmBOQ6Q8+cRYWG+qtJsuUH5A==", | ||||
|             "dependencies": { | ||||
|                 "@babel/runtime": "^7.11.2", | ||||
|                 "@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2", | ||||
| @ -2072,9 +2072,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@lingui/core": { | ||||
|             "version": "3.13.1", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/core/-/core-3.13.1.tgz", | ||||
|             "integrity": "sha512-spzRJ/fca9Ddpns27Xmz2f9lgiesrvTZjcpOO2wKJq9QozF1qtv7n1bViQ1Erh2uFaO0kaEzUjkAYU3LtlP4PQ==", | ||||
|             "version": "3.13.2", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/core/-/core-3.13.2.tgz", | ||||
|             "integrity": "sha512-ic1uC+bS7hpfM4oVugHKel8UhlLAwykSv2TYw3oyeEQhvCS232nSzh+PFbP0BXK1hZ0UdHve7mODpgADuwHIQA==", | ||||
|             "dependencies": { | ||||
|                 "@babel/runtime": "^7.11.2", | ||||
|                 "make-plural": "^6.2.2", | ||||
| @ -2085,20 +2085,20 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@lingui/detect-locale": { | ||||
|             "version": "3.13.1", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/detect-locale/-/detect-locale-3.13.1.tgz", | ||||
|             "integrity": "sha512-ZY/jo3whJ5+QlkpUjZgXzzmON6vA9s0qbXgsKue6xIEOGZ7/z5p05tnHb8RYa6jhpRSYN+CJARx2H82QZMrtwA==", | ||||
|             "version": "3.13.2", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/detect-locale/-/detect-locale-3.13.2.tgz", | ||||
|             "integrity": "sha512-1fouly1ecq1wCKUGtYgFn0Hdsjuz4bBYxh/oIjrqEeb4+bKdjaHbCT2ypsX7rRxs88yOfOWGUYuuzG0EoJXiSw==", | ||||
|             "engines": { | ||||
|                 "node": ">=10.0.0" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@lingui/macro": { | ||||
|             "version": "3.13.1", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-3.13.1.tgz", | ||||
|             "integrity": "sha512-iXdAbREJpIUs3s78Erbg+7ZRuJsD0S0nyGCeEo9Ml/NDO/MtVYo7XCHecwtCdNxDe/h0NItB3m/7uPZ/BvOLOA==", | ||||
|             "version": "3.13.2", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-3.13.2.tgz", | ||||
|             "integrity": "sha512-0BdybZkBq8bl4NrT8txX7k8BodyJ/4uQbMIK0ucPJvQ/6Lhj824CodBq5KuMWpcXoMSxUWjQIkIGr1Fi1ckLGg==", | ||||
|             "dependencies": { | ||||
|                 "@babel/runtime": "^7.11.2", | ||||
|                 "@lingui/conf": "^3.13.1", | ||||
|                 "@lingui/conf": "^3.13.2", | ||||
|                 "ramda": "^0.27.1" | ||||
|             }, | ||||
|             "engines": { | ||||
| @ -2433,13 +2433,13 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@sentry/browser": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.16.1.tgz", | ||||
|             "integrity": "sha512-F2I5RL7RTLQF9CccMrqt73GRdK3FdqaChED3RulGQX5lH6U3exHGFxwyZxSrY4x6FedfBFYlfXWWCJXpLnFkow==", | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.17.2.tgz", | ||||
|             "integrity": "sha512-4Ow5z9GxK5dG9+stBNKb7s6NoxE4wgEcHRmO66QTK4gH2NNmzV4R/aaZ7iDoS/lD86sH0M86jm76dpg9uiJPmw==", | ||||
|             "dependencies": { | ||||
|                 "@sentry/core": "6.16.1", | ||||
|                 "@sentry/types": "6.16.1", | ||||
|                 "@sentry/utils": "6.16.1", | ||||
|                 "@sentry/core": "6.17.2", | ||||
|                 "@sentry/types": "6.17.2", | ||||
|                 "@sentry/utils": "6.17.2", | ||||
|                 "tslib": "^1.9.3" | ||||
|             }, | ||||
|             "engines": { | ||||
| @ -2452,14 +2452,14 @@ | ||||
|             "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" | ||||
|         }, | ||||
|         "node_modules/@sentry/core": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.16.1.tgz", | ||||
|             "integrity": "sha512-UFI0264CPUc5cR1zJH+S2UPOANpm6dLJOnsvnIGTjsrwzR0h8Hdl6rC2R/GPq+WNbnipo9hkiIwDlqbqvIU5vw==", | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.17.2.tgz", | ||||
|             "integrity": "sha512-Uew0CNMr+QvowrF4EJYjOUgHep/sZJ3l5zevPEELugIgqWBodd+ZDCV3fQFR7cr6KOqx1rMgVrgcKIkLl0l+RA==", | ||||
|             "dependencies": { | ||||
|                 "@sentry/hub": "6.16.1", | ||||
|                 "@sentry/minimal": "6.16.1", | ||||
|                 "@sentry/types": "6.16.1", | ||||
|                 "@sentry/utils": "6.16.1", | ||||
|                 "@sentry/hub": "6.17.2", | ||||
|                 "@sentry/minimal": "6.17.2", | ||||
|                 "@sentry/types": "6.17.2", | ||||
|                 "@sentry/utils": "6.17.2", | ||||
|                 "tslib": "^1.9.3" | ||||
|             }, | ||||
|             "engines": { | ||||
| @ -2472,12 +2472,12 @@ | ||||
|             "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" | ||||
|         }, | ||||
|         "node_modules/@sentry/hub": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.16.1.tgz", | ||||
|             "integrity": "sha512-4PGtg6AfpqMkreTpL7ymDeQ/U1uXv03bKUuFdtsSTn/FRf9TLS4JB0KuTZCxfp1IRgAA+iFg6B784dDkT8R9eg==", | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.17.2.tgz", | ||||
|             "integrity": "sha512-CMi6jU920bTwRTmGHjP4u8toOx4gm1dsx+rsxvp+FKzqRwpwoyi9mOw8oEYERVzaqaYceGdFylyRUrjdf0f77g==", | ||||
|             "dependencies": { | ||||
|                 "@sentry/types": "6.16.1", | ||||
|                 "@sentry/utils": "6.16.1", | ||||
|                 "@sentry/types": "6.17.2", | ||||
|                 "@sentry/utils": "6.17.2", | ||||
|                 "tslib": "^1.9.3" | ||||
|             }, | ||||
|             "engines": { | ||||
| @ -2490,12 +2490,12 @@ | ||||
|             "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" | ||||
|         }, | ||||
|         "node_modules/@sentry/minimal": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.16.1.tgz", | ||||
|             "integrity": "sha512-dq+mI1EQIvUM+zJtGCVgH3/B3Sbx4hKlGf2Usovm9KoqWYA+QpfVBholYDe/H2RXgO7LFEefDLvOdHDkqeJoyA==", | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.17.2.tgz", | ||||
|             "integrity": "sha512-Cdh+iM6QhLKfxwUWWP4mk2K7+EsQj4tuF2dGQke4Zcbp7zQ7wbcMruUcZHiZfvg5kiSYxwNVkH7cXMzcO7AJsg==", | ||||
|             "dependencies": { | ||||
|                 "@sentry/hub": "6.16.1", | ||||
|                 "@sentry/types": "6.16.1", | ||||
|                 "@sentry/hub": "6.17.2", | ||||
|                 "@sentry/types": "6.17.2", | ||||
|                 "tslib": "^1.9.3" | ||||
|             }, | ||||
|             "engines": { | ||||
| @ -2508,14 +2508,14 @@ | ||||
|             "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" | ||||
|         }, | ||||
|         "node_modules/@sentry/tracing": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.16.1.tgz", | ||||
|             "integrity": "sha512-MPSbqXX59P+OEeST+U2V/8Hu/8QjpTUxTNeNyTHWIbbchdcMMjDbXTS3etCgajZR6Ro+DHElOz5cdSxH6IBGlA==", | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.17.2.tgz", | ||||
|             "integrity": "sha512-oWY2Ga+5D5f90utvfF2Y0eQvme+eS768ZWjR+klRYgZWoY8r1v8uWwWsvroYU1g+h6X0G/xh3giFjsdOWtRENw==", | ||||
|             "dependencies": { | ||||
|                 "@sentry/hub": "6.16.1", | ||||
|                 "@sentry/minimal": "6.16.1", | ||||
|                 "@sentry/types": "6.16.1", | ||||
|                 "@sentry/utils": "6.16.1", | ||||
|                 "@sentry/hub": "6.17.2", | ||||
|                 "@sentry/minimal": "6.17.2", | ||||
|                 "@sentry/types": "6.17.2", | ||||
|                 "@sentry/utils": "6.17.2", | ||||
|                 "tslib": "^1.9.3" | ||||
|             }, | ||||
|             "engines": { | ||||
| @ -2528,19 +2528,19 @@ | ||||
|             "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" | ||||
|         }, | ||||
|         "node_modules/@sentry/types": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.16.1.tgz", | ||||
|             "integrity": "sha512-Wh354g30UsJ5kYJbercektGX4ZMc9MHU++1NjeN2bTMnbofEcpUDWIiKeulZEY65IC1iU+1zRQQgtYO+/hgCUQ==", | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.17.2.tgz", | ||||
|             "integrity": "sha512-UrFLRDz5mn253O8k/XftLxoldF+NyZdkqKLGIQmST5HEVr7ub9nQJ4Y5ZFA3zJYWpraaW8faIbuw+pgetC8hmQ==", | ||||
|             "engines": { | ||||
|                 "node": ">=6" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@sentry/utils": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.16.1.tgz", | ||||
|             "integrity": "sha512-7ngq/i4R8JZitJo9Sl8PDnjSbDehOxgr1vsoMmerIsyRZ651C/8B+jVkMhaAPgSdyJ0AlE3O7DKKTP1FXFw9qw==", | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.17.2.tgz", | ||||
|             "integrity": "sha512-ePWtO44KJQwUULOiU86fa1WU3Ird2TH0i39gqB2d3zNS3QyVp9qPlzSdPKSPJ9LdgadzBHw7ikEuE+GY8JTrhA==", | ||||
|             "dependencies": { | ||||
|                 "@sentry/types": "6.16.1", | ||||
|                 "@sentry/types": "6.17.2", | ||||
|                 "tslib": "^1.9.3" | ||||
|             }, | ||||
|             "engines": { | ||||
| @ -2844,13 +2844,13 @@ | ||||
|             "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" | ||||
|         }, | ||||
|         "node_modules/@typescript-eslint/eslint-plugin": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", | ||||
|             "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.1.tgz", | ||||
|             "integrity": "sha512-xN3CYqFlyE/qOcy978/L0xLR2HlcAGIyIK5sMOasxaaAPfQRj/MmMV6OC3I7NZO84oEUdWCOju34Z9W8E0pFDQ==", | ||||
|             "dependencies": { | ||||
|                 "@typescript-eslint/scope-manager": "5.10.0", | ||||
|                 "@typescript-eslint/type-utils": "5.10.0", | ||||
|                 "@typescript-eslint/utils": "5.10.0", | ||||
|                 "@typescript-eslint/scope-manager": "5.10.1", | ||||
|                 "@typescript-eslint/type-utils": "5.10.1", | ||||
|                 "@typescript-eslint/utils": "5.10.1", | ||||
|                 "debug": "^4.3.2", | ||||
|                 "functional-red-black-tree": "^1.0.1", | ||||
|                 "ignore": "^5.1.8", | ||||
| @ -2898,13 +2898,13 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@typescript-eslint/parser": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz", | ||||
|             "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.1.tgz", | ||||
|             "integrity": "sha512-GReo3tjNBwR5RnRO0K2wDIDN31cM3MmDtgyQ85oAxAmC5K3j/g85IjP+cDfcqDsDDBf1HNKQAD0WqOYL8jXqUA==", | ||||
|             "dependencies": { | ||||
|                 "@typescript-eslint/scope-manager": "5.10.0", | ||||
|                 "@typescript-eslint/types": "5.10.0", | ||||
|                 "@typescript-eslint/typescript-estree": "5.10.0", | ||||
|                 "@typescript-eslint/scope-manager": "5.10.1", | ||||
|                 "@typescript-eslint/types": "5.10.1", | ||||
|                 "@typescript-eslint/typescript-estree": "5.10.1", | ||||
|                 "debug": "^4.3.2" | ||||
|             }, | ||||
|             "engines": { | ||||
| @ -2924,12 +2924,12 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@typescript-eslint/scope-manager": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz", | ||||
|             "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.1.tgz", | ||||
|             "integrity": "sha512-Lyvi559Gvpn94k7+ElXNMEnXu/iundV5uFmCUNnftbFrUbAJ1WBoaGgkbOBm07jVZa682oaBU37ao/NGGX4ZDg==", | ||||
|             "dependencies": { | ||||
|                 "@typescript-eslint/types": "5.10.0", | ||||
|                 "@typescript-eslint/visitor-keys": "5.10.0" | ||||
|                 "@typescript-eslint/types": "5.10.1", | ||||
|                 "@typescript-eslint/visitor-keys": "5.10.1" | ||||
|             }, | ||||
|             "engines": { | ||||
|                 "node": "^12.22.0 || ^14.17.0 || >=16.0.0" | ||||
| @ -2940,11 +2940,11 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@typescript-eslint/type-utils": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz", | ||||
|             "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.1.tgz", | ||||
|             "integrity": "sha512-AfVJkV8uck/UIoDqhu+ptEdBoQATON9GXnhOpPLzkQRJcSChkvD//qsz9JVffl2goxX+ybs5klvacE9vmrQyCw==", | ||||
|             "dependencies": { | ||||
|                 "@typescript-eslint/utils": "5.10.0", | ||||
|                 "@typescript-eslint/utils": "5.10.1", | ||||
|                 "debug": "^4.3.2", | ||||
|                 "tsutils": "^3.21.0" | ||||
|             }, | ||||
| @ -2965,9 +2965,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@typescript-eslint/types": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", | ||||
|             "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.1.tgz", | ||||
|             "integrity": "sha512-ZvxQ2QMy49bIIBpTqFiOenucqUyjTQ0WNLhBM6X1fh1NNlYAC6Kxsx8bRTY3jdYsYg44a0Z/uEgQkohbR0H87Q==", | ||||
|             "engines": { | ||||
|                 "node": "^12.22.0 || ^14.17.0 || >=16.0.0" | ||||
|             }, | ||||
| @ -2977,12 +2977,12 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@typescript-eslint/typescript-estree": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", | ||||
|             "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.1.tgz", | ||||
|             "integrity": "sha512-PwIGnH7jIueXv4opcwEbVGDATjGPO1dx9RkUl5LlHDSe+FXxPwFL5W/qYd5/NHr7f6lo/vvTrAzd0KlQtRusJQ==", | ||||
|             "dependencies": { | ||||
|                 "@typescript-eslint/types": "5.10.0", | ||||
|                 "@typescript-eslint/visitor-keys": "5.10.0", | ||||
|                 "@typescript-eslint/types": "5.10.1", | ||||
|                 "@typescript-eslint/visitor-keys": "5.10.1", | ||||
|                 "debug": "^4.3.2", | ||||
|                 "globby": "^11.0.4", | ||||
|                 "is-glob": "^4.0.3", | ||||
| @ -3017,14 +3017,14 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@typescript-eslint/utils": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz", | ||||
|             "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.1.tgz", | ||||
|             "integrity": "sha512-RRmlITiUbLuTRtn/gcPRi4202niF+q7ylFLCKu4c+O/PcpRvZ/nAUwQ2G00bZgpWkhrNLNnvhZLbDn8Ml0qsQw==", | ||||
|             "dependencies": { | ||||
|                 "@types/json-schema": "^7.0.9", | ||||
|                 "@typescript-eslint/scope-manager": "5.10.0", | ||||
|                 "@typescript-eslint/types": "5.10.0", | ||||
|                 "@typescript-eslint/typescript-estree": "5.10.0", | ||||
|                 "@typescript-eslint/scope-manager": "5.10.1", | ||||
|                 "@typescript-eslint/types": "5.10.1", | ||||
|                 "@typescript-eslint/typescript-estree": "5.10.1", | ||||
|                 "eslint-scope": "^5.1.1", | ||||
|                 "eslint-utils": "^3.0.0" | ||||
|             }, | ||||
| @ -3040,11 +3040,11 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@typescript-eslint/visitor-keys": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", | ||||
|             "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.1.tgz", | ||||
|             "integrity": "sha512-NjQ0Xinhy9IL979tpoTRuLKxMc0zJC7QVSdeerXs2/QvOy2yRkzX5dRb10X5woNUdJgU8G3nYRDlI33sq1K4YQ==", | ||||
|             "dependencies": { | ||||
|                 "@typescript-eslint/types": "5.10.0", | ||||
|                 "@typescript-eslint/types": "5.10.1", | ||||
|                 "eslint-visitor-keys": "^3.0.0" | ||||
|             }, | ||||
|             "engines": { | ||||
| @ -3909,9 +3909,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/country-flag-icons": { | ||||
|             "version": "1.4.19", | ||||
|             "resolved": "https://registry.npmjs.org/country-flag-icons/-/country-flag-icons-1.4.19.tgz", | ||||
|             "integrity": "sha512-1hmXFJ4UURQt0Ex0990B7oOL4n9KLpT9NOSEmZoYh+/5DQ7/pikyqaptqCLUFFv/bYHyvYFeo0fqV82XxU6VOA==" | ||||
|             "version": "1.4.20", | ||||
|             "resolved": "https://registry.npmjs.org/country-flag-icons/-/country-flag-icons-1.4.20.tgz", | ||||
|             "integrity": "sha512-f9/cO9IEDIkLdOQeTUMDLEWMcDk4qbTRjbQLpy5pm+yil7Fa7QkKxgiMOQ2z1+Jht8/BAD3JJAmPG4qtK/tbUw==" | ||||
|         }, | ||||
|         "node_modules/create-require": { | ||||
|             "version": "1.1.1", | ||||
| @ -5782,9 +5782,9 @@ | ||||
|             "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" | ||||
|         }, | ||||
|         "node_modules/lit": { | ||||
|             "version": "2.1.1", | ||||
|             "resolved": "https://registry.npmjs.org/lit/-/lit-2.1.1.tgz", | ||||
|             "integrity": "sha512-yqDqf36IhXwOxIQSFqCMgpfvDCRdxLCLZl7m/+tO5C9W/OBHUj17qZpiMBT35v97QMVKcKEi1KZ3hZRyTwBNsQ==", | ||||
|             "version": "2.1.2", | ||||
|             "resolved": "https://registry.npmjs.org/lit/-/lit-2.1.2.tgz", | ||||
|             "integrity": "sha512-XacK89dJXF7BJbpiZSMvzT4RxHag7Wt+yNx7tErEVgGVlOFAeN871bj7ivotCMgYeBFWVp/hjKF/PDTk6L7gMA==", | ||||
|             "dependencies": { | ||||
|                 "@lit/reactive-element": "^1.1.0", | ||||
|                 "lit-element": "^3.1.0", | ||||
| @ -7308,9 +7308,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/rollup": { | ||||
|             "version": "2.66.0", | ||||
|             "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.0.tgz", | ||||
|             "integrity": "sha512-L6mKOkdyP8HK5kKJXaiWG7KZDumPJjuo1P+cfyHOJPNNTK3Moe7zCH5+fy7v8pVmHXtlxorzaBjvkBMB23s98g==", | ||||
|             "version": "2.66.1", | ||||
|             "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.1.tgz", | ||||
|             "integrity": "sha512-crSgLhSkLMnKr4s9iZ/1qJCplgAgrRY+igWv8KhG/AjKOJ0YX/WpmANyn8oxrw+zenF3BXWDLa7Xl/QZISH+7w==", | ||||
|             "bin": { | ||||
|                 "rollup": "dist/bin/rollup" | ||||
|             }, | ||||
| @ -10026,28 +10026,28 @@ | ||||
|             } | ||||
|         }, | ||||
|         "@formatjs/ecma402-abstract": { | ||||
|             "version": "1.11.1", | ||||
|             "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.1.tgz", | ||||
|             "integrity": "sha512-tgtNODZUGuUI6PAcnvaLZpGrZLVkXnnAvgzOiueYMzFdOdcOw4iH1WKhCe3+r6VR8rHKToJ2HksUGNCB+zt/bg==", | ||||
|             "version": "1.11.2", | ||||
|             "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.2.tgz", | ||||
|             "integrity": "sha512-qDgOL0vtfJ51cc0pRbFB/oXc4qDbamG22Z6h/QWy6FBxaQgppiy8JF0iYbmNO35cC8r88bQGsgfd/eM6/eTEQQ==", | ||||
|             "requires": { | ||||
|                 "@formatjs/intl-localematcher": "0.2.22", | ||||
|                 "@formatjs/intl-localematcher": "0.2.23", | ||||
|                 "tslib": "^2.1.0" | ||||
|             } | ||||
|         }, | ||||
|         "@formatjs/intl-listformat": { | ||||
|             "version": "6.5.0", | ||||
|             "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-6.5.0.tgz", | ||||
|             "integrity": "sha512-gVyAV5QWWtq84MK4cAyJITW+Wb74c2+FT+wa8jhSPxXUky9B5z/k/Ff7or4Vb3KV0YYZuVBQ/vMIoD8Gr182ww==", | ||||
|             "version": "6.5.1", | ||||
|             "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-6.5.1.tgz", | ||||
|             "integrity": "sha512-ijsOM7J7aNnGx+1JYUGWgMAcisnK0CxdlPx7KJpUXKj9Mf2Ph28H2WMTL1h1xv9T7SSvH0Nd6asI0Qw4ffw17w==", | ||||
|             "requires": { | ||||
|                 "@formatjs/ecma402-abstract": "1.11.1", | ||||
|                 "@formatjs/intl-localematcher": "0.2.22", | ||||
|                 "@formatjs/ecma402-abstract": "1.11.2", | ||||
|                 "@formatjs/intl-localematcher": "0.2.23", | ||||
|                 "tslib": "^2.1.0" | ||||
|             } | ||||
|         }, | ||||
|         "@formatjs/intl-localematcher": { | ||||
|             "version": "0.2.22", | ||||
|             "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.22.tgz", | ||||
|             "integrity": "sha512-z+TvbHW8Q/g2l7/PnfUl0mV9gWxV4d0HT6GQyzkO5QI6QjCvCZGiztnmLX7zoyS16uSMvZ2PoMDfSK9xvZkRRA==", | ||||
|             "version": "0.2.23", | ||||
|             "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.23.tgz", | ||||
|             "integrity": "sha512-oCe2TOciTtB1bEbJ85EvYrXQxD0epusmVJfJ7AduO0tlbXP42CmDIYIH2CZ+kP2GE+PTLQD1Hbt9kpOpl939MQ==", | ||||
|             "requires": { | ||||
|                 "tslib": "^2.1.0" | ||||
|             } | ||||
| @ -10058,9 +10058,9 @@ | ||||
|             "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==" | ||||
|         }, | ||||
|         "@goauthentik/api": { | ||||
|             "version": "2022.1.1-1642874681", | ||||
|             "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2022.1.1-1642874681.tgz", | ||||
|             "integrity": "sha512-MOFu1g/5dvQu+BTj8qqc2IMT9fpBICqzERkC949JiDxDSqHg0kuqmxe23vPnFceryQM5zktTBJ+VxXjzR9lX3g==" | ||||
|             "version": "2022.1.2-1643057053", | ||||
|             "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2022.1.2-1643057053.tgz", | ||||
|             "integrity": "sha512-UWi49e9KodhubB4zOYHdf+Kwm7Skn6Z4J1EDI3Stu2SDQfsQlU0U4NrOfKnaD7WI6QVjzAK/K+6+bODSQQtOmw==" | ||||
|         }, | ||||
|         "@humanwhocodes/config-array": { | ||||
|             "version": "0.9.2", | ||||
| @ -10145,28 +10145,28 @@ | ||||
|             } | ||||
|         }, | ||||
|         "@lingui/babel-plugin-extract-messages": { | ||||
|             "version": "3.13.1", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.13.1.tgz", | ||||
|             "integrity": "sha512-K0ekhQI49ZTE90bVxvndqdxO80X1ZjacVdznWn4RJq6EEN9ElppMKkWUmAe/vfHGJRCH/2aUIp73xvaXPJPbGg==", | ||||
|             "version": "3.13.2", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.13.2.tgz", | ||||
|             "integrity": "sha512-SyvwfrPqkyj9XM2CB/YK25o0Zi+B8ikoCENwqNSk7201n80YfOJoksc6lQ3X/QODqvy+iuOsiQrVT3qzKblOmg==", | ||||
|             "requires": { | ||||
|                 "@babel/generator": "^7.11.6", | ||||
|                 "@babel/runtime": "^7.11.2", | ||||
|                 "@lingui/conf": "^3.13.1", | ||||
|                 "@lingui/conf": "^3.13.2", | ||||
|                 "mkdirp": "^1.0.4" | ||||
|             } | ||||
|         }, | ||||
|         "@lingui/cli": { | ||||
|             "version": "3.13.1", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-3.13.1.tgz", | ||||
|             "integrity": "sha512-JGfbdAn1qxHBjuhnLeERMhCLe7UXSFafqq9S//g3+VNHKHfVHfa0CKFUmISMDKMLFdKmbdJCZpYU3DRZNrUGyQ==", | ||||
|             "version": "3.13.2", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-3.13.2.tgz", | ||||
|             "integrity": "sha512-wPYlsKI7hx1hyntc6enUVUdKVwBM8XW+DnwHslWWw4ShMNvh98gLgAOW1ajXtUym7x0WTjhR+/s436hdxfZ/Og==", | ||||
|             "requires": { | ||||
|                 "@babel/generator": "^7.11.6", | ||||
|                 "@babel/parser": "^7.11.5", | ||||
|                 "@babel/plugin-syntax-jsx": "^7.10.4", | ||||
|                 "@babel/runtime": "^7.11.2", | ||||
|                 "@babel/types": "^7.11.5", | ||||
|                 "@lingui/babel-plugin-extract-messages": "^3.13.1", | ||||
|                 "@lingui/conf": "^3.13.1", | ||||
|                 "@lingui/babel-plugin-extract-messages": "^3.13.2", | ||||
|                 "@lingui/conf": "^3.13.2", | ||||
|                 "babel-plugin-macros": "^3.0.1", | ||||
|                 "bcp-47": "^1.0.7", | ||||
|                 "chalk": "^4.1.0", | ||||
| @ -10239,9 +10239,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "@lingui/conf": { | ||||
|             "version": "3.13.1", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-3.13.1.tgz", | ||||
|             "integrity": "sha512-xWJVdgNiGqYzkYIxHg4c6KqSNleN5/96M2ly+GzBOmA5H75r4hz27DfQpxuC4FuBUAPC+Mk1HTBO9/aFO0BCZg==", | ||||
|             "version": "3.13.2", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-3.13.2.tgz", | ||||
|             "integrity": "sha512-JhiIBxnh2X4QmLP0/+dnTBc7xnZ6qk5MRsQtJqkEOWGFl09CTrha5uPVqjr5MgkmBOQ6Q8+cRYWG+qtJsuUH5A==", | ||||
|             "requires": { | ||||
|                 "@babel/runtime": "^7.11.2", | ||||
|                 "@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2", | ||||
| @ -10297,9 +10297,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "@lingui/core": { | ||||
|             "version": "3.13.1", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/core/-/core-3.13.1.tgz", | ||||
|             "integrity": "sha512-spzRJ/fca9Ddpns27Xmz2f9lgiesrvTZjcpOO2wKJq9QozF1qtv7n1bViQ1Erh2uFaO0kaEzUjkAYU3LtlP4PQ==", | ||||
|             "version": "3.13.2", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/core/-/core-3.13.2.tgz", | ||||
|             "integrity": "sha512-ic1uC+bS7hpfM4oVugHKel8UhlLAwykSv2TYw3oyeEQhvCS232nSzh+PFbP0BXK1hZ0UdHve7mODpgADuwHIQA==", | ||||
|             "requires": { | ||||
|                 "@babel/runtime": "^7.11.2", | ||||
|                 "make-plural": "^6.2.2", | ||||
| @ -10307,17 +10307,17 @@ | ||||
|             } | ||||
|         }, | ||||
|         "@lingui/detect-locale": { | ||||
|             "version": "3.13.1", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/detect-locale/-/detect-locale-3.13.1.tgz", | ||||
|             "integrity": "sha512-ZY/jo3whJ5+QlkpUjZgXzzmON6vA9s0qbXgsKue6xIEOGZ7/z5p05tnHb8RYa6jhpRSYN+CJARx2H82QZMrtwA==" | ||||
|             "version": "3.13.2", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/detect-locale/-/detect-locale-3.13.2.tgz", | ||||
|             "integrity": "sha512-1fouly1ecq1wCKUGtYgFn0Hdsjuz4bBYxh/oIjrqEeb4+bKdjaHbCT2ypsX7rRxs88yOfOWGUYuuzG0EoJXiSw==" | ||||
|         }, | ||||
|         "@lingui/macro": { | ||||
|             "version": "3.13.1", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-3.13.1.tgz", | ||||
|             "integrity": "sha512-iXdAbREJpIUs3s78Erbg+7ZRuJsD0S0nyGCeEo9Ml/NDO/MtVYo7XCHecwtCdNxDe/h0NItB3m/7uPZ/BvOLOA==", | ||||
|             "version": "3.13.2", | ||||
|             "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-3.13.2.tgz", | ||||
|             "integrity": "sha512-0BdybZkBq8bl4NrT8txX7k8BodyJ/4uQbMIK0ucPJvQ/6Lhj824CodBq5KuMWpcXoMSxUWjQIkIGr1Fi1ckLGg==", | ||||
|             "requires": { | ||||
|                 "@babel/runtime": "^7.11.2", | ||||
|                 "@lingui/conf": "^3.13.1", | ||||
|                 "@lingui/conf": "^3.13.2", | ||||
|                 "ramda": "^0.27.1" | ||||
|             } | ||||
|         }, | ||||
| @ -10588,13 +10588,13 @@ | ||||
|             } | ||||
|         }, | ||||
|         "@sentry/browser": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.16.1.tgz", | ||||
|             "integrity": "sha512-F2I5RL7RTLQF9CccMrqt73GRdK3FdqaChED3RulGQX5lH6U3exHGFxwyZxSrY4x6FedfBFYlfXWWCJXpLnFkow==", | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.17.2.tgz", | ||||
|             "integrity": "sha512-4Ow5z9GxK5dG9+stBNKb7s6NoxE4wgEcHRmO66QTK4gH2NNmzV4R/aaZ7iDoS/lD86sH0M86jm76dpg9uiJPmw==", | ||||
|             "requires": { | ||||
|                 "@sentry/core": "6.16.1", | ||||
|                 "@sentry/types": "6.16.1", | ||||
|                 "@sentry/utils": "6.16.1", | ||||
|                 "@sentry/core": "6.17.2", | ||||
|                 "@sentry/types": "6.17.2", | ||||
|                 "@sentry/utils": "6.17.2", | ||||
|                 "tslib": "^1.9.3" | ||||
|             }, | ||||
|             "dependencies": { | ||||
| @ -10606,14 +10606,14 @@ | ||||
|             } | ||||
|         }, | ||||
|         "@sentry/core": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.16.1.tgz", | ||||
|             "integrity": "sha512-UFI0264CPUc5cR1zJH+S2UPOANpm6dLJOnsvnIGTjsrwzR0h8Hdl6rC2R/GPq+WNbnipo9hkiIwDlqbqvIU5vw==", | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.17.2.tgz", | ||||
|             "integrity": "sha512-Uew0CNMr+QvowrF4EJYjOUgHep/sZJ3l5zevPEELugIgqWBodd+ZDCV3fQFR7cr6KOqx1rMgVrgcKIkLl0l+RA==", | ||||
|             "requires": { | ||||
|                 "@sentry/hub": "6.16.1", | ||||
|                 "@sentry/minimal": "6.16.1", | ||||
|                 "@sentry/types": "6.16.1", | ||||
|                 "@sentry/utils": "6.16.1", | ||||
|                 "@sentry/hub": "6.17.2", | ||||
|                 "@sentry/minimal": "6.17.2", | ||||
|                 "@sentry/types": "6.17.2", | ||||
|                 "@sentry/utils": "6.17.2", | ||||
|                 "tslib": "^1.9.3" | ||||
|             }, | ||||
|             "dependencies": { | ||||
| @ -10625,12 +10625,12 @@ | ||||
|             } | ||||
|         }, | ||||
|         "@sentry/hub": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.16.1.tgz", | ||||
|             "integrity": "sha512-4PGtg6AfpqMkreTpL7ymDeQ/U1uXv03bKUuFdtsSTn/FRf9TLS4JB0KuTZCxfp1IRgAA+iFg6B784dDkT8R9eg==", | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.17.2.tgz", | ||||
|             "integrity": "sha512-CMi6jU920bTwRTmGHjP4u8toOx4gm1dsx+rsxvp+FKzqRwpwoyi9mOw8oEYERVzaqaYceGdFylyRUrjdf0f77g==", | ||||
|             "requires": { | ||||
|                 "@sentry/types": "6.16.1", | ||||
|                 "@sentry/utils": "6.16.1", | ||||
|                 "@sentry/types": "6.17.2", | ||||
|                 "@sentry/utils": "6.17.2", | ||||
|                 "tslib": "^1.9.3" | ||||
|             }, | ||||
|             "dependencies": { | ||||
| @ -10642,12 +10642,12 @@ | ||||
|             } | ||||
|         }, | ||||
|         "@sentry/minimal": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.16.1.tgz", | ||||
|             "integrity": "sha512-dq+mI1EQIvUM+zJtGCVgH3/B3Sbx4hKlGf2Usovm9KoqWYA+QpfVBholYDe/H2RXgO7LFEefDLvOdHDkqeJoyA==", | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.17.2.tgz", | ||||
|             "integrity": "sha512-Cdh+iM6QhLKfxwUWWP4mk2K7+EsQj4tuF2dGQke4Zcbp7zQ7wbcMruUcZHiZfvg5kiSYxwNVkH7cXMzcO7AJsg==", | ||||
|             "requires": { | ||||
|                 "@sentry/hub": "6.16.1", | ||||
|                 "@sentry/types": "6.16.1", | ||||
|                 "@sentry/hub": "6.17.2", | ||||
|                 "@sentry/types": "6.17.2", | ||||
|                 "tslib": "^1.9.3" | ||||
|             }, | ||||
|             "dependencies": { | ||||
| @ -10659,14 +10659,14 @@ | ||||
|             } | ||||
|         }, | ||||
|         "@sentry/tracing": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.16.1.tgz", | ||||
|             "integrity": "sha512-MPSbqXX59P+OEeST+U2V/8Hu/8QjpTUxTNeNyTHWIbbchdcMMjDbXTS3etCgajZR6Ro+DHElOz5cdSxH6IBGlA==", | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.17.2.tgz", | ||||
|             "integrity": "sha512-oWY2Ga+5D5f90utvfF2Y0eQvme+eS768ZWjR+klRYgZWoY8r1v8uWwWsvroYU1g+h6X0G/xh3giFjsdOWtRENw==", | ||||
|             "requires": { | ||||
|                 "@sentry/hub": "6.16.1", | ||||
|                 "@sentry/minimal": "6.16.1", | ||||
|                 "@sentry/types": "6.16.1", | ||||
|                 "@sentry/utils": "6.16.1", | ||||
|                 "@sentry/hub": "6.17.2", | ||||
|                 "@sentry/minimal": "6.17.2", | ||||
|                 "@sentry/types": "6.17.2", | ||||
|                 "@sentry/utils": "6.17.2", | ||||
|                 "tslib": "^1.9.3" | ||||
|             }, | ||||
|             "dependencies": { | ||||
| @ -10678,16 +10678,16 @@ | ||||
|             } | ||||
|         }, | ||||
|         "@sentry/types": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.16.1.tgz", | ||||
|             "integrity": "sha512-Wh354g30UsJ5kYJbercektGX4ZMc9MHU++1NjeN2bTMnbofEcpUDWIiKeulZEY65IC1iU+1zRQQgtYO+/hgCUQ==" | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.17.2.tgz", | ||||
|             "integrity": "sha512-UrFLRDz5mn253O8k/XftLxoldF+NyZdkqKLGIQmST5HEVr7ub9nQJ4Y5ZFA3zJYWpraaW8faIbuw+pgetC8hmQ==" | ||||
|         }, | ||||
|         "@sentry/utils": { | ||||
|             "version": "6.16.1", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.16.1.tgz", | ||||
|             "integrity": "sha512-7ngq/i4R8JZitJo9Sl8PDnjSbDehOxgr1vsoMmerIsyRZ651C/8B+jVkMhaAPgSdyJ0AlE3O7DKKTP1FXFw9qw==", | ||||
|             "version": "6.17.2", | ||||
|             "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.17.2.tgz", | ||||
|             "integrity": "sha512-ePWtO44KJQwUULOiU86fa1WU3Ird2TH0i39gqB2d3zNS3QyVp9qPlzSdPKSPJ9LdgadzBHw7ikEuE+GY8JTrhA==", | ||||
|             "requires": { | ||||
|                 "@sentry/types": "6.16.1", | ||||
|                 "@sentry/types": "6.17.2", | ||||
|                 "tslib": "^1.9.3" | ||||
|             }, | ||||
|             "dependencies": { | ||||
| @ -10963,13 +10963,13 @@ | ||||
|             "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" | ||||
|         }, | ||||
|         "@typescript-eslint/eslint-plugin": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", | ||||
|             "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.1.tgz", | ||||
|             "integrity": "sha512-xN3CYqFlyE/qOcy978/L0xLR2HlcAGIyIK5sMOasxaaAPfQRj/MmMV6OC3I7NZO84oEUdWCOju34Z9W8E0pFDQ==", | ||||
|             "requires": { | ||||
|                 "@typescript-eslint/scope-manager": "5.10.0", | ||||
|                 "@typescript-eslint/type-utils": "5.10.0", | ||||
|                 "@typescript-eslint/utils": "5.10.0", | ||||
|                 "@typescript-eslint/scope-manager": "5.10.1", | ||||
|                 "@typescript-eslint/type-utils": "5.10.1", | ||||
|                 "@typescript-eslint/utils": "5.10.1", | ||||
|                 "debug": "^4.3.2", | ||||
|                 "functional-red-black-tree": "^1.0.1", | ||||
|                 "ignore": "^5.1.8", | ||||
| @ -10994,47 +10994,47 @@ | ||||
|             } | ||||
|         }, | ||||
|         "@typescript-eslint/parser": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz", | ||||
|             "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.1.tgz", | ||||
|             "integrity": "sha512-GReo3tjNBwR5RnRO0K2wDIDN31cM3MmDtgyQ85oAxAmC5K3j/g85IjP+cDfcqDsDDBf1HNKQAD0WqOYL8jXqUA==", | ||||
|             "requires": { | ||||
|                 "@typescript-eslint/scope-manager": "5.10.0", | ||||
|                 "@typescript-eslint/types": "5.10.0", | ||||
|                 "@typescript-eslint/typescript-estree": "5.10.0", | ||||
|                 "@typescript-eslint/scope-manager": "5.10.1", | ||||
|                 "@typescript-eslint/types": "5.10.1", | ||||
|                 "@typescript-eslint/typescript-estree": "5.10.1", | ||||
|                 "debug": "^4.3.2" | ||||
|             } | ||||
|         }, | ||||
|         "@typescript-eslint/scope-manager": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz", | ||||
|             "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.1.tgz", | ||||
|             "integrity": "sha512-Lyvi559Gvpn94k7+ElXNMEnXu/iundV5uFmCUNnftbFrUbAJ1WBoaGgkbOBm07jVZa682oaBU37ao/NGGX4ZDg==", | ||||
|             "requires": { | ||||
|                 "@typescript-eslint/types": "5.10.0", | ||||
|                 "@typescript-eslint/visitor-keys": "5.10.0" | ||||
|                 "@typescript-eslint/types": "5.10.1", | ||||
|                 "@typescript-eslint/visitor-keys": "5.10.1" | ||||
|             } | ||||
|         }, | ||||
|         "@typescript-eslint/type-utils": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz", | ||||
|             "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.1.tgz", | ||||
|             "integrity": "sha512-AfVJkV8uck/UIoDqhu+ptEdBoQATON9GXnhOpPLzkQRJcSChkvD//qsz9JVffl2goxX+ybs5klvacE9vmrQyCw==", | ||||
|             "requires": { | ||||
|                 "@typescript-eslint/utils": "5.10.0", | ||||
|                 "@typescript-eslint/utils": "5.10.1", | ||||
|                 "debug": "^4.3.2", | ||||
|                 "tsutils": "^3.21.0" | ||||
|             } | ||||
|         }, | ||||
|         "@typescript-eslint/types": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", | ||||
|             "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==" | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.1.tgz", | ||||
|             "integrity": "sha512-ZvxQ2QMy49bIIBpTqFiOenucqUyjTQ0WNLhBM6X1fh1NNlYAC6Kxsx8bRTY3jdYsYg44a0Z/uEgQkohbR0H87Q==" | ||||
|         }, | ||||
|         "@typescript-eslint/typescript-estree": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", | ||||
|             "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.1.tgz", | ||||
|             "integrity": "sha512-PwIGnH7jIueXv4opcwEbVGDATjGPO1dx9RkUl5LlHDSe+FXxPwFL5W/qYd5/NHr7f6lo/vvTrAzd0KlQtRusJQ==", | ||||
|             "requires": { | ||||
|                 "@typescript-eslint/types": "5.10.0", | ||||
|                 "@typescript-eslint/visitor-keys": "5.10.0", | ||||
|                 "@typescript-eslint/types": "5.10.1", | ||||
|                 "@typescript-eslint/visitor-keys": "5.10.1", | ||||
|                 "debug": "^4.3.2", | ||||
|                 "globby": "^11.0.4", | ||||
|                 "is-glob": "^4.0.3", | ||||
| @ -11053,24 +11053,24 @@ | ||||
|             } | ||||
|         }, | ||||
|         "@typescript-eslint/utils": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz", | ||||
|             "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.1.tgz", | ||||
|             "integrity": "sha512-RRmlITiUbLuTRtn/gcPRi4202niF+q7ylFLCKu4c+O/PcpRvZ/nAUwQ2G00bZgpWkhrNLNnvhZLbDn8Ml0qsQw==", | ||||
|             "requires": { | ||||
|                 "@types/json-schema": "^7.0.9", | ||||
|                 "@typescript-eslint/scope-manager": "5.10.0", | ||||
|                 "@typescript-eslint/types": "5.10.0", | ||||
|                 "@typescript-eslint/typescript-estree": "5.10.0", | ||||
|                 "@typescript-eslint/scope-manager": "5.10.1", | ||||
|                 "@typescript-eslint/types": "5.10.1", | ||||
|                 "@typescript-eslint/typescript-estree": "5.10.1", | ||||
|                 "eslint-scope": "^5.1.1", | ||||
|                 "eslint-utils": "^3.0.0" | ||||
|             } | ||||
|         }, | ||||
|         "@typescript-eslint/visitor-keys": { | ||||
|             "version": "5.10.0", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", | ||||
|             "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", | ||||
|             "version": "5.10.1", | ||||
|             "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.1.tgz", | ||||
|             "integrity": "sha512-NjQ0Xinhy9IL979tpoTRuLKxMc0zJC7QVSdeerXs2/QvOy2yRkzX5dRb10X5woNUdJgU8G3nYRDlI33sq1K4YQ==", | ||||
|             "requires": { | ||||
|                 "@typescript-eslint/types": "5.10.0", | ||||
|                 "@typescript-eslint/types": "5.10.1", | ||||
|                 "eslint-visitor-keys": "^3.0.0" | ||||
|             }, | ||||
|             "dependencies": { | ||||
| @ -11692,9 +11692,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "country-flag-icons": { | ||||
|             "version": "1.4.19", | ||||
|             "resolved": "https://registry.npmjs.org/country-flag-icons/-/country-flag-icons-1.4.19.tgz", | ||||
|             "integrity": "sha512-1hmXFJ4UURQt0Ex0990B7oOL4n9KLpT9NOSEmZoYh+/5DQ7/pikyqaptqCLUFFv/bYHyvYFeo0fqV82XxU6VOA==" | ||||
|             "version": "1.4.20", | ||||
|             "resolved": "https://registry.npmjs.org/country-flag-icons/-/country-flag-icons-1.4.20.tgz", | ||||
|             "integrity": "sha512-f9/cO9IEDIkLdOQeTUMDLEWMcDk4qbTRjbQLpy5pm+yil7Fa7QkKxgiMOQ2z1+Jht8/BAD3JJAmPG4qtK/tbUw==" | ||||
|         }, | ||||
|         "create-require": { | ||||
|             "version": "1.1.1", | ||||
| @ -13074,9 +13074,9 @@ | ||||
|             "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" | ||||
|         }, | ||||
|         "lit": { | ||||
|             "version": "2.1.1", | ||||
|             "resolved": "https://registry.npmjs.org/lit/-/lit-2.1.1.tgz", | ||||
|             "integrity": "sha512-yqDqf36IhXwOxIQSFqCMgpfvDCRdxLCLZl7m/+tO5C9W/OBHUj17qZpiMBT35v97QMVKcKEi1KZ3hZRyTwBNsQ==", | ||||
|             "version": "2.1.2", | ||||
|             "resolved": "https://registry.npmjs.org/lit/-/lit-2.1.2.tgz", | ||||
|             "integrity": "sha512-XacK89dJXF7BJbpiZSMvzT4RxHag7Wt+yNx7tErEVgGVlOFAeN871bj7ivotCMgYeBFWVp/hjKF/PDTk6L7gMA==", | ||||
|             "requires": { | ||||
|                 "@lit/reactive-element": "^1.1.0", | ||||
|                 "lit-element": "^3.1.0", | ||||
| @ -14218,9 +14218,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "rollup": { | ||||
|             "version": "2.66.0", | ||||
|             "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.0.tgz", | ||||
|             "integrity": "sha512-L6mKOkdyP8HK5kKJXaiWG7KZDumPJjuo1P+cfyHOJPNNTK3Moe7zCH5+fy7v8pVmHXtlxorzaBjvkBMB23s98g==", | ||||
|             "version": "2.66.1", | ||||
|             "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.1.tgz", | ||||
|             "integrity": "sha512-crSgLhSkLMnKr4s9iZ/1qJCplgAgrRY+igWv8KhG/AjKOJ0YX/WpmANyn8oxrw+zenF3BXWDLa7Xl/QZISH+7w==", | ||||
|             "requires": { | ||||
|                 "fsevents": "~2.3.2" | ||||
|             } | ||||
|  | ||||
| @ -51,14 +51,14 @@ | ||||
|         "@babel/plugin-transform-runtime": "^7.16.10", | ||||
|         "@babel/preset-env": "^7.16.11", | ||||
|         "@babel/preset-typescript": "^7.16.7", | ||||
|         "@formatjs/intl-listformat": "^6.5.0", | ||||
|         "@formatjs/intl-listformat": "^6.5.1", | ||||
|         "@fortawesome/fontawesome-free": "^5.15.4", | ||||
|         "@goauthentik/api": "^2022.1.1-1642874681", | ||||
|         "@goauthentik/api": "^2022.1.2-1643057053", | ||||
|         "@jackfranklin/rollup-plugin-markdown": "^0.3.0", | ||||
|         "@lingui/cli": "^3.13.1", | ||||
|         "@lingui/core": "^3.13.1", | ||||
|         "@lingui/detect-locale": "^3.13.1", | ||||
|         "@lingui/macro": "^3.13.1", | ||||
|         "@lingui/cli": "^3.13.2", | ||||
|         "@lingui/core": "^3.13.2", | ||||
|         "@lingui/detect-locale": "^3.13.2", | ||||
|         "@lingui/macro": "^3.13.2", | ||||
|         "@patternfly/patternfly": "^4.164.2", | ||||
|         "@polymer/iron-form": "^3.0.1", | ||||
|         "@polymer/paper-input": "^3.2.1", | ||||
| @ -67,15 +67,15 @@ | ||||
|         "@rollup/plugin-node-resolve": "^13.1.3", | ||||
|         "@rollup/plugin-replace": "^3.0.1", | ||||
|         "@rollup/plugin-typescript": "^8.3.0", | ||||
|         "@sentry/browser": "^6.16.1", | ||||
|         "@sentry/tracing": "^6.16.1", | ||||
|         "@sentry/browser": "^6.17.2", | ||||
|         "@sentry/tracing": "^6.17.2", | ||||
|         "@squoosh/cli": "^0.7.2", | ||||
|         "@trivago/prettier-plugin-sort-imports": "^3.1.1", | ||||
|         "@types/chart.js": "^2.9.35", | ||||
|         "@types/codemirror": "5.60.5", | ||||
|         "@types/grecaptcha": "^3.0.3", | ||||
|         "@typescript-eslint/eslint-plugin": "^5.10.0", | ||||
|         "@typescript-eslint/parser": "^5.10.0", | ||||
|         "@typescript-eslint/eslint-plugin": "^5.10.1", | ||||
|         "@typescript-eslint/parser": "^5.10.1", | ||||
|         "@webcomponents/webcomponentsjs": "^2.6.0", | ||||
|         "babel-plugin-macros": "^3.1.0", | ||||
|         "base64-js": "^1.5.1", | ||||
| @ -83,18 +83,18 @@ | ||||
|         "chartjs-adapter-moment": "^1.0.0", | ||||
|         "codemirror": "^5.65.1", | ||||
|         "construct-style-sheets-polyfill": "^3.0.5", | ||||
|         "country-flag-icons": "^1.4.19", | ||||
|         "country-flag-icons": "^1.4.20", | ||||
|         "eslint": "^8.7.0", | ||||
|         "eslint-config-google": "^0.14.0", | ||||
|         "eslint-plugin-custom-elements": "0.0.4", | ||||
|         "eslint-plugin-lit": "^1.6.1", | ||||
|         "flowchart.js": "^1.17.0", | ||||
|         "fuse.js": "^6.5.3", | ||||
|         "lit": "^2.1.1", | ||||
|         "lit": "^2.1.2", | ||||
|         "moment": "^2.29.1", | ||||
|         "prettier": "^2.5.1", | ||||
|         "rapidoc": "^9.1.4", | ||||
|         "rollup": "^2.66.0", | ||||
|         "rollup": "^2.66.1", | ||||
|         "rollup-plugin-copy": "^3.4.0", | ||||
|         "rollup-plugin-cssimport": "^1.0.2", | ||||
|         "rollup-plugin-minify-html-literals": "^1.2.6", | ||||
|  | ||||
| @ -3,7 +3,7 @@ export const SUCCESS_CLASS = "pf-m-success"; | ||||
| export const ERROR_CLASS = "pf-m-danger"; | ||||
| export const PROGRESS_CLASS = "pf-m-in-progress"; | ||||
| export const CURRENT_CLASS = "pf-m-current"; | ||||
| export const VERSION = "2022.1.2"; | ||||
| export const VERSION = "2022.1.3"; | ||||
| export const TITLE_DEFAULT = "authentik"; | ||||
| export const ROUTE_SEPARATOR = ";"; | ||||
|  | ||||
|  | ||||
| @ -216,6 +216,7 @@ export class SAMLProviderViewPage extends LitElement { | ||||
|                                       ${t`Download`} | ||||
|                                   </a> | ||||
|                                   <ak-action-button | ||||
|                                       class="pf-m-secondary" | ||||
|                                       .apiRequest=${() => { | ||||
|                                           const fullUrl = | ||||
|                                               window.location.origin + | ||||
|  | ||||
| @ -34,7 +34,7 @@ export class AuthenticatorSMSStageForm extends ModelForm<AuthenticatorSMSStage, | ||||
|     } | ||||
|  | ||||
|     @property({ attribute: false }) | ||||
|     provider?: ProviderEnum; | ||||
|     provider: ProviderEnum = ProviderEnum.Twilio; | ||||
|  | ||||
|     @property({ attribute: false }) | ||||
|     authType?: AuthTypeEnum; | ||||
| @ -60,6 +60,101 @@ export class AuthenticatorSMSStageForm extends ModelForm<AuthenticatorSMSStage, | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     renderProviderTwillio(): TemplateResult { | ||||
|         return html` <ak-form-element-horizontal | ||||
|                 label=${t`Twilio Account SID`} | ||||
|                 ?required=${true} | ||||
|                 name="accountSid" | ||||
|             > | ||||
|                 <input | ||||
|                     type="text" | ||||
|                     value="${ifDefined(this.instance?.accountSid || "")}" | ||||
|                     class="pf-c-form-control" | ||||
|                     required | ||||
|                 /> | ||||
|                 <p class="pf-c-form__helper-text"> | ||||
|                     ${t`Get this value from https://console.twilio.com`} | ||||
|                 </p> | ||||
|             </ak-form-element-horizontal> | ||||
|             <ak-form-element-horizontal label=${t`Twilio Auth Token`} ?required=${true} name="auth"> | ||||
|                 <input | ||||
|                     type="text" | ||||
|                     value="${ifDefined(this.instance?.auth || "")}" | ||||
|                     class="pf-c-form-control" | ||||
|                     required | ||||
|                 /> | ||||
|                 <p class="pf-c-form__helper-text"> | ||||
|                     ${t`Get this value from https://console.twilio.com`} | ||||
|                 </p> | ||||
|             </ak-form-element-horizontal>`; | ||||
|     } | ||||
|  | ||||
|     renderProviderGeneric(): TemplateResult { | ||||
|         return html` <ak-form-element-horizontal | ||||
|                 label=${t`Authentication Type`} | ||||
|                 @change=${(ev: Event) => { | ||||
|                     const current = (ev.target as HTMLInputElement).value; | ||||
|                     this.authType = current as AuthTypeEnum; | ||||
|                 }} | ||||
|                 ?required=${true} | ||||
|                 name="authType" | ||||
|             > | ||||
|                 <select class="pf-c-form-control"> | ||||
|                     <option | ||||
|                         value="${AuthTypeEnum.Basic}" | ||||
|                         ?selected=${this.instance?.authType === AuthTypeEnum.Basic} | ||||
|                     > | ||||
|                         ${t`Basic Auth`} | ||||
|                     </option> | ||||
|                     <option | ||||
|                         value="${AuthTypeEnum.Bearer}" | ||||
|                         ?selected=${this.instance?.authType === AuthTypeEnum.Bearer} | ||||
|                     > | ||||
|                         ${t`Bearer Token`} | ||||
|                     </option> | ||||
|                 </select> | ||||
|             </ak-form-element-horizontal> | ||||
|             <ak-form-element-horizontal | ||||
|                 label=${t`External API URL`} | ||||
|                 ?required=${true} | ||||
|                 name="accountSid" | ||||
|             > | ||||
|                 <input | ||||
|                     type="text" | ||||
|                     value="${ifDefined(this.instance?.accountSid || "")}" | ||||
|                     class="pf-c-form-control" | ||||
|                     required | ||||
|                 /> | ||||
|                 <p class="pf-c-form__helper-text"> | ||||
|                     ${t`This is the full endpoint to send POST requests to.`} | ||||
|                 </p> | ||||
|             </ak-form-element-horizontal> | ||||
|             <ak-form-element-horizontal label=${t`API Auth Username`} ?required=${true} name="auth"> | ||||
|                 <input | ||||
|                     type="text" | ||||
|                     value="${ifDefined(this.instance?.auth || "")}" | ||||
|                     class="pf-c-form-control" | ||||
|                 /> | ||||
|                 <p class="pf-c-form__helper-text"> | ||||
|                     ${t`This is the username to be used with basic auth or the token when used with bearer token`} | ||||
|                 </p> | ||||
|             </ak-form-element-horizontal> | ||||
|             <ak-form-element-horizontal | ||||
|                 label=${t`API Auth password`} | ||||
|                 ?required=${false} | ||||
|                 name="authPassword" | ||||
|             > | ||||
|                 <input | ||||
|                     type="text" | ||||
|                     value="${ifDefined(this.instance?.authPassword)}" | ||||
|                     class="pf-c-form-control" | ||||
|                 /> | ||||
|                 <p class="pf-c-form__helper-text"> | ||||
|                     ${t`This is the password to be used with basic auth`} | ||||
|                 </p> | ||||
|             </ak-form-element-horizontal>`; | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|         return html`<form class="pf-c-form pf-m-horizontal"> | ||||
|             <div class="form-help-text"> | ||||
| @ -117,113 +212,9 @@ export class AuthenticatorSMSStageForm extends ModelForm<AuthenticatorSMSStage, | ||||
|                             ${t`Number the SMS will be sent from.`} | ||||
|                         </p> | ||||
|                     </ak-form-element-horizontal> | ||||
|  | ||||
|                     <ak-form-element-horizontal | ||||
|                         label=${t`Twilio Account SID`} | ||||
|                         ?hidden=${this.provider !== ProviderEnum.Twilio} | ||||
|                         ?required=${true} | ||||
|                         name="accountSid" | ||||
|                     > | ||||
|                         <input | ||||
|                             type="text" | ||||
|                             value="${ifDefined(this.instance?.accountSid || "")}" | ||||
|                             class="pf-c-form-control" | ||||
|                             required | ||||
|                         /> | ||||
|                         <p class="pf-c-form__helper-text"> | ||||
|                             ${t`Get this value from https://console.twilio.com`} | ||||
|                         </p> | ||||
|                     </ak-form-element-horizontal> | ||||
|                     <ak-form-element-horizontal | ||||
|                         label=${t`Twilio Auth Token`} | ||||
|                         ?hidden=${this.provider !== ProviderEnum.Twilio} | ||||
|                         ?required=${true} | ||||
|                         name="auth" | ||||
|                     > | ||||
|                         <input | ||||
|                             type="text" | ||||
|                             value="${ifDefined(this.instance?.auth || "")}" | ||||
|                             class="pf-c-form-control" | ||||
|                             required | ||||
|                         /> | ||||
|                         <p class="pf-c-form__helper-text"> | ||||
|                             ${t`Get this value from https://console.twilio.com`} | ||||
|                         </p> | ||||
|                     </ak-form-element-horizontal> | ||||
|                     <ak-form-element-horizontal | ||||
|                         label=${t`Authentication Type`} | ||||
|                         ?hidden=${this.provider !== ProviderEnum.Generic} | ||||
|                         @change=${(ev: Event) => { | ||||
|                             const current = (ev.target as HTMLInputElement).value; | ||||
|                             this.authType = current as AuthTypeEnum; | ||||
|                         }} | ||||
|                         ?required=${true} | ||||
|                         name="authType" | ||||
|                     > | ||||
|                         <select class="pf-c-form-control"> | ||||
|                             <option | ||||
|                                 value="${AuthTypeEnum.Basic}" | ||||
|                                 ?selected=${this.instance?.authType === AuthTypeEnum.Basic} | ||||
|                             > | ||||
|                                 ${t`Basic Auth`} | ||||
|                             </option> | ||||
|                             <option | ||||
|                                 value="${AuthTypeEnum.Bearer}" | ||||
|                                 ?selected=${this.instance?.authType === AuthTypeEnum.Bearer} | ||||
|                             > | ||||
|                                 ${t`Bearer Token`} | ||||
|                             </option> | ||||
|                         </select> | ||||
|                     </ak-form-element-horizontal> | ||||
|                     <ak-form-element-horizontal | ||||
|                         label=${t`External API URL`} | ||||
|                         ?hidden=${this.provider !== ProviderEnum.Generic} | ||||
|                         ?required=${true} | ||||
|                         name="accountSid" | ||||
|                     > | ||||
|                         <input | ||||
|                             type="text" | ||||
|                             value="${ifDefined(this.instance?.accountSid || "")}" | ||||
|                             class="pf-c-form-control" | ||||
|                             required | ||||
|                         /> | ||||
|                         <p class="pf-c-form__helper-text"> | ||||
|                             ${t`This is the full endpoint to send POST requests to.`} | ||||
|                         </p> | ||||
|                     </ak-form-element-horizontal> | ||||
|                     <ak-form-element-horizontal | ||||
|                         label=${t`API Auth Username`} | ||||
|                         ?hidden=${this.provider !== ProviderEnum.Generic} | ||||
|                         ?required=${true} | ||||
|                         name="auth" | ||||
|                     > | ||||
|                         <input | ||||
|                             type="text" | ||||
|                             value="${ifDefined(this.instance?.auth || "")}" | ||||
|                             class="pf-c-form-control" | ||||
|                         /> | ||||
|                         <p class="pf-c-form__helper-text"> | ||||
|                             ${t`This is the username to be used with basic auth or the token when used with bearer token`} | ||||
|                         </p> | ||||
|                     </ak-form-element-horizontal> | ||||
|                     <ak-form-element-horizontal | ||||
|                         label=${t`API Auth password`} | ||||
|                         ?hidden=${!( | ||||
|                             this.provider === ProviderEnum.Generic && | ||||
|                             this.authType === AuthTypeEnum.Basic | ||||
|                         )} | ||||
|                         ?required=${false} | ||||
|                         name="authPassword" | ||||
|                     > | ||||
|                         <input | ||||
|                             type="text" | ||||
|                             value="${ifDefined(this.instance?.authPassword)}" | ||||
|                             class="pf-c-form-control" | ||||
|                         /> | ||||
|                         <p class="pf-c-form__helper-text"> | ||||
|                             ${t`This is the password to be used with basic auth`} | ||||
|                         </p> | ||||
|                     </ak-form-element-horizontal> | ||||
|                     ${this.provider === ProviderEnum.Generic | ||||
|                         ? this.renderProviderGeneric() | ||||
|                         : this.renderProviderTwillio()} | ||||
|                     <ak-form-element-horizontal label=${t`Configuration flow`} name="configureFlow"> | ||||
|                         <select class="pf-c-form-control"> | ||||
|                             <option | ||||
|  | ||||
| @ -227,6 +227,7 @@ export class UserListPage extends TablePage<User> { | ||||
|                                             } | ||||
|                                             return html` | ||||
|                                                 <ak-action-button | ||||
|                                                     class="pf-m-secondary" | ||||
|                                                     .apiRequest=${() => { | ||||
|                                                         return new CoreApi(DEFAULT_CONFIG) | ||||
|                                                             .coreUsersRecoveryRetrieve({ | ||||
|  | ||||
| @ -32,5 +32,5 @@ metadata: | ||||
|     nginx.ingress.kubernetes.io/auth-response-headers: | | ||||
|       Set-Cookie,X-authentik-username,X-authentik-groups,X-authentik-email,X-authentik-name,X-authentik-uid | ||||
|     nginx.ingress.kubernetes.io/auth-snippet: | | ||||
|        proxy_set_header X-Forwarded-Host $http_host; | ||||
|        proxy_set_header Host $http_host; | ||||
| ``` | ||||
|  | ||||
| @ -6,8 +6,6 @@ For Nginx Proxy Manager you can use this snippet | ||||
| # header from upstream' error when trying to access an application protected by goauthentik | ||||
| proxy_buffers 8 16k; | ||||
| proxy_buffer_size 32k; | ||||
| fastcgi_buffers 16 16k; | ||||
| fastcgi_buffer_size 32k; | ||||
|  | ||||
| location / { | ||||
|     # Put your proxy_pass to your application here | ||||
| @ -16,6 +14,8 @@ location / { | ||||
|     # authentik-specific config | ||||
|     auth_request        /akprox/auth/nginx; | ||||
|     error_page          401 = @akprox_signin; | ||||
|     auth_request_set $auth_cookie $upstream_http_set_cookie; | ||||
|     add_header Set-Cookie $auth_cookie; | ||||
|  | ||||
|     # translate headers from the outposts back to the actual upstream | ||||
|     auth_request_set $authentik_username $upstream_http_x_authentik_username; | ||||
| @ -37,6 +37,7 @@ location /akprox { | ||||
|     # ensure the host of this vserver matches your external URL you've configured | ||||
|     # in authentik | ||||
|     proxy_set_header    Host $host; | ||||
|     proxy_set_header    X-Original-URL $scheme://$http_host$request_uri; | ||||
|     add_header          Set-Cookie $auth_cookie; | ||||
|     auth_request_set    $auth_cookie $upstream_http_set_cookie; | ||||
| } | ||||
|  | ||||
| @ -13,8 +13,6 @@ server { | ||||
|     # header from upstream' error when trying to access an application protected by goauthentik | ||||
|     proxy_buffers 8 16k; | ||||
|     proxy_buffer_size 32k; | ||||
|     fastcgi_buffers 16 16k; | ||||
|     fastcgi_buffer_size 32k; | ||||
|  | ||||
|     location / { | ||||
|         # Put your proxy_pass to your application here | ||||
| @ -25,6 +23,8 @@ server { | ||||
|         error_page          401 = @akprox_signin; | ||||
|         # For domain level, use the below error_page to redirect to your authentik server with the full redirect path | ||||
|         # error_page          401 =302 https://authentik.company/akprox/start?rd=$scheme://$http_host$request_uri; | ||||
|         auth_request_set $auth_cookie $upstream_http_set_cookie; | ||||
|         add_header Set-Cookie $auth_cookie; | ||||
|  | ||||
|         # translate headers from the outposts back to the actual upstream | ||||
|         auth_request_set $authentik_username $upstream_http_x_authentik_username; | ||||
| @ -46,6 +46,7 @@ server { | ||||
|         # ensure the host of this vserver matches your external URL you've configured | ||||
|         # in authentik | ||||
|         proxy_set_header    Host $host; | ||||
|         proxy_set_header    X-Original-URL $scheme://$http_host$request_uri; | ||||
|         add_header          Set-Cookie $auth_cookie; | ||||
|         auth_request_set    $auth_cookie $upstream_http_set_cookie; | ||||
|     } | ||||
|  | ||||
| @ -58,6 +58,34 @@ This release mostly removes legacy fields and features that have been deprecated | ||||
| - web/admin: fix missing configure flow setting on webuahtn setup stage form | ||||
| - web/flows: remove node directly instead of using removeChild() | ||||
|  | ||||
| ## Fixed in 2022.1.2 | ||||
|  | ||||
| - internal/proxyv2: only allow access to /akprox in nginx mode when forward url could be extracted | ||||
| - lib: disable backup by default, add note to configuration | ||||
| - lifecycle: replace lowercase, deprecated prometheus_multiproc_dir | ||||
| - outposts: allow custom label for docker containers | ||||
| - policies/hibp: ensure password is encodable | ||||
| - providers/proxy: add PathPrefix to auto-traefik labels | ||||
| - root: upgrade python dependencies | ||||
|  | ||||
| ## Fixed in 2022.1.3 | ||||
|  | ||||
| - internal: add support for X-Original-URL | ||||
| - internal: add optional debug server listening on 9900 | ||||
| - internal: don't override server header | ||||
| - internal: start adding tests to outpost | ||||
| - lifecycle: make secret_key warning more prominent | ||||
| - lifecycle: wait for db in worker | ||||
| - outposts/ldap: Fix more case sensitivity issues. (#2144) | ||||
| - outposts/proxy: add more test cases for domain-level auth | ||||
| - outposts/proxy: fix potential empty redirect, add tests | ||||
| - outposts/proxy: trace full headers to debug | ||||
| - providers/proxy: fix traefik label | ||||
| - root: add max-requests for gunicorn and max tasks for celery | ||||
| - root: fix redis passwords not being encoded correctly | ||||
| - web/admin: fix links which look like labels | ||||
| - web/admin: fix SMS Stage form not working | ||||
|  | ||||
| ## Upgrading | ||||
|  | ||||
| This release does not introduce any new requirements. | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	