Skip to content

Commit

Permalink
If httpsig verification fails, fix Host header and try again
Browse files Browse the repository at this point in the history
This fixes a very rare bug when Gitea and another AP server (confirmed to happen with Mastodon) are running on the same machine, Gitea fails to verify incoming HTTP signatures. This is because the other AP server creates the sig with the public Gitea domain as the Host. However, when Gitea receives the request, the Host header is instead localhost, so the signature verification fails. Manually changing the host header to the correct value and trying the verification again fixes the bug.
  • Loading branch information
Anthony Wang committed Jun 14, 2022
1 parent a312007 commit f53e46c
Showing 1 changed file with 10 additions and 0 deletions.
10 changes: 10 additions & 0 deletions routers/api/v1/activitypub/reqsignature.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,16 @@ func verifyHTTPSignatures(ctx *gitea_context.APIContext) (authenticated bool, er
// 3. Verify the other actor's key
algo := httpsig.Algorithm(setting.Federation.Algorithms[0])
authenticated = v.Verify(pubKey, algo) == nil
if authenticated {
return
}
// 4. When Gitea and the other ActivityPub server are running on the same machine, the Host header is sometimes incorrect
r.Header["Host"] = []string{setting.Domain}
v, err = httpsig.NewVerifier(r)
if err != nil {
return
}
authenticated = v.Verify(pubKey, algo) == nil
return
}

Expand Down

0 comments on commit f53e46c

Please sign in to comment.