mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Merge branch 'dev' into feature-ocrmypdf
This commit is contained in:
		| @@ -353,39 +353,23 @@ Documents can be stored in Paperless using GnuPG encryption. | ||||
|     Consider running paperless on an encrypted filesystem instead, which will then | ||||
|     at least provide security against physical hardware theft. | ||||
|  | ||||
| .. code:: | ||||
|  | ||||
|     change_storage_type [--passphrase PASSPHRASE] {gpg,unencrypted} {gpg,unencrypted} | ||||
|  | ||||
|     positional arguments: | ||||
|       {gpg,unencrypted}     The state you want to change your documents from | ||||
|       {gpg,unencrypted}     The state you want to change your documents to | ||||
|  | ||||
|     optional arguments: | ||||
|       --passphrase PASSPHRASE | ||||
|  | ||||
| Enabling encryption | ||||
| ------------------- | ||||
|  | ||||
| Basic usage to enable encryption of your document store (**USE A MORE SECURE PASSPHRASE**): | ||||
|  | ||||
| (Note: If ``PAPERLESS_PASSPHRASE`` isn't set already, you need to specify it here) | ||||
|  | ||||
| .. code:: | ||||
|  | ||||
|     change_storage_type [--passphrase SECR3TP4SSPHRA$E] unencrypted gpg | ||||
| Enabling encryption is no longer supported. | ||||
|  | ||||
|  | ||||
| Disabling encryption | ||||
| -------------------- | ||||
|  | ||||
| Basic usage to enable encryption of your document store: | ||||
| Basic usage to disable encryption of your document store: | ||||
|  | ||||
| (Note: Again, if ``PAPERLESS_PASSPHRASE`` isn't set already, you need to specify it here) | ||||
| (Note: If ``PAPERLESS_PASSPHRASE`` isn't set already, you need to specify it here) | ||||
|  | ||||
| .. code:: | ||||
|  | ||||
|     change_storage_type [--passphrase SECR3TP4SSPHRA$E] gpg unencrypted | ||||
|     decrypt_documents [--passphrase SECR3TP4SSPHRA$E] | ||||
|  | ||||
|  | ||||
| .. _Pipenv: https://pipenv.pypa.io/en/latest/ | ||||
| @@ -12,7 +12,8 @@ next | ||||
|     You have to specify your username. | ||||
| *   Added a simple sanity checker that checks your documents for missing or orphaned files, | ||||
|     files with wrong checksums, inaccessible files, and documents with empty content. | ||||
|  | ||||
| *   It is no longer possible to encrypt your documents. For the time being, paperless will | ||||
|     continue to operate with already encrypted documents. | ||||
|  | ||||
| paperless-ng 0.9.2 | ||||
| ################## | ||||
|   | ||||
| @@ -225,9 +225,6 @@ class Consumer(LoggingMixin): | ||||
|         created = file_info.created or date or timezone.make_aware( | ||||
|             datetime.datetime.fromtimestamp(stats.st_mtime)) | ||||
|  | ||||
|         if settings.PASSPHRASE: | ||||
|             storage_type = Document.STORAGE_TYPE_GPG | ||||
|         else: | ||||
|         storage_type = Document.STORAGE_TYPE_UNENCRYPTED | ||||
|  | ||||
|         with open(self.path, "rb") as f: | ||||
| @@ -277,8 +274,4 @@ class Consumer(LoggingMixin): | ||||
|     def _write(self, storage_type, source, target): | ||||
|         with open(source, "rb") as read_file: | ||||
|             with open(target, "wb") as write_file: | ||||
|                 if storage_type == Document.STORAGE_TYPE_UNENCRYPTED: | ||||
|                 write_file.write(read_file.read()) | ||||
|                     return | ||||
|                 self.log("debug", "Encrypting") | ||||
|                 write_file.write(GnuPG.encrypted(read_file)) | ||||
|   | ||||
| @@ -17,16 +17,6 @@ class Command(BaseCommand): | ||||
| 
 | ||||
|     def add_arguments(self, parser): | ||||
| 
 | ||||
|         parser.add_argument( | ||||
|             "from", | ||||
|             choices=("gpg", "unencrypted"), | ||||
|             help="The state you want to change your documents from" | ||||
|         ) | ||||
|         parser.add_argument( | ||||
|             "to", | ||||
|             choices=("gpg", "unencrypted"), | ||||
|             help="The state you want to change your documents to" | ||||
|         ) | ||||
|         parser.add_argument( | ||||
|             "--passphrase", | ||||
|             help="If PAPERLESS_PASSPHRASE isn't set already, you need to " | ||||
| @@ -50,11 +40,6 @@ class Command(BaseCommand): | ||||
|         except KeyboardInterrupt: | ||||
|             return | ||||
| 
 | ||||
|         if options["from"] == options["to"]: | ||||
|             raise CommandError( | ||||
|                 'The "from" and "to" values can\'t be the same.' | ||||
|             ) | ||||
| 
 | ||||
|         passphrase = options["passphrase"] or settings.PASSPHRASE | ||||
|         if not passphrase: | ||||
|             raise CommandError( | ||||
| @@ -62,10 +47,7 @@ class Command(BaseCommand): | ||||
|                 "by declaring it in your environment or your config." | ||||
|             ) | ||||
| 
 | ||||
|         if options["from"] == "gpg" and options["to"] == "unencrypted": | ||||
|         self.__gpg_to_unencrypted(passphrase) | ||||
|         elif options["from"] == "unencrypted" and options["to"] == "gpg": | ||||
|             self.__unencrypted_to_gpg(passphrase) | ||||
| 
 | ||||
|     @staticmethod | ||||
|     def __gpg_to_unencrypted(passphrase): | ||||
| @@ -79,42 +61,28 @@ class Command(BaseCommand): | ||||
|                 document).encode('utf-8'), "green")) | ||||
| 
 | ||||
|             old_paths = [document.source_path, document.thumbnail_path] | ||||
| 
 | ||||
|             raw_document = GnuPG.decrypted(document.source_file, passphrase) | ||||
|             raw_thumb = GnuPG.decrypted(document.thumbnail_file, passphrase) | ||||
| 
 | ||||
|             document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED | ||||
| 
 | ||||
|             ext = os.path.splitext(document.filename)[1] | ||||
| 
 | ||||
|             if not ext == '.gpg': | ||||
|                 raise CommandError( | ||||
|                     f"Abort: encrypted file {document.source_path} does not " | ||||
|                     f"end with .gpg") | ||||
| 
 | ||||
|             document.filename = os.path.splitext(document.source_path)[0] | ||||
| 
 | ||||
|             with open(document.source_path, "wb") as f: | ||||
|                 f.write(raw_document) | ||||
| 
 | ||||
|             with open(document.thumbnail_path, "wb") as f: | ||||
|                 f.write(raw_thumb) | ||||
| 
 | ||||
|             document.save(update_fields=("storage_type",)) | ||||
| 
 | ||||
|             for path in old_paths: | ||||
|                 os.unlink(path) | ||||
| 
 | ||||
|     @staticmethod | ||||
|     def __unencrypted_to_gpg(passphrase): | ||||
| 
 | ||||
|         unencrypted_files = Document.objects.filter( | ||||
|             storage_type=Document.STORAGE_TYPE_UNENCRYPTED) | ||||
| 
 | ||||
|         for document in unencrypted_files: | ||||
| 
 | ||||
|             print(coloured("Encrypting {}".format(document), "green")) | ||||
| 
 | ||||
|             old_paths = [document.source_path, document.thumbnail_path] | ||||
|             with open(document.source_path, "rb") as raw_document: | ||||
|                 with open(document.thumbnail_path, "rb") as raw_thumb: | ||||
|                     document.storage_type = Document.STORAGE_TYPE_GPG | ||||
|                     with open(document.source_path, "wb") as f: | ||||
|                         f.write(GnuPG.encrypted(raw_document, passphrase)) | ||||
|                     with open(document.thumbnail_path, "wb") as f: | ||||
|                         f.write(GnuPG.encrypted(raw_thumb, passphrase)) | ||||
| 
 | ||||
|             document.save(update_fields=("storage_type",)) | ||||
|             document.save(update_fields=("storage_type", "filename")) | ||||
| 
 | ||||
|             for path in old_paths: | ||||
|                 os.unlink(path) | ||||
| @@ -82,8 +82,6 @@ class Command(Renderable, BaseCommand): | ||||
|     def _import_files_from_manifest(self): | ||||
|  | ||||
|         storage_type = Document.STORAGE_TYPE_UNENCRYPTED | ||||
|         if settings.PASSPHRASE: | ||||
|             storage_type = Document.STORAGE_TYPE_GPG | ||||
|  | ||||
|         for record in self.manifest: | ||||
|  | ||||
| @@ -105,21 +103,6 @@ class Command(Renderable, BaseCommand): | ||||
|  | ||||
|             create_source_path_directory(document.source_path) | ||||
|  | ||||
|             if settings.PASSPHRASE: | ||||
|  | ||||
|                 with open(document_path, "rb") as unencrypted: | ||||
|                     with open(document.source_path, "wb") as encrypted: | ||||
|                         print("Encrypting {} and saving it to {}".format( | ||||
|                             doc_file, document.source_path)) | ||||
|                         encrypted.write(GnuPG.encrypted(unencrypted)) | ||||
|  | ||||
|                 with open(thumbnail_path, "rb") as unencrypted: | ||||
|                     with open(document.thumbnail_path, "wb") as encrypted: | ||||
|                         print("Encrypting {} and saving it to {}".format( | ||||
|                             thumb_file, document.thumbnail_path)) | ||||
|                         encrypted.write(GnuPG.encrypted(unencrypted)) | ||||
|  | ||||
|             else: | ||||
|             print(f"Moving {document_path} to {document.source_path}") | ||||
|             shutil.copy(document_path, document.source_path) | ||||
|             shutil.copy(thumbnail_path, document.thumbnail_path) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jonas Winkler
					Jonas Winkler