feat(campaign): enforce attachment delivery policies

This commit is contained in:
2026-07-20 20:07:12 +02:00
parent 724ca779d6
commit ad34365f6c
9 changed files with 613 additions and 15 deletions

68
tests/test_zip_service.py Normal file
View File

@@ -0,0 +1,68 @@
from __future__ import annotations
from pathlib import Path
import tempfile
import unittest
import zipfile
try:
import pyzipper
except ImportError: # pragma: no cover
pyzipper = None
from govoplan_campaign.backend.services.zip_service import create_zip_archive
class ZipServiceTests(unittest.TestCase):
def test_standard_password_zip_uses_zipcrypto_readable_by_stdlib(self) -> None:
with tempfile.TemporaryDirectory() as temp_dir:
root = Path(temp_dir)
source = root / "source.txt"
source.write_text("Hello Windows ZIP", encoding="utf-8")
output = root / "standard.zip"
create_zip_archive(output, [(source, "message.txt")], "secret", "zip_standard")
with zipfile.ZipFile(output) as archive:
info = archive.getinfo("message.txt")
self.assertEqual(info.compress_type, zipfile.ZIP_DEFLATED)
self.assertTrue(info.flag_bits & 0x1)
self.assertEqual(archive.read("message.txt", pwd=b"secret"), b"Hello Windows ZIP")
@unittest.skipIf(pyzipper is None, "pyzipper is not installed")
def test_aes_password_zip_keeps_aes_encryption(self) -> None:
with tempfile.TemporaryDirectory() as temp_dir:
root = Path(temp_dir)
source = root / "source.txt"
source.write_text("Hello AES ZIP", encoding="utf-8")
output = root / "aes.zip"
create_zip_archive(output, [(source, "message.txt")], "secret", "aes")
with zipfile.ZipFile(output) as archive:
info = archive.getinfo("message.txt")
self.assertEqual(info.compress_type, 99)
self.assertTrue(info.flag_bits & 0x1)
with pyzipper.AESZipFile(output) as archive:
archive.setpassword(b"secret")
self.assertEqual(archive.read("message.txt"), b"Hello AES ZIP")
def test_unprotected_zip_ignores_encryption_mode(self) -> None:
with tempfile.TemporaryDirectory() as temp_dir:
root = Path(temp_dir)
source = root / "source.txt"
source.write_text("Plain ZIP", encoding="utf-8")
output = root / "plain.zip"
create_zip_archive(output, [(source, "message.txt")], "", "zip_standard")
with zipfile.ZipFile(output) as archive:
info = archive.getinfo("message.txt")
self.assertEqual(info.compress_type, zipfile.ZIP_DEFLATED)
self.assertFalse(info.flag_bits & 0x1)
self.assertEqual(archive.read("message.txt"), b"Plain ZIP")
if __name__ == "__main__":
unittest.main()