Merge branch 'master' into git-and-newdir
This commit is contained in:
commit
41ebf510cb
12 changed files with 44 additions and 17 deletions
8
.gitignore
vendored
8
.gitignore
vendored
|
@ -37,3 +37,11 @@ zeronet.conf
|
||||||
|
|
||||||
# ZeroNet log files
|
# ZeroNet log files
|
||||||
log/*
|
log/*
|
||||||
|
|
||||||
|
# Enabled plugins that disabled by default
|
||||||
|
plugins/Bootstrapper
|
||||||
|
plugins/DonationMessage
|
||||||
|
plugins/Multiuser
|
||||||
|
plugins/NoNewSites
|
||||||
|
plugins/StemPort
|
||||||
|
plugins/UiPassword
|
||||||
|
|
|
@ -142,6 +142,6 @@ class FileServerPlugin(object):
|
||||||
class ConfigPlugin(object):
|
class ConfigPlugin(object):
|
||||||
def createArguments(self):
|
def createArguments(self):
|
||||||
group = self.parser.add_argument_group("AnnounceLocal plugin")
|
group = self.parser.add_argument_group("AnnounceLocal plugin")
|
||||||
group.add_argument('--broadcast_port', help='UDP broadcasting port for local peer discovery', default=1544, type=int, metavar='port')
|
group.add_argument('--broadcast-port', help='UDP broadcasting port for local peer discovery', default=1544, type=int, metavar='port')
|
||||||
|
|
||||||
return super(ConfigPlugin, self).createArguments()
|
return super(ConfigPlugin, self).createArguments()
|
||||||
|
|
|
@ -185,6 +185,6 @@ class FileServerPlugin(object):
|
||||||
class ConfigPlugin(object):
|
class ConfigPlugin(object):
|
||||||
def createArguments(self):
|
def createArguments(self):
|
||||||
group = self.parser.add_argument_group("AnnounceShare plugin")
|
group = self.parser.add_argument_group("AnnounceShare plugin")
|
||||||
group.add_argument('--working_shared_trackers_limit', help='Stop discovering new shared trackers after this number of shared trackers reached', default=5, type=int, metavar='limit')
|
group.add_argument('--working-shared-trackers-limit', help='Stop discovering new shared trackers after this number of shared trackers reached', default=5, type=int, metavar='limit')
|
||||||
|
|
||||||
return super(ConfigPlugin, self).createArguments()
|
return super(ConfigPlugin, self).createArguments()
|
||||||
|
|
|
@ -413,7 +413,7 @@ class ConfigPlugin(object):
|
||||||
back = super(ConfigPlugin, self).createArguments()
|
back = super(ConfigPlugin, self).createArguments()
|
||||||
if self.getCmdlineValue("test") == "benchmark":
|
if self.getCmdlineValue("test") == "benchmark":
|
||||||
self.test_parser.add_argument(
|
self.test_parser.add_argument(
|
||||||
'--num_multipler', help='Benchmark run time multipler',
|
'--num-multipler', help='Benchmark run time multipler',
|
||||||
default=1.0, type=float, metavar='num'
|
default=1.0, type=float, metavar='num'
|
||||||
)
|
)
|
||||||
self.test_parser.add_argument(
|
self.test_parser.add_argument(
|
||||||
|
@ -422,7 +422,7 @@ class ConfigPlugin(object):
|
||||||
)
|
)
|
||||||
elif self.getCmdlineValue("test") == "portChecker":
|
elif self.getCmdlineValue("test") == "portChecker":
|
||||||
self.test_parser.add_argument(
|
self.test_parser.add_argument(
|
||||||
'--func_name', help='Name of open port checker function',
|
'--func-name', help='Name of open port checker function',
|
||||||
default=None, metavar='func_name'
|
default=None, metavar='func_name'
|
||||||
)
|
)
|
||||||
return back
|
return back
|
||||||
|
|
|
@ -837,7 +837,7 @@ class SitePlugin(object):
|
||||||
class ConfigPlugin(object):
|
class ConfigPlugin(object):
|
||||||
def createArguments(self):
|
def createArguments(self):
|
||||||
group = self.parser.add_argument_group("Bigfile plugin")
|
group = self.parser.add_argument_group("Bigfile plugin")
|
||||||
group.add_argument('--autodownload_bigfile_size_limit', help='Also download bigfiles smaller than this limit if help distribute option is checked', default=10, metavar="MB", type=int)
|
group.add_argument('--autodownload-bigfile-size-limit', help='Also download bigfiles smaller than this limit if help distribute option is checked', default=10, metavar="MB", type=int)
|
||||||
group.add_argument('--bigfile_size_limit', help='Maximum size of downloaded big files', default=False, metavar="MB", type=int)
|
group.add_argument('--bigfile-size-limit', help='Maximum size of downloaded big files', default=False, metavar="MB", type=int)
|
||||||
|
|
||||||
return super(ConfigPlugin, self).createArguments()
|
return super(ConfigPlugin, self).createArguments()
|
||||||
|
|
|
@ -247,7 +247,7 @@ class SitePlugin(object):
|
||||||
class ConfigPlugin(object):
|
class ConfigPlugin(object):
|
||||||
def createArguments(self):
|
def createArguments(self):
|
||||||
group = self.parser.add_argument_group("OptionalManager plugin")
|
group = self.parser.add_argument_group("OptionalManager plugin")
|
||||||
group.add_argument('--optional_limit', help='Limit total size of optional files', default="10%", metavar="GB or free space %")
|
group.add_argument('--optional-limit', help='Limit total size of optional files', default="10%", metavar="GB or free space %")
|
||||||
group.add_argument('--optional_limit_exclude_minsize', help='Exclude files larger than this limit from optional size limit calculation', default=20, metavar="MB", type=int)
|
group.add_argument('--optional-limit-exclude-minsize', help='Exclude files larger than this limit from optional size limit calculation', default=20, metavar="MB", type=int)
|
||||||
|
|
||||||
return super(ConfigPlugin, self).createArguments()
|
return super(ConfigPlugin, self).createArguments()
|
||||||
|
|
|
@ -62,7 +62,7 @@ class ConfigPlugin(object):
|
||||||
def createArguments(self):
|
def createArguments(self):
|
||||||
group = self.parser.add_argument_group("Zeroname plugin")
|
group = self.parser.add_argument_group("Zeroname plugin")
|
||||||
group.add_argument(
|
group.add_argument(
|
||||||
"--bit_resolver", help="ZeroNet site to resolve .bit domains",
|
"--bit-resolver", help="ZeroNet site to resolve .bit domains (deprecated)",
|
||||||
default="1GnACKctkJrGWHTqxk9T9zXo2bLQc2PDnF", metavar="address"
|
default="1GnACKctkJrGWHTqxk9T9zXo2bLQc2PDnF", metavar="address"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -272,7 +272,7 @@ class UiWebsocketPlugin(object):
|
||||||
class ConfigPlugin(object):
|
class ConfigPlugin(object):
|
||||||
def createArguments(self):
|
def createArguments(self):
|
||||||
group = self.parser.add_argument_group("Multiuser plugin")
|
group = self.parser.add_argument_group("Multiuser plugin")
|
||||||
group.add_argument('--multiuser_local', help="Enable unsafe Ui functions and write users to disk", action='store_true')
|
group.add_argument('--multiuser-local', help="Enable unsafe Ui functions and write users to disk", action='store_true')
|
||||||
group.add_argument('--multiuser_no_new_sites', help="Denies adding new sites by normal users", action='store_true')
|
group.add_argument('--multiuser-no-new-sites', help="Denies adding new sites by normal users", action='store_true')
|
||||||
|
|
||||||
return super(ConfigPlugin, self).createArguments()
|
return super(ConfigPlugin, self).createArguments()
|
||||||
|
|
|
@ -159,7 +159,7 @@ class UiRequestPlugin(object):
|
||||||
class ConfigPlugin(object):
|
class ConfigPlugin(object):
|
||||||
def createArguments(self):
|
def createArguments(self):
|
||||||
group = self.parser.add_argument_group("UiPassword plugin")
|
group = self.parser.add_argument_group("UiPassword plugin")
|
||||||
group.add_argument('--ui_password', help='Password to access UiServer', default=None, metavar="password")
|
group.add_argument('--ui-password', help='Password to access UiServer', default=None, metavar="password")
|
||||||
|
|
||||||
return super(ConfigPlugin, self).createArguments()
|
return super(ConfigPlugin, self).createArguments()
|
||||||
|
|
||||||
|
|
|
@ -100,6 +100,25 @@ class UiRequest:
|
||||||
def resolveDomain(self, domain):
|
def resolveDomain(self, domain):
|
||||||
return self.server.site_manager.resolveDomainCached(domain)
|
return self.server.site_manager.resolveDomainCached(domain)
|
||||||
|
|
||||||
|
def hasCorsPermission(self, referer):
|
||||||
|
"""Check if site from referer has CORS permission to read site in current request
|
||||||
|
|
||||||
|
NOTE: this allows embedding WITHOUT prepending "cors-" (as it has already been used
|
||||||
|
for a long time e.g. on ZeroBlog++ based sites) as long as read permission has been
|
||||||
|
granted.
|
||||||
|
"""
|
||||||
|
target_path = self.env['PATH_INFO']
|
||||||
|
if referer is None or target_path is None:
|
||||||
|
return False
|
||||||
|
s_parts = self.parsePath(referer)
|
||||||
|
t_parts = self.parsePath(target_path)
|
||||||
|
s_address = s_parts['address']
|
||||||
|
t_address = t_parts['address']
|
||||||
|
if not s_address or not t_address:
|
||||||
|
return False
|
||||||
|
s_site = self.server.sites[s_address]
|
||||||
|
return f'Cors:{t_address}' in s_site.settings['permissions']
|
||||||
|
|
||||||
def isCrossOriginRequest(self):
|
def isCrossOriginRequest(self):
|
||||||
"""Prevent detecting sites on this 0net instance
|
"""Prevent detecting sites on this 0net instance
|
||||||
|
|
||||||
|
@ -129,7 +148,7 @@ class UiRequest:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Deny cross site requests
|
# Deny cross site requests
|
||||||
if not self.isSameOrigin(referer, url):
|
if not self.isSameOrigin(referer, url) and not self.hasCorsPermission(referer):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
@ -731,7 +750,7 @@ class UiRequest:
|
||||||
if "../" in path or "./" in path:
|
if "../" in path or "./" in path:
|
||||||
raise SecurityError("Invalid path")
|
raise SecurityError("Invalid path")
|
||||||
|
|
||||||
match = re.match(r"/(media/)?(?P<address>[A-Za-z0-9]+[A-Za-z0-9\._-]+)(?P<inner_path>/.*|$)", path)
|
match = re.match(r"(?P<server>(http[s]{0,1}://(.*?))?)/(media/)?(?P<address>[A-Za-z0-9]+[A-Za-z0-9\._-]+)(?P<inner_path>/.*|$)", path)
|
||||||
if match:
|
if match:
|
||||||
path_parts = match.groupdict()
|
path_parts = match.groupdict()
|
||||||
addr = path_parts["address"]
|
addr = path_parts["address"]
|
||||||
|
|
|
@ -162,7 +162,7 @@ class UiServer:
|
||||||
return ui_request.route(path)
|
return ui_request.route(path)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
logging.debug(f"UiRequest @ site error: {Debug.formatException(err)}")
|
logging.debug(f"UiRequest @ site error: {Debug.formatException(err)}")
|
||||||
return ui_request.error500('Error while trying to server site data')
|
return ui_request.error500('Error while trying to serve site data')
|
||||||
|
|
||||||
def startSiteServer(self):
|
def startSiteServer(self):
|
||||||
self.site_server = WSGIServer((self.ip, self.site_port), self.handleSiteRequest, log=self.log)
|
self.site_server = WSGIServer((self.ip, self.site_port), self.handleSiteRequest, log=self.log)
|
||||||
|
|
|
@ -328,8 +328,8 @@ class UiWebsocket(object):
|
||||||
'ui_ip' : config.ui_ip,
|
'ui_ip' : config.ui_ip,
|
||||||
'ui_port' : config.ui_port,
|
'ui_port' : config.ui_port,
|
||||||
'version' : config.version,
|
'version' : config.version,
|
||||||
# The only place this is used is in dashboard so we shorten it for now
|
# Some legacy code relies on this being an integer, so lets return dummy one
|
||||||
'rev' : config.commit[:8],
|
'rev' : config.user_agent_rev,
|
||||||
'timecorrection' : file_server.timecorrection,
|
'timecorrection' : file_server.timecorrection,
|
||||||
'language' : config.language,
|
'language' : config.language,
|
||||||
'debug' : config.debug,
|
'debug' : config.debug,
|
||||||
|
|
Loading…
Reference in a new issue