-
Notifications
You must be signed in to change notification settings - Fork 1
/
resolver.go
130 lines (107 loc) · 3.39 KB
/
resolver.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package resolver
import (
"context"
"fmt"
"net/http"
"regexp"
"time"
"github.com/FAU-CDI/wdresolve"
"github.com/FAU-CDI/wdresolve/resolvers"
"github.com/FAU-CDI/wisski-distillery/internal/dis/component"
"github.com/FAU-CDI/wisski-distillery/internal/dis/component/auth"
"github.com/FAU-CDI/wisski-distillery/internal/dis/component/auth/scopes"
"github.com/FAU-CDI/wisski-distillery/internal/dis/component/instances"
"github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/assets"
"github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/templating"
"github.com/rs/zerolog"
"github.com/tkw1536/pkglib/httpx"
"github.com/tkw1536/pkglib/lazy"
_ "embed"
)
type Resolver struct {
component.Base
Dependencies struct {
Instances *instances.Instances
Templating *templating.Templating
Auth *auth.Auth
}
prefixes lazy.Lazy[map[string]string] // cached prefixes (from the server)
RefreshInterval time.Duration
}
var (
_ component.Routeable = (*Resolver)(nil)
_ component.Cronable = (*Resolver)(nil)
)
func (resolver *Resolver) Routes() component.Routes {
return component.Routes{
Prefix: "/wisski/get/",
Aliases: []string{"/go/"},
CSRF: false,
MenuTitle: "Resolver",
MenuPriority: component.MenuResolver,
}
}
//go:embed "resolver.html"
var resolverHTML []byte
var resolverTemplate = templating.Parse[resolverContext](
"resolver.html", resolverHTML, nil,
templating.Title("Resolver"),
templating.Assets(assets.AssetsDefault),
)
type resolverContext struct {
templating.RuntimeFlags
wdresolve.IndexContext
}
var (
menuResolver = component.MenuItem{Title: "Resolver", Path: "/wisski/get/"}
)
func (resolver *Resolver) HandleRoute(ctx context.Context, route string) (http.Handler, error) {
// get the resolver template
tpl := resolverTemplate.Prepare(
resolver.Dependencies.Templating,
templating.Crumbs(
menuResolver,
),
)
t := tpl.Template()
// extract a logger and the fallback
logger := zerolog.Ctx(ctx)
fallback := &resolvers.Regexp{
Data: map[string]string{},
}
// handle the default domain name!
domainName := resolver.Config.HTTP.PrimaryDomain
if domainName != "" {
fallback.Data[fmt.Sprintf("^https?://(.*)\\.%s", regexp.QuoteMeta(domainName))] = fmt.Sprintf("https://$1.%s", domainName)
logger.Info().Str("name", domainName).Msg("registering default domain")
}
// handle the extra domains!
for _, domain := range resolver.Config.HTTP.ExtraDomains {
fallback.Data[fmt.Sprintf("^https?://(.*)\\.%s", regexp.QuoteMeta(domain))] = fmt.Sprintf("https://$1.%s", domainName)
logger.Info().Str("name", domainName).Msg("registering legacy domain")
}
p := wdresolve.ResolveHandler{
HandleIndex: func(context wdresolve.IndexContext, w http.ResponseWriter, r *http.Request) {
ctx := resolverContext{
IndexContext: context,
}
if resolver.Dependencies.Auth.CheckScope("", scopes.ScopeUserValid, r) != nil {
ctx.IndexContext.Prefixes = nil
}
httpx.WriteHTML(tpl.Context(r, ctx), nil, t, "", w, r)
},
Resolver: resolvers.InOrder{
resolver,
fallback,
},
TrustXForwardedProto: true,
}
return p, nil
}
func (resolver *Resolver) Target(uri string) string {
return wdresolve.PrefixTarget(resolver, uri)
}
// Prefixes returns a cached list of prefixes
func (resolver *Resolver) Prefixes() (prefixes map[string]string) {
return resolver.prefixes.Get(nil) // by precondition there always is a cached value
}