From aac04e73b9bf7741da437366bfa81cd28c299585 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 29 Oct 2024 10:02:32 -0700 Subject: [PATCH] Fix: correct serializing of auth tokens for export (#8100) --- docs/administration.md | 2 ++ .../management/commands/document_exporter.py | 8 +------ src/documents/management/commands/mixins.py | 7 ------ .../tests/test_management_exporter.py | 23 +++++++++++++++++++ 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/docs/administration.md b/docs/administration.md index 61b3797f7..7624de41b 100644 --- a/docs/administration.md +++ b/docs/administration.md @@ -19,6 +19,8 @@ Options available to any installation of paperless: export. Therefore, incremental backups with `rsync` are entirely possible. + The exporter does not include API tokens and they will need to be re-generated after importing. + !!! caution You cannot import the export generated with one version of paperless in diff --git a/src/documents/management/commands/document_exporter.py b/src/documents/management/commands/document_exporter.py index 6a23a701a..79d7cca6f 100644 --- a/src/documents/management/commands/document_exporter.py +++ b/src/documents/management/commands/document_exporter.py @@ -24,7 +24,6 @@ from django.utils import timezone from filelock import FileLock from guardian.models import GroupObjectPermission from guardian.models import UserObjectPermission -from rest_framework.authtoken.models import Token if TYPE_CHECKING: from django.db.models import QuerySet @@ -271,7 +270,6 @@ class Command(CryptMixin, BaseCommand): "social_accounts": SocialAccount.objects.all(), "social_apps": SocialApp.objects.all(), "social_tokens": SocialToken.objects.all(), - "auth_tokens": Token.objects.all(), } if settings.AUDIT_LOG_ENABLED: @@ -570,11 +568,7 @@ class Command(CryptMixin, BaseCommand): value=manifest_record["fields"][field], ) - elif ( - MailAccount.objects.count() > 0 - or SocialToken.objects.count() > 0 - or Token.objects.count() > 0 - ): + elif MailAccount.objects.count() > 0 or SocialToken.objects.count() > 0: self.stdout.write( self.style.NOTICE( "No passphrase was given, sensitive fields will be in plaintext", diff --git a/src/documents/management/commands/mixins.py b/src/documents/management/commands/mixins.py index be0256ed6..a2ad326e4 100644 --- a/src/documents/management/commands/mixins.py +++ b/src/documents/management/commands/mixins.py @@ -108,13 +108,6 @@ class CryptMixin: "token_secret", ], }, - { - "exporter_key": "auth_tokens", - "model_name": "authtoken.token", - "fields": [ - "key", - ], - }, ] def get_crypt_params(self) -> dict[str, dict[str, str | int]]: diff --git a/src/documents/tests/test_management_exporter.py b/src/documents/tests/test_management_exporter.py index ff514a7d6..9697f0c03 100644 --- a/src/documents/tests/test_management_exporter.py +++ b/src/documents/tests/test_management_exporter.py @@ -8,6 +8,9 @@ from pathlib import Path from unittest import mock from zipfile import ZipFile +from allauth.socialaccount.models import SocialAccount +from allauth.socialaccount.models import SocialApp +from allauth.socialaccount.models import SocialToken from django.contrib.auth.models import Group from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType @@ -874,6 +877,23 @@ class TestCryptExportImport( password="mypassword", ) + app = SocialApp.objects.create( + provider="test", + name="test", + client_id="test", + ) + account = SocialAccount.objects.create( + user=User.objects.first(), + provider="test", + uid="test", + ) + SocialToken.objects.create( + app=app, + account=account, + token="test", + token_secret="test", + ) + call_command( "document_exporter", "--no-progress-bar", @@ -912,6 +932,9 @@ class TestCryptExportImport( self.assertIsNotNone(account) self.assertEqual(account.password, "mypassword") + social_token = SocialToken.objects.first() + self.assertIsNotNone(social_token) + def test_import_crypt_no_passphrase(self): """ GIVEN: