Rev957, Sidebar displays onion peers in graph, Sidebar display bad file retry number, Sidebar site Update/Pause/Delete, Ratelimit sidebar update, Encoded typo, Fix onion findHashId, More retry for bad files, Log file path errors, Testcase for self findhashIds, Testcase for Tor findHashId, Better Tor version parse, UiWebsocket callback on update/pause/resume/delete, Skip invalid postMessage messages
This commit is contained in:
parent
ea3257dc09
commit
e891a10e54
18 changed files with 204 additions and 36 deletions
|
@ -8,7 +8,7 @@ class Config(object):
|
|||
|
||||
def __init__(self, argv):
|
||||
self.version = "0.3.6"
|
||||
self.rev = 949
|
||||
self.rev = 957
|
||||
self.argv = argv
|
||||
self.action = None
|
||||
self.config_file = "zeronet.conf"
|
||||
|
|
|
@ -311,7 +311,7 @@ class ContentManager(object):
|
|||
ignored = True
|
||||
elif not re.match("^[a-zA-Z0-9_\.\+\-/]+$", file_relative_path):
|
||||
ignored = True
|
||||
self.log.error("- [ERROR] Only ascii encodes filenames allowed: %s" % file_relative_path)
|
||||
self.log.error("- [ERROR] Only ascii encoded filenames allowed: %s" % file_relative_path)
|
||||
elif optional_pattern and re.match(optional_pattern, file_relative_path):
|
||||
optional = True
|
||||
|
||||
|
|
|
@ -306,25 +306,35 @@ class FileRequest(object):
|
|||
|
||||
found = site.worker_manager.findOptionalHashIds(params["hash_ids"])
|
||||
|
||||
back = {}
|
||||
back_ip4 = {}
|
||||
back_onion = {}
|
||||
for hash_id, peers in found.iteritems():
|
||||
back[hash_id] = [helper.packAddress(peer.ip, peer.port) for peer in peers]
|
||||
back_onion[hash_id] = [helper.packOnionAddress(peer.ip, peer.port) for peer in peers if peer.ip.endswith("onion")]
|
||||
back_ip4[hash_id] = [helper.packAddress(peer.ip, peer.port) for peer in peers if not peer.ip.endswith("onion")]
|
||||
|
||||
# Check my hashfield
|
||||
if config.ip_external:
|
||||
my_ip = config.ip_external
|
||||
else:
|
||||
my_ip = self.server.ip
|
||||
if self.server.tor_manager and self.server.tor_manager.site_onions.get(site.address): # Running onion
|
||||
my_ip = helper.packOnionAddress(self.server.tor_manager.site_onions[site.address], self.server.port)
|
||||
my_back = back_onion
|
||||
elif config.ip_external: # External ip definied
|
||||
my_ip = helper.packAddress(config.ip_external, self.server.port)
|
||||
my_back = back_ip4
|
||||
else: # No external ip defined
|
||||
my_ip = my_ip = helper.packAddress(self.server.ip, self.server.port)
|
||||
my_back = back_ip4
|
||||
|
||||
for hash_id in params["hash_ids"]:
|
||||
if hash_id in site.content_manager.hashfield:
|
||||
if hash_id not in back:
|
||||
back[hash_id] = []
|
||||
back[hash_id].append(helper.packAddress(my_ip, self.server.port)) # Add myself
|
||||
if hash_id not in my_back:
|
||||
my_back[hash_id] = []
|
||||
my_back[hash_id].append(my_ip) # Add myself
|
||||
|
||||
if config.verbose:
|
||||
self.log.debug(
|
||||
"Found: %s/%s" %
|
||||
(len(back), len(params["hash_ids"]))
|
||||
"Found: %s,%s/%s" %
|
||||
(len(back_ip4), len(back_onion), len(params["hash_ids"]))
|
||||
)
|
||||
self.response({"peers": back})
|
||||
self.response({"peers": back_ip4, "peers_onion": back_onion})
|
||||
|
||||
def actionSetHashfield(self, params):
|
||||
site = self.sites.get(params["site"])
|
||||
|
|
|
@ -274,7 +274,15 @@ class Peer(object):
|
|||
res = self.request("findHashIds", {"site": self.site.address, "hash_ids": hash_ids})
|
||||
if not res or "error" in res:
|
||||
return False
|
||||
return {key: map(helper.unpackAddress, val) for key, val in res["peers"].iteritems()}
|
||||
# Unpack IP4
|
||||
back = {key: map(helper.unpackAddress, val) for key, val in res["peers"].iteritems()}
|
||||
# Unpack onion
|
||||
for hash, onion_peers in res.get("peers_onion", {}).iteritems():
|
||||
if not hash in back:
|
||||
back[hash] = []
|
||||
back[hash] += map(helper.unpackOnionAddress, onion_peers)
|
||||
|
||||
return back
|
||||
|
||||
# Send my hashfield to peer
|
||||
# Return: True if sent
|
||||
|
|
|
@ -176,7 +176,7 @@ class Site(object):
|
|||
# Retry download bad files
|
||||
def retryBadFiles(self, force=False):
|
||||
for bad_file, tries in self.bad_files.items():
|
||||
if force or random.randint(0, min(20, tries)) == 0: # Larger number tries = less likely to check every 15min
|
||||
if force or random.randint(0, min(40, tries)) < 4: # Larger number tries = less likely to check every 15min
|
||||
self.needFile(bad_file, update=True, blocking=False)
|
||||
|
||||
# Download all files of the site
|
||||
|
|
|
@ -247,6 +247,7 @@ class SiteStorage:
|
|||
|
||||
file_abspath = os.path.dirname(os.path.abspath(file_path))
|
||||
if ".." in file_path or not file_abspath.startswith(self.allowed_dir):
|
||||
self.site.log.error(u"File %s not in allowed dir: %s" % (file_path, self.allowed_dir))
|
||||
raise Exception(u"File not allowed: %s" % file_path)
|
||||
return file_path
|
||||
|
||||
|
|
|
@ -155,3 +155,10 @@ class TestPeer:
|
|||
1234: [('1.2.3.4', 1544), ('1.2.3.5', 1545)],
|
||||
1235: [('1.2.3.5', 1545), ('1.2.3.6', 1546)]
|
||||
}
|
||||
|
||||
# Test my address adding
|
||||
site.content_manager.hashfield.append(1234)
|
||||
|
||||
res = peer_file_server.findHashIds([1234, 1235])
|
||||
assert res[1234] == [('1.2.3.4', 1544), ('1.2.3.5', 1545), ("127.0.0.1", 1544)]
|
||||
assert res[1235] == [('1.2.3.5', 1545), ('1.2.3.6', 1546)]
|
|
@ -102,6 +102,43 @@ class TestTor:
|
|||
assert peer_source.pex(need_num=10) == 1 # Need >5 to return also return non-connected peers
|
||||
assert "bka4ht2bzxchy44r.onion:1555" in site_temp.peers
|
||||
|
||||
def testFindHash(self, tor_manager, file_server, site, site_temp):
|
||||
file_server.ip_incoming = {} # Reset flood protection
|
||||
file_server.sites[site.address] = site
|
||||
file_server.tor_manager = tor_manager
|
||||
|
||||
client = FileServer("127.0.0.1", 1545)
|
||||
client.sites[site_temp.address] = site_temp
|
||||
site_temp.connection_server = client
|
||||
|
||||
# Add file_server as peer to client
|
||||
peer_file_server = site_temp.addPeer("127.0.0.1", 1544)
|
||||
|
||||
assert peer_file_server.findHashIds([1234]) == {}
|
||||
|
||||
# Add fake peer with requred hash
|
||||
fake_peer_1 = site.addPeer("bka4ht2bzxchy44r.onion", 1544)
|
||||
fake_peer_1.hashfield.append(1234)
|
||||
fake_peer_2 = site.addPeer("1.2.3.5", 1545)
|
||||
fake_peer_2.hashfield.append(1234)
|
||||
fake_peer_2.hashfield.append(1235)
|
||||
fake_peer_3 = site.addPeer("1.2.3.6", 1546)
|
||||
fake_peer_3.hashfield.append(1235)
|
||||
fake_peer_3.hashfield.append(1236)
|
||||
|
||||
assert peer_file_server.findHashIds([1234, 1235]) == {
|
||||
1234: [('1.2.3.5', 1545), ("bka4ht2bzxchy44r.onion", 1544)],
|
||||
1235: [('1.2.3.6', 1546), ('1.2.3.5', 1545)]
|
||||
}
|
||||
|
||||
# Test my address adding
|
||||
site.content_manager.hashfield.append(1234)
|
||||
my_onion_address = tor_manager.getOnion(site_temp.address)+".onion"
|
||||
|
||||
res = peer_file_server.findHashIds([1234, 1235])
|
||||
assert res[1234] == [('1.2.3.5', 1545), ("bka4ht2bzxchy44r.onion", 1544), (my_onion_address, 1544)]
|
||||
assert res[1235] == [('1.2.3.6', 1546), ('1.2.3.5', 1545)]
|
||||
|
||||
def testSiteOnion(self, tor_manager):
|
||||
assert tor_manager.getOnion("address1") != tor_manager.getOnion("address2")
|
||||
assert tor_manager.getOnion("address1") == tor_manager.getOnion("address1")
|
||||
|
|
|
@ -153,7 +153,7 @@ class TorManager:
|
|||
|
||||
version = re.search('Tor="([0-9\.]+)', res_protocol).group(1)
|
||||
# Version 0.2.7.5 required because ADD_ONION support
|
||||
assert int(version.replace(".", "0")) >= 20705, "Tor version >=0.2.7.5 required"
|
||||
assert float(version.replace(".", "0", 2)) >= 207.5, "Tor version >=0.2.7.5 required, found: %s" % version
|
||||
|
||||
# Auth cookie file
|
||||
cookie_match = re.search('COOKIEFILE="(.*?)"', res_protocol)
|
||||
|
|
|
@ -534,9 +534,13 @@ class UiWebsocket(object):
|
|||
|
||||
# Update site content.json
|
||||
def actionSiteUpdate(self, to, address):
|
||||
def updateThread():
|
||||
site.update()
|
||||
self.response(to, "Updated")
|
||||
|
||||
site = self.server.sites.get(address)
|
||||
if site and (site.address == self.site.address or "ADMIN" in self.site.settings["permissions"]):
|
||||
gevent.spawn(site.update)
|
||||
gevent.spawn(updateThread)
|
||||
else:
|
||||
self.response(to, {"error": "Unknown site: %s" % address})
|
||||
|
||||
|
@ -548,6 +552,7 @@ class UiWebsocket(object):
|
|||
site.saveSettings()
|
||||
site.updateWebsocket()
|
||||
site.worker_manager.stopWorkers()
|
||||
self.response(to, "Paused")
|
||||
else:
|
||||
self.response(to, {"error": "Unknown site: %s" % address})
|
||||
|
||||
|
@ -560,6 +565,7 @@ class UiWebsocket(object):
|
|||
gevent.spawn(site.update, announce=True)
|
||||
time.sleep(0.001) # Wait for update thread starting
|
||||
site.updateWebsocket()
|
||||
self.response(to, "Resumed")
|
||||
else:
|
||||
self.response(to, {"error": "Unknown site: %s" % address})
|
||||
|
||||
|
@ -574,6 +580,7 @@ class UiWebsocket(object):
|
|||
site.updateWebsocket()
|
||||
SiteManager.site_manager.delete(address)
|
||||
self.user.deleteSiteData(address)
|
||||
self.response(to, "Deleted")
|
||||
else:
|
||||
self.response(to, {"error": "Unknown site: %s" % address})
|
||||
|
||||
|
|
|
@ -79,6 +79,9 @@ class Wrapper
|
|||
@opener = false
|
||||
|
||||
message = e.data
|
||||
if not message.cmd
|
||||
return false
|
||||
|
||||
if window.postmessage_nonce_security and message.wrapper_nonce != window.wrapper_nonce
|
||||
@log "Message nonce error:", message.wrapper_nonce, '!=', window.wrapper_nonce
|
||||
@actionNotification({"params": ["error", "Message wrapper_nonce error, please report!"]})
|
||||
|
|
|
@ -857,6 +857,9 @@ jQuery.extend( jQuery.easing,
|
|||
}
|
||||
}
|
||||
message = e.data;
|
||||
if (!message.cmd) {
|
||||
return false;
|
||||
}
|
||||
if (window.postmessage_nonce_security && message.wrapper_nonce !== window.wrapper_nonce) {
|
||||
this.log("Message nonce error:", message.wrapper_nonce, '!=', window.wrapper_nonce);
|
||||
this.actionNotification({
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue