Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Master$2a$10$ljwTNoRlbEkGxuWYxULwT.DvOi3zjGbcwvLbNBdBqBchorYGwV0R2 #2618

Open
wants to merge 51 commits into
base: py3
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
4d25a02
Only raise security error on ../
anoadragon453 Jun 10, 2018
d51e9c6
Update ciphersuites
ValdikSS Mar 19, 2019
b4ceb69
Fix return value of bigfile upload post request
shortcutme Mar 23, 2019
5716b75
Add reason for shutdown
shortcutme Mar 23, 2019
b8b8ce2
Pass kwargs to excepthook
shortcutme Mar 23, 2019
74ce0c5
Proper shutdown at sigterm
shortcutme Mar 23, 2019
c198237
Remove signal watcher from zeronet.py
shortcutme Mar 23, 2019
ef892e9
Add random padding to handshake
shortcutme Mar 23, 2019
06be430
Rev3857
shortcutme Mar 23, 2019
abb566e
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet
shortcutme Mar 23, 2019
9117339
Merge pull request #1927 from ValdikSS/update-ciphers
HelloZeroNet Mar 25, 2019
f66cfc9
Less obvious fake TLS certificate generation
ValdikSS Mar 19, 2019
91b2f6a
Merge pull request #1928 from ValdikSS/crypt-obf
HelloZeroNet Mar 27, 2019
e333b47
maybe a bug
tangdou1 Mar 27, 2019
d504cdf
Formatting CryptConnection.py
shortcutme Mar 27, 2019
cdd0f9c
Remove srl file
shortcutme Mar 27, 2019
5ab2031
Fix ssl compatibility with older clients, prefer chacha20-poly1305 if…
shortcutme Mar 27, 2019
350adeb
Fix resource loading with origin only referer
shortcutme Mar 27, 2019
eb88dbb
Rev3860
shortcutme Mar 27, 2019
c51dfe7
Merge pull request #1938 from tangdou1/patch-2
HelloZeroNet Mar 27, 2019
b3f677f
sitePause & siteResume are also important settings
tangdou1 Mar 27, 2019
ba6a75f
Merge pull request #1939 from tangdou1/patch-3
HelloZeroNet Mar 27, 2019
80f3f9d
OptionalFileList - get list of not downloaded files
krzotr Apr 3, 2019
27c47bb
Added support for encrypted connections in Dockerfile - added OpenSSL…
krzotr Apr 4, 2019
171b591
Merge pull request #1957 from krzotr/patch-1
HelloZeroNet Apr 4, 2019
7a59a19
Fix double --open_browser (by imachug)
shortcutme Apr 7, 2019
5d81467
Merge pull request #1956 from krzotr/master
HelloZeroNet Apr 9, 2019
c0d8102
Rev3861, Escape error detail to avoid XSS (reported by krzotr)
shortcutme Apr 10, 2019
85fd087
Send noscript header for error message pages
shortcutme Apr 11, 2019
7a217a3
Only display error details in debug mode
shortcutme Apr 11, 2019
719df4a
Rev3862
shortcutme Apr 11, 2019
7e78fbc
Ignore invalid shared filters
shortcutme Apr 19, 2019
129aff2
Retry peers only once
shortcutme Apr 19, 2019
3366edc
Rev3863
shortcutme Apr 19, 2019
fd7f724
Always translate html files to avoid compatibility problems with brac…
ValdikSS Apr 21, 2019
8dd3a84
Merge pull request #1995 from ValdikSS/translation-fix
HelloZeroNet Apr 23, 2019
9b27441
Rev3864, Fix newsfeed sql query with many parameters
shortcutme Apr 29, 2019
f08bea7
Create FUNDING.yml
filips123 May 24, 2019
c165d21
Rev3865, Fix ZipStream seek support
shortcutme May 31, 2019
7418400
Rev3866, Fix and test serving files with null bytes
shortcutme Jun 6, 2019
9e7ae55
Merge pull request #1453 from anoadragon453/anoa/fix_filepaths
HelloZeroNet Jun 30, 2019
bdca288
Merge pull request #2031 from filips123/patch-2
HelloZeroNet Jul 4, 2019
028d491
Update Sidebar.css
HughIsaacs2 Jul 5, 2019
32e9839
Merge pull request #2074 from HughIsaacs2/patch-1
HelloZeroNet Jul 6, 2019
861e085
Update it.json
mariorossi77 Jul 7, 2019
77a5d88
Merge pull request #2082 from kusky33/patch-1
HelloZeroNet Jul 7, 2019
67b78ca
Rev3868, Add origin validation to websocket connections
shortcutme Aug 18, 2019
27a67d9
Allow websocket connection originates from earlier accepted hostnames
shortcutme Aug 27, 2019
a121c23
Use re.sub to replace template variables
shortcutme Aug 27, 2019
a9b5561
Rev3870
shortcutme Aug 27, 2019
bf771ed
Restrict setting open_browser values in config file
shortcutme Aug 27, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
custom: https://zeronet.io/docs/help_zeronet/donate/
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ FROM alpine:3.8
ENV HOME /root

#Install ZeroNet
RUN apk --no-cache --no-progress add musl-dev gcc python python-dev py2-pip tor \
RUN apk --no-cache --no-progress add musl-dev gcc python python-dev py2-pip tor openssl \
&& pip install --no-cache-dir gevent msgpack \
&& apk del musl-dev gcc python-dev py2-pip \
&& echo "ControlPort 9051" >> /etc/tor/torrc \
Expand Down
12 changes: 7 additions & 5 deletions plugins/Bigfile/BigfilePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import shutil
import collections
import math
import json

import msgpack
import gevent
Expand Down Expand Up @@ -96,12 +97,12 @@ def actionBigfileUpload(self):

site.content_manager.contents.loadItem(file_info["content_inner_path"]) # reload cache

return {
return json.dumps({
"merkle_root": merkle_root,
"piece_num": len(piecemap_info["sha512_pieces"]),
"piece_size": piece_size,
"inner_path": inner_path
}
})

def readMultipartHeaders(self, wsgi_input):
for i in range(100):
Expand Down Expand Up @@ -604,9 +605,10 @@ def isReadable(self, site, inner_path, file, pos):
if file.read(10) == "\0" * 10:
# Looks empty, but makes sures we don't have that piece
file_info = site.content_manager.getFileInfo(inner_path)
piece_i = pos / file_info["piece_size"]
if not site.storage.piecefields[file_info["sha512"]][piece_i]:
return False
if "piece_size" in file_info:
piece_i = pos / file_info["piece_size"]
if not site.storage.piecefields[file_info["sha512"]][piece_i]:
return False
# Seek back to position we want to read
file.seek(pos)
return super(FileRequestPlugin, self).isReadable(site, inner_path, file, pos)
Expand Down
29 changes: 29 additions & 0 deletions plugins/Bigfile/Test/TestBigfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -491,3 +491,32 @@ def testFileSize(self, file_server, site, site_temp):

site_temp.needFile("%s|%s-%s" % (inner_path, 9 * 1024 * 1024, 10 * 1024 * 1024))
assert site_temp.storage.getSize(inner_path) == site.storage.getSize(inner_path)

@pytest.mark.parametrize("size", [1024 * 3, 1024 * 1024 * 3, 1024 * 1024 * 30])
def testNullFileRead(self, file_server, site, site_temp, size):
inner_path = "data/optional.iso"

f = site.storage.open(inner_path, "w")
f.write("\0" * size)
f.close()
assert site.content_manager.sign("content.json", self.privatekey)

# Init source server
site.connection_server = file_server
file_server.sites[site.address] = site

# Init client server
site_temp.connection_server = FileServer(file_server.ip, 1545)
site_temp.connection_server.sites[site_temp.address] = site_temp
site_temp.addPeer(file_server.ip, 1544)

# Download site
site_temp.download(blind_includes=True).join(timeout=5)

if "piecemap" in site.content_manager.getFileInfo(inner_path): # Bigfile
site_temp.needFile(inner_path + "|all")
else:
site_temp.needFile(inner_path)


assert site_temp.storage.getSize(inner_path) == size
9 changes: 8 additions & 1 deletion plugins/ContentFilter/ContentFilterPlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,14 @@ def actionFilterIncludeList(self, to, all_sites=False, filters=False):
include_site = filter_storage.site_manager.get(include["address"])
if not include_site:
continue
content = include_site.storage.loadJson(include["inner_path"])
try:
content = include_site.storage.loadJson(include["inner_path"])
include["error"] = None
except Exception as err:
if include_site.settings["own"]:
include_site.log.warning("Error loading filter %s: %s" % (include["inner_path"], err))
content = {}
include["error"] = str(err)
include["mutes"] = content.get("mutes", {})
include["siteblocks"] = content.get("siteblocks", {})
back.append(include)
Expand Down
11 changes: 6 additions & 5 deletions plugins/Newsfeed/NewsfeedPlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from Plugin import PluginManager
from Db import DbQuery
from Debug import Debug
from util import helper


@PluginManager.registerTo("UiWebsocket")
Expand Down Expand Up @@ -66,14 +67,14 @@ def actionFeedQuery(self, to, limit=10, day_limit=3):
query = " UNION ".join(query_parts)

if ":params" in query:
query = query.replace(":params", ",".join(["?"] * len(params)))
res = site.storage.query(query + " ORDER BY date_added DESC LIMIT %s" % limit, params * query_raw.count(":params"))
else:
res = site.storage.query(query + " ORDER BY date_added DESC LIMIT %s" % limit)
query_params = map(helper.sqlquote, params)
query = query.replace(":params", ",".join(query_params))

res = site.storage.query(query + " ORDER BY date_added DESC LIMIT %s" % limit)

except Exception as err: # Log error
self.log.error("%s feed query %s error: %s" % (address, name, Debug.formatException(err)))
stats.append({"site": site.address, "feed_name": name, "error": str(err), "query": query})
stats.append({"site": site.address, "feed_name": name, "error": str(err)})
continue

for row in res:
Expand Down
6 changes: 5 additions & 1 deletion plugins/OptionalManager/UiWebsocketPlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,12 @@ def actionOptionalFileList(self, to, address=None, orderby="time_downloaded DESC
wheres_raw = []
if "bigfile" in filter:
wheres["size >"] = 1024 * 1024 * 10
if "downloaded" in filter:

if "not_downloaded" in filter:
wheres["is_downloaded"] = 0
elif "downloaded" in filter:
wheres_raw.append("(is_downloaded = 1 OR is_pinned = 1)")

if "pinned" in filter:
wheres["is_pinned"] = 1

Expand Down
24 changes: 20 additions & 4 deletions plugins/Sidebar/ZipStream.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
import os
import zipfile


class ZipStream(file):
def __init__(self, dir_path):
self.dir_path = dir_path
self.pos = 0
self.zf = zipfile.ZipFile(self, 'w', zipfile.ZIP_DEFLATED, allowZip64 = True)
self.buff_pos = 0
self.zf = zipfile.ZipFile(self, 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
self.buff = StringIO.StringIO()
self.file_list = self.getFileList()

Expand All @@ -27,6 +27,8 @@ def read(self, size=60 * 1024):
self.buff.seek(0)
back = self.buff.read()
self.buff.truncate(0)
self.buff.seek(0)
self.buff_pos += len(back)
return back

def write(self, data):
Expand All @@ -36,8 +38,22 @@ def write(self, data):
def tell(self):
return self.pos

def seek(self, pos, type):
pass
def seek(self, pos, whence=0):
if pos >= self.buff_pos:
self.buff.seek(pos - self.buff_pos, whence)
self.pos = pos

def flush(self):
pass


if __name__ == "__main__":
zs = ZipStream(".")
out = open("out.zip", "wb")
while 1:
data = zs.read()
print("Write %s" % len(data))
if not data:
break
out.write(data)
out.close()
4 changes: 2 additions & 2 deletions plugins/Sidebar/media/Sidebar.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
}

.drag-bg { width: 100%; height: 100%; position: fixed; }
.fixbutton.dragging { cursor: -webkit-grabbing; }
.fixbutton-bg:active { cursor: -webkit-grabbing; }
.fixbutton.dragging { cursor: -webkit-grabbing; cusor: grabbing; }
.fixbutton-bg:active { cursor: -webkit-grabbing; cusor: grabbing; }


.body-sidebar, .body-internals { background-color: #666 !important; }
Expand Down
11 changes: 9 additions & 2 deletions plugins/TranslateSite/TranslateSitePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,18 @@
@PluginManager.registerTo("UiRequest")
class UiRequestPlugin(object):
def actionSiteMedia(self, path, **kwargs):
file_name = path.split("/")[-1]
file_name = path.split("/")[-1].lower()
if not file_name: # Path ends with /
file_name = "index.html"
extension = file_name.split(".")[-1]
if translate.lang != "en" and extension in ["js", "html"]:
if extension == "html":
should_translate = True
elif extension == "js" and translate.lang != "en":
should_translate = True
else:
should_translate = False

if should_translate:
path_parts = self.parsePath(path)
kwargs["header_length"] = False
file_generator = super(UiRequestPlugin, self).actionSiteMedia(path, **kwargs)
Expand Down
2 changes: 1 addition & 1 deletion plugins/disabled-Multiuser/MultiuserPlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ def getCurrentUser(self):
class UiWebsocketPlugin(object):
def __init__(self, *args, **kwargs):
self.multiuser_denied_cmds = (
"siteDelete", "configSet", "serverShutdown", "serverUpdate", "siteClone",
"sitePause", "siteResume", "siteDelete", "configSet", "serverShutdown", "serverUpdate", "siteClone",
"siteSetOwned", "siteSetAutodownloadoptional", "dbReload", "dbRebuild",
"mergerSiteDelete", "siteSetLimit", "siteSetAutodownloadBigfileLimit",
"optionalLimitSet", "optionalHelp", "optionalHelpRemove", "optionalHelpAll", "optionalFilePin", "optionalFileUnpin", "optionalFileDelete",
Expand Down
2 changes: 1 addition & 1 deletion src/Config.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class Config(object):

def __init__(self, argv):
self.version = "0.6.5"
self.rev = 3853
self.rev = 3870
self.argv = argv
self.action = None
self.pending_changes = {}
Expand Down
3 changes: 2 additions & 1 deletion src/Connection/Connection.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import socket
import time
import random

import gevent
import msgpack
Expand Down Expand Up @@ -172,7 +173,7 @@ def connect(self):
self.sock.connect(sock_address)

# Detect protocol
self.send({"cmd": "handshake", "req_id": 0, "params": self.getHandshakeInfo()})
self.send({"cmd": "handshake", "req_id": 0, "params": self.getHandshakeInfo(), "random": "A" * random.randint(0, 1024)})
event_connected = self.event_connected
gevent.spawn(self.messageLoop)
connect_res = event_connected.get() # Wait for handshake
Expand Down
Loading