From 2381cc22a9d8c30a64855a6048db37a45b1a98ab Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Tue, 20 Jul 2021 14:13:59 +0100 Subject: [PATCH 1/3] Use intermediate step for RespSendJoin to drop invalid events --- federationclient.go | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/federationclient.go b/federationclient.go index 835e469f..97d2c21b 100644 --- a/federationclient.go +++ b/federationclient.go @@ -110,7 +110,27 @@ func (ac *FederationClient) SendJoin( if err = req.SetContent(event); err != nil { return } - err = ac.doRequest(ctx, req, &res) + var intermediate struct { + StateEvents []json.RawMessage `json:"state"` + AuthEvents []json.RawMessage `json:"auth_chain"` + Origin ServerName `json:"origin"` + } + process := func() { + for _, se := range intermediate.StateEvents { + if ev, err := NewEventFromUntrustedJSON(se, roomVersion); err == nil { + res.StateEvents = append(res.StateEvents, ev) + } + } + for _, ae := range intermediate.AuthEvents { + if ev, err := NewEventFromUntrustedJSON(ae, roomVersion); err == nil { + res.AuthEvents = append(res.AuthEvents, ev) + } + } + } + res.Origin = intermediate.Origin + if err = ac.doRequest(ctx, req, &intermediate); err == nil { + process() + } gerr, ok := err.(gomatrix.HTTPError) if ok && gerr.Code == 404 { // fallback to v1 which returns [200, body] @@ -124,7 +144,10 @@ func (ac *FederationClient) SendJoin( var v1Res []json.RawMessage err = ac.doRequest(ctx, v1req, &v1Res) if err == nil && len(v1Res) == 2 { - err = json.Unmarshal(v1Res[1], &res) + if err = json.Unmarshal(v1Res[1], &res); err != nil { + return + } + process() } } return From 65a220910f8ba6b3abb1e39b5fb8ef4c63b1df80 Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Tue, 20 Jul 2021 15:03:02 +0100 Subject: [PATCH 2/3] Preallocate capacity --- federationclient.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/federationclient.go b/federationclient.go index 97d2c21b..f76c8144 100644 --- a/federationclient.go +++ b/federationclient.go @@ -116,6 +116,9 @@ func (ac *FederationClient) SendJoin( Origin ServerName `json:"origin"` } process := func() { + res.StateEvents = make([]*Event, 0, len(intermediate.StateEvents)) + res.AuthEvents = make([]*Event, 0, len(intermediate.AuthEvents)) + res.Origin = intermediate.Origin for _, se := range intermediate.StateEvents { if ev, err := NewEventFromUntrustedJSON(se, roomVersion); err == nil { res.StateEvents = append(res.StateEvents, ev) @@ -127,7 +130,6 @@ func (ac *FederationClient) SendJoin( } } } - res.Origin = intermediate.Origin if err = ac.doRequest(ctx, req, &intermediate); err == nil { process() } From f6d80f78fd45a1c6dc3e69a04e48d1b1a65faa26 Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Tue, 20 Jul 2021 15:05:22 +0100 Subject: [PATCH 3/3] Fix fallback unmarshal --- federationclient.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/federationclient.go b/federationclient.go index f76c8144..5d008eed 100644 --- a/federationclient.go +++ b/federationclient.go @@ -146,7 +146,7 @@ func (ac *FederationClient) SendJoin( var v1Res []json.RawMessage err = ac.doRequest(ctx, v1req, &v1Res) if err == nil && len(v1Res) == 2 { - if err = json.Unmarshal(v1Res[1], &res); err != nil { + if err = json.Unmarshal(v1Res[1], &intermediate); err != nil { return } process()