|
@@ -427,6 +427,42 @@ Schema migrations under `migrations/` run automatically on the next
|
|
|
request after restart. Always take a backup of `./data/app.sqlite`
|
|
request after restart. Always take a backup of `./data/app.sqlite`
|
|
|
before pulling.
|
|
before pulling.
|
|
|
|
|
|
|
|
|
|
+**Composer dependency cadence (R01-N16).** The XLSX import wizard is
|
|
|
|
|
+backed by [PhpSpreadsheet](https://github.com/PHPOffice/PhpSpreadsheet),
|
|
|
|
|
+which has a long history of XML-related advisories. The `composer.json`
|
|
|
|
|
+caret range (`^3.4`) lets minor upgrades land on each `docker compose
|
|
|
|
|
+build --no-cache`, but the operator is responsible for rebuilding
|
|
|
|
|
+promptly when a new release ships. Recommended cadence: rebuild after
|
|
|
|
|
+any `git pull`, and at minimum monthly even on a quiet branch. Run the
|
|
|
|
|
+auditor to surface known CVEs in the currently locked versions:
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+./bin/audit.sh
|
|
|
|
|
+# → "No security vulnerability advisories found." when clean.
|
|
|
|
|
+# → exit 1 + a vulnerability table when an advisory matches.
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+The script wraps `composer audit --locked` inside the runtime image so
|
|
|
|
|
+the audit reflects the exact dependency tree the live container runs.
|
|
|
|
|
+A weekly cron is a low-friction option:
|
|
|
|
|
+
|
|
|
|
|
+```cron
|
|
|
|
|
+# /etc/cron.d/sprint-planner-audit
|
|
|
|
|
+0 7 * * 1 www-data cd /opt/sprint-planer-web && ./bin/audit.sh \
|
|
|
|
|
+ || mail -s 'sprint-planer composer advisory' admin@example.com
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 5.6 Tabbed sign-in note (R01-N17)
|
|
|
|
|
+
|
|
|
|
|
+The OIDC handshake stores its `state` and PKCE `code_verifier` in the
|
|
|
|
|
+PHP session under fixed keys. If you start a sign-in flow in two
|
|
|
|
|
+browser tabs at the same time, the second tab overwrites the first
|
|
|
|
|
+tab's state — when you finish the first tab, the callback rejects the
|
|
|
|
|
+state mismatch and you are bounced back to `/?auth_error=1`. This is
|
|
|
|
|
+not a security issue (the rejection is the correct OIDC behaviour),
|
|
|
|
|
+but it can be confusing. **Complete one sign-in at a time**, or close
|
|
|
|
|
+the older tab before starting a fresh login.
|
|
|
|
|
+
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
## 6. Troubleshooting
|
|
## 6. Troubleshooting
|