caspian-utils 0.0.31 → 0.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/docs/auth.md
CHANGED
|
@@ -229,7 +229,7 @@ The current `main.py` also wires the session middleware directly, and some apps
|
|
|
229
229
|
|
|
230
230
|
```python
|
|
231
231
|
from starlette.middleware.sessions import SessionMiddleware
|
|
232
|
-
from
|
|
232
|
+
from casp.runtime_security import get_session_secret
|
|
233
233
|
|
|
234
234
|
|
|
235
235
|
SESSION_LIFETIME_HOURS = int(os.getenv("SESSION_LIFETIME_HOURS", 7))
|
|
@@ -247,7 +247,7 @@ app.add_middleware(
|
|
|
247
247
|
)
|
|
248
248
|
```
|
|
249
249
|
|
|
250
|
-
Keep this wiring in `main.py`. Keep only the policy values in `src/lib/auth/auth_config.py`.
|
|
250
|
+
Keep this wiring in `main.py`. Keep only the policy values in `src/lib/auth/auth_config.py`. Runtime security helpers for session-secret enforcement, safe public-file serving, production-safe error messages, and baseline response headers are package-owned by `casp.runtime_security`; keep the middleware attachment itself in `main.py`.
|
|
251
251
|
|
|
252
252
|
## Session Lifetime Rules
|
|
253
253
|
|
|
@@ -287,7 +287,7 @@ Because Starlette runs the last-added middleware first, the effective request or
|
|
|
287
287
|
|
|
288
288
|
Current behavior by layer:
|
|
289
289
|
|
|
290
|
-
- `SecurityHeadersMiddleware` can attach
|
|
290
|
+
- `SecurityHeadersMiddleware` can attach baseline response headers from `casp.runtime_security`, such as `X-Content-Type-Options`, framing policy, referrer policy, permissions policy, and production HSTS, while preserving any headers already set by the response. Do not assume this layer emits CSP or owns third-party browser resource allowlists; verify the installed package helper first.
|
|
291
291
|
- `SessionMiddleware` provides `request.session` for the rest of the stack.
|
|
292
292
|
- `CSRFMiddleware` ensures `request.session["csrf_token"]` exists and emits a scoped CSRF cookie based on `pp_csrf`, for example `pp_csrf_5091` in development or plain `pp_csrf` when no dev scope is active.
|
|
293
293
|
- `AuthMiddleware` sets request context with `Auth.set_request(request)`, initializes `StateManager`, runs provider callbacks, skips configured static asset paths, and enforces public, auth, private, and role-based route redirects.
|
|
@@ -816,6 +816,6 @@ If an AI agent is deciding how to handle auth in Caspian, apply these rules firs
|
|
|
816
816
|
- Keep auth secrets and OAuth provider credentials in `.env`.
|
|
817
817
|
- Set `AUTH_COOKIE_NAME` explicitly so the session middleware cookie name and auth settings stay aligned.
|
|
818
818
|
- Use `.venv/Lib/site-packages/casp/auth.py` only when the task is about framework auth internals or debugging installed behavior.
|
|
819
|
-
- Use `main.py` plus
|
|
819
|
+
- Use `main.py` plus `casp.runtime_security` when the task is about auth bootstrap, session middleware, safe public-file serving, response headers, or middleware execution order.
|
|
820
820
|
- Pair auth work with `fetch-data.md` for RPC forms and `validation.md` for credential validation.
|
|
821
821
|
- Check `routing.md` and `project-structure.md` before creating new auth routes or shared auth helpers.
|
|
@@ -29,7 +29,7 @@ Use it when you already know a behavior is controlled by `main.py` or `.venv/Lib
|
|
|
29
29
|
|
|
30
30
|
| Concern | Core file | Read first | Why it matters |
|
|
31
31
|
| --- | --- | --- | --- |
|
|
32
|
-
| App bootstrap and request flow | [main.py](../../../../main.py) plus
|
|
32
|
+
| App bootstrap and request flow | [main.py](../../../../main.py) plus imported runtime helpers such as `casp.runtime_security` | [project-structure.md](./project-structure.md), [routing.md](./routing.md), [auth.md](./auth.md) | FastAPI app creation, middleware wiring, route registration, cache check and save, exception handlers, and final HTML transforms live here. Package-owned helpers imported by `main.py` may own safe public-file serving, baseline non-CSP response headers, production-safe error messages, or production session-secret enforcement. |
|
|
33
33
|
| Browser runtime, SPA navigation, and scroll restoration | [public/js/pp-reactive-v2.js](../../../../public/js/pp-reactive-v2.js) | [pulsepoint.md](./pulsepoint.md), [fetch-data.md](./fetch-data.md) | The shipped `pp` runtime, same-origin SPA interception, per-history-entry scroll state, `pp-reset-scroll` behavior, and browser RPC helpers live here. |
|
|
34
34
|
|
|
35
35
|
Important current `main.py` behaviors AI should keep in mind:
|
|
@@ -38,9 +38,9 @@ Important current `main.py` behaviors AI should keep in mind:
|
|
|
38
38
|
- `register_single_route(...)` passes path params to `page()` as one positional dict, injects matching query params by name, and injects `request` by keyword when declared.
|
|
39
39
|
- The render pipeline is `transform_components(...)`, then `render_with_nested_layouts(...)`, then `transform_scripts(...)`.
|
|
40
40
|
- Route-level generators returned from `page()` are wrapped in `SSE(...)` before the response is sent.
|
|
41
|
-
- Safe public-file helpers
|
|
42
|
-
- Session middleware secrets may be resolved through
|
|
43
|
-
-
|
|
41
|
+
- Safe public-file helpers live in `casp.runtime_security` and should reject `..` traversal before serving from `public/**`.
|
|
42
|
+
- Session middleware secrets may be resolved through `casp.runtime_security` so production can fail fast when `AUTH_SECRET` is missing or still on a default placeholder.
|
|
43
|
+
- Baseline non-CSP response headers may be built by `casp.runtime_security` and attached through `SecurityHeadersMiddleware`. Do not assume that helper is a third-party browser resource or domain registry; check the current helper before adding CSP behavior.
|
|
44
44
|
- Middleware is added in source order as `RPCMiddleware`, `AuthMiddleware`, `CSRFMiddleware`, `SessionMiddleware`, `SecurityHeadersMiddleware`, so the effective request order is reversed at runtime.
|
|
45
45
|
- `public/js/pp-reactive-v2.js` saves scroll positions per history entry, resets window scroll on push navigation, and uses `pp-reset-scroll="true"` to opt specific containers or the whole body into reset behavior.
|
|
46
46
|
|
|
@@ -56,7 +56,7 @@ Use this table when the task names a framework feature but the owning file is no
|
|
|
56
56
|
| Metadata | route or layout `metadata`, runtime metadata helpers | `casp.layout`, `main.py` | [metadata.md](./metadata.md), [routing.md](./routing.md) |
|
|
57
57
|
| Component imports and `x-*` tags | `src/components/**`, `src/app/**/*.html` | `casp.components_compiler`, `casp.component_decorator` | [components.md](./components.md), [routing.md](./routing.md) |
|
|
58
58
|
| Auth and route protection | `src/lib/auth/auth_config.py`, `main.py`, route decorators | `casp.auth`, `main.py` middleware | [auth.md](./auth.md) |
|
|
59
|
-
|
|
|
59
|
+
| Baseline response headers and safe public-file serving | `main.py` imports from `casp.runtime_security` | `.venv/Lib/site-packages/casp/runtime_security.py` | [auth.md](./auth.md), [project-structure.md](./project-structure.md) |
|
|
60
60
|
| RPC and server actions | route or component Python modules with `@rpc()` | `casp.rpc`, `main.py` middleware | [fetch-data.md](./fetch-data.md), [file-uploads.md](./file-uploads.md) |
|
|
61
61
|
| Streaming | route `page()` generators, RPC generators | `casp.streaming`, `casp.rpc`, `main.py` | [fetch-data.md](./fetch-data.md) |
|
|
62
62
|
| Server state | request handlers and RPC actions | `casp.state_manager`, `main.py` middleware | [state.md](./state.md) |
|
|
@@ -89,8 +89,9 @@ Interactive CRUD page:
|
|
|
89
89
|
| Runtime file | Primary responsibility | Read these docs |
|
|
90
90
|
| --- | --- | --- |
|
|
91
91
|
| [.venv/Lib/site-packages/casp/layout.py](../../../../.venv/Lib/site-packages/casp/layout.py) | `render_page(...)`, `render_layout(...)`, nested layout discovery, metadata merge, and the synchronous `layout()` contract | [routing.md](./routing.md), [metadata.md](./metadata.md) |
|
|
92
|
-
| [.venv/Lib/site-packages/casp/auth.py](../../../../.venv/Lib/site-packages/casp/auth.py) | `AuthSettings`, route privacy checks, session payloads, OAuth providers, CSRF helper behavior, and redirect logic | [auth.md](./auth.md) |
|
|
93
|
-
| [.venv/Lib/site-packages/casp/
|
|
92
|
+
| [.venv/Lib/site-packages/casp/auth.py](../../../../.venv/Lib/site-packages/casp/auth.py) | `AuthSettings`, route privacy checks, session payloads, OAuth providers, CSRF helper behavior, and redirect logic | [auth.md](./auth.md) |
|
|
93
|
+
| [.venv/Lib/site-packages/casp/runtime_security.py](../../../../.venv/Lib/site-packages/casp/runtime_security.py) | safe public-file serving, baseline non-CSP response headers, production-safe error messages, and production session-secret enforcement used by `main.py` | [project-structure.md](./project-structure.md), [auth.md](./auth.md) |
|
|
94
|
+
| [.venv/Lib/site-packages/casp/rpc.py](../../../../.venv/Lib/site-packages/casp/rpc.py) | `@rpc()` registration, rate limits, request handling, auth-aware action checks, and streamed RPC responses | [fetch-data.md](./fetch-data.md) |
|
|
94
95
|
| [.venv/Lib/site-packages/casp/streaming.py](../../../../.venv/Lib/site-packages/casp/streaming.py) | `SSE`, `ServerSentEvent`, and generator-to-event-stream wrapping | [fetch-data.md](./fetch-data.md) |
|
|
95
96
|
| [.venv/Lib/site-packages/casp/state_manager.py](../../../../.venv/Lib/site-packages/casp/state_manager.py) | request-scoped state, session bucket persistence, listener lifecycle, and wire-request reset behavior | [state.md](./state.md) |
|
|
96
97
|
| [.venv/Lib/site-packages/casp/cache_handler.py](../../../../.venv/Lib/site-packages/casp/cache_handler.py) | `Cache`, cache manifest handling, filename generation, disk-backed HTML storage, and invalidation | [cache.md](./cache.md) |
|
|
@@ -110,7 +111,7 @@ Use these behavior checkpoints when AI needs the fastest verification path for a
|
|
|
110
111
|
|
|
111
112
|
| Runtime area | Verify these behaviors |
|
|
112
113
|
| --- | --- |
|
|
113
|
-
| `main.py` routing and request flow | route registration, path and query injection, static asset handling, session-middleware wiring,
|
|
114
|
+
| `main.py` routing and request flow | route registration, path and query injection, static asset handling, session-middleware wiring, response-header middleware, and exception rendering |
|
|
114
115
|
| `public/js/pp-reactive-v2.js` browser runtime | SPA interception, history-vs-push scroll behavior, `pp-reset-scroll` semantics, and browser-side `pp.rpc()` behavior |
|
|
115
116
|
| `casp.auth` | auth settings, signin and signout flow, provider wiring, and page protection behavior |
|
|
116
117
|
| `casp.rpc` and streamed RPC responses | middleware interception, CSRF and session expectations, registry behavior, and helper-level RPC contracts |
|
|
@@ -80,10 +80,10 @@ my-app/
|
|
|
80
80
|
mcp/
|
|
81
81
|
fastmcp.json
|
|
82
82
|
mcp_server.py
|
|
83
|
-
prisma/
|
|
84
|
-
__init__.py
|
|
85
|
-
db.py
|
|
86
|
-
models.py
|
|
83
|
+
prisma/
|
|
84
|
+
__init__.py
|
|
85
|
+
db.py
|
|
86
|
+
models.py
|
|
87
87
|
.venv/
|
|
88
88
|
Lib/
|
|
89
89
|
site-packages/
|
|
@@ -130,7 +130,7 @@ For component HTML files, follow the component authoring rules in [components.md
|
|
|
130
130
|
|
|
131
131
|
The directories listed in `componentScanDirs` determine where component tooling scans. When that list includes `src/`, `src/components/` is a conventionally clean location, not a hard-coded runtime requirement.
|
|
132
132
|
|
|
133
|
-
### `src/lib/`
|
|
133
|
+
### `src/lib/`
|
|
134
134
|
|
|
135
135
|
Use this folder for shared helpers, reusable validators, RPC-facing service wrappers, data-access helpers, formatting utilities, and other app-level support code that is not itself a reusable rendered component.
|
|
136
136
|
|
|
@@ -140,7 +140,9 @@ For file upload and manager flows, keep route-owned `@rpc()` actions in `src/app
|
|
|
140
140
|
|
|
141
141
|
When a project includes an app-owned Python database layer under `src/lib/prisma/`, reuse that package for Python-side data access and keep any additional shared database helpers in `src/lib/`.
|
|
142
142
|
|
|
143
|
-
When MCP is enabled for the project, this folder also contains the app-owned FastMCP server under `src/lib/mcp/`.
|
|
143
|
+
When MCP is enabled for the project, this folder also contains the app-owned FastMCP server under `src/lib/mcp/`.
|
|
144
|
+
|
|
145
|
+
Do not add `src/lib/security/runtime_security.py` for normal app work. Runtime security helpers for safe public-file serving, production session-secret enforcement, production-safe error messages, and baseline non-CSP response headers are package-owned by `casp.runtime_security`.
|
|
144
146
|
|
|
145
147
|
### Shared Database Helpers
|
|
146
148
|
|
|
@@ -192,20 +194,24 @@ In the current Caspian app shape, this file is where startup wiring happens:
|
|
|
192
194
|
- register OAuth providers with `Auth.set_providers(...)`
|
|
193
195
|
- create the FastAPI app
|
|
194
196
|
- register routes and RPC handlers
|
|
195
|
-
- add
|
|
197
|
+
- add response headers middleware, `SessionMiddleware`, CSRF middleware, auth middleware, and RPC middleware
|
|
196
198
|
|
|
197
199
|
Use `main.py` for auth bootstrap and middleware-order changes. Use `src/lib/auth/auth_config.py` for auth policy values such as public routes, redirects, and RBAC maps.
|
|
198
200
|
|
|
199
|
-
###
|
|
201
|
+
### `.venv/Lib/site-packages/casp/runtime_security.py`
|
|
202
|
+
|
|
203
|
+
The installed Caspian package owns runtime security helpers that `main.py` can import as `casp.runtime_security`. Keep this file in the package instead of copying it into `src/lib/`, because normal app users should not need to edit it.
|
|
200
204
|
|
|
201
|
-
|
|
205
|
+
This helper is not a registry for third-party browser resources. Do not add Google, YouTube, CDN, image-host, API, or iframe origins here just because the browser or server uses them. If an app later chooses to enforce a Content Security Policy, document and implement that as an explicit project policy rather than assuming `runtime_security.py` owns a domain allowlist.
|
|
202
206
|
|
|
203
|
-
Use this module when the task is about:
|
|
207
|
+
Use this package module when the task is about:
|
|
204
208
|
|
|
205
209
|
- safe serving of files from `public/**`
|
|
206
|
-
- browser security headers or content-security-policy defaults
|
|
207
210
|
- production session-secret enforcement
|
|
208
211
|
- user-facing vs production-safe exception messaging helpers
|
|
212
|
+
- baseline response headers such as permissions, referrer, MIME sniffing, framing, or HSTS behavior
|
|
213
|
+
|
|
214
|
+
Because this file is framework-owned, edit it only for Caspian runtime work or when documentation must match the installed package. App-specific auth policy still belongs in `src/lib/auth/auth_config.py`, and app-specific upload or storage behavior should live in route-owned code or other `src/lib/**` helpers.
|
|
209
215
|
|
|
210
216
|
### `caspian.config.json`
|
|
211
217
|
|
package/dist/docs/pulsepoint.md
CHANGED
|
@@ -7,9 +7,9 @@ related:
|
|
|
7
7
|
links:
|
|
8
8
|
- /docs/components
|
|
9
9
|
- /docs/routing
|
|
10
|
-
- /docs/fetch-data
|
|
11
|
-
- /docs/pulsepoint-runtime-map
|
|
12
|
-
- /docs/core-runtime-map
|
|
10
|
+
- /docs/fetch-data
|
|
11
|
+
- /docs/pulsepoint-runtime-map
|
|
12
|
+
- /docs/core-runtime-map
|
|
13
13
|
- /docs/project-structure
|
|
14
14
|
- /docs/index
|
|
15
15
|
---
|
|
@@ -44,9 +44,9 @@ Important current facts:
|
|
|
44
44
|
|
|
45
45
|
If docs, generated examples, or older notes disagree with `public/js/pp-reactive-v2.js` plus `main.py`, follow the code that actually runs.
|
|
46
46
|
|
|
47
|
-
Use [core-runtime-map.md](./core-runtime-map.md) when the controlling runtime file is not obvious yet.
|
|
48
|
-
|
|
49
|
-
Use [pulsepoint-runtime-map.md](./pulsepoint-runtime-map.md) when the task names a specific PulsePoint feature or directive and you need a quick feature-to-runtime lookup before reading the full guide.
|
|
47
|
+
Use [core-runtime-map.md](./core-runtime-map.md) when the controlling runtime file is not obvious yet.
|
|
48
|
+
|
|
49
|
+
Use [pulsepoint-runtime-map.md](./pulsepoint-runtime-map.md) when the task names a specific PulsePoint feature or directive and you need a quick feature-to-runtime lookup before reading the full guide.
|
|
50
50
|
|
|
51
51
|
## Default Frontend Rule
|
|
52
52
|
|