summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
Diffstat (limited to 'internal')
-rw-r--r--internal/federation/authenticate.go62
-rw-r--r--internal/federation/federatingprotocol_test.go2
-rw-r--r--internal/gtscontext/context.go6
-rw-r--r--internal/middleware/signaturecheck.go2
-rw-r--r--internal/transport/signing.go2
-rw-r--r--internal/transport/transport.go2
6 files changed, 57 insertions, 19 deletions
diff --git a/internal/federation/authenticate.go b/internal/federation/authenticate.go
index fe611af8c..6899e5ad3 100644
--- a/internal/federation/authenticate.go
+++ b/internal/federation/authenticate.go
@@ -28,7 +28,6 @@ import (
"time"
"codeberg.org/gruf/go-kv"
- "github.com/go-fed/httpsig"
"github.com/superseriousbusiness/activity/streams"
"github.com/superseriousbusiness/gotosocial/internal/ap"
"github.com/superseriousbusiness/gotosocial/internal/config"
@@ -37,6 +36,7 @@ import (
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
"github.com/superseriousbusiness/gotosocial/internal/log"
+ "github.com/superseriousbusiness/httpsig"
)
var (
@@ -509,24 +509,62 @@ var signingAlgorithms = []httpsig.Algorithm{
httpsig.ED25519, // Try ED25519 as a long shot.
}
-// verifyAuth verifies auth using generated verifier, according to pubkey and our supported signing algorithms.
-func verifyAuth(l *log.Entry, verifier httpsig.Verifier, pubKey *rsa.PublicKey) bool {
+// Cheeky type to wrap a signing option with a
+// description of that option for logging purposes.
+type signingOption struct {
+ desc string // Description of this options set.
+ sigOpt httpsig.SignatureOption // The options themselves.
+}
+
+var signingOptions = []signingOption{
+ {
+ // Prefer include query params.
+ desc: "include query params",
+ sigOpt: httpsig.SignatureOption{
+ ExcludeQueryStringFromPathPseudoHeader: false,
+ },
+ },
+ {
+ // Fall back to exclude query params.
+ desc: "exclude query params",
+ sigOpt: httpsig.SignatureOption{
+ ExcludeQueryStringFromPathPseudoHeader: true,
+ },
+ },
+}
+
+// verifyAuth verifies auth using generated verifier,
+// according to pubkey, our supported signing algorithms,
+// and signature options. The loops in the function are
+// arranged in such a way that the most common combos are
+// tried first, so that we can hopefully succeed quickly
+// without wasting too many CPU cycles.
+func verifyAuth(
+ l *log.Entry,
+ verifier httpsig.VerifierWithOptions,
+ pubKey *rsa.PublicKey,
+) bool {
if pubKey == nil {
return false
}
- // Loop through all supported algorithms.
+ // Loop through supported algorithms.
for _, algo := range signingAlgorithms {
- // Verify according to pubkey and algo.
- err := verifier.Verify(pubKey, algo)
- if err != nil {
- l.Tracef("authentication NOT PASSED with %s: %v", algo, err)
- continue
- }
+ // Loop through signing options.
+ for _, opt := range signingOptions {
- l.Tracef("authenticated PASSED with %s", algo)
- return true
+ // Try to verify according to this pubkey,
+ // algo, and signing options combination.
+ err := verifier.VerifyWithOptions(pubKey, algo, opt.sigOpt)
+ if err != nil {
+ l.Tracef("authentication NOT PASSED with %s (%s): %v", algo, opt.desc, err)
+ continue
+ }
+
+ l.Tracef("authenticated PASSED with %s (%s)", algo, opt.desc)
+ return true
+ }
}
return false
diff --git a/internal/federation/federatingprotocol_test.go b/internal/federation/federatingprotocol_test.go
index 7a8343048..999569c85 100644
--- a/internal/federation/federatingprotocol_test.go
+++ b/internal/federation/federatingprotocol_test.go
@@ -27,12 +27,12 @@ import (
"net/url"
"testing"
- "github.com/go-fed/httpsig"
"github.com/stretchr/testify/suite"
"github.com/superseriousbusiness/gotosocial/internal/ap"
"github.com/superseriousbusiness/gotosocial/internal/gtscontext"
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
"github.com/superseriousbusiness/gotosocial/testrig"
+ "github.com/superseriousbusiness/httpsig"
)
type FederatingProtocolTestSuite struct {
diff --git a/internal/gtscontext/context.go b/internal/gtscontext/context.go
index 46f2899fa..0d5ed5340 100644
--- a/internal/gtscontext/context.go
+++ b/internal/gtscontext/context.go
@@ -21,8 +21,8 @@ import (
"context"
"net/url"
- "github.com/go-fed/httpsig"
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
+ "github.com/superseriousbusiness/httpsig"
)
// package private context key type.
@@ -129,8 +129,8 @@ func SetOtherIRIs(ctx context.Context, iris []*url.URL) context.Context {
// HTTPSignatureVerifier returns an http signature verifier for the current ActivityPub
// request chain. This verifier can be called to authenticate the current request.
-func HTTPSignatureVerifier(ctx context.Context) httpsig.Verifier {
- verifier, _ := ctx.Value(httpSigVerifierKey).(httpsig.Verifier)
+func HTTPSignatureVerifier(ctx context.Context) httpsig.VerifierWithOptions {
+ verifier, _ := ctx.Value(httpSigVerifierKey).(httpsig.VerifierWithOptions)
return verifier
}
diff --git a/internal/middleware/signaturecheck.go b/internal/middleware/signaturecheck.go
index 87c7aac01..ea63ec4f0 100644
--- a/internal/middleware/signaturecheck.go
+++ b/internal/middleware/signaturecheck.go
@@ -26,7 +26,7 @@ import (
"github.com/superseriousbusiness/gotosocial/internal/log"
"github.com/gin-gonic/gin"
- "github.com/go-fed/httpsig"
+ "github.com/superseriousbusiness/httpsig"
)
const (
diff --git a/internal/transport/signing.go b/internal/transport/signing.go
index a9eafeb54..dcd8e206f 100644
--- a/internal/transport/signing.go
+++ b/internal/transport/signing.go
@@ -18,7 +18,7 @@
package transport
import (
- "github.com/go-fed/httpsig"
+ "github.com/superseriousbusiness/httpsig"
)
var (
diff --git a/internal/transport/transport.go b/internal/transport/transport.go
index ac56c73cb..558e187f0 100644
--- a/internal/transport/transport.go
+++ b/internal/transport/transport.go
@@ -27,10 +27,10 @@ import (
"sync"
"time"
- "github.com/go-fed/httpsig"
"github.com/superseriousbusiness/gotosocial/internal/gtscontext"
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
"github.com/superseriousbusiness/gotosocial/internal/httpclient"
+ "github.com/superseriousbusiness/httpsig"
)
// Transport implements the pub.Transport interface with some additional functionality for fetching remote media.