immich-app / immich

High performance self-hosted photo and video management solution.
https://immich.app
GNU Affero General Public License v3.0
39.7k stars 1.9k forks source link

[BUG] After a non-admin user uploads a single photo directly to a shared album that same photo then can't be deleted by either that user or the admin user; and the only resolve is to delete the entire shared album and recreate it, and only then is the user able to delete their own photo via Photos view. Note: Automatic backup is not enabled. #2265

Closed jon-f-novastor closed 1 year ago

jon-f-novastor commented 1 year ago

The bug

[BUG] After a non-admin user uploads a single photo directly to a shared album that same photo then can't be deleted by either that user or the admin user; and the only resolve is to delete the entire shared album and recreate it, and only then is the user able to delete their own photo via Photos view. Note: Automatic backup is not enabled. The photo that was uploaded by a normal user to the shared album directly was a valid photo that did not appear with blank / null contents, and the info but it showed the full path fine and the image was perfectly viewable. This was a fresh install of immich 1.53.0 build.76 (which was the latest dev version as of 04/14/2023, at that time) and the album in question had only 10 or so images in it. The deletion attempts were attempted with 1.53.0 for both the immich version installed on Ubuntu 22.04 arm64 (Raspberry Pi 4b) and the Android app version that matches that 1.53.0 version, both downloaded and installed on 04/14/2023. I tried deleting the single uploaded folder (the user only had ONE photo uploaded, which showed in their Photos view as the single image and in the shared album in question) both as the admin using the website and the Android app and I as the admin could not delete that other normal user's photo that they had uploaded directly to an album, and which showed as the user's only photo in the "Photos" section of the website (seen when logged in as that user), AND then after discovering that the admin user could not delete the photo I also tried deleting that photo as the same end user that had uploaded it originally that still existed as a user and logged in to the website and the Android app by attempting to delete that single valid looking image (i.e. it was not blank / null contents) or looking corrupt in any way, but no matter what even though there was Delete button to utilize and click on, the photo would not actually delete. I only attempted this with a single photo that had been uploaded by a normal end user to upload to a shared album that the user had permissions on, and nothing worked! The only thing that solved this for me which was unfortunate to have to do, was as the admin I deleted the album on the website and FINALLY after that I could log in as the same user that uploaded the photo to that shared album originally could still see that same single photo uploaded in their "Photos" section / view and THEN I could delete the photo just fine, I suspect there is a linking issue that doesn't let the photo be deleted from Photos section by either the end user or the admin user, if that photo is already in a shared album, but the problem is here as far as I can tell, and I tried it for multiple hours to get it deleted otherwise, like deleting on the filesystem, in library and thumbs folder (I don't know how to connect to the Postgres DB yet which was probably necessary to unlink it from the user / or shared album in a Postgres table somewhere) etc., and that was the only resolve was to delete the entire shared album first, then that photo in that user's Photos section / view could be deleted by the end user logged in! Please look into this, as it is rather annoying to be locked out of deleting a photo even as the admin attempting to just remove a single photo from an album that a normal user had uploaded, and neither user can delete the item with either the website or Android app (I realize that the Android app probably can't do the later yet, but surely the web version should be able to do this?).

Note: Please note, I hope I'm not creating a duplicate bug for this, sorry I'm brand new to the software!

The OS that Immich Server is running on

Ubuntu 22.10 (Kinetic Kudu) 64-bit installed on a Raspberry Pi 4b

Version of Immich Server

1.53.0 build.76

Version of Immich Mobile App

1.53.0 (April 5th release date, the app was downloaded directly via the Android Play Store, and I'm not joined to the beta program in the Play Store)

Platform with the issue

Your docker-compose.yml content

version: "3.8"

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:release
    entrypoint: ["/bin/sh", "./start-server.sh"]
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
    env_file:
      - .env
    depends_on:
      - redis
      - database
      - typesense
    restart: always

  immich-microservices:
    container_name: immich_microservices
    image: ghcr.io/immich-app/immich-server:release
    entrypoint: ["/bin/sh", "./start-microservices.sh"]
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
    env_file:
      - .env
    depends_on:
      - redis
      - database
      - typesense
    restart: always

  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:release
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - model-cache:/cache
    env_file:
      - .env
    restart: always

  immich-web:
    container_name: immich_web
    image: ghcr.io/immich-app/immich-web:release
    entrypoint: ["/bin/sh", "./entrypoint.sh"]
    env_file:
      - .env
    restart: always

  typesense:
    container_name: immich_typesense
    image: typesense/typesense:0.24.0
    environment:
      - TYPESENSE_API_KEY=${TYPESENSE_API_KEY}
      - TYPESENSE_DATA_DIR=/data
    logging:
      driver: none
    volumes:
      - tsdata:/data
    restart: always

  redis:
    container_name: immich_redis
    image: redis:6.2
    restart: always

  database:
    container_name: immich_postgres
    image: postgres:14
    env_file:
      - .env
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      PG_DATA: /var/lib/postgresql/data
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: always

  immich-proxy:
    container_name: immich_proxy
    image: ghcr.io/immich-app/immich-proxy:release
    environment:
      # Make sure these values get passed through from the env file
      - IMMICH_SERVER_URL
      - IMMICH_WEB_URL
    ports:
      - 2283:8080
    logging:
      driver: none
    depends_on:
      - immich-server
    restart: always

volumes:
  pgdata:
  model-cache:
  tsdata:

Your .env content

###################################################################################
# Database
###################################################################################

DB_HOSTNAME=immich_postgres
DB_USERNAME=postgres
DB_PASSWORD=postgres
DB_DATABASE_NAME=immich

# Optional Database settings:
# DB_PORT=5432

###################################################################################
# Redis
###################################################################################

REDIS_HOSTNAME=immich_redis

# REDIS_URL will be used to pass custom options to ioredis.
# Example for Sentinel
# {"sentinels":[{"host":"redis-sentinel-node-0","port":26379},{"host":"redis-sentinel-node-1","port":26379},{"host":"redis-sentinel-node-2","port":26379}],"name":"redis-sentinel"}
# REDIS_URL=ioredis://eyJzZW50aW5lbHMiOlt7Imhvc3QiOiJyZWRpcy1zZW50aW5lbDEiLCJwb3J0IjoyNjM3OX0seyJob3N0IjoicmVkaXMtc2VudGluZWwyIiwicG9ydCI6MjYzNzl9XSwibmFtZSI6Im15bWFzdGVyIn0=

# Optional Redis settings:

# Note: these parameters are not automatically passed to the Redis Container
# to do so, please edit the docker-compose.yml file as well. Redis is not configured
# via environment variables, only redis.conf or the command line

# REDIS_PORT=6379
# REDIS_DBINDEX=0
# REDIS_USERNAME=
# REDIS_PASSWORD=
# REDIS_SOCKET=

###################################################################################
# Upload File Location
#
# This is the location where uploaded files are stored.
###################################################################################

UPLOAD_LOCATION=/media/immich/upload

###################################################################################
# Typesense
###################################################################################
TYPESENSE_API_KEY=some-random-text
# TYPESENSE_ENABLED=false
# TYPESENSE_URL uses base64 encoding for the nodes json.
# Example JSON that was used:
# [
#      { 'host': 'typesense-1.example.net', 'port': '443', 'protocol': 'https' },
#      { 'host': 'typesense-2.example.net', 'port': '443', 'protocol': 'https' },
#      { 'host': 'typesense-3.example.net', 'port': '443', 'protocol': 'https' },
#  ]
# TYPESENSE_URL=ha://WwogICAgeyAnaG9zdCc6ICd0eXBlc2Vuc2UtMS5leGFtcGxlLm5ldCcsICdwb3J0JzogJzQ0MycsICdwcm90b2NvbCc6ICdodHRwcycgfSwKICAgIHsgJ2hvc3QnOiAndHlwZXNlbnNlLTIuZXhhbXBsZS5uZXQnLCAncG9ydCc6ICc0NDMnLCAncHJvdG9jb2wnOiAnaHR0cHMnIH0sCiAgICB7ICdob3N0JzogJ3R5cGVzZW5zZS0zLmV4YW1wbGUubmV0JywgJ3BvcnQnOiAnNDQzJywgJ3Byb3RvY29sJzogJ2h0dHBzJyB9LApd

###################################################################################
# Reverse Geocoding
#
# Reverse geocoding is done locally which has a small impact on memory usage
# This memory usage can be altered by changing the REVERSE_GEOCODING_PRECISION variable
# This ranges from 0-3 with 3 being the most precise
# 3 - Cities > 500 population: ~200MB RAM
# 2 - Cities > 1000 population: ~150MB RAM
# 1 - Cities > 5000 population: ~80MB RAM
# 0 - Cities > 15000 population: ~40MB RAM
####################################################################################

# DISABLE_REVERSE_GEOCODING=false
# REVERSE_GEOCODING_PRECISION=3

####################################################################################
# WEB - Optional
#
# Custom message on the login page, should be written in HTML form.
# For example:
# PUBLIC_LOGIN_PAGE_MESSAGE="This is a demo instance of Immich.<br><br>Email: <i>demo@demo.de</i><br>Password: <i>demo</i>"
####################################################################################

PUBLIC_LOGIN_PAGE_MESSAGE=

####################################################################################
# Alternative Service Addresses - Optional
#
# This is an advanced feature for users who may be running their immich services on different hosts.
# It will not change which address or port that services bind to within their containers, but it will change where other services look for their peers.
# Note: immich-microservices is bound to 3002, but no references are made
####################################################################################

IMMICH_WEB_URL=http://immich-web:3000
IMMICH_SERVER_URL=http://immich-server:3001
IMMICH_MACHINE_LEARNING_URL=http://immich-machine-learning:3003

####################################################################################
# Alternative API's External Address - Optional
#
# This is an advanced feature used to control the public server endpoint returned to clients during Well-known discovery.
# You should only use this if you want mobile apps to access the immich API over a custom URL. Do not include trailing slash.
# NOTE: At this time, the web app will not be affected by this setting and will continue to use the relative path: /api
# Examples: http://localhost:3001, http://immich-api.example.com, etc
####################################################################################

#IMMICH_API_URL_EXTERNAL=http://localhost:3001

Reproduction steps

After a non-admin user uploads a single photo directly to a shared album that same photo then can't be deleted by either that user or the admin user; and the only resolve is to delete the entire shared album and recreate it, then the user can delete their own photo via Photos view. It was a valid photo an was not blank / null contents, and the info but it showed the full path fine and the image was perfectly viewable. This was a fresh install of immich 1.53.0 build.76 (which was the latest dev version as of 04/14/2023, at that time) and the album in question had only 10 or so images in it. The deletion attempts were attempted with 1.53.0 for both the immich version installed on Ubuntu 22.04 arm64 (Raspberry Pi 4b) and the Android app version that matches that 1.53.0 version, both downloaded and installed on 04/14/2023. I tried both as the admin using the website and the Android app and I as the admin could not delete that other normal user's photo that they had uploaded directly to an album, and which showed as the user's only photo in the "Photos" section of the website (seen when logged in as that user), AND I also tried deleting that photo as the admin user logged in to the website and the Android app by attempting to delete that single valid looking image (i.e. it was not blank / null contents) or looking corrupt in any way, but no matter what even though there was Delete button to utilize and click on, the photo would not actually delete. I only attempted this with a single photo by a normal user to upload to a shared album that the user had permissions on, and nothing worked! The only thing that solved this for me which was unfortunate to have to do, was as the admin I deleted the album on the website and FINALLY after that I could log in as the same user that uploaded the photo to that shared album originally could still see that same single photo uploaded in their "Photos" section / view and THEN I could delete the photo just fine, I suspect there is a linking issue that doesn't let the photo be deleted from Photos section by either the end user or the admin user, if that photo is already in a shared album, but the problem is here as far as I can tell, and I tried it for multiple hours to get it deleted otherwise, like deleting on the filesystem, in library and thumbs folder (I don't know how to connect to the Postgres DB yet which was probably necessary to unlink it from the user / or shared album in a Postgres table somewhere) etc., and that was the only resolve was to delete the entire shared album first, then that photo in that user's Photos section / view could be deleted by the end user logged in!

Additional information

No response

alextran1502 commented 1 year ago

This is a known bug and is fixed is #2223. It will be available in the next release

jon-f-novastor commented 1 year ago

@alextran1502 OK thank you for letting me know that it is fixed in https://github.com/immich-app/immich/pull/2223, I saw a similar in progress issue just prior to posting this new bug when looking through the roadmap, which is https://github.com/immich-app/immich/issues/739, but that issue mentioned that it only affected if the Automatic backup feature was enabled, and I did not use that feature yet. I edited my own bug issue to reflect that at the end "Note: Automatic backup is not enabled.". Thanks for the great app, it runs well on a 2GB Raspberry Pi 4B, with the Ubuntu 22.04 x64 OS, app, and data on a UASP USB 3.0 connected SSD (w/Trim enabled), and Immich is so much faster than the self-hosted Nextcloud server app that I had prior installed on the same hardware, which in my little bit of research to find a replacement to App-Which-Must-Not-Be-Named anymore that one kept coming up in discussions, which I had tried out just prior to reading about Immich on Reddit. That app was not even usable on that same hardware, I would guess it needs quite a bit more powerful hardware or just more RAM maybe. Thanks for the great work to you and the contributors, this will be a lifesaver once the small amount of bugs are resolved! I love the look of it in what it is trying to replace as far as the UI as compared to any other apps I have found. I will be on the lookout for that next release to get it upgraded, will need to look through the documentation to know how to do upgrades of an already deployed docker image though, this being my first docker app ever installed / utilized!

alextran1502 commented 1 year ago

fixed in @2223