Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion docs/collaboration.md
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,9 @@ ephemeral and never written to a project file.

> **Operator note:** `POST /sessions` validates the request `Origin` (or
> `Referer`) against `ALLOWED_ORIGINS` via `isAllowedOrigin` (defaults to the
> app's own domains plus `localhost` for development) as browser-origin filtering
> hosted app origins (`geolibre.app`, `web.geolibre.app`, its legacy
> `viewer.geolibre.app` alias, and `studio.geolibre.app`) plus `localhost` for
> development) as browser-origin filtering
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
> and defense-in-depth (not authentication or a general server-side access gate)
> and enforces a per-IP `checkRateLimit` (10 requests / 60 s). `Access-Control-Allow-Origin: *` is
> still sent on responses so non-browser clients (e.g. Tauri) are not blocked by
Expand Down
3 changes: 3 additions & 0 deletions workers/collab-node/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ function isAllowedOrigin(
.filter(Boolean)
: [
"https://geolibre.app",
"https://web.geolibre.app",
"https://viewer.geolibre.app",
"https://studio.geolibre.app",
"https://collab.geolibre.app",
"http://localhost",
"http://127.0.0.1",
Expand Down
23 changes: 23 additions & 0 deletions workers/collab-node/test/relay.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,29 @@ describe("Node collaboration relay", () => {
await assert.rejects(connect(http, "NOTFOUND"), /Unexpected server response: 404/);
});

it("allows the hosted GeoLibre web origins to create sessions", async () => {
const { http } = await start();

for (const origin of [
"https://geolibre.app",
"https://web.geolibre.app",
"https://viewer.geolibre.app",
"https://studio.geolibre.app",
]) {
const response = await fetch(`${http}/sessions`, {
method: "POST",
headers: { origin },
});
assert.equal(response.status, 200, `${origin} should be allowed`);
}

const rejected = await fetch(`${http}/sessions`, {
method: "POST",
headers: { origin: "https://web.geolibre.app.example.com" },
});
assert.equal(rejected.status, 403);
});

it("rejects an oversized session-create body by declared length and by count", async () => {
const { http } = await start();

Expand Down
3 changes: 3 additions & 0 deletions workers/collab/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ function isAllowedOrigin(originHeader: string | null, envAllowed?: string): bool
.filter(Boolean)
: [
"https://geolibre.app",
"https://web.geolibre.app",
"https://viewer.geolibre.app",
"https://studio.geolibre.app",
"https://collab.geolibre.app",
"http://localhost",
"http://127.0.0.1",
Expand Down
Loading