Add existing bigfiles to piecefield if they were downloaded outside of ZeroNet

This commit is contained in:
shortcutme 2018-03-14 22:21:45 +01:00
parent fbc10b8e32
commit 1189c76691
No known key found for this signature in database
GPG key ID: 5B63BAE6CB9613AE
2 changed files with 22 additions and 6 deletions

View file

@ -324,6 +324,12 @@ class ContentManagerPlugin(object):
# Only add to site size on first request # Only add to site size on first request
if hash in self.hashfield: if hash in self.hashfield:
size = 0 size = 0
elif size > 1024 * 1024:
file_info = self.getFileInfo(inner_path)
if file_info: # We already have the file, but not in piecefield
sha512 = file_info["sha512"]
if sha512 not in self.site.storage.piecefields:
self.site.storage.checkBigfile(inner_path)
return super(ContentManagerPlugin, self).optionalDownloaded(inner_path, hash, size, own) return super(ContentManagerPlugin, self).optionalDownloaded(inner_path, hash, size, own)
@ -399,12 +405,10 @@ class SiteStoragePlugin(object):
del content del content
self.onUpdated(inner_path) self.onUpdated(inner_path)
def openBigfile(self, inner_path, prebuffer=0): def checkBigfile(self, inner_path):
file_info = self.site.content_manager.getFileInfo(inner_path) file_info = self.site.content_manager.getFileInfo(inner_path)
if not file_info or (file_info and "piecemap" not in file_info): # It's not a big file if not file_info or (file_info and "piecemap" not in file_info): # It's not a big file
return False return False
self.site.needFile(inner_path, blocking=False) # Download piecemap
file_path = self.getPath(inner_path) file_path = self.getPath(inner_path)
sha512 = file_info["sha512"] sha512 = file_info["sha512"]
piece_num = int(math.ceil(float(file_info["size"]) / file_info["piece_size"])) piece_num = int(math.ceil(float(file_info["size"]) / file_info["piece_size"]))
@ -419,7 +423,13 @@ class SiteStoragePlugin(object):
else: else:
self.log.debug("Creating bigfile: %s" % inner_path) self.log.debug("Creating bigfile: %s" % inner_path)
self.createSparseFile(inner_path, file_info["size"], sha512) self.createSparseFile(inner_path, file_info["size"], sha512)
self.piecefields[sha512].fromstring(piece_data * "0") self.piecefields[sha512].fromstring("0" * piece_num)
return True
def openBigfile(self, inner_path, prebuffer=0):
if not self.checkBigfile(inner_path):
return False
self.site.needFile(inner_path, blocking=False) # Download piecemap
return BigFile(self.site, inner_path, prebuffer=prebuffer) return BigFile(self.site, inner_path, prebuffer=prebuffer)

View file

@ -2,9 +2,11 @@ import time
import gevent import gevent
import pytest import pytest
import mock
from Crypt import CryptConnection from Crypt import CryptConnection
from Connection import ConnectionServer from Connection import ConnectionServer
from Config import config
@pytest.mark.usefixtures("resetSettings") @pytest.mark.usefixtures("resetSettings")
@ -15,7 +17,9 @@ class TestConnection:
assert file_server != client assert file_server != client
# Connect to myself # Connect to myself
with mock.patch('Config.config.ip_local', return_value=[]): # SSL not used for local ips
connection = client.getConnection("127.0.0.1", 1544) connection = client.getConnection("127.0.0.1", 1544)
assert len(file_server.connections) == 1 assert len(file_server.connections) == 1
assert connection.handshake assert connection.handshake
assert connection.crypt assert connection.crypt
@ -35,6 +39,8 @@ class TestConnection:
crypt_supported_bk = CryptConnection.manager.crypt_supported crypt_supported_bk = CryptConnection.manager.crypt_supported
CryptConnection.manager.crypt_supported = [] CryptConnection.manager.crypt_supported = []
print "---"
with mock.patch('Config.config.ip_local', return_value=[]): # SSL not used for local ips
connection = client.getConnection("127.0.0.1", 1544) connection = client.getConnection("127.0.0.1", 1544)
assert len(file_server.connections) == 1 assert len(file_server.connections) == 1
assert not connection.crypt assert not connection.crypt