(ctx context.Context, req *api.PerformUploadKeysRequest, res *api.PerformUploadKeysResponse)
| 584 | } |
| 585 | |
| 586 | func (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 |
no test coverage detected