Commit Graph
1152 Commits
Author SHA1 Message Date
Nicolas Clerc 350a4828f8 📝(backend) document OnlyOffice conversion environment variables
The conversion feature added in PR #719 introduced several settings
that were missing from the environment reference.
2026-06-08 11:59:32 +02:00
Nicolas Clerc 212f4f1b19 🐛(backend) reject conversion when JWT secret is not configured
Without the secret the request reaches OnlyOffice unsigned and fails
with a cryptic error code -8. Validate in the synchronous path before
creating the placeholder so the API returns an error immediately, and
hide the convert ability from the API so the frontend does not offer
the action.

The backend now reads the secret directly from settings, like it
already does for timeouts.
2026-06-08 11:59:32 +02:00
Nicolas Clerc c67cb28d65 🐛(backend) prefer WOPI query param over Authorization header
When OnlyOffice has JWT enabled it adds its own Authorization header to
outgoing file-download requests. The WOPI access token in the query
param must take precedence so the opaque token lookup succeeds.
2026-06-08 11:59:32 +02:00
Nicolas Clerc 5149283688 (backend) sign OnlyOffice conversion requests with JWT
The OnlyOffice server rejects unsigned /converter requests with error
code -8 when JWT is enabled.

Add a dedicated WOPI_ONLYOFFICE_CONVERT_JWT_SECRET setting and fix the
JWT body token format to match the OnlyOffice conversion API: encode
parameters directly instead of wrapping them in {"payload": …}, and
send only {"token": "…"} in the request body.

Enable JWT on the development OnlyOffice container so the issue is
caught locally.
2026-06-08 11:59:32 +02:00
Nicolas Clerc 3e89881cca 🔥(backend) remove unused OnlyOffice conversion JWT options
ConvertJwtSecret, ConvertJwtRequired and the jwt_required constructor
guard were never configured in any environment.
2026-06-08 11:59:32 +02:00
Nicolas Clerc cbec3ba077 🌐(frontend) reuse download label for folder export action
As we want to use the same label for file download and folder export,
the same key is used, and the unused one is removed.
2026-06-08 10:48:40 +02:00
neilcroft 05754638ad 🐛(backend) sanitize slash in template-created filenames
Titles containing '/' (e.g. "30/03/30 - liste à faire") produced
a file_key with spurious path separators, crashing WOPI on open.

Extract `format_template_filename()` to replace '/' with '-' when
building the filename from a template title.

Closes #626
2026-06-04 11:26:58 +02:00
Nathan VasseandNicolas Clerc 43bc6ece92 (frontend) reuse clipboard permissions helper on firefox
The dropdown menu test was failing on firefox because
context.grantPermissions does not accept the clipboard-* strings
on that browser. Use the shared helper which skips firefox where
clipboard support is enabled at launch via firefoxUserPrefs.
2026-06-04 11:16:40 +02:00
Nathan VasseandNicolas Clerc f17d7a8e50 (frontend) test public folder CTAs
Cover the folder explorer header on a public folder: authenticated
users see no anonymous CTA; anonymous users see AnonymousCTA with
a login button that redirects to /authenticate/. A third case
exercises the anonymous dropdown menu — copy link writes the
folder URL to the clipboard, and switching language updates the
visible CTA text.
2026-06-04 11:16:40 +02:00
Nathan VasseandNicolas Clerc bdf6c293c3 (frontend) test public file preview CTAs
Cover the contextual CTAs on the standalone file preview page:
authenticated users get MyFilesCTA redirecting to /my-files, and
anonymous users get AnonymousCTA with the default "/" try-out
fallback plus a login button that redirects to /authenticate/.
A dedicated case mocks FRONTEND_EXTERNAL_HOME_URL to ensure the
try-out href follows the config.
2026-06-04 11:16:40 +02:00
Nathan VasseandNicolas Clerc 4adbe9f2b7 (frontend) wire CTAs into header and standalone file preview
UserProfile now renders AnonymousCTA along with a dropdown menu
(copy link, language picker) when no user is authenticated, so
visitors on a public page can still act on it without the user
menu. CustomFilesPreview gains a CONTEXTUAL mode that swaps in
the right CTA based on auth state, used by the standalone file
preview page which is now wrapped in GlobalLayout to expose the
auth context.
2026-06-04 11:16:40 +02:00
Nathan VasseandNicolas Clerc 82e57aefc5 (frontend) add AnonymousCTA and MyFilesCTA components
AnonymousCTA offers a try-out link and a sign-in button to visitors
landing on a public resource. MyFilesCTA is the authenticated
counterpart, sending the user back to their drive. Translations
cover both CTAs and the anonymous dropdown menu that will live next
to them. Components are consumed in a follow-up commit.
2026-06-04 11:16:40 +02:00
Nathan VasseandNicolas Clerc 3088455abf ⬆️(frontend) bump ui-kit to 0.22.0
Required for the DropdownMenu, useDropdownMenu and Folder exports
used by the upcoming anonymous and my-files CTA components.
2026-06-04 11:16:40 +02:00
Nicolas Clerc a4105a3432 (backend) allow grist file upload
The .grist extension was already in FILE_EXTENSIONS_ALLOWED but
upload failed at MIME type validation because python-magic detects
grist files as application/vnd.sqlite3.
2026-06-03 18:38:46 +02:00
Nicolas Clerc 7ac7dd5ef5 🐛(frontend) add missing export action translations
The folder export button added in cd7bebfc used
the translation key explorer.item.actions.export
without adding the corresponding entries.
2026-06-03 18:23:07 +02:00
Nicolas Clerc 302bff1605 (e2e) cover conversion explorer flow
The conversion flow crosses modal state, API calls, and explorer refreshes.

Cover the expected user path with a mocked conversion ability and placeholder
response.
2026-06-03 16:47:38 +02:00
Nicolas Clerc 4f85801abe ♻️(frontend) generalize duplicating poller to transient items
The same polling loop fits any transient upload state.

Rename the duplicating poller to a transient one driven by
TRANSIENT_UPLOAD_STATES so converting items are picked up without copying
the hook, and the explorer refreshes automatically when background
conversion finishes.
2026-06-03 16:47:38 +02:00
Nicolas Clerc aeb6c9b5c7 (frontend) render converting items as transient rows
A converting file is visible but not ready for normal file actions.

Show the transient state consistently and prevent opening or acting on the item
until conversion completes.
2026-06-03 16:47:38 +02:00
Nicolas Clerc af6ab74e42 (frontend) add conversion modal
Users should understand that opening a legacy file creates an editable copy.

Keep the modal focused on confirmation and let the folder show the ongoing
conversion state.
2026-06-03 16:47:38 +02:00
Nicolas Clerc 462c3e5e7a (frontend) wire conversion API client
The frontend needs to treat conversion as item creation rather than job polling.

Return the placeholder item from the driver so UI state stays aligned with the
explorer list.
2026-06-03 09:28:56 +02:00
Nicolas Clerc 6a07e183ce 🐛(backend) normalize WOPI extension lookup
Uploaded filenames preserve extension case, while WOPI discovery stores
extension keys in lowercase.

Normalize the lookup so legacy files like REPORT.DOC follow the same conversion
path.
2026-06-03 09:28:56 +02:00
Nicolas Clerc 10f5724951 (backend) queue legacy file conversion
Starting a conversion should be quick for the API caller and continue in the
background.

Queue the placeholder-backed conversion task from the item endpoint.
2026-06-03 09:28:56 +02:00
Nicolas Clerc acfd09be8f (backend) expose legacy conversion ability
The explorer needs to know when opening a legacy Office file should start
conversion instead of WOPI editing.

Expose the decision on item abilities so the frontend can keep the flow item-
based.
2026-06-02 15:23:42 +02:00
Nicolas Clerc 20596fa98a (backend) add placeholder-backed conversion service
Users need immediate feedback in the current folder while conversion continues
in the background.

Create the target item up front and complete it once converted bytes are
available.
2026-06-02 15:23:42 +02:00
Nicolas Clerc a67efc234b (backend) add converting upload state
Converted files should appear in the folder immediately while Celery is still
working.

Add a dedicated transient state instead of overloading upload or duplication
states.
2026-06-02 15:23:42 +02:00
Nicolas Clerc a997fa826f (backend) build short-lived WOPI source URLs
OnlyOffice must fetch the source bytes from Drive during server-side conversion.

Use short-lived WOPI access URLs so conversion does not depend on direct object
storage reachability.
2026-06-02 15:23:42 +02:00
Nicolas Clerc b4fc5ec2a3 (backend) add legacy conversion policy helpers
Legacy Office formats need an explicit conversion policy before they can be
opened for editing.

Keep the mapping small and configuration-driven so the backend only converts
formats intentionally forced by the WOPI client.
2026-06-02 15:23:42 +02:00
Nicolas Clerc 88e2693704 (backend) add OnlyOffice conversion backend
Drive needs a server-side path to convert legacy Office files without opening an
interactive editor session.

Use OnlyOffice's conversion API as the first supported provider for the POC.
2026-06-02 15:23:42 +02:00
Nicolas Clerc cd7bebfcb8 (frontend) add folder export action
Expose the backend folder ZIP export from explorer folder menus
through the Download action.
2026-05-28 10:43:52 +02:00
Nicolas Clerc ded840a6e1 (backend) add folder export streaming endpoint
Issue #412 asks for a way to download an entire folder. Add a
GET /items/<id>/export/ action that streams a recursive ZIP archive of
the folder, preserving the directory hierarchy and skipping soft-deleted
or not-yet-uploaded descendants.
2026-05-28 10:43:52 +02:00
Nicolas Clerc 7b12fdb92a (backend) add zipstream-ng dependency
Used to stream a zip archive of a folder's content over HTTP without
buffering the whole archive in memory.
2026-05-28 10:42:53 +02:00
Nicolas Clerc c610e1bb28 (backend) add export ability on folders
Introduce a new "export" entry in Item.get_abilities, true only for
folders the user can read. Will be the gate for the upcoming recursive
folder export endpoint.
2026-05-28 10:42:53 +02:00
Nicolas Clerc afc78fb77f 🧑‍💻(backend) add reconciliation demo command
Seed two accounts and a CSV to exercise the reconciliation flow end to end
through the admin and the frontend.
2026-05-27 17:36:47 +02:00
Nicolas Clerc 6f926c61b4 (frontend) add user reconciliation confirmation pages
Let users confirm by email that they control both accounts, closing the
reconciliation flow on the frontend.
2026-05-27 17:36:47 +02:00
Nicolas Clerc 9995a2af30 📝(doc) document user account reconciliation
Explain the CSV import flow and the form URL setting so admins can run
account merges.
2026-05-27 17:36:47 +02:00
Nicolas Clerc ff184e1336 (backend) add reconciliation email confirmation endpoint
Let users confirm by email that they control both accounts before the
merge is allowed to run.
2026-05-27 17:36:47 +02:00
Nicolas Clerc e2538680de (backend) add user reconciliation admin
Give admins a UI to import reconciliation CSVs and trigger the actual
merge once both addresses are confirmed.
2026-05-27 17:36:47 +02:00
Nicolas Clerc 0ce6c56bd4 (backend) add user reconciliation csv import task
Let an admin bulk-create reconciliation requests from an external CSV
export instead of entering each pair by hand.
2026-05-27 17:36:47 +02:00
Nicolas Clerc df47d3ccf9 (backend) add user reconciliation models
Merge an inactive account's content into the active one once both email
addresses are confirmed, so users keep a single account.
2026-05-27 17:36:47 +02:00
Nicolas Clerc fcf459d536 (backend) add generic send_email method on user model
The user reconciliation flow needs to send templated emails to users.
2026-05-27 08:02:08 +02:00
Nicolas Clerc 06d841c5a1 🔥(backend) drop deprecated numchild columns from item
The _deprecated_numchild and _deprecated_numchild_folder fields were
kept temporarily to preserve the underlying columns during the tree
model transition. The columns are no longer read or written, so the
fields and their columns can now be removed.
2026-05-26 09:25:17 +02:00
RolletQuentinandManuel Raynaud 3293ce5269 🐛(backend) replace VersionId by Etag for WOPI
When we try to get the VersionId from the s3 response
but this one is not send by the s3 storage (garage for example),
we get a 500 error.
To fix this issue we use the ETag sent by the object storage to track
the version id. This ETag is present also when versionning is not
implemented.

Co-authored-by: RolletQuentin <rolletquen@gmail.com>
2026-05-18 14:25:39 +02:00
renovate[bot]andNicolas Clerc 4ecc4d7a46 ⬆️(dependencies) update django to v5.2.14 [SECURITY] 2026-05-13 10:03:25 +02:00
Manuel Raynaud 90a5dff1f9 ⬆️(dependencies) update urllib3 to v2.7.0 [SECURITY]
Update to patch CVE CVE-2026-44431 and CVE-2026-44432
2026-05-12 15:02:51 +02:00
Nathan Vasse 74b0f84ea0 ♻️(frontend) move mime imports to ui-kit
Some imports were re exported from the mime type file. Let's
import directly from ui-kit.
2026-05-11 14:58:06 +02:00
Nathan Vasse 18d8b22eb7 📝(doc) update changelog
Update the changelog based on the recent commits about
file previewer.
2026-05-11 14:48:22 +02:00
Nathan Vasse 10d72079ae (frontend) replace per-format preview tests with smoke tests
Detailed FilePreview behavior is now covered by Playwright CT inside
the ui-kit repo, so the drive e2e suite only keeps integration smoke
checks: upload -> open -> render for PDF, image, video, audio, plus
prev/next navigation across files.
2026-05-06 17:19:45 +02:00
Nathan Vasse 3ddd7e5db5 ♻️(frontend) replace custom file preview with ui-kit FilePreview
The ui-kit ships a complete FilePreview (PDF, image, video, audio,
WOPI, error/unsupported, navigation, controls), so we drop the in-app
implementation under features/ui/preview/ and keep only a thin
CustomFilesPreview wrapper that maps Item to FilePreviewType, plugs
in the share modal, info sidebar and posthog event.

The WOPI editor is moved to its own features/wopi/ folder and
openWopiInNewTab now takes a FilePreviewType to match the ui-kit
onOpenInEditor callback. The file_preview translation block moves to
the ui-kit too.
2026-05-06 17:19:45 +02:00
Nathan Vasse b7d635b7bf ♻️(frontend) delegate file icons to ui-kit FileIcon
The ui-kit now ships FileIcon along with mime-category and icon-set
utilities, so we drop the local catalog (MIME_MAP, KNOWN_EXTENSIONS,
getMimeCategory, getIconByMimeType, FolderIcon, WorkspaceIcon) and
keep only the drive-specific extensions: folders and suspicious
uploads, exposed through getItemExtendedIcon. ItemIcon falls back to
ui-kit FileIcon for everything else.
2026-05-06 17:19:45 +02:00
Nathan Vasse d99116edb8 ⬆️(frontend) upgrade ui-kit version
Upgrade to the latest version that includes FileIcon, mimetype utils
and FilePreview.
2026-05-06 17:19:45 +02:00