mirror of https://github.com/saimn/sigal.git
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.
100 lines
3.1 KiB
100 lines
3.1 KiB
import os |
|
import pickle |
|
from io import BytesIO |
|
|
|
import pytest |
|
|
|
from sigal import init_plugins |
|
from sigal.gallery import Gallery |
|
from sigal.plugins.encrypt import endec |
|
from sigal.plugins.encrypt.encrypt import cache_key |
|
|
|
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() |
|
assert caplog.messages[1].startswith('Loaded cache with') |
|
assert caplog.messages[2].startswith('Loaded encryption cache with')
|
|
|