aboutsummaryrefslogtreecommitdiff
path: root/keyserver
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2022-04-29 16:02:55 +0100
committerGitHub <noreply@github.com>2022-04-29 16:02:55 +0100
commit31799a3b2a733192a656cfa77662599bd1568bdc (patch)
tree35ed3a276ebfa4615ce7eae9060fd817bcaa2a8f /keyserver
parentd28d0ee66e22402bebd791a46de33c8bf3169e26 (diff)
Device list display name fixes (#2405)
* Get device names from `unsigned` in `/user/devices` * Fix display name updates * Fix bug * Fix another bug
Diffstat (limited to 'keyserver')
-rw-r--r--keyserver/internal/internal.go95
1 files changed, 47 insertions, 48 deletions
diff --git a/keyserver/internal/internal.go b/keyserver/internal/internal.go
index 1677cf8e..e556f44b 100644
--- a/keyserver/internal/internal.go
+++ b/keyserver/internal/internal.go
@@ -632,43 +632,55 @@ func (a *KeyInternalAPI) uploadLocalDeviceKeys(ctx context.Context, req *api.Per
}
var keysToStore []api.DeviceMessage
- // assert that the user ID / device ID are not lying for each key
- for _, key := range req.DeviceKeys {
- var serverName gomatrixserverlib.ServerName
- _, serverName, err = gomatrixserverlib.SplitID('@', key.UserID)
- if err != nil {
- continue // ignore invalid users
- }
- if serverName != a.ThisServer {
- continue // ignore remote users
- }
- if len(key.KeyJSON) == 0 {
- keysToStore = append(keysToStore, key.WithStreamID(0))
- continue // deleted keys don't need sanity checking
- }
- // check that the device in question actually exists in the user
- // API before we try and store a key for it
- if _, ok := existingDeviceMap[key.DeviceID]; !ok {
- continue
- }
- gotUserID := gjson.GetBytes(key.KeyJSON, "user_id").Str
- gotDeviceID := gjson.GetBytes(key.KeyJSON, "device_id").Str
- if gotUserID == key.UserID && gotDeviceID == key.DeviceID {
- keysToStore = append(keysToStore, key.WithStreamID(0))
- continue
- }
-
- res.KeyError(key.UserID, key.DeviceID, &api.KeyError{
- Err: fmt.Sprintf(
- "user_id or device_id mismatch: users: %s - %s, devices: %s - %s",
- gotUserID, key.UserID, gotDeviceID, key.DeviceID,
- ),
- })
- }
if req.OnlyDisplayNameUpdates {
- // add the display name field from keysToStore into existingKeys
- keysToStore = appendDisplayNames(existingKeys, keysToStore)
+ for _, existingKey := range existingKeys {
+ for _, newKey := range req.DeviceKeys {
+ switch {
+ case existingKey.UserID != newKey.UserID:
+ continue
+ case existingKey.DeviceID != newKey.DeviceID:
+ continue
+ case existingKey.DisplayName != newKey.DisplayName:
+ existingKey.DisplayName = newKey.DisplayName
+ }
+ }
+ keysToStore = append(keysToStore, existingKey)
+ }
+ } else {
+ // assert that the user ID / device ID are not lying for each key
+ for _, key := range req.DeviceKeys {
+ var serverName gomatrixserverlib.ServerName
+ _, serverName, err = gomatrixserverlib.SplitID('@', key.UserID)
+ if err != nil {
+ continue // ignore invalid users
+ }
+ if serverName != a.ThisServer {
+ continue // ignore remote users
+ }
+ if len(key.KeyJSON) == 0 {
+ keysToStore = append(keysToStore, key.WithStreamID(0))
+ continue // deleted keys don't need sanity checking
+ }
+ // check that the device in question actually exists in the user
+ // API before we try and store a key for it
+ if _, ok := existingDeviceMap[key.DeviceID]; !ok {
+ continue
+ }
+ gotUserID := gjson.GetBytes(key.KeyJSON, "user_id").Str
+ gotDeviceID := gjson.GetBytes(key.KeyJSON, "device_id").Str
+ if gotUserID == key.UserID && gotDeviceID == key.DeviceID {
+ keysToStore = append(keysToStore, key.WithStreamID(0))
+ continue
+ }
+
+ res.KeyError(key.UserID, key.DeviceID, &api.KeyError{
+ Err: fmt.Sprintf(
+ "user_id or device_id mismatch: users: %s - %s, devices: %s - %s",
+ gotUserID, key.UserID, gotDeviceID, key.DeviceID,
+ ),
+ })
+ }
}
// store the device keys and emit changes
@@ -764,16 +776,3 @@ func emitDeviceKeyChanges(producer KeyChangeProducer, existing, new []api.Device
}
return producer.ProduceKeyChanges(keysAdded)
}
-
-func appendDisplayNames(existing, new []api.DeviceMessage) []api.DeviceMessage {
- for i, existingDevice := range existing {
- for _, newDevice := range new {
- if existingDevice.DeviceID != newDevice.DeviceID {
- continue
- }
- existingDevice.DisplayName = newDevice.DisplayName
- existing[i] = existingDevice
- }
- }
- return existing
-}