Allow administrators to customize the SSO sign-in button text #1

Closed
opened 2026-10-24 13:23:27 +00:00 by jchapman · 4 comments
Owner

The sign-in button is too generic for an instance using an organization’s identity provider. Administrators should be able to give it a recognizable label, such as “Sign in with your family account”.

Acceptance criteria:

  • Add a plain-text setting under Sign-in with a useful default.
  • Apply the saved label consistently across desktop and mobile login screens, without a restart for a text-only change.
  • Enforce a sensible length limit and escape the value; no HTML or script rendering.
  • Preserve accessible button names and local recovery sign-in.
  • Test persistence, live updates, fallback text and unauthorized configuration attempts.
The sign-in button is too generic for an instance using an organization’s identity provider. Administrators should be able to give it a recognizable label, such as “Sign in with your family account”. Acceptance criteria: - Add a plain-text setting under Sign-in with a useful default. - Apply the saved label consistently across desktop and mobile login screens, without a restart for a text-only change. - Enforce a sensible length limit and escape the value; no HTML or script rendering. - Preserve accessible button names and local recovery sign-in. - Test persistence, live updates, fallback text and unauthorized configuration attempts.
Author
Owner

Starting owner-requested work on #1 and #3 after reading #14, both issue descriptions/all comments, and the merged #2 authentication handoff. Scope for #1: administrator-only persisted plain-text SSO button label, bounded input and safe fallback, live refresh on desktop/mobile without provider reinitialization or application restart, and persistence/authorization/browser regression coverage. Work is isolated from current main; the held scanning branch/PR remains untouched. No deployment or interruption of active uploads/tasks is planned.

Starting owner-requested work on #1 and #3 after reading #14, both issue descriptions/all comments, and the merged #2 authentication handoff. Scope for #1: administrator-only persisted plain-text SSO button label, bounded input and safe fallback, live refresh on desktop/mobile without provider reinitialization or application restart, and persistence/authorization/browser regression coverage. Work is isolated from current main; the held scanning branch/PR remains untouched. No deployment or interruption of active uploads/tasks is planned.
Author
Owner

Implementation decision: the label is a live field in the existing encrypted administrator settings, exposed through the existing public appearance snapshot. Saving text does not recreate the OIDC provider or change sign-in/session boundaries; open login screens use their existing focus/15-second refresh. Input is limited to 120 Unicode characters with controls rejected; blank uses the existing default and React renders the value as text. New desktop/mobile browser checks and initial backend checks passed. Final backend/race and integration checks are in progress; no deployment has occurred.

Implementation decision: the label is a live field in the existing encrypted administrator settings, exposed through the existing public appearance snapshot. Saving text does not recreate the OIDC provider or change sign-in/session boundaries; open login screens use their existing focus/15-second refresh. Input is limited to 120 Unicode characters with controls rejected; blank uses the existing default and React renders the value as text. New desktop/mobile browser checks and initial backend checks passed. Final backend/race and integration checks are in progress; no deployment has occurred.
Author
Owner

Implementation/local validation complete in commit 2ff357ea691e88047bede8943b47cedffdb7899b, branch codex/issues-1-3-sso-profile, published with #3 as draft PR #22.

Sign-in now contains SSO button text with the existing useful default. The setting is encrypted, versioned, audited and administrator-only. Text applies live; desktop/mobile login screens refresh on focus or within 15 seconds, independently of provider initialization or availability. Input is at most 120 Unicode characters, controls are rejected, blank/whitespace uses the default, and JSON/React render HTML as text. The accessible link name follows its text and local recovery remains available. No provider, identity, session or role configuration changes are triggered by label-only edits.

Regressions cover encrypted persistence, live application with pending provider settings, failed-save rollback, default/blank/Unicode bounds, control rejection, concurrent reads, unauthorized attempts, text saves during provider outage without discovery, desktop/mobile refresh and long-label wrapping. The real disposable app walkthrough verifies live application and restart persistence. OIDC guide and administration/testing/deployment guidance are updated.

Checks actually run and passed:

  • Linux AMD64 full backend suite and Go vet with the pinned real importer; focused API race suite, complete authentication/configuration/diagnostics/notification race packages and runner race suite through the Docker backend-race-tests target.
  • UI lint/build and dependency audit (zero reported vulnerabilities); all four focused Playwright suites (new SSO/profile plus existing availability, task activity and task email).
  • Disposable full browser/queue/SQLite/upload-recovery/settings walkthrough using the freshly built app and unchanged merged runner/processor images. Verified live label, local session name and encrypted label persistence across a disposable app replacement; all disposable containers/networks/volumes were removed.
  • Nine CI policy tests, source/document/workflow contracts, diff checks, redacted full-history and staged-source secret scans with no findings. The first system-Python policy run lacked PyYAML; rerunning with the repository's hash-pinned dependency passed. Existing UI bundle-size advisory remains.

State: implemented, committed, locally tested and published for review; not merged, release-image-published or deployed. Forgejo run 19 for this commit is waiting. Native AMD64/ARM64 release gates and actual-provider/deployed checks remain outstanding; no gate waiver is claimed. No pilot service or active upload/task was restarted or interrupted; no real library, provider or email delivery was used. Held #12/PR #19 and its checkout remain unchanged.

Next handoff: review draft PR #22 against main, complete required native validation, then coordinate an idle installation and run the documented provider/desktop/mobile checks. This issue remains open for review and merge.

Implementation/local validation complete in commit `2ff357ea691e88047bede8943b47cedffdb7899b`, branch `codex/issues-1-3-sso-profile`, published with #3 as [draft PR #22](https://git.sharedroot.net/jchapman/Immich-Bridge/pulls/22). Sign-in now contains SSO button text with the existing useful default. The setting is encrypted, versioned, audited and administrator-only. Text applies live; desktop/mobile login screens refresh on focus or within 15 seconds, independently of provider initialization or availability. Input is at most 120 Unicode characters, controls are rejected, blank/whitespace uses the default, and JSON/React render HTML as text. The accessible link name follows its text and local recovery remains available. No provider, identity, session or role configuration changes are triggered by label-only edits. Regressions cover encrypted persistence, live application with pending provider settings, failed-save rollback, default/blank/Unicode bounds, control rejection, concurrent reads, unauthorized attempts, text saves during provider outage without discovery, desktop/mobile refresh and long-label wrapping. The real disposable app walkthrough verifies live application and restart persistence. [OIDC guide](https://git.sharedroot.net/jchapman/Immich-Bridge/src/commit/2ff357ea691e88047bede8943b47cedffdb7899b/docs/oidc.md) and administration/testing/deployment guidance are updated. Checks actually run and passed: - Linux AMD64 full backend suite and Go vet with the pinned real importer; focused API race suite, complete authentication/configuration/diagnostics/notification race packages and runner race suite through the Docker backend-race-tests target. - UI lint/build and dependency audit (zero reported vulnerabilities); all four focused Playwright suites (new SSO/profile plus existing availability, task activity and task email). - Disposable full browser/queue/SQLite/upload-recovery/settings walkthrough using the freshly built app and unchanged merged runner/processor images. Verified live label, local session name and encrypted label persistence across a disposable app replacement; all disposable containers/networks/volumes were removed. - Nine CI policy tests, source/document/workflow contracts, diff checks, redacted full-history and staged-source secret scans with no findings. The first system-Python policy run lacked PyYAML; rerunning with the repository's hash-pinned dependency passed. Existing UI bundle-size advisory remains. State: implemented, committed, locally tested and published for review; not merged, release-image-published or deployed. [Forgejo run 19](https://git.sharedroot.net/jchapman/Immich-Bridge/actions/runs/19) for this commit is waiting. Native AMD64/ARM64 release gates and actual-provider/deployed checks remain outstanding; no gate waiver is claimed. No pilot service or active upload/task was restarted or interrupted; no real library, provider or email delivery was used. Held #12/PR #19 and its checkout remain unchanged. Next handoff: review draft PR #22 against main, complete required native validation, then coordinate an idle installation and run the documented provider/desktop/mobile checks. This issue remains open for review and merge.
Author
Owner

Merged at the owner's explicit request after their review: PR #22, main merge 09085fa7b7bdaf46be48b34cd8ac3068f315320e, preserving feature commit 2ff357ea691e88047bede8943b47cedffdb7899b.

Merge verification: no conflicts; current main was the original base. The merged Git tree a01dfdd638f7a61996d8b401c9115852418daa79 exactly matches the previously validated feature source. Feature ancestry, clean worktree and diff checks passed. No implementation edits or repeated application suites were needed for this unchanged source. The prior handoff records passing backend/vet/race, all four focused browser suites, full disposable application/settings/restart walkthrough, UI lint/build/audit, nine CI policy tests, documentation contracts and secret scans.

Closing this completed development issue at the owner's explicit request. The saved administrator-only SSO label applies live on desktop/mobile, with a useful blank fallback, bounded plain-text rendering, accessible link names and preserved local recovery. Acceptance regressions include persistence, live refresh, fallback, unauthorized configuration, controls/length and escaping.

Source is merged, not deployed or release-image-published. Native Forgejo AMD64/ARM64 checks and the aggregate release gate remain outstanding; run 20 is waiting. Closing this issue does not waive release or installation checks. Next: complete native validation, coordinate an idle installation, and verify the actual provider plus desktop/mobile behavior using the installation checklist and OIDC guide. No pilot service or active upload/task was restarted or interrupted. Held #12/PR #19 remain untouched.

Merged at the owner's explicit request after their review: [PR #22](https://git.sharedroot.net/jchapman/Immich-Bridge/pulls/22), main merge `09085fa7b7bdaf46be48b34cd8ac3068f315320e`, preserving feature commit `2ff357ea691e88047bede8943b47cedffdb7899b`. Merge verification: no conflicts; current main was the original base. The merged Git tree `a01dfdd638f7a61996d8b401c9115852418daa79` exactly matches the previously validated feature source. Feature ancestry, clean worktree and diff checks passed. No implementation edits or repeated application suites were needed for this unchanged source. The prior handoff records passing backend/vet/race, all four focused browser suites, full disposable application/settings/restart walkthrough, UI lint/build/audit, nine CI policy tests, documentation contracts and secret scans. Closing this completed development issue at the owner's explicit request. The saved administrator-only SSO label applies live on desktop/mobile, with a useful blank fallback, bounded plain-text rendering, accessible link names and preserved local recovery. Acceptance regressions include persistence, live refresh, fallback, unauthorized configuration, controls/length and escaping. Source is merged, not deployed or release-image-published. Native Forgejo AMD64/ARM64 checks and the aggregate release gate remain outstanding; [run 20](https://git.sharedroot.net/jchapman/Immich-Bridge/actions/runs/20) is waiting. Closing this issue does not waive release or installation checks. Next: complete native validation, coordinate an idle installation, and verify the actual provider plus desktop/mobile behavior using the [installation checklist](https://git.sharedroot.net/jchapman/Immich-Bridge/src/branch/main/docs/deployment.md) and [OIDC guide](https://git.sharedroot.net/jchapman/Immich-Bridge/src/branch/main/docs/oidc.md). No pilot service or active upload/task was restarted or interrupted. Held #12/PR #19 remain untouched.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jchapman/Immich-Bridge#1
No description provided.