diff options
Diffstat (limited to 'internal/transport/deliver.go')
-rw-r--r-- | internal/transport/deliver.go | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/internal/transport/deliver.go b/internal/transport/deliver.go index 30435b86f..36ad6f015 100644 --- a/internal/transport/deliver.go +++ b/internal/transport/deliver.go @@ -21,6 +21,7 @@ import ( "bytes" "context" "encoding/json" + "io" "net/http" "net/url" @@ -169,6 +170,38 @@ func (t *transport) prepare( }, nil } +func (t *transport) SignDelivery(dlv *delivery.Delivery) error { + if dlv.Request.GetBody == nil { + return gtserror.New("delivery request body not rewindable") + } + + // Get a new copy of the request body. + body, err := dlv.Request.GetBody() + if err != nil { + return gtserror.Newf("error getting request body: %w", err) + } + + // Read body data into memory. + data, err := io.ReadAll(body) + if err != nil { + return gtserror.Newf("error reading request body: %w", err) + } + + // Get signing function for POST data. + // (note that delivery is ALWAYS POST). + sign := t.signPOST(data) + + // Extract delivery context. + ctx := dlv.Request.Context() + + // Update delivery request context with signing details. + ctx = gtscontext.SetOutgoingPublicKeyID(ctx, t.pubKeyID) + ctx = gtscontext.SetHTTPClientSignFunc(ctx, sign) + dlv.Request.Request = dlv.Request.Request.WithContext(ctx) + + return nil +} + // getObjectID extracts an object ID from 'serialized' ActivityPub object map. func getObjectID(obj map[string]interface{}) string { switch t := obj["object"].(type) { |