2015-09-20 00:27:54 +02:00
|
|
|
import json
|
2015-09-24 22:08:08 +02:00
|
|
|
import time
|
2015-09-20 00:27:54 +02:00
|
|
|
from cStringIO import StringIO
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
2015-09-24 22:08:08 +02:00
|
|
|
from Crypt import CryptBitcoin
|
|
|
|
|
2015-09-20 00:27:54 +02:00
|
|
|
|
|
|
|
@pytest.mark.usefixtures("resetSettings")
|
|
|
|
class TestContent:
|
Rev467, requirements.txt accept newer dependecies, Boost dbschema.json, Move getDirname getFilename to helper, Verify optional files, Includes not allowed in user files, Optional files rules, Peer hashfield functions, Test optional files signing, Test file info, Test verify file, Test helpers
2015-10-01 01:35:13 +02:00
|
|
|
def testInclude(self, site):
|
2015-09-20 00:27:54 +02:00
|
|
|
# Rules defined in parent content.json
|
|
|
|
rules = site.content_manager.getRules("data/test_include/content.json")
|
|
|
|
|
|
|
|
assert rules["signers"] == ["15ik6LeBWnACWfaika1xqGapRZ1zh3JpCo"] # Valid signer
|
|
|
|
assert rules["user_name"] == "test" # Extra data
|
|
|
|
assert rules["max_size"] == 20000 # Max size of files
|
|
|
|
assert not rules["includes_allowed"] # Don't allow more includes
|
|
|
|
assert rules["files_allowed"] == "data.json" # Allowed file pattern
|
|
|
|
|
|
|
|
# Valid signers for "data/test_include/content.json"
|
|
|
|
valid_signers = site.content_manager.getValidSigners("data/test_include/content.json")
|
|
|
|
assert "15ik6LeBWnACWfaika1xqGapRZ1zh3JpCo" in valid_signers # Extra valid signer defined in parent content.json
|
|
|
|
assert "1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT" in valid_signers # The site itself
|
|
|
|
assert len(valid_signers) == 2 # No more
|
|
|
|
|
|
|
|
# Valid signers for "data/users/content.json"
|
|
|
|
valid_signers = site.content_manager.getValidSigners("data/users/content.json")
|
|
|
|
assert "1LSxsKfC9S9TVXGGNSM3vPHjyW82jgCX5f" in valid_signers # Extra valid signer defined in parent content.json
|
|
|
|
assert "1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT" in valid_signers # The site itself
|
|
|
|
assert len(valid_signers) == 2
|
|
|
|
|
|
|
|
# Valid signers for root content.json
|
|
|
|
assert site.content_manager.getValidSigners("content.json") == ["1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT"]
|
|
|
|
|
Rev467, requirements.txt accept newer dependecies, Boost dbschema.json, Move getDirname getFilename to helper, Verify optional files, Includes not allowed in user files, Optional files rules, Peer hashfield functions, Test optional files signing, Test file info, Test verify file, Test helpers
2015-10-01 01:35:13 +02:00
|
|
|
def testInlcudeLimits(self, site):
|
2015-09-24 22:08:08 +02:00
|
|
|
privatekey = "5KUh3PvNm5HUWoCfSUfcYvfQ2g3PrRNJWr6Q9eqdBGu23mtMntv"
|
2015-09-20 00:27:54 +02:00
|
|
|
# Data validation
|
|
|
|
data_dict = {
|
|
|
|
"files": {
|
|
|
|
"data.json": {
|
|
|
|
"sha512": "369d4e780cc80504285f13774ca327fe725eed2d813aad229e62356b07365906",
|
|
|
|
"size": 505
|
|
|
|
}
|
|
|
|
},
|
2015-09-24 22:08:08 +02:00
|
|
|
"modified": time.time()
|
2015-09-20 00:27:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
# Normal data
|
Rev467, requirements.txt accept newer dependecies, Boost dbschema.json, Move getDirname getFilename to helper, Verify optional files, Includes not allowed in user files, Optional files rules, Peer hashfield functions, Test optional files signing, Test file info, Test verify file, Test helpers
2015-10-01 01:35:13 +02:00
|
|
|
data_dict["signs"] = {"1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT": CryptBitcoin.sign(json.dumps(data_dict), privatekey)}
|
2015-09-24 22:08:08 +02:00
|
|
|
data = StringIO(json.dumps(data_dict))
|
2015-09-20 00:27:54 +02:00
|
|
|
assert site.content_manager.verifyFile("data/test_include/content.json", data, ignore_same=False)
|
2015-09-24 22:08:08 +02:00
|
|
|
# Reset
|
|
|
|
del data_dict["signs"]
|
2015-09-20 00:27:54 +02:00
|
|
|
|
|
|
|
# Too large
|
|
|
|
data_dict["files"]["data.json"]["size"] = 200000 # Emulate 2MB sized data.json
|
Rev467, requirements.txt accept newer dependecies, Boost dbschema.json, Move getDirname getFilename to helper, Verify optional files, Includes not allowed in user files, Optional files rules, Peer hashfield functions, Test optional files signing, Test file info, Test verify file, Test helpers
2015-10-01 01:35:13 +02:00
|
|
|
data_dict["signs"] = {"1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT": CryptBitcoin.sign(json.dumps(data_dict), privatekey)}
|
2015-09-20 00:27:54 +02:00
|
|
|
data = StringIO(json.dumps(data_dict))
|
|
|
|
assert not site.content_manager.verifyFile("data/test_include/content.json", data, ignore_same=False)
|
2015-09-24 22:08:08 +02:00
|
|
|
# Reset
|
|
|
|
data_dict["files"]["data.json"]["size"] = 505
|
|
|
|
del data_dict["signs"]
|
2015-09-20 00:27:54 +02:00
|
|
|
|
|
|
|
# Not allowed file
|
|
|
|
data_dict["files"]["notallowed.exe"] = data_dict["files"]["data.json"]
|
Rev467, requirements.txt accept newer dependecies, Boost dbschema.json, Move getDirname getFilename to helper, Verify optional files, Includes not allowed in user files, Optional files rules, Peer hashfield functions, Test optional files signing, Test file info, Test verify file, Test helpers
2015-10-01 01:35:13 +02:00
|
|
|
data_dict["signs"] = {"1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT": CryptBitcoin.sign(json.dumps(data_dict), privatekey)}
|
2015-09-20 00:27:54 +02:00
|
|
|
data = StringIO(json.dumps(data_dict))
|
|
|
|
assert not site.content_manager.verifyFile("data/test_include/content.json", data, ignore_same=False)
|
2015-09-24 22:08:08 +02:00
|
|
|
# Reset
|
|
|
|
del data_dict["files"]["notallowed.exe"]
|
|
|
|
del data_dict["signs"]
|
2015-09-20 00:27:54 +02:00
|
|
|
|
|
|
|
# Should work again
|
Rev467, requirements.txt accept newer dependecies, Boost dbschema.json, Move getDirname getFilename to helper, Verify optional files, Includes not allowed in user files, Optional files rules, Peer hashfield functions, Test optional files signing, Test file info, Test verify file, Test helpers
2015-10-01 01:35:13 +02:00
|
|
|
data_dict["signs"] = {"1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT": CryptBitcoin.sign(json.dumps(data_dict), privatekey)}
|
2015-09-20 00:27:54 +02:00
|
|
|
data = StringIO(json.dumps(data_dict))
|
|
|
|
assert site.content_manager.verifyFile("data/test_include/content.json", data, ignore_same=False)
|
Rev467, requirements.txt accept newer dependecies, Boost dbschema.json, Move getDirname getFilename to helper, Verify optional files, Includes not allowed in user files, Optional files rules, Peer hashfield functions, Test optional files signing, Test file info, Test verify file, Test helpers
2015-10-01 01:35:13 +02:00
|
|
|
|
|
|
|
@pytest.mark.parametrize("inner_path", ["content.json", "data/test_include/content.json", "data/users/content.json"])
|
|
|
|
def testSign(self, site, inner_path):
|
|
|
|
# Bad privatekey
|
|
|
|
assert not site.content_manager.sign(inner_path, privatekey="5aaa3PvNm5HUWoCfSUfcYvfQ2g3PrRNJWr6Q9eqdBGu23mtMnaa", filewrite=False)
|
|
|
|
|
|
|
|
# Good privatekey
|
|
|
|
content = site.content_manager.sign(inner_path, privatekey="5KUh3PvNm5HUWoCfSUfcYvfQ2g3PrRNJWr6Q9eqdBGu23mtMntv", filewrite=False)
|
|
|
|
content_old = site.content_manager.contents[inner_path] # Content before the sign
|
|
|
|
assert not content_old == content # Timestamp changed
|
|
|
|
assert site.address in content["signs"] # Used the site's private key to sign
|
|
|
|
if inner_path == "content.json":
|
|
|
|
assert len(content["files"]) == 17
|
|
|
|
elif inner_path == "data/test-include/content.json":
|
|
|
|
assert len(content["files"]) == 1
|
|
|
|
elif inner_path == "data/users/content.json":
|
|
|
|
assert len(content["files"]) == 0
|
|
|
|
|
|
|
|
# Everything should be same as before except the modified timestamp and the signs
|
|
|
|
assert (
|
Version 0.3.4, Rev656, CryptMessage plugin for AES and ECIES encryption, Added pyelliptic lib for OpenSSSL based encryption methods, Test CryptMessage plugin, Force reload content.json before signing and after write, Escaped Sql IN queries support, Test Sql parameter escaping, ui_websocket Test fixture, Plugin testing support, Always return websocket errors as dict, Wait for file on weboscket fileGet command if its already in bad_files queue, PushState and ReplaceState url manipulation support in wrapper API, Per auth-address localstorage, Longer timeout for udp tracker query
2015-12-10 21:36:20 +01:00
|
|
|
{key: val for key, val in content_old.items() if key not in ["modified", "signs", "sign", "zeronet_version"]}
|
Rev467, requirements.txt accept newer dependecies, Boost dbschema.json, Move getDirname getFilename to helper, Verify optional files, Includes not allowed in user files, Optional files rules, Peer hashfield functions, Test optional files signing, Test file info, Test verify file, Test helpers
2015-10-01 01:35:13 +02:00
|
|
|
==
|
Version 0.3.4, Rev656, CryptMessage plugin for AES and ECIES encryption, Added pyelliptic lib for OpenSSSL based encryption methods, Test CryptMessage plugin, Force reload content.json before signing and after write, Escaped Sql IN queries support, Test Sql parameter escaping, ui_websocket Test fixture, Plugin testing support, Always return websocket errors as dict, Wait for file on weboscket fileGet command if its already in bad_files queue, PushState and ReplaceState url manipulation support in wrapper API, Per auth-address localstorage, Longer timeout for udp tracker query
2015-12-10 21:36:20 +01:00
|
|
|
{key: val for key, val in content.items() if key not in ["modified", "signs", "sign", "zeronet_version"]}
|
Rev467, requirements.txt accept newer dependecies, Boost dbschema.json, Move getDirname getFilename to helper, Verify optional files, Includes not allowed in user files, Optional files rules, Peer hashfield functions, Test optional files signing, Test file info, Test verify file, Test helpers
2015-10-01 01:35:13 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
def testSignOptionalFiles(self, site):
|
2015-11-02 22:39:19 +01:00
|
|
|
assert len(site.content_manager.hashfield) == 0
|
|
|
|
|
Rev467, requirements.txt accept newer dependecies, Boost dbschema.json, Move getDirname getFilename to helper, Verify optional files, Includes not allowed in user files, Optional files rules, Peer hashfield functions, Test optional files signing, Test file info, Test verify file, Test helpers
2015-10-01 01:35:13 +02:00
|
|
|
site.content_manager.contents["content.json"]["optional"] = "((data/img/zero.*))"
|
|
|
|
content_optional = site.content_manager.sign(privatekey="5KUh3PvNm5HUWoCfSUfcYvfQ2g3PrRNJWr6Q9eqdBGu23mtMntv", filewrite=False)
|
|
|
|
|
|
|
|
del site.content_manager.contents["content.json"]["optional"]
|
|
|
|
content_nooptional = site.content_manager.sign(privatekey="5KUh3PvNm5HUWoCfSUfcYvfQ2g3PrRNJWr6Q9eqdBGu23mtMntv", filewrite=False)
|
|
|
|
|
2015-11-02 22:39:19 +01:00
|
|
|
assert len(content_nooptional.get("files_optional", {})) == 0 # No optional files if no pattern
|
Rev467, requirements.txt accept newer dependecies, Boost dbschema.json, Move getDirname getFilename to helper, Verify optional files, Includes not allowed in user files, Optional files rules, Peer hashfield functions, Test optional files signing, Test file info, Test verify file, Test helpers
2015-10-01 01:35:13 +02:00
|
|
|
assert len(content_optional["files_optional"]) > 0
|
2015-11-02 22:39:19 +01:00
|
|
|
assert len(site.content_manager.hashfield) == len(content_optional["files_optional"]) # Hashed optional files should be added to hashfield
|
Rev467, requirements.txt accept newer dependecies, Boost dbschema.json, Move getDirname getFilename to helper, Verify optional files, Includes not allowed in user files, Optional files rules, Peer hashfield functions, Test optional files signing, Test file info, Test verify file, Test helpers
2015-10-01 01:35:13 +02:00
|
|
|
assert len(content_nooptional["files"]) > len(content_optional["files"])
|
|
|
|
|
|
|
|
def testFileInfo(self, site):
|
|
|
|
assert "sha512" in site.content_manager.getFileInfo("index.html")
|
|
|
|
assert not site.content_manager.getFileInfo("notexist")
|
|
|
|
|
|
|
|
# Optional file
|
|
|
|
file_info_optional = site.content_manager.getFileInfo("data/optional.txt")
|
|
|
|
assert "sha512" in file_info_optional
|
|
|
|
assert file_info_optional["optional"] is True
|
|
|
|
|
|
|
|
# Not exists yet user content.json
|
|
|
|
assert "cert_signers" in site.content_manager.getFileInfo("data/users/unknown/content.json")
|
|
|
|
|
|
|
|
# Optional user file
|
|
|
|
file_info_optional = site.content_manager.getFileInfo("data/users/1CjfbrbwtP8Y2QjPy12vpTATkUT7oSiPQ9/peanut-butter-jelly-time.gif")
|
|
|
|
assert "sha512" in file_info_optional
|
|
|
|
assert file_info_optional["optional"] is True
|
Rev903, FeedQuery command only available for ADMIN sites, Show bad files in sidebar, Log unknown messages, Add and check inner_path and site address on sign/verify, Better peer cleanup limit, Log site load times, Testcase for address and inner_path verification, Re-sign testsite with new fields, Fix unnecessary loading screen display when browsing sub-folder with index.html, Fix safari notification width
2016-02-18 11:22:21 +01:00
|
|
|
|
|
|
|
def testVerify(self, site):
|
|
|
|
privatekey = "5KUh3PvNm5HUWoCfSUfcYvfQ2g3PrRNJWr6Q9eqdBGu23mtMntv"
|
|
|
|
inner_path = "data/test_include/content.json"
|
2016-04-06 13:44:31 +02:00
|
|
|
data_dict = site.storage.loadJson(inner_path)
|
Rev903, FeedQuery command only available for ADMIN sites, Show bad files in sidebar, Log unknown messages, Add and check inner_path and site address on sign/verify, Better peer cleanup limit, Log site load times, Testcase for address and inner_path verification, Re-sign testsite with new fields, Fix unnecessary loading screen display when browsing sub-folder with index.html, Fix safari notification width
2016-02-18 11:22:21 +01:00
|
|
|
data = StringIO(json.dumps(data_dict))
|
|
|
|
|
|
|
|
# Re-sign
|
|
|
|
data_dict["signs"] = {
|
|
|
|
"1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT": CryptBitcoin.sign(json.dumps(data_dict, sort_keys=True), privatekey)
|
|
|
|
}
|
|
|
|
assert site.content_manager.verifyFile(inner_path, data, ignore_same=False)
|
|
|
|
|
|
|
|
# Wrong address
|
|
|
|
data_dict["address"] = "Othersite"
|
|
|
|
del data_dict["signs"]
|
|
|
|
data_dict["signs"] = {
|
|
|
|
"1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT": CryptBitcoin.sign(json.dumps(data_dict, sort_keys=True), privatekey)
|
|
|
|
}
|
|
|
|
data = StringIO(json.dumps(data_dict))
|
|
|
|
assert not site.content_manager.verifyFile(inner_path, data, ignore_same=False)
|
|
|
|
|
|
|
|
# Wrong inner_path
|
|
|
|
data_dict["address"] = "1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT"
|
|
|
|
data_dict["inner_path"] = "content.json"
|
|
|
|
del data_dict["signs"]
|
|
|
|
data_dict["signs"] = {
|
|
|
|
"1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT": CryptBitcoin.sign(json.dumps(data_dict, sort_keys=True), privatekey)
|
|
|
|
}
|
|
|
|
data = StringIO(json.dumps(data_dict))
|
|
|
|
assert not site.content_manager.verifyFile(inner_path, data, ignore_same=False)
|
|
|
|
|
|
|
|
# Everything right again
|
|
|
|
data_dict["address"] = "1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT"
|
|
|
|
data_dict["inner_path"] = inner_path
|
|
|
|
del data_dict["signs"]
|
|
|
|
data_dict["signs"] = {
|
|
|
|
"1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT": CryptBitcoin.sign(json.dumps(data_dict, sort_keys=True), privatekey)
|
|
|
|
}
|
|
|
|
data = StringIO(json.dumps(data_dict))
|
|
|
|
assert site.content_manager.verifyFile(inner_path, data, ignore_same=False)
|