Commit Graph

867 Commits

Author SHA1 Message Date
Edouard Vanbelle 372a2a91bc chore(tools): add a script to populate static/js/core/icons.js 2026-04-15 08:49:17 +02:00
Diocrafts b1827c9f3d fix(docker): switch Azure crates to rustls, drop OpenSSL dependency
Azure SDK crates (azure_core, azure_storage, azure_storage_blobs) were
enabling reqwest/default-tls → native-tls → openssl-sys via their
default 'enable_reqwest' feature. This breaks the Alpine musl Docker
build which lacks libssl.a/libcrypto.a.

- Set default-features = false on all 3 Azure crates
- Enable 'enable_reqwest_rustls' + 'hmac_rust' (pure Rust, no OpenSSL)
- Pin reqwest to ^0.12 (azure_core 0.21 requires reqwest ^0.12)
- openssl-sys is now fully eliminated from the dependency tree
2026-04-15 08:04:36 +02:00
Dionisio Pozo 4d0ad666bd Merge pull request #296 from EdouardVanbelle/fix/music 2026-04-15 06:01:56 +02:00
Dionisio Pozo 152a1aa51e Merge pull request #295 from EdouardVanbelle/style/front-format 2026-04-15 06:01:21 +02:00
Edouard Vanbelle 0b27c3b400 fix(navigation): correct hash url and navigation to music 2026-04-15 00:39:37 +02:00
Edouard Vanbelle 6e3d87c27e style(front): correct format 2026-04-15 00:15:53 +02:00
Diocrafts 761d159a92 feat(dedup): CDC sub-file deduplication with FastCDC + parallel chunk storage + dedup skip
- Replace whole-file SHA-256 dedup with FastCDC 2020 content-defined chunking
  (min 64KB, avg 256KB, max 1MB) + BLAKE3 hashing
- Add chunk_manifests table (file_hash → chunk_hashes[] + chunk_sizes[])
- Add put_blob_from_bytes to BlobStorageBackend trait (all 7 backends)
- 3-phase store_chunks pipeline:
  Phase 0: batch-check existing chunks (single PG query)
  Phase 1: selective disk read (skip existing chunks entirely)
  Phase 2: parallel upload with buffer_unordered(8)
- CDC-aware read_blob_stream and read_blob_range_stream with legacy fallback
- Transactional manifest + chunk ref-count cascade on remove_reference
- 12 CDC tests (determinism, reassembly, contiguity, sub-file dedup, etc.)
- Update deduplication.md to reflect new architecture
2026-04-14 23:17:39 +02:00
Diocrafts cd3733b459 feat: pluggable storage backends (S3, Azure, local) with admin UI
Implement 4-phase external storage backends architecture:

Phase 1 - Foundation:
- BlobStorageBackend trait (application/ports/blob_storage_ports.rs)
- LocalBlobBackend: extracted all tokio::fs ops from DedupService
- S3BlobBackend: AWS SDK with custom endpoint support (MinIO, R2, B2)
- DedupService refactored to use Arc<dyn BlobStorageBackend>

Phase 2 - Admin Panel:
- StorageSettingsService with DB persistence + env override
- Storage tab in admin panel (backend selector, S3 form, provider presets)
- GET/PUT/POST endpoints for storage settings + connection test
- i18n keys (en/es) and BEM CSS

Phase 3 - Migration:
- MigrationBlobBackend decorator (dual-read: target-first + source fallback)
- Background migration job with parallel transfers + progress tracking
- Migration UI (progress bar, ETA, pause/resume/verify/complete)
- 6 admin API endpoints for migration lifecycle

Phase 4 - Enterprise Extras:
- CachedBlobBackend: LRU disk cache for remote backends
- EncryptedBlobBackend: AES-256-GCM at-rest encryption
- AzureBlobBackend: Azure Blob Storage support
- RetryBlobBackend: exponential backoff for transient errors
- Decorator composition in DI: retry → encryption → cache

All 223 tests passing, clippy clean, fmt verified.
2026-04-14 21:33:38 +02:00
Dionisio Pozo 6fc632af7e Merge pull request #291 from EdouardVanbelle/refactor/js-import-export 2026-04-14 19:39:10 +02:00
Edouard Vanbelle 62a7713af5 refactor(server): apply fmt + lint recos 2026-04-14 19:05:01 +02:00
Edouard Vanbelle af23c56486 refactor(build.rs): can now bundle .js modules (flatten import/export) 2026-04-14 19:05:01 +02:00
Edouard Vanbelle c139ba3e3b refactor(build.rs): support of module + minimify each .js files (temp solution) 2026-04-14 19:05:01 +02:00
Edouard Vanbelle 6f4abfcec4 refactor(js): avoid use of window.XXX and move to import/export
- change worker: do not cache html pages (not necessary)
- remove use of window.XXX and maximize import/export,
  this will provide more clarety,
  show circular dependencies + you will benefit IDE help
2026-04-14 19:05:01 +02:00
Edouard Vanbelle a2e5cfce24 chore(biome): JS check: error on undeclared variables/function 2026-04-14 19:03:54 +02:00
Dionisio Pozo 6a6c29033b Merge pull request #293 from EdouardVanbelle/refactor/css-color 2026-04-14 18:15:53 +02:00
Edouard Vanbelle 2061f8808b style(front): apply biome recos 2026-04-14 13:33:55 +02:00
Edouard Vanbelle d01b2c6ec4 refactor(css): use variable rather direct color 2026-04-14 13:33:51 +02:00
Edouard Vanbelle 08884f3b6d refactor(css): track use of undeclared CSS variables 2026-04-14 12:43:51 +02:00
Dionisio Pozo 5677089f43 Merge pull request #292 from EdouardVanbelle/chore/css-rules 2026-04-14 01:20:50 +02:00
Edouard Vanbelle 11973cae2a chore(css): ensure css are not using direct colors 2026-04-14 01:10:34 +02:00
Dionisio Pozo 37ffa85ab7 Merge pull request #290 from subhranil2605/fix/windows-crlf-entrypoint 2026-04-13 19:32:41 +02:00
Subhranil Sarkar 96e9087f41 fix: resolve CRLF line ending issue for Windows users
Windows Git converts LF to CRLF by default, causing entrypoint.sh
to fail inside Alpine Linux containers with 'no such file or directory'.

Changes:
- Dockerfile: added sed to strip carriage returns from entrypoint.sh
- .gitattributes: enforce LF line endings for all shell scripts

Fixes #289
2026-04-13 21:49:08 +05:30
Dionisio Pozo 65c8fc7f5e Merge pull request #288 from EdouardVanbelle/fix/frontend-search-view 2026-04-13 14:42:24 +02:00
Dionisio Pozo f74cf4d9b5 Merge pull request #287 from EdouardVanbelle/fix/frontend-shared-view 2026-04-13 14:41:48 +02:00
Dionisio Pozo 024cdc610a Merge pull request #286 from EdouardVanbelle/refactor/dark-theme 2026-04-13 14:29:14 +02:00
Edouard Vanbelle 2733542bce refactor(css): dark theme: remove and merge specific cases 2026-04-13 13:26:38 +02:00
Edouard Vanbelle e6a815a03c refactor(css): dark theme: merge photos 2026-04-13 13:26:38 +02:00
Edouard Vanbelle f7c7136149 refactor(css): dark theme: merge notfication + dropzone 2026-04-13 13:26:38 +02:00
Edouard Vanbelle 260eb4d4c8 refactor(css): merge context menu for dark theme 2026-04-13 13:26:38 +02:00
Edouard Vanbelle 4dff552299 refactor(css): use 1 global declaration for scrollbar 2026-04-13 13:26:38 +02:00
Edouard Vanbelle ce207ebad1 refactor(css): merge profile + admin dark style 2026-04-13 13:26:38 +02:00
Edouard Vanbelle 413832d1a2 refactor(css): remove use generic colors for language-selector + correct item selection color 2026-04-13 13:26:38 +02:00
Edouard Vanbelle 26ce794090 fix(SharedSection): hide files list header, shared view has it's own view 2026-04-13 13:25:48 +02:00
Edouard Vanbelle 28963965a1 fix(searchResult): move search result into sticky header 2026-04-13 13:24:58 +02:00
Dionisio Pozo 9e632e147a Merge pull request #284 from su77ungr/main 2026-04-13 04:17:14 +02:00
su77ungr 1b14475d05 add WWW-Authenticate handshake for spec-compliancy 2026-04-13 02:12:17 +02:00
Dionisio Pozo 9e3e766646 Update README with OxiCloud vs NextCloud comparison 2026-04-12 20:59:45 +02:00
Dionisio Pozo dcea5040d0 Merge pull request #283 from EdouardVanbelle/refactor/css-regroupement 2026-04-12 09:53:27 +02:00
Edouard Vanbelle 54c736a8b1 refactor(css): removed unnecessary dark theme override 2026-04-12 02:58:24 +02:00
Edouard Vanbelle 4862c17e11 refactor(css): change css grouping fileType & filesView
- fileType.css for filetype to icons representation
 - filesViews.css for grid and list view (merge of previous cards.css & fileList.css)
2026-04-12 02:53:35 +02:00
Edouard Vanbelle b95cf8dee9 refactor(css/icons): centralize icon folder to card.css 2026-04-12 02:22:57 +02:00
Diocrafts 1dbe7e4553 fix: resolve all biome ci errors and warnings
- Format all 14 locale JSON files (2-space → 4-space indent per biome config)
- Fix publicShare.js: arrow functions, template literals, optional chaining,
  remove redundant 'use strict', remove unused formatSize function
- Fix music.js: template literal, unused _trackId parameter
- Fix contextMenus.js, fileOperations.js, fileSharing.js: unused parameters
- Fix auth.js, music.css, share-public.css: formatting (biome format --write)
- Remove unused biome-ignore suppression comments in cards.css and reset.css
- Remove empty .share-state block in share-public.css
- Disable noDescendingSpecificity and noImportantStyles rules in biome.json
  (intentional CSS patterns for utility classes and theme overrides)
2026-04-12 02:13:08 +02:00
Diocrafts 1efcdb58a5 quick fix 2026-04-12 02:03:19 +02:00
Diocrafts 37975afb39 fix(i18n): sync all 14 locale files to 575 keys each
- Move 38 misplaced root-level shared_* keys into shared.shared_* in
  de, es, fr, pt (values preserved, just re-nested correctly)
- Add 17 missing music.* keys to all non-en languages (en fallback)
- Add missing dialogs.*, actions.*, shared.*, notifications.* keys to
  fa (33), zh (71), de (20), fr (22), it (22), nl (20), pt (22)
- Sync language_selector.languages across all 14 locales (was missing
  ar, hi, it, ja, ko, nl, ru in most files)

All 14 languages now have exactly 575 keys matching en.json.
2026-04-12 02:02:21 +02:00
Diocrafts edf1e66989 feat: add public share page with download support (#253)
Share links now point to /s/{token} (was /api/s/{token}) and render a
proper HTML page instead of raw JSON.

Changes:
- static/share.html: standalone public share page
- static/css/views/share-public.css: share page styles
- static/js/views/public/publicShare.js: client-side logic that fetches
  share metadata via /api/s/{token}, handles password-protected shares,
  and renders file download / folder info
- build.rs: include share.html in the HTML embed pipeline
- web/mod.rs: serve /s/{token} route (unauthenticated)
- share_dto.rs: generate URLs as /s/{token} instead of /api/s/{token}
- share_handler.rs: new download_shared_file() handler that validates the
  share token and streams file content without requiring authentication
- routes.rs: mount GET /api/s/{token}/download (public, uses AppState)
2026-04-12 01:51:30 +02:00
Diocrafts c512534bfa fix: session_expired after login on HTTP deployments (#241)
Three changes to fix the immediate-logout issue reported by multiple
Docker users:

1. Add explicit `credentials: 'same-origin'` to the login fetch call.
   This was the only fetch in the entire codebase missing it. While
   modern browsers default to 'same-origin', some privacy configs or
   older engines may default to 'omit', silently dropping Set-Cookie
   headers from the login response.

2. Post-login cookie verification: after a successful login, the
   frontend now checks that the CSRF cookie (non-HttpOnly, readable
   by JS) was actually stored before redirecting. If the browser
   rejected the cookies, a clear error message is shown explaining
   the OXICLOUD_COOKIE_SECURE / HTTP mismatch.

3. Server-side diagnostic: the login handler now warns in logs when
   Secure cookies are set on a request that didn't arrive via HTTPS
   (no X-Forwarded-Proto: https header), pointing admins to the
   OXICLOUD_COOKIE_SECURE=false fix.

Root cause: users who set OXICLOUD_BASE_URL=https://... (or have
OXICLOUD_COOKIE_SECURE=true) but access via plain HTTP get cookies
with the Secure flag, which browsers silently reject over HTTP.
2026-04-12 01:38:19 +02:00
Diocrafts 5be035a172 fix: restore ext-thumbnail disk lookup in get_cached_thumbnail
After the blob_hash dedup change, get_cached_thumbnail with
blob_hash=None (cache-first fast path) only checked moka. External
video thumbnails stored as ext-{file_id}.jpg on disk were not found
after a server restart when moka is empty.

Now checks ext-{file_id}.jpg on disk before falling through to the
blob-hash disk lookup, so video thumbnails survive restarts.
2026-04-12 00:56:58 +02:00
Diocrafts 2dde4da5cf feat: thumbnail dedup — store thumbnails by blob_hash instead of file_id (#233)
Thumbnails are now keyed by blob_hash on disk so identical files share
a single set of thumbnails (icon/preview/large). For 4000 duplicate
files with the same content, this reduces thumbnail storage from 12,000
files to just 3.

Changes:
- get_thumbnail_path() keys by blob_hash instead of file_id
- get_thumbnail(), get_cached_thumbnail(), generate_all_sizes_background()
  accept blob_hash parameter for disk dedup
- generate_all_sizes_background() fast path: if blob-hash thumbnails
  already exist on disk, skip image processing entirely and just
  populate moka cache for the new file_id
- delete_thumbnails() only invalidates moka cache (shared disk
  thumbnails must not be deleted when one file is removed)
- delete_blob_thumbnails() added for GC; garbage_collect() now cleans
  up orphaned thumbnail files alongside blob files
- External thumbnails (video frames) stored as ext-{file_id}.jpg
  since they are client-generated and not dedup-able
- ThumbnailPort trait updated with blob_hash parameters
- All handler call sites updated (file_handler, preview_handler)
- Tests updated for new signatures
2026-04-12 00:50:10 +02:00
Diocrafts e91dcee0ea fix: scale folder upload timeout by file size (fixes #249)
The folder upload path (uploadFolderEntries) used a flat 10s fetch
timeout for all files regardless of size. Large files like .CR2 RAW
images (~25MB) on slower networks (e.g. Raspberry Pi) exceeded this
timeout, causing the AbortController to kill the request before the
server received the full body — hence no server logs and 'unknown
error' on the frontend.

Changed to size-scaled timeout: 30s base + 2s per MB (min 10s).
A 25MB CR2 now gets ~80s instead of 10s.
2026-04-12 00:29:34 +02:00
Dionisio Pozo eab1143324 Merge pull request #282 from mboutolleau/fix/postgresql-data-location 2026-04-11 21:54:37 +02:00