forked from forgejo/forgejo
Don't use legacy method to send Matrix Webhook (#12348)
* Don't use legacy send for messages * Add migrations to ensure Matrix webhooks use PUT * Set HTTP method to PUT as default * Fix sql condition.. Signed-off-by: Till Faelligen <tfaelligen@gmail.com> * Rename getTxnID -> getMatrixTxnID * Use local variable instead of constant value Co-authored-by: techknowlogick <techknowlogick@gitea.io>
This commit is contained in:
parent
f6d5303e02
commit
bf60146444
6 changed files with 87 additions and 8 deletions
|
@ -5,6 +5,7 @@
|
|||
package webhook
|
||||
|
||||
import (
|
||||
"crypto/sha1"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
@ -291,7 +292,14 @@ func getMatrixHookRequest(t *models.HookTask) (*http.Request, error) {
|
|||
}
|
||||
t.PayloadContent = string(payload)
|
||||
|
||||
req, err := http.NewRequest("POST", t.URL, strings.NewReader(string(payload)))
|
||||
txnID, err := getMatrixTxnID(payload)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("getMatrixHookRequest: unable to hash payload: %+v", err)
|
||||
}
|
||||
|
||||
t.URL = fmt.Sprintf("%s/%s", t.URL, txnID)
|
||||
|
||||
req, err := http.NewRequest(t.HTTPMethod, t.URL, strings.NewReader(string(payload)))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -301,3 +309,14 @@ func getMatrixHookRequest(t *models.HookTask) (*http.Request, error) {
|
|||
|
||||
return req, nil
|
||||
}
|
||||
|
||||
// getMatrixTxnID creates a txnID based on the payload to ensure idempotency
|
||||
func getMatrixTxnID(payload []byte) (string, error) {
|
||||
h := sha1.New()
|
||||
_, err := h.Write(payload)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%x", h.Sum(nil)), nil
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue