Demo Multi-Account Launcher

The Firefox launcher opens several permanent tutorial accounts in separate Firefox containers. It is restricted to managed demo installations and does not transmit or store permanent passwords.

Operator Workflow

Create a ticket from the trusted workstation:

./.venv/bin/python -m ops.demo.manager \
  --host ADMIN@DEMO_HOST \
  ticket create demo_NAME \
  --accounts viewer,editor_1,reviewer,approver \
  --label "Parcel review exercise"

The raw XXXX-XXXX ticket is printed at creation and saved in the trusted workstation's owner-private state directory. Store or send it only for the intended workshop. Remote ticket list and ticket show expose safe metadata but cannot recover the code from the demo server.

./.venv/bin/python -m ops.demo.manager ticket saved demo_NAME
./.venv/bin/python -m ops.demo.manager ticket saved demo_NAME --show
./.venv/bin/python -m ops.demo.manager --host ADMIN@DEMO_HOST ticket list demo_NAME
./.venv/bin/python -m ops.demo.manager --host ADMIN@DEMO_HOST ticket show demo_NAME TICKET_ID
./.venv/bin/python -m ops.demo.manager --host ADMIN@DEMO_HOST ticket revoke demo_NAME TICKET_ID
./.venv/bin/python -m ops.demo.manager --host ADMIN@DEMO_HOST ticket revoke-all demo_NAME

The first local command reports the protected file and ticket count without printing codes. The --show form prints saved codes only to an interactive terminal and cannot be combined with JSON output. Revocation removes the matching local code. Revoke-all, successful reset, and successful deletion remove all locally saved codes for that demo.

Reset and delete revoke launcher credentials before replacing or removing the managed demo. A failed revocation stops destructive lifecycle work.

Learner Workflow

  1. Install the signed Firefox extension.
  2. Select its toolbar icon.
  3. Enter the HTTPS demo address and ticket.
  4. Approve access to that exact demo origin.
  5. Use the role tabs opened in separate LMSTool containers.

The extension may remember the last successful origin. It does not retain the ticket. Login tokens expire after three minutes and can be consumed once.

Shared Account Limitation

Containers isolate browser cookies, not application identities. Learners using the same permanent tutorial account share audit attribution, drafts, preferences, filters, notifications, assignments, and owned records. This is accepted for disposable workshops and must be explained before exercises begin.

Deployment Controls

The launcher requires both LMSTOOL_DEMO=true and DEMO_MULTI_ACCOUNT_LAUNCHER_ENABLED=true. The managed lifecycle mounts DEMO_LAUNCHER_HMAC_KEY_FILE from private demo secret storage and disables the demo application's Dokku nginx access log so token-bearing login paths are not recorded. Django logging applies an additional token-path redaction filter.

Do not enable the launcher on ordinary or production installations.

Extension Release

Development checks run from tools/firefox-demo-launcher/:

npm test
npm run lint
npm run build

The package under web-ext-artifacts/ is unsigned and ignored. Mozilla signing and hosted unlisted distribution are required before learner release. Recheck the supported desktop Firefox ESR and npm audit at each release. As of the initial implementation, web-ext 10.5.0 reports unresolved high-severity findings in development-only transitive dependencies; do not use npm audit fix --force, which proposes an invalid downgrade.