diff --git a/config/config.go b/config/config.go index 9eca30a..56d3730 100644 --- a/config/config.go +++ b/config/config.go @@ -319,6 +319,19 @@ func initSentry(config sentryConfig, debug bool) { } return sentry.UniformTracesSampler(config.SampleRate).Sample(ctx) }), + BeforeSend: func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event { + type principalGetter interface { + GetPrincipal() *models.User + } + if hint.Context != nil { + if req, ok := hint.Context.Value(sentry.RequestContextKey).(*http.Request); ok { + if p := req.Context().Value("principal"); p != nil { + event.User.ID = p.(principalGetter).GetPrincipal().ID + } + } + } + return event + }, }); err != nil { logbuch.Fatal("failed to initialized sentry – %v", err) } diff --git a/coverage/coverage.out b/coverage/coverage.out index 5e55a74..d8c69ca 100644 --- a/coverage/coverage.out +++ b/coverage/coverage.out @@ -1,49 +1,4 @@ mode: set -github.com/muety/wakapi/models/heartbeats.go:7.31,9.2 1 0 -github.com/muety/wakapi/models/heartbeats.go:11.41,13.2 1 0 -github.com/muety/wakapi/models/heartbeats.go:15.36,17.2 1 0 -github.com/muety/wakapi/models/heartbeats.go:19.43,22.2 2 0 -github.com/muety/wakapi/models/heartbeats.go:24.41,26.18 1 0 -github.com/muety/wakapi/models/heartbeats.go:29.2,29.16 1 0 -github.com/muety/wakapi/models/heartbeats.go:26.18,28.3 1 0 -github.com/muety/wakapi/models/heartbeats.go:32.40,34.18 1 0 -github.com/muety/wakapi/models/heartbeats.go:37.2,37.24 1 0 -github.com/muety/wakapi/models/heartbeats.go:34.18,36.3 1 0 -github.com/muety/wakapi/models/interval.go:39.47,40.23 1 0 -github.com/muety/wakapi/models/interval.go:45.2,45.14 1 0 -github.com/muety/wakapi/models/interval.go:40.23,41.13 1 0 -github.com/muety/wakapi/models/interval.go:41.13,43.4 1 0 -github.com/muety/wakapi/models/models.go:3.14,5.2 0 1 -github.com/muety/wakapi/models/user.go:13.13,15.2 1 1 -github.com/muety/wakapi/models/user.go:67.43,70.2 1 0 -github.com/muety/wakapi/models/user.go:72.33,77.2 1 0 -github.com/muety/wakapi/models/user.go:79.41,81.2 1 0 -github.com/muety/wakapi/models/user.go:83.45,85.2 1 0 -github.com/muety/wakapi/models/user.go:87.45,89.2 1 0 -github.com/muety/wakapi/models/user.go:91.39,93.2 1 0 -github.com/muety/wakapi/models/alias.go:12.32,14.2 1 0 -github.com/muety/wakapi/models/alias.go:16.37,17.35 1 0 -github.com/muety/wakapi/models/alias.go:22.2,22.14 1 0 -github.com/muety/wakapi/models/alias.go:17.35,18.18 1 0 -github.com/muety/wakapi/models/alias.go:18.18,20.4 1 0 -github.com/muety/wakapi/models/filters.go:16.56,17.16 1 0 -github.com/muety/wakapi/models/filters.go:29.2,29.19 1 0 -github.com/muety/wakapi/models/filters.go:18.22,19.32 1 0 -github.com/muety/wakapi/models/filters.go:20.17,21.27 1 0 -github.com/muety/wakapi/models/filters.go:22.23,23.33 1 0 -github.com/muety/wakapi/models/filters.go:24.21,25.31 1 0 -github.com/muety/wakapi/models/filters.go:26.22,27.32 1 0 -github.com/muety/wakapi/models/filters.go:32.47,33.21 1 1 -github.com/muety/wakapi/models/filters.go:44.2,44.21 1 1 -github.com/muety/wakapi/models/filters.go:33.21,35.3 1 1 -github.com/muety/wakapi/models/filters.go:35.8,35.23 1 1 -github.com/muety/wakapi/models/filters.go:35.23,37.3 1 0 -github.com/muety/wakapi/models/filters.go:37.8,37.29 1 1 -github.com/muety/wakapi/models/filters.go:37.29,39.3 1 1 -github.com/muety/wakapi/models/filters.go:39.8,39.27 1 1 -github.com/muety/wakapi/models/filters.go:39.27,41.3 1 0 -github.com/muety/wakapi/models/filters.go:41.8,41.28 1 1 -github.com/muety/wakapi/models/filters.go:41.28,43.3 1 0 github.com/muety/wakapi/models/heartbeat.go:32.34,34.2 1 1 github.com/muety/wakapi/models/heartbeat.go:36.65,37.46 1 1 github.com/muety/wakapi/models/heartbeat.go:37.46,38.46 1 1 @@ -61,9 +16,14 @@ github.com/muety/wakapi/models/heartbeat.go:66.37,82.2 1 0 github.com/muety/wakapi/models/heartbeat.go:90.41,92.16 2 0 github.com/muety/wakapi/models/heartbeat.go:95.2,96.10 2 0 github.com/muety/wakapi/models/heartbeat.go:92.16,94.3 1 0 +github.com/muety/wakapi/models/interval.go:39.47,40.23 1 0 +github.com/muety/wakapi/models/interval.go:45.2,45.14 1 0 +github.com/muety/wakapi/models/interval.go:40.23,41.13 1 0 +github.com/muety/wakapi/models/interval.go:41.13,43.4 1 0 github.com/muety/wakapi/models/language_mapping.go:11.42,13.2 1 0 github.com/muety/wakapi/models/language_mapping.go:15.51,17.2 1 0 github.com/muety/wakapi/models/language_mapping.go:19.52,21.2 1 0 +github.com/muety/wakapi/models/models.go:3.14,5.2 0 1 github.com/muety/wakapi/models/shared.go:35.52,37.2 1 0 github.com/muety/wakapi/models/shared.go:39.52,42.16 3 0 github.com/muety/wakapi/models/shared.go:45.2,47.12 3 0 @@ -130,6 +90,160 @@ github.com/muety/wakapi/models/summary.go:212.11,220.6 1 1 github.com/muety/wakapi/models/summary.go:237.33,239.2 1 1 github.com/muety/wakapi/models/summary.go:241.43,243.2 1 1 github.com/muety/wakapi/models/summary.go:245.38,247.2 1 1 +github.com/muety/wakapi/models/alias.go:12.32,14.2 1 0 +github.com/muety/wakapi/models/alias.go:16.37,17.35 1 0 +github.com/muety/wakapi/models/alias.go:22.2,22.14 1 0 +github.com/muety/wakapi/models/alias.go:17.35,18.18 1 0 +github.com/muety/wakapi/models/alias.go:18.18,20.4 1 0 +github.com/muety/wakapi/models/heartbeats.go:7.31,9.2 1 0 +github.com/muety/wakapi/models/heartbeats.go:11.41,13.2 1 0 +github.com/muety/wakapi/models/heartbeats.go:15.36,17.2 1 0 +github.com/muety/wakapi/models/heartbeats.go:19.43,22.2 2 0 +github.com/muety/wakapi/models/heartbeats.go:24.41,26.18 1 0 +github.com/muety/wakapi/models/heartbeats.go:29.2,29.16 1 0 +github.com/muety/wakapi/models/heartbeats.go:26.18,28.3 1 0 +github.com/muety/wakapi/models/heartbeats.go:32.40,34.18 1 0 +github.com/muety/wakapi/models/heartbeats.go:37.2,37.24 1 0 +github.com/muety/wakapi/models/heartbeats.go:34.18,36.3 1 0 +github.com/muety/wakapi/models/user.go:13.13,15.2 1 1 +github.com/muety/wakapi/models/user.go:67.43,70.2 1 0 +github.com/muety/wakapi/models/user.go:72.33,77.2 1 0 +github.com/muety/wakapi/models/user.go:79.41,81.2 1 0 +github.com/muety/wakapi/models/user.go:83.45,85.2 1 0 +github.com/muety/wakapi/models/user.go:87.45,89.2 1 0 +github.com/muety/wakapi/models/user.go:91.39,93.2 1 0 +github.com/muety/wakapi/models/filters.go:16.56,17.16 1 0 +github.com/muety/wakapi/models/filters.go:29.2,29.19 1 0 +github.com/muety/wakapi/models/filters.go:18.22,19.32 1 0 +github.com/muety/wakapi/models/filters.go:20.17,21.27 1 0 +github.com/muety/wakapi/models/filters.go:22.23,23.33 1 0 +github.com/muety/wakapi/models/filters.go:24.21,25.31 1 0 +github.com/muety/wakapi/models/filters.go:26.22,27.32 1 0 +github.com/muety/wakapi/models/filters.go:32.47,33.21 1 1 +github.com/muety/wakapi/models/filters.go:44.2,44.21 1 1 +github.com/muety/wakapi/models/filters.go:33.21,35.3 1 1 +github.com/muety/wakapi/models/filters.go:35.8,35.23 1 1 +github.com/muety/wakapi/models/filters.go:35.23,37.3 1 0 +github.com/muety/wakapi/models/filters.go:37.8,37.29 1 1 +github.com/muety/wakapi/models/filters.go:37.29,39.3 1 1 +github.com/muety/wakapi/models/filters.go:39.8,39.27 1 1 +github.com/muety/wakapi/models/filters.go:39.27,41.3 1 0 +github.com/muety/wakapi/models/filters.go:41.8,41.28 1 1 +github.com/muety/wakapi/models/filters.go:41.28,43.3 1 0 +github.com/muety/wakapi/utils/color.go:8.90,10.32 2 0 +github.com/muety/wakapi/utils/color.go:15.2,15.15 1 0 +github.com/muety/wakapi/utils/color.go:10.32,11.50 1 0 +github.com/muety/wakapi/utils/color.go:11.50,13.4 1 0 +github.com/muety/wakapi/utils/common.go:10.48,12.2 1 0 +github.com/muety/wakapi/utils/common.go:14.52,16.2 1 0 +github.com/muety/wakapi/utils/common.go:18.40,20.2 1 0 +github.com/muety/wakapi/utils/common.go:22.44,24.2 1 0 +github.com/muety/wakapi/utils/common.go:26.45,28.2 1 0 +github.com/muety/wakapi/utils/common.go:30.24,32.2 1 0 +github.com/muety/wakapi/utils/common.go:34.56,37.45 3 1 +github.com/muety/wakapi/utils/common.go:40.2,40.40 1 1 +github.com/muety/wakapi/utils/common.go:37.45,39.3 1 1 +github.com/muety/wakapi/utils/http.go:9.73,12.58 3 0 +github.com/muety/wakapi/utils/http.go:12.58,14.3 1 0 +github.com/muety/wakapi/utils/summary.go:10.66,11.40 1 0 +github.com/muety/wakapi/utils/summary.go:16.2,16.48 1 0 +github.com/muety/wakapi/utils/summary.go:11.40,12.27 1 0 +github.com/muety/wakapi/utils/summary.go:12.27,14.4 1 0 +github.com/muety/wakapi/utils/summary.go:19.67,22.2 2 0 +github.com/muety/wakapi/utils/summary.go:24.74,26.16 2 0 +github.com/muety/wakapi/utils/summary.go:29.2,29.32 1 0 +github.com/muety/wakapi/utils/summary.go:26.16,28.3 1 0 +github.com/muety/wakapi/utils/summary.go:32.84,35.18 2 0 +github.com/muety/wakapi/utils/summary.go:70.2,70.22 1 0 +github.com/muety/wakapi/utils/summary.go:36.28,37.24 1 0 +github.com/muety/wakapi/utils/summary.go:38.32,40.22 2 0 +github.com/muety/wakapi/utils/summary.go:41.31,42.23 1 0 +github.com/muety/wakapi/utils/summary.go:43.31,45.21 2 0 +github.com/muety/wakapi/utils/summary.go:46.32,47.24 1 0 +github.com/muety/wakapi/utils/summary.go:48.32,50.22 2 0 +github.com/muety/wakapi/utils/summary.go:51.31,52.23 1 0 +github.com/muety/wakapi/utils/summary.go:53.32,54.42 1 0 +github.com/muety/wakapi/utils/summary.go:55.41,57.40 2 0 +github.com/muety/wakapi/utils/summary.go:58.33,59.43 1 0 +github.com/muety/wakapi/utils/summary.go:60.33,61.43 1 0 +github.com/muety/wakapi/utils/summary.go:62.35,63.43 1 0 +github.com/muety/wakapi/utils/summary.go:64.26,65.21 1 0 +github.com/muety/wakapi/utils/summary.go:66.10,67.39 1 0 +github.com/muety/wakapi/utils/summary.go:73.73,80.56 5 0 +github.com/muety/wakapi/utils/summary.go:102.2,109.8 2 0 +github.com/muety/wakapi/utils/summary.go:80.56,82.3 1 0 +github.com/muety/wakapi/utils/summary.go:82.8,82.54 1 0 +github.com/muety/wakapi/utils/summary.go:82.54,84.3 1 0 +github.com/muety/wakapi/utils/summary.go:84.8,86.17 2 0 +github.com/muety/wakapi/utils/summary.go:93.3,94.17 2 0 +github.com/muety/wakapi/utils/summary.go:86.17,88.18 2 0 +github.com/muety/wakapi/utils/summary.go:88.18,90.5 1 0 +github.com/muety/wakapi/utils/summary.go:94.17,96.18 2 0 +github.com/muety/wakapi/utils/summary.go:96.18,98.5 1 0 +github.com/muety/wakapi/utils/summary.go:112.48,116.51 2 0 +github.com/muety/wakapi/utils/summary.go:119.2,119.12 1 0 +github.com/muety/wakapi/utils/summary.go:116.51,118.3 1 0 +github.com/muety/wakapi/utils/template.go:8.41,10.16 2 0 +github.com/muety/wakapi/utils/template.go:13.2,13.23 1 0 +github.com/muety/wakapi/utils/template.go:10.16,12.3 1 0 +github.com/muety/wakapi/utils/template.go:16.37,17.30 1 0 +github.com/muety/wakapi/utils/template.go:20.2,20.10 1 0 +github.com/muety/wakapi/utils/template.go:17.30,19.3 1 0 +github.com/muety/wakapi/utils/auth.go:16.79,18.54 2 0 +github.com/muety/wakapi/utils/auth.go:22.2,24.16 3 0 +github.com/muety/wakapi/utils/auth.go:28.2,30.45 3 0 +github.com/muety/wakapi/utils/auth.go:33.2,34.32 2 0 +github.com/muety/wakapi/utils/auth.go:18.54,20.3 1 0 +github.com/muety/wakapi/utils/auth.go:24.16,26.3 1 0 +github.com/muety/wakapi/utils/auth.go:30.45,32.3 1 0 +github.com/muety/wakapi/utils/auth.go:37.65,39.85 2 0 +github.com/muety/wakapi/utils/auth.go:43.2,44.30 2 0 +github.com/muety/wakapi/utils/auth.go:39.85,41.3 1 0 +github.com/muety/wakapi/utils/auth.go:47.94,49.16 2 0 +github.com/muety/wakapi/utils/auth.go:53.2,53.107 1 0 +github.com/muety/wakapi/utils/auth.go:57.2,57.22 1 0 +github.com/muety/wakapi/utils/auth.go:49.16,51.3 1 0 +github.com/muety/wakapi/utils/auth.go:53.107,55.3 1 0 +github.com/muety/wakapi/utils/auth.go:60.56,64.2 3 0 +github.com/muety/wakapi/utils/auth.go:66.55,69.16 3 0 +github.com/muety/wakapi/utils/auth.go:72.2,72.16 1 0 +github.com/muety/wakapi/utils/auth.go:69.16,71.3 1 0 +github.com/muety/wakapi/utils/date.go:8.31,10.2 1 0 +github.com/muety/wakapi/utils/date.go:12.43,14.2 1 0 +github.com/muety/wakapi/utils/date.go:16.30,20.2 3 0 +github.com/muety/wakapi/utils/date.go:22.31,25.2 2 0 +github.com/muety/wakapi/utils/date.go:27.30,30.2 2 0 +github.com/muety/wakapi/utils/date.go:32.67,35.33 2 0 +github.com/muety/wakapi/utils/date.go:44.2,44.18 1 0 +github.com/muety/wakapi/utils/date.go:35.33,37.19 2 0 +github.com/muety/wakapi/utils/date.go:40.3,41.10 2 0 +github.com/muety/wakapi/utils/date.go:37.19,39.4 1 0 +github.com/muety/wakapi/utils/date.go:47.50,53.2 5 0 +github.com/muety/wakapi/utils/date.go:56.79,59.36 3 0 +github.com/muety/wakapi/utils/date.go:63.2,63.21 1 0 +github.com/muety/wakapi/utils/date.go:67.2,67.21 1 0 +github.com/muety/wakapi/utils/date.go:71.2,71.13 1 0 +github.com/muety/wakapi/utils/date.go:59.36,62.3 2 0 +github.com/muety/wakapi/utils/date.go:63.21,66.3 2 0 +github.com/muety/wakapi/utils/date.go:67.21,70.3 2 0 +github.com/muety/wakapi/utils/filesystem.go:14.68,16.16 2 0 +github.com/muety/wakapi/utils/filesystem.go:20.2,21.15 2 0 +github.com/muety/wakapi/utils/filesystem.go:33.2,33.15 1 0 +github.com/muety/wakapi/utils/filesystem.go:16.16,18.3 1 0 +github.com/muety/wakapi/utils/filesystem.go:21.15,23.47 2 0 +github.com/muety/wakapi/utils/filesystem.go:23.47,25.23 2 0 +github.com/muety/wakapi/utils/filesystem.go:29.4,29.19 1 0 +github.com/muety/wakapi/utils/filesystem.go:25.23,27.5 1 0 +github.com/muety/wakapi/utils/strings.go:8.34,10.2 1 0 +github.com/muety/wakapi/utils/strings.go:12.77,13.29 1 0 +github.com/muety/wakapi/utils/strings.go:18.2,18.19 1 0 +github.com/muety/wakapi/utils/strings.go:13.29,14.18 1 0 +github.com/muety/wakapi/utils/strings.go:14.18,16.4 1 0 +github.com/muety/wakapi/config/utils.go:5.78,7.22 2 0 +github.com/muety/wakapi/config/utils.go:13.2,13.11 1 0 +github.com/muety/wakapi/config/utils.go:7.22,8.18 1 0 +github.com/muety/wakapi/config/utils.go:11.3,11.12 1 0 +github.com/muety/wakapi/config/utils.go:8.18,10.4 1 0 github.com/muety/wakapi/config/config.go:113.70,115.2 1 0 github.com/muety/wakapi/config/config.go:117.65,119.2 1 0 github.com/muety/wakapi/config/config.go:121.82,131.2 1 0 @@ -183,163 +297,57 @@ github.com/muety/wakapi/config/config.go:320.4,320.69 1 0 github.com/muety/wakapi/config/config.go:307.29,309.5 1 0 github.com/muety/wakapi/config/config.go:314.48,316.5 1 0 github.com/muety/wakapi/config/config.go:317.39,319.5 1 0 -github.com/muety/wakapi/config/config.go:322.17,324.3 1 0 -github.com/muety/wakapi/config/config.go:327.26,329.2 1 0 -github.com/muety/wakapi/config/config.go:331.20,333.2 1 0 -github.com/muety/wakapi/config/config.go:335.21,340.96 3 0 -github.com/muety/wakapi/config/config.go:344.2,352.52 5 0 -github.com/muety/wakapi/config/config.go:356.2,356.47 1 0 -github.com/muety/wakapi/config/config.go:362.2,362.70 1 0 -github.com/muety/wakapi/config/config.go:366.2,366.28 1 0 -github.com/muety/wakapi/config/config.go:370.2,370.29 1 0 -github.com/muety/wakapi/config/config.go:375.2,376.14 2 0 -github.com/muety/wakapi/config/config.go:340.96,342.3 1 0 -github.com/muety/wakapi/config/config.go:352.52,354.3 1 0 -github.com/muety/wakapi/config/config.go:356.47,357.14 1 0 -github.com/muety/wakapi/config/config.go:357.14,359.4 1 0 -github.com/muety/wakapi/config/config.go:362.70,364.3 1 0 -github.com/muety/wakapi/config/config.go:366.28,368.3 1 0 -github.com/muety/wakapi/config/config.go:370.29,373.3 2 0 -github.com/muety/wakapi/config/utils.go:5.78,7.22 2 0 -github.com/muety/wakapi/config/utils.go:13.2,13.11 1 0 -github.com/muety/wakapi/config/utils.go:7.22,8.18 1 0 -github.com/muety/wakapi/config/utils.go:11.3,11.12 1 0 -github.com/muety/wakapi/config/utils.go:8.18,10.4 1 0 -github.com/muety/wakapi/utils/common.go:10.48,12.2 1 0 -github.com/muety/wakapi/utils/common.go:14.52,16.2 1 0 -github.com/muety/wakapi/utils/common.go:18.40,20.2 1 0 -github.com/muety/wakapi/utils/common.go:22.44,24.2 1 0 -github.com/muety/wakapi/utils/common.go:26.45,28.2 1 0 -github.com/muety/wakapi/utils/common.go:30.24,32.2 1 0 -github.com/muety/wakapi/utils/common.go:34.56,37.45 3 1 -github.com/muety/wakapi/utils/common.go:40.2,40.40 1 1 -github.com/muety/wakapi/utils/common.go:37.45,39.3 1 1 -github.com/muety/wakapi/utils/filesystem.go:14.68,16.16 2 0 -github.com/muety/wakapi/utils/filesystem.go:20.2,21.15 2 0 -github.com/muety/wakapi/utils/filesystem.go:33.2,33.15 1 0 -github.com/muety/wakapi/utils/filesystem.go:16.16,18.3 1 0 -github.com/muety/wakapi/utils/filesystem.go:21.15,23.47 2 0 -github.com/muety/wakapi/utils/filesystem.go:23.47,25.23 2 0 -github.com/muety/wakapi/utils/filesystem.go:29.4,29.19 1 0 -github.com/muety/wakapi/utils/filesystem.go:25.23,27.5 1 0 -github.com/muety/wakapi/utils/strings.go:8.34,10.2 1 0 -github.com/muety/wakapi/utils/strings.go:12.77,13.29 1 0 -github.com/muety/wakapi/utils/strings.go:18.2,18.19 1 0 -github.com/muety/wakapi/utils/strings.go:13.29,14.18 1 0 -github.com/muety/wakapi/utils/strings.go:14.18,16.4 1 0 -github.com/muety/wakapi/utils/summary.go:10.66,11.40 1 0 -github.com/muety/wakapi/utils/summary.go:16.2,16.48 1 0 -github.com/muety/wakapi/utils/summary.go:11.40,12.27 1 0 -github.com/muety/wakapi/utils/summary.go:12.27,14.4 1 0 -github.com/muety/wakapi/utils/summary.go:19.67,22.2 2 0 -github.com/muety/wakapi/utils/summary.go:24.74,26.16 2 0 -github.com/muety/wakapi/utils/summary.go:29.2,29.32 1 0 -github.com/muety/wakapi/utils/summary.go:26.16,28.3 1 0 -github.com/muety/wakapi/utils/summary.go:32.84,35.18 2 0 -github.com/muety/wakapi/utils/summary.go:70.2,70.22 1 0 -github.com/muety/wakapi/utils/summary.go:36.28,37.24 1 0 -github.com/muety/wakapi/utils/summary.go:38.32,40.22 2 0 -github.com/muety/wakapi/utils/summary.go:41.31,42.23 1 0 -github.com/muety/wakapi/utils/summary.go:43.31,45.21 2 0 -github.com/muety/wakapi/utils/summary.go:46.32,47.24 1 0 -github.com/muety/wakapi/utils/summary.go:48.32,50.22 2 0 -github.com/muety/wakapi/utils/summary.go:51.31,52.23 1 0 -github.com/muety/wakapi/utils/summary.go:53.32,54.42 1 0 -github.com/muety/wakapi/utils/summary.go:55.41,57.40 2 0 -github.com/muety/wakapi/utils/summary.go:58.33,59.43 1 0 -github.com/muety/wakapi/utils/summary.go:60.33,61.43 1 0 -github.com/muety/wakapi/utils/summary.go:62.35,63.43 1 0 -github.com/muety/wakapi/utils/summary.go:64.26,65.21 1 0 -github.com/muety/wakapi/utils/summary.go:66.10,67.39 1 0 -github.com/muety/wakapi/utils/summary.go:73.73,80.56 5 0 -github.com/muety/wakapi/utils/summary.go:102.2,109.8 2 0 -github.com/muety/wakapi/utils/summary.go:80.56,82.3 1 0 -github.com/muety/wakapi/utils/summary.go:82.8,82.54 1 0 -github.com/muety/wakapi/utils/summary.go:82.54,84.3 1 0 -github.com/muety/wakapi/utils/summary.go:84.8,86.17 2 0 -github.com/muety/wakapi/utils/summary.go:93.3,94.17 2 0 -github.com/muety/wakapi/utils/summary.go:86.17,88.18 2 0 -github.com/muety/wakapi/utils/summary.go:88.18,90.5 1 0 -github.com/muety/wakapi/utils/summary.go:94.17,96.18 2 0 -github.com/muety/wakapi/utils/summary.go:96.18,98.5 1 0 -github.com/muety/wakapi/utils/auth.go:16.79,18.54 2 0 -github.com/muety/wakapi/utils/auth.go:22.2,24.16 3 0 -github.com/muety/wakapi/utils/auth.go:28.2,30.45 3 0 -github.com/muety/wakapi/utils/auth.go:33.2,34.32 2 0 -github.com/muety/wakapi/utils/auth.go:18.54,20.3 1 0 -github.com/muety/wakapi/utils/auth.go:24.16,26.3 1 0 -github.com/muety/wakapi/utils/auth.go:30.45,32.3 1 0 -github.com/muety/wakapi/utils/auth.go:37.65,39.85 2 0 -github.com/muety/wakapi/utils/auth.go:43.2,44.30 2 0 -github.com/muety/wakapi/utils/auth.go:39.85,41.3 1 0 -github.com/muety/wakapi/utils/auth.go:47.94,49.16 2 0 -github.com/muety/wakapi/utils/auth.go:53.2,53.107 1 0 -github.com/muety/wakapi/utils/auth.go:57.2,57.22 1 0 -github.com/muety/wakapi/utils/auth.go:49.16,51.3 1 0 -github.com/muety/wakapi/utils/auth.go:53.107,55.3 1 0 -github.com/muety/wakapi/utils/auth.go:60.56,64.2 3 0 -github.com/muety/wakapi/utils/auth.go:66.55,69.16 3 0 -github.com/muety/wakapi/utils/auth.go:72.2,72.16 1 0 -github.com/muety/wakapi/utils/auth.go:69.16,71.3 1 0 -github.com/muety/wakapi/utils/color.go:8.90,10.32 2 0 -github.com/muety/wakapi/utils/color.go:15.2,15.15 1 0 -github.com/muety/wakapi/utils/color.go:10.32,11.50 1 0 -github.com/muety/wakapi/utils/color.go:11.50,13.4 1 0 -github.com/muety/wakapi/utils/date.go:8.31,10.2 1 0 -github.com/muety/wakapi/utils/date.go:12.43,14.2 1 0 -github.com/muety/wakapi/utils/date.go:16.30,20.2 3 0 -github.com/muety/wakapi/utils/date.go:22.31,25.2 2 0 -github.com/muety/wakapi/utils/date.go:27.30,30.2 2 0 -github.com/muety/wakapi/utils/date.go:32.67,35.33 2 0 -github.com/muety/wakapi/utils/date.go:44.2,44.18 1 0 -github.com/muety/wakapi/utils/date.go:35.33,37.19 2 0 -github.com/muety/wakapi/utils/date.go:40.3,41.10 2 0 -github.com/muety/wakapi/utils/date.go:37.19,39.4 1 0 -github.com/muety/wakapi/utils/date.go:47.50,53.2 5 0 -github.com/muety/wakapi/utils/date.go:56.79,59.36 3 0 -github.com/muety/wakapi/utils/date.go:63.2,63.21 1 0 -github.com/muety/wakapi/utils/date.go:67.2,67.21 1 0 -github.com/muety/wakapi/utils/date.go:71.2,71.13 1 0 -github.com/muety/wakapi/utils/date.go:59.36,62.3 2 0 -github.com/muety/wakapi/utils/date.go:63.21,66.3 2 0 -github.com/muety/wakapi/utils/date.go:67.21,70.3 2 0 -github.com/muety/wakapi/utils/http.go:9.73,12.58 3 0 -github.com/muety/wakapi/utils/http.go:12.58,14.3 1 0 -github.com/muety/wakapi/utils/template.go:8.41,10.16 2 0 -github.com/muety/wakapi/utils/template.go:13.2,13.23 1 0 -github.com/muety/wakapi/utils/template.go:10.16,12.3 1 0 -github.com/muety/wakapi/utils/template.go:16.37,17.30 1 0 -github.com/muety/wakapi/utils/template.go:20.2,20.10 1 0 -github.com/muety/wakapi/utils/template.go:17.30,19.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:20.91,26.2 1 1 -github.com/muety/wakapi/middlewares/authenticate.go:28.90,31.2 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:33.90,36.2 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:38.71,39.71 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:39.71,41.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:44.107,48.16 3 0 -github.com/muety/wakapi/middlewares/authenticate.go:52.2,52.31 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:68.2,69.29 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:48.16,50.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:52.31,53.31 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:58.3,58.29 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:65.3,65.9 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:53.31,56.4 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:58.29,61.4 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:61.9,64.4 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:72.70,73.39 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:78.2,78.14 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:73.39,74.60 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:74.60,76.4 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:81.92,83.16 2 1 -github.com/muety/wakapi/middlewares/authenticate.go:87.2,90.16 4 1 -github.com/muety/wakapi/middlewares/authenticate.go:93.2,93.18 1 1 -github.com/muety/wakapi/middlewares/authenticate.go:83.16,85.3 1 1 -github.com/muety/wakapi/middlewares/authenticate.go:90.16,92.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:96.92,98.16 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:102.2,103.16 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:110.2,110.18 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:98.16,100.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:103.16,105.3 1 0 +github.com/muety/wakapi/config/config.go:322.79,326.27 2 0 +github.com/muety/wakapi/config/config.go:333.4,333.16 1 0 +github.com/muety/wakapi/config/config.go:326.27,327.84 1 0 +github.com/muety/wakapi/config/config.go:327.84,328.57 1 0 +github.com/muety/wakapi/config/config.go:328.57,330.7 1 0 +github.com/muety/wakapi/config/config.go:335.17,337.3 1 0 +github.com/muety/wakapi/config/config.go:340.26,342.2 1 0 +github.com/muety/wakapi/config/config.go:344.20,346.2 1 0 +github.com/muety/wakapi/config/config.go:348.21,353.96 3 0 +github.com/muety/wakapi/config/config.go:357.2,365.52 5 0 +github.com/muety/wakapi/config/config.go:369.2,369.47 1 0 +github.com/muety/wakapi/config/config.go:375.2,375.70 1 0 +github.com/muety/wakapi/config/config.go:379.2,379.28 1 0 +github.com/muety/wakapi/config/config.go:383.2,383.29 1 0 +github.com/muety/wakapi/config/config.go:388.2,389.14 2 0 +github.com/muety/wakapi/config/config.go:353.96,355.3 1 0 +github.com/muety/wakapi/config/config.go:365.52,367.3 1 0 +github.com/muety/wakapi/config/config.go:369.47,370.14 1 0 +github.com/muety/wakapi/config/config.go:370.14,372.4 1 0 +github.com/muety/wakapi/config/config.go:375.70,377.3 1 0 +github.com/muety/wakapi/config/config.go:379.28,381.3 1 0 +github.com/muety/wakapi/config/config.go:383.29,386.3 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:19.91,25.2 1 1 +github.com/muety/wakapi/middlewares/authenticate.go:27.90,30.2 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:32.90,35.2 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:37.71,38.71 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:38.71,40.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:43.107,47.16 3 0 +github.com/muety/wakapi/middlewares/authenticate.go:51.2,51.31 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:67.2,68.12 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:47.16,49.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:51.31,52.31 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:57.3,57.29 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:64.3,64.9 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:52.31,55.4 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:57.29,60.4 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:60.9,63.4 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:71.70,72.39 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:77.2,77.14 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:72.39,73.60 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:73.60,75.4 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:80.92,82.16 2 1 +github.com/muety/wakapi/middlewares/authenticate.go:86.2,89.16 4 1 +github.com/muety/wakapi/middlewares/authenticate.go:92.2,92.18 1 1 +github.com/muety/wakapi/middlewares/authenticate.go:82.16,84.3 1 1 +github.com/muety/wakapi/middlewares/authenticate.go:89.16,91.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:95.92,97.16 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:101.2,102.16 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:109.2,109.18 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:97.16,99.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:102.16,104.3 1 0 github.com/muety/wakapi/middlewares/filetype.go:13.83,14.43 1 0 github.com/muety/wakapi/middlewares/filetype.go:14.43,19.3 1 0 github.com/muety/wakapi/middlewares/filetype.go:22.84,24.34 2 0 @@ -349,79 +357,45 @@ github.com/muety/wakapi/middlewares/filetype.go:25.50,29.4 3 0 github.com/muety/wakapi/middlewares/logging.go:20.102,21.43 1 0 github.com/muety/wakapi/middlewares/logging.go:21.43,27.3 1 0 github.com/muety/wakapi/middlewares/logging.go:30.80,39.44 7 0 -github.com/muety/wakapi/middlewares/logging.go:45.2,53.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:45.2,54.3 1 0 github.com/muety/wakapi/middlewares/logging.go:39.44,40.38 1 0 github.com/muety/wakapi/middlewares/logging.go:40.38,42.4 1 0 -github.com/muety/wakapi/middlewares/logging.go:56.41,58.14 2 0 -github.com/muety/wakapi/middlewares/logging.go:61.2,61.14 1 0 -github.com/muety/wakapi/middlewares/logging.go:64.2,64.11 1 0 -github.com/muety/wakapi/middlewares/logging.go:58.14,60.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:61.14,63.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:95.52,97.2 1 0 -github.com/muety/wakapi/middlewares/logging.go:109.45,110.20 1 0 -github.com/muety/wakapi/middlewares/logging.go:110.20,114.3 3 0 -github.com/muety/wakapi/middlewares/logging.go:116.54,119.18 3 0 -github.com/muety/wakapi/middlewares/logging.go:126.2,127.15 2 0 -github.com/muety/wakapi/middlewares/logging.go:119.18,122.17 2 0 -github.com/muety/wakapi/middlewares/logging.go:122.17,124.4 1 0 -github.com/muety/wakapi/middlewares/logging.go:129.42,130.20 1 0 -github.com/muety/wakapi/middlewares/logging.go:130.20,132.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:134.36,136.2 1 0 -github.com/muety/wakapi/middlewares/logging.go:137.42,139.2 1 0 -github.com/muety/wakapi/middlewares/logging.go:140.40,142.2 1 0 -github.com/muety/wakapi/middlewares/logging.go:143.52,145.2 1 0 -github.com/muety/wakapi/middlewares/sentry.go:8.60,9.43 1 0 -github.com/muety/wakapi/middlewares/sentry.go:9.43,13.3 1 0 -github.com/muety/wakapi/services/misc.go:23.126,30.2 1 0 -github.com/muety/wakapi/services/misc.go:42.50,44.48 1 0 -github.com/muety/wakapi/services/misc.go:48.2,50.19 3 0 -github.com/muety/wakapi/services/misc.go:44.48,46.3 1 0 -github.com/muety/wakapi/services/misc.go:53.51,59.40 4 0 -github.com/muety/wakapi/services/misc.go:63.2,66.56 2 0 -github.com/muety/wakapi/services/misc.go:77.2,77.12 1 0 -github.com/muety/wakapi/services/misc.go:59.40,61.3 1 0 -github.com/muety/wakapi/services/misc.go:66.56,67.27 1 0 -github.com/muety/wakapi/services/misc.go:67.27,72.4 1 0 -github.com/muety/wakapi/services/misc.go:73.8,75.3 1 0 -github.com/muety/wakapi/services/misc.go:80.116,81.24 1 0 -github.com/muety/wakapi/services/misc.go:81.24,82.151 1 0 -github.com/muety/wakapi/services/misc.go:91.3,91.48 1 0 -github.com/muety/wakapi/services/misc.go:82.151,84.4 1 0 -github.com/muety/wakapi/services/misc.go:84.9,90.4 2 0 -github.com/muety/wakapi/services/misc.go:91.48,94.4 2 0 -github.com/muety/wakapi/services/misc.go:98.86,101.30 3 0 -github.com/muety/wakapi/services/misc.go:106.2,109.17 1 0 -github.com/muety/wakapi/services/misc.go:113.2,116.17 1 0 -github.com/muety/wakapi/services/misc.go:101.30,104.3 2 0 -github.com/muety/wakapi/services/misc.go:109.17,111.3 1 0 -github.com/muety/wakapi/services/misc.go:116.17,118.3 1 0 -github.com/muety/wakapi/services/user.go:19.73,25.2 1 0 -github.com/muety/wakapi/services/user.go:27.74,28.40 1 0 -github.com/muety/wakapi/services/user.go:32.2,33.16 2 0 -github.com/muety/wakapi/services/user.go:37.2,38.15 2 0 -github.com/muety/wakapi/services/user.go:28.40,30.3 1 0 -github.com/muety/wakapi/services/user.go:33.16,35.3 1 0 -github.com/muety/wakapi/services/user.go:41.72,42.37 1 0 -github.com/muety/wakapi/services/user.go:46.2,47.16 2 0 -github.com/muety/wakapi/services/user.go:51.2,52.15 2 0 -github.com/muety/wakapi/services/user.go:42.37,44.3 1 0 -github.com/muety/wakapi/services/user.go:47.16,49.3 1 0 -github.com/muety/wakapi/services/user.go:55.58,57.2 1 0 -github.com/muety/wakapi/services/user.go:59.61,62.2 2 0 -github.com/muety/wakapi/services/user.go:64.48,66.2 1 0 -github.com/muety/wakapi/services/user.go:68.102,77.93 2 0 -github.com/muety/wakapi/services/user.go:83.2,83.38 1 0 -github.com/muety/wakapi/services/user.go:77.93,79.3 1 0 -github.com/muety/wakapi/services/user.go:79.8,81.3 1 0 -github.com/muety/wakapi/services/user.go:86.73,89.2 2 0 -github.com/muety/wakapi/services/user.go:91.78,95.2 3 0 -github.com/muety/wakapi/services/user.go:97.99,100.2 2 0 -github.com/muety/wakapi/services/user.go:102.106,105.96 3 0 -github.com/muety/wakapi/services/user.go:110.2,110.68 1 0 -github.com/muety/wakapi/services/user.go:105.96,107.3 1 0 -github.com/muety/wakapi/services/user.go:107.8,109.3 1 0 -github.com/muety/wakapi/services/user.go:113.57,116.2 2 0 -github.com/muety/wakapi/services/user.go:118.38,120.2 1 0 +github.com/muety/wakapi/middlewares/logging.go:57.41,59.14 2 0 +github.com/muety/wakapi/middlewares/logging.go:62.2,62.14 1 0 +github.com/muety/wakapi/middlewares/logging.go:65.2,65.11 1 0 +github.com/muety/wakapi/middlewares/logging.go:59.14,61.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:62.14,64.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:68.41,69.42 1 0 +github.com/muety/wakapi/middlewares/logging.go:72.2,72.12 1 0 +github.com/muety/wakapi/middlewares/logging.go:69.42,71.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:103.52,105.2 1 0 +github.com/muety/wakapi/middlewares/logging.go:117.45,118.20 1 0 +github.com/muety/wakapi/middlewares/logging.go:118.20,122.3 3 0 +github.com/muety/wakapi/middlewares/logging.go:124.54,127.18 3 0 +github.com/muety/wakapi/middlewares/logging.go:134.2,135.15 2 0 +github.com/muety/wakapi/middlewares/logging.go:127.18,130.17 2 0 +github.com/muety/wakapi/middlewares/logging.go:130.17,132.4 1 0 +github.com/muety/wakapi/middlewares/logging.go:137.42,138.20 1 0 +github.com/muety/wakapi/middlewares/logging.go:138.20,140.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:142.36,144.2 1 0 +github.com/muety/wakapi/middlewares/logging.go:145.42,147.2 1 0 +github.com/muety/wakapi/middlewares/logging.go:148.40,150.2 1 0 +github.com/muety/wakapi/middlewares/logging.go:151.52,153.2 1 0 +github.com/muety/wakapi/middlewares/principal.go:15.62,17.2 1 0 +github.com/muety/wakapi/middlewares/principal.go:19.58,21.2 1 0 +github.com/muety/wakapi/middlewares/principal.go:42.71,43.43 1 0 +github.com/muety/wakapi/middlewares/principal.go:43.43,45.3 1 0 +github.com/muety/wakapi/middlewares/principal.go:48.81,51.2 2 0 +github.com/muety/wakapi/middlewares/principal.go:53.55,54.52 1 0 +github.com/muety/wakapi/middlewares/principal.go:54.52,56.3 1 0 +github.com/muety/wakapi/middlewares/principal.go:59.49,60.52 1 0 +github.com/muety/wakapi/middlewares/principal.go:63.2,63.12 1 0 +github.com/muety/wakapi/middlewares/principal.go:60.52,62.3 1 0 +github.com/muety/wakapi/middlewares/sentry.go:14.60,15.43 1 0 +github.com/muety/wakapi/middlewares/sentry.go:15.43,19.3 1 0 +github.com/muety/wakapi/middlewares/sentry.go:22.78,25.54 3 0 +github.com/muety/wakapi/middlewares/sentry.go:25.54,26.43 1 0 +github.com/muety/wakapi/middlewares/sentry.go:26.43,28.4 1 0 github.com/muety/wakapi/services/alias.go:17.77,22.2 1 1 github.com/muety/wakapi/services/alias.go:26.60,27.43 1 1 github.com/muety/wakapi/services/alias.go:30.2,30.14 1 1 @@ -496,6 +470,96 @@ github.com/muety/wakapi/services/language_mapping.go:66.82,67.26 1 0 github.com/muety/wakapi/services/language_mapping.go:70.2,72.12 3 0 github.com/muety/wakapi/services/language_mapping.go:67.26,69.3 1 0 github.com/muety/wakapi/services/language_mapping.go:75.74,78.2 1 0 +github.com/muety/wakapi/services/user.go:19.73,25.2 1 0 +github.com/muety/wakapi/services/user.go:27.74,28.40 1 0 +github.com/muety/wakapi/services/user.go:32.2,33.16 2 0 +github.com/muety/wakapi/services/user.go:37.2,38.15 2 0 +github.com/muety/wakapi/services/user.go:28.40,30.3 1 0 +github.com/muety/wakapi/services/user.go:33.16,35.3 1 0 +github.com/muety/wakapi/services/user.go:41.72,42.37 1 0 +github.com/muety/wakapi/services/user.go:46.2,47.16 2 0 +github.com/muety/wakapi/services/user.go:51.2,52.15 2 0 +github.com/muety/wakapi/services/user.go:42.37,44.3 1 0 +github.com/muety/wakapi/services/user.go:47.16,49.3 1 0 +github.com/muety/wakapi/services/user.go:55.58,57.2 1 0 +github.com/muety/wakapi/services/user.go:59.61,62.2 2 0 +github.com/muety/wakapi/services/user.go:64.48,66.2 1 0 +github.com/muety/wakapi/services/user.go:68.102,77.93 2 0 +github.com/muety/wakapi/services/user.go:83.2,83.38 1 0 +github.com/muety/wakapi/services/user.go:77.93,79.3 1 0 +github.com/muety/wakapi/services/user.go:79.8,81.3 1 0 +github.com/muety/wakapi/services/user.go:86.73,89.2 2 0 +github.com/muety/wakapi/services/user.go:91.78,95.2 3 0 +github.com/muety/wakapi/services/user.go:97.99,100.2 2 0 +github.com/muety/wakapi/services/user.go:102.106,105.96 3 0 +github.com/muety/wakapi/services/user.go:110.2,110.68 1 0 +github.com/muety/wakapi/services/user.go:105.96,107.3 1 0 +github.com/muety/wakapi/services/user.go:107.8,109.3 1 0 +github.com/muety/wakapi/services/user.go:113.57,116.2 2 0 +github.com/muety/wakapi/services/user.go:118.38,120.2 1 0 +github.com/muety/wakapi/services/aggregation.go:24.142,31.2 1 0 +github.com/muety/wakapi/services/aggregation.go:40.43,42.37 1 0 +github.com/muety/wakapi/services/aggregation.go:46.2,48.19 3 0 +github.com/muety/wakapi/services/aggregation.go:42.37,44.3 1 0 +github.com/muety/wakapi/services/aggregation.go:51.67,55.40 3 0 +github.com/muety/wakapi/services/aggregation.go:59.2,59.50 1 0 +github.com/muety/wakapi/services/aggregation.go:64.2,64.60 1 0 +github.com/muety/wakapi/services/aggregation.go:70.2,70.35 1 0 +github.com/muety/wakapi/services/aggregation.go:55.40,57.3 1 0 +github.com/muety/wakapi/services/aggregation.go:59.50,61.3 1 0 +github.com/muety/wakapi/services/aggregation.go:64.60,68.3 3 0 +github.com/muety/wakapi/services/aggregation.go:73.109,74.24 1 0 +github.com/muety/wakapi/services/aggregation.go:74.24,75.111 1 0 +github.com/muety/wakapi/services/aggregation.go:75.111,77.4 1 0 +github.com/muety/wakapi/services/aggregation.go:77.9,80.4 2 0 +github.com/muety/wakapi/services/aggregation.go:84.80,85.33 1 0 +github.com/muety/wakapi/services/aggregation.go:85.33,86.60 1 0 +github.com/muety/wakapi/services/aggregation.go:86.60,88.4 1 0 +github.com/muety/wakapi/services/aggregation.go:92.100,96.59 3 0 +github.com/muety/wakapi/services/aggregation.go:111.2,112.16 2 0 +github.com/muety/wakapi/services/aggregation.go:118.2,119.16 2 0 +github.com/muety/wakapi/services/aggregation.go:125.2,126.44 2 0 +github.com/muety/wakapi/services/aggregation.go:131.2,131.41 1 0 +github.com/muety/wakapi/services/aggregation.go:145.2,145.12 1 0 +github.com/muety/wakapi/services/aggregation.go:96.59,99.3 2 0 +github.com/muety/wakapi/services/aggregation.go:99.8,99.47 1 0 +github.com/muety/wakapi/services/aggregation.go:99.47,101.30 2 0 +github.com/muety/wakapi/services/aggregation.go:101.30,102.43 1 0 +github.com/muety/wakapi/services/aggregation.go:102.43,104.5 1 0 +github.com/muety/wakapi/services/aggregation.go:106.8,108.3 1 0 +github.com/muety/wakapi/services/aggregation.go:112.16,115.3 2 0 +github.com/muety/wakapi/services/aggregation.go:119.16,122.3 2 0 +github.com/muety/wakapi/services/aggregation.go:126.44,128.3 1 0 +github.com/muety/wakapi/services/aggregation.go:131.41,132.21 1 0 +github.com/muety/wakapi/services/aggregation.go:132.21,136.4 1 0 +github.com/muety/wakapi/services/aggregation.go:136.9,136.62 1 0 +github.com/muety/wakapi/services/aggregation.go:136.62,140.4 1 0 +github.com/muety/wakapi/services/aggregation.go:148.83,163.41 5 0 +github.com/muety/wakapi/services/aggregation.go:163.41,173.3 3 0 +github.com/muety/wakapi/services/aggregation.go:176.34,179.2 2 0 +github.com/muety/wakapi/services/misc.go:23.126,30.2 1 0 +github.com/muety/wakapi/services/misc.go:42.50,44.48 1 0 +github.com/muety/wakapi/services/misc.go:48.2,50.19 3 0 +github.com/muety/wakapi/services/misc.go:44.48,46.3 1 0 +github.com/muety/wakapi/services/misc.go:53.51,59.40 4 0 +github.com/muety/wakapi/services/misc.go:63.2,66.56 2 0 +github.com/muety/wakapi/services/misc.go:77.2,77.12 1 0 +github.com/muety/wakapi/services/misc.go:59.40,61.3 1 0 +github.com/muety/wakapi/services/misc.go:66.56,67.27 1 0 +github.com/muety/wakapi/services/misc.go:67.27,72.4 1 0 +github.com/muety/wakapi/services/misc.go:73.8,75.3 1 0 +github.com/muety/wakapi/services/misc.go:80.116,81.24 1 0 +github.com/muety/wakapi/services/misc.go:81.24,82.151 1 0 +github.com/muety/wakapi/services/misc.go:91.3,91.48 1 0 +github.com/muety/wakapi/services/misc.go:82.151,84.4 1 0 +github.com/muety/wakapi/services/misc.go:84.9,90.4 2 0 +github.com/muety/wakapi/services/misc.go:91.48,94.4 2 0 +github.com/muety/wakapi/services/misc.go:98.86,101.30 3 0 +github.com/muety/wakapi/services/misc.go:106.2,109.17 1 0 +github.com/muety/wakapi/services/misc.go:113.2,116.17 1 0 +github.com/muety/wakapi/services/misc.go:101.30,104.3 2 0 +github.com/muety/wakapi/services/misc.go:109.17,111.3 1 0 +github.com/muety/wakapi/services/misc.go:116.17,118.3 1 0 github.com/muety/wakapi/services/summary.go:27.149,35.2 1 1 github.com/muety/wakapi/services/summary.go:39.136,42.66 2 1 github.com/muety/wakapi/services/summary.go:47.2,47.44 1 1 @@ -585,46 +649,6 @@ github.com/muety/wakapi/services/summary.go:324.54,326.3 1 1 github.com/muety/wakapi/services/summary.go:331.59,333.25 2 1 github.com/muety/wakapi/services/summary.go:336.2,336.32 1 1 github.com/muety/wakapi/services/summary.go:333.25,335.3 1 1 -github.com/muety/wakapi/services/aggregation.go:24.142,31.2 1 0 -github.com/muety/wakapi/services/aggregation.go:40.43,42.37 1 0 -github.com/muety/wakapi/services/aggregation.go:46.2,48.19 3 0 -github.com/muety/wakapi/services/aggregation.go:42.37,44.3 1 0 -github.com/muety/wakapi/services/aggregation.go:51.67,55.40 3 0 -github.com/muety/wakapi/services/aggregation.go:59.2,59.50 1 0 -github.com/muety/wakapi/services/aggregation.go:64.2,64.60 1 0 -github.com/muety/wakapi/services/aggregation.go:70.2,70.35 1 0 -github.com/muety/wakapi/services/aggregation.go:55.40,57.3 1 0 -github.com/muety/wakapi/services/aggregation.go:59.50,61.3 1 0 -github.com/muety/wakapi/services/aggregation.go:64.60,68.3 3 0 -github.com/muety/wakapi/services/aggregation.go:73.109,74.24 1 0 -github.com/muety/wakapi/services/aggregation.go:74.24,75.111 1 0 -github.com/muety/wakapi/services/aggregation.go:75.111,77.4 1 0 -github.com/muety/wakapi/services/aggregation.go:77.9,80.4 2 0 -github.com/muety/wakapi/services/aggregation.go:84.80,85.33 1 0 -github.com/muety/wakapi/services/aggregation.go:85.33,86.60 1 0 -github.com/muety/wakapi/services/aggregation.go:86.60,88.4 1 0 -github.com/muety/wakapi/services/aggregation.go:92.100,96.59 3 0 -github.com/muety/wakapi/services/aggregation.go:111.2,112.16 2 0 -github.com/muety/wakapi/services/aggregation.go:118.2,119.16 2 0 -github.com/muety/wakapi/services/aggregation.go:125.2,126.44 2 0 -github.com/muety/wakapi/services/aggregation.go:131.2,131.41 1 0 -github.com/muety/wakapi/services/aggregation.go:145.2,145.12 1 0 -github.com/muety/wakapi/services/aggregation.go:96.59,99.3 2 0 -github.com/muety/wakapi/services/aggregation.go:99.8,99.47 1 0 -github.com/muety/wakapi/services/aggregation.go:99.47,101.30 2 0 -github.com/muety/wakapi/services/aggregation.go:101.30,102.43 1 0 -github.com/muety/wakapi/services/aggregation.go:102.43,104.5 1 0 -github.com/muety/wakapi/services/aggregation.go:106.8,108.3 1 0 -github.com/muety/wakapi/services/aggregation.go:112.16,115.3 2 0 -github.com/muety/wakapi/services/aggregation.go:119.16,122.3 2 0 -github.com/muety/wakapi/services/aggregation.go:126.44,128.3 1 0 -github.com/muety/wakapi/services/aggregation.go:131.41,132.21 1 0 -github.com/muety/wakapi/services/aggregation.go:132.21,136.4 1 0 -github.com/muety/wakapi/services/aggregation.go:136.9,136.62 1 0 -github.com/muety/wakapi/services/aggregation.go:136.62,140.4 1 0 -github.com/muety/wakapi/services/aggregation.go:148.83,163.41 5 0 -github.com/muety/wakapi/services/aggregation.go:163.41,173.3 3 0 -github.com/muety/wakapi/services/aggregation.go:176.34,179.2 2 0 github.com/muety/wakapi/services/key_value.go:14.89,19.2 1 0 github.com/muety/wakapi/services/key_value.go:21.83,23.2 1 0 github.com/muety/wakapi/services/key_value.go:25.78,27.16 2 0 diff --git a/main.go b/main.go index 35bf85d..5cde124 100644 --- a/main.go +++ b/main.go @@ -168,11 +168,12 @@ func main() { apiRouter := router.PathPrefix("/api").Subrouter().StrictSlash(true) // Globally used middlewares + router.Use(middlewares.NewPrincipalMiddleware()) router.Use(middlewares.NewLoggingMiddleware(logbuch.Info, []string{"/assets"})) + router.Use(handlers.RecoveryHandler()) if config.Sentry.Dsn != "" { router.Use(middlewares.NewSentryMiddleware()) } - router.Use(handlers.RecoveryHandler()) // Route registrations homeHandler.RegisterRoutes(rootRouter) diff --git a/middlewares/authenticate.go b/middlewares/authenticate.go index 08a8c9f..ba175cd 100644 --- a/middlewares/authenticate.go +++ b/middlewares/authenticate.go @@ -1,7 +1,6 @@ package middlewares import ( - "context" conf "github.com/muety/wakapi/config" "github.com/muety/wakapi/models" "github.com/muety/wakapi/services" @@ -65,8 +64,8 @@ func (m *AuthenticateMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Reques return } - ctx := context.WithValue(r.Context(), models.UserKey, user) - next(w, r.WithContext(ctx)) + SetPrincipal(r, user) + next(w, r) } func (m *AuthenticateMiddleware) isOptional(requestPath string) bool { diff --git a/middlewares/custom/wakatime.go b/middlewares/custom/wakatime.go index c7ab5df..a412767 100644 --- a/middlewares/custom/wakatime.go +++ b/middlewares/custom/wakatime.go @@ -6,7 +6,7 @@ import ( "fmt" "github.com/emvi/logbuch" "github.com/muety/wakapi/config" - "github.com/muety/wakapi/models" + "github.com/muety/wakapi/middlewares" "io" "io/ioutil" "net/http" @@ -39,7 +39,7 @@ func (m *WakatimeRelayMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Reque return } - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) if user == nil || user.WakatimeApiKey == "" { return } diff --git a/middlewares/logging.go b/middlewares/logging.go index 03c8019..7d4a5df 100644 --- a/middlewares/logging.go +++ b/middlewares/logging.go @@ -43,13 +43,14 @@ func (lg *LoggingMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) { } lg.logFunc( - "[request] status=%d, method=%s, uri=%s, duration=%v, bytes=%d, addr=%s", + "[request] status=%d, method=%s, uri=%s, duration=%v, bytes=%d, addr=%s, user=%s", ww.Status(), r.Method, r.URL.String(), duration, ww.BytesWritten(), readUserIP(r), + readUserID(r), ) } @@ -64,6 +65,13 @@ func readUserIP(r *http.Request) string { return ip } +func readUserID(r *http.Request) string { + if user := GetPrincipal(r); user != nil { + return user.ID + } + return "-" +} + // The below writer-wrapping code has been lifted from // https://github.com/zenazn/goji/blob/master/web/middleware/logger.go - because // it does exactly what is needed, and it's unlikely to change in any diff --git a/middlewares/principal.go b/middlewares/principal.go new file mode 100644 index 0000000..9816f32 --- /dev/null +++ b/middlewares/principal.go @@ -0,0 +1,64 @@ +package middlewares + +import ( + "context" + "github.com/muety/wakapi/models" + "net/http" +) + +const keyPrincipal = "principal" + +type PrincipalContainer struct { + principal *models.User +} + +func (c *PrincipalContainer) SetPrincipal(user *models.User) { + c.principal = user +} + +func (c *PrincipalContainer) GetPrincipal() *models.User { + return c.principal +} + +// This middleware is a bit of a dirty workaround to the fact that a http.Request's context +// does not allow to pass values from an inner to an outer middleware. Calling WithContext() on a +// request shallow-copies the whole request itself and therefore, in a chain of handler1(handler2()), +// handler 1 will not have access to values handler 2 writes to its context. In addition, Context.WithValue +// returns a new context with the old context as a parent. +// +// As a concrete example, SentryMiddleware as well as LoggingMiddleware should be quite the outer layers, +// while AuthenticationMiddleware is on the very inside of the chain. However, we still want sentry or the +// logger to have access to the user object populated by the auth. middleware, if present. +// +// This middleware shall be included as the outermost layers and it injects a stateful container that does +// nothing but conditionally hold a reference to an authenticated user object. +// +// Other reference: https://stackoverflow.com/questions/55972869/send-errors-to-sentry-with-golang-and-mux + +type PrincipalMiddleware struct { + handler http.Handler +} + +func NewPrincipalMiddleware() func(handler http.Handler) http.Handler { + return func(h http.Handler) http.Handler { + return &PrincipalMiddleware{handler: h} + } +} + +func (p *PrincipalMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), keyPrincipal, &PrincipalContainer{}) + p.handler.ServeHTTP(w, r.WithContext(ctx)) +} + +func SetPrincipal(r *http.Request, user *models.User) { + if p := r.Context().Value(keyPrincipal); p != nil { + p.(*PrincipalContainer).SetPrincipal(user) + } +} + +func GetPrincipal(r *http.Request) *models.User { + if p := r.Context().Value(keyPrincipal); p != nil { + return p.(*PrincipalContainer).GetPrincipal() + } + return nil +} diff --git a/middlewares/sentry.go b/middlewares/sentry.go index abcf0c4..41b78c7 100644 --- a/middlewares/sentry.go +++ b/middlewares/sentry.go @@ -1,14 +1,30 @@ package middlewares import ( + "context" + "github.com/getsentry/sentry-go" sentryhttp "github.com/getsentry/sentry-go/http" "net/http" ) +type SentryMiddleware struct { + handler http.Handler +} + func NewSentryMiddleware() func(http.Handler) http.Handler { return func(h http.Handler) http.Handler { return sentryhttp.New(sentryhttp.Options{ Repanic: true, - }).Handle(h) + }).Handle(&SentryMiddleware{handler: h}) + } +} + +func (h *SentryMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), "-", "-") + h.handler.ServeHTTP(w, r.WithContext(ctx)) + if hub := sentry.GetHubFromContext(ctx); hub != nil { + if user := GetPrincipal(r); user != nil { + hub.Scope().SetUser(sentry.User{ID: user.ID}) + } } } diff --git a/routes/api/heartbeat.go b/routes/api/heartbeat.go index 8ebe1c3..b51efc3 100644 --- a/routes/api/heartbeat.go +++ b/routes/api/heartbeat.go @@ -53,7 +53,7 @@ func (h *HeartbeatApiHandler) RegisterRoutes(router *mux.Router) { // @Router /heartbeat [post] func (h *HeartbeatApiHandler) Post(w http.ResponseWriter, r *http.Request) { var heartbeats []*models.Heartbeat - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) opSys, editor, _ := utils.ParseUserAgent(r.Header.Get("User-Agent")) machineName := r.Header.Get("X-Machine-Name") diff --git a/routes/api/metrics.go b/routes/api/metrics.go index c98add7..d18fefa 100644 --- a/routes/api/metrics.go +++ b/routes/api/metrics.go @@ -68,7 +68,7 @@ func (h *MetricsHandler) RegisterRoutes(router *mux.Router) { } func (h *MetricsHandler) Get(w http.ResponseWriter, r *http.Request) { - reqUser := r.Context().Value(models.UserKey).(*models.User) + reqUser := middlewares.GetPrincipal(r) if reqUser == nil { w.WriteHeader(http.StatusUnauthorized) w.Write([]byte(conf.ErrUnauthorized)) diff --git a/routes/compat/wakatime/v1/all_time.go b/routes/compat/wakatime/v1/all_time.go index 918427f..4d0c0d0 100644 --- a/routes/compat/wakatime/v1/all_time.go +++ b/routes/compat/wakatime/v1/all_time.go @@ -49,7 +49,7 @@ func (h *AllTimeHandler) Get(w http.ResponseWriter, r *http.Request) { values, _ := url.ParseQuery(r.URL.RawQuery) requestedUser := vars["user"] - authorizedUser := r.Context().Value(models.UserKey).(*models.User) + authorizedUser := middlewares.GetPrincipal(r) if requestedUser != authorizedUser.ID && requestedUser != "current" { w.WriteHeader(http.StatusForbidden) diff --git a/routes/compat/wakatime/v1/stats.go b/routes/compat/wakatime/v1/stats.go index d54abaa..8197012 100644 --- a/routes/compat/wakatime/v1/stats.go +++ b/routes/compat/wakatime/v1/stats.go @@ -45,10 +45,7 @@ func (h *StatsHandler) Get(w http.ResponseWriter, r *http.Request) { var vars = mux.Vars(r) var authorizedUser, requestedUser *models.User - if u := r.Context().Value(models.UserKey); u != nil { - authorizedUser = u.(*models.User) - } - + authorizedUser = middlewares.GetPrincipal(r) if authorizedUser != nil && vars["user"] == "current" { vars["user"] = authorizedUser.ID } diff --git a/routes/compat/wakatime/v1/summaries.go b/routes/compat/wakatime/v1/summaries.go index 4f86d41..3646245 100644 --- a/routes/compat/wakatime/v1/summaries.go +++ b/routes/compat/wakatime/v1/summaries.go @@ -56,7 +56,7 @@ func (h *SummariesHandler) RegisterRoutes(router *mux.Router) { func (h *SummariesHandler) Get(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) requestedUser := vars["user"] - authorizedUser := r.Context().Value(models.UserKey).(*models.User) + authorizedUser := middlewares.GetPrincipal(r) if requestedUser != authorizedUser.ID && requestedUser != "current" { w.WriteHeader(http.StatusForbidden) @@ -80,7 +80,7 @@ func (h *SummariesHandler) Get(w http.ResponseWriter, r *http.Request) { } func (h *SummariesHandler) loadUserSummaries(r *http.Request) ([]*models.Summary, error, int) { - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) params := r.URL.Query() rangeParam, startParam, endParam := params.Get("range"), params.Get("start"), params.Get("end") diff --git a/routes/settings.go b/routes/settings.go index 5fcc6b4..9dbff17 100644 --- a/routes/settings.go +++ b/routes/settings.go @@ -148,7 +148,7 @@ func (h *SettingsHandler) actionUpdateUser(w http.ResponseWriter, r *http.Reques loadTemplates() } - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) var payload models.UserDataUpdate if err := r.ParseForm(); err != nil { @@ -176,7 +176,7 @@ func (h *SettingsHandler) actionChangePassword(w http.ResponseWriter, r *http.Re loadTemplates() } - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) var credentials models.CredentialsReset if err := r.ParseForm(); err != nil { @@ -223,7 +223,7 @@ func (h *SettingsHandler) actionResetApiKey(w http.ResponseWriter, r *http.Reque loadTemplates() } - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) if _, err := h.userSrvc.ResetApiKey(user); err != nil { return http.StatusInternalServerError, "", conf.ErrInternalServerError } @@ -238,7 +238,7 @@ func (h *SettingsHandler) actionUpdateSharing(w http.ResponseWriter, r *http.Req } var err error - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) defer h.userSrvc.FlushCache() @@ -265,7 +265,7 @@ func (h *SettingsHandler) actionDeleteAlias(w http.ResponseWriter, r *http.Reque loadTemplates() } - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) aliasKey := r.PostFormValue("key") aliasType, err := strconv.Atoi(r.PostFormValue("type")) if err != nil { @@ -285,7 +285,7 @@ func (h *SettingsHandler) actionAddAlias(w http.ResponseWriter, r *http.Request) if h.config.IsDev() { loadTemplates() } - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) aliasKey := r.PostFormValue("key") aliasValue := r.PostFormValue("value") aliasType, err := strconv.Atoi(r.PostFormValue("type")) @@ -313,7 +313,7 @@ func (h *SettingsHandler) actionDeleteLanguageMapping(w http.ResponseWriter, r * loadTemplates() } - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) id, err := strconv.Atoi(r.PostFormValue("mapping_id")) if err != nil { return http.StatusInternalServerError, "", "could not delete mapping" @@ -337,7 +337,7 @@ func (h *SettingsHandler) actionAddLanguageMapping(w http.ResponseWriter, r *htt if h.config.IsDev() { loadTemplates() } - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) extension := r.PostFormValue("extension") language := r.PostFormValue("language") @@ -363,7 +363,7 @@ func (h *SettingsHandler) actionSetWakatimeApiKey(w http.ResponseWriter, r *http loadTemplates() } - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) apiKey := r.PostFormValue("api_key") // Healthcheck, if a new API key is set, i.e. the feature is activated @@ -383,7 +383,7 @@ func (h *SettingsHandler) actionImportWaktime(w http.ResponseWriter, r *http.Req loadTemplates() } - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) if user.WakatimeApiKey == "" { return http.StatusForbidden, "", "not connected to wakatime" } @@ -455,7 +455,7 @@ func (h *SettingsHandler) actionRegenerateSummaries(w http.ResponseWriter, r *ht if err := h.regenerateSummaries(user); err != nil { logbuch.Error("failed to regenerate summaries for user '%s' – %v", user.ID, err) } - }(r.Context().Value(models.UserKey).(*models.User)) + }(middlewares.GetPrincipal(r)) return http.StatusAccepted, "summaries are being regenerated – this may take a up to a couple of minutes, please come back later", "" } @@ -465,7 +465,7 @@ func (h *SettingsHandler) actionDeleteUser(w http.ResponseWriter, r *http.Reques loadTemplates() } - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) go func(user *models.User) { logbuch.Info("deleting user '%s' shortly", user.ID) time.Sleep(5 * time.Minute) @@ -524,7 +524,7 @@ func (h *SettingsHandler) regenerateSummaries(user *models.User) error { } func (h *SettingsHandler) buildViewModel(r *http.Request) *view.SettingsViewModel { - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) mappings, _ := h.languageMappingSrvc.GetByUser(user.ID) aliases, _ := h.aliasSrvc.GetByUser(user.ID) aliasMap := make(map[string][]*models.Alias) diff --git a/routes/summary.go b/routes/summary.go index c1979d2..24122a8 100644 --- a/routes/summary.go +++ b/routes/summary.go @@ -53,7 +53,7 @@ func (h *SummaryHandler) GetIndex(w http.ResponseWriter, r *http.Request) { return } - user := r.Context().Value(models.UserKey).(*models.User) + user := middlewares.GetPrincipal(r) if user == nil { w.WriteHeader(http.StatusUnauthorized) templates[conf.SummaryTemplate].Execute(w, h.buildViewModel(r).WithError("unauthorized")) diff --git a/utils/summary.go b/utils/summary.go index 0796933..8d4ac21 100644 --- a/utils/summary.go +++ b/utils/summary.go @@ -71,7 +71,7 @@ func ResolveInterval(interval *models.IntervalKey) (err error, from, to time.Tim } func ParseSummaryParams(r *http.Request) (*models.SummaryParams, error) { - user := r.Context().Value(models.UserKey).(*models.User) + user := extractUser(r) params := r.URL.Query() var err error @@ -108,3 +108,13 @@ func ParseSummaryParams(r *http.Request) (*models.SummaryParams, error) { Recompute: recompute, }, nil } + +func extractUser(r *http.Request) *models.User { + type principalGetter interface { + GetPrincipal() *models.User + } + if p := r.Context().Value("principal"); p != nil { + return p.(principalGetter).GetPrincipal() + } + return nil +} diff --git a/version.txt b/version.txt index 5bb76b5..26a9e99 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.25.3 +1.25.4