diff options
author | 2021-05-15 11:58:11 +0200 | |
---|---|---|
committer | 2021-05-15 11:58:11 +0200 | |
commit | cc48294c31a76e94fa879ad0d8d5dbd7e94c651b (patch) | |
tree | 7c26d33b41bab33bbdfbba540958444f4c296602 /internal/util | |
parent | Mediahandler (#21) (diff) | |
download | gotosocial-cc48294c31a76e94fa879ad0d8d5dbd7e94c651b.tar.xz |
Inbox post (#22)
Inbox POST from federated servers now working for statuses and follow requests.
Follow request client API added.
Start work on federating outgoing messages.
Other fixes and changes/tidying up.
Diffstat (limited to 'internal/util')
-rw-r--r-- | internal/util/regexes.go | 5 | ||||
-rw-r--r-- | internal/util/statustools.go | 28 | ||||
-rw-r--r-- | internal/util/statustools_test.go | 8 | ||||
-rw-r--r-- | internal/util/uri.go | 6 |
4 files changed, 37 insertions, 10 deletions
diff --git a/internal/util/regexes.go b/internal/util/regexes.go index a59bd678a..adab8c87f 100644 --- a/internal/util/regexes.go +++ b/internal/util/regexes.go @@ -35,6 +35,11 @@ const ( ) var ( + mentionNameRegexString = `^@([a-zA-Z0-9_]+)(?:@([a-zA-Z0-9_\-\.]+)?)$` + // mention name regex captures the username and domain part from a mention string + // such as @whatever_user@example.org, returning whatever_user and example.org (without the @ symbols) + mentionNameRegex = regexp.MustCompile(mentionNameRegexString) + // mention regex can be played around with here: https://regex101.com/r/qwM9D3/1 mentionFinderRegexString = `(?: |^|\W)(@[a-zA-Z0-9_]+(?:@[a-zA-Z0-9_\-\.]+)?)(?: |\n)` mentionFinderRegex = regexp.MustCompile(mentionFinderRegexString) diff --git a/internal/util/statustools.go b/internal/util/statustools.go index 5591f185a..2c74749e5 100644 --- a/internal/util/statustools.go +++ b/internal/util/statustools.go @@ -19,17 +19,18 @@ package util import ( + "fmt" "strings" ) -// DeriveMentions takes a plaintext (ie., not html-formatted) status, +// DeriveMentionsFromStatus takes a plaintext (ie., not html-formatted) status, // and applies a regex to it to return a deduplicated list of accounts // mentioned in that status. // // It will look for fully-qualified account names in the form "@user@example.org". // or the form "@username" for local users. // The case of the returned mentions will be lowered, for consistency. -func DeriveMentions(status string) []string { +func DeriveMentionsFromStatus(status string) []string { mentionedAccounts := []string{} for _, m := range mentionFinderRegex.FindAllStringSubmatch(status, -1) { mentionedAccounts = append(mentionedAccounts, m[1]) @@ -37,11 +38,11 @@ func DeriveMentions(status string) []string { return lower(unique(mentionedAccounts)) } -// DeriveHashtags takes a plaintext (ie., not html-formatted) status, +// DeriveHashtagsFromStatus takes a plaintext (ie., not html-formatted) status, // and applies a regex to it to return a deduplicated list of hashtags // used in that status, without the leading #. The case of the returned // tags will be lowered, for consistency. -func DeriveHashtags(status string) []string { +func DeriveHashtagsFromStatus(status string) []string { tags := []string{} for _, m := range hashtagFinderRegex.FindAllStringSubmatch(status, -1) { tags = append(tags, m[1]) @@ -49,11 +50,11 @@ func DeriveHashtags(status string) []string { return lower(unique(tags)) } -// DeriveEmojis takes a plaintext (ie., not html-formatted) status, +// DeriveEmojisFromStatus takes a plaintext (ie., not html-formatted) status, // and applies a regex to it to return a deduplicated list of emojis // used in that status, without the surround ::. The case of the returned // emojis will be lowered, for consistency. -func DeriveEmojis(status string) []string { +func DeriveEmojisFromStatus(status string) []string { emojis := []string{} for _, m := range emojiFinderRegex.FindAllStringSubmatch(status, -1) { emojis = append(emojis, m[1]) @@ -61,6 +62,21 @@ func DeriveEmojis(status string) []string { return lower(unique(emojis)) } +// ExtractMentionParts extracts the username test_user and the domain example.org +// from a mention string like @test_user@example.org. +// +// If nothing is matched, it will return an error. +func ExtractMentionParts(mention string) (username, domain string, err error) { + matches := mentionNameRegex.FindStringSubmatch(mention) + if matches == nil || len(matches) != 3 { + err = fmt.Errorf("could't match mention %s", mention) + return + } + username = matches[1] + domain = matches[2] + return +} + // unique returns a deduplicated version of a given string slice. func unique(s []string) []string { keys := make(map[string]bool) diff --git a/internal/util/statustools_test.go b/internal/util/statustools_test.go index 7c9af2cbd..2a12c7690 100644 --- a/internal/util/statustools_test.go +++ b/internal/util/statustools_test.go @@ -42,7 +42,7 @@ func (suite *StatusTestSuite) TestDeriveMentionsOK() { here is a duplicate mention: @hello@test.lgbt ` - menchies := util.DeriveMentions(statusText) + menchies := util.DeriveMentionsFromStatus(statusText) assert.Len(suite.T(), menchies, 4) assert.Equal(suite.T(), "@dumpsterqueer@example.org", menchies[0]) assert.Equal(suite.T(), "@someone_else@testing.best-horse.com", menchies[1]) @@ -52,7 +52,7 @@ func (suite *StatusTestSuite) TestDeriveMentionsOK() { func (suite *StatusTestSuite) TestDeriveMentionsEmpty() { statusText := `` - menchies := util.DeriveMentions(statusText) + menchies := util.DeriveMentionsFromStatus(statusText) assert.Len(suite.T(), menchies, 0) } @@ -67,7 +67,7 @@ func (suite *StatusTestSuite) TestDeriveHashtagsOK() { #111111 thisalsoshouldn'twork#### ##` - tags := util.DeriveHashtags(statusText) + tags := util.DeriveHashtagsFromStatus(statusText) assert.Len(suite.T(), tags, 5) assert.Equal(suite.T(), "testing123", tags[0]) assert.Equal(suite.T(), "also", tags[1]) @@ -90,7 +90,7 @@ Here's some normal text with an :emoji: at the end :underscores_ok_too: ` - tags := util.DeriveEmojis(statusText) + tags := util.DeriveEmojisFromStatus(statusText) assert.Len(suite.T(), tags, 7) assert.Equal(suite.T(), "test", tags[0]) assert.Equal(suite.T(), "another", tags[1]) diff --git a/internal/util/uri.go b/internal/util/uri.go index 538df9210..edcfc5c02 100644 --- a/internal/util/uri.go +++ b/internal/util/uri.go @@ -58,9 +58,15 @@ const ( // APAccount can be used the set and retrieve the account being interacted with APAccount APContextKey = "account" // APRequestingAccount can be used to set and retrieve the account of an incoming federation request. + // This will often be the actor of the instance that's posting the request. APRequestingAccount APContextKey = "requestingAccount" + // APRequestingActorIRI can be used to set and retrieve the actor of an incoming federation request. + // This will usually be the owner of whatever activity is being posted. + APRequestingActorIRI APContextKey = "requestingActorIRI" // APRequestingPublicKeyID can be used to set and retrieve the public key ID of an incoming federation request. APRequestingPublicKeyID APContextKey = "requestingPublicKeyID" + // APFromFederatorChanKey can be used to pass a pointer to the fromFederator channel into the federator for use in callbacks. + APFromFederatorChanKey APContextKey = "fromFederatorChan" ) type ginContextKey struct{} |