App passwords (SPEC App. D §D.5): one generated password per app, shown once, revocable on its own, revoked on a password reset; never accepted by the web sign-in. Settings → Security → App passwords (migration 0024). CalDAV / CardDAV server (SPEC Appendix E), built in: /dav/ with /.well-known/caldav|carddav, HTTP Basic with app passwords only (cached checks, throttled failures). The calendar and contacts plugins serve their own tables as collections (Plugin(dav=...)): - calendars as iCalendar: series with overrides, time zones, all-day, attendees and RSVP, alarms <-> reminders; MKCALENDAR / PROPPATCH / DELETE of calendars; subscriptions read-only; writes to upstream-synced calendars flow on upstream; - address books as vCard (3.0 served, 3.0/4.0 read), groups as CATEGORIES; - what a client stores is served back verbatim until the web app edits it; - sync tokens / CTags from change logs filled by triggers (calendar0008, contacts0002), so every write path counts; trimmed nightly after 90 days. REPORTs: calendar-query (time range), calendar-/addressbook-multiget, addressbook-query, sync-collection. nginx and the Vite proxy route /dav/. Settings shows the server and user name to enter; install guide §5.4. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
/// <reference types="vitest" />
|
|
import { resolve } from "node:path";
|
|
|
|
import react from "@vitejs/plugin-react";
|
|
import { defineConfig } from "vite";
|
|
|
|
// SPEC dev-environment §5: Vite dev proxy /api -> :8000 with ws:true for /api/ws.
|
|
export default defineConfig({
|
|
plugins: [react()],
|
|
build: {
|
|
rollupOptions: {
|
|
// Two apps, one dist: the mail client (index.html) and the admin panel
|
|
// (admin.html). nginx serves each from its own listener — see
|
|
// docker/nginx.conf. In dev, the panel is at /admin.html.
|
|
input: {
|
|
main: resolve(__dirname, "index.html"),
|
|
admin: resolve(__dirname, "admin.html"),
|
|
},
|
|
},
|
|
},
|
|
server: {
|
|
port: 5173,
|
|
proxy: {
|
|
"/api": {
|
|
target: "http://127.0.0.1:8000",
|
|
changeOrigin: true,
|
|
ws: true,
|
|
},
|
|
// CalDAV / CardDAV (SPEC Appendix E), for trying clients against dev.
|
|
"/dav": { target: "http://127.0.0.1:8000", changeOrigin: true },
|
|
"/.well-known/caldav": { target: "http://127.0.0.1:8000", changeOrigin: true },
|
|
"/.well-known/carddav": { target: "http://127.0.0.1:8000", changeOrigin: true },
|
|
},
|
|
},
|
|
test: {
|
|
environment: "jsdom",
|
|
globals: true,
|
|
setupFiles: ["./src/test/setup.ts"],
|
|
},
|
|
});
|