mirror of
https://github.com/go-gitea/gitea.git
synced 2026-05-12 02:33:50 +02:00
Fix encoding for Matrix Webhooks (#37190)
`url.PathEscape` unnecessarily encodes ! to %21, causing Matrix homeservers to reject the request with 401. Replace %21 back to ! after escaping. Fixes #36012 --------- Signed-off-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
parent
fa8f7f15ef
commit
6eae04241d
@ -450,12 +450,21 @@ func MatrixHooksEditPost(ctx *context.Context) {
|
|||||||
editWebhook(ctx, matrixHookParams(ctx))
|
editWebhook(ctx, matrixHookParams(ctx))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func matrixRoomIDEncode(roomID string) string {
|
||||||
|
// See https://spec.matrix.org/latest/appendices/#room-ids
|
||||||
|
// Some (unrelated) demo links: https://spec.matrix.org/latest/appendices/#matrixto-navigation
|
||||||
|
// API spec: https://spec.matrix.org/v1.18/client-server-api/#sending-events-to-a-room
|
||||||
|
// Some of their examples show links like: "PUT /rooms/!roomid:domain/state/m.example.event"
|
||||||
|
return strings.NewReplacer("%21", "!", "%3A", ":").Replace(url.PathEscape(roomID))
|
||||||
|
}
|
||||||
|
|
||||||
func matrixHookParams(ctx *context.Context) webhookParams {
|
func matrixHookParams(ctx *context.Context) webhookParams {
|
||||||
form := web.GetForm(ctx).(*forms.NewMatrixHookForm)
|
form := web.GetForm(ctx).(*forms.NewMatrixHookForm)
|
||||||
|
|
||||||
|
// TODO: need to migrate to the latest (v3) API: https://spec.matrix.org/v1.18/client-server-api/
|
||||||
return webhookParams{
|
return webhookParams{
|
||||||
Type: webhook_module.MATRIX,
|
Type: webhook_module.MATRIX,
|
||||||
URL: fmt.Sprintf("%s/_matrix/client/r0/rooms/%s/send/m.room.message", form.HomeserverURL, url.PathEscape(form.RoomID)),
|
URL: fmt.Sprintf("%s/_matrix/client/r0/rooms/%s/send/m.room.message", form.HomeserverURL, matrixRoomIDEncode(form.RoomID)),
|
||||||
ContentType: webhook.ContentTypeJSON,
|
ContentType: webhook.ContentTypeJSON,
|
||||||
HTTPMethod: http.MethodPut,
|
HTTPMethod: http.MethodPut,
|
||||||
WebhookForm: form.WebhookForm,
|
WebhookForm: form.WebhookForm,
|
||||||
|
|||||||
15
routers/web/repo/setting/webhook_test.go
Normal file
15
routers/web/repo/setting/webhook_test.go
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package setting
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestWebhookMatrix(t *testing.T) {
|
||||||
|
assert.Equal(t, "!roomid:domain", matrixRoomIDEncode("!roomid:domain"))
|
||||||
|
assert.Equal(t, "!room%23id:domain", matrixRoomIDEncode("!room#id:domain")) // maybe it should never really happen in real world
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user