Django admin user re-creation does not respect database's unique constraint on secondary keys and crashes Funkwhale on startup
Steps to reproduce
- add the .env parameter to enforce email address confirmation when users sign up (many users already exist)
- former users try to login but sees a simple "A server error ocurred" message
- admin deletes and re-creates user in Users > Users wuth Django admin
- users confirms the account by clicking on the link in email
- users still sees the "A server error ocurred" message
- Admin restarts Funkwhale, it crashes with this error:
Traceback (most recent call last):
janv. 06 12:58:25 audio-01 gunicorn[846]: File "/var/www/funkwhale/virtualenv/lib/python3.7/site-packages/django/db/backends/utils.py", line 86, in _execute
janv. 06 12:58:25 audio-01 gunicorn[846]: return self.cursor.execute(sql, params)
janv. 06 12:58:25 audio-01 gunicorn[846]: psycopg2.errors.UniqueViolation: ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « federation_actor_url_key »
DETAIL: La clé « (fid)=(https://audio.liberta.vip/federation/actors/Xtov) » existe déjà.
Funkwhale's CLI cannot remove the problem by deleting user and spits an error:
root@audio-01 api # sudo -u audiolibertadmin -H -E /var/www/funkwhale/virtualenv/bin/python manage.py fw users rm --hard Xtov
2021-01-06 13:13:14,166 funkwhale_api.config INFO Loaded env file at /var/www/funkwhale/config/.env
2021-01-06 13:13:14,166 funkwhale_api.config INFO Running with the following plugins enabled: funkwhale_api.contrib.scrobbler
Do you want to delete 1 objects? This action is irreversible. [y/N]: y
Deleting Xtov…
2021-01-06 12:13:16,586 funkwhale_api.users.tasks INFO Starting deletion of account Xtov…
2021-01-06 12:13:16,624 funkwhale_api.users.tasks INFO Deleted user object
Traceback (most recent call last):
File "manage.py", line 25, in <module>
main.invoke()
File "/var/www/funkwhale/api/funkwhale_api/cli/main.py", line 15, in invoke
return base.cli()
File "/var/www/funkwhale/virtualenv/lib/python3.7/site-packages/click/core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "/var/www/funkwhale/virtualenv/lib/python3.7/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/var/www/funkwhale/virtualenv/lib/python3.7/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/var/www/funkwhale/virtualenv/lib/python3.7/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/var/www/funkwhale/virtualenv/lib/python3.7/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/var/www/funkwhale/virtualenv/lib/python3.7/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/var/www/funkwhale/api/funkwhale_api/cli/base.py", line 21, in action
return f(*args, **kwargs)
File "/var/www/funkwhale/api/funkwhale_api/cli/users.py", line 196, in delete
handler_delete_user(usernames=username, soft=not hard)
File "/usr/lib/python3.7/contextlib.py", line 74, in inner
return func(*args, **kwds)
File "/var/www/funkwhale/api/funkwhale_api/cli/users.py", line 79, in handler_delete_user
tasks.delete_account(user_id=user.pk)
File "/var/www/funkwhale/virtualenv/lib/python3.7/site-packages/celery/local.py", line 191, in __call__
return self._get_current_object()(*a, **kw)
File "/var/www/funkwhale/virtualenv/lib/python3.7/site-packages/celery/app/task.py", line 393, in __call__
return self.run(*args, **kwargs)
File "/var/www/funkwhale/api/funkwhale_api/taskapp/celery.py", line 57, in inner
return function(*args, **kwargs)
File "/var/www/funkwhale/api/funkwhale_api/users/tasks.py", line 22, in delete_account
federation_tasks.remove_actor(actor_id=actor.pk)
AttributeError: 'NoneType' object has no attribute 'pk'
What happens?
- Funkwhale crashes
- User cannot login
- Database becomes inconsistent/corrupted
- Plus there is no way to repair it with Funkwhale's CLI.
- Funkwhale no longer starts
What is expected?
When there is no force email address confirmation parameter, all signed up users should have the parameter 'Verified' (in email addresses, as seen in Django admin) as True/Yes/Verified in order NOT to break sign-ups when the env variable is specified afterwards.
Django admin should respect unique secondary keys constraint in postgresql when manipulating user accounts
Context
Funkwhale version(s) affected: 1.0.1
As I don't master postgresql, my Funkwhale instance is broken and I just don't know how to repair the database. I couldn't delete the user and its federation-related and library-related fields Any help much greatly appreciated: libertadmin@liberta.vip
See log attached.