yet another simple static gallery generator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

101 lines
3.1 KiB

import os
import pickle
from io import BytesIO
import pytest
from sigal.gallery import Gallery
from sigal.plugins.encrypt import endec
from sigal.plugins.encrypt.encrypt import cache_key
from sigal.utils import init_plugins
CURRENT_DIR = os.path.dirname(__file__)
def get_key_tag(settings):
options = settings["encrypt_options"]
key = endec.kdf_gen_key(
options["password"], options["kdf_salt"], options["kdf_iters"]
)
tag = options["gcm_tag"].encode("utf-8")
return (key, tag)
def test_encrypt(settings, tmpdir, disconnect_signals, caplog):
settings["destination"] = str(tmpdir)
if "sigal.plugins.encrypt" not in settings["plugins"]:
settings["plugins"] += ["sigal.plugins.encrypt"]
init_plugins(settings)
gal = Gallery(settings)
with pytest.raises(ValueError, match="no encrypt_options in settings"):
gal.build()
settings["encrypt_options"] = {}
gal = Gallery(settings)
with pytest.raises(ValueError, match="no password provided"):
gal.build()
settings["encrypt_options"] = {
"password": "password",
"ask_password": True,
"encrypt_symlinked_originals": False,
}
gal = Gallery(settings)
gal.build()
# check the encrypt cache exists
cachePath = os.path.join(settings["destination"], ".encryptCache")
assert os.path.isfile(cachePath)
encryptCache = None
with open(cachePath, "rb") as cacheFile:
encryptCache = pickle.load(cacheFile)
assert isinstance(encryptCache, dict)
testAlbum = gal.albums["encryptTest"]
key, tag = get_key_tag(settings)
for media in testAlbum:
# check if sizes are stored in cache
assert cache_key(media) in encryptCache
assert "size" in encryptCache[cache_key(media)]
assert "thumb_size" in encryptCache[cache_key(media)]
assert "encrypted" in encryptCache[cache_key(media)]
encryptedImages = [media.dst_path, media.thumb_path]
if settings["keep_orig"]:
encryptedImages.append(
os.path.join(settings["destination"], media.path, media.big)
)
# check if images are encrypted by trying to decrypt
for image in encryptedImages:
with open(image, "rb") as infile:
with BytesIO() as outfile:
endec.decrypt(key, infile, outfile, tag)
# check static files have been copied
static = os.path.join(settings["destination"], "static")
assert os.path.isfile(os.path.join(static, "decrypt.js"))
assert os.path.isfile(os.path.join(static, "keycheck.txt"))
assert os.path.isfile(os.path.join(settings["destination"], "sw.js"))
# check keycheck file
with open(
os.path.join(settings["destination"], "static", "keycheck.txt"), "rb"
) as infile:
with BytesIO() as outfile:
endec.decrypt(key, infile, outfile, tag)
caplog.clear()
caplog.set_level("DEBUG")
gal = Gallery(settings)
gal.build()
# Doesn't work on Actions ...
# assert 'Loaded cache with 34 entries' in caplog.messages
# assert 'Loaded encryption cache with 27 entries' in caplog.messages