diff options
| author | 2023-02-08 15:10:56 +0100 | |
|---|---|---|
| committer | 2023-02-08 15:10:56 +0100 | |
| commit | 27e95fd1237d13edafc557531932067d329e9733 (patch) | |
| tree | 75ad8444539af5e0d545526cd86929f9e173c610 /internal/api | |
| parent | [bugfix] fix 'steal this look' form, uncheck entries after processing (#1454) (diff) | |
| download | gotosocial-27e95fd1237d13edafc557531932067d329e9733.tar.xz | |
[chore/bugfix] Serve + throttle publickey separately from rest of ActivityPub API (#1461)
* serve publickey separately from AP, don't throttle it
* update nginx cache documentation, cache main-key too
* throttle public key, but separately from other endpoints
Diffstat (limited to 'internal/api')
| -rw-r--r-- | internal/api/activitypub.go | 38 | ||||
| -rw-r--r-- | internal/api/activitypub/publickey/publickey.go | 48 | ||||
| -rw-r--r-- | internal/api/activitypub/publickey/publickeyget.go (renamed from internal/api/activitypub/users/publickeyget.go) | 2 | ||||
| -rw-r--r-- | internal/api/activitypub/users/user.go | 3 | 
4 files changed, 69 insertions, 22 deletions
| diff --git a/internal/api/activitypub.go b/internal/api/activitypub.go index df48afb18..72a8f6e26 100644 --- a/internal/api/activitypub.go +++ b/internal/api/activitypub.go @@ -19,11 +19,9 @@  package api  import ( -	"context" -	"net/url" -  	"github.com/gin-gonic/gin"  	"github.com/superseriousbusiness/gotosocial/internal/api/activitypub/emoji" +	"github.com/superseriousbusiness/gotosocial/internal/api/activitypub/publickey"  	"github.com/superseriousbusiness/gotosocial/internal/api/activitypub/users"  	"github.com/superseriousbusiness/gotosocial/internal/db"  	"github.com/superseriousbusiness/gotosocial/internal/middleware" @@ -32,10 +30,10 @@ import (  )  type ActivityPub struct { -	emoji *emoji.Module -	users *users.Module - -	isURIBlocked func(context.Context, *url.URL) (bool, db.Error) +	emoji                    *emoji.Module +	users                    *users.Module +	publicKey                *publickey.Module +	signatureCheckMiddleware gin.HandlerFunc  }  func (a *ActivityPub) Route(r router.Router, m ...gin.HandlerFunc) { @@ -43,25 +41,29 @@ func (a *ActivityPub) Route(r router.Router, m ...gin.HandlerFunc) {  	emojiGroup := r.AttachGroup("emoji")  	usersGroup := r.AttachGroup("users") -	// instantiate + attach shared, non-global middlewares to both of these groups -	var ( -		signatureCheckMiddleware = middleware.SignatureCheck(a.isURIBlocked) -		cacheControlMiddleware   = middleware.CacheControl("no-store") -	) +	// attach shared, non-global middlewares to both of these groups +	cacheControlMiddleware := middleware.CacheControl("no-store")  	emojiGroup.Use(m...)  	usersGroup.Use(m...) -	emojiGroup.Use(signatureCheckMiddleware, cacheControlMiddleware) -	usersGroup.Use(signatureCheckMiddleware, cacheControlMiddleware) +	emojiGroup.Use(a.signatureCheckMiddleware, cacheControlMiddleware) +	usersGroup.Use(a.signatureCheckMiddleware, cacheControlMiddleware)  	a.emoji.Route(emojiGroup.Handle)  	a.users.Route(usersGroup.Handle)  } +// Public key endpoint requires different middleware + cache policies from other AP endpoints. +func (a *ActivityPub) RoutePublicKey(r router.Router, m ...gin.HandlerFunc) { +	publicKeyGroup := r.AttachGroup(publickey.PublicKeyPath) +	publicKeyGroup.Use(a.signatureCheckMiddleware, middleware.CacheControl("public,max-age=604800")) +	a.publicKey.Route(publicKeyGroup.Handle) +} +  func NewActivityPub(db db.DB, p processing.Processor) *ActivityPub {  	return &ActivityPub{ -		emoji: emoji.New(p), -		users: users.New(p), - -		isURIBlocked: db.IsURIBlocked, +		emoji:                    emoji.New(p), +		users:                    users.New(p), +		publicKey:                publickey.New(p), +		signatureCheckMiddleware: middleware.SignatureCheck(db.IsURIBlocked),  	}  } diff --git a/internal/api/activitypub/publickey/publickey.go b/internal/api/activitypub/publickey/publickey.go new file mode 100644 index 000000000..7b3882628 --- /dev/null +++ b/internal/api/activitypub/publickey/publickey.go @@ -0,0 +1,48 @@ +/* +   GoToSocial +   Copyright (C) 2021-2023 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 publickey + +import ( +	"net/http" + +	"github.com/gin-gonic/gin" +	"github.com/superseriousbusiness/gotosocial/internal/processing" +	"github.com/superseriousbusiness/gotosocial/internal/uris" +) + +const ( +	// UsernameKey is for account usernames. +	UsernameKey = "username" +	// PublicKeyPath is a path to a user's public key, for serving bare minimum AP representations. +	PublicKeyPath = "users/:" + UsernameKey + "/" + uris.PublicKeyPath +) + +type Module struct { +	processor processing.Processor +} + +func New(processor processing.Processor) *Module { +	return &Module{ +		processor: processor, +	} +} + +func (m *Module) Route(attachHandler func(method string, path string, f ...gin.HandlerFunc) gin.IRoutes) { +	attachHandler(http.MethodGet, "", m.PublicKeyGETHandler) +} diff --git a/internal/api/activitypub/users/publickeyget.go b/internal/api/activitypub/publickey/publickeyget.go index 27457f107..36e1c3569 100644 --- a/internal/api/activitypub/users/publickeyget.go +++ b/internal/api/activitypub/publickey/publickeyget.go @@ -16,7 +16,7 @@     along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ -package users +package publickey  import (  	"encoding/json" diff --git a/internal/api/activitypub/users/user.go b/internal/api/activitypub/users/user.go index 71e47d7e9..257453bcb 100644 --- a/internal/api/activitypub/users/user.go +++ b/internal/api/activitypub/users/user.go @@ -42,8 +42,6 @@ const (  	// BasePath is the base path for serving AP 'users' requests, minus the 'users' prefix.  	BasePath = "/:" + UsernameKey -	// PublicKeyPath is a path to a user's public key, for serving bare minimum AP representations. -	PublicKeyPath = BasePath + "/" + uris.PublicKeyPath  	// InboxPath is for serving POST requests to a user's inbox with the given username key.  	InboxPath = BasePath + "/" + uris.InboxPath  	// OutboxPath is for serving GET requests to a user's outbox with the given username key. @@ -74,7 +72,6 @@ func (m *Module) Route(attachHandler func(method string, path string, f ...gin.H  	attachHandler(http.MethodGet, FollowersPath, m.FollowersGETHandler)  	attachHandler(http.MethodGet, FollowingPath, m.FollowingGETHandler)  	attachHandler(http.MethodGet, StatusPath, m.StatusGETHandler) -	attachHandler(http.MethodGet, PublicKeyPath, m.PublicKeyGETHandler)  	attachHandler(http.MethodGet, StatusRepliesPath, m.StatusRepliesGETHandler)  	attachHandler(http.MethodGet, OutboxPath, m.OutboxGETHandler)  } | 
