diff --git a/README.md b/README.md index 8dadee8..3945af1 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,9 @@ npm run dev # http://localhost:5200 ``` `.env.example` documents every variable, which are required, and which are optional. -`SESSION_SECRET` must be set (`openssl rand -hex 32`). +`SESSION_SECRET` signs the session cookie; generate one with `openssl rand -hex 32`. In +production the app refuses to start without it (at least 16 characters); in development +it warns and falls back to an insecure default. See [release_notes.md](./release_notes.md). Alternatively, `docker compose up` builds the app and starts Redis alongside it on port 3000; it reads the same variables from the environment. @@ -69,4 +71,5 @@ pinned to which upstream commit, and which components have been ported to Svelte | [design_system_integration.md](./design_system_integration.md) | How this app consumes the OGCR Design System | | [chain_integration.md](./chain_integration.md) | How on-chain state reaches the app, and the heartbeat | | [open_questions.md](./open_questions.md) | Unresolved design and product questions | +| [release_notes.md](./release_notes.md) | Notable and breaking changes, with upgrade steps | | [CLAUDE.md](./CLAUDE.md) | Notes on discovering OBP dynamic entity endpoints | diff --git a/release_notes.md b/release_notes.md new file mode 100644 index 0000000..11d97ec --- /dev/null +++ b/release_notes.md @@ -0,0 +1,56 @@ +# Release Notes + +## 2026-10-02 + +### Breaking: the registry now reads the `registry/activities-query` Dynamic Query + +The public registry (`/registry`, `/registry/activities`, `/registry/certificates/…`) +now calls `GET /obp/dynamic-endpoint/dynamic-resource-doc/registry/activities-query` +instead of the Scala Dynamic Resource Doc at `…/registry/activities`. The host still +comes from `PUBLIC_OBP_BASE_URL`; the response shape is unchanged. + +**Action required** on each OBP instance the app points at, before deploying: + +1. OBP-API must include the "Dynamic Query" commit (`fd8f70691`). Older versions reject + the doc with `OBP-40049`. +2. Create the doc from OGCR-DynamicEntities, with `OBP_ENTITY_SPACE_ID` set to the + entity space (it is created at that bank): + + ```sh + python3 dynamic_resource_docs.py create registry_activities_query + ``` + +3. The `activity`, `country`, `operator`, `activity_verification`, + `certificate_of_compliance` and `activity_on_chain` Dynamic Entities must have public + access. Otherwise + signed-out visitors get a 403 and the registry pages show an error with no data. + +Check it with an anonymous call; it should return `{"activities": [...], "count": N}`: + +```sh +curl "$PUBLIC_OBP_BASE_URL/obp/dynamic-endpoint/dynamic-resource-doc/registry/activities-query" +``` + +## 2026-09-08 + +### Breaking: `SESSION_SECRET` is now required in production + +Session cookies were previously signed with the hardcoded string `'secret'`, so +anyone could forge them. They are now signed with the value of the +`SESSION_SECRET` environment variable (commit `1f5f715`). + +- **Production** (`NODE_ENV=production`): the app refuses to start unless + `SESSION_SECRET` is set to at least 16 characters. +- **Development**: if unset or too short, the app logs a warning and falls back + to an insecure built-in default so `npm run dev` keeps working. +- **Docker Compose**: `docker compose up` fails unless `SESSION_SECRET` is set. + +**Action required:** generate a secret and add it to your `.env` (see +`.env.example`): + +```sh +openssl rand -hex 32 +``` + +Changing the secret invalidates existing sessions, so users will need to log in +again after upgrading. diff --git a/src/lib/components/FieldList.svelte b/src/lib/components/FieldList.svelte new file mode 100644 index 0000000..dc6d4d4 --- /dev/null +++ b/src/lib/components/FieldList.svelte @@ -0,0 +1,113 @@ + + + + +