MCPcopy Create free account
hub / github.com/daodst/chat / GetUserDevices

Function GetUserDevices

federationapi/routing/devices.go:27–107  ·  view source on GitHub ↗

GetUserDevices for the given user id

(
	req *http.Request,
	keyAPI keyapi.FederationKeyAPI,
	userID string,
)

Source from the content-addressed store, hash-verified

25
26// GetUserDevices for the given user id
27func 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 {

Callers 1

SetupFunction · 0.85

Calls 4

ContextMethod · 0.80
QueryDeviceMessagesMethod · 0.65
QuerySignaturesMethod · 0.65
ErrorMethod · 0.45

Tested by

no test coverage detected