diff options
author | 2023-09-11 18:38:31 +0200 | |
---|---|---|
committer | 2023-09-11 18:38:31 +0200 | |
commit | 2cac5a4613ab51a5ac33a16cb54bb1210be9e8ce (patch) | |
tree | 96db54305c3208bb6458c015ac774b229561596a /internal/util/namestring_test.go | |
parent | [chore] bump bun v1.1.14 -> v1.1.15 (#2195) (diff) | |
download | gotosocial-2cac5a4613ab51a5ac33a16cb54bb1210be9e8ce.tar.xz |
[feature] Support Actor URIs for webfinger queries (#2187)
* [feature] Support Actor URIs for webfinger queries
It's now possible to pass an Actor URI as the resource to query for when
doing a webfinger query. The code now extracts the username and domain
from the URI. The URI needs to be fully qualified, including having a
scheme of http or https to be recognised as such.
The acct scheme is handled as we used to, including dealing with an
erroneous leading @ on the username. We retain the ability to handle
resources without a scheme by parsing them again with the acct scheme if
the original parse failed. This can happen due to parsing ambiguities
when dealing with a string like user@domain.tld:port.
* [bugfix] Remove debugging changes
* [chore] Make TestExtractNamestring table-driven
* [chore] Unnest Trim and Split for readability
Diffstat (limited to 'internal/util/namestring_test.go')
-rw-r--r-- | internal/util/namestring_test.go | 170 |
1 files changed, 92 insertions, 78 deletions
diff --git a/internal/util/namestring_test.go b/internal/util/namestring_test.go index 30381a138..09beaeb8a 100644 --- a/internal/util/namestring_test.go +++ b/internal/util/namestring_test.go @@ -18,6 +18,7 @@ package util_test import ( + "net/url" "testing" "github.com/stretchr/testify/suite" @@ -28,88 +29,101 @@ type NamestringSuite struct { suite.Suite } -func (suite *NamestringSuite) TestExtractWebfingerParts1() { - webfinger := "acct:stonerkitty.monster@stonerkitty.monster" - username, host, err := util.ExtractWebfingerParts(webfinger) - suite.NoError(err) - - suite.Equal("stonerkitty.monster", username) - suite.Equal("stonerkitty.monster", host) -} - -func (suite *NamestringSuite) TestExtractWebfingerParts2() { - webfinger := "@stonerkitty.monster@stonerkitty.monster" - username, host, err := util.ExtractWebfingerParts(webfinger) - suite.NoError(err) - - suite.Equal("stonerkitty.monster", username) - suite.Equal("stonerkitty.monster", host) -} - -func (suite *NamestringSuite) TestExtractWebfingerParts3() { - webfinger := "acct:someone@somewhere" - username, host, err := util.ExtractWebfingerParts(webfinger) - suite.NoError(err) - - suite.Equal("someone", username) - suite.Equal("somewhere", host) -} - -func (suite *NamestringSuite) TestExtractWebfingerParts4() { - webfinger := "@stoner-kitty.monster@stonerkitty.monster" - username, host, err := util.ExtractWebfingerParts(webfinger) - suite.NoError(err) - - suite.Equal("stoner-kitty.monster", username) - suite.Equal("stonerkitty.monster", host) -} - -func (suite *NamestringSuite) TestExtractWebfingerParts5() { - webfinger := "@stonerkitty.monster" - username, host, err := util.ExtractWebfingerParts(webfinger) - suite.NoError(err) - - suite.Equal("stonerkitty.monster", username) - suite.Empty(host) -} - -func (suite *NamestringSuite) TestExtractWebfingerParts6() { - webfinger := "@@stonerkitty.monster" - _, _, err := util.ExtractWebfingerParts(webfinger) - suite.EqualError(err, "couldn't match mention @@stonerkitty.monster") +func (suite *NamestringSuite) TestExtractWebfingerParts() { + tests := []struct { + in, username, domain, err string + }{ + {in: "acct:stonerkitty.monster@stonerkitty.monster", username: "stonerkitty.monster", domain: "stonerkitty.monster"}, + {in: "acct:stonerkitty.monster@stonerkitty.monster:8080", username: "stonerkitty.monster", domain: "stonerkitty.monster:8080"}, + {in: "acct:@stonerkitty.monster@stonerkitty.monster", username: "stonerkitty.monster", domain: "stonerkitty.monster"}, + {in: "stonerkitty.monster@stonerkitty.monster", username: "stonerkitty.monster", domain: "stonerkitty.monster"}, + {in: "stonerkitty.monster@stonerkitty.monster:8080", username: "stonerkitty.monster", domain: "stonerkitty.monster:8080"}, + {in: "@stonerkitty.monster@stonerkitty.monster", username: "stonerkitty.monster", domain: "stonerkitty.monster"}, + {in: "acct:@@stonerkitty.monster@stonerkitty.monster", err: "failed to extract user and domain from: acct:@@stonerkitty.monster@stonerkitty.monster"}, + {in: "acct:@stonerkitty.monster@@stonerkitty.monster", err: "failed to extract user and domain from: acct:@stonerkitty.monster@@stonerkitty.monster"}, + {in: "@@stonerkitty.monster@stonerkitty.monster", err: "failed to extract user and domain from: @@stonerkitty.monster@stonerkitty.monster"}, + {in: "@stonerkitty.monster@@stonerkitty.monster", err: "failed to extract user and domain from: @stonerkitty.monster@@stonerkitty.monster"}, + {in: "s3:stonerkitty.monster@stonerkitty.monster", err: "unsupported scheme: s3 for resource: s3:stonerkitty.monster@stonerkitty.monster"}, + } + + for _, tt := range tests { + tt := tt + suite.Run(tt.in, func() { + suite.T().Parallel() + username, domain, err := util.ExtractWebfingerParts(tt.in) + if tt.err == "" { + suite.NoError(err) + suite.Equal(tt.username, username) + suite.Equal(tt.domain, domain) + } else { + suite.EqualError(err, tt.err) + } + }) + } } -func (suite *NamestringSuite) TestExtractNamestringParts1() { - namestring := "@stonerkitty.monster@stonerkitty.monster" - username, host, err := util.ExtractNamestringParts(namestring) - suite.NoError(err) - - suite.Equal("stonerkitty.monster", username) - suite.Equal("stonerkitty.monster", host) -} - -func (suite *NamestringSuite) TestExtractNamestringParts2() { - namestring := "@stonerkitty.monster" - username, host, err := util.ExtractNamestringParts(namestring) - suite.NoError(err) - - suite.Equal("stonerkitty.monster", username) - suite.Empty(host) -} - -func (suite *NamestringSuite) TestExtractNamestringParts3() { - namestring := "@someone@somewhere" - username, host, err := util.ExtractWebfingerParts(namestring) - suite.NoError(err) - - suite.Equal("someone", username) - suite.Equal("somewhere", host) +func (suite *NamestringSuite) TestExtractWebfingerPartsFromURI() { + tests := []struct { + in, username, domain, err string + }{ + {in: "https://stonerkitty.monster/users/stonerkitty.monster", username: "stonerkitty.monster", domain: "stonerkitty.monster"}, + {in: "https://stonerkitty.monster/users/@stonerkitty.monster", username: "stonerkitty.monster", domain: "stonerkitty.monster"}, + {in: "https://stonerkitty.monster/@stonerkitty.monster", username: "stonerkitty.monster", domain: "stonerkitty.monster"}, + {in: "https://stonerkitty.monster/@@stonerkitty.monster", username: "@stonerkitty.monster", domain: "stonerkitty.monster"}, + {in: "https://stonerkitty.monster:8080/users/stonerkitty.monster", username: "stonerkitty.monster", domain: "stonerkitty.monster:8080"}, + {in: "https://stonerkitty.monster/users/stonerkitty.monster/evil", username: "stonerkitty.monster", domain: "stonerkitty.monster"}, + {in: "https://stonerkitty.monster/@stonerkitty.monster/evil", username: "stonerkitty.monster", domain: "stonerkitty.monster"}, + {in: "/@stonerkitty.monster", err: "failed to extract domain from: /@stonerkitty.monster"}, + {in: "/users/stonerkitty.monster", err: "failed to extract domain from: /users/stonerkitty.monster"}, + {in: "@stonerkitty.monster", err: "failed to extract domain from: @stonerkitty.monster"}, + {in: "users/stonerkitty.monster", err: "failed to extract domain from: users/stonerkitty.monster"}, + {in: "https://stonerkitty.monster/users/", err: "failed to extract username from: https://stonerkitty.monster/users/"}, + {in: "https://stonerkitty.monster/users/@", err: "failed to extract username from: https://stonerkitty.monster/users/@"}, + {in: "https://stonerkitty.monster/@", err: "failed to extract username from: https://stonerkitty.monster/@"}, + {in: "https://stonerkitty.monster/", err: "failed to extract username from: https://stonerkitty.monster/"}, + } + + for _, tt := range tests { + tt := tt + suite.Run(tt.in, func() { + suite.T().Parallel() + uri, _ := url.Parse(tt.in) + username, domain, err := util.ExtractWebfingerPartsFromURI(uri) + if tt.err == "" { + suite.NoError(err) + suite.Equal(tt.username, username) + suite.Equal(tt.domain, domain) + } else { + suite.EqualError(err, tt.err) + } + }) + } } -func (suite *NamestringSuite) TestExtractNamestringParts4() { - namestring := "" - _, _, err := util.ExtractNamestringParts(namestring) - suite.EqualError(err, "couldn't match mention ") +func (suite *NamestringSuite) TestExtractNamestring() { + tests := []struct { + in, username, host, err string + }{ + {in: "@stonerkitty.monster@stonerkitty.monster", username: "stonerkitty.monster", host: "stonerkitty.monster"}, + {in: "@stonerkitty.monster", username: "stonerkitty.monster"}, + {in: "@someone@somewhere", username: "someone", host: "somewhere"}, + {in: "", err: "couldn't match mention "}, + } + + for _, tt := range tests { + tt := tt + suite.Run(tt.in, func() { + suite.T().Parallel() + username, host, err := util.ExtractNamestringParts(tt.in) + if tt.err != "" { + suite.EqualError(err, tt.err) + } else { + suite.NoError(err) + suite.Equal(tt.username, username) + suite.Equal(tt.host, host) + } + }) + } } func TestNamestringSuite(t *testing.T) { |