Skip to content

Commit b5b0448

Browse files
authored
Fix signatures on pseudoID invites (#404)
1 parent c87b4ea commit b5b0448

File tree

4 files changed

+49
-23
lines changed

4 files changed

+49
-23
lines changed

eventauth.go

+21-11
Original file line numberDiff line numberDiff line change
@@ -990,22 +990,32 @@ func (m *membershipAllower) membershipAllowed(event PDU) error { // nolint: gocy
990990
)
991991
}
992992

993-
sender, err := m.userIDQuerier(m.roomID, spec.SenderID(m.senderID))
994-
if err != nil {
995-
return err
993+
var sender *spec.UserID
994+
var err error
995+
if event.Type() == spec.MRoomMember {
996+
mapping := MemberContent{}
997+
if err := json.Unmarshal(event.Content(), &mapping); err != nil {
998+
return err
999+
}
1000+
if mapping.MXIDMapping != nil {
1001+
sender, err = spec.NewUserID(mapping.MXIDMapping.UserID, true)
1002+
if err != nil {
1003+
return err
1004+
}
1005+
}
9961006
}
1007+
9971008
if sender == nil {
998-
return errorf("userID not found for sender %q in room %q", m.senderID, event.RoomID())
999-
}
1000-
if err := m.create.UserIDAllowed(*sender); err != nil {
1001-
return err
1009+
sender, err = m.userIDQuerier(m.roomID, spec.SenderID(m.senderID))
1010+
if err != nil {
1011+
return err
1012+
}
10021013
}
10031014

1004-
target, err := m.userIDQuerier(m.roomID, spec.SenderID(m.senderID))
1005-
if err != nil {
1006-
return err
1015+
if sender == nil {
1016+
return errorf("userID not found for sender %q in room %q", m.senderID, event.RoomID())
10071017
}
1008-
if err := m.create.UserIDAllowed(*target); err != nil {
1018+
if err := m.create.UserIDAllowed(*sender); err != nil {
10091019
return err
10101020
}
10111021

keyring.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ func (v JSONVerifierSelf) VerifyJSONs(ctx context.Context, requests []VerifyJSON
382382
// convert to public key
383383
key, err := spec.SenderID(requests[i].ServerName).RawBytes()
384384
if err != nil {
385-
results[i].Error = fmt.Errorf("unable to get key from senderID: %w", err)
385+
results[i].Error = fmt.Errorf("unable to get key from senderID for %s: %w", requests[i].ServerName, err)
386386
continue
387387
}
388388

performinvite.go

+11-3
Original file line numberDiff line numberDiff line change
@@ -184,14 +184,21 @@ func PerformInvite(ctx context.Context, input PerformInviteInput, fedClient Fede
184184

185185
// Sign the event so that other servers will know that we have received the invite.
186186
fullEventBuilder := verImpl.NewEventBuilderFromProtoEvent(&input.EventTemplate)
187-
inviteEvent, err = fullEventBuilder.Build(input.EventTime, origin, keyID, input.SigningKey)
187+
inviteEvent, err = fullEventBuilder.Build(input.EventTime, spec.ServerName(inviteeSenderID), keyID, inviteeSigningKey)
188188
if err != nil {
189189
logger.WithError(err).Error("failed building invite event")
190190
return nil, spec.InternalServerError{}
191191
}
192192

193-
// Have the invitee also sign the event
194-
inviteEvent = inviteEvent.Sign(string(origin), keyID, inviteeSigningKey)
193+
// Have the inviter also sign the event
194+
inviteEvent = inviteEvent.Sign(string(origin), keyID, input.SigningKey)
195+
196+
verifier := JSONVerifierSelf{}
197+
err = VerifyEventSignatures(ctx, inviteEvent, verifier, input.UserIDQuerier)
198+
if err != nil {
199+
logger.WithError(err).Error("local invite event has invalid signatures")
200+
return nil, spec.Forbidden(err.Error())
201+
}
195202

196203
err = checkEventAllowed(inviteEvent)
197204
if err != nil {
@@ -205,6 +212,7 @@ func PerformInvite(ctx context.Context, input PerformInviteInput, fedClient Fede
205212
}
206213
logger.Debugf("Federated SendInviteV3 success to user %s", input.Invitee.String())
207214

215+
// Have the inviter also sign the event
208216
inviteEvent = inviteEvent.Sign(
209217
string(origin), keyID, input.SigningKey,
210218
)

performinvite_test.go

+16-8
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,19 @@ func SenderIDForUserTest(roomID spec.RoomID, userID spec.UserID) (spec.SenderID,
2020
func CreateSenderID(ctx context.Context, userID spec.UserID, roomID spec.RoomID, roomVersion string) (spec.SenderID, ed25519.PrivateKey, error) {
2121
_, key, err := ed25519.GenerateKey(nil)
2222
if err != nil {
23-
panic("failed generating ed25519 key")
23+
return "", nil, err
2424
}
2525
return spec.SenderID(userID.String()), key, nil
2626
}
2727

28+
func CreateSenderIDPseudoIDs(ctx context.Context, userID spec.UserID, roomID spec.RoomID, roomVersion string) (spec.SenderID, ed25519.PrivateKey, error) {
29+
_, key, err := ed25519.GenerateKey(nil)
30+
if err != nil {
31+
return "", nil, err
32+
}
33+
return spec.SenderIDFromPseudoIDKey(key), key, nil
34+
}
35+
2836
func StoreSenderIDTest(ctx context.Context, senderID spec.SenderID, userID string, id spec.RoomID) error {
2937
return nil
3038
}
@@ -684,7 +692,7 @@ func TestPerformInvitePseudoIDs(t *testing.T) {
684692
StateQuerier: &TestStateQuerier{},
685693
UserIDQuerier: UserIDForSenderTest,
686694
SenderIDQuerier: SenderIDForUserTest,
687-
SenderIDCreator: CreateSenderID,
695+
SenderIDCreator: CreateSenderIDPseudoIDs,
688696
EventQuerier: eventQuerier.GetLatestEventsTest,
689697
StoreSenderIDFromPublicID: StoreSenderIDTest,
690698
},
@@ -708,7 +716,7 @@ func TestPerformInvitePseudoIDs(t *testing.T) {
708716
StateQuerier: &TestStateQuerier{shouldFailAuth: true},
709717
UserIDQuerier: UserIDForSenderTest,
710718
SenderIDQuerier: SenderIDForUserTest,
711-
SenderIDCreator: CreateSenderID,
719+
SenderIDCreator: CreateSenderIDPseudoIDs,
712720
EventQuerier: eventQuerier.GetLatestEventsTest,
713721
StoreSenderIDFromPublicID: StoreSenderIDTest,
714722
},
@@ -732,7 +740,7 @@ func TestPerformInvitePseudoIDs(t *testing.T) {
732740
StateQuerier: &TestStateQuerier{shouldFailState: true},
733741
UserIDQuerier: UserIDForSenderTest,
734742
SenderIDQuerier: SenderIDForUserTest,
735-
SenderIDCreator: CreateSenderID,
743+
SenderIDCreator: CreateSenderIDPseudoIDs,
736744
EventQuerier: eventQuerier.GetLatestEventsTest,
737745
StoreSenderIDFromPublicID: StoreSenderIDTest,
738746
},
@@ -755,7 +763,7 @@ func TestPerformInvitePseudoIDs(t *testing.T) {
755763
StateQuerier: &TestStateQuerier{},
756764
UserIDQuerier: UserIDForSenderTest,
757765
SenderIDQuerier: SenderIDForUserTest,
758-
SenderIDCreator: CreateSenderID,
766+
SenderIDCreator: CreateSenderIDPseudoIDs,
759767
EventQuerier: eventQuerier.GetLatestEventsTest,
760768
StoreSenderIDFromPublicID: StoreSenderIDTest,
761769
},
@@ -779,7 +787,7 @@ func TestPerformInvitePseudoIDs(t *testing.T) {
779787
StateQuerier: &TestStateQuerier{createEvent: createEvent, inviterMemberEvent: inviterJoinEvent},
780788
UserIDQuerier: UserIDForSenderTest,
781789
SenderIDQuerier: SenderIDForUserTest,
782-
SenderIDCreator: CreateSenderID,
790+
SenderIDCreator: CreateSenderIDPseudoIDs,
783791
EventQuerier: eventQuerier.GetLatestEventsTest,
784792
StoreSenderIDFromPublicID: StoreSenderIDTest,
785793
},
@@ -803,7 +811,7 @@ func TestPerformInvitePseudoIDs(t *testing.T) {
803811
StateQuerier: &TestStateQuerier{createEvent: createEvent, inviterMemberEvent: inviterJoinEvent},
804812
UserIDQuerier: userIDForSender,
805813
SenderIDQuerier: SenderIDForUserTest,
806-
SenderIDCreator: CreateSenderID,
814+
SenderIDCreator: CreateSenderIDPseudoIDs,
807815
EventQuerier: eventQuerier.GetLatestEventsTest,
808816
StoreSenderIDFromPublicID: StoreSenderIDTest,
809817
},
@@ -825,7 +833,7 @@ func TestPerformInvitePseudoIDs(t *testing.T) {
825833
StateQuerier: &TestStateQuerier{createEvent: createEvent, inviterMemberEvent: inviterJoinEvent},
826834
UserIDQuerier: userIDForSender,
827835
SenderIDQuerier: SenderIDForUserTest,
828-
SenderIDCreator: CreateSenderID,
836+
SenderIDCreator: CreateSenderIDPseudoIDs,
829837
EventQuerier: eventQuerier.GetLatestEventsTest,
830838
StoreSenderIDFromPublicID: StoreSenderIDTest,
831839
},

0 commit comments

Comments
 (0)