summaryrefslogtreecommitdiff
path: root/internal/util/uri.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/util/uri.go')
-rw-r--r--internal/util/uri.go346
1 files changed, 0 insertions, 346 deletions
diff --git a/internal/util/uri.go b/internal/util/uri.go
deleted file mode 100644
index b9ef01799..000000000
--- a/internal/util/uri.go
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- GoToSocial
- Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package util
-
-import (
- "fmt"
- "net/url"
-
- "github.com/spf13/viper"
- "github.com/superseriousbusiness/gotosocial/internal/config"
- "github.com/superseriousbusiness/gotosocial/internal/regexes"
-)
-
-const (
- // UsersPath is for serving users info
- UsersPath = "users"
- // ActorsPath is for serving actors info
- ActorsPath = "actors"
- // StatusesPath is for serving statuses
- StatusesPath = "statuses"
- // InboxPath represents the webfinger inbox location
- InboxPath = "inbox"
- // OutboxPath represents the webfinger outbox location
- OutboxPath = "outbox"
- // FollowersPath represents the webfinger followers location
- FollowersPath = "followers"
- // FollowingPath represents the webfinger following location
- FollowingPath = "following"
- // LikedPath represents the webfinger liked location
- LikedPath = "liked"
- // CollectionsPath represents the webfinger collections location
- CollectionsPath = "collections"
- // FeaturedPath represents the webfinger featured location
- FeaturedPath = "featured"
- // PublicKeyPath is for serving an account's public key
- PublicKeyPath = "main-key"
- // FollowPath used to generate the URI for an individual follow or follow request
- FollowPath = "follow"
- // UpdatePath is used to generate the URI for an account update
- UpdatePath = "updates"
- // BlocksPath is used to generate the URI for a block
- BlocksPath = "blocks"
- // ConfirmEmailPath is used to generate the URI for an email confirmation link
- ConfirmEmailPath = "confirm_email"
-)
-
-// APContextKey is a type used specifically for settings values on contexts within go-fed AP request chains
-type APContextKey string
-
-const (
- // APActivity can be used to set and retrieve the actual go-fed pub.Activity within a context.
- APActivity APContextKey = "activity"
- // APReceivingAccount can be used the set and retrieve the account being interacted with / receiving an activity in their inbox.
- APReceivingAccount 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"
- // APRequestingPublicKeyVerifier can be used to set and retrieve the public key verifier of an incoming federation request.
- APRequestingPublicKeyVerifier APContextKey = "requestingPublicKeyVerifier"
- // APRequestingPublicKeySignature can be used to set and retrieve the value of the signature header of an incoming federation request.
- APRequestingPublicKeySignature APContextKey = "requestingPublicKeySignature"
- // 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{}
-
-// GinContextKey is used solely for setting and retrieving the gin context from a context.Context
-var GinContextKey = &ginContextKey{}
-
-// UserURIs contains a bunch of UserURIs and URLs for a user, host, account, etc.
-type UserURIs struct {
- // The web URL of the instance host, eg https://example.org
- HostURL string
- // The web URL of the user, eg., https://example.org/@example_user
- UserURL string
- // The web URL for statuses of this user, eg., https://example.org/@example_user/statuses
- StatusesURL string
-
- // The webfinger URI of this user, eg., https://example.org/users/example_user
- UserURI string
- // The webfinger URI for this user's statuses, eg., https://example.org/users/example_user/statuses
- StatusesURI string
- // The webfinger URI for this user's activitypub inbox, eg., https://example.org/users/example_user/inbox
- InboxURI string
- // The webfinger URI for this user's activitypub outbox, eg., https://example.org/users/example_user/outbox
- OutboxURI string
- // The webfinger URI for this user's followers, eg., https://example.org/users/example_user/followers
- FollowersURI string
- // The webfinger URI for this user's following, eg., https://example.org/users/example_user/following
- FollowingURI string
- // The webfinger URI for this user's liked posts eg., https://example.org/users/example_user/liked
- LikedURI string
- // The webfinger URI for this user's featured collections, eg., https://example.org/users/example_user/collections/featured
- CollectionURI string
- // The URI for this user's public key, eg., https://example.org/users/example_user/publickey
- PublicKeyURI string
-}
-
-// GenerateURIForFollow returns the AP URI for a new follow -- something like:
-// https://example.org/users/whatever_user/follow/01F7XTH1QGBAPMGF49WJZ91XGC
-func GenerateURIForFollow(username string, thisFollowID string) string {
- protocol := viper.GetString(config.Keys.Protocol)
- host := viper.GetString(config.Keys.Host)
- return fmt.Sprintf("%s://%s/%s/%s/%s/%s", protocol, host, UsersPath, username, FollowPath, thisFollowID)
-}
-
-// GenerateURIForLike returns the AP URI for a new like/fave -- something like:
-// https://example.org/users/whatever_user/liked/01F7XTH1QGBAPMGF49WJZ91XGC
-func GenerateURIForLike(username string, thisFavedID string) string {
- protocol := viper.GetString(config.Keys.Protocol)
- host := viper.GetString(config.Keys.Host)
- return fmt.Sprintf("%s://%s/%s/%s/%s/%s", protocol, host, UsersPath, username, LikedPath, thisFavedID)
-}
-
-// GenerateURIForUpdate returns the AP URI for a new update activity -- something like:
-// https://example.org/users/whatever_user#updates/01F7XTH1QGBAPMGF49WJZ91XGC
-func GenerateURIForUpdate(username string, thisUpdateID string) string {
- protocol := viper.GetString(config.Keys.Protocol)
- host := viper.GetString(config.Keys.Host)
- return fmt.Sprintf("%s://%s/%s/%s#%s/%s", protocol, host, UsersPath, username, UpdatePath, thisUpdateID)
-}
-
-// GenerateURIForBlock returns the AP URI for a new block activity -- something like:
-// https://example.org/users/whatever_user/blocks/01F7XTH1QGBAPMGF49WJZ91XGC
-func GenerateURIForBlock(username string, thisBlockID string) string {
- protocol := viper.GetString(config.Keys.Protocol)
- host := viper.GetString(config.Keys.Host)
- return fmt.Sprintf("%s://%s/%s/%s/%s/%s", protocol, host, UsersPath, username, BlocksPath, thisBlockID)
-}
-
-// GenerateURIForEmailConfirm returns a link for email confirmation -- something like:
-// https://example.org/confirm_email?token=490e337c-0162-454f-ac48-4b22bb92a205
-func GenerateURIForEmailConfirm(token string) string {
- protocol := viper.GetString(config.Keys.Protocol)
- host := viper.GetString(config.Keys.Host)
- return fmt.Sprintf("%s://%s/%s?token=%s", protocol, host, ConfirmEmailPath, token)
-}
-
-// GenerateURIsForAccount throws together a bunch of URIs for the given username, with the given protocol and host.
-func GenerateURIsForAccount(username string) *UserURIs {
- protocol := viper.GetString(config.Keys.Protocol)
- host := viper.GetString(config.Keys.Host)
-
- // The below URLs are used for serving web requests
- hostURL := fmt.Sprintf("%s://%s", protocol, host)
- userURL := fmt.Sprintf("%s/@%s", hostURL, username)
- statusesURL := fmt.Sprintf("%s/%s", userURL, StatusesPath)
-
- // the below URIs are used in ActivityPub and Webfinger
- userURI := fmt.Sprintf("%s/%s/%s", hostURL, UsersPath, username)
- statusesURI := fmt.Sprintf("%s/%s", userURI, StatusesPath)
- inboxURI := fmt.Sprintf("%s/%s", userURI, InboxPath)
- outboxURI := fmt.Sprintf("%s/%s", userURI, OutboxPath)
- followersURI := fmt.Sprintf("%s/%s", userURI, FollowersPath)
- followingURI := fmt.Sprintf("%s/%s", userURI, FollowingPath)
- likedURI := fmt.Sprintf("%s/%s", userURI, LikedPath)
- collectionURI := fmt.Sprintf("%s/%s/%s", userURI, CollectionsPath, FeaturedPath)
- publicKeyURI := fmt.Sprintf("%s/%s", userURI, PublicKeyPath)
-
- return &UserURIs{
- HostURL: hostURL,
- UserURL: userURL,
- StatusesURL: statusesURL,
-
- UserURI: userURI,
- StatusesURI: statusesURI,
- InboxURI: inboxURI,
- OutboxURI: outboxURI,
- FollowersURI: followersURI,
- FollowingURI: followingURI,
- LikedURI: likedURI,
- CollectionURI: collectionURI,
- PublicKeyURI: publicKeyURI,
- }
-}
-
-// IsUserPath returns true if the given URL path corresponds to eg /users/example_username
-func IsUserPath(id *url.URL) bool {
- return regexes.UserPath.MatchString(id.Path)
-}
-
-// IsInboxPath returns true if the given URL path corresponds to eg /users/example_username/inbox
-func IsInboxPath(id *url.URL) bool {
- return regexes.InboxPath.MatchString(id.Path)
-}
-
-// IsOutboxPath returns true if the given URL path corresponds to eg /users/example_username/outbox
-func IsOutboxPath(id *url.URL) bool {
- return regexes.OutboxPath.MatchString(id.Path)
-}
-
-// IsInstanceActorPath returns true if the given URL path corresponds to eg /actors/example_username
-func IsInstanceActorPath(id *url.URL) bool {
- return regexes.ActorPath.MatchString(id.Path)
-}
-
-// IsFollowersPath returns true if the given URL path corresponds to eg /users/example_username/followers
-func IsFollowersPath(id *url.URL) bool {
- return regexes.FollowersPath.MatchString(id.Path)
-}
-
-// IsFollowingPath returns true if the given URL path corresponds to eg /users/example_username/following
-func IsFollowingPath(id *url.URL) bool {
- return regexes.FollowingPath.MatchString(id.Path)
-}
-
-// IsFollowPath returns true if the given URL path corresponds to eg /users/example_username/follow/SOME_ULID_OF_A_FOLLOW
-func IsFollowPath(id *url.URL) bool {
- return regexes.FollowPath.MatchString(id.Path)
-}
-
-// IsLikedPath returns true if the given URL path corresponds to eg /users/example_username/liked
-func IsLikedPath(id *url.URL) bool {
- return regexes.LikedPath.MatchString(id.Path)
-}
-
-// IsLikePath returns true if the given URL path corresponds to eg /users/example_username/liked/SOME_ULID_OF_A_STATUS
-func IsLikePath(id *url.URL) bool {
- return regexes.LikePath.MatchString(id.Path)
-}
-
-// IsStatusesPath returns true if the given URL path corresponds to eg /users/example_username/statuses/SOME_ULID_OF_A_STATUS
-func IsStatusesPath(id *url.URL) bool {
- return regexes.StatusesPath.MatchString(id.Path)
-}
-
-// IsPublicKeyPath returns true if the given URL path corresponds to eg /users/example_username/main-key
-func IsPublicKeyPath(id *url.URL) bool {
- return regexes.PublicKeyPath.MatchString(id.Path)
-}
-
-// IsBlockPath returns true if the given URL path corresponds to eg /users/example_username/blocks/SOME_ULID_OF_A_BLOCK
-func IsBlockPath(id *url.URL) bool {
- return regexes.BlockPath.MatchString(id.Path)
-}
-
-// ParseStatusesPath returns the username and ulid from a path such as /users/example_username/statuses/SOME_ULID_OF_A_STATUS
-func ParseStatusesPath(id *url.URL) (username string, ulid string, err error) {
- matches := regexes.StatusesPath.FindStringSubmatch(id.Path)
- if len(matches) != 3 {
- err = fmt.Errorf("expected 3 matches but matches length was %d", len(matches))
- return
- }
- username = matches[1]
- ulid = matches[2]
- return
-}
-
-// ParseUserPath returns the username from a path such as /users/example_username
-func ParseUserPath(id *url.URL) (username string, err error) {
- matches := regexes.UserPath.FindStringSubmatch(id.Path)
- if len(matches) != 2 {
- err = fmt.Errorf("expected 2 matches but matches length was %d", len(matches))
- return
- }
- username = matches[1]
- return
-}
-
-// ParseInboxPath returns the username from a path such as /users/example_username/inbox
-func ParseInboxPath(id *url.URL) (username string, err error) {
- matches := regexes.InboxPath.FindStringSubmatch(id.Path)
- if len(matches) != 2 {
- err = fmt.Errorf("expected 2 matches but matches length was %d", len(matches))
- return
- }
- username = matches[1]
- return
-}
-
-// ParseOutboxPath returns the username from a path such as /users/example_username/outbox
-func ParseOutboxPath(id *url.URL) (username string, err error) {
- matches := regexes.OutboxPath.FindStringSubmatch(id.Path)
- if len(matches) != 2 {
- err = fmt.Errorf("expected 2 matches but matches length was %d", len(matches))
- return
- }
- username = matches[1]
- return
-}
-
-// ParseFollowersPath returns the username from a path such as /users/example_username/followers
-func ParseFollowersPath(id *url.URL) (username string, err error) {
- matches := regexes.FollowersPath.FindStringSubmatch(id.Path)
- if len(matches) != 2 {
- err = fmt.Errorf("expected 2 matches but matches length was %d", len(matches))
- return
- }
- username = matches[1]
- return
-}
-
-// ParseFollowingPath returns the username from a path such as /users/example_username/following
-func ParseFollowingPath(id *url.URL) (username string, err error) {
- matches := regexes.FollowingPath.FindStringSubmatch(id.Path)
- if len(matches) != 2 {
- err = fmt.Errorf("expected 2 matches but matches length was %d", len(matches))
- return
- }
- username = matches[1]
- return
-}
-
-// ParseLikedPath returns the username and ulid from a path such as /users/example_username/liked/SOME_ULID_OF_A_STATUS
-func ParseLikedPath(id *url.URL) (username string, ulid string, err error) {
- matches := regexes.LikePath.FindStringSubmatch(id.Path)
- if len(matches) != 3 {
- err = fmt.Errorf("expected 3 matches but matches length was %d", len(matches))
- return
- }
- username = matches[1]
- ulid = matches[2]
- return
-}
-
-// ParseBlockPath returns the username and ulid from a path such as /users/example_username/blocks/SOME_ULID_OF_A_BLOCK
-func ParseBlockPath(id *url.URL) (username string, ulid string, err error) {
- matches := regexes.BlockPath.FindStringSubmatch(id.Path)
- if len(matches) != 3 {
- err = fmt.Errorf("expected 3 matches but matches length was %d", len(matches))
- return
- }
- username = matches[1]
- ulid = matches[2]
- return
-}