mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-10-29 04:52:24 -05:00
[feature] Federate interaction policies + Accepts; enforce policies (#3138)
* [feature] Federate interaction policies + Accepts; enforce policies * use Acceptable type * fix index * remove appendIRIStrs * add GetAccept federatingdb function * lock on object IRI
This commit is contained in:
parent
f8d399cf6a
commit
8ab2b19a94
42 changed files with 3541 additions and 254 deletions
|
|
@ -204,6 +204,38 @@ func (c *controller) dereferenceLocalUser(ctx context.Context, iri *url.URL) (*h
|
|||
return rsp, nil
|
||||
}
|
||||
|
||||
// dereferenceLocalAccept is a shortcut to dereference an accept created
|
||||
// by an account on this instance, without making any external api/http calls.
|
||||
//
|
||||
// It is passed to new transports, and should only be invoked when the iri.Host == this host.
|
||||
func (c *controller) dereferenceLocalAccept(ctx context.Context, iri *url.URL) (*http.Response, error) {
|
||||
accept, err := c.fedDB.GetAccept(ctx, iri)
|
||||
if err != nil && !errors.Is(err, db.ErrNoEntries) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if accept == nil {
|
||||
// Return a generic 404 not found response.
|
||||
rsp := craftResponse(iri, http.StatusNotFound)
|
||||
return rsp, nil
|
||||
}
|
||||
|
||||
i, err := ap.Serialize(accept)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
b, err := json.Marshal(i)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Return a response with AS data as body.
|
||||
rsp := craftResponse(iri, http.StatusOK)
|
||||
rsp.Body = io.NopCloser(bytes.NewReader(b))
|
||||
return rsp, nil
|
||||
}
|
||||
|
||||
func craftResponse(url *url.URL, code int) *http.Response {
|
||||
rsp := new(http.Response)
|
||||
rsp.Request = new(http.Request)
|
||||
|
|
|
|||
|
|
@ -29,17 +29,26 @@ import (
|
|||
)
|
||||
|
||||
func (t *transport) Dereference(ctx context.Context, iri *url.URL) (*http.Response, error) {
|
||||
// if the request is to us, we can shortcut for certain URIs rather than going through
|
||||
// the normal request flow, thereby saving time and energy
|
||||
// If the request is to us, we can shortcut for
|
||||
// certain URIs rather than going through the normal
|
||||
// request flow, thereby saving time and energy.
|
||||
if iri.Host == config.GetHost() {
|
||||
if uris.IsFollowersPath(iri) {
|
||||
// the request is for followers of one of our accounts, which we can shortcut
|
||||
return t.controller.dereferenceLocalFollowers(ctx, iri)
|
||||
}
|
||||
switch {
|
||||
|
||||
if uris.IsUserPath(iri) {
|
||||
// the request is for one of our accounts, which we can shortcut
|
||||
case uris.IsFollowersPath(iri):
|
||||
// The request is for followers of one of
|
||||
// our accounts, which we can shortcut.
|
||||
return t.controller.dereferenceLocalFollowers(ctx, iri)
|
||||
|
||||
case uris.IsUserPath(iri):
|
||||
// The request is for one of our
|
||||
// accounts, which we can shortcut.
|
||||
return t.controller.dereferenceLocalUser(ctx, iri)
|
||||
|
||||
case uris.IsAcceptsPath(iri):
|
||||
// The request is for an Accept on
|
||||
// our instance, which we can shortcut.
|
||||
return t.controller.dereferenceLocalAccept(ctx, iri)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue