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

Method uploadLocalDeviceKeys

keyserver/internal/internal.go:586–698  ·  view source on GitHub ↗
(ctx context.Context, req *api.PerformUploadKeysRequest, res *api.PerformUploadKeysResponse)

Source from the content-addressed store, hash-verified

584}
585
586func (a *KeyInternalAPI) uploadLocalDeviceKeys(ctx context.Context, req *api.PerformUploadKeysRequest, res *api.PerformUploadKeysResponse) {
587 // get a list of devices from the user API that actually exist, as
588 // we won't store keys for devices that don't exist
589 uapidevices := &userapi.QueryDevicesResponse{}
590 if err := a.UserAPI.QueryDevices(ctx, &userapi.QueryDevicesRequest{UserID: req.UserID}, uapidevices); err != nil {
591 res.Error = &api.KeyError{
592 Err: err.Error(),
593 }
594 return
595 }
596 if !uapidevices.UserExists {
597 res.Error = &api.KeyError{
598 Err: fmt.Sprintf("user %q does not exist", req.UserID),
599 }
600 return
601 }
602 existingDeviceMap := make(map[string]struct{}, len(uapidevices.Devices))
603 for _, key := range uapidevices.Devices {
604 existingDeviceMap[key.ID] = struct{}{}
605 }
606
607 // Get all of the user existing device keys so we can check for changes.
608 existingKeys, err := a.DB.DeviceKeysForUser(ctx, req.UserID, nil, true)
609 if err != nil {
610 res.Error = &api.KeyError{
611 Err: fmt.Sprintf("failed to query existing device keys: %s", err.Error()),
612 }
613 return
614 }
615
616 // Work out whether we have device keys in the keyserver for devices that
617 // no longer exist in the user API. This is mostly an exercise to ensure
618 // that we keep some integrity between the two.
619 var toClean []gomatrixserverlib.KeyID
620 for _, k := range existingKeys {
621 if _, ok := existingDeviceMap[k.DeviceID]; !ok {
622 toClean = append(toClean, gomatrixserverlib.KeyID(k.DeviceID))
623 }
624 }
625
626 if len(toClean) > 0 {
627 if err = a.DB.DeleteDeviceKeys(ctx, req.UserID, toClean); err != nil {
628 logrus.WithField("user_id", req.UserID).WithError(err).Errorf("Failed to clean up %d stale keyserver device key entries", len(toClean))
629 } else {
630 logrus.WithField("user_id", req.UserID).Debugf("Cleaned up %d stale keyserver device key entries", len(toClean))
631 }
632 }
633
634 var keysToStore []api.DeviceMessage
635
636 if req.OnlyDisplayNameUpdates {
637 for _, existingKey := range existingKeys {
638 for _, newKey := range req.DeviceKeys {
639 switch {
640 case existingKey.UserID != newKey.UserID:
641 continue
642 case existingKey.DeviceID != newKey.DeviceID:
643 continue

Callers 1

PerformUploadKeysMethod · 0.95

Calls 8

emitDeviceKeyChangesFunction · 0.85
WithStreamIDMethod · 0.80
KeyErrorMethod · 0.80
QueryDevicesMethod · 0.65
DeviceKeysForUserMethod · 0.65
DeleteDeviceKeysMethod · 0.65
StoreLocalDeviceKeysMethod · 0.65
ErrorMethod · 0.45

Tested by

no test coverage detected