v7.27
Release Notes
This update introduces a refreshed design, along with important bug fixes and improvements.
UI
New Features
- The main PingPong app adopts the new designed introduced for Canvas Connect featuring a more responsive interface that puts conversations front and center, with more space for threads, messages, and content that matters most.
Updates & Improvements
- In larger screen sizes, the sidebar is expanded, with the option to collapse it always available.
- In larger screen sizes, thread conversations remain centered with a maximum width.
- The expand/collapse button icons in the sidebar have been replaced, and a helper tooltip was added.
Notes
- Share Link anonymous sessions and viewing public pages when unauthenticated retain the existing design.
Canvas Connect
New Features
- URL validation is now configured through a structured
[lti.security]section, with optional per-endpoint overrides for OpenID configuration, authorization, token, JWKS, Names and Role, and registration endpoints. - Use the new structured
[lti.security]configuration section with allow/deny pattern lists. Host patterns support wildcards for subdomain matching (e.g.*.instructure.commatchesschool.instructure.com) and path patterns support glob matching (e.g./api/lti/*). - Use the new
denyconfiguration lists for explicitly blocking specific hosts or paths. Deny rules are evaluated before allow rules. - Redirect handling for fetched LTI endpoints is now validated hop-by-hop against the configured host/path rules for that endpoint.
Updates & Improvements
- Defaults for hosts and paths reflect the default behavior in PingPong 7.20 or earlier (
allow = ["*"]) instead of requiring an explicit allowlist, reducing setup friction for new deployments. - Canvas Connect now normalizes the token endpoint before both requesting the token and building the client assertion audience, preventing
audmismatches whenhttp://endpoints are upgraded tohttps://.
Resolved Issues
- Fixed: Already percent-encoded LTI path bytes may be double-encoded during URL sanitization, which can corrupt canonicalized or redirect URLs before allow/deny checks.
- Fixed: OpenID discovery URL validation may ignore configured global
lti.security.pathsrules when deprecated LTI keys are still present. - Fixed: LTI launches may accept and persist invalid NRPS
context_memberships_urlvalues without validation.
Deprecations
- The following LTI config keys are deprecated and will be removed in the next major release (PingPong 8.0):
lti.platform_url_allowlist,lti.openid_configuration_paths,lti.dev_http_hosts.- The deprecated LTI config keys have been replaced by a structured
[lti.security]section that supports allow/deny patterns for both hosts and paths. The deprecated LTI config keys will continue to work until the next major PingPong release but will emit a warning at startup. - New fields map as follows:
lti.platform_url_allowlist->lti.security.openid_configuration.hosts.allowlti.openid_configuration_paths->lti.security.openid_configuration.paths.allowlti.dev_http_hosts->lti.security.allow_http_in_development
- Existing configs using the old keys will be automatically migrated at startup. A deprecation warning will be logged with migration instructions. Update your config before the upgrading to PingPong 8.0.
- The deprecated LTI config keys have been replaced by a structured
- The
lti suggest-config-from-dbCLI command has been removed with no replacement. If you relied on the CLI command to derive allowlist entries from existing registrations, check the deprecation warnings for migration instructions or configurehosts.allowmanually.
Notes
-
See below for a migration example from the deprecated LTI keys setup to the new
[lti.security]configuration:Before (deprecated):
[lti] platform_url_allowlist = ["canvas.example.edu"] dev_http_hosts = ["localhost", "canvas.docker"] [lti.openid_configuration_paths] mode = "append" paths = ["/custom/openid-config"]
After (new):
[lti.security] allow_http_in_development = true [lti.security.hosts] allow = ["canvas.example.edu", "localhost", "canvas.docker"] deny = [] [lti.security.paths] allow = ["*"] deny = [] [lti.security.openid_configuration.paths] allow = [ "/.well-known/openid-configuration", "/.well-known/openid", "/api/lti/security/openid-configuration", "/custom/openid-config", ] deny = []
Key Differences:
platform_url_allowlistnow maps to the globalhosts.allowlist, not just OpenID discovery.openid_configuration_pathsis replaced bylti.security.openid_configuration.paths.allow.- Legacy-only configs keep the legacy default OpenID discovery paths. If you used
mode = "append", merge the default paths with your custom ones intopaths.allow. dev_http_hostsis replaced by the booleanallow_http_in_development(defaults totrue). Per-host HTTP control is no longer supported.- Both
hostsandpathsnow support wildcard patterns (["*"]allows all). - If both legacy and new keys are provided, the new
lti.security.openid_configuration.*values take precedence.
Internal
Updates & Improvements
- Dependency updates.
- Updated permissions for Claude workflows to allow writing comments in PRs and issues, and allowing Claude to read CI results on PRs.
- Add progress tracker for Claude code review workflow.
Resolved Issues
- Fixed: Claude code reviews triggered by
@claude reviewmay fail becausetrack_progressis unconditionally requested including in unsupported events.
Deployment Information
| Schema Upgrade | Migration Script | Permissions Update | Task Definition Update | Configuration Update |
|---|---|---|---|---|
| No | No | No | No | YES |
Deployment Details
- Configuration Update: Use the new structured
[lti.security]configuration section.
Related PRs
- deps(web-dev): bump the development-dependencies group in /web/pingpong with 7 updates by @dependabot[bot] in #1510
- deps(gha): bump the github-actions group with 4 updates by @dependabot[bot] in #1508
- deps(web): bump the production-dependencies group in /web/pingpong with 4 updates by @dependabot[bot] in #1509
- feat(ui): expand LTI redesign to main app by @ekassos in #1512
- feat(lti): streamline LTI endpoint checks by @ekassos in #1513
- fix(lti): validate NRPS URLs during launch and other fixes by @ekassos in #1514
- chore: update claude workflow permissions by @ekassos in #1515
- fix: claude's track_progress not always supported by @ekassos in #1516
- deps(py): update pytz requirement from <2026.0,>=2025.2 to >=2025.2,<2027.0 in the production-dependencies group by @dependabot[bot] in #1507
Full Changelog: v1135+srv574.web403...v1142+srv577.web406