diff options
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/federation/authenticate.go | 62 | ||||
| -rw-r--r-- | internal/federation/federatingprotocol_test.go | 2 | ||||
| -rw-r--r-- | internal/gtscontext/context.go | 6 | ||||
| -rw-r--r-- | internal/middleware/signaturecheck.go | 2 | ||||
| -rw-r--r-- | internal/transport/signing.go | 2 | ||||
| -rw-r--r-- | internal/transport/transport.go | 2 | 
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. | 
