Add DeviceKeysEqual

This commit is contained in:
Neil Alexander 2022-02-22 14:09:02 +00:00
parent 34116178e8
commit 309dd8e146
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944
2 changed files with 22 additions and 1 deletions

View file

@ -15,8 +15,10 @@
package api package api
import ( import (
"bytes"
"context" "context"
"encoding/json" "encoding/json"
"fmt"
"strings" "strings"
"time" "time"
@ -73,6 +75,22 @@ type DeviceMessage struct {
DeviceChangeID int64 DeviceChangeID int64
} }
func (m1 *DeviceMessage) DeviceKeysEqual(m2 *DeviceMessage) (bool, error) {
if m1.DeviceKeys == nil || m2.DeviceKeys == nil {
return false, fmt.Errorf("not device keys")
}
if m1.UserID != m2.UserID || m1.DeviceID != m2.DeviceID {
return false, fmt.Errorf("different user ID or device ID")
}
if len(m1.KeyJSON) == 0 || len(m2.KeyJSON) == 0 {
return false, nil
}
if m1.DisplayName != m2.DisplayName {
return false, nil
}
return bytes.Equal(m1.KeyJSON, m2.KeyJSON), nil
}
// DeviceKeys represents a set of device keys for a single device // DeviceKeys represents a set of device keys for a single device
// https://matrix.org/docs/spec/client_server/r0.6.1#post-matrix-client-r0-keys-upload // https://matrix.org/docs/spec/client_server/r0.6.1#post-matrix-client-r0-keys-upload
type DeviceKeys struct { type DeviceKeys struct {

View file

@ -718,7 +718,10 @@ func emitDeviceKeyChanges(producer KeyChangeProducer, existing, new []api.Device
for _, existingKey := range existing { for _, existingKey := range existing {
// Do not treat the absence of keys as equal, or else we will not emit key changes // Do not treat the absence of keys as equal, or else we will not emit key changes
// when users delete devices which never had a key to begin with as both KeyJSONs are nil. // when users delete devices which never had a key to begin with as both KeyJSONs are nil.
if bytes.Equal(existingKey.KeyJSON, newKey.KeyJSON) && len(existingKey.KeyJSON) > 0 { // if bytes.Equal(existingKey.KeyJSON, newKey.KeyJSON) && len(existingKey.KeyJSON) > 0 {
if equal, err := existingKey.DeviceKeysEqual(&newKey); err != nil {
continue
} else if equal {
exists = true exists = true
break break
} }