Claude
fdf445d2b0
perf: round 9 — decorator PUT reactivation, session/search/dedup alloc purges, PROPFIND join!, folder-level cascade
...
Benchmark-gated round (benches/ROUND9.md): every change carries a
BEFORE/AFTER bench with equivalence/safety gates; verdicts below are from
the committed harnesses on 4 cores / local PG 16.
Backend:
- Blob decorators (Retry/Cached) now forward put_blob_from_bytes_unsynced
+ sync_blobs — the trait default had silently reinstated HEAD-before-PUT
per chunk on decorated remote stacks, undoing ROUND3 §8. Full production
stack: 500 probes -> 0, 1.9x wall at 10 ms RTT (bench_s3_put §3).
- NC PROPFIND per-page enrichment triple (favorites / oc:fileid / dead
props) overlapped with tokio::join!: 2.07x local, 2.86x at 5 ms RTT
(bench_nc_enrich_join, injected-latency decide-by-bench).
- Search enrichment consumes its DTOs and carries the interned Arc<str>
display fields end-to-end (SearchFileResultDto type change, OpenAPI
shape preserved): enrich_file 2.0x, 11.6 -> 2.2 allocs/row; the NC
REPORT conversion stops re-running all three classifiers per row
(bench_search_enrich).
- NC session Arc end-to-end: SharedNcSession extractor (8 -> 0 allocs),
Arc<FolderDto> chroot cache (4 -> 0/hit), single shared Arc<CurrentUser>
+ lazy span render (11 -> 6/build) (bench_nc_session).
- Storage micro-pack: atomic create_new chunk writes (2.1x fresh),
stream_chunks over the manifest Arc (4097 -> 0 allocs/read incl. the
Range path), manifest single-flight (herd 64 -> 1 loads), hex_lower for
chunk Content-MD5 (18 -> 1 allocs) (bench_storage_micro).
- OCS capabilities memoized into OnceLock<[Bytes;2]>: 237x, 102 -> 0
allocs/poll, byte-identical (bench_capabilities_static).
- Drive::is_empty COUNT(*) sum -> EXISTS: 34.4x on a 100k-file drive
(bench_drive_is_empty).
- favorites/recents row-map ROUND7 port: path/name/blob_hash moved,
-2.75 allocs/row (bench_resource_row_map §2).
- Folder rows decode binary UUIDs (ROUND6 §10 port): 1.03-1.07x page
fetch, honest verdict incl. one noise-band wash documented
(bench_folder_uuid_decode).
- Authz: file cascade decision decomposed into memoized folder-level
decision + direct-grant lookup (ROUND8 deferred item). Cold shared-album
first view 592 -> 418 µs/thumb; warm path unchanged; safety gates incl.
new direct-grant sibling isolation, revoke-flush re-verified, full
integration authz suite green (bench_thumbnail_cascade_cache).
Frontend (vitest gates committed beside the code):
- resolveLabel/resolveRecipient O(directory) scan -> id-keyed Map: 13.9x
(recipients.bench.test.ts).
- ResourceList selection-prune effect skips when nothing is selected
(100 -> 0 Set builds per drain) and the photos timeline reads a
listener-fed mobile flag instead of matchMedia per recompute
(listDerives.bench.test.ts).
Verification: cargo fmt + clippy --all-features --all-targets -D warnings
clean; 524 unit + 554 integration (--cfg integration_tests) tests pass;
frontend npm run check clean with 293 vitest tests green.
Deferred with rationale in ROUND9.md: CalDAV authz-before-fetch reorder
(maintainer sign-off), per-page batched parent resolution, JWT-claims
Arc<str>, batch_operations signature widening.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01XDc9VtXvskJ6dnMRraSndn
2026-07-18 16:12:04 +00:00
Edouard Vanbelle
42510d94f3
POC(nextcloud): add chroot on nextcloud
...
Bring chroot to nextcloud capability: login on Nextcloud via username="{user}~{folder-uuid}
Doing a such login will chroot the folder folder-uuid
If user has several folder as root (parent=None), the login flow will request which
folder user want to chroot
2026-06-19 16:06:38 +02:00
Edouard Vanbelle
4fc3746754
chore(logs): add explicit http logs
...
Default is now RUST_LOG=info,http=warn. Effect of each level on the access log:
┌────────────────────┬────────────────────────┐
│ Level on http │ Status classes emitted │
├────────────────────┼────────────────────────┤
│ info │ 2xx/3xx + 4xx + 5xx │
├────────────────────┼────────────────────────┤
│ warn (default) │ 4xx + 5xx │
├────────────────────┼────────────────────────┤
│ error │ 5xx only │
├────────────────────┼────────────────────────┤
│ off │ nothing │
└────────────────────┴────────────────────────┘
Target mapping:
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─────────────────┐
│ Routes │ Target │
├────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┤
│ health_routes │ http::probe │
├────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┤
│ magic_link_router │ http::web │
├────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┤
│ All /api/auth/* sub-routers (login, register, refresh, public, protected, app_pw, device_public, device_protected) │ http::api::auth │
├────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┤
│ setup_router, public_api_routes, protected_api, wopi_api_protected │ http::api │
├────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┤
│ well_known_router, caldav_protected, carddav_protected, webdav_protected │ http::dav │
├────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┤
│ nc_router │ http::nextcloud │
├────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┤
│ wopi_protocol │ http::wopi │
├────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┤
│ web_routes (+ ServeDir fallback) │ http::web │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┘
# Default value:
- **http=warn** if target http not specified
- **http::web=error** if target http::web not specified
Common operator overrides:
# Server-error-only access logs (the new default)
unset RUST_LOG
# See login failures and other client errors on auth
RUST_LOG=info,http=warn,http::api::auth=info
# which is similar to
RUST_LOG=info,http::api::auth=info
# Full access log everywhere (heavy)
RUST_LOG=info,http=info
# Silence everything except errors
RUST_LOG=warn
2026-06-15 21:56:59 +02:00
Edouard Vanbelle
2ad55879f3
feat(nextcloud): use user's image for avatar ( #434 )
...
- add /ocs/v1.php/cloud/user route (same as /ocs/v2.php/cloud/user )
- add also /remote.php/dav/avatars/{user}/{size}.png route (used by Nextcloud sync)
note: webp are transcoded in png, no cache but using pragma HTTP header
2026-06-08 15:25:36 +02:00
Edouard Vanbelle
badf35f08f
chore: remove all executable attributes on non bash files
2026-04-01 23:14:42 +02:00
Diocrafts
df336da679
feat(frontend): i18n expansion, admin/profile i18n, grid/list view fix, empty state
...
- Add 5 new locales (hi, ar, ru, ja, ko) — now 14 total
- Admin panel: 117 i18n keys, confirm modal, animated tabs, no inline handlers
- Profile page: 58 i18n keys with data-i18n attributes
- Fix i18n safeT() shadowing bug and translationsLoaded timing
- Fix grid/list view: list header no longer shows in grid mode on login
- Fix classList.toggle hidden sync for view switching across all nav functions
- Revert .hidden important that broke login page rendering
- Add files empty state (no_files + empty_hint) with translations
- Fix language selector dropdown scroll and styling
- Fix admin panel scroll with sticky tabs
2026-03-09 00:08:34 +01:00
Dionisio
9aa35aa0ea
quick fix
2026-03-06 13:18:36 +01:00
Jared Wolff
d8eecbd9ca
fix(nc): enable Nextcloud Android app connectivity and uploads
...
- Add /remote.php/dav discovery endpoint for Android app server detection
- Add /index.php/204 connectivity check endpoint (returns 204 No Content)
- Redirect login flow to nc:// deep link for mobile credential delivery
- Support GET/HEAD on folders (NC clients use as existence checks)
- Recursive MKCOL to create missing parent directories
- Fix single-file PROPFIND returning empty multistatus response
- Strip instance suffix from preview fileId (e.g. "00000326ocnca")
- Add recommendations stub endpoint
2026-03-05 20:42:54 -05:00
zjean
a7de63d80f
fix: resolve clippy warnings (unused mut, from_str, result_large_err)
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-05 20:47:09 +01:00
zjean
54eedf5483
feat(nextcloud): add Nextcloud-compatible API layer
...
Implement a complete Nextcloud client compatibility layer so that
Nextcloud desktop/mobile sync clients can connect to OxiCloud.
Key additions:
- Login Flow v2 (device auth) with OIDC bridge support
- WebDAV handler compatible with Nextcloud clients (PROPFIND, GET,
PUT, DELETE, MKCOL, MOVE, COPY, HEAD, PROPPATCH)
- OCS API endpoints (user info, capabilities, notifications stubs,
sharees, unified search)
- Basic Auth middleware with app password verification, account
lockout integration, and blake3-keyed auth cache
- App password management: create, list, revoke via both native
API (JWT-authenticated profile page) and Nextcloud OCS endpoints
- Nextcloud file ID mapping (oc:fileid) with persistent DB storage
- Chunked upload support (Nextcloud v2 chunking protocol)
- Trashbin WebDAV interface
- Avatar (SVG placeholder) and preview (redirect) handlers
- User profile page with app password management UI
- URL user validation on all DAV routes (403 on mismatch)
- Database schema for app_passwords and nextcloud_object_ids tables
All services are behind a `nextcloud.enabled` config flag and
cleanly separated under src/interfaces/nextcloud/.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-05 20:46:07 +01:00