From a7c6f5bd413d80cff0572990e7bbc4947a75ece2 Mon Sep 17 00:00:00 2001 From: witbrock Date: Sat, 12 Sep 2026 22:46:33 -0400 Subject: [PATCH 1/4] Add device-bound Web Push candidate for direct messages (JVNAUTOSCI-2757) --- docs/design_index.md | 4 + docs/engineering/mobile_web_push.md | 172 ++++++ pdm.lock | 45 +- pyproject.toml | 1 + src/backend/server/routes/auth_routes.py | 9 + src/backend/server/routes/web_push_routes.py | 246 +++++++++ src/backend/server/utils_flask.py | 9 + src/backend/services/web_push_service.py | 520 ++++++++++++++++++ .../web/von_interface/static/js/main.js | 7 + .../static/js/pushNotifications.js | 158 ++++++ .../web/von_interface/static/pwa-icon-192.png | Bin 0 -> 30015 bytes .../web/von_interface/static/pwa-icon-512.png | Bin 0 -> 271876 bytes .../von_interface/static/service-worker.js | 97 ++++ .../von_interface/templates/settings_tab.html | 22 + .../templates/von_interface.html | 3 + tests/backend/test_web_push.py | 447 +++++++++++++++ tests/browser/webPushFixture.py | 125 +++++ tests/browser/webPushSmoke.cjs | 64 +++ tests/frontend/pushNotifications.test.js | 96 ++++ tests/frontend/pushServiceWorker.test.js | 79 +++ 20 files changed, 2103 insertions(+), 1 deletion(-) create mode 100644 docs/engineering/mobile_web_push.md create mode 100644 src/backend/server/routes/web_push_routes.py create mode 100644 src/backend/services/web_push_service.py create mode 100644 src/frontend/web/von_interface/static/js/pushNotifications.js create mode 100644 src/frontend/web/von_interface/static/pwa-icon-192.png create mode 100644 src/frontend/web/von_interface/static/pwa-icon-512.png create mode 100644 src/frontend/web/von_interface/static/service-worker.js create mode 100644 tests/backend/test_web_push.py create mode 100644 tests/browser/webPushFixture.py create mode 100644 tests/browser/webPushSmoke.cjs create mode 100644 tests/frontend/pushNotifications.test.js create mode 100644 tests/frontend/pushServiceWorker.test.js diff --git a/docs/design_index.md b/docs/design_index.md index 955b514ee..c104fd41d 100644 --- a/docs/design_index.md +++ b/docs/design_index.md @@ -160,6 +160,10 @@ human acceptance and promotion into a current public authority surface. ## 7. Dated snapshots, diagnostics, and proposals +- [Mobile Web Push candidate and operator handoff](engineering/mobile_web_push.md) + records the bounded JVNAUTOSCI-2757 implementation and unfulfilled browser + transport acceptance; it does not establish a deployed notification service. + These files retain evidence and rationale, but must not drive current task ordering or implementation without live revalidation: diff --git a/docs/engineering/mobile_web_push.md b/docs/engineering/mobile_web_push.md new file mode 100644 index 000000000..4823dd5f7 --- /dev/null +++ b/docs/engineering/mobile_web_push.md @@ -0,0 +1,172 @@ +# Mobile Web Push — JVNAUTOSCI-2757 + +- **Kind:** Bounded implementation and operator handoff +- **Lifecycle:** Candidate; not accepted or deployed +- **Owner:** Von maintainers, for Michael Witbrock +- **Scope:** Direct-message notification opt-in for one actor/organisation context + per app installation; multiple devices enrol independently +- **Review trigger:** Delivery acceptance, supported browser/provider changes, + authentication changes, or service-worker work in JVNAUTOSCI-2758 +- **Decision surface:** [JVNAUTOSCI-2757](https://naoinstitute.atlassian.net/browse/JVNAUTOSCI-2757) + +## Capability and boundary + +Settings → Conversations offers Enable, a once-per-minute test, Refresh status, +and device-wide Disable. Browser permission is requested only by Enable. +Unsupported and uninstalled iOS cases explain what is needed. Denied/dismissed +permission does not cause another automatic prompt. Lost worker state requires +an explicit reconnect. An existing confirmed opt-in renews on a Settings visit; +unvisited subscriptions expire after 30 days. + +The manifest uses the existing Von artwork. The service worker handles push and +clicks only; it neither caches authenticated responses nor intercepts fetches. +Coordinate `/von/service-worker.js`, `/von/manifest.webmanifest`, and manifest +links with the independent PWA task before merging either candidate. + +Canonical direct messages remain the source of truth. A separate leased sender +reads recipient-scoped message concepts, including coding-agent messages, without +depending on workflow launch or invoking a model. Notifications concern messages +created since opt-in and within the past day. Read messages are skipped. A +recipient/organisation/date index supports the bounded scan, and an indexed +anti-join against terminal receipts handles late canonical inserts without +repeating completed deliveries. There is no second task-event alert source. + +Subscriptions and navigation receipts are derived transactional records in +`web_push_subscriptions` and `web_push_receipts`. Endpoints and browser keys are +encrypted with the existing token-encryption helper. Receipt URLs and notification +tags are opaque, contain no sender/recipient identifiers or message text, and +expire after seven days. Lock-screen text is always generic; richer previews are +outside this delivery. + +Browser actor identity comes from the authenticated, assurance-checked server +session. A signed HttpOnly SameSite device cookie scopes enrolment/revocation. +The existing actor-bound window context supplies the organisation, with a live +membership check. A challenge sent exclusively through the proposed endpoint +must return from the same signed-in device before activation. JSON mutation +requests require the same Origin. Provider URL restrictions and disabled HTTP +redirects prevent a submitted endpoint from granting arbitrary server requests. +Supported providers are FCM, Mozilla's production push endpoint, and Apple's +`*.push.apple.com` endpoints. + +Each enrolment has a fresh generation, preventing queued pushes from an earlier +account or scope from matching a reused endpoint. The service worker rechecks +the live actor/device/generation before display. Logout revokes the server record +before clearing authentication; a storage failure leaves logout visibly +unfinished for retry. Browser cleanup also unsubscribes and closes notifications. +Current organisation membership and canonical message access are rechecked on +click. Only the same-origin `/von/?notification=OPAQUE_RECEIPT` route can open. + +**Delivery limits:** validating the current session requires a working connection +to Von at receipt time. Offline, expired-login, or unavailable-origin deliveries +may be missed; WebKit may revoke subscriptions that repeatedly cannot display. +The app exposes re-enrolment and retains canonical messages. In-flight OS alerts +and system notification history cannot be recalled reliably. This limitation +needs evaluation on the actual supported device before acceptance. + +Provider requests have a ten-second transport timeout and a 60-second provider +TTL. Three attempts maximum are counted durably before I/O, with one/two-minute +retry delays. A 120-second lease permits recovery after process death. A stable +provider Topic and notification tag, plus worker receipt memory, suppress repeat +alerts; this does not claim exactly-once OS delivery. Provider acceptance is +recorded separately from display. Permanent 404/410 responses retire endpoints. + +## Protected configuration and rollback + +The operator must provide these through the existing protected runtime +configuration; do not copy them into the checkout, browser evidence or logs: + +- `VON_WEB_PUSH_PRIVATE_KEY`: base64url VAPID EC private key in the format accepted + by `pywebpush`, or an operator-protected PEM path. +- `VON_WEB_PUSH_PUBLIC_KEY`: matching base64url uncompressed P-256 public key. +- `VON_WEB_PUSH_SUBJECT`: VAPID contact URI (`mailto:` or HTTPS). +- `VON_WEB_PUSH_ENCRYPTION_KEY`: dedicated Fernet key for subscription storage. + +The worker starts only with complete configuration. Missing configuration leaves +the UI explicitly unavailable. Startup failure is logged without subscription +material. PDM installs the locked `pywebpush` dependency. New indexes and TTL +collections are created at sender startup; there is no rewrite of existing +concept meaning, migration database, or user membership. + +Keep the encryption/VAPID keys across code rollback. Stop the candidate sender +by reverting to the previous coherent release or removing its configuration and +restarting through the controller. Retain the encrypted derived stores for +recovery; do not delete canonical messages. The worker has no fetch interception, +and after rollback its missing validation endpoint prevents further notification +display. Before rotating either key, disable enrolments through the service and +require fresh opt-in; replacing the encryption key alone makes old subscriptions +unreadable. The controller's code rollback is not key/configuration rollback. + +## Evidence and remaining operator work + +The candidate has targeted backend tests for challenge binding, foreign +actor/device/scope denial, canonical coding reports with suppressed workflow +launch, delayed insertion, duplicate/retry/crash handling, opt-out, expiry, +membership removal, logout and access-checked navigation. Frontend tests exercise +the actual worker handler and Settings module. Synthetic worker events in unit +tests do not establish a real push or OS notification display. + +The disposable transport fixture is reproducible with: + +```sh +pdm run python tests/browser/webPushFixture.py +PLAYWRIGHT_BROWSERS_PATH=/tmp/von-playwright node tests/browser/webPushSmoke.cjs +``` + +It uses generated in-memory keys, an in-memory database, synthetic authenticated +actors and the candidate's actual API, Settings section and service-worker file. +It does not read live configuration or call a model. Stop the fixture after use. +For a prepared isolated display the runner accepts `VON_PUSH_HEADED=1`. + +On 12 September 2026, Chromium 153.0.8010.12, Linux ARM64, an ordinary headless +390×844 tab registered the real worker and rendered the denied state correctly. +`Notification.permission` was `denied` while the injected Permissions API state +was `granted`; the real `PushManager.subscribe` call returned +`AbortError: Registration failed - permission denied`. No subscription, provider +send, installed app, background/closed-app alert, or device display was verified. +Evidence is retained in `.run/web-push-smoke/receipt.json` and `controls.png` in the +task worktree. An isolated headed attempt failed because the retained Xvfb binary +crashed starting display `:97`; no other task's display/profiles were repurposed. + +**Merge decision: not ready.** The task requires an actual supported push path; +the available browser transport has not provided one. Unit tests and registration +do not satisfy that criterion. Source publication must preserve this boundary. + +Bounded operator preparation needed under the existing task authority: + +1. Prepare a dedicated notification browser bridge bound to this task worktree + and its current candidate SHA, with separate synthetic Alice/Bob sessions and + an isolated disposable database. Use + `/home/mjw/.codex-von-worker/studio-browser/README.md`; the listed retained + profiles belong to other tasks. Place bridge requests/receipts under this + worktree's `.run/notification-browser/`; allocate unused localhost ports and + verify roots, SHA and actor scopes through health/auth read-back. +2. Supply an isolated working headed display and a browser/profile supporting + actual Web Push. Keep test VAPID/encryption keys outside the coding checkout; + permit its normal provider transport. Browser fixture login must preserve + real memberships and must not enrol real users for synthetic tests. +3. Demonstrate the normal authenticated opt-in/challenge, a canonically created + recipient message and actual background notification, click, test and disable. + Recheck unrelated-account denial and queued delivery after logout. Record OS, + browser, installed/tab state and real provider method. Android and iOS physical + evidence remains unavailable here; distinguish available-platform acceptance + from those phone results. +4. Repair Jira connector authentication or have the coordinating operator update + the engineering decision surface; the worker's read returned an invalid-grant + reauthentication error. Do not mark the task delivered during this handoff. +5. Once acceptance supports merge, complete CI/merge, verify `origin/main`, then + request the exact merged SHA through the controller. Verify protected runtime + configuration, actual sender activation, HTTPS manifest/service-worker paths, + public served revision and the installed-app path. No deployment was performed + or requested by this unfinished candidate. + +## Platform sources checked + +- [WebKit: Web Push for Home Screen apps on iOS/iPadOS](https://webkit.org/blog/13878/web-push-for-web-apps-on-ios-and-ipados/) + documents the installation and user-gesture permission requirements. +- [WebKit: Declarative Web Push](https://webkit.org/blog/16535/meet-declarative-web-push/) + describes a newer backward-compatible route. This candidate retains the + standard service-worker path because it needs live revocation checks; it does + not claim declarative offline delivery. +- [MDN Push API](https://developer.mozilla.org/en-US/docs/Web/API/Push_API) + and [pywebpush's implementation](https://github.com/web-push-libs/pywebpush) + describe browser subscriptions and encrypted provider transport. diff --git a/pdm.lock b/pdm.lock index f03ed0924..d3bbfd398 100644 --- a/pdm.lock +++ b/pdm.lock @@ -14,7 +14,7 @@ requires-python = ">=3.11" sources = [] [metadata.lock_inputs.project.groups] -default = ["Jinja2", "MarkupSafe", "PyYAML", "Pygments", "SPARQLWrapper", "Werkzeug", "Whoosh", "annotated-types", "anyio", "asttokens", "beautifulsoup4", "beautifulsoup4", "bibtexparser", "black", "bleach", "blinker", "boto3", "cachetools", "certifi", "charset-normalizer", "click", "colorama", "comm", "cryptography", "customtkinter", "darkdetect", "datetime", "debugpy", "decorator", "distro", "docutils", "exceptiongroup", "executing", "extract-msg", "fastapi", "feedparser", "flask", "flask-testing", "gcloud", "google-api-core", "google-api-python-client", "google-auth", "google-auth-httplib2", "google-auth-oauthlib", "google-genai", "googleapis-common-protos", "h11", "httpcore", "httplib2", "httpx", "idna", "ipykernel", "ipython", "itsdangerous", "jedi", "jupyter-client", "jupyter-core", "latexcodec", "llama-index", "markdown", "matplotlib-inline", "mcp", "mypy-extensions", "nest-asyncio", "node", "npm", "numpy", "oauth2client", "oauthlib", "odfpy", "odict", "ollama", "openai", "opencv-python-headless", "openpyxl", "openstacksdk", "optional-django", "packaging", "pandas", "parso", "pathspec", "pdfminer-six", "pillow", "platformdirs", "plumber", "prompt-toolkit", "proto-plus", "psutil", "pure-eval", "pyasn1", "pyasn1-modules", "pybtex", "pybtex-apa7-style", "pybtex-docutils", "pydantic", "pydantic-core", "pymongo", "pymupdf", "pyparsing", "pysimplegui", "pytesseract", "python-dateutil", "python-docx", "python-dotenv", "python-pptx", "pytz", "pywin32; platform_system == \"Windows\"", "pyzmq", "rdflib", "requests", "requests-oauthlib", "rsa", "setuptools", "six", "slack-bolt", "sniffio", "stack-data", "striprtf", "tavily-python", "tokenize-rt", "tornado", "tqdm", "traitlets", "typing-extensions", "tzdata", "uritemplate", "urllib3", "uv", "uvicorn", "waitress", "wcwidth", "zope-component", "zope-deferredimport", "zope-deprecation", "zope-event", "zope-hookable", "zope-interface", "zope-lifecycleevent", "zope-proxy"] +default = ["Jinja2", "MarkupSafe", "PyYAML", "Pygments", "SPARQLWrapper", "Werkzeug", "Whoosh", "annotated-types", "anyio", "asttokens", "beautifulsoup4", "beautifulsoup4", "bibtexparser", "black", "bleach", "blinker", "boto3", "cachetools", "certifi", "charset-normalizer", "click", "colorama", "comm", "cryptography", "customtkinter", "darkdetect", "datetime", "debugpy", "decorator", "distro", "docutils", "exceptiongroup", "executing", "extract-msg", "fastapi", "feedparser", "flask", "flask-testing", "gcloud", "google-api-core", "google-api-python-client", "google-auth", "google-auth-httplib2", "google-auth-oauthlib", "google-genai", "googleapis-common-protos", "h11", "httpcore", "httplib2", "httpx", "idna", "ipykernel", "ipython", "itsdangerous", "jedi", "jupyter-client", "jupyter-core", "latexcodec", "llama-index", "markdown", "matplotlib-inline", "mcp", "mypy-extensions", "nest-asyncio", "node", "npm", "numpy", "oauth2client", "oauthlib", "odfpy", "odict", "ollama", "openai", "opencv-python-headless", "openpyxl", "openstacksdk", "optional-django", "packaging", "pandas", "parso", "pathspec", "pdfminer-six", "pillow", "platformdirs", "plumber", "prompt-toolkit", "proto-plus", "psutil", "pure-eval", "pyasn1", "pyasn1-modules", "pybtex", "pybtex-apa7-style", "pybtex-docutils", "pydantic", "pydantic-core", "pymongo", "pymupdf", "pyparsing", "pysimplegui", "pytesseract", "python-dateutil", "python-docx", "python-dotenv", "python-pptx", "pytz", "pywebpush", "pywin32; platform_system == \"Windows\"", "pyzmq", "rdflib", "requests", "requests-oauthlib", "rsa", "setuptools", "six", "slack-bolt", "sniffio", "stack-data", "striprtf", "tavily-python", "tokenize-rt", "tornado", "tqdm", "traitlets", "typing-extensions", "tzdata", "uritemplate", "urllib3", "uv", "uvicorn", "waitress", "wcwidth", "zope-component", "zope-deferredimport", "zope-deprecation", "zope-event", "zope-hookable", "zope-interface", "zope-lifecycleevent", "zope-proxy"] dev = ["annotated-types", "anyio", "blinker", "mongomock", "pymongo", "pyright", "pytest", "pytest-asyncio", "pytest-cov", "pytest-mock", "ruff"] geo = ["geopandas", "pyogrio", "pyproj", "shapely"] @@ -1774,6 +1774,18 @@ files = [ {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] +[[package]] +name = "http-ece" +version = "1.2.1" +summary = "Encrypted Content Encoding for HTTP" +groups = ["default"] +dependencies = [ + "cryptography>=2.5", +] +files = [ + {file = "http_ece-1.2.1.tar.gz", hash = "sha256:8c6ab23116bbf6affda894acfd5f2ca0fb8facbcbb72121c11c75c33e7ce8cff"}, +] + [[package]] name = "httpcore" version = "1.0.9" @@ -3574,6 +3586,19 @@ files = [ {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, ] +[[package]] +name = "py-vapid" +version = "1.9.4" +summary = "Simple VAPID header generation library" +groups = ["default"] +dependencies = [ + "cryptography>=46", +] +files = [ + {file = "py_vapid-1.9.4-py2.py3-none-any.whl", hash = "sha256:f165a5bf90dcf966b226114f01f178f137579a09784c7f0628fa2f0a299741b6"}, + {file = "py_vapid-1.9.4.tar.gz", hash = "sha256:a004023560cbc54e34fc06380a0580f04ffcc788e84fb6d19e9339eeb6551a28"}, +] + [[package]] name = "pyasn1" version = "0.6.4" @@ -4235,6 +4260,24 @@ files = [ {file = "pytz-2026.3.post1.tar.gz", hash = "sha256:2211d3fcf9a797d3405cac96ac7f61d80e6a644f72a3309607282fe8a2010c5d"}, ] +[[package]] +name = "pywebpush" +version = "2.5.0" +requires_python = ">=3.10" +summary = "WebPush publication library" +groups = ["default"] +dependencies = [ + "aiohttp", + "cryptography>=47.0.0", + "http-ece>=1.1.0", + "py-vapid>=1.7.0", + "requests>=2.21.0", +] +files = [ + {file = "pywebpush-2.5.0-py3-none-any.whl", hash = "sha256:b5f5d45024223a04e73fe17f7a8e62540f35bbcc62b49e64d0a1080ff2dc26f2"}, + {file = "pywebpush-2.5.0.tar.gz", hash = "sha256:8260f8e42d70ed95a3bd00527ffcb43b5b3df8983a4a48b059fe29b06dc3d92c"}, +] + [[package]] name = "pywin32" version = "312" diff --git a/pyproject.toml b/pyproject.toml index 021e9e5fe..1d8b04dc8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -151,6 +151,7 @@ dependencies = [ "beautifulsoup4>=4.12.3", "extract-msg>=0.48.7", "boto3>=1.40.0", + "pywebpush<3,>=2.0.3", ] [build-system] diff --git a/src/backend/server/routes/auth_routes.py b/src/backend/server/routes/auth_routes.py index d928b3ba9..ed1e2fc34 100644 --- a/src/backend/server/routes/auth_routes.py +++ b/src/backend/server/routes/auth_routes.py @@ -77,6 +77,9 @@ def _clear_scope_if_authenticated_identity_changes( session.get(key) is not None for key in _ACTOR_SCOPE_SESSION_KEYS ) if (had_previous_identity and not same_actor) or has_stale_scope_without_identity: + from .web_push_routes import revoke_browser_notifications + + revoke_browser_notifications() for key in _ACTOR_SCOPE_SESSION_KEYS: session.pop(key, None) @@ -630,6 +633,12 @@ def browser_test_login(): @auth_bp.route("/api/auth/logout", methods=["POST"]) def logout(): """Log out the current user by clearing their session.""" + from .web_push_routes import revoke_browser_notifications + + try: + revoke_browser_notifications() + except Exception: + return jsonify(error="Notification opt-out unavailable; retry logout"), 503 cloudflare_logout = session.get("auth_provider") == "cloudflare_access" user_email = session.get("user_email") user_id = ( diff --git a/src/backend/server/routes/web_push_routes.py b/src/backend/server/routes/web_push_routes.py new file mode 100644 index 000000000..57b89921d --- /dev/null +++ b/src/backend/server/routes/web_push_routes.py @@ -0,0 +1,246 @@ +"""Interactive, session-authenticated notification controls; no caller actor IDs.""" + +import secrets +from urllib.parse import urlsplit + +from flask import Blueprint, current_app, jsonify, request, session, send_from_directory +from itsdangerous import BadSignature, URLSafeSerializer + +from ...security.authentication_assurance import ( + session_has_required_authentication_assurance, +) +from ...services import web_push_service as push + +web_push_bp = Blueprint("web_push", __name__) +COOKIE = "von_push_device" + + +def device_id(): + raw = request.cookies.get(COOKIE) + if not raw: + return None + try: + value = URLSafeSerializer(current_app.secret_key, salt=COOKIE).loads(raw) + return value if isinstance(value, str) and len(value) == 64 else None + except BadSignature: + return None + + +def revoke_browser_notifications(): + """Used before logout/account replacement. Failure must remain observable.""" + device = device_id() + if device: + push.revoke_device(device) + + +def actor_id(): + actor = session.get("user_concept_id") + if ( + session.get("user_email") + and isinstance(actor, str) + and session_has_required_authentication_assurance(session) + ): + return actor + return None + + +@web_push_bp.before_request +def protect_controls(): + if not request.path.startswith("/api/notifications"): + return None + if not actor_id(): + return jsonify(error="Sign in to manage notifications"), 401 + if request.method != "GET": + if request.content_length and request.content_length > 8192: + return jsonify(error="Subscription payload too large"), 413 + origin = request.headers.get("Origin") + expected = urlsplit(request.host_url) + actual = urlsplit(origin or "") + if (actual.scheme, actual.netloc) != (expected.scheme, expected.netloc): + return jsonify(error="Same-origin request required"), 403 + if not request.is_json: + return jsonify(error="JSON required"), 415 + return None + + +@web_push_bp.after_request +def no_cache(response): + response.headers["Cache-Control"] = "no-store" + return response + + +@web_push_bp.errorhandler(Exception) +def unavailable(exc): + # Provider and database exceptions can contain endpoint credentials. + if isinstance(exc, PermissionError): + return jsonify(error=str(exc)), 403 + if isinstance(exc, ValueError): + return jsonify(error=str(exc)), 400 + current_app.logger.warning("Notification operation unavailable") + return jsonify(error="Notifications unavailable; try again later"), 503 + + +def scope(): + from .message_routes import _get_current_org_concept_id + + organisation = _get_current_org_concept_id(actor_id(), require_known_window=True) + if not push.scope_allowed(actor_id(), organisation): + raise PermissionError("Organisation access required") + return organisation + + +@web_push_bp.get("/api/notifications/status") +def status(): + config = push.configuration() + if not config["configured"]: + return jsonify(**config, state="unavailable") + device = device_id() or secrets.token_hex(32) + response = jsonify(**config, **push.status(actor_id(), device, scope())) + response.set_cookie( + COOKIE, + URLSafeSerializer(current_app.secret_key, salt=COOKIE).dumps(device), + secure=request.is_secure, + httponly=True, + samesite="Strict", + max_age=365 * 86400, + path="/", + ) + return response + + +@web_push_bp.post("/api/notifications/subscribe") +def subscribe(): + if not push.configuration()["configured"] or not device_id(): + return jsonify(error="Refresh notification status first"), 409 + payload = request.get_json() or {} + return jsonify( + push.subscribe(actor_id(), device_id(), scope(), payload.get("subscription")) + ) + + +@web_push_bp.post("/api/notifications/confirm") +def confirm(): + payload = request.get_json() or {} + identifier, challenge = payload.get("id"), payload.get("challenge") + if ( + not isinstance(identifier, str) + or not isinstance(challenge, str) + or len(challenge) > 128 + ): + raise ValueError("Invalid confirmation") + if not push.confirm(actor_id(), device_id(), identifier, challenge): + return jsonify(error="Confirmation expired or belongs to another device"), 403 + return jsonify(state="active") + + +@web_push_bp.post("/api/notifications/disable") +def disable(): + # Device-wide opt-out also covers prior actor/scope records. The signed + # HttpOnly device cookie is the authority, never a supplied endpoint. + revoke_browser_notifications() + return jsonify(state="disabled") + + +@web_push_bp.post("/api/notifications/test") +def test(): + payload = request.get_json() or {} + identifier = payload.get("id") + if not isinstance(identifier, str): + raise ValueError("Invalid subscription") + return jsonify(push.test_notification(actor_id(), device_id(), identifier)) + + +@web_push_bp.post("/api/notifications/validate") +def validate_delivery(): + payload = request.get_json() or {} + identifier = payload.get("id") + generation = payload.get("generation") + if not isinstance(identifier, str) or not isinstance(generation, str): + raise ValueError("Invalid subscription") + row = push.collection().find_one( + { + "_id": identifier, + "actor": actor_id(), + "device": device_id(), + "state": "active", + "generation": generation, + "expires_at": {"$gt": push.now()}, + } + ) + if not row or not push.scope_allowed(actor_id(), row["organisation"]): + return jsonify(error="Notification subscription no longer active"), 403 + return jsonify(active=True) + + +@web_push_bp.get("/api/notifications/open/") +def open_message(receipt_id): + from ...services.message_service import ( + get_message_for_user, + PREDICATE_RECIPIENT, + PREDICATE_SENDER, + ) + from ...services.message_catalogue_service import exchange_id + from ...security.access_control import override_current_actor + + actor = actor_id() + receipt = push.collection(push.RECEIPTS).find_one( + { + "_id": receipt_id, + "actor": actor, + "expires_at": {"$gt": push.now()}, + } + ) + if not receipt or not push.scope_allowed(actor, receipt["organisation"]): + return jsonify(error="Message unavailable for this account"), 404 + with override_current_actor(actor, receipt["organisation"]): + message = get_message_for_user(receipt["message_id"], actor) + if ( + not message + or message.get("concept_data", {}).get("deleted") + or actor not in message.get("relationships", {}).get(PREDICATE_RECIPIENT, []) + ): + return jsonify(error="Message unavailable for this account"), 404 + rel = message["relationships"] + participants = sorted( + set(rel.get(PREDICATE_SENDER, []) + rel.get(PREDICATE_RECIPIENT, [])) + ) + return jsonify( + session_id=exchange_id(participants, receipt["organisation"]), + source_kind="message_exchange", + participant_ids=participants, + other_participant_ids=[p for p in participants if p != actor], + viewer_id=actor, + organisation_concept_id=receipt["organisation"], + session_name="Von messages", + last_message_id=message["concept_id"], + ) + + +@web_push_bp.get("/von/service-worker.js") +def service_worker(): + response = send_from_directory(current_app.static_folder, "service-worker.js") + response.headers["Service-Worker-Allowed"] = "/von/" + return response + + +@web_push_bp.get("/von/manifest.webmanifest") +def manifest(): + return jsonify( + id="/von/", + name="Von", + short_name="Von", + start_url="/von/", + scope="/von/", + display="standalone", + background_color="#ffffff", + theme_color="#245e47", + icons=[ + { + "src": f"/static/pwa-icon-{size}.png", + "sizes": f"{size}x{size}", + "type": "image/png", + "purpose": "any", + } + for size in (192, 512) + ], + ) diff --git a/src/backend/server/utils_flask.py b/src/backend/server/utils_flask.py index 00de485a5..144673bb3 100644 --- a/src/backend/server/utils_flask.py +++ b/src/backend/server/utils_flask.py @@ -1582,6 +1582,12 @@ def create_flask_app( _bootstrap_constitutive_relation_requirements_for_startup(app) _configure_durable_workflow_startup(app) _maybe_start_external_conversation_import_worker(app) + from ..services.web_push_service import start_worker as start_web_push_worker + + try: + start_web_push_worker() + except Exception: + app.logger.warning("Web Push startup unavailable; canonical messaging is unaffected") _maybe_start_chat_prompt_queue_dispatcher(app) _log_prompt_concept_health(app) @@ -2605,6 +2611,9 @@ def _register_default_blueprints(app: Flask) -> None: app.register_blueprint(admin_bp, url_prefix="/admin") app.register_blueprint(task_bp, url_prefix="/api/tasks") app.register_blueprint(message_bp, url_prefix="/api/messages") + from .routes.web_push_routes import web_push_bp + + app.register_blueprint(web_push_bp) app.register_blueprint(ontology_authority_bp) app.register_blueprint(auth_bp, url_prefix="/von") app.register_blueprint(agent_gmail_oauth_bp, url_prefix="/von") diff --git a/src/backend/services/web_push_service.py b/src/backend/services/web_push_service.py new file mode 100644 index 000000000..f5f2f5e35 --- /dev/null +++ b/src/backend/services/web_push_service.py @@ -0,0 +1,520 @@ +"""Device-bound Web Push delivery from durable canonical direct messages. + +This is a derived delivery store, not Vontology authority. Message creation never +depends on push or launches a model. Leased subscriptions and durable receipts +keep retries bounded, reusing the opaque notification tag/navigation ID. +""" + +from __future__ import annotations + +import base64 +import hashlib +import json +import logging +import os +import secrets +import threading +from datetime import datetime, timedelta, timezone +from urllib.parse import urlsplit + +import requests +from cryptography.hazmat.primitives.asymmetric import ec +from pymongo import ReturnDocument +from pymongo.errors import DuplicateKeyError + +from ..db.mongo_client import get_db, get_concepts_collection +from ..security.token_encryption import encrypt_json, decrypt_json, get_fernet + +KEY_ENV = "VON_WEB_PUSH_ENCRYPTION_KEY" +COLLECTION = "web_push_subscriptions" +RECEIPTS = "web_push_receipts" +LEASE_SECONDS = 120 # One bounded provider request (10 s), with recovery headroom. +_log = logging.getLogger(__name__) +_worker_lock = threading.Lock() +_worker = None + + +def now(): + return datetime.now(timezone.utc) + + +def digest(value): + return hashlib.sha256(value.encode()).hexdigest() + + +def collection(name=COLLECTION): + db = get_db() + if db is None: + raise RuntimeError("Notification storage unavailable") + return db[name] + + +def configuration(): + """Return public setup state without leaking keys or provider errors.""" + public = os.getenv("VON_WEB_PUSH_PUBLIC_KEY", "").strip() + configured = all( + os.getenv(key, "").strip() + for key in ( + "VON_WEB_PUSH_PRIVATE_KEY", + "VON_WEB_PUSH_PUBLIC_KEY", + "VON_WEB_PUSH_SUBJECT", + KEY_ENV, + ) + ) + if configured: + try: + get_fernet(env_var=KEY_ENV) + from pywebpush import webpush # noqa: F401 + except Exception: + configured = False + return {"configured": configured, "public_key": public if configured else None} + + +def validate_subscription(value): + """Constrain the server's outbound request to supported push providers. + + A browser-supplied URL is not arbitrary server-side fetch authority. Exact + provider hosts/suffixes plus HTTPS and no redirects exclude local targets. + Endpoint possession still needs the push challenge below. + """ + if not isinstance(value, dict): + raise ValueError("Invalid subscription") + endpoint = value.get("endpoint") + if not isinstance(endpoint, str) or len(endpoint) > 4096: + raise ValueError("Invalid subscription") + parsed = urlsplit(endpoint) + host = parsed.hostname or "" + allowed = host in {"fcm.googleapis.com", "updates.push.services.mozilla.com"} or ( + host.endswith(".push.apple.com") and host != ".push.apple.com" + ) + if ( + not allowed + or parsed.scheme != "https" + or parsed.port not in (None, 443) + or parsed.username + or parsed.password + or parsed.fragment + ): + raise ValueError("Unsupported push provider") + keys = value.get("keys") or {} + try: + public = base64.urlsafe_b64decode(keys["p256dh"] + "===") + auth = base64.urlsafe_b64decode(keys["auth"] + "===") + if len(public) != 65 or len(auth) != 16: + raise ValueError() + ec.EllipticCurvePublicKey.from_encoded_point(ec.SECP256R1(), public) + except Exception as exc: + raise ValueError("Invalid subscription keys") from exc + return {"endpoint": endpoint, "keys": {k: keys[k] for k in ("p256dh", "auth")}} + + +class _ProviderSession(requests.Session): + def request(self, method, url, **kwargs): + kwargs["allow_redirects"] = False + return super().request(method, url, **kwargs) + + +def send(subscription, payload, *, topic): + """Return provider acceptance only. Never log endpoint/key/response bodies.""" + from pywebpush import WebPushException, webpush + + try: + with _ProviderSession() as http: + response = webpush( + subscription_info=subscription, + data=json.dumps(payload, separators=(",", ":")), + vapid_private_key=os.environ["VON_WEB_PUSH_PRIVATE_KEY"], + vapid_claims={"sub": os.environ["VON_WEB_PUSH_SUBJECT"]}, + ttl=60, + timeout=10, + requests_session=http, + headers={"Topic": topic[:32], "Urgency": "normal"}, + ) + return "accepted" if 200 <= response.status_code < 300 else "failed" + except WebPushException as exc: + code = exc.response.status_code if exc.response is not None else None + return "expired" if code in (404, 410) else "failed" + except Exception: + return "failed" + + +def scope_allowed(actor, organisation): + if not organisation: + return True + from .organisation_membership_service import get_user_memberships + + return any( + row.get("organisation_concept_id") == organisation + for row in get_user_memberships(actor).get("memberships", []) + ) + + +def revoke_device(device): + if device: + collection().delete_many({"device": device}) + + +def status(actor, device, organisation): + # Browser-wide identity changes revoke the old actor on this device. Other + # devices and same-actor organisation opt-ins are independent. + coll = collection() + coll.delete_many({"device": device, "actor": {"$ne": actor}}) + row = coll.find_one( + { + "device": device, + "actor": actor, + "organisation": organisation, + "expires_at": {"$gt": now()}, + } + ) + return { + "state": row["state"] if row else "disabled", + "subscription_id": row["_id"] if row else None, + "generation": row.get("generation") if row else None, + "last_delivery": row.get("last_delivery") if row else None, + } + + +def subscribe(actor, device, organisation, subscription): + subscription = validate_subscription(subscription) + if not scope_allowed(actor, organisation): + raise PermissionError("Organisation access required") + coll = collection() + identifier = digest(subscription["endpoint"]) + device_row = coll.find_one({"device": device}) + if device_row and device_row["_id"] != identifier: + # One PushManager subscription per app installation. Do not accumulate + # stale endpoints or bypass the bounded confirmation action by rotating URLs. + if ( + device_row.get("challenge_after", now()).replace(tzinfo=timezone.utc) + > now() + ): + raise ValueError("Wait one minute before enabling another subscription") + coll.delete_one({"_id": device_row["_id"], "device": device}) + existing = coll.find_one({"_id": identifier}) + if existing: + if (existing["actor"], existing["device"], existing["organisation"]) != ( + actor, + device, + organisation, + ): + raise PermissionError( + "Disable notifications in the original account or scope first" + ) + if existing["state"] == "active": + coll.update_one( + {"_id": identifier, "state": "active"}, + { + "$set": { + "encrypted": encrypt_json(subscription, env_var=KEY_ENV), + "expires_at": now() + timedelta(days=30), + } + }, + ) + return {"state": "active", "subscription_id": identifier} + # Pending/failed challenges are deliberately rate limited too. + if existing["retry_at"].replace(tzinfo=timezone.utc) > now(): + return {"state": existing["state"], "subscription_id": identifier} + coll.delete_one({"_id": identifier, "state": existing["state"]}) + challenge = secrets.token_urlsafe(32) + stamp = now() + row = { + "_id": identifier, + "actor": actor, + "device": device, + "organisation": organisation, + "state": "pending", + "encrypted": encrypt_json(subscription, env_var=KEY_ENV), + "challenge": digest(challenge), + "challenge_until": stamp + timedelta(minutes=5), + "challenge_after": stamp + timedelta(minutes=1), + "expires_at": stamp + timedelta(days=30), + "enabled_at": stamp, + "generation": secrets.token_hex(16), + "retry_at": stamp + timedelta(minutes=1), + "lease_until": stamp, + } + try: + coll.insert_one(row) + except DuplicateKeyError as exc: + raise ValueError("Subscription changed; refresh its status") from exc + outcome = send( + subscription, + { + "kind": "confirmation", + "id": identifier, + "generation": row["generation"], + "challenge": challenge, + }, + topic=identifier, + ) + coll.update_one({"_id": identifier}, {"$set": {"last_delivery": outcome}}) + return { + "state": "pending", + "subscription_id": identifier, + "provider_result": outcome, + } + + +def confirm(actor, device, identifier, challenge): + result = collection().update_one( + { + "_id": identifier, + "actor": actor, + "device": device, + "state": "pending", + "challenge": digest(challenge), + "challenge_until": {"$gt": now()}, + }, + { + "$set": {"state": "active", "retry_at": now()}, + "$unset": {"challenge": "", "challenge_until": ""}, + }, + ) + return bool(result.modified_count) + + +def test_notification(actor, device, identifier): + stamp = now() + row = collection().find_one_and_update( + { + "_id": identifier, + "actor": actor, + "device": device, + "state": "active", + "expires_at": {"$gt": stamp}, + "$or": [ + {"test_after": {"$exists": False}}, + {"test_after": {"$lte": stamp}}, + ], + }, + {"$set": {"test_after": stamp + timedelta(minutes=1)}}, + ) + if not row or not scope_allowed(actor, row["organisation"]): + raise ValueError( + "Enable notifications first; tests are limited to once a minute" + ) + outcome = send( + decrypt_json(row["encrypted"], env_var=KEY_ENV), + {"kind": "test", "id": identifier, "generation": row["generation"]}, + topic=identifier, + ) + if outcome == "expired": + collection().delete_one({"_id": identifier}) + return {"provider_result": outcome} + + +def _next_message(row): + from ..security.access_control import ( + override_current_actor, + apply_concept_query_filter, + ) + from .message_service import MESSAGE_TYPE_CONCEPT_ID, PREDICATE_RECIPIENT + + query = { + "relationships.is_an_instance_of": MESSAGE_TYPE_CONCEPT_ID, + f"relationships.{PREDICATE_RECIPIENT}": row["actor"], + "concept_data.organisation_concept_id": row["organisation"], + "concept_data.deleted": {"$ne": True}, + "created_at": { + "$gte": max( + row["enabled_at"].replace(tzinfo=timezone.utc), + now() - timedelta(days=1), + ) + }, + } + with override_current_actor(row["actor"], row["organisation"]): + # Anti-join terminal receipts instead of trusting a wall-clock cursor: + # a concurrent canonical insert may finish after a newer message. + messages = list( + get_concepts_collection().aggregate( + [ + {"$match": apply_concept_query_filter(query)}, + {"$sort": {"created_at": 1, "concept_id": 1}}, + { + "$lookup": { + "from": RECEIPTS, + "localField": "concept_id", + "foreignField": "message_id", + "as": "push_receipts", + } + }, + { + "$match": { + "push_receipts": { + "$not": { + "$elemMatch": { + "generation": row["generation"], + "terminal": True, + } + } + } + } + }, + {"$limit": 1}, + {"$project": {"push_receipts": 0}}, + ] + ) + ) + return messages[0] if messages else None + + +def deliver_one(): + """One durable leased delivery; multiple web processes may safely compete.""" + stamp = now() + lease = secrets.token_hex(16) + coll = collection() + row = coll.find_one_and_update( + { + "state": "active", + "expires_at": {"$gt": stamp}, + "retry_at": {"$lte": stamp}, + "lease_until": {"$lte": stamp}, + }, + { + "$set": { + "lease": lease, + "lease_until": stamp + timedelta(seconds=LEASE_SECONDS), + } + }, + sort=[("retry_at", 1)], + return_document=ReturnDocument.AFTER, + ) + if not row: + return False + owned = {"_id": row["_id"], "lease": lease, "state": "active"} + try: + if not scope_allowed(row["actor"], row["organisation"]): + coll.delete_one(owned) + return True + message = _next_message(row) + if not message: + coll.update_one( + owned, {"$set": {"retry_at": stamp + timedelta(seconds=30)}} + ) + return True + # Deterministic delivery identity survives process death and provider + # acceptance followed by a lost response. It contains no actor/message ID. + receipt_id = digest(row["generation"] + message["concept_id"]) + receipts = collection(RECEIPTS) + receipts.update_one( + {"_id": receipt_id}, + { + "$setOnInsert": { + "actor": row["actor"], + "organisation": row["organisation"], + "message_id": message["concept_id"], + "subscription_id": row["_id"], + "generation": row["generation"], + "terminal": False, + "attempts": 0, + "expires_at": stamp + timedelta(days=7), + } + }, + upsert=True, + ) + # Count before I/O so crashes cannot cause unlimited retries. + if not coll.find_one(owned): + return True + claimed = receipts.find_one_and_update( + {"_id": receipt_id}, + {"$inc": {"attempts": 1}}, + return_document=ReturnDocument.AFTER, + ) + if claimed["attempts"] > 3: + outcome = "failed" + elif row["actor"] in message.get("concept_data", {}).get( + "read_by", [] + ) or message["created_at"].replace(tzinfo=timezone.utc) < stamp - timedelta( + days=1 + ): + outcome = "skipped" + else: + outcome = send( + decrypt_json(row["encrypted"], env_var=KEY_ENV), + { + "kind": "message", + "id": row["_id"], + "generation": row["generation"], + "receipt": receipt_id, + }, + topic=receipt_id, + ) + receipts.update_one( + {"_id": receipt_id}, + { + "$set": { + "provider_result": outcome, + "attempts": claimed["attempts"], + "updated_at": stamp, + "terminal": outcome != "failed" or claimed["attempts"] >= 3, + } + }, + ) + if outcome == "expired": + coll.delete_one(owned) + elif outcome != "failed" or claimed["attempts"] >= 3: + coll.update_one( + owned, + { + "$set": { + "last_delivery": outcome, + "retry_at": stamp, + } + }, + ) + else: + coll.update_one( + owned, + { + "$set": { + "last_delivery": outcome, + "retry_at": stamp + timedelta(minutes=claimed["attempts"]), + } + }, + ) + return True + finally: + coll.update_one( + owned, {"$set": {"lease_until": now()}, "$unset": {"lease": ""}} + ) + + +def start_worker(): + """Independent of model/workflow launch suppression; explicitly configured.""" + global _worker + if not configuration()["configured"]: + return + with _worker_lock: + if _worker and _worker.is_alive(): + return + + def run(): + while True: + try: + for _ in range(100): + if not deliver_one(): + break + except Exception: + _log.warning( + "Web Push delivery unavailable; canonical messages retained" + ) + threading.Event().wait(30) + + # No data rewrite/migration. These indexes bound routine device lookup + # and delivery scans; expired capability/navigation records self-delete. + collection().create_index("device", unique=True) + collection().create_index([("state", 1), ("retry_at", 1), ("lease_until", 1)]) + collection(RECEIPTS).create_index("message_id") + get_concepts_collection().create_index( + [ + ("relationships.#V#has_recipient", 1), + ("concept_data.organisation_concept_id", 1), + ("created_at", 1), + ], + name="direct_message_push_recipient_org_created", + ) + for name in (COLLECTION, RECEIPTS): + collection(name).create_index("expires_at", expireAfterSeconds=0) + _worker = threading.Thread(target=run, name="web-push-delivery", daemon=True) + _worker.start() diff --git a/src/frontend/web/von_interface/static/js/main.js b/src/frontend/web/von_interface/static/js/main.js index 54ad46ba8..ab7a0a1ca 100644 --- a/src/frontend/web/von_interface/static/js/main.js +++ b/src/frontend/web/von_interface/static/js/main.js @@ -136,6 +136,13 @@ document.addEventListener('DOMContentLoaded', async () => { } // Start background preload of Vontology data while chat is active + try { + const { openNotificationMessage } = await import('./pushNotifications.js'); + await openNotificationMessage(); + } catch (error) { + console.warn('[main] Notification navigation unavailable'); + } + try { preloadVontologyData(); startHealthPolling(); diff --git a/src/frontend/web/von_interface/static/js/pushNotifications.js b/src/frontend/web/von_interface/static/js/pushNotifications.js new file mode 100644 index 000000000..c75c24913 --- /dev/null +++ b/src/frontend/web/von_interface/static/js/pushNotifications.js @@ -0,0 +1,158 @@ +import { getJsonDetailed, postJson } from './apiService.js'; + +const API = '/api/notifications'; + +export function notificationSupport() { + if (!window.isSecureContext) return 'Notifications require a secure HTTPS connection.'; + const isAppleMobile = /iPad|iPhone|iPod/.test(navigator.userAgent) + || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1); + if (isAppleMobile && !window.matchMedia('(display-mode: standalone)').matches && !navigator.standalone) { + return 'On iPhone or iPad, add Von to the Home Screen, then open that app to enable notifications.'; + } + if (!('serviceWorker' in navigator) || !('PushManager' in window) || !('Notification' in window)) { + return 'This browser does not support Von push notifications. Try a current supported browser.'; + } + return null; +} + +async function registration() { + await navigator.serviceWorker.register('/von/service-worker.js', { scope: '/von/' }); + return navigator.serviceWorker.ready; +} + +export async function disableBrowserNotifications() { + // Server revocation first; report failures instead of presenting a false opt-out. + await postJson(`${API}/disable`, {}); + await clearLocalNotifications(); +} + +export async function clearLocalNotifications() { + if (!('serviceWorker' in navigator)) return; + const reg = await navigator.serviceWorker.getRegistration('/von/'); + if (!reg) return; + const sub = await reg.pushManager.getSubscription(); + if (sub) await sub.unsubscribe(); + for (const notification of await reg.getNotifications()) notification.close(); + reg.active?.postMessage({ type: 'von-push-disable' }); +} + +export async function initialiseNotificationControls() { + const root = document.getElementById('pushNotificationSettings'); + if (!root || root.dataset.initialised) return; + root.dataset.initialised = 'true'; + const status = root.querySelector('[data-push-status]'); + const enable = root.querySelector('[data-push-enable]'); + const disable = root.querySelector('[data-push-disable]'); + const test = root.querySelector('[data-push-test]'); + const refresh = root.querySelector('[data-push-refresh]'); + let server = null; + let reg = null; + let busy = false; + + async function update() { + enable.disabled = disable.disabled = test.disabled = true; + const unsupported = notificationSupport(); + if (unsupported) { status.textContent = unsupported; return; } + try { + ({ data: server } = await getJsonDetailed(`${API}/status`)); + if (!server.configured) { + status.textContent = 'Notifications are not configured on this server yet.'; + return; + } + reg = await registration(); + const sub = await reg.pushManager.getSubscription(); + const permission = Notification.permission; + const cached = await caches.match('/von/.push-binding', { cacheName: 'von-push-state-v1' }); + const binding = cached ? await cached.json() : null; + const needsReconnect = server.state === 'active' && !!sub + && (binding?.id !== server.subscription_id || binding?.generation !== server.generation); + const active = permission === 'granted' && !!sub && server.state === 'active' && !needsReconnect; + status.textContent = permission === 'denied' + ? 'Notifications are blocked in browser or system settings. Change that permission there, then refresh.' + : needsReconnect ? 'This device lost its notification binding. Disable on this device, then Enable again to reconnect.' + : active ? 'Notifications enabled for direct messages in this organisation context on this device. Lock-screen text stays private.' + : server.state === 'pending' ? 'Waiting for the confirmation push. Refresh status after it arrives; if it fails, retry Enable after one minute.' + : 'Notifications are off. Enable them for direct messages in the current organisation context.'; + enable.disabled = active || needsReconnect || permission === 'denied'; + disable.disabled = !sub && server.state === 'disabled'; + test.disabled = !active; + if (permission !== 'granted' && server.state === 'active') { + await disableBrowserNotifications(); + } + if (active) { + // Renew an existing, confirmed opt-in while this actor is present. + // Permission is never requested as part of refresh. + await postJson(`${API}/subscribe`, { subscription: sub.toJSON() }); + } + } catch (error) { + status.textContent = `Notification status unavailable. ${error.message}`; + } + } + + async function action(fn) { + if (busy) return; + busy = true; + enable.disabled = disable.disabled = test.disabled = refresh.disabled = true; + try { await fn(); } catch (error) { status.textContent = error.message; } + finally { busy = false; refresh.disabled = false; } + } + + enable.addEventListener('click', () => { + // Invoke before any await: iOS requires direct user activation. + const permission = Notification.requestPermission(); + void action(async () => { + const result = await permission; + if (result !== 'granted') { + await update(); + if (result === 'default') status.textContent = 'Permission was dismissed. Notifications remain off; you can enable them later.'; + return; + } + let sub = await reg.pushManager.getSubscription(); + if (!sub) { + const padded = server.public_key.replace(/-/g, '+').replace(/_/g, '/'); + const key = Uint8Array.from(atob(padded), character => character.charCodeAt(0)); + sub = await reg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: key }); + } + await postJson(`${API}/subscribe`, { subscription: sub.toJSON() }); + await update(); + }); + }); + disable.addEventListener('click', () => void action(async () => { + await disableBrowserNotifications(); await update(); + })); + test.addEventListener('click', () => void action(async () => { + const result = await postJson(`${API}/test`, { id: server.subscription_id }); + await update(); + status.textContent = result.provider_result === 'accepted' + ? 'The push provider accepted the test. Check your device for the notification; acceptance does not prove display.' + : 'The test was not accepted. Refresh status and try enabling notifications again.'; + })); + refresh.addEventListener('click', () => void update()); + document.addEventListener('visibilitychange', () => { + if (!document.hidden && !busy) void update(); + }); + await update(); +} + +export async function openNotificationMessage() { + const receipt = new URL(window.location.href).searchParams.get('notification'); + if (!receipt || !/^[a-f0-9]{64}$/.test(receipt)) return; + try { + const { data: row } = await getJsonDetailed(`${API}/open/${receipt}`); + const { selectMessageConversation } = await import('./components/conversationCatalogue.js'); + const { activateTab } = await import('./tabNavigation.js'); + activateTab('chatTab'); + await selectMessageConversation(row); + } catch (error) { + const message = document.createElement('p'); + message.setAttribute('role', 'status'); + message.textContent = `This notification cannot be opened in the current account. ${error.message}`; + document.getElementById('vonAuthenticatedApp')?.prepend(message); + } +} + +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => void initialiseNotificationControls()); +} else { + void initialiseNotificationControls(); +} diff --git a/src/frontend/web/von_interface/static/pwa-icon-192.png b/src/frontend/web/von_interface/static/pwa-icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..0d3810c17723db7d2f0dea4e12bf7139ea8cd055 GIT binary patch literal 30015 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℘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≻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%0A8E2jA4U=LsB$q)m|#w2>-u)ajRb#pAzi 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 event.waitUntil(self.skipWaiting())); +self.addEventListener('activate', event => event.waitUntil(self.clients.claim())); +self.addEventListener('message', event => { + // Commands are local lifecycle actions from our own app windows. + if (!event.source?.url || new URL(event.source.url).origin !== self.location.origin) return; + if (event.data?.type === 'von-push-disable') { + event.waitUntil(disable().then(() => event.ports[0]?.postMessage({ ok: true }))); + } +}); + +self.addEventListener('push', event => { + event.waitUntil((async () => { + let payload; + try { payload = event.data.json(); } catch { return; } + if (!/^[a-f0-9]{64}$/.test(payload.id || '')) return; + if (!/^[a-f0-9]{32}$/.test(payload.generation || '')) return; + if (payload.kind === 'confirmation') { + // Only a push arriving in the requesting authenticated browser can + // complete this challenge. It is never returned to the subscriber API. + const response = await fetch('/api/notifications/confirm', { + method: 'POST', credentials: 'same-origin', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ id: payload.id, challenge: payload.challenge }) + }); + if (!response.ok || (await response.json()).state !== 'active') return; + await saveBinding({ id: payload.id, generation: payload.generation, seen: [] }); + await self.registration.showNotification('Von notifications enabled', { + body: 'Direct messages can now notify you on this device.', + tag: 'von-push-confirmation', data: { url: '/von/' } + }); + return; + } + const binding = await readBinding(); + if (!binding || binding.id !== payload.id || binding.generation !== payload.generation) return; + // Recheck the live browser actor/device before displaying even generic + // text. A queued push must not outlive logout or organisation removal. + const active = await fetch('/api/notifications/validate', { + method: 'POST', credentials: 'same-origin', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ id: payload.id, generation: payload.generation }) + }); + if (!active.ok) { + if (active.status === 401 || active.status === 403) await disable(); + return; + } + if ((await active.json()).active !== true) return; + const receipt = /^[a-f0-9]{64}$/.test(payload.receipt || '') ? payload.receipt : null; + if (payload.kind !== 'test' && (payload.kind !== 'message' || !receipt)) return; + if (receipt && binding.seen.includes(receipt)) return; + await self.registration.showNotification('Von', { + body: payload.kind === 'test' ? 'This is your test notification.' : 'You have a new message. Open Von to read it.', + icon: '/static/pwa-icon-192.png', + tag: receipt ? `von-${receipt}` : 'von-push-test', renotify: false, + data: { url: receipt ? `/von/?notification=${receipt}` : '/von/' } + }); + if (receipt) { + binding.seen = [...binding.seen.slice(-127), receipt]; + await saveBinding(binding); + } + })()); +}); + +self.addEventListener('notificationclick', event => { + event.notification.close(); + // Only the canonical opaque receipt route is allowed, never a payload URL. + const raw = event.notification.data?.url || ''; + const url = /^\/von\/\?notification=[a-f0-9]{64}$/.test(raw) ? raw : '/von/'; + event.waitUntil(self.clients.openWindow(new URL(url, self.location.origin).href)); +}); + +self.addEventListener('pushsubscriptionchange', event => { + // No background re-enrolment with an expired login or changed actor. The + // next foreground visit shows the missing subscription and offers Enable. + event.waitUntil(disable()); +}); diff --git a/src/frontend/web/von_interface/templates/settings_tab.html b/src/frontend/web/von_interface/templates/settings_tab.html index ae700ffa2..661d791aa 100644 --- a/src/frontend/web/von_interface/templates/settings_tab.html +++ b/src/frontend/web/von_interface/templates/settings_tab.html @@ -40,6 +40,19 @@

Set up Von for this browser

+
+

Mobile notifications

+

Receive private alerts for direct Von messages, including coding-agent reports. + Enable for the current organisation context on this device. Other devices have their own opt-in.

+

Checking notification support…

+ + + + +

On iPhone or iPad, open Von from the Home Screen. System Focus and battery settings + can delay alerts. Logging out disables this device; already displayed alerts may remain in system history.

+
+

Signed-in Identity

@@ -1541,6 +1554,14 @@

Server Control

if (response.ok) { console.log('Logout successful'); + try { + const notifications = await import({{ url_for('static', filename='js/pushNotifications.js') | tojson }}); + await notifications.clearLocalNotifications(); + } catch (_) { + // Server revocation already succeeded; the worker also + // rechecks the active account before any queued alert. + } + const logoutResult = await response.json(); if (logoutResult.redirect_url === '/cdn-cgi/access/logout') { clearIdentityScopeMirrors(); @@ -1820,6 +1841,7 @@

Server Control

window.initializeSettingsAuthentication = initializeSettingsAuthentication; + diff --git a/src/frontend/web/von_interface/templates/von_interface.html b/src/frontend/web/von_interface/templates/von_interface.html index eeafaa529..09cb3ec34 100644 --- a/src/frontend/web/von_interface/templates/von_interface.html +++ b/src/frontend/web/von_interface/templates/von_interface.html @@ -5,6 +5,9 @@ Von + + + diff --git a/tests/backend/test_web_push.py b/tests/backend/test_web_push.py new file mode 100644 index 000000000..ba5943c50 --- /dev/null +++ b/tests/backend/test_web_push.py @@ -0,0 +1,447 @@ +"""Bounded notification delivery and the new actor/device authority boundary.""" + +import base64 +from datetime import timedelta + +import mongomock +import pytest +from cryptography.fernet import Fernet +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric import ec +from flask import Flask + +from src.backend.services import web_push_service as push +from src.backend.server.routes import web_push_routes as routes + + +@pytest.fixture +def store(monkeypatch): + db = mongomock.MongoClient(tz_aware=True).db + monkeypatch.setattr(push, "get_db", lambda: db) + monkeypatch.setattr(push, "get_concepts_collection", lambda: db.concepts) + monkeypatch.setattr( + push, "scope_allowed", lambda actor, org: org in (None, "#V#sail") + ) + monkeypatch.setenv(push.KEY_ENV, Fernet.generate_key().decode()) + from src.backend.security import access_control + + monkeypatch.setattr( + access_control, "apply_concept_query_filter", lambda query: query + ) + sent = [] + monkeypatch.setattr( + push, + "send", + lambda subscription, payload, **kwargs: sent.append( + (subscription, payload, kwargs) + ) + or "accepted", + ) + return db, sent + + +@pytest.fixture +def subscription(): + key = ( + ec.generate_private_key(ec.SECP256R1()) + .public_key() + .public_bytes( + serialization.Encoding.X962, serialization.PublicFormat.UncompressedPoint + ) + ) + return { + "endpoint": "https://fcm.googleapis.com/fcm/send/test-device", + "keys": { + "p256dh": base64.urlsafe_b64encode(key).decode().rstrip("="), + "auth": base64.urlsafe_b64encode(b"a" * 16).decode().rstrip("="), + }, + } + + +def enrol(store, subscription, *, actor="#V#alice", device="device", org="#V#sail"): + db, sent = store + result = push.subscribe(actor, device, org, subscription) + challenge = sent[-1][1]["challenge"] + assert push.confirm(actor, device, result["subscription_id"], challenge) + return result["subscription_id"] + + +def message( + db, identifier="message-one", recipient="#V#alice", org="#V#sail", stamp=None +): + db.concepts.insert_one( + { + "concept_id": identifier, + "created_at": stamp or push.now(), + "relationships": { + "is_an_instance_of": ["#V#direct_message"], + "#V#has_sender": ["#V#codex_dgx"], + "#V#has_recipient": [recipient], + }, + "concept_data": { + "organisation_concept_id": org, + "content_fallback": "PRIVATE research report", + }, + } + ) + + +def due(db): + db[push.COLLECTION].update_many( + {}, {"$set": {"retry_at": push.now() - timedelta(seconds=1)}} + ) + + +def test_challenge_proves_device_and_actor_without_returning_secret( + store, subscription +): + db, sent = store + result = push.subscribe("#V#alice", "device", "#V#sail", subscription) + identifier = result["subscription_id"] + challenge = sent[-1][1]["challenge"] + assert challenge not in str(result) + assert subscription["endpoint"] not in str(db[push.COLLECTION].find_one()) + assert not push.confirm("#V#bob", "device", identifier, challenge) + assert not push.confirm("#V#alice", "other-device", identifier, challenge) + assert not push.confirm("#V#alice", "device", identifier, "wrong") + assert push.confirm("#V#alice", "device", identifier, challenge) + assert not push.confirm("#V#alice", "device", identifier, challenge) + + +@pytest.mark.parametrize( + "endpoint", + [ + "http://fcm.googleapis.com/x", + "https://127.0.0.1/x", + "https://localhost/x", + "https://fcm.googleapis.com.evil.test/x", + "https://push.apple.com.evil.test/x", + "https://fcm.googleapis.com:444/x", + "https://user:password@fcm.googleapis.com/x", + "https://fcm.googleapis.com/x#fragment", + ], +) +def test_endpoint_cannot_grant_arbitrary_network_access(subscription, endpoint): + subscription["endpoint"] = endpoint + with pytest.raises(ValueError): + push.validate_subscription(subscription) + + +def test_endpoint_cannot_be_rebound_to_unrelated_actor_device_or_scope( + store, subscription +): + enrol(store, subscription) + for actor, device, org in [ + ("#V#bob", "device", "#V#sail"), + ("#V#alice", "another", "#V#sail"), + ("#V#alice", "device", None), + ]: + with pytest.raises(PermissionError): + push.subscribe(actor, device, org, subscription) + + +def test_durable_message_one_private_alert_and_late_insert_is_not_skipped( + store, subscription +): + db, sent = store + enrol(store, subscription) + early = push.now() + message(db, "later") + assert push.deliver_one() + assert sent[-1][1]["kind"] == "message" + assert "PRIVATE" not in str(sent[-1]) and "#V#alice" not in str(sent[-1]) + assert "later" not in str(sent[-1][1]) + # A create that began earlier can commit later than the newer message. + message(db, "late-commit", stamp=early) + due(db) + assert push.deliver_one() + due(db) + push.deliver_one() + assert len([item for item in sent if item[1]["kind"] == "message"]) == 2 + assert db[push.RECEIPTS].count_documents({"terminal": True}) == 2 + + +def test_other_recipients_and_orgs_are_not_delivered(store, subscription): + db, sent = store + enrol(store, subscription) + message(db, "bob-message", recipient="#V#bob") + message(db, "other-org", org="#V#other") + message(db, "personal", org=None) + push.deliver_one() + assert len(sent) == 1 # challenge only + + +def test_retry_is_bounded_and_uses_same_tag_and_receipt( + store, subscription, monkeypatch +): + db, sent = store + enrol(store, subscription) + message(db) + attempts = [] + monkeypatch.setattr( + push, + "send", + lambda sub, payload, **kw: attempts.append((payload, kw)) or "failed", + ) + for _ in range(5): + due(db) + push.deliver_one() + assert len(attempts) == 3 + assert all(attempt == attempts[0] for attempt in attempts) + assert db[push.RECEIPTS].find_one()["terminal"] + + +def test_crash_after_provider_acceptance_keeps_receipt_and_retry_bound( + store, subscription, monkeypatch +): + db, sent = store + enrol(store, subscription) + message(db) + attempts = [] + + def crash(sub, payload, **kw): + attempts.append(payload) + raise RuntimeError("simulated process interruption after send") + + monkeypatch.setattr(push, "send", crash) + for _ in range(3): + with pytest.raises(RuntimeError): + push.deliver_one() + push.deliver_one() + assert len(attempts) == 3 + assert attempts[0] == attempts[1] == attempts[2] + assert db[push.RECEIPTS].find_one()["terminal"] + + +def test_expiry_disable_and_membership_removal_stop_delivery( + store, subscription, monkeypatch +): + db, sent = store + enrol(store, subscription) + message(db) + monkeypatch.setattr(push, "send", lambda *args, **kw: "expired") + push.deliver_one() + assert db[push.COLLECTION].count_documents({}) == 0 + monkeypatch.setattr( + push, + "send", + lambda sub, payload, **kw: sent.append((sub, payload, kw)) or "accepted", + ) + enrol(store, subscription) + push.revoke_device("device") + assert not push.deliver_one() + enrol(store, subscription) + monkeypatch.setattr(push, "scope_allowed", lambda *args: False) + push.deliver_one() + assert db[push.COLLECTION].count_documents({}) == 0 + + +@pytest.fixture +def client(store, monkeypatch): + app = Flask(__name__) + app.secret_key = "fixture-key" + app.register_blueprint(routes.web_push_bp) + monkeypatch.setattr( + push, "configuration", lambda: {"configured": True, "public_key": "public"} + ) + monkeypatch.setattr(routes, "scope", lambda: "#V#sail") + with app.test_client() as client: + with client.session_transaction() as session: + session.update( + user_concept_id="#V#alice", + user_email="alice@example.test", + auth_provider="browser_test_fixture", + ) + yield client + + +def test_session_and_origin_are_required_and_supplied_actor_is_ignored( + client, store, subscription +): + assert client.get("/api/notifications/status").status_code == 200 + path = "/api/notifications/subscribe" + payload = { + "subscription": subscription, + "user_id": "#V#bob", + "organisation": "#V#evil", + } + assert client.post(path, json=payload).status_code == 403 + assert ( + client.post( + path, json=payload, headers={"Origin": "https://evil.test"} + ).status_code + == 403 + ) + assert ( + client.post( + path, json=payload, headers={"Origin": "http://localhost"} + ).status_code + == 200 + ) + row = store[0][push.COLLECTION].find_one() + assert row["actor"] == "#V#alice" and row["organisation"] == "#V#sail" + with client.session_transaction() as session: + session.clear() + assert ( + client.get( + "/api/notifications/status", headers={"X-User-Concept-ID": "#V#alice"} + ).status_code + == 401 + ) + + +def test_browser_account_change_revokes_old_subscription(client, store, subscription): + client.get("/api/notifications/status") + client.post( + "/api/notifications/subscribe", + json={"subscription": subscription}, + headers={"Origin": "http://localhost"}, + ) + with client.session_transaction() as session: + session["user_concept_id"] = "#V#bob" + result = client.get("/api/notifications/status") + assert result.json["state"] == "disabled" + assert store[0][push.COLLECTION].count_documents({}) == 0 + + +def test_test_action_is_device_bound_and_rate_limited(store, subscription): + identifier = enrol(store, subscription) + with pytest.raises(ValueError): + push.test_notification("#V#bob", "device", identifier) + with pytest.raises(ValueError): + push.test_notification("#V#alice", "other-device", identifier) + assert ( + push.test_notification("#V#alice", "device", identifier)["provider_result"] + == "accepted" + ) + with pytest.raises(ValueError): + push.test_notification("#V#alice", "device", identifier) + + +def test_navigation_rechecks_recipient_and_current_scope( + client, store, subscription, monkeypatch +): + db, _ = store + enrol(store, subscription) + message(db) + push.deliver_one() + receipt = db[push.RECEIPTS].find_one() + from src.backend.services import message_service + + monkeypatch.setattr(message_service, "get_concepts_collection", lambda: db.concepts) + url = "/api/notifications/open/" + receipt["_id"] + assert client.get(url).json["last_message_id"] == "message-one" + with client.session_transaction() as session: + session["user_concept_id"] = "#V#bob" + assert client.get(url).status_code == 404 + with client.session_transaction() as session: + session["user_concept_id"] = "#V#alice" + db.concepts.update_one({}, {"$set": {"concept_data.deleted": True}}) + assert client.get(url).status_code == 404 + + +def test_canonical_coding_report_is_delivered_with_workflow_launch_suppressed( + store, subscription, monkeypatch +): + db, sent = store + enrol(store, subscription) + from src.backend.services import message_service + + monkeypatch.setattr(message_service, "get_concepts_collection", lambda: db.concepts) + monkeypatch.setattr( + message_service.ConceptsRepository, "insert_one", db.concepts.insert_one + ) + monkeypatch.setattr(message_service, "upsert_text_for_concept", lambda **kw: None) + monkeypatch.setattr( + message_service, + "maybe_launch_direct_message_workflow", + lambda **kw: {"triggered": False, "reason": "suppressed"}, + ) + created = message_service.create_message( + sender_id="#V#codex_dgx", + recipient_ids=["#V#alice"], + content="Completed the assigned coding work", + org_id="#V#sail", + ) + assert db.concepts.find_one({"concept_id": created["concept_id"]}) + assert push.deliver_one() + assert sent[-1][1]["kind"] == "message" + assert db[push.RECEIPTS].find_one()["message_id"] == created["concept_id"] + + +def test_queued_delivery_validation_is_bound_to_enrolment_and_logout( + client, store, subscription +): + db, sent = store + client.get("/api/notifications/status") + headers = {"Origin": "http://localhost"} + result = client.post( + "/api/notifications/subscribe", + json={"subscription": subscription}, + headers=headers, + ) + payload = sent[-1][1] + assert ( + client.post( + "/api/notifications/confirm", json=payload, headers=headers + ).status_code + == 200 + ) + assert ( + client.post( + "/api/notifications/validate", json=payload, headers=headers + ).status_code + == 200 + ) + assert ( + client.post( + "/api/notifications/validate", + json={**payload, "generation": "old"}, + headers=headers, + ).status_code + == 403 + ) + assert ( + client.post("/api/notifications/disable", json={}, headers=headers).status_code + == 200 + ) + assert ( + client.post( + "/api/notifications/validate", json=payload, headers=headers + ).status_code + == 403 + ) + + +def test_logout_revokes_before_session_clear_and_reports_storage_failure( + client, store, subscription, monkeypatch +): + from src.backend.server.routes.auth_routes import auth_bp + from src.backend.services import window_session_context_service + + client.application.register_blueprint(auth_bp, url_prefix="/von") + monkeypatch.setattr( + window_session_context_service, + "delete_window_context_if_owned", + lambda *args: None, + ) + client.get("/api/notifications/status") + client.post( + "/api/notifications/subscribe", + json={"subscription": subscription}, + headers={"Origin": "http://localhost"}, + ) + original = push.revoke_device + monkeypatch.setattr( + push, + "revoke_device", + lambda device: (_ for _ in ()).throw(RuntimeError("unavailable")), + ) + assert client.post("/von/api/auth/logout").status_code == 503 + with client.session_transaction() as session: + assert session["user_concept_id"] == "#V#alice" + monkeypatch.setattr(push, "revoke_device", original) + assert client.post("/von/api/auth/logout").status_code == 200 + assert store[0][push.COLLECTION].count_documents({}) == 0 + with client.session_transaction() as session: + assert "user_concept_id" not in session diff --git a/tests/browser/webPushFixture.py b/tests/browser/webPushFixture.py new file mode 100644 index 000000000..2161caa20 --- /dev/null +++ b/tests/browser/webPushFixture.py @@ -0,0 +1,125 @@ +"""Disposable localhost Web Push transport fixture; never uses a real database. + +Run with ``pdm run python tests/browser/webPushFixture.py``. This serves the +candidate's actual notification controls, API and service worker. Synthetic +session binding and in-memory storage do NOT prove production authentication, +MongoDB durability, installed-app behaviour, or physical-device display. +""" + +import base64 +import logging +import os +from pathlib import Path +import re +import secrets +import subprocess +import sys + +ROOT = Path(__file__).resolve().parents[2] +sys.path.insert(0, str(ROOT)) +os.environ["VON_DB_NAME"] = "test_web_push_fixture" + +from cryptography.fernet import Fernet +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric import ec +from flask import Flask, jsonify, render_template_string, session +import mongomock + +from src.backend.services import web_push_service as push, message_service +from src.backend.server.routes import web_push_routes +from src.backend.security import access_control + + +def create_fixture(): + key = ec.generate_private_key(ec.SECP256R1()) + os.environ["VON_WEB_PUSH_PRIVATE_KEY"] = base64.urlsafe_b64encode( + key.private_bytes( + serialization.Encoding.DER, + serialization.PrivateFormat.PKCS8, + serialization.NoEncryption(), + ) + ).decode() + os.environ["VON_WEB_PUSH_PUBLIC_KEY"] = ( + base64.urlsafe_b64encode( + key.public_key().public_bytes( + serialization.Encoding.X962, + serialization.PublicFormat.UncompressedPoint, + ) + ) + .decode() + .rstrip("=") + ) + os.environ["VON_WEB_PUSH_SUBJECT"] = "mailto:push-fixture@example.org" + os.environ[push.KEY_ENV] = Fernet.generate_key().decode() + db = mongomock.MongoClient(tz_aware=True).db + push.get_db = lambda: db + push.get_concepts_collection = lambda: db.concepts + push.scope_allowed = lambda actor, org: org == "#V#fixture_org" + web_push_routes.scope = lambda: "#V#fixture_org" + message_service.get_concepts_collection = lambda: db.concepts + message_service.ConceptsRepository.insert_one = db.concepts.insert_one + message_service.upsert_text_for_concept = lambda **kwargs: None + message_service.maybe_launch_direct_message_workflow = lambda **kwargs: { + "triggered": False + } + access_control.apply_concept_query_filter = lambda query: query + static = ROOT / "src/frontend/web/von_interface/static" + app = Flask(__name__, static_folder=str(static), static_url_path="/static") + app.secret_key = secrets.token_hex(32) + app.register_blueprint(web_push_routes.web_push_bp) + source = ( + ROOT / "src/frontend/web/von_interface/templates/settings_tab.html" + ).read_text() + section = re.search( + r'
', source, re.S + ).group() + + @app.get("/von/") + def home(): + session.update( + user_concept_id="#V#fixture_alice", + user_email="alice@example.test", + auth_provider="browser_test_fixture", + ) + return render_template_string( + """ + + + +

Disposable transport fixture — synthetic actor and in-memory messages.

+
""" + + section + + """
+ """ + ) + + @app.get("/health") + def health(): + return jsonify( + fixture="web-push-synthetic", + source_commit=subprocess.check_output( + ["git", "rev-parse", "HEAD"], cwd=ROOT, text=True + ).strip(), + candidate_dirty=True, + database="in-memory", + models="disabled", + ) + + @app.post("/fixture/message") + def create_message(): + # Fixed synthetic intent; never a free-form send surface. + message = message_service.create_message( + sender_id="#V#fixture_codex", + recipient_ids=["#V#fixture_alice"], + content="Synthetic coding-agent completion report.", + org_id="#V#fixture_org", + ) + return jsonify(message_id=message["concept_id"]) + + push.start_worker() + return app + + +if __name__ == "__main__": + logging.getLogger("werkzeug").setLevel(logging.ERROR) + create_fixture().run(host="127.0.0.1", port=5077, debug=False, use_reloader=False) diff --git a/tests/browser/webPushSmoke.cjs b/tests/browser/webPushSmoke.cjs new file mode 100644 index 000000000..bf59019e8 --- /dev/null +++ b/tests/browser/webPushSmoke.cjs @@ -0,0 +1,64 @@ +/* Transport attempt, not proof of installed-app or OS display acceptance. + * PLAYWRIGHT_BROWSERS_PATH=/tmp/von-playwright node tests/browser/webPushSmoke.cjs + */ +const { chromium } = require('playwright'); +const fs = require('fs'); +const path = require('path'); + +(async () => { + const base = 'http://127.0.0.1:5077'; + const evidence = path.resolve('.run/web-push-smoke'); + fs.mkdirSync(evidence, { recursive: true }); + const headed = process.env.VON_PUSH_HEADED === '1'; + const browser = await chromium.launch({ headless: !headed }); + const context = await browser.newContext({ permissions: ['notifications'], viewport: { width: 390, height: 844 } }); + const page = await context.newPage(); + const report = { browser: browser.version(), os: process.platform, + installed: false, mode: `${headed ? 'headed' : 'headless'} ordinary tab; injected permission`, + push_method: 'PushManager.subscribe then encrypted pywebpush, if registration succeeds', + device_display_verified: false }; + try { + report.fixture = await (await page.request.get(base + '/health')).json(); + if (report.fixture.fixture !== 'web-push-synthetic') throw new Error('Unexpected fixture'); + await page.goto(base + '/von/'); + await page.waitForFunction(() => !/Checking/.test(document.querySelector('[data-push-status]').textContent), null, { timeout: 15000 }); + report.registration = await page.evaluate(async () => { + const reg = await navigator.serviceWorker.ready; + return { scope: reg.scope, scriptURL: reg.active.scriptURL, permission: Notification.permission }; + }); + report.initial_status = await page.locator('[data-push-status]').textContent(); + if (await page.locator('[data-push-enable]').isEnabled()) { + await page.locator('[data-push-enable]').click(); + await page.waitForFunction(() => { + const text = document.querySelector('[data-push-status]').textContent; + return /Registration failed|push service|Waiting for|enabled|failed|denied|AbortError/i.test(text); + }, null, { timeout: 25000 }).catch(() => {}); + } else { + // Diagnose the actual browser transport without changing product + // permission handling or injecting a synthetic Push event. + report.transport_probe = await page.evaluate(async () => { + const permission = Notification.permission; + const permissionQuery = (await navigator.permissions.query({ name: 'notifications' })).state; + const config = await (await fetch('/api/notifications/status')).json(); + const reg = await navigator.serviceWorker.ready; + try { + const key = Uint8Array.from(atob(config.public_key.replace(/-/g, '+').replace(/_/g, '/')), c => c.charCodeAt(0)); + await Promise.race([ + reg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: key }), + new Promise((_, reject) => setTimeout(() => reject(new Error('Transport probe exceeded 20 seconds')), 20000)) + ]); + return { permission, permissionQuery, subscribed: true }; + } catch (error) { + return { permission, permissionQuery, error: error.name + ': ' + error.message }; + } + }); + } + report.observed_status = await page.locator('[data-push-status]').textContent(); + report.subscribed = await page.evaluate(async () => !!(await (await navigator.serviceWorker.ready).pushManager.getSubscription())); + await page.screenshot({ path: path.join(evidence, 'controls.png'), fullPage: true }); + fs.writeFileSync(path.join(evidence, 'receipt.json'), JSON.stringify(report, null, 2) + '\n'); + console.log(JSON.stringify(report, null, 2)); + } finally { + await context.close(); await browser.close(); + } +})().catch(error => { console.error(error.message); process.exitCode = 1; }); diff --git a/tests/frontend/pushNotifications.test.js b/tests/frontend/pushNotifications.test.js new file mode 100644 index 000000000..ac10934cf --- /dev/null +++ b/tests/frontend/pushNotifications.test.js @@ -0,0 +1,96 @@ +/** @jest-environment jsdom */ +jest.mock('../../src/frontend/web/von_interface/static/js/apiService.js', () => ({ + getJsonDetailed: jest.fn(), postJson: jest.fn() +})); +jest.mock('../../src/frontend/web/von_interface/static/js/components/conversationCatalogue.js', () => ({ selectMessageConversation: jest.fn() })); +jest.mock('../../src/frontend/web/von_interface/static/js/tabNavigation.js', () => ({ activateTab: jest.fn() })); +const base = '../../src/frontend/web/von_interface/static/js/'; +const flush = () => new Promise(resolve => setTimeout(resolve, 0)); + +beforeEach(() => { + jest.resetModules(); + document.body.innerHTML = ''; + Object.defineProperty(window, 'isSecureContext', { value: true, configurable: true }); + Object.defineProperty(navigator, 'userAgent', { value: 'Chromium Android', configurable: true }); + Object.defineProperty(navigator, 'platform', { value: 'Linux', configurable: true }); + window.matchMedia = jest.fn(() => ({ matches: false })); + window.PushManager = function () {}; + global.caches = { match: jest.fn(async () => null) }; + window.Notification = { permission: 'default', requestPermission: jest.fn(async () => 'default') }; + const reg = { pushManager: { getSubscription: jest.fn(async () => null), subscribe: jest.fn() } }; + Object.defineProperty(navigator, 'serviceWorker', { configurable: true, value: { + register: jest.fn(async () => reg), ready: Promise.resolve(reg), getRegistration: jest.fn(async () => reg) + } }); + const api = require(base + 'apiService.js'); + api.getJsonDetailed.mockResolvedValue({ data: { configured: true, state: 'disabled', public_key: 'BAAA' }, status: 200 }); +}); + +function controls() { + document.body.innerHTML = `
+

+
`; + return require(base + 'pushNotifications.js'); +} + +test('no permission request on initialisation; a dismissed user gesture leaves notifications off', async () => { + const module = controls(); + await module.initialiseNotificationControls(); await flush(); + expect(Notification.requestPermission).not.toHaveBeenCalled(); + document.querySelector('[data-push-enable]').click(); + expect(Notification.requestPermission).toHaveBeenCalledTimes(1); + await flush(); + expect(document.querySelector('[data-push-status]').textContent).toContain('dismissed'); + expect(require(base + 'apiService.js').postJson).not.toHaveBeenCalled(); +}); + +test('denied permission offers browser settings without prompting again', async () => { + Notification.permission = 'denied'; + const module = controls(); + await module.initialiseNotificationControls(); await flush(); + expect(document.querySelector('[data-push-enable]').disabled).toBe(true); + expect(document.querySelector('[data-push-status]').textContent).toContain('blocked'); + expect(Notification.requestPermission).not.toHaveBeenCalled(); +}); + +test('ordinary iPhone tab directs installation; installed app uses feature detection', () => { + Object.defineProperty(navigator, 'userAgent', { value: 'iPhone', configurable: true }); + const module = require(base + 'pushNotifications.js'); + expect(module.notificationSupport()).toContain('Home Screen'); + window.matchMedia = () => ({ matches: true }); + expect(module.notificationSupport()).toBeNull(); + delete window.PushManager; + expect(module.notificationSupport()).toContain('does not support'); +}); + +test('disable does not claim success or discard browser subscription if server revocation fails', async () => { + const { postJson } = require(base + 'apiService.js'); + postJson.mockRejectedValue(new Error('offline')); + const module = require(base + 'pushNotifications.js'); + await expect(module.disableBrowserNotifications()).rejects.toThrow('offline'); + expect(navigator.serviceWorker.getRegistration).not.toHaveBeenCalled(); +}); + +test('lost worker binding is shown as needing reconnection, not falsely enabled', async () => { + Notification.permission = 'granted'; + const reg = await navigator.serviceWorker.ready; + reg.pushManager.getSubscription.mockResolvedValue({ toJSON: () => ({}) }); + require(base + 'apiService.js').getJsonDetailed.mockResolvedValue({ data: { + configured: true, state: 'active', subscription_id: 'id', generation: 'generation' + } }); + const module = controls(); + await module.initialiseNotificationControls(); await flush(); + expect(document.querySelector('[data-push-status]').textContent).toContain('lost its notification binding'); + expect(document.querySelector('[data-push-test]').disabled).toBe(true); + expect(document.querySelector('[data-push-disable]').disabled).toBe(false); +}); + +test('notification navigation opens the access-checked exchange from the API response', async () => { + const receipt = 'a'.repeat(64); + window.history.replaceState({}, '', `/?notification=${receipt}`); + const row = { session_id: 'messages:exact', viewer_id: '#V#alice', participant_ids: ['#V#alice', '#V#codex'] }; + require(base + 'apiService.js').getJsonDetailed.mockResolvedValue({ data: row, status: 200 }); + const module = require(base + 'pushNotifications.js'); + await module.openNotificationMessage(); + expect(require(base + 'components/conversationCatalogue.js').selectMessageConversation).toHaveBeenCalledWith(row); + window.history.replaceState({}, '', '/'); +}); diff --git a/tests/frontend/pushServiceWorker.test.js b/tests/frontend/pushServiceWorker.test.js new file mode 100644 index 000000000..2f922b0a8 --- /dev/null +++ b/tests/frontend/pushServiceWorker.test.js @@ -0,0 +1,79 @@ +/** @jest-environment node */ +const fs = require('fs'); +const vm = require('vm'); +const path = require('path'); + +function worker() { + const handlers = {}; + const data = new Map(); + const cache = { match: async key => data.get(key), put: async (key, value) => data.set(key, value) }; + const shown = []; + const opened = []; + const self = { + location: { origin: 'https://von.example' }, + addEventListener: (type, handler) => { handlers[type] = handler; }, + registration: { + showNotification: async (title, options) => shown.push({ title, ...options }), + getNotifications: async () => [], pushManager: { getSubscription: async () => null } + }, + clients: { openWindow: async url => opened.push(url) } + }; + const fetch = jest.fn(async url => ({ ok: true, json: async () => + url.endsWith('/confirm') ? { state: 'active' } : { active: true } })); + // A fresh Response is returned for every cache read, like real CacheStorage. + cache.match = async key => data.get(key)?.clone(); + const context = vm.createContext({ self, fetch, URL, Response, + caches: { open: async () => cache, delete: async () => data.clear() } }); + vm.runInContext(fs.readFileSync(path.join(__dirname, + '../../src/frontend/web/von_interface/static/service-worker.js'), 'utf8'), context); + async function event(type, props) { + let pending; + handlers[type]({ ...props, waitUntil: value => { pending = value; } }); + await pending; + } + const push = payload => event('push', { data: { json: () => ({ generation: 'c'.repeat(32), ...payload }) } }); + return { push, event, shown, opened, fetch }; +} + +const id = 'a'.repeat(64), receipt = 'b'.repeat(64); + +test('real worker handler uses private text, deduplicates receipt and confines click navigation', async () => { + const w = worker(); + await w.push({ kind: 'confirmation', id, challenge: 'opaque' }); + await w.push({ kind: 'message', id, receipt, title: 'PRIVATE', url: 'https://evil.test' }); + await w.push({ kind: 'message', id, receipt }); + expect(w.shown).toHaveLength(2); + expect(w.shown[1].body).toBe('You have a new message. Open Von to read it.'); + await w.event('notificationclick', { notification: { ...w.shown[1], close() {} } }); + expect(w.opened).toEqual([`https://von.example/von/?notification=${receipt}`]); + await w.event('notificationclick', { notification: { data: { url: 'https://evil.test' }, close() {} } }); + expect(w.opened[1]).toBe('https://von.example/von/'); +}); + +test('revoked account/device and login redirects cannot display queued alerts', async () => { + const w = worker(); + await w.push({ kind: 'confirmation', id, challenge: 'opaque' }); + w.fetch.mockResolvedValue({ ok: false, status: 403 }); + await w.push({ kind: 'message', id, receipt }); + expect(w.shown).toHaveLength(1); + w.fetch.mockResolvedValue({ ok: true, json: async () => ({}) }); + await w.push({ kind: 'confirmation', id, challenge: 'opaque' }); + await w.push({ kind: 'message', id, receipt }); + expect(w.shown).toHaveLength(1); +}); + +test('disable clears the binding and stops subsequently queued alerts', async () => { + const w = worker(); + await w.push({ kind: 'confirmation', id, challenge: 'opaque' }); + await w.event('message', { source: { url: 'https://von.example/von/' }, + data: { type: 'von-push-disable' }, ports: [] }); + await w.push({ kind: 'message', id, receipt }); + expect(w.shown).toHaveLength(1); +}); + +test('queued push from a previous account enrolment cannot match a reused endpoint', async () => { + const w = worker(); + await w.push({ kind: 'confirmation', id, challenge: 'opaque', generation: 'd'.repeat(32) }); + await w.push({ kind: 'message', id, receipt, generation: 'c'.repeat(32) }); + expect(w.shown).toHaveLength(1); +}); From 2d1ce02abb74d4611d149e8c9ac3755383cf4616 Mon Sep 17 00:00:00 2001 From: witbrock Date: Sat, 12 Sep 2026 22:48:33 -0400 Subject: [PATCH 2/4] Capture push fixture startup provenance and remaining host handoff --- docs/engineering/mobile_web_push.md | 9 ++++++++- tests/browser/webPushFixture.py | 16 ++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/docs/engineering/mobile_web_push.md b/docs/engineering/mobile_web_push.md index 4823dd5f7..ddb0b3643 100644 --- a/docs/engineering/mobile_web_push.md +++ b/docs/engineering/mobile_web_push.md @@ -124,7 +124,10 @@ was `granted`; the real `PushManager.subscribe` call returned `AbortError: Registration failed - permission denied`. No subscription, provider send, installed app, background/closed-app alert, or device display was verified. Evidence is retained in `.run/web-push-smoke/receipt.json` and `controls.png` in the -task worktree. An isolated headed attempt failed because the retained Xvfb binary +task worktree. The first fixture reported Git HEAD at request time rather than +capturing loaded-source provenance at startup; its receipt is diagnostic evidence +only, not acceptance bound to the final commit. The harness now captures startup +provenance. An isolated headed attempt failed because the retained Xvfb binary crashed starting display `:97`; no other task's display/profiles were repurposed. **Merge decision: not ready.** The task requires an actual supported push path; @@ -140,6 +143,10 @@ Bounded operator preparation needed under the existing task authority: profiles belong to other tasks. Place bridge requests/receipts under this worktree's `.run/notification-browser/`; allocate unused localhost ports and verify roots, SHA and actor scopes through health/auth read-back. + First stop the task-owned `tests/browser/webPushFixture.py` process listening + on 127.0.0.1:5077 after verifying its command and checkout root. The worker's + command session ended but the listener remained outside its visible PID + namespace; no unrelated process or port was killed. 2. Supply an isolated working headed display and a browser/profile supporting actual Web Push. Keep test VAPID/encryption keys outside the coding checkout; permit its normal provider transport. Browser fixture login must preserve diff --git a/tests/browser/webPushFixture.py b/tests/browser/webPushFixture.py index 2161caa20..9c9a57194 100644 --- a/tests/browser/webPushFixture.py +++ b/tests/browser/webPushFixture.py @@ -31,6 +31,16 @@ def create_fixture(): + source_commit = subprocess.check_output( + ["git", "rev-parse", "HEAD"], cwd=ROOT, text=True + ).strip() + source_dirty = bool( + subprocess.check_output( + ["git", "status", "--porcelain", "--untracked-files=no"], + cwd=ROOT, + text=True, + ).strip() + ) key = ec.generate_private_key(ec.SECP256R1()) os.environ["VON_WEB_PUSH_PRIVATE_KEY"] = base64.urlsafe_b64encode( key.private_bytes( @@ -97,10 +107,8 @@ def home(): def health(): return jsonify( fixture="web-push-synthetic", - source_commit=subprocess.check_output( - ["git", "rev-parse", "HEAD"], cwd=ROOT, text=True - ).strip(), - candidate_dirty=True, + source_commit=source_commit, + candidate_dirty=source_dirty, database="in-memory", models="disabled", ) From 70fc2819b67975cdc426eda47519106470ffd5ae Mon Sep 17 00:00:00 2001 From: witbrock Date: Sun, 13 Sep 2026 22:56:12 -0400 Subject: [PATCH 3/4] Repair notification opt-in from Settings and expired confirmation recovery --- src/backend/services/web_push_service.py | 3 ++ .../static/js/pushNotifications.js | 29 +++++++++++++++++-- tests/backend/test_web_push.py | 20 +++++++++++++ tests/frontend/pushNotifications.test.js | 28 +++++++++++++++++- 4 files changed, 76 insertions(+), 4 deletions(-) diff --git a/src/backend/services/web_push_service.py b/src/backend/services/web_push_service.py index f5f2f5e35..aa993409d 100644 --- a/src/backend/services/web_push_service.py +++ b/src/backend/services/web_push_service.py @@ -248,6 +248,9 @@ def subscribe(actor, device, organisation, subscription): }, topic=identifier, ) + if outcome == "expired": + coll.delete_one({"_id": identifier, "generation": row["generation"]}) + return {"state": "disabled", "provider_result": outcome} coll.update_one({"_id": identifier}, {"$set": {"last_delivery": outcome}}) return { "state": "pending", diff --git a/src/frontend/web/von_interface/static/js/pushNotifications.js b/src/frontend/web/von_interface/static/js/pushNotifications.js index c75c24913..262aeab72 100644 --- a/src/frontend/web/von_interface/static/js/pushNotifications.js +++ b/src/frontend/web/von_interface/static/js/pushNotifications.js @@ -16,8 +16,25 @@ export function notificationSupport() { } async function registration() { - await navigator.serviceWorker.register('/von/service-worker.js', { scope: '/von/' }); - return navigator.serviceWorker.ready; + const reg = await navigator.serviceWorker.register('/von/service-worker.js', { scope: '/von/' }); + // Settings lives in /settings iframe, outside the /von/ worker scope. + // navigator.serviceWorker.ready would wait forever for that frame to be + // controlled. Wait for this registration's activation instead. + if (reg.active?.state === 'activated') return reg; + const worker = reg.installing || reg.waiting || reg.active; + if (!worker) throw new Error('Notification service worker unavailable. Refresh to retry.'); + await new Promise((resolve, reject) => { + const changed = () => { + if (worker.state === 'activated' || worker.state === 'redundant') { + worker.removeEventListener('statechange', changed); + if (worker.state === 'activated') resolve(); + else reject(new Error('Notification service worker could not activate. Refresh to retry.')); + } + }; + worker.addEventListener('statechange', changed); + changed(); + }); + return reg; } export async function disableBrowserNotifications() { @@ -113,7 +130,13 @@ export async function initialiseNotificationControls() { const key = Uint8Array.from(atob(padded), character => character.charCodeAt(0)); sub = await reg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: key }); } - await postJson(`${API}/subscribe`, { subscription: sub.toJSON() }); + const enrolment = await postJson(`${API}/subscribe`, { subscription: sub.toJSON() }); + if (enrolment.provider_result === 'expired') { + await clearLocalNotifications(); + await update(); + status.textContent = 'The push service rejected this subscription. Enable again to request a fresh one; if it repeats, try a current supported browser.'; + return; + } await update(); }); }); diff --git a/tests/backend/test_web_push.py b/tests/backend/test_web_push.py index ba5943c50..1db350063 100644 --- a/tests/backend/test_web_push.py +++ b/tests/backend/test_web_push.py @@ -119,6 +119,11 @@ def test_challenge_proves_device_and_actor_without_returning_secret( "https://fcm.googleapis.com:444/x", "https://user:password@fcm.googleapis.com/x", "https://fcm.googleapis.com/x#fragment", + "https://jmt17.google.com.evil.test/fcm/send/device", + "https://other.google.com/fcm/send/device", + "https://jmt17.google.com/log", + "https://jmt17.google.com/fcm/send/device", + "http://jmt17.google.com/fcm/send/device", ], ) def test_endpoint_cannot_grant_arbitrary_network_access(subscription, endpoint): @@ -127,6 +132,21 @@ def test_endpoint_cannot_grant_arbitrary_network_access(subscription, endpoint): push.validate_subscription(subscription) +def test_chromium_webpush_endpoint_is_supported(subscription): + subscription["endpoint"] = "https://fcm.googleapis.com/preprod/wp/test-device" + assert push.validate_subscription(subscription) == subscription + + +def test_expired_confirmation_retires_subscription_for_fresh_opt_in( + store, subscription, monkeypatch +): + db, _ = store + monkeypatch.setattr(push, "send", lambda *args, **kwargs: "expired") + result = push.subscribe("#V#alice", "device", "#V#sail", subscription) + assert result == {"state": "disabled", "provider_result": "expired"} + assert db[push.COLLECTION].count_documents({}) == 0 + + def test_endpoint_cannot_be_rebound_to_unrelated_actor_device_or_scope( store, subscription ): diff --git a/tests/frontend/pushNotifications.test.js b/tests/frontend/pushNotifications.test.js index ac10934cf..9a142056d 100644 --- a/tests/frontend/pushNotifications.test.js +++ b/tests/frontend/pushNotifications.test.js @@ -17,7 +17,7 @@ beforeEach(() => { window.PushManager = function () {}; global.caches = { match: jest.fn(async () => null) }; window.Notification = { permission: 'default', requestPermission: jest.fn(async () => 'default') }; - const reg = { pushManager: { getSubscription: jest.fn(async () => null), subscribe: jest.fn() } }; + const reg = { active: { state: 'activated' }, pushManager: { getSubscription: jest.fn(async () => null), subscribe: jest.fn() } }; Object.defineProperty(navigator, 'serviceWorker', { configurable: true, value: { register: jest.fn(async () => reg), ready: Promise.resolve(reg), getRegistration: jest.fn(async () => reg) } }); @@ -32,6 +32,14 @@ function controls() { return require(base + 'pushNotifications.js'); } +test('Settings outside the worker scope becomes usable without a controlling worker', async () => { + navigator.serviceWorker.ready = new Promise(() => {}); + const module = controls(); + await module.initialiseNotificationControls(); await flush(); + expect(document.querySelector('[data-push-status]').textContent).toContain('Notifications are off'); + expect(document.querySelector('[data-push-enable]').disabled).toBe(false); +}); + test('no permission request on initialisation; a dismissed user gesture leaves notifications off', async () => { const module = controls(); await module.initialiseNotificationControls(); await flush(); @@ -52,6 +60,24 @@ test('denied permission offers browser settings without prompting again', async expect(Notification.requestPermission).not.toHaveBeenCalled(); }); +test('expired confirmation clears the rejected browser subscription and offers fresh opt-in', async () => { + Notification.permission = 'granted'; + Notification.requestPermission.mockResolvedValue('granted'); + const reg = await navigator.serviceWorker.ready; + const sub = { toJSON: () => ({}), unsubscribe: jest.fn(async () => true) }; + reg.pushManager.getSubscription.mockResolvedValue(sub); + reg.getNotifications = jest.fn(async () => []); + reg.active.postMessage = jest.fn(); + require(base + 'apiService.js').postJson.mockResolvedValue({ state: 'disabled', provider_result: 'expired' }); + const module = controls(); + await module.initialiseNotificationControls(); await flush(); + document.querySelector('[data-push-enable]').click(); + await flush(); await flush(); + expect(sub.unsubscribe).toHaveBeenCalledTimes(1); + expect(document.querySelector('[data-push-status]').textContent).toContain('fresh one'); + expect(document.querySelector('[data-push-enable]').disabled).toBe(false); +}); + test('ordinary iPhone tab directs installation; installed app uses feature detection', () => { Object.defineProperty(navigator, 'userAgent', { value: 'iPhone', configurable: true }); const module = require(base + 'pushNotifications.js'); From e1ae235abe26eec938095aceefd054b3914b532d Mon Sep 17 00:00:00 2001 From: witbrock Date: Sun, 13 Sep 2026 23:09:11 -0400 Subject: [PATCH 4/4] Record real push display and click acceptance and activation handoff --- docs/engineering/mobile_web_push.md | 157 +++++++++++++++------------- 1 file changed, 87 insertions(+), 70 deletions(-) diff --git a/docs/engineering/mobile_web_push.md b/docs/engineering/mobile_web_push.md index ddb0b3643..7f91ae7cb 100644 --- a/docs/engineering/mobile_web_push.md +++ b/docs/engineering/mobile_web_push.md @@ -1,7 +1,7 @@ # Mobile Web Push — JVNAUTOSCI-2757 - **Kind:** Bounded implementation and operator handoff -- **Lifecycle:** Candidate; not accepted or deployed +- **Lifecycle:** Local browser acceptance complete; public activation is controller-owned - **Owner:** Von maintainers, for Michael Witbrock - **Scope:** Direct-message notification opt-in for one actor/organisation context per app installation; multiple devices enrol independently @@ -96,75 +96,88 @@ display. Before rotating either key, disable enrolments through the service and require fresh opt-in; replacing the encryption key alone makes old subscriptions unreadable. The controller's code rollback is not key/configuration rollback. -## Evidence and remaining operator work - -The candidate has targeted backend tests for challenge binding, foreign -actor/device/scope denial, canonical coding reports with suppressed workflow -launch, delayed insertion, duplicate/retry/crash handling, opt-out, expiry, -membership removal, logout and access-checked navigation. Frontend tests exercise -the actual worker handler and Settings module. Synthetic worker events in unit -tests do not establish a real push or OS notification display. - -The disposable transport fixture is reproducible with: - -```sh -pdm run python tests/browser/webPushFixture.py -PLAYWRIGHT_BROWSERS_PATH=/tmp/von-playwright node tests/browser/webPushSmoke.cjs -``` - -It uses generated in-memory keys, an in-memory database, synthetic authenticated -actors and the candidate's actual API, Settings section and service-worker file. -It does not read live configuration or call a model. Stop the fixture after use. -For a prepared isolated display the runner accepts `VON_PUSH_HEADED=1`. - -On 12 September 2026, Chromium 153.0.8010.12, Linux ARM64, an ordinary headless -390×844 tab registered the real worker and rendered the denied state correctly. -`Notification.permission` was `denied` while the injected Permissions API state -was `granted`; the real `PushManager.subscribe` call returned -`AbortError: Registration failed - permission denied`. No subscription, provider -send, installed app, background/closed-app alert, or device display was verified. -Evidence is retained in `.run/web-push-smoke/receipt.json` and `controls.png` in the -task worktree. The first fixture reported Git HEAD at request time rather than -capturing loaded-source provenance at startup; its receipt is diagnostic evidence -only, not acceptance bound to the final commit. The harness now captures startup -provenance. An isolated headed attempt failed because the retained Xvfb binary -crashed starting display `:97`; no other task's display/profiles were repurposed. - -**Merge decision: not ready.** The task requires an actual supported push path; -the available browser transport has not provided one. Unit tests and registration -do not satisfy that criterion. Source publication must preserve this boundary. - -Bounded operator preparation needed under the existing task authority: - -1. Prepare a dedicated notification browser bridge bound to this task worktree - and its current candidate SHA, with separate synthetic Alice/Bob sessions and - an isolated disposable database. Use - `/home/mjw/.codex-von-worker/studio-browser/README.md`; the listed retained - profiles belong to other tasks. Place bridge requests/receipts under this - worktree's `.run/notification-browser/`; allocate unused localhost ports and - verify roots, SHA and actor scopes through health/auth read-back. - First stop the task-owned `tests/browser/webPushFixture.py` process listening - on 127.0.0.1:5077 after verifying its command and checkout root. The worker's - command session ended but the listener remained outside its visible PID - namespace; no unrelated process or port was killed. -2. Supply an isolated working headed display and a browser/profile supporting - actual Web Push. Keep test VAPID/encryption keys outside the coding checkout; - permit its normal provider transport. Browser fixture login must preserve - real memberships and must not enrol real users for synthetic tests. -3. Demonstrate the normal authenticated opt-in/challenge, a canonically created - recipient message and actual background notification, click, test and disable. - Recheck unrelated-account denial and queued delivery after logout. Record OS, - browser, installed/tab state and real provider method. Android and iOS physical - evidence remains unavailable here; distinguish available-platform acceptance - from those phone results. -4. Repair Jira connector authentication or have the coordinating operator update - the engineering decision surface; the worker's read returned an invalid-grant - reauthentication error. Do not mark the task delivered during this handoff. -5. Once acceptance supports merge, complete CI/merge, verify `origin/main`, then - request the exact merged SHA through the controller. Verify protected runtime - configuration, actual sender activation, HTTPS manifest/service-worker paths, - public served revision and the installed-app path. No deployment was performed - or requested by this unfinished candidate. +## Accepted local path and activation handoff + +On 14 September 2026, the clean candidate +`70fc2819b67975cdc426eda47519106470ffd5ae` passed actual local browser delivery: + +- Synthetic Alice and Bob logged in through the normal localhost Browser test + login. Both task-owned profiles reported the exact candidate in `/health`. +- Settings → Conversations → Enable performed a real PushManager subscription, + encrypted provider send and device-bound confirmation. The Settings iframe is + outside `/von/`; the client now awaits the registered worker's activation + rather than waiting indefinitely for that iframe to be controlled. +- A canonical message from Bob to Alice produced one generic notification while + Alice's Von tab was closed and her browser remained running. The private + message body did not appear in the alert. Bob received HTTP 404 attempting to + open Alice's opaque notification receipt. +- A screenshot of the task-owned desktop showed the actual alert. A real X11 + mouse click opened its canonical URL and the accessible message exchange. + Device Disable returned `disabled`, removed the PushManager subscription and + left no notifications. Owned subscriptions were also cleaned up in the + runner's finalisation path. + +Environment: headed persistent Chromium 153.0.8010.12 on Linux ARM64, ordinary +browser tab, automation-granted notification permission, localhost secure +context. An isolated Dunst 1.9.2 notification daemon and private D-Bus supplied +native display/click on task display `:98`; both child processes stopped when +acceptance ended. The default session bus could not query host AppArmor policy +from this sandbox. The private test bus used its own same-user Unix socket and +configuration; no host policy, system service or unrelated desktop was changed. +This is **not** an installed-app, Android-phone, iPhone or public-HTTPS result. + +The browser's `PushMessagingGcmEndpointWebpushPath` feature selected its actual +FCM `https://fcm.googleapis.com/preprod/wp/` transport. The unbranded browser's +older `jmt17.google.com/fcm/send/` endpoint rejected its subscription as expired. +The application provider allowlist remains unchanged: no Google-wide or staging +host exception was shipped. A permanent rejection of a confirmation now retires +its server record and clears the rejected browser subscription, offering fresh +opt-in instead of a misleading indefinite pending state. + +The earlier diagnostic HTTP 403 came from importing unversioned `apiService.js` +into a document already using the release-scoped module graph. That second +coordinator created a new, unbound window selector. The actual Settings request +succeeded with its actor-bound selector; strict window validation was preserved. +Browser harnesses should use the page's actual module graph or its current +window header, not load a parallel copy of the coordinator. + +Evidence is retained in the task worktree's `.run/push-resume/acceptance.json`, +`desktop-alert.png`, `click.png` and `accept.cjs`. The screenshot and canonical +message IDs are bound in the receipt. The source repair handoff was independently +checksum-verified as `#V#computer_file_copy_47a3732ac0294834ac602067ab67e644`, SHA256 +`6a114a6798762d391cef8af2ff29508f62fa73f4b9b09f7f543970256a0e05da`. +Its earlier login/subscription preparation did not itself establish display. + +Validation: 80 targeted backend notification/message/window-isolation tests +passed after incorporating current main. The final expired-confirmation change +passed all 29 notification backend cases; all 12 notification frontend cases, +affected static lint and diff checks passed. These cover permission dismissal +and denial, canonical coding reports with workflow launches suppressed, stale +subscriptions, expiry, duplicate/retry/crash bounds, actor/device/scope denial, +queued delivery after logout, and access-checked navigation. Synthetic unit +Push events are not counted as real display evidence. + +The supported local delivery path now satisfies the bounded source merge gate. +Physical Android/iOS verification remains unavailable. The existing offline and +expired-session limitations above remain; no broader delivery guarantee is made. +Public activation still requires the controller to: + +1. Deploy the exact merged `origin/main` revision through its authorised release + route, keeping the prior release as code rollback. +2. Verify the protected VAPID/encryption configuration described above, the + locked dependency environment and actual sender activation. Test keys exist + only in the isolated fixture; their availability says nothing about public + runtime configuration. Code rollback does not provision or rotate keys. +3. Read back the public served revision and HTTPS manifest/worker paths, then + verify authenticated notification configuration and an installed-app delivery + on the target device. Keep that evidence separate from localhost acceptance. +4. Reconcile the engineering issue through the coordinating operator: the Jira + connector still returned `oauth_token_invalid_grant` during this continuation. + +The coding run requests deployment through its structured result only. It does +not mutate the live service or send canonical task/completion messages; the +controller owns those effects. Shared service-worker/manifest changes in +JVNAUTOSCI-2758 still need to preserve this notification path. ## Platform sources checked @@ -177,3 +190,7 @@ Bounded operator preparation needed under the existing task authority: - [MDN Push API](https://developer.mozilla.org/en-US/docs/Web/API/Push_API) and [pywebpush's implementation](https://github.com/web-push-libs/pywebpush) describe browser subscriptions and encrypted provider transport. + +- [Chromium push endpoint selection](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/push_messaging/push_messaging_utils.cc) + and [endpoint constants](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/push_messaging/push_messaging_constants.cc) + identify the newer Web Push and legacy staging routes checked during recovery.