* fix(server): hide isFavorite from album asset sync stream
* some tests
* Revert "some tests"
This reverts commit 3242e6961c.
* alter existing test to clear test's intent
* Reapply "some tests"
This reverts commit f1d4c47f5f.
* drop one
* sql
* feat: add slideshow metadata overlay and settings
* Introduced a new SlideshowMetadataOverlay component to display image information during slideshows.
* Updated slideshow settings modal to include options for showing the metadata overlay and selecting its display mode (Description Only or Full).
* Added corresponding translations and store management for the new overlay features.
* remove noisy log
* constant opacity
* 2nd pass
* more
* use text components
* lint
* feat(server)!: add owned filter to albums API
BREAKING CHANGE: GET /albums with no parameters now returns all accessible albums (owned + shared-with-me) instead of only owned albums.
* document tri-state matrix
* web impl
* collapse to single method and handover branching to sql
* dedupe
* verify that owned, shared, and notShared counts are mapped independently from their respective queries
* refactor(server): add select:['id'] overload to albumRepository.getAll
Avoid fetching full album rows (with albumUsers/sharedLinks subqueries) in map.service where only album IDs are needed.
* focus relevant test filters
* fmt
* Revert "verify that owned, shared, and notShared counts are mapped independently from their respective queries"
This reverts commit 47aab458192c766de4662aada5a6841b091d2a80.
* sync sql
* Revert "document tri-state matrix"
This reverts commit a5b2355d0c6a084f2c021d517bf5ee80123d108c.
* address review comments
* inline shared condition and return as ternary
* sync sql
* use [...albums].sort
Array.toSorted() is not supported in Chrome 109
* use isShared and isOwned nomenclature
* fix e2e tests
* add params to sql query
* refactor(server)!: sanitize error messages to avoid leaking resource and permission details
* fix e2e tests
* fix(server): prevent login timing oracle by always running bcrypt
Always call compareBcrypt in the login path regardless of whether the
email is registered. When no user is found, a dummy hash is used so the
bcrypt KDF still runs and response latency is constant, making it
impossible to enumerate valid email addresses by measuring response time.
* fix(server): collapse OAuth callback messages to prevent email-existence oracle
Two distinct error messages in the OAuth callback endpoint revealed
whether an email address was already registered in the database.
An attacker controlling the OAuth provider's email claim could probe
the user table without authentication. Both cases now return the same
generic message.
* fix(server): replace email-in-use messages to prevent user-existence oracle
Error messages on registration and profile-update that named whether an
email address was already taken allowed callers to enumerate registered
accounts. All three sites now return the same generic message regardless
of whether the address is in use.
* fix(server): hide slug uniqueness constraint to prevent shared-link probe
Surfacing the Postgres unique-constraint name in the error response let
any authenticated user brute-force whether a custom slug was already in
use by another user's shared link, leaking the existence of other links.
* fix(server): unify profile image errors to prevent user-existence oracle via status code
GET /users/:id/profile-image returned HTTP 400 for an unknown user ID
but HTTP 404 when the user existed without a photo, letting callers
distinguish the two cases. Both now return 404 so the response is
identical regardless of whether the UUID maps to an account.
* fix(server): replace album user-not-found message to prevent UUID-existence oracle
Album owners could probe arbitrary UUIDs via the add-user endpoint and
determine whether they belonged to registered accounts by receiving
'User not found'. The message is now ambiguous about whether the ID was
unrecognised or the user is inactive.
* Revert "fix e2e tests"
This reverts commit c1bd7a116b3f0fccf3d2530c8e34b13c1d862989.
* Revert "refactor(server)!: sanitize error messages to avoid leaking resource and permission details"
This reverts commit b96421a08387340fbb77913ca89b0717bcd9945d.
* fix(server): use 403 instead of 400 for access-denied errors
requireAccess threw BadRequestException which is incorrect HTTP semantics.
Access denial is a client authorization problem (403 Forbidden), not a
malformed request (400 Bad Request). Keep the descriptive permission name
in the message since the full permission set is public API surface.
* Revert "fix(server): use 403 instead of 400 for access-denied errors"
This reverts commit bb069909571f4e514e7d050ddf588c017ee5a029.
* shorten comment
* add log messages
* format
* one more
* init
* fix
* styling
* temporary workaround for 500 error
**Root cause:**
The autogenerated Dart OpenAPI client (`UsersApi.createProfileImage()`) had two issues:
1. It set `Content-Type: multipart/form-data` without a boundary, which overrode the correct header that Dart's `MultipartRequest` would set (`multipart/form-data; boundary=...`).
2. It added the file to both `mp.fields` and `mp.files`, creating a duplicate text field.
**Result:**
Multer on the server failed to parse the multipart body, so `@UploadedFile()` was `undefined` → accessing `file.path` in `UserService.createProfileImage()` threw → **500 Internal Server Error**.
**Workaround:**
Bypass the autogenerated method in `UserApiRepository.createProfileImage()` and send the multipart request directly using the same `ApiClient` (basePath + auth), ensuring:
- No manual `Content-Type` header (let `MultipartRequest` set it with boundary)
- File only in `mp.files`, not `mp.fields`
- Proper filename fallback
* Revert "temporary workaround for 500 error"
This reverts commit 8436cd402632ca7be9272a1c72fdaf0763dcefb6.
* generate route for ProfilePictureCropPage
* add route import
* simplify
* try this
* Revert "try this"
This reverts commit fcf37d2801055c49010ddb4fd271feb900ee645a.
* try patching
* Reapply "temporary workaround for 500 error"
This reverts commit faeed810c21e4c9f0839dfff1f34aa6183469e56.
* Revert "Reapply "temporary workaround for 500 error""
This reverts commit a14a0b76d14975af98ef91748576a79cef959635.
* fix upload
* Refactor image conversion logic by introducing a new utility function. Replace inline image-to-Uint8List conversion with the new utility in EditImagePage, DriftEditImagePage, and ProfilePictureCropPage.
* use toast over snack
* format
* Revert "try patching"
This reverts commit 68a616522a1eee88c4a9755a314c0017e6450c0f.
* Enhance toast notification in ProfilePictureCropPage to include success type for better user feedback.
* Revert "simplify"
This reverts commit 8e85057a40.
* format
* add tests
* refactor to use statefulwidget
* format
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* set album cover from asset
* add to correct kebab group
* add to album selection
* add to legacy control bottom bar
* add tests
* format
* analyze
* Revert "add to legacy control bottom bar"
This reverts commit 9d68e12a08.
* remove unnecessary event emission
* lint
* fix tests
* fix: button order and remove unncessary check
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix(cli): delete sidecar files after upload if requested
Introduced a new function, findSidecar, to locate XMP sidecar files based on specified naming conventions. Updated the deleteFiles function to delete associated sidecar files when the main asset file is deleted. Added unit tests for findSidecar to ensure correct functionality.
* lint and format
* fix test
* chore: clean up
---------
Co-authored-by: Jason Rasmussen <jason@rasm.me>
* chore: update task commands in mise.toml to use pnpm
* Replaced direct commands with pnpm run equivalents for consistency.
* Added new tasks for type checking and Svelte checks.
* Removed deprecated svelte-kit-sync task and adjusted dependencies accordingly.
* mroe
* chore: update mise.toml to add demo server task
* Removed the direct IMMICH_SERVER_URL setting from the environment section.
* Added a new task for starting the demo server with the IMMICH_SERVER_URL environment variable.
* Ensured consistency in task definitions.
* refactor: simplify album selection actions by removing shared option
* Removed the shared option from AddToAlbumAction and related components.
* Updated AlbumPickerModal and other components to reflect this change.
* Cleaned up related tests and documentation for consistency.
* fix lint
* feat: add support for MXF format in media handling
* Updated supported formats documentation to include MXF.
* Added MXF to valid video extensions in tests.
* Registered MXF MIME type in mime-types utility.
* fix: enhance MXF handling in mime-types utility
* Updated video mime type validation to include 'application/mxf'.
* Adjusted asset type determination to recognize MXF as a video container.
* chore: clean up
---------
Co-authored-by: Jason Rasmussen <jason@rasm.me>
* faces
* add openapi descriptions
* remove dto descriptions
* gen openapi
* dtos
* fix dtos
* fix more
* fix build
* more
* complete dtos
* descriptions on rebase
* gen rebase
* revert correct integer type conversion
* gen after revert
* revert correct nullables
* regen after revert
* actually incorrect adding default here
* revert correct number type conversion
* regen after revert
* revert nullable usage
* regen fully
* readd some comments
* one more
* one more
* use enum
* add missing
* add missing controllers
* add missing dtos
* complete it
* more
* describe global key and slug
* add remaining body and param descriptions
* lint and format
* cleanup
* response and schema descriptions
* test patch according to suggestion
* revert added api response objects
* revert added api body objects
* revert added api param object
* revert added api query objects
* revert reorganized http code objects
* revert reorganize ApiOkResponse objects
* revert added api response objects (2)
* revert added api tag object
* revert added api schema objects
* migrate missing asset.dto.ts
* regenerate openapi builds
* delete generated mustache files
* remove descriptions from properties that are schemas
* lint
* revert nullable type changes
* revert int/num type changes
* remove explicit default
* readd comment
* lint
* pr fixes
* last bits and pieces
* lint and format
* chore: remove rejected patches
* fix: deleting asset from asset-viewer on search results (#25596)
* fix: escape handling in search asset viewer (#25621)
* fix: correctly show owner in album options modal (#25618)
* fix: validation issues
* fix: validation issues
---------
Co-authored-by: Jason Rasmussen <jason@rasm.me>
Co-authored-by: Min Idzelis <min123@gmail.com>
Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
Co-authored-by: Paul Makles <me@insrt.uk>