GetUserDevices for the given user id
( req *http.Request, keyAPI keyapi.FederationKeyAPI, userID string, )
| 25 | |
| 26 | // GetUserDevices for the given user id |
| 27 | func GetUserDevices( |
| 28 | req *http.Request, |
| 29 | keyAPI keyapi.FederationKeyAPI, |
| 30 | userID string, |
| 31 | ) util.JSONResponse { |
| 32 | var res keyapi.QueryDeviceMessagesResponse |
| 33 | keyAPI.QueryDeviceMessages(req.Context(), &keyapi.QueryDeviceMessagesRequest{ |
| 34 | UserID: userID, |
| 35 | }, &res) |
| 36 | if res.Error != nil { |
| 37 | util.GetLogger(req.Context()).WithError(res.Error).Error("keyAPI.QueryDeviceMessages failed") |
| 38 | return jsonerror.InternalServerError() |
| 39 | } |
| 40 | |
| 41 | sigReq := &keyapi.QuerySignaturesRequest{ |
| 42 | TargetIDs: map[string][]gomatrixserverlib.KeyID{ |
| 43 | userID: {}, |
| 44 | }, |
| 45 | } |
| 46 | sigRes := &keyapi.QuerySignaturesResponse{} |
| 47 | for _, dev := range res.Devices { |
| 48 | sigReq.TargetIDs[userID] = append(sigReq.TargetIDs[userID], gomatrixserverlib.KeyID(dev.DeviceID)) |
| 49 | } |
| 50 | keyAPI.QuerySignatures(req.Context(), sigReq, sigRes) |
| 51 | |
| 52 | response := gomatrixserverlib.RespUserDevices{ |
| 53 | UserID: userID, |
| 54 | StreamID: res.StreamID, |
| 55 | Devices: []gomatrixserverlib.RespUserDevice{}, |
| 56 | } |
| 57 | |
| 58 | if masterKey, ok := sigRes.MasterKeys[userID]; ok { |
| 59 | response.MasterKey = &masterKey |
| 60 | } |
| 61 | if selfSigningKey, ok := sigRes.SelfSigningKeys[userID]; ok { |
| 62 | response.SelfSigningKey = &selfSigningKey |
| 63 | } |
| 64 | |
| 65 | for _, dev := range res.Devices { |
| 66 | var key gomatrixserverlib.RespUserDeviceKeys |
| 67 | err := json.Unmarshal(dev.DeviceKeys.KeyJSON, &key) |
| 68 | if err != nil { |
| 69 | util.GetLogger(req.Context()).WithError(err).Warnf("malformed device key: %s", string(dev.DeviceKeys.KeyJSON)) |
| 70 | continue |
| 71 | } |
| 72 | |
| 73 | displayName := dev.DisplayName |
| 74 | if displayName == "" { |
| 75 | displayName = gjson.GetBytes(dev.DeviceKeys.KeyJSON, "unsigned.device_display_name").Str |
| 76 | } |
| 77 | |
| 78 | device := gomatrixserverlib.RespUserDevice{ |
| 79 | DeviceID: dev.DeviceID, |
| 80 | DisplayName: displayName, |
| 81 | Keys: key, |
| 82 | } |
| 83 | |
| 84 | if targetUser, ok := sigRes.Signatures[userID]; ok { |
no test coverage detected