summaryrefslogtreecommitdiff
path: root/internal/transport/deliver.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/transport/deliver.go')
-rw-r--r--internal/transport/deliver.go33
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) {