One key for audit retention, and stop the SAML page claiming a feature exists
Wave 6: two settings pages that told an administrator the site was configured when it was not. That is worse than a missing feature, because nobody goes looking for it. Audit retention had TWO keys. shopdb/core/services/auditretention.py reads `audit_retentiondays` (category site, default 0). A second `audit_retention_days` was seeded under category audit with a default of 90, and the Audit & Logging page wrote to that one - so an administrator set a period, reloaded, saw it persisted, and nothing ever consulted it. Retention stayed off. The page now writes the key that is read, the duplicate is out of the seed list, and migration 7d39 carries a value an operator actually set on the dead key over to the live one before deleting it: their intent was "keep 30 days", and the fix should not silently discard it. The page's copy also claimed logs "will be automatically purged", which nothing does - purging is manual, from the site settings page or `flask audit purge --apply`. The Authentication page offered a full SAML configuration - metadata URL, entity id, ACS URL, auto-create, admin group - and reported "Configured - SAML login available" once two fields held text. There is no SAML anywhere in the codebase: no login route, no ACS, no assertion handling. SAML IS planned, so the settings stay and the page keeps them; what changes is that it now says plainly that nothing consumes them yet, and the status line never claims availability. The dangerous control there was "Allow Local Login". Turning it off did nothing at all, so an administrator could believe they had closed local password login while it stayed wide open. It is locked on until there is another way in, and says why. CONFIG.md marks the whole block reserved rather than describing it as working configuration. Scope: product
This commit is contained in:
@@ -138,6 +138,7 @@ read back through the API.
|
||||
| `setup_complete` | `false` | Set true once the first-run wizard finishes; gates the `/setup` route. |
|
||||
| `employee_directory_mode` | `selfhosted` | `selfhosted` (tables in this app) or `external` (a separate HR database, see `EMPLOYEE_DB_*`). |
|
||||
| `usb_directory_mode` | `selfhosted` | `selfhosted` or `external` (a separate `cmmc_usb` database, see `CMMC_USB_DB_*`). |
|
||||
| `audit_retentiondays` | `0` | Delete audit entries older than this many days. 0 keeps everything forever. Saving a period deletes nothing by itself: purge from this page or run `flask audit purge --apply`. |
|
||||
| `site_base_url` | (empty) | Public base URL for QR codes and absolute links. Scheme + host, optionally including the subpath a site is served under (`https://host/shopdb`). Blank = use the browsing origin. |
|
||||
| `facility_name` | (empty) | Facility name in the dashboard header. Blank = frontend falls back to `ShopDB`. |
|
||||
| `pc_access_domain` | `device.geaerospace.net` | Domain appended to a PC hostname for remote-access links. Blank = hostname as-is. |
|
||||
@@ -287,23 +288,32 @@ Three flows use it:
|
||||
|
||||
### audit
|
||||
|
||||
| Key | Default | Notes |
|
||||
|-----|---------|-------|
|
||||
| `audit_retention_days` | `90` | Days to retain audit logs (0 = keep forever). |
|
||||
Retention lives in the `site` section as `audit_retentiondays`. It was
|
||||
documented here as `audit_retention_days` as well, which was a second key that
|
||||
nothing read - the settings page wrote to it and retention stayed off. One key
|
||||
now, and the page writes that one.
|
||||
|
||||
### auth
|
||||
|
||||
**SAML is not implemented yet.** These keys exist so a site can be configured
|
||||
ahead of the feature, and the settings page says so on screen. Nothing reads
|
||||
them today: there is no SAML login route and no assertion is accepted, so
|
||||
sign-in is local accounts only whatever is set here. In particular
|
||||
`saml_allow_local_login` does NOT disable password login - the toggle is locked
|
||||
on until there is another way in, because a control that appears to close the
|
||||
local door while it stays open is worse than no control.
|
||||
|
||||
| Key | Default | Notes |
|
||||
|-----|---------|-------|
|
||||
| `saml_enabled` | `false` | Enable SAML SSO. |
|
||||
| `saml_idp_metadata_url` | (empty) | SAML IdP metadata URL. |
|
||||
| `saml_entity_id` | (empty) | SAML SP entity id. |
|
||||
| `saml_acs_url` | (empty) | SAML Assertion Consumer Service URL. |
|
||||
| `saml_allow_local_login` | `true` | Allow local username/password login when SAML is on. |
|
||||
| `saml_auto_create_users` | `true` | Auto-create users on first SAML login. |
|
||||
| `saml_admin_group` | (empty) | SAML group name that grants the admin role. |
|
||||
| `saml_enabled` | `false` | Reserved. Enable SAML SSO once it ships. |
|
||||
| `saml_idp_metadata_url` | (empty) | Reserved. SAML IdP metadata URL. |
|
||||
| `saml_entity_id` | (empty) | Reserved. SAML SP entity id. |
|
||||
| `saml_acs_url` | (empty) | Reserved. SAML Assertion Consumer Service URL. |
|
||||
| `saml_allow_local_login` | `true` | Reserved, and locked on. Local login cannot be turned off while it is the only way in. |
|
||||
| `saml_auto_create_users` | `true` | Reserved. Auto-create users on first SAML login. |
|
||||
| `saml_admin_group` | (empty) | Reserved. SAML group name that grants the admin role. |
|
||||
|
||||
**Personal API tokens.** Besides login JWTs and SAML, a user may create
|
||||
**Personal API tokens.** Besides login JWTs, a user may create
|
||||
personal API tokens (PATs) for scripts and integrations, from Settings > API
|
||||
Tokens (or `POST /api/apitokens`). A PAT is sent like a JWT
|
||||
(`Authorization: Bearer shopdb_pat_...`), authenticates as its owning user
|
||||
|
||||
Reference in New Issue
Block a user