From b42b7be7265f5ff69e4e3bd115cfc7100f84659e Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 11 Apr 2021 16:51:50 +0200
Subject: [PATCH 01/13] outpost: fix build dependencies

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 outpost/go.mod | 12 ++++++------
 outpost/go.sum | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 6 deletions(-)

diff --git a/outpost/go.mod b/outpost/go.mod
index 043d1c5d0..3abd3db2a 100644
--- a/outpost/go.mod
+++ b/outpost/go.mod
@@ -6,13 +6,14 @@ require (
 	github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect
 	github.com/coreos/go-oidc v2.2.1+incompatible
 	github.com/getsentry/sentry-go v0.10.0
+	github.com/go-openapi/analysis v0.20.1 // indirect
 	github.com/go-openapi/errors v0.20.0
 	github.com/go-openapi/runtime v0.19.27
 	github.com/go-openapi/strfmt v0.20.1
 	github.com/go-openapi/swag v0.19.15
 	github.com/go-openapi/validate v0.20.2
 	github.com/go-redis/redis/v7 v7.4.0 // indirect
-	github.com/golang/protobuf v1.4.3 // indirect
+	github.com/go-swagger/go-swagger v0.27.0 // indirect
 	github.com/gorilla/websocket v1.4.2
 	github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a
 	github.com/justinas/alice v1.2.0
@@ -20,9 +21,8 @@ require (
 	github.com/magiconair/properties v1.8.5 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/oauth2-proxy/oauth2-proxy v0.0.0-20200831161845-e4e5580852dc
-	github.com/pelletier/go-toml v1.8.1 // indirect
+	github.com/pelletier/go-toml v1.9.0 // indirect
 	github.com/pkg/errors v0.9.1
-	github.com/pquerna/cachecontrol v0.0.0-20200921180117-858c6e7e6b7e // indirect
 	github.com/recws-org/recws v1.3.1
 	github.com/sirupsen/logrus v1.8.1
 	github.com/spf13/afero v1.6.0 // indirect
@@ -30,10 +30,10 @@ require (
 	github.com/spf13/jwalterweatherman v1.1.0 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
 	github.com/spf13/viper v1.7.1 // indirect
-	golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 // indirect
-	golang.org/x/net v0.0.0-20210331060903-cb1fcc7394e5 // indirect
-	golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58 // indirect
+	golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1 // indirect
+	golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
+	google.golang.org/grpc v1.31.0 // indirect
 	gopkg.in/ini.v1 v1.62.0 // indirect
 	gopkg.in/square/go-jose.v2 v2.5.1 // indirect
 )
diff --git a/outpost/go.sum b/outpost/go.sum
index ceaa3866f..adf47e9a3 100644
--- a/outpost/go.sum
+++ b/outpost/go.sum
@@ -102,6 +102,7 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
+github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -123,6 +124,8 @@ github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHj
 github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
+github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
+github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 github.com/frankban/quicktest v1.10.0 h1:Gfh+GAJZOAoKZsIZeZbdn2JF10kN1XHNvjsvQK8gVkE=
 github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
@@ -156,6 +159,8 @@ github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgT
 github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk=
 github.com/go-openapi/analysis v0.20.0 h1:UN09o0kNhleunxW7LR+KnltD0YrJ8FF03pSqvAN3Vro=
 github.com/go-openapi/analysis v0.20.0/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og=
+github.com/go-openapi/analysis v0.20.1 h1:zdVbw8yoD4SWZeq+cWdGgquaB0W4VrsJvDJHJND/Ktc=
+github.com/go-openapi/analysis v0.20.1/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og=
 github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
@@ -166,6 +171,8 @@ github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpX
 github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
 github.com/go-openapi/errors v0.20.0 h1:Sxpo9PjEHDzhs3FbnGNonvDgWcMW2U7wGTcDDSFSceM=
 github.com/go-openapi/errors v0.20.0/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
+github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4=
+github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4=
 github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
@@ -245,6 +252,9 @@ github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRf
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-swagger/go-swagger v0.27.0 h1:K7+nkBuf4oS1jTBrdvWqYFpqD69V5CN8HamZzCDDhAI=
+github.com/go-swagger/go-swagger v0.27.0/go.mod h1:WodZVysInJilkW7e6IRw+dZGp5yW6rlMFZ4cb+THl9A=
+github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0=
 github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
 github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
 github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
@@ -302,6 +312,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
 github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
 github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/gomodule/redigo v1.7.1-0.20190322064113-39e2c31b7ca3/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
 github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
@@ -318,6 +331,7 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
@@ -338,6 +352,8 @@ github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
+github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
 github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
@@ -376,6 +392,8 @@ github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/
 github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk=
 github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g=
 github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw=
+github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
+github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
 github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt70eK/BSch+gFAGrNzecsoENgu2o=
 github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s=
 github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
@@ -505,6 +523,8 @@ github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUr
 github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
 github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM=
 github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
+github.com/pelletier/go-toml v1.9.0 h1:NOd0BRdOKpPf0SxkL3HxSQOG7rNh+4kl6PHcBPFs7Q0=
+github.com/pelletier/go-toml v1.9.0/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
 github.com/pierrec/lz4 v2.5.2+incompatible h1:WCjObylUIOlKy/+7Abdn34TLIkXiA4UWUMhxq9m9ZXI=
 github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
@@ -520,6 +540,8 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr
 github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
 github.com/pquerna/cachecontrol v0.0.0-20200921180117-858c6e7e6b7e h1:BLqxdwZ6j771IpSCRx7s/GJjXHUE00Hmu7/YegCGdzA=
 github.com/pquerna/cachecontrol v0.0.0-20200921180117-858c6e7e6b7e/go.mod h1:hoLfEwdY11HjRfKFH6KqnPsfxlo3BP6bJehpDv8t6sQ=
+github.com/pquerna/cachecontrol v0.0.0-20201205024021-ac21108117ac h1:jWKYCNlX4J5s8M0nHYkh7Y7c9gRVDEb3mq51j5J0F5M=
+github.com/pquerna/cachecontrol v0.0.0-20201205024021-ac21108117ac/go.mod h1:hoLfEwdY11HjRfKFH6KqnPsfxlo3BP6bJehpDv8t6sQ=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
@@ -537,6 +559,7 @@ github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
 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=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g=
@@ -563,6 +586,7 @@ github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
 github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
+github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
 github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
@@ -571,6 +595,7 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
 github.com/spf13/viper v1.6.3/go.mod h1:jUMtyi0/lB5yZH/FjyGAoH7IMNrIhlBf6pXZmbMDvzw=
+github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
 github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -588,6 +613,8 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69
 github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ=
+github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM=
 github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
@@ -622,6 +649,7 @@ github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZ
 github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/gopher-lua v0.0.0-20190206043414-8bfc7677f583/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ=
 github.com/yuin/gopher-lua v0.0.0-20191213034115-f46add6fdb5c/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ=
 github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb h1:ZkM6LRnq40pR1Ox0hTHlnpkcOTuFIDQpZ1IN8rKKhX0=
@@ -664,6 +692,8 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 h1:xYJJ3S178yv++9zXV/hnr29plCAGO9vAFG9dorqaFQc=
 golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
+golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -694,6 +724,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
 golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -734,12 +766,16 @@ golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/
 golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210331060903-cb1fcc7394e5 h1:zuP3axpB9rV3xH0EA7n3/gCrNPZm2SRl0l4mVH2BRj4=
 golang.org/x/net v0.0.0-20210331060903-cb1fcc7394e5/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1 h1:4qWs8cYYH6PoEFy4dfhDFgoMGkwAcETd+MmPdCPMzUc=
+golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -747,6 +783,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr
 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58 h1:Mj83v+wSRNEar42a/MQgxk9X42TdEmrOl9i+y8WbxLo=
 golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210323180902-22b0adad7558 h1:D7nTwh4J0i+5mW4Zjzn5omvlr6YBcWywE6KOcatyNxY=
+golang.org/x/oauth2 v0.0.0-20210323180902-22b0adad7558/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -756,6 +794,7 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -806,8 +845,12 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44 h1:Bli41pIlzTzf3KEY06n+xnzK/BESIg2ze4Pgfh/aI8c=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 h1:F5Gozwx4I1xtr/sr/8CFbb57iKi3297KFs0QDbGN60A=
+golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -818,6 +861,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -874,6 +919,8 @@ golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roY
 golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -959,6 +1006,9 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
 google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
 google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

From b526250515dbbf9d1db8d23da026bd3a655f2d22 Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 11 Apr 2021 17:41:26 +0200
Subject: [PATCH 02/13] web: fix header colour for notification drawer in dark
 mode

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 web/src/authentik.css | 1 +
 1 file changed, 1 insertion(+)

diff --git a/web/src/authentik.css b/web/src/authentik.css
index a1a7bebc1..ea7769dcf 100644
--- a/web/src/authentik.css
+++ b/web/src/authentik.css
@@ -279,6 +279,7 @@ body {
     }
     .pf-c-notification-drawer__header {
         background-color: var(--ak-dark-background-lighter);
+        color: var(--ak-dark-foreground);
     }
     /* data list */
     .pf-c-data-list__item {

From 078dfb30f3bf9802bd45e15d95b397ac32c3e539 Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 11 Apr 2021 17:45:37 +0200
Subject: [PATCH 03/13] web/admin: make username in events log clickable

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 web/src/pages/events/EventListPage.ts | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/web/src/pages/events/EventListPage.ts b/web/src/pages/events/EventListPage.ts
index 26433c00d..32bac4d25 100644
--- a/web/src/pages/events/EventListPage.ts
+++ b/web/src/pages/events/EventListPage.ts
@@ -47,16 +47,21 @@ export class EventListPage extends TablePage<Event> {
             new TableColumn(""),
         ];
     }
+
     row(item: EventWithContext): TemplateResult[] {
         return [
             html`<div>${item.action}</div>
             <small>${item.app}</small>`,
-            html`<div>${item.user?.username}</div>
-            ${item.user.on_behalf_of ? html`<small>
-                ${t`On behalf of ${item.user.on_behalf_of.username}`}
-            </small>` : html``}`,
+            item.user?.username ?
+                html`<a href="#/identity/users/${item.user.pk}">
+                    ${item.user?.username}
+                </a>
+                ${item.user.on_behalf_of ? html`<small>
+                    ${t`On behalf of ${item.user.on_behalf_of.username}`}
+                </small>` : html``}` :
+                html`-`,
             html`<span>${item.created?.toLocaleString()}</span>`,
-            html`<span>${item.clientIp}</span>`,
+            html`<span>${item.clientIp || "-"}</span>`,
             html`<a href="#/events/log/${item.pk}">
                 <i class="fas fas fa-share-square"></i>
             </a>`,

From 5c133a6c3023b42cbe99d1382c880ea5ba8d6c8d Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 11 Apr 2021 18:24:27 +0200
Subject: [PATCH 04/13] web/elements: make provider clickable for user's oauth
 codes

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 web/src/elements/oauth/UserCodeList.ts    |  4 ++-
 web/src/elements/oauth/UserRefreshList.ts |  4 ++-
 web/src/locales/en.po                     | 34 +++++++++++------------
 web/src/locales/pseudo-LOCALE.po          | 34 +++++++++++------------
 4 files changed, 40 insertions(+), 36 deletions(-)

diff --git a/web/src/elements/oauth/UserCodeList.ts b/web/src/elements/oauth/UserCodeList.ts
index 3bbc89496..a7a5b1aa9 100644
--- a/web/src/elements/oauth/UserCodeList.ts
+++ b/web/src/elements/oauth/UserCodeList.ts
@@ -35,7 +35,9 @@ export class UserOAuthCodeList extends Table<ExpiringBaseGrantModel> {
 
     row(item: ExpiringBaseGrantModel): TemplateResult[] {
         return [
-            html`${item.provider.name}`,
+            html`<a href="#/core/providers/${item.provider?.pk}">
+                ${item.provider?.name}
+            </a>`,
             html`${item.expires?.toLocaleString()}`,
             html`${item.scope.join(", ")}`,
             html`
diff --git a/web/src/elements/oauth/UserRefreshList.ts b/web/src/elements/oauth/UserRefreshList.ts
index 8a0154aa5..5cb6ef1f7 100644
--- a/web/src/elements/oauth/UserRefreshList.ts
+++ b/web/src/elements/oauth/UserRefreshList.ts
@@ -35,7 +35,9 @@ export class UserOAuthRefreshList extends Table<ExpiringBaseGrantModel> {
 
     row(item: ExpiringBaseGrantModel): TemplateResult[] {
         return [
-            html`${item.provider.name}`,
+            html`<a href="#/core/providers/${item.provider?.pk}">
+                ${item.provider?.name}
+            </a>`,
             html`${item.expires?.toLocaleString()}`,
             html`${item.scope.join(", ")}`,
             html`
diff --git a/web/src/locales/en.po b/web/src/locales/en.po
index 933cfe005..fc4186093 100644
--- a/web/src/locales/en.po
+++ b/web/src/locales/en.po
@@ -283,7 +283,7 @@ msgstr "Authenticator"
 msgid "Authorization"
 msgstr "Authorization"
 
-#: src/elements/oauth/UserCodeList.ts:44
+#: src/elements/oauth/UserCodeList.ts:46
 msgid "Authorization Code"
 msgstr "Authorization Code"
 
@@ -461,7 +461,7 @@ msgstr "Change password"
 msgid "Change your password"
 msgstr "Change your password"
 
-#: src/pages/applications/ApplicationViewPage.ts:118
+#: src/pages/applications/ApplicationViewPage.ts:119
 #: src/pages/flows/FlowViewPage.ts:110
 #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:136
 #: src/pages/providers/proxy/ProxyProviderViewPage.ts:135
@@ -883,7 +883,7 @@ msgstr "Define how notifications are sent to users, like Email or Webhook."
 msgid "Delete"
 msgstr "Delete"
 
-#: src/elements/oauth/UserCodeList.ts:51
+#: src/elements/oauth/UserCodeList.ts:53
 msgid "Delete Authorization Code"
 msgstr "Delete Authorization Code"
 
@@ -896,7 +896,7 @@ msgstr "Delete Binding"
 msgid "Delete Consent"
 msgstr "Delete Consent"
 
-#: src/elements/oauth/UserRefreshList.ts:51
+#: src/elements/oauth/UserRefreshList.ts:53
 msgid "Delete Refresh Code"
 msgstr "Delete Refresh Code"
 
@@ -1008,8 +1008,8 @@ msgid "Each provider has a different issuer, based on the application slug."
 msgstr "Each provider has a different issuer, based on the application slug."
 
 #: src/pages/applications/ApplicationListPage.ts:94
-#: src/pages/applications/ApplicationViewPage.ts:94
-#: src/pages/applications/ApplicationViewPage.ts:108
+#: src/pages/applications/ApplicationViewPage.ts:95
+#: src/pages/applications/ApplicationViewPage.ts:109
 #: src/pages/crypto/CertificateKeyPairListPage.ts:74
 #: src/pages/events/RuleListPage.ts:70
 #: src/pages/events/TransportListPage.ts:74
@@ -1669,7 +1669,7 @@ msgstr "Library"
 #: src/flows/stages/identification/IdentificationStage.ts:134
 #: src/flows/stages/password/PasswordStage.ts:31
 #: src/flows/stages/prompt/PromptStage.ts:126
-#: src/pages/applications/ApplicationViewPage.ts:59
+#: src/pages/applications/ApplicationViewPage.ts:60
 #: src/pages/user-settings/UserDetailsPage.ts:38
 #: src/utils.ts:40
 msgid "Loading"
@@ -1749,7 +1749,7 @@ msgid "Logins"
 msgstr "Logins"
 
 #: src/pages/admin-overview/AdminOverviewPage.ts:39
-#: src/pages/applications/ApplicationViewPage.ts:67
+#: src/pages/applications/ApplicationViewPage.ts:68
 msgid "Logins over the last 24 hours"
 msgstr "Logins over the last 24 hours"
 
@@ -2084,7 +2084,7 @@ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)
 msgstr "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)."
 
 #: src/elements/events/ObjectChangelog.ts:50
-#: src/pages/events/EventListPage.ts:57
+#: src/pages/events/EventListPage.ts:60
 msgid "On behalf of {0}"
 msgstr "On behalf of {0}"
 
@@ -2175,7 +2175,7 @@ msgid "Outposts are deployments of authentik components to support different env
 msgstr "Outposts are deployments of authentik components to support different environments and protocols, like reverse proxies."
 
 #: src/interfaces/AdminInterface.ts:17
-#: src/pages/applications/ApplicationViewPage.ts:64
+#: src/pages/applications/ApplicationViewPage.ts:65
 #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:65
 #: src/pages/providers/proxy/ProxyProviderViewPage.ts:56
 #: src/pages/providers/saml/SAMLProviderViewPage.ts:58
@@ -2255,7 +2255,7 @@ msgstr "Policy"
 msgid "Policy / User / Group"
 msgstr "Policy / User / Group"
 
-#: src/pages/applications/ApplicationViewPage.ts:129
+#: src/pages/applications/ApplicationViewPage.ts:130
 #: src/pages/flows/FlowViewPage.ts:101
 #: src/pages/sources/oauth/OAuthSourceViewPage.ts:143
 #: src/pages/sources/saml/SAMLSourceViewPage.ts:150
@@ -2374,7 +2374,7 @@ msgstr "Provide support for protocols like SAML and OAuth to assigned applicatio
 #: src/elements/oauth/UserRefreshList.ts:29
 #: src/pages/applications/ApplicationForm.ts:100
 #: src/pages/applications/ApplicationListPage.ts:59
-#: src/pages/applications/ApplicationViewPage.ts:81
+#: src/pages/applications/ApplicationViewPage.ts:82
 #: src/pages/providers/ProviderListPage.ts:34
 msgid "Provider"
 msgstr "Provider"
@@ -2476,7 +2476,7 @@ msgstr "Redirect binding"
 msgid "Refresh"
 msgstr "Refresh"
 
-#: src/elements/oauth/UserRefreshList.ts:44
+#: src/elements/oauth/UserRefreshList.ts:46
 msgid "Refresh Code"
 msgstr "Refresh Code"
 
@@ -2488,7 +2488,7 @@ msgstr "Register device"
 msgid "Regular expressions for which authentication is not required. Each new line is interpreted as a new Regular Expression."
 msgstr "Regular expressions for which authentication is not required. Each new line is interpreted as a new Regular Expression."
 
-#: src/pages/applications/ApplicationViewPage.ts:75
+#: src/pages/applications/ApplicationViewPage.ts:76
 #: src/pages/flows/FlowViewPage.ts:64
 msgid "Related"
 msgstr "Related"
@@ -3287,7 +3287,7 @@ msgstr ""
 msgid "These policies control when this stage will be applied to the flow."
 msgstr "These policies control when this stage will be applied to the flow."
 
-#: src/pages/applications/ApplicationViewPage.ts:131
+#: src/pages/applications/ApplicationViewPage.ts:132
 msgid "These policies control which users can access this application."
 msgstr "These policies control which users can access this application."
 
@@ -3440,7 +3440,7 @@ msgid "Up-to-date!"
 msgstr "Up-to-date!"
 
 #: src/pages/applications/ApplicationListPage.ts:86
-#: src/pages/applications/ApplicationViewPage.ts:100
+#: src/pages/applications/ApplicationViewPage.ts:101
 #: src/pages/crypto/CertificateKeyPairListPage.ts:66
 #: src/pages/events/RuleListPage.ts:62
 #: src/pages/events/TransportListPage.ts:66
@@ -3478,7 +3478,7 @@ msgid "Update"
 msgstr "Update"
 
 #: src/pages/applications/ApplicationListPage.ts:89
-#: src/pages/applications/ApplicationViewPage.ts:103
+#: src/pages/applications/ApplicationViewPage.ts:104
 msgid "Update Application"
 msgstr "Update Application"
 
diff --git a/web/src/locales/pseudo-LOCALE.po b/web/src/locales/pseudo-LOCALE.po
index 17d70a677..164dac6e9 100644
--- a/web/src/locales/pseudo-LOCALE.po
+++ b/web/src/locales/pseudo-LOCALE.po
@@ -279,7 +279,7 @@ msgstr ""
 msgid "Authorization"
 msgstr ""
 
-#: src/elements/oauth/UserCodeList.ts:44
+#: src/elements/oauth/UserCodeList.ts:46
 msgid "Authorization Code"
 msgstr ""
 
@@ -457,7 +457,7 @@ msgstr ""
 msgid "Change your password"
 msgstr ""
 
-#: src/pages/applications/ApplicationViewPage.ts:118
+#: src/pages/applications/ApplicationViewPage.ts:119
 #: src/pages/flows/FlowViewPage.ts:110
 #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:136
 #: src/pages/providers/proxy/ProxyProviderViewPage.ts:135
@@ -877,7 +877,7 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
-#: src/elements/oauth/UserCodeList.ts:51
+#: src/elements/oauth/UserCodeList.ts:53
 msgid "Delete Authorization Code"
 msgstr ""
 
@@ -890,7 +890,7 @@ msgstr ""
 msgid "Delete Consent"
 msgstr ""
 
-#: src/elements/oauth/UserRefreshList.ts:51
+#: src/elements/oauth/UserRefreshList.ts:53
 msgid "Delete Refresh Code"
 msgstr ""
 
@@ -1000,8 +1000,8 @@ msgid "Each provider has a different issuer, based on the application slug."
 msgstr ""
 
 #: src/pages/applications/ApplicationListPage.ts:94
-#: src/pages/applications/ApplicationViewPage.ts:94
-#: src/pages/applications/ApplicationViewPage.ts:108
+#: src/pages/applications/ApplicationViewPage.ts:95
+#: src/pages/applications/ApplicationViewPage.ts:109
 #: src/pages/crypto/CertificateKeyPairListPage.ts:74
 #: src/pages/events/RuleListPage.ts:70
 #: src/pages/events/TransportListPage.ts:74
@@ -1661,7 +1661,7 @@ msgstr ""
 #: src/flows/stages/identification/IdentificationStage.ts:134
 #: src/flows/stages/password/PasswordStage.ts:31
 #: src/flows/stages/prompt/PromptStage.ts:126
-#: src/pages/applications/ApplicationViewPage.ts:59
+#: src/pages/applications/ApplicationViewPage.ts:60
 #: src/pages/user-settings/UserDetailsPage.ts:38
 #: src/utils.ts:40
 msgid "Loading"
@@ -1741,7 +1741,7 @@ msgid "Logins"
 msgstr ""
 
 #: src/pages/admin-overview/AdminOverviewPage.ts:39
-#: src/pages/applications/ApplicationViewPage.ts:67
+#: src/pages/applications/ApplicationViewPage.ts:68
 msgid "Logins over the last 24 hours"
 msgstr ""
 
@@ -2076,7 +2076,7 @@ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)
 msgstr ""
 
 #: src/elements/events/ObjectChangelog.ts:50
-#: src/pages/events/EventListPage.ts:57
+#: src/pages/events/EventListPage.ts:60
 msgid "On behalf of {0}"
 msgstr ""
 
@@ -2167,7 +2167,7 @@ msgid "Outposts are deployments of authentik components to support different env
 msgstr ""
 
 #: src/interfaces/AdminInterface.ts:17
-#: src/pages/applications/ApplicationViewPage.ts:64
+#: src/pages/applications/ApplicationViewPage.ts:65
 #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:65
 #: src/pages/providers/proxy/ProxyProviderViewPage.ts:56
 #: src/pages/providers/saml/SAMLProviderViewPage.ts:58
@@ -2247,7 +2247,7 @@ msgstr ""
 msgid "Policy / User / Group"
 msgstr ""
 
-#: src/pages/applications/ApplicationViewPage.ts:129
+#: src/pages/applications/ApplicationViewPage.ts:130
 #: src/pages/flows/FlowViewPage.ts:101
 #: src/pages/sources/oauth/OAuthSourceViewPage.ts:143
 #: src/pages/sources/saml/SAMLSourceViewPage.ts:150
@@ -2366,7 +2366,7 @@ msgstr ""
 #: src/elements/oauth/UserRefreshList.ts:29
 #: src/pages/applications/ApplicationForm.ts:100
 #: src/pages/applications/ApplicationListPage.ts:59
-#: src/pages/applications/ApplicationViewPage.ts:81
+#: src/pages/applications/ApplicationViewPage.ts:82
 #: src/pages/providers/ProviderListPage.ts:34
 msgid "Provider"
 msgstr ""
@@ -2468,7 +2468,7 @@ msgstr ""
 msgid "Refresh"
 msgstr ""
 
-#: src/elements/oauth/UserRefreshList.ts:44
+#: src/elements/oauth/UserRefreshList.ts:46
 msgid "Refresh Code"
 msgstr ""
 
@@ -2480,7 +2480,7 @@ msgstr ""
 msgid "Regular expressions for which authentication is not required. Each new line is interpreted as a new Regular Expression."
 msgstr ""
 
-#: src/pages/applications/ApplicationViewPage.ts:75
+#: src/pages/applications/ApplicationViewPage.ts:76
 #: src/pages/flows/FlowViewPage.ts:64
 msgid "Related"
 msgstr ""
@@ -3277,7 +3277,7 @@ msgstr ""
 msgid "These policies control when this stage will be applied to the flow."
 msgstr ""
 
-#: src/pages/applications/ApplicationViewPage.ts:131
+#: src/pages/applications/ApplicationViewPage.ts:132
 msgid "These policies control which users can access this application."
 msgstr ""
 
@@ -3430,7 +3430,7 @@ msgid "Up-to-date!"
 msgstr ""
 
 #: src/pages/applications/ApplicationListPage.ts:86
-#: src/pages/applications/ApplicationViewPage.ts:100
+#: src/pages/applications/ApplicationViewPage.ts:101
 #: src/pages/crypto/CertificateKeyPairListPage.ts:66
 #: src/pages/events/RuleListPage.ts:62
 #: src/pages/events/TransportListPage.ts:66
@@ -3468,7 +3468,7 @@ msgid "Update"
 msgstr ""
 
 #: src/pages/applications/ApplicationListPage.ts:89
-#: src/pages/applications/ApplicationViewPage.ts:103
+#: src/pages/applications/ApplicationViewPage.ts:104
 msgid "Update Application"
 msgstr ""
 

From a736e708ae6619467109b1f39ddcd822ac6dbec2 Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 11 Apr 2021 18:40:01 +0200
Subject: [PATCH 05/13] web/admin: use less generic slot names for ak-tabs

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 web/src/pages/applications/ApplicationViewPage.ts      |  4 ++--
 web/src/pages/flows/FlowViewPage.ts                    |  8 ++++----
 .../pages/providers/oauth2/OAuth2ProviderViewPage.ts   |  6 +++---
 web/src/pages/providers/proxy/ProxyProviderViewPage.ts |  4 ++--
 web/src/pages/providers/saml/SAMLProviderViewPage.ts   |  6 +++---
 web/src/pages/sources/ldap/LDAPSourceViewPage.ts       |  6 +++---
 web/src/pages/sources/oauth/OAuthSourceViewPage.ts     |  6 +++---
 web/src/pages/sources/saml/SAMLSourceViewPage.ts       |  8 ++++----
 web/src/pages/user-settings/UserSettingsPage.ts        |  4 ++--
 web/src/pages/users/UserViewPage.ts                    | 10 +++++-----
 10 files changed, 31 insertions(+), 31 deletions(-)

diff --git a/web/src/pages/applications/ApplicationViewPage.ts b/web/src/pages/applications/ApplicationViewPage.ts
index 95d28a557..c27fb10aa 100644
--- a/web/src/pages/applications/ApplicationViewPage.ts
+++ b/web/src/pages/applications/ApplicationViewPage.ts
@@ -67,7 +67,7 @@ export class ApplicationViewPage extends LitElement {
         }
         return html`
             <ak-tabs>
-                <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-overview" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-l-gallery pf-m-gutter">
                         <div class="pf-c-card pf-l-gallery__item" style="grid-column-end: span 3;grid-row-end: span 2;">
                             <div class="pf-c-card__title">${t`Logins over the last 24 hours`}</div>
@@ -132,7 +132,7 @@ export class ApplicationViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <div slot="page-2" data-tab-title="${t`Policy Bindings`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <div slot="page-policy-bindings" data-tab-title="${t`Policy Bindings`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__title">${t`These policies control which users can access this application.`}</div>
                         <ak-bound-policies-list .target=${this.application.pk}>
diff --git a/web/src/pages/flows/FlowViewPage.ts b/web/src/pages/flows/FlowViewPage.ts
index 8c49533c1..0736ba981 100644
--- a/web/src/pages/flows/FlowViewPage.ts
+++ b/web/src/pages/flows/FlowViewPage.ts
@@ -56,7 +56,7 @@ export class FlowViewPage extends LitElement {
             description=${this.flow.title}>
             </ak-page-header>
             <ak-tabs>
-                <div slot="page-1" data-tab-title="${t`Flow Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <div slot="page-overview" data-tab-title="${t`Flow Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-l-gallery pf-m-gutter">
                         <div class="pf-c-card pf-l-gallery__item" style="grid-column-end: span 4;grid-row-end: span 2;">
                             <div class="pf-c-card">
@@ -96,7 +96,7 @@ export class FlowViewPage extends LitElement {
                         </div>
                     </div>
                 </div>
-                <div slot="page-2" data-tab-title="${t`Stage Bindings`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <div slot="page-stage-bindings" data-tab-title="${t`Stage Bindings`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__body">
                             <ak-bound-stages-list .target=${this.flow.pk}>
@@ -104,7 +104,7 @@ export class FlowViewPage extends LitElement {
                         </div>
                     </div>
                 </div>
-                <div slot="page-3" data-tab-title="${t`Policy Bindings`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <div slot="page-policy-bindings" data-tab-title="${t`Policy Bindings`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__title">${t`These policies control which users can access this flow.`}</div>
                         <div class="pf-c-card__body">
@@ -113,7 +113,7 @@ export class FlowViewPage extends LitElement {
                         </div>
                     </div>
                 </div>
-                <div slot="page-4" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <div slot="page-changelog" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__body">
                             <ak-object-changelog
diff --git a/web/src/pages/providers/oauth2/OAuth2ProviderViewPage.ts b/web/src/pages/providers/oauth2/OAuth2ProviderViewPage.ts
index bd513cff6..9779129df 100644
--- a/web/src/pages/providers/oauth2/OAuth2ProviderViewPage.ts
+++ b/web/src/pages/providers/oauth2/OAuth2ProviderViewPage.ts
@@ -67,7 +67,7 @@ export class OAuth2ProviderViewPage extends LitElement {
             return html``;
         }
         return html`<ak-tabs>
-                <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-overview" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-u-display-flex pf-u-justify-content-center">
                         <div class="pf-u-w-75">
                             <div class="pf-c-card">
@@ -138,7 +138,7 @@ export class OAuth2ProviderViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-changelog" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__body">
                             <ak-object-changelog
@@ -149,7 +149,7 @@ export class OAuth2ProviderViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <section slot="page-3" data-tab-title="${t`Metadata`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-metadata" data-tab-title="${t`Metadata`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-u-display-flex pf-u-justify-content-center">
                         <div class="pf-u-w-75">
                             <div class="pf-c-card">
diff --git a/web/src/pages/providers/proxy/ProxyProviderViewPage.ts b/web/src/pages/providers/proxy/ProxyProviderViewPage.ts
index 38229fefe..05cafd475 100644
--- a/web/src/pages/providers/proxy/ProxyProviderViewPage.ts
+++ b/web/src/pages/providers/proxy/ProxyProviderViewPage.ts
@@ -58,7 +58,7 @@ export class ProxyProviderViewPage extends LitElement {
             return html``;
         }
         return html`<ak-tabs>
-                <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-overview" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-u-display-flex pf-u-justify-content-center">
                         <div class="pf-u-w-75">
                             <div class="pf-c-card">
@@ -138,7 +138,7 @@ export class ProxyProviderViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-changelog" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__body">
                             <ak-object-changelog
diff --git a/web/src/pages/providers/saml/SAMLProviderViewPage.ts b/web/src/pages/providers/saml/SAMLProviderViewPage.ts
index 74e656b27..62f5ed8bc 100644
--- a/web/src/pages/providers/saml/SAMLProviderViewPage.ts
+++ b/web/src/pages/providers/saml/SAMLProviderViewPage.ts
@@ -60,7 +60,7 @@ export class SAMLProviderViewPage extends LitElement {
             return html``;
         }
         return html`<ak-tabs>
-                <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-overview" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-u-display-flex pf-u-justify-content-center">
                         <div class="pf-u-w-75">
                             <div class="pf-c-card">
@@ -131,7 +131,7 @@ export class SAMLProviderViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-changelog" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__body">
                             <ak-object-changelog
@@ -143,7 +143,7 @@ export class SAMLProviderViewPage extends LitElement {
                     </div>
                 </section>
                 ${this.provider.assignedApplicationName ? html`
-                <section slot="page-3" data-tab-title="${t`Metadata`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-metadata" data-tab-title="${t`Metadata`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-u-display-flex pf-u-justify-content-center">
                         <div class="pf-u-w-75">
                             <div class="pf-c-card">
diff --git a/web/src/pages/sources/ldap/LDAPSourceViewPage.ts b/web/src/pages/sources/ldap/LDAPSourceViewPage.ts
index 478b9ac9d..97f27cefa 100644
--- a/web/src/pages/sources/ldap/LDAPSourceViewPage.ts
+++ b/web/src/pages/sources/ldap/LDAPSourceViewPage.ts
@@ -57,7 +57,7 @@ export class LDAPSourceViewPage extends LitElement {
             return html``;
         }
         return html`<ak-tabs>
-                <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-overview" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-u-display-flex pf-u-justify-content-center">
                         <div class="pf-u-w-75">
                             <div class="pf-c-card">
@@ -114,7 +114,7 @@ export class LDAPSourceViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-changelog" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__body">
                             <ak-object-changelog
@@ -125,7 +125,7 @@ export class LDAPSourceViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <section slot="page-3" data-tab-title="${t`Sync`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-sync" data-tab-title="${t`Sync`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-u-display-flex pf-u-justify-content-center">
                         <div class="pf-u-w-75">
                             <div class="pf-c-card">
diff --git a/web/src/pages/sources/oauth/OAuthSourceViewPage.ts b/web/src/pages/sources/oauth/OAuthSourceViewPage.ts
index 703ece404..f49619f98 100644
--- a/web/src/pages/sources/oauth/OAuthSourceViewPage.ts
+++ b/web/src/pages/sources/oauth/OAuthSourceViewPage.ts
@@ -56,7 +56,7 @@ export class OAuthSourceViewPage extends LitElement {
             return html``;
         }
         return html`<ak-tabs>
-                <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-overview" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-u-display-flex pf-u-justify-content-center">
                         <div class="pf-u-w-75">
                             <div class="pf-c-card">
@@ -133,7 +133,7 @@ export class OAuthSourceViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-changelog" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__body">
                             <ak-object-changelog
@@ -144,7 +144,7 @@ export class OAuthSourceViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <div slot="page-3" data-tab-title="${t`Policy Bindings`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <div slot="page-policy-binding" data-tab-title="${t`Policy Bindings`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__title">${t`These policies control which users can access this source.`}</div>
                         <div class="pf-c-card__body">
diff --git a/web/src/pages/sources/saml/SAMLSourceViewPage.ts b/web/src/pages/sources/saml/SAMLSourceViewPage.ts
index aefce2c6b..3cf2cccee 100644
--- a/web/src/pages/sources/saml/SAMLSourceViewPage.ts
+++ b/web/src/pages/sources/saml/SAMLSourceViewPage.ts
@@ -59,7 +59,7 @@ export class SAMLSourceViewPage extends LitElement {
             return html``;
         }
         return html`<ak-tabs>
-                <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-overview" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-u-display-flex pf-u-justify-content-center">
                         <div class="pf-u-w-75">
                             <div class="pf-c-card">
@@ -120,7 +120,7 @@ export class SAMLSourceViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-changelog" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__body">
                             <ak-object-changelog
@@ -131,7 +131,7 @@ export class SAMLSourceViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <section slot="page-3" data-tab-title="${t`Metadata`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-metadata" data-tab-title="${t`Metadata`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-u-display-flex pf-u-justify-content-center">
                         <div class="pf-u-w-75">
                             <div class="pf-c-card">
@@ -152,7 +152,7 @@ export class SAMLSourceViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <div slot="page-4" data-tab-title="${t`Policy Bindings`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <div slot="page-policy-bindings" data-tab-title="${t`Policy Bindings`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__title">${t`These policies control which users can access this source.`}</div>
                         <div class="pf-c-card__body">
diff --git a/web/src/pages/user-settings/UserSettingsPage.ts b/web/src/pages/user-settings/UserSettingsPage.ts
index d61b3e158..d475167d2 100644
--- a/web/src/pages/user-settings/UserSettingsPage.ts
+++ b/web/src/pages/user-settings/UserSettingsPage.ts
@@ -72,10 +72,10 @@ export class UserSettingsPage extends LitElement {
                     description=${t`Configure settings relevant to your user profile.`}>
                 </ak-page-header>
                 <ak-tabs ?vertical="${true}" style="height: 100%;">
-                    <section slot="page-1" data-tab-title="${t`User details`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                    <section slot="page-details" data-tab-title="${t`User details`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                         <ak-user-details></ak-user-details>
                     </section>
-                    <section slot="page-2" data-tab-title="${t`Tokens`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                    <section slot="page-tokens" data-tab-title="${t`Tokens`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                         <ak-user-token-list></ak-user-token-list>
                     </section>
                     ${until(new StagesApi(DEFAULT_CONFIG).stagesAllUserSettings().then((stages) => {
diff --git a/web/src/pages/users/UserViewPage.ts b/web/src/pages/users/UserViewPage.ts
index 2da02f1cc..82bf1c31c 100644
--- a/web/src/pages/users/UserViewPage.ts
+++ b/web/src/pages/users/UserViewPage.ts
@@ -73,7 +73,7 @@ export class UserViewPage extends LitElement {
             return html``;
         }
         return html`<ak-tabs>
-                <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-overview" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-l-gallery pf-m-gutter">
                         <div class="pf-c-card pf-l-gallery__item pf-m-4-col">
                             <div class="pf-c-card__title">
@@ -175,7 +175,7 @@ export class UserViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-changelog" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__body">
                             <ak-object-changelog
@@ -186,7 +186,7 @@ export class UserViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <section slot="page-3" data-tab-title="${t`Explicit Consent`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-consent" data-tab-title="${t`Explicit Consent`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__body">
                             <ak-user-consent-list .userId="${(this.user.pk || 0).toString()}">
@@ -194,7 +194,7 @@ export class UserViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <section slot="page-4" data-tab-title="${t`OAuth Authorization Codes`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-oauth-code" data-tab-title="${t`OAuth Authorization Codes`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__body">
                             <ak-user-oauth-code-list .userId="${(this.user.pk || 0).toString()}">
@@ -202,7 +202,7 @@ export class UserViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
-                <section slot="page-5" data-tab-title="${t`OAuth Refresh Codes`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                <section slot="page-oauth-refresh" data-tab-title="${t`OAuth Refresh Codes`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__body">
                             <ak-user-oauth-refresh-list .userId="${(this.user.pk || 0).toString()}">

From c91b40fc0718a3ec32107c8618d128d4e897296e Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 11 Apr 2021 18:40:48 +0200
Subject: [PATCH 06/13] web/elements: use same icon for changelog

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 web/src/elements/events/ObjectChangelog.ts | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/web/src/elements/events/ObjectChangelog.ts b/web/src/elements/events/ObjectChangelog.ts
index b14f913d9..be7bb6b8a 100644
--- a/web/src/elements/events/ObjectChangelog.ts
+++ b/web/src/elements/events/ObjectChangelog.ts
@@ -59,7 +59,7 @@ export class ObjectChangelog extends Table<Event> {
                 ${t`On behalf of ${item.user.on_behalf_of.username}`}
             </small>` : html``}`,
             html`<span>${item.created?.toLocaleString()}</span>`,
-            html`<span>${item.clientIp}</span>`,
+            html`<span>${item.clientIp || "-"}</span>`,
         ];
     }
 
@@ -76,7 +76,7 @@ export class ObjectChangelog extends Table<Event> {
     }
 
     renderEmpty(): TemplateResult {
-        return super.renderEmpty(html`<ak-empty-state header=${t`No Events found.`} icon="pf-icon-module">
+        return super.renderEmpty(html`<ak-empty-state header=${t`No Events found.`}>
             <div slot="body">
                 ${t`No matching events could be found.`}
             </div>

From 571772854bce14722c67eb5df9020d00f5a31ed2 Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 11 Apr 2021 18:42:30 +0200
Subject: [PATCH 07/13] web/admin: add tab to show events of a user

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 web/src/elements/events/UserEvents.ts         | 77 +++++++++++++++++++
 web/src/locales/en.po                         | 47 ++++++-----
 web/src/locales/pseudo-LOCALE.po              | 47 ++++++-----
 .../cards/LDAPSyncStatusCard.ts               |  2 +-
 web/src/pages/users/UserViewPage.ts           | 15 +++-
 5 files changed, 148 insertions(+), 40 deletions(-)
 create mode 100644 web/src/elements/events/UserEvents.ts

diff --git a/web/src/elements/events/UserEvents.ts b/web/src/elements/events/UserEvents.ts
new file mode 100644
index 000000000..62d79ae00
--- /dev/null
+++ b/web/src/elements/events/UserEvents.ts
@@ -0,0 +1,77 @@
+import { t } from "@lingui/macro";
+import { customElement, html, property, TemplateResult } from "lit-element";
+import { AKResponse } from "../../api/Client";
+import { Table, TableColumn } from "../table/Table";
+import { Event, EventsApi } from "authentik-api";
+
+import "../forms/DeleteForm";
+import "../Tabs";
+import "../buttons/ModalButton";
+import "../buttons/SpinnerButton";
+import "../buttons/Dropdown";
+import "../../pages/events/EventInfo";
+import { PAGE_SIZE } from "../../constants";
+import { DEFAULT_CONFIG } from "../../api/Config";
+import { EventWithContext } from "../../api/Events";
+
+@customElement("ak-events-user")
+export class ObjectChangelog extends Table<Event> {
+    expandable = true;
+
+    @property()
+    order = "-created";
+
+    @property()
+    targetUser!: string;
+
+    apiEndpoint(page: number): Promise<AKResponse<Event>> {
+        return new EventsApi(DEFAULT_CONFIG).eventsEventsList({
+            page: page,
+            ordering: this.order,
+            pageSize: PAGE_SIZE / 2,
+            username: this.targetUser
+        });
+    }
+
+    columns(): TableColumn[] {
+        return [
+            new TableColumn(t`Action`, "action"),
+            new TableColumn(t`User`, "enabled"),
+            new TableColumn(t`Creation Date`, "created"),
+            new TableColumn(t`Client IP`, "client_ip"),
+        ];
+    }
+
+    row(item: EventWithContext): TemplateResult[] {
+        return [
+            html`${item.action}`,
+            html`<div>${item.user?.username}</div>
+            ${item.user.on_behalf_of ? html`<small>
+                ${t`On behalf of ${item.user.on_behalf_of.username}`}
+            </small>` : html``}`,
+            html`<span>${item.created?.toLocaleString()}</span>`,
+            html`<span>${item.clientIp || "-"}</span>`,
+        ];
+    }
+
+    renderExpanded(item: Event): TemplateResult {
+        return html`
+        <td role="cell" colspan="4">
+            <div class="pf-c-table__expandable-row-content">
+                <ak-event-info .event=${item as EventWithContext}></ak-event-info>
+            </div>
+        </td>
+        <td></td>
+        <td></td>
+        <td></td>`;
+    }
+
+    renderEmpty(): TemplateResult {
+        return super.renderEmpty(html`<ak-empty-state header=${t`No Events found.`}>
+            <div slot="body">
+                ${t`No matching events could be found.`}
+            </div>
+        </ak-empty-state>`);
+    }
+
+}
diff --git a/web/src/locales/en.po b/web/src/locales/en.po
index fc4186093..2329c0fe0 100644
--- a/web/src/locales/en.po
+++ b/web/src/locales/en.po
@@ -69,6 +69,7 @@ msgid "Access token URL"
 msgstr "Access token URL"
 
 #: src/elements/events/ObjectChangelog.ts:38
+#: src/elements/events/UserEvents.ts:35
 #: src/pages/events/EventListPage.ts:43
 #: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:79
 msgid "Action"
@@ -76,7 +77,7 @@ msgstr "Action"
 
 #: src/pages/groups/MemberSelectModal.ts:45
 #: src/pages/users/UserListPage.ts:51
-#: src/pages/users/UserViewPage.ts:115
+#: src/pages/users/UserViewPage.ts:116
 msgid "Active"
 msgstr "Active"
 
@@ -469,7 +470,7 @@ msgstr "Change your password"
 #: src/pages/sources/ldap/LDAPSourceViewPage.ts:113
 #: src/pages/sources/oauth/OAuthSourceViewPage.ts:132
 #: src/pages/sources/saml/SAMLSourceViewPage.ts:119
-#: src/pages/users/UserViewPage.ts:176
+#: src/pages/users/UserViewPage.ts:185
 msgid "Changelog"
 msgstr "Changelog"
 
@@ -536,6 +537,7 @@ msgid "Client ID"
 msgstr "Client ID"
 
 #: src/elements/events/ObjectChangelog.ts:41
+#: src/elements/events/UserEvents.ts:38
 #: src/pages/events/EventListPage.ts:46
 #: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:93
 msgid "Client IP"
@@ -831,6 +833,7 @@ msgid "Created {0}"
 msgstr "Created {0}"
 
 #: src/elements/events/ObjectChangelog.ts:40
+#: src/elements/events/UserEvents.ts:37
 #: src/pages/events/EventListPage.ts:45
 msgid "Creation Date"
 msgstr "Creation Date"
@@ -1031,7 +1034,7 @@ msgstr "Each provider has a different issuer, based on the application slug."
 #: src/pages/stages/prompt/PromptListPage.ts:75
 #: src/pages/user-settings/tokens/UserTokenList.ts:113
 #: src/pages/users/UserListPage.ts:76
-#: src/pages/users/UserViewPage.ts:146
+#: src/pages/users/UserViewPage.ts:147
 msgid "Edit"
 msgstr "Edit"
 
@@ -1064,7 +1067,7 @@ msgstr "Either no applications are defined, or you don't have access to any."
 #: src/pages/stages/identification/IdentificationStageForm.ts:82
 #: src/pages/user-settings/UserDetailsPage.ts:71
 #: src/pages/users/UserForm.ts:61
-#: src/pages/users/UserViewPage.ts:99
+#: src/pages/users/UserViewPage.ts:100
 msgid "Email"
 msgstr "Email"
 
@@ -1224,7 +1227,7 @@ msgstr "Expiry"
 msgid "Expiry date"
 msgstr "Expiry date"
 
-#: src/pages/users/UserViewPage.ts:187
+#: src/pages/users/UserViewPage.ts:196
 msgid "Explicit Consent"
 msgstr "Explicit Consent"
 
@@ -1624,7 +1627,7 @@ msgstr "Label shown next to/above the prompt."
 
 #: src/pages/groups/MemberSelectModal.ts:46
 #: src/pages/users/UserListPage.ts:52
-#: src/pages/users/UserViewPage.ts:107
+#: src/pages/users/UserViewPage.ts:108
 msgid "Last login"
 msgstr "Last login"
 
@@ -1901,7 +1904,7 @@ msgstr "Monitor"
 #: src/pages/user-settings/UserDetailsPage.ts:64
 #: src/pages/users/UserForm.ts:54
 #: src/pages/users/UserListPage.ts:50
-#: src/pages/users/UserViewPage.ts:91
+#: src/pages/users/UserViewPage.ts:92
 msgid "Name"
 msgstr "Name"
 
@@ -1944,6 +1947,7 @@ msgid "No Applications available."
 msgstr "No Applications available."
 
 #: src/elements/events/ObjectChangelog.ts:68
+#: src/elements/events/UserEvents.ts:65
 msgid "No Events found."
 msgstr "No Events found."
 
@@ -1972,6 +1976,7 @@ msgid "No form found"
 msgstr "No form found"
 
 #: src/elements/events/ObjectChangelog.ts:70
+#: src/elements/events/UserEvents.ts:67
 msgid "No matching events could be found."
 msgstr "No matching events could be found."
 
@@ -2058,11 +2063,11 @@ msgstr "Notifications Transport"
 msgid "Number"
 msgstr "Number"
 
-#: src/pages/users/UserViewPage.ts:195
+#: src/pages/users/UserViewPage.ts:204
 msgid "OAuth Authorization Codes"
 msgstr "OAuth Authorization Codes"
 
-#: src/pages/users/UserViewPage.ts:203
+#: src/pages/users/UserViewPage.ts:212
 msgid "OAuth Refresh Codes"
 msgstr "OAuth Refresh Codes"
 
@@ -2084,6 +2089,7 @@ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)
 msgstr "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)."
 
 #: src/elements/events/ObjectChangelog.ts:50
+#: src/elements/events/UserEvents.ts:47
 #: src/pages/events/EventListPage.ts:60
 msgid "On behalf of {0}"
 msgstr "On behalf of {0}"
@@ -2182,7 +2188,7 @@ msgstr "Outposts are deployments of authentik components to support different en
 #: src/pages/sources/ldap/LDAPSourceViewPage.ts:56
 #: src/pages/sources/oauth/OAuthSourceViewPage.ts:55
 #: src/pages/sources/saml/SAMLSourceViewPage.ts:58
-#: src/pages/users/UserViewPage.ts:73
+#: src/pages/users/UserViewPage.ts:74
 msgid "Overview"
 msgstr "Overview"
 
@@ -2520,7 +2526,7 @@ msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."
 msgstr "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."
 
 #: src/pages/users/UserListPage.ts:133
-#: src/pages/users/UserViewPage.ts:164
+#: src/pages/users/UserViewPage.ts:165
 msgid "Reset Password"
 msgstr "Reset Password"
 
@@ -3047,7 +3053,7 @@ msgid "Successfully generated certificate-key pair."
 msgstr "Successfully generated certificate-key pair."
 
 #: src/pages/users/UserListPage.ts:128
-#: src/pages/users/UserViewPage.ts:159
+#: src/pages/users/UserViewPage.ts:160
 msgid "Successfully generated recovery link"
 msgstr "Successfully generated recovery link"
 
@@ -3178,7 +3184,7 @@ msgstr "Successfully updated user."
 msgid "Successfully updated {0} {1}"
 msgstr "Successfully updated {0} {1}"
 
-#: src/pages/users/UserViewPage.ts:125
+#: src/pages/users/UserViewPage.ts:126
 msgid "Superuser"
 msgstr "Superuser"
 
@@ -3473,7 +3479,7 @@ msgstr "Up-to-date!"
 #: src/pages/user-settings/tokens/UserTokenList.ts:105
 #: src/pages/users/UserActiveForm.ts:66
 #: src/pages/users/UserListPage.ts:68
-#: src/pages/users/UserViewPage.ts:138
+#: src/pages/users/UserViewPage.ts:139
 msgid "Update"
 msgstr "Update"
 
@@ -3549,7 +3555,7 @@ msgstr "Update Token"
 
 #: src/pages/policies/BoundPoliciesList.ts:102
 #: src/pages/users/UserListPage.ts:71
-#: src/pages/users/UserViewPage.ts:141
+#: src/pages/users/UserViewPage.ts:142
 msgid "Update User"
 msgstr "Update User"
 
@@ -3590,6 +3596,7 @@ msgid "Use global settings"
 msgstr "Use global settings"
 
 #: src/elements/events/ObjectChangelog.ts:39
+#: src/elements/events/UserEvents.ts:36
 #: src/pages/events/EventInfo.ts:83
 #: src/pages/events/EventListPage.ts:44
 #: src/pages/policies/PolicyBindingForm.ts:140
@@ -3603,7 +3610,7 @@ msgstr "Use global settings"
 msgid "User"
 msgstr "User"
 
-#: src/pages/users/UserViewPage.ts:77
+#: src/pages/users/UserViewPage.ts:78
 msgid "User Info"
 msgstr "User Info"
 
@@ -3619,6 +3626,10 @@ msgstr "User Settings"
 msgid "User details"
 msgstr "User details"
 
+#: src/pages/users/UserViewPage.ts:177
+msgid "User events"
+msgstr "User events"
+
 #: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:99
 #: src/pages/stages/identification/IdentificationStageForm.ts:74
 msgid "User fields"
@@ -3633,7 +3644,7 @@ msgid "User password writeback"
 msgstr "User password writeback"
 
 #: src/pages/policies/BoundPoliciesList.ts:52
-#: src/pages/users/UserViewPage.ts:62
+#: src/pages/users/UserViewPage.ts:63
 msgid "User {0}"
 msgstr "User {0}"
 
@@ -3661,7 +3672,7 @@ msgstr "Userinfo URL"
 #: src/pages/stages/identification/IdentificationStageForm.ts:79
 #: src/pages/user-settings/UserDetailsPage.ts:57
 #: src/pages/users/UserForm.ts:47
-#: src/pages/users/UserViewPage.ts:83
+#: src/pages/users/UserViewPage.ts:84
 msgid "Username"
 msgstr "Username"
 
diff --git a/web/src/locales/pseudo-LOCALE.po b/web/src/locales/pseudo-LOCALE.po
index 164dac6e9..7b2b927ec 100644
--- a/web/src/locales/pseudo-LOCALE.po
+++ b/web/src/locales/pseudo-LOCALE.po
@@ -69,6 +69,7 @@ msgid "Access token URL"
 msgstr ""
 
 #: src/elements/events/ObjectChangelog.ts:38
+#: src/elements/events/UserEvents.ts:35
 #: src/pages/events/EventListPage.ts:43
 #: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:79
 msgid "Action"
@@ -76,7 +77,7 @@ msgstr ""
 
 #: src/pages/groups/MemberSelectModal.ts:45
 #: src/pages/users/UserListPage.ts:51
-#: src/pages/users/UserViewPage.ts:115
+#: src/pages/users/UserViewPage.ts:116
 msgid "Active"
 msgstr ""
 
@@ -465,7 +466,7 @@ msgstr ""
 #: src/pages/sources/ldap/LDAPSourceViewPage.ts:113
 #: src/pages/sources/oauth/OAuthSourceViewPage.ts:132
 #: src/pages/sources/saml/SAMLSourceViewPage.ts:119
-#: src/pages/users/UserViewPage.ts:176
+#: src/pages/users/UserViewPage.ts:185
 msgid "Changelog"
 msgstr ""
 
@@ -530,6 +531,7 @@ msgid "Client ID"
 msgstr ""
 
 #: src/elements/events/ObjectChangelog.ts:41
+#: src/elements/events/UserEvents.ts:38
 #: src/pages/events/EventListPage.ts:46
 #: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:93
 msgid "Client IP"
@@ -825,6 +827,7 @@ msgid "Created {0}"
 msgstr ""
 
 #: src/elements/events/ObjectChangelog.ts:40
+#: src/elements/events/UserEvents.ts:37
 #: src/pages/events/EventListPage.ts:45
 msgid "Creation Date"
 msgstr ""
@@ -1023,7 +1026,7 @@ msgstr ""
 #: src/pages/stages/prompt/PromptListPage.ts:75
 #: src/pages/user-settings/tokens/UserTokenList.ts:113
 #: src/pages/users/UserListPage.ts:76
-#: src/pages/users/UserViewPage.ts:146
+#: src/pages/users/UserViewPage.ts:147
 msgid "Edit"
 msgstr ""
 
@@ -1056,7 +1059,7 @@ msgstr ""
 #: src/pages/stages/identification/IdentificationStageForm.ts:82
 #: src/pages/user-settings/UserDetailsPage.ts:71
 #: src/pages/users/UserForm.ts:61
-#: src/pages/users/UserViewPage.ts:99
+#: src/pages/users/UserViewPage.ts:100
 msgid "Email"
 msgstr ""
 
@@ -1216,7 +1219,7 @@ msgstr ""
 msgid "Expiry date"
 msgstr ""
 
-#: src/pages/users/UserViewPage.ts:187
+#: src/pages/users/UserViewPage.ts:196
 msgid "Explicit Consent"
 msgstr ""
 
@@ -1616,7 +1619,7 @@ msgstr ""
 
 #: src/pages/groups/MemberSelectModal.ts:46
 #: src/pages/users/UserListPage.ts:52
-#: src/pages/users/UserViewPage.ts:107
+#: src/pages/users/UserViewPage.ts:108
 msgid "Last login"
 msgstr ""
 
@@ -1893,7 +1896,7 @@ msgstr ""
 #: src/pages/user-settings/UserDetailsPage.ts:64
 #: src/pages/users/UserForm.ts:54
 #: src/pages/users/UserListPage.ts:50
-#: src/pages/users/UserViewPage.ts:91
+#: src/pages/users/UserViewPage.ts:92
 msgid "Name"
 msgstr ""
 
@@ -1936,6 +1939,7 @@ msgid "No Applications available."
 msgstr ""
 
 #: src/elements/events/ObjectChangelog.ts:68
+#: src/elements/events/UserEvents.ts:65
 msgid "No Events found."
 msgstr ""
 
@@ -1964,6 +1968,7 @@ msgid "No form found"
 msgstr ""
 
 #: src/elements/events/ObjectChangelog.ts:70
+#: src/elements/events/UserEvents.ts:67
 msgid "No matching events could be found."
 msgstr ""
 
@@ -2050,11 +2055,11 @@ msgstr ""
 msgid "Number"
 msgstr ""
 
-#: src/pages/users/UserViewPage.ts:195
+#: src/pages/users/UserViewPage.ts:204
 msgid "OAuth Authorization Codes"
 msgstr ""
 
-#: src/pages/users/UserViewPage.ts:203
+#: src/pages/users/UserViewPage.ts:212
 msgid "OAuth Refresh Codes"
 msgstr ""
 
@@ -2076,6 +2081,7 @@ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)
 msgstr ""
 
 #: src/elements/events/ObjectChangelog.ts:50
+#: src/elements/events/UserEvents.ts:47
 #: src/pages/events/EventListPage.ts:60
 msgid "On behalf of {0}"
 msgstr ""
@@ -2174,7 +2180,7 @@ msgstr ""
 #: src/pages/sources/ldap/LDAPSourceViewPage.ts:56
 #: src/pages/sources/oauth/OAuthSourceViewPage.ts:55
 #: src/pages/sources/saml/SAMLSourceViewPage.ts:58
-#: src/pages/users/UserViewPage.ts:73
+#: src/pages/users/UserViewPage.ts:74
 msgid "Overview"
 msgstr ""
 
@@ -2512,7 +2518,7 @@ msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."
 msgstr ""
 
 #: src/pages/users/UserListPage.ts:133
-#: src/pages/users/UserViewPage.ts:164
+#: src/pages/users/UserViewPage.ts:165
 msgid "Reset Password"
 msgstr ""
 
@@ -3039,7 +3045,7 @@ msgid "Successfully generated certificate-key pair."
 msgstr ""
 
 #: src/pages/users/UserListPage.ts:128
-#: src/pages/users/UserViewPage.ts:159
+#: src/pages/users/UserViewPage.ts:160
 msgid "Successfully generated recovery link"
 msgstr ""
 
@@ -3170,7 +3176,7 @@ msgstr ""
 msgid "Successfully updated {0} {1}"
 msgstr ""
 
-#: src/pages/users/UserViewPage.ts:125
+#: src/pages/users/UserViewPage.ts:126
 msgid "Superuser"
 msgstr ""
 
@@ -3463,7 +3469,7 @@ msgstr ""
 #: src/pages/user-settings/tokens/UserTokenList.ts:105
 #: src/pages/users/UserActiveForm.ts:66
 #: src/pages/users/UserListPage.ts:68
-#: src/pages/users/UserViewPage.ts:138
+#: src/pages/users/UserViewPage.ts:139
 msgid "Update"
 msgstr ""
 
@@ -3539,7 +3545,7 @@ msgstr ""
 
 #: src/pages/policies/BoundPoliciesList.ts:102
 #: src/pages/users/UserListPage.ts:71
-#: src/pages/users/UserViewPage.ts:141
+#: src/pages/users/UserViewPage.ts:142
 msgid "Update User"
 msgstr ""
 
@@ -3580,6 +3586,7 @@ msgid "Use global settings"
 msgstr ""
 
 #: src/elements/events/ObjectChangelog.ts:39
+#: src/elements/events/UserEvents.ts:36
 #: src/pages/events/EventInfo.ts:83
 #: src/pages/events/EventListPage.ts:44
 #: src/pages/policies/PolicyBindingForm.ts:140
@@ -3593,7 +3600,7 @@ msgstr ""
 msgid "User"
 msgstr ""
 
-#: src/pages/users/UserViewPage.ts:77
+#: src/pages/users/UserViewPage.ts:78
 msgid "User Info"
 msgstr ""
 
@@ -3609,6 +3616,10 @@ msgstr ""
 msgid "User details"
 msgstr ""
 
+#: src/pages/users/UserViewPage.ts:177
+msgid "User events"
+msgstr ""
+
 #: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:99
 #: src/pages/stages/identification/IdentificationStageForm.ts:74
 msgid "User fields"
@@ -3623,7 +3634,7 @@ msgid "User password writeback"
 msgstr ""
 
 #: src/pages/policies/BoundPoliciesList.ts:52
-#: src/pages/users/UserViewPage.ts:62
+#: src/pages/users/UserViewPage.ts:63
 msgid "User {0}"
 msgstr ""
 
@@ -3651,7 +3662,7 @@ msgstr ""
 #: src/pages/stages/identification/IdentificationStageForm.ts:79
 #: src/pages/user-settings/UserDetailsPage.ts:57
 #: src/pages/users/UserForm.ts:47
-#: src/pages/users/UserViewPage.ts:83
+#: src/pages/users/UserViewPage.ts:84
 msgid "Username"
 msgstr ""
 
diff --git a/web/src/pages/admin-overview/cards/LDAPSyncStatusCard.ts b/web/src/pages/admin-overview/cards/LDAPSyncStatusCard.ts
index 96c915a6e..54073da9d 100644
--- a/web/src/pages/admin-overview/cards/LDAPSyncStatusCard.ts
+++ b/web/src/pages/admin-overview/cards/LDAPSyncStatusCard.ts
@@ -22,7 +22,7 @@ export class LDAPSyncStatusCard extends AdminStatusCard<Task> {
     }
 
     renderValue(): TemplateResult {
-        return html`${t`Last sync: ${this.value?.taskFinishTimestamp?.toLocaleTimeString()}`}`;
+        return html`${t`Last sync: ${this.value?.taskFinishTimestamp?.toLocaleTimeString() || "-"}`}`;
     }
 
     getStatus(value: Task): Promise<AdminStatus> {
diff --git a/web/src/pages/users/UserViewPage.ts b/web/src/pages/users/UserViewPage.ts
index 82bf1c31c..6155ad2d3 100644
--- a/web/src/pages/users/UserViewPage.ts
+++ b/web/src/pages/users/UserViewPage.ts
@@ -14,7 +14,6 @@ import PFButton from "@patternfly/patternfly/components/Button/button.css";
 import AKGlobal from "../../authentik.css";
 
 import "../../elements/forms/ModalForm";
-import "./UserForm";
 import "../../elements/buttons/ActionButton";
 import "../../elements/buttons/SpinnerButton";
 import "../../elements/CodeMirror";
@@ -25,6 +24,8 @@ import "../../elements/oauth/UserCodeList";
 import "../../elements/oauth/UserRefreshList";
 import "../../elements/charts/UserChart";
 import "../../elements/PageHeader";
+import "../../elements/events/UserEvents";
+import "./UserForm";
 import { CoreApi, User } from "authentik-api";
 import { DEFAULT_CONFIG } from "../../api/Config";
 import { EVENT_REFRESH } from "../../constants";
@@ -75,7 +76,7 @@ export class UserViewPage extends LitElement {
         return html`<ak-tabs>
                 <section slot="page-overview" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-l-gallery pf-m-gutter">
-                        <div class="pf-c-card pf-l-gallery__item pf-m-4-col">
+                        <div class="pf-c-card pf-l-gallery__item">
                             <div class="pf-c-card__title">
                                 ${t`User Info`}
                             </div>
@@ -167,7 +168,7 @@ export class UserViewPage extends LitElement {
                                 </ak-action-button>
                             </div>
                         </div>
-                        <div class="pf-c-card pf-l-gallery__item pf-m-4-col" style="grid-column-end: span 4;grid-row-end: span 2;">
+                        <div class="pf-c-card pf-l-gallery__item" style="grid-column-end: span 4;grid-row-end: span 2;">
                             <div class="pf-c-card__body">
                                 <ak-charts-user userId=${this.user.pk || 0}>
                                 </ak-charts-user>
@@ -175,6 +176,14 @@ export class UserViewPage extends LitElement {
                         </div>
                     </div>
                 </section>
+                <section slot="page-events" data-tab-title="${t`User events`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
+                    <div class="pf-c-card">
+                        <div class="pf-c-card__body">
+                            <ak-events-user targetUser=${this.user.username}>
+                            </ak-events-user>
+                        </div>
+                    </div>
+                </section>
                 <section slot="page-changelog" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-c-card">
                         <div class="pf-c-card__body">

From 858fcb85542586c1fc697898916fb1c11d64c080 Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 11 Apr 2021 18:48:24 +0200
Subject: [PATCH 08/13] web/admin: classify no connected workers as error

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 web/src/pages/admin-overview/cards/BackupStatusCard.ts | 2 +-
 web/src/pages/admin-overview/cards/WorkerStatusCard.ts | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/web/src/pages/admin-overview/cards/BackupStatusCard.ts b/web/src/pages/admin-overview/cards/BackupStatusCard.ts
index 15b107811..707cd1e90 100644
--- a/web/src/pages/admin-overview/cards/BackupStatusCard.ts
+++ b/web/src/pages/admin-overview/cards/BackupStatusCard.ts
@@ -31,7 +31,7 @@ export class BackupStatusCard extends AdminStatusCard<TaskStatusEnum> {
                 });
             case TaskStatusEnum.Error:
                 return Promise.resolve<AdminStatus>({
-                    icon: "fa fas fa-times-circle pf-m-danger",
+                    icon: "fa fa-times-circle pf-m-danger",
                     message: t`Backup finished with errors.`,
                 });
             default:
diff --git a/web/src/pages/admin-overview/cards/WorkerStatusCard.ts b/web/src/pages/admin-overview/cards/WorkerStatusCard.ts
index f473244c2..f93dc1402 100644
--- a/web/src/pages/admin-overview/cards/WorkerStatusCard.ts
+++ b/web/src/pages/admin-overview/cards/WorkerStatusCard.ts
@@ -16,7 +16,7 @@ export class WorkersStatusCard extends AdminStatusCard<number> {
     getStatus(value: number): Promise<AdminStatus> {
         if (value < 1) {
             return Promise.resolve<AdminStatus>({
-                icon: "fa fa-exclamation-triangle pf-m-warning",
+                icon: "fa fa-times-circle pf-m-danger",
                 message: t`No workers connected. Background tasks will not run.`,
             });
         } else {

From 11c8ae8f18d107f406117fcfad9dc3b9b72184fc Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 11 Apr 2021 18:56:31 +0200
Subject: [PATCH 09/13] web/admin: remove sidebar box shadow

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 web/src/elements/sidebar/Sidebar.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/web/src/elements/sidebar/Sidebar.ts b/web/src/elements/sidebar/Sidebar.ts
index fd42a0c3e..33a6e99ec 100644
--- a/web/src/elements/sidebar/Sidebar.ts
+++ b/web/src/elements/sidebar/Sidebar.ts
@@ -103,6 +103,7 @@ export class Sidebar extends LitElement {
             css`
                 :host {
                     z-index: 100;
+                    box-shadow: none !important;
                 }
                 .pf-c-nav__link.pf-m-current::after,
                 .pf-c-nav__link.pf-m-current:hover::after,

From ca51afb7dfa1f920a4c0a78ec536c7f2996f8470 Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 11 Apr 2021 18:56:43 +0200
Subject: [PATCH 10/13] web: always set css variables

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 web/src/authentik.css                         | 16 ++++++-------
 web/src/elements/PageHeader.ts                |  2 ++
 web/src/locales/en.po                         | 24 +++++++++++--------
 web/src/locales/pseudo-LOCALE.po              | 24 +++++++++++--------
 .../pages/admin-overview/AdminOverviewPage.ts |  3 ++-
 5 files changed, 40 insertions(+), 29 deletions(-)

diff --git a/web/src/authentik.css b/web/src/authentik.css
index ea7769dcf..c20265d65 100644
--- a/web/src/authentik.css
+++ b/web/src/authentik.css
@@ -1,5 +1,13 @@
 :root {
     --ak-accent: #fd4b2d;
+
+    --ak-dark-foreground: #fafafa;
+    --ak-dark-foreground-darker: #bebebe;
+    --ak-dark-foreground-link: #5a5cb9;
+    --ak-dark-background: #18191a;
+    --ak-dark-background-darker: #000000;
+    --ak-dark-background-light: #1c1e21;
+    --ak-dark-background-lighter: #2b2e33;
 }
 
 html {
@@ -92,14 +100,6 @@ body {
 
 @media (prefers-color-scheme: dark) {
     :root {
-        --ak-dark-foreground: #fafafa;
-        --ak-dark-foreground-darker: #bebebe;
-        --ak-dark-foreground-link: #5a5cb9;
-        --ak-dark-background: #18191a;
-        --ak-dark-background-darker: #000000;
-        --ak-dark-background-light: #1c1e21;
-        --ak-dark-background-lighter: #2b2e33;
-
         --pf-global--Color--100: var(--ak-dark-foreground);
         --pf-c-page__main-section--m-light--BackgroundColor: var(--ak-dark-background-darker);
         --pf-global--link--Color: var(--ak-dark-foreground-link);
diff --git a/web/src/elements/PageHeader.ts b/web/src/elements/PageHeader.ts
index d0efafc2c..ff85769fc 100644
--- a/web/src/elements/PageHeader.ts
+++ b/web/src/elements/PageHeader.ts
@@ -39,9 +39,11 @@ export class PageHeader extends LitElement {
             :host {
                 display: flex;
                 flex-direction: row;
+                min-height: 114px;
             }
             button.sidebar-trigger {
                 background-color: var(--pf-c-page__main-section--m-light--BackgroundColor);
+                border-radius: 0px;
             }
             .pf-c-page__main-section {
                 width: 100%;
diff --git a/web/src/locales/en.po b/web/src/locales/en.po
index 2329c0fe0..91adfb9b6 100644
--- a/web/src/locales/en.po
+++ b/web/src/locales/en.po
@@ -188,7 +188,7 @@ msgstr "Application's display Name."
 msgid "Applications"
 msgstr "Applications"
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:42
+#: src/pages/admin-overview/AdminOverviewPage.ts:43
 msgid "Apps with most usage"
 msgstr "Apps with most usage"
 
@@ -329,7 +329,7 @@ msgstr "Backup finished with errors."
 msgid "Backup finished with warnings."
 msgstr "Backup finished with warnings."
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:59
+#: src/pages/admin-overview/AdminOverviewPage.ts:60
 msgid "Backup status"
 msgstr "Backup status"
 
@@ -393,11 +393,11 @@ msgstr "Built-in"
 msgid "CA which the endpoint's Certificate is verified against. Can be left empty for no validation."
 msgstr "CA which the endpoint's Certificate is verified against. Can be left empty for no validation."
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:57
+#: src/pages/admin-overview/AdminOverviewPage.ts:58
 msgid "Cached Flows"
 msgstr "Cached Flows"
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:55
+#: src/pages/admin-overview/AdminOverviewPage.ts:56
 msgid "Cached Policies"
 msgstr "Cached Policies"
 
@@ -1394,6 +1394,10 @@ msgstr "Friendly Name"
 msgid "From address"
 msgstr "From address"
 
+#: src/pages/admin-overview/AdminOverviewPage.ts:36
+msgid "General system status"
+msgstr "General system status"
+
 #: src/pages/crypto/CertificateKeyPairListPage.ts:135
 #: src/pages/crypto/CertificateKeyPairListPage.ts:143
 msgid "Generate"
@@ -1751,7 +1755,7 @@ msgstr "Login to continue to {0}."
 msgid "Logins"
 msgstr "Logins"
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:39
+#: src/pages/admin-overview/AdminOverviewPage.ts:40
 #: src/pages/applications/ApplicationViewPage.ts:68
 msgid "Logins over the last 24 hours"
 msgstr "Logins over the last 24 hours"
@@ -2241,7 +2245,7 @@ msgid "Please enter your password"
 msgstr "Please enter your password"
 
 #: src/interfaces/AdminInterface.ts:26
-#: src/pages/admin-overview/AdminOverviewPage.ts:47
+#: src/pages/admin-overview/AdminOverviewPage.ts:48
 #: src/pages/flows/FlowListPage.ts:50
 #: src/pages/policies/PolicyListPage.ts:38
 msgid "Policies"
@@ -2395,7 +2399,7 @@ msgid "Provider type"
 msgstr "Provider type"
 
 #: src/interfaces/AdminInterface.ts:20
-#: src/pages/admin-overview/AdminOverviewPage.ts:45
+#: src/pages/admin-overview/AdminOverviewPage.ts:46
 #: src/pages/outposts/OutpostForm.ts:82
 #: src/pages/outposts/OutpostListPage.ts:51
 msgid "Providers"
@@ -3681,7 +3685,7 @@ msgid "Username: Same as Text input, but checks for and prevents duplicate usern
 msgstr "Username: Same as Text input, but checks for and prevents duplicate usernames."
 
 #: src/interfaces/AdminInterface.ts:32
-#: src/pages/admin-overview/AdminOverviewPage.ts:49
+#: src/pages/admin-overview/AdminOverviewPage.ts:50
 #: src/pages/users/UserListPage.ts:32
 msgid "Users"
 msgstr "Users"
@@ -3722,7 +3726,7 @@ msgstr "Verification Certificate"
 msgid "Verify the user's email address by sending them a one-time-link. Can also be used for recovery to verify the user's authenticity."
 msgstr "Verify the user's email address by sending them a one-time-link. Can also be used for recovery to verify the user's authenticity."
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:51
+#: src/pages/admin-overview/AdminOverviewPage.ts:52
 msgid "Version"
 msgstr "Version"
 
@@ -3821,7 +3825,7 @@ msgstr "Whoops!"
 msgid "Windows"
 msgstr "Windows"
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:53
+#: src/pages/admin-overview/AdminOverviewPage.ts:54
 msgid "Workers"
 msgstr "Workers"
 
diff --git a/web/src/locales/pseudo-LOCALE.po b/web/src/locales/pseudo-LOCALE.po
index 7b2b927ec..4550a0b12 100644
--- a/web/src/locales/pseudo-LOCALE.po
+++ b/web/src/locales/pseudo-LOCALE.po
@@ -188,7 +188,7 @@ msgstr ""
 msgid "Applications"
 msgstr ""
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:42
+#: src/pages/admin-overview/AdminOverviewPage.ts:43
 msgid "Apps with most usage"
 msgstr ""
 
@@ -325,7 +325,7 @@ msgstr ""
 msgid "Backup finished with warnings."
 msgstr ""
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:59
+#: src/pages/admin-overview/AdminOverviewPage.ts:60
 msgid "Backup status"
 msgstr ""
 
@@ -389,11 +389,11 @@ msgstr ""
 msgid "CA which the endpoint's Certificate is verified against. Can be left empty for no validation."
 msgstr ""
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:57
+#: src/pages/admin-overview/AdminOverviewPage.ts:58
 msgid "Cached Flows"
 msgstr ""
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:55
+#: src/pages/admin-overview/AdminOverviewPage.ts:56
 msgid "Cached Policies"
 msgstr ""
 
@@ -1386,6 +1386,10 @@ msgstr ""
 msgid "From address"
 msgstr ""
 
+#: src/pages/admin-overview/AdminOverviewPage.ts:36
+msgid "General system status"
+msgstr ""
+
 #: src/pages/crypto/CertificateKeyPairListPage.ts:135
 #: src/pages/crypto/CertificateKeyPairListPage.ts:143
 msgid "Generate"
@@ -1743,7 +1747,7 @@ msgstr ""
 msgid "Logins"
 msgstr ""
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:39
+#: src/pages/admin-overview/AdminOverviewPage.ts:40
 #: src/pages/applications/ApplicationViewPage.ts:68
 msgid "Logins over the last 24 hours"
 msgstr ""
@@ -2233,7 +2237,7 @@ msgid "Please enter your password"
 msgstr ""
 
 #: src/interfaces/AdminInterface.ts:26
-#: src/pages/admin-overview/AdminOverviewPage.ts:47
+#: src/pages/admin-overview/AdminOverviewPage.ts:48
 #: src/pages/flows/FlowListPage.ts:50
 #: src/pages/policies/PolicyListPage.ts:38
 msgid "Policies"
@@ -2387,7 +2391,7 @@ msgid "Provider type"
 msgstr ""
 
 #: src/interfaces/AdminInterface.ts:20
-#: src/pages/admin-overview/AdminOverviewPage.ts:45
+#: src/pages/admin-overview/AdminOverviewPage.ts:46
 #: src/pages/outposts/OutpostForm.ts:82
 #: src/pages/outposts/OutpostListPage.ts:51
 msgid "Providers"
@@ -3671,7 +3675,7 @@ msgid "Username: Same as Text input, but checks for and prevents duplicate usern
 msgstr ""
 
 #: src/interfaces/AdminInterface.ts:32
-#: src/pages/admin-overview/AdminOverviewPage.ts:49
+#: src/pages/admin-overview/AdminOverviewPage.ts:50
 #: src/pages/users/UserListPage.ts:32
 msgid "Users"
 msgstr ""
@@ -3712,7 +3716,7 @@ msgstr ""
 msgid "Verify the user's email address by sending them a one-time-link. Can also be used for recovery to verify the user's authenticity."
 msgstr ""
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:51
+#: src/pages/admin-overview/AdminOverviewPage.ts:52
 msgid "Version"
 msgstr ""
 
@@ -3811,7 +3815,7 @@ msgstr ""
 msgid "Windows"
 msgstr ""
 
-#: src/pages/admin-overview/AdminOverviewPage.ts:53
+#: src/pages/admin-overview/AdminOverviewPage.ts:54
 msgid "Workers"
 msgstr ""
 
diff --git a/web/src/pages/admin-overview/AdminOverviewPage.ts b/web/src/pages/admin-overview/AdminOverviewPage.ts
index a18eb86da..e05535309 100644
--- a/web/src/pages/admin-overview/AdminOverviewPage.ts
+++ b/web/src/pages/admin-overview/AdminOverviewPage.ts
@@ -33,7 +33,8 @@ export class AdminOverviewPage extends LitElement {
         return html`
         <ak-page-header
             icon=""
-            header=${t`System Overview`}>
+            header=${t`System Overview`}
+            description=${t`General system status`}>
         </ak-page-header>
         <section class="pf-c-page__main-section">
             <div class="pf-l-gallery pf-m-gutter">

From 1be1654bf2a2d32ff210cd18aea490fb4353dc4a Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 11 Apr 2021 19:38:24 +0200
Subject: [PATCH 11/13] web/elements: fix height when using PageHeader with
 Image

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 web/src/elements/PageHeader.ts                    |  3 +++
 web/src/pages/applications/ApplicationViewPage.ts | 13 ++-----------
 2 files changed, 5 insertions(+), 11 deletions(-)

diff --git a/web/src/elements/PageHeader.ts b/web/src/elements/PageHeader.ts
index ff85769fc..d207e23d8 100644
--- a/web/src/elements/PageHeader.ts
+++ b/web/src/elements/PageHeader.ts
@@ -48,6 +48,9 @@ export class PageHeader extends LitElement {
             .pf-c-page__main-section {
                 width: 100%;
             }
+            img.pf-icon {
+                max-height: 24px;
+            }
         `];
     }
 
diff --git a/web/src/pages/applications/ApplicationViewPage.ts b/web/src/pages/applications/ApplicationViewPage.ts
index c27fb10aa..aba5c1ac8 100644
--- a/web/src/pages/applications/ApplicationViewPage.ts
+++ b/web/src/pages/applications/ApplicationViewPage.ts
@@ -1,5 +1,5 @@
 import { t } from "@lingui/macro";
-import { css, CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element";
+import { CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element";
 
 import "../../elements/Tabs";
 import "../../elements/charts/ApplicationAuthorizeChart";
@@ -36,16 +36,7 @@ export class ApplicationViewPage extends LitElement {
     application!: Application;
 
     static get styles(): CSSResult[] {
-        return [PFBase, PFPage, PFContent, PFButton, PFGallery, PFCard, AKGlobal].concat(
-            css`
-                img.pf-icon {
-                    max-height: 24px;
-                }
-                ak-tabs {
-                    height: 100%;
-                }
-            `
-        );
+        return [PFBase, PFPage, PFContent, PFButton, PFGallery, PFCard, AKGlobal];
     }
 
     render(): TemplateResult {

From 0d0baaa2f9308335f019c68a6a19cbee8a98a3f6 Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 11 Apr 2021 19:43:10 +0200
Subject: [PATCH 12/13] web/admin: fix missing css from ApplicationViewPage

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 .../pages/applications/ApplicationViewPage.ts | 33 ++++++++++++-------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/web/src/pages/applications/ApplicationViewPage.ts b/web/src/pages/applications/ApplicationViewPage.ts
index aba5c1ac8..5a2dc276e 100644
--- a/web/src/pages/applications/ApplicationViewPage.ts
+++ b/web/src/pages/applications/ApplicationViewPage.ts
@@ -15,9 +15,10 @@ import PFPage from "@patternfly/patternfly/components/Page/page.css";
 import PFContent from "@patternfly/patternfly/components/Content/content.css";
 import PFGallery from "@patternfly/patternfly/layouts/Gallery/gallery.css";
 import PFCard from "@patternfly/patternfly/components/Card/card.css";
-import AKGlobal from "../../authentik.css";
 import PFBase from "@patternfly/patternfly/patternfly-base.css";
 import PFButton from "@patternfly/patternfly/components/Button/button.css";
+import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css";
+import AKGlobal from "../../authentik.css";
 import { ifDefined } from "lit-html/directives/if-defined";
 
 @customElement("ak-application-view")
@@ -36,7 +37,7 @@ export class ApplicationViewPage extends LitElement {
     application!: Application;
 
     static get styles(): CSSResult[] {
-        return [PFBase, PFPage, PFContent, PFButton, PFGallery, PFCard, AKGlobal];
+        return [PFBase, PFPage, PFContent, PFButton, PFDescriptionList, PFGallery, PFCard, AKGlobal];
     }
 
     render(): TemplateResult {
@@ -60,14 +61,6 @@ export class ApplicationViewPage extends LitElement {
             <ak-tabs>
                 <section slot="page-overview" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile">
                     <div class="pf-l-gallery pf-m-gutter">
-                        <div class="pf-c-card pf-l-gallery__item" style="grid-column-end: span 3;grid-row-end: span 2;">
-                            <div class="pf-c-card__title">${t`Logins over the last 24 hours`}</div>
-                            <div class="pf-c-card__body">
-                                ${this.application && html`
-                                    <ak-charts-application-authorize applicationSlug=${this.application.slug}>
-                                    </ak-charts-application-authorize>`}
-                            </div>
-                        </div>
                         <div class="pf-c-card pf-l-gallery__item">
                             <div class="pf-c-card__title">${t`Related`}</div>
                             <div class="pf-c-card__body">
@@ -86,6 +79,16 @@ export class ApplicationViewPage extends LitElement {
                                             </dd>
                                         </div>`:
                                     html``}
+                                    <div class="pf-c-description-list__group">
+                                        <dt class="pf-c-description-list__term">
+                                            <span class="pf-c-description-list__text">${t`Policy engine mode`}</span>
+                                        </dt>
+                                        <dd class="pf-c-description-list__description">
+                                            <div class="pf-c-description-list__text">
+                                                ${this.application.policyEngineMode?.toUpperCase()}
+                                            </div>
+                                        </dd>
+                                    </div>
                                     <div class="pf-c-description-list__group">
                                         <dt class="pf-c-description-list__term">
                                             <span class="pf-c-description-list__text">${t`Edit`}</span>
@@ -111,7 +114,15 @@ export class ApplicationViewPage extends LitElement {
                                 </dl>
                             </div>
                         </div>
-                        <div class="pf-c-card pf-l-gallery__item" style="grid-column-end: span 3;grid-row-end: span 2;">
+                        <div class="pf-c-card pf-l-gallery__item" style="grid-column-end: span 4;grid-row-end: span 2;">
+                            <div class="pf-c-card__title">${t`Logins over the last 24 hours`}</div>
+                            <div class="pf-c-card__body">
+                                ${this.application && html`
+                                    <ak-charts-application-authorize applicationSlug=${this.application.slug}>
+                                    </ak-charts-application-authorize>`}
+                            </div>
+                        </div>
+                        <div class="pf-c-card pf-l-gallery__item" style="grid-column-end: span 5;grid-row-end: span 3;">
                             <div class="pf-c-card__title">${t`Changelog`}</div>
                             <div class="pf-c-card__body">
                                 <ak-object-changelog

From 4a4ee98dec6a81b4244eb9e3f9d9d0c6519d3d09 Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 11 Apr 2021 20:40:53 +0200
Subject: [PATCH 13/13] docs: fix typo in release notes

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 website/docs/releases/2021.4.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/website/docs/releases/2021.4.md b/website/docs/releases/2021.4.md
index 15f3e0a1b..71f17345b 100644
--- a/website/docs/releases/2021.4.md
+++ b/website/docs/releases/2021.4.md
@@ -31,7 +31,7 @@ title: Release 2021.4
     - You can now see a per-object changelog based on the model_create/update/delete events being created.
     - A new API Browser is available under `https://authentink.company/api/v2beta/`
     - Several new charts, new pages and quality-of-life improvements
-    - Credentials of objects are no longer while editing them
+    - Credentials of objects are no longer shown while editing them
 
 - Deprecated Group membership has been removed.