fix(messages): sync recognize configured app link entities
This commit is contained in:
parent
35d3908660
commit
c9371c6048
12 changed files with 327 additions and 72 deletions
|
|
@ -135,6 +135,24 @@ func (b AppLinkBuilder) BuildUsername(username string, query url.Values) string
|
|||
return b.Build("resolve", query)
|
||||
}
|
||||
|
||||
// AcceptsEntityURL reports whether a raw custom-scheme URL belongs to this
|
||||
// server's configured app-link namespace. The legacy route-as-host scheme is
|
||||
// accepted for rollout compatibility; a distinct host-based scheme is limited
|
||||
// to the exact configured host so arbitrary same-scheme links aren't promoted
|
||||
// to clickable message entities by the server.
|
||||
func (b AppLinkBuilder) AcceptsEntityURL(raw string) bool {
|
||||
parsed, err := url.Parse(raw)
|
||||
if err != nil || parsed.Opaque != "" || parsed.User != nil || parsed.Hostname() == "" || parsed.Port() != "" {
|
||||
return false
|
||||
}
|
||||
if strings.EqualFold(parsed.Scheme, b.legacyScheme) {
|
||||
return true
|
||||
}
|
||||
return b.baseHost != "" &&
|
||||
strings.EqualFold(parsed.Scheme, b.baseScheme) &&
|
||||
strings.EqualFold(parsed.Host, b.baseHost)
|
||||
}
|
||||
|
||||
// MatchesRoute accepts the exact configured host-path form and the retained
|
||||
// legacy route-as-host form. Query validation remains the caller's concern.
|
||||
func (b AppLinkBuilder) MatchesRoute(parsed *url.URL, route string) bool {
|
||||
|
|
|
|||
|
|
@ -161,6 +161,34 @@ func TestAppLinkBuilderPreservesLegacyAndSupportsHostBase(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestAppLinkBuilderAcceptsEntityURL(t *testing.T) {
|
||||
hosted, err := NewAppLinkBuilder("telesrv", "owpg://links.example.test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for _, tc := range []struct {
|
||||
name string
|
||||
raw string
|
||||
want bool
|
||||
}{
|
||||
{name: "legacy route", raw: "telesrv://resolve?domain=Alice", want: true},
|
||||
{name: "legacy case insensitive", raw: "TELESRV://resolve?domain=Alice", want: true},
|
||||
{name: "configured host base", raw: "owpg://links.example.test/Alice", want: true},
|
||||
{name: "configured host case insensitive", raw: "OWPG://LINKS.EXAMPLE.TEST/Alice", want: true},
|
||||
{name: "same scheme wrong host", raw: "owpg://other.example.test/Alice", want: false},
|
||||
{name: "credentials", raw: "telesrv://user@resolve/path", want: false},
|
||||
{name: "port", raw: "telesrv://resolve:443/path", want: false},
|
||||
{name: "unconfigured scheme", raw: "other://resolve", want: false},
|
||||
{name: "missing route host", raw: "telesrv://", want: false},
|
||||
} {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
if got := hosted.AcceptsEntityURL(tc.raw); got != tc.want {
|
||||
t.Fatalf("AcceptsEntityURL(%q) = %v, want %v", tc.raw, got, tc.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidateAppName(t *testing.T) {
|
||||
if got, err := ValidateAppName(" Example Chat "); err != nil || got != "Example Chat" {
|
||||
t.Fatalf("ValidateAppName valid = %q, %v", got, err)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue