Resolves #1313
## Canvas Connect
### New Features
- PingPong group user lists can now be synced with Canvas Connect
rosters on a set schedule or manually.
- As with manual LTI launches from the course navigation, Canvas Connect
roster syncs fetch available SSO information, as determined during the
tool registration, along with the stable LTI user IDs.
- The required `resource_link_id` is saved when a user launches PingPong
from Canvas, or is retrieved from the first page of the Names and Role
API response as a fallback. The fallback works because all Canvas course
navigation placements share the same `context_id` as the
`resource_link_id`. See [this Instructure Community
discussion](https://community.instructure.com/en/discussion/419857/lti-1-3-same-resource-link-for-all-course-item-instances)
for more details.
### Resolved Issues
- Fixed: Canvas Connect cross-installation linking based on the Canvas
instance ID may fail because incomplete Canvas Connect course links are
considered for matching.
## External Logins
### New Features
- When merging user accounts, login emails from accounts that are about
to be merged into the primary account are added as secondary login
emails.
### Updates & Improvements
- When adding new users, more than one external login identifiers can be
specified at the user level. Providers can be different per user,
including users with no external login identifiers to be added.
Previously, only a single identifier was allowed per user from a single
provider for all users.
## UI
### New Features
- Use the new Canvas Connect sync roster button to sync all linked
Canvas Connect courses at once. Similar to Canvas Sync, rate limits
apply.
- Use the new quick Sync roster button to trigger a sync with Canvas
Connect or Canvas Sync without opening the detail view in Manage Group
page.
## Internal
### Updates & Improvements
- Centralized shared constants for LTI launch and Canvas Connect NRPS
sync and shared LTI role helpers.