2015-06-17 23:27:56 +02:00
|
|
|
# Included modules
|
|
|
|
import os
|
|
|
|
import sys
|
2016-05-26 16:00:14 +02:00
|
|
|
import stat
|
2015-06-17 23:27:56 +02:00
|
|
|
import time
|
2015-06-18 02:53:01 +02:00
|
|
|
import logging
|
2015-06-17 23:27:56 +02:00
|
|
|
|
|
|
|
# Third party modules
|
|
|
|
import gevent
|
2016-03-11 12:39:39 +01:00
|
|
|
|
2019-03-16 02:05:27 +01:00
|
|
|
import gevent.monkey
|
|
|
|
gevent.monkey.patch_all(thread=False, subprocess=False)
|
2015-06-17 23:27:56 +02:00
|
|
|
|
|
|
|
update_after_shutdown = False # If set True then update and restart zeronet after main loop ended
|
2018-07-10 03:28:02 +02:00
|
|
|
restart_after_shutdown = False # If set True then restart zeronet after main loop ended
|
2015-01-12 02:03:45 +01:00
|
|
|
|
|
|
|
# Load config
|
|
|
|
from Config import config
|
2015-07-17 00:28:43 +02:00
|
|
|
config.parse(silent=True) # Plugins need to access the configuration
|
2015-09-10 23:25:09 +02:00
|
|
|
if not config.arguments: # Config parse failed, show the help screen and exit
|
|
|
|
config.parse()
|
2015-01-12 02:03:45 +01:00
|
|
|
|
2018-11-08 01:32:31 +01:00
|
|
|
config.initLogging()
|
2017-01-15 13:19:34 +01:00
|
|
|
|
2015-07-12 20:36:46 +02:00
|
|
|
if not os.path.isdir(config.data_dir):
|
|
|
|
os.mkdir(config.data_dir)
|
2017-01-15 13:19:34 +01:00
|
|
|
try:
|
|
|
|
os.chmod(config.data_dir, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
|
2017-07-16 22:57:28 +02:00
|
|
|
except Exception as err:
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Can't change permission of %s: %s" % (config.data_dir, err))
|
2017-01-15 13:19:34 +01:00
|
|
|
|
2015-06-17 23:27:56 +02:00
|
|
|
if not os.path.isfile("%s/sites.json" % config.data_dir):
|
|
|
|
open("%s/sites.json" % config.data_dir, "w").write("{}")
|
|
|
|
if not os.path.isfile("%s/users.json" % config.data_dir):
|
|
|
|
open("%s/users.json" % config.data_dir, "w").write("{}")
|
2015-05-31 15:52:21 +02:00
|
|
|
|
2015-01-12 02:03:45 +01:00
|
|
|
if config.action == "main":
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
from util import helper
|
|
|
|
try:
|
2016-11-07 22:34:12 +01:00
|
|
|
lock = helper.openLocked("%s/lock.pid" % config.data_dir, "w")
|
|
|
|
lock.write("%s" % os.getpid())
|
2019-03-20 01:05:52 +01:00
|
|
|
except BlockingIOError as err:
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Can't open lock file, your ZeroNet client is probably already running, exiting... (%s)" % err)
|
2018-07-10 03:37:38 +02:00
|
|
|
if config.open_browser and config.open_browser != "False":
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Opening browser: %s...", config.open_browser)
|
2016-11-07 22:34:27 +01:00
|
|
|
import webbrowser
|
2018-07-10 03:37:38 +02:00
|
|
|
try:
|
|
|
|
if config.open_browser == "default_browser":
|
|
|
|
browser = webbrowser.get()
|
|
|
|
else:
|
|
|
|
browser = webbrowser.get(config.open_browser)
|
|
|
|
browser.open("http://%s:%s/%s" % (config.ui_ip if config.ui_ip != "*" else "127.0.0.1", config.ui_port, config.homepage), new=2)
|
|
|
|
except Exception as err:
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Error starting browser: %s" % err)
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
sys.exit()
|
|
|
|
|
2015-01-12 02:03:45 +01:00
|
|
|
|
|
|
|
# Debug dependent configuration
|
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
|
|
|
from Debug import DebugHook
|
2015-06-17 23:27:56 +02:00
|
|
|
|
2015-07-17 00:28:43 +02:00
|
|
|
# Load plugins
|
|
|
|
from Plugin import PluginManager
|
|
|
|
PluginManager.plugin_manager.loadPlugins()
|
|
|
|
config.loadPlugins()
|
|
|
|
config.parse() # Parse again to add plugin configuration options
|
2015-01-12 02:03:45 +01:00
|
|
|
|
version 0.2.7, plugin system, multiuser plugin for zeroproxies, reworked imports, cookie parse, stats moved to plugin, usermanager class, dont generate site auth on listing, multiline notifications, allow server side prompt from user, update script keep plugins disabled status
2015-03-24 01:33:09 +01:00
|
|
|
# Log current config
|
2015-03-19 21:19:14 +01:00
|
|
|
logging.debug("Config: %s" % config)
|
2015-01-12 02:03:45 +01:00
|
|
|
|
2017-02-19 13:20:49 +01:00
|
|
|
# Modify stack size on special hardwares
|
|
|
|
if config.stack_size:
|
|
|
|
import threading
|
|
|
|
threading.stack_size(config.stack_size)
|
|
|
|
|
2015-08-06 00:51:25 +02:00
|
|
|
# Use pure-python implementation of msgpack to save CPU
|
|
|
|
if config.msgpack_purepython:
|
|
|
|
os.environ["MSGPACK_PUREPYTHON"] = "True"
|
version 0.2.7, plugin system, multiuser plugin for zeroproxies, reworked imports, cookie parse, stats moved to plugin, usermanager class, dont generate site auth on listing, multiline notifications, allow server side prompt from user, update script keep plugins disabled status
2015-03-24 01:33:09 +01:00
|
|
|
|
2017-04-14 16:05:42 +02:00
|
|
|
# Socket monkey patch
|
2015-04-12 23:59:22 +02:00
|
|
|
if config.proxy:
|
2015-06-17 23:27:56 +02:00
|
|
|
from util import SocksProxy
|
2019-03-15 21:06:59 +01:00
|
|
|
import urllib.request
|
2015-06-17 23:27:56 +02:00
|
|
|
logging.info("Patching sockets to socks proxy: %s" % config.proxy)
|
2017-02-16 20:56:07 +01:00
|
|
|
if config.fileserver_ip == "*":
|
|
|
|
config.fileserver_ip = '127.0.0.1' # Do not accept connections anywhere but localhost
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
SocksProxy.monkeyPatch(*config.proxy.split(":"))
|
|
|
|
elif config.tor == "always":
|
|
|
|
from util import SocksProxy
|
2019-03-15 21:06:59 +01:00
|
|
|
import urllib.request
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
logging.info("Patching sockets to tor socks proxy: %s" % config.tor_proxy)
|
2017-02-16 20:56:07 +01:00
|
|
|
if config.fileserver_ip == "*":
|
|
|
|
config.fileserver_ip = '127.0.0.1' # Do not accept connections anywhere but localhost
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
SocksProxy.monkeyPatch(*config.tor_proxy.split(":"))
|
|
|
|
config.disable_udp = True
|
2017-04-14 16:05:42 +02:00
|
|
|
elif config.bind:
|
|
|
|
bind = config.bind
|
|
|
|
if ":" not in config.bind:
|
|
|
|
bind += ":0"
|
|
|
|
from util import helper
|
|
|
|
helper.socketBindMonkeyPatch(*bind.split(":"))
|
|
|
|
|
version 0.2.7, plugin system, multiuser plugin for zeroproxies, reworked imports, cookie parse, stats moved to plugin, usermanager class, dont generate site auth on listing, multiline notifications, allow server side prompt from user, update script keep plugins disabled status
2015-03-24 01:33:09 +01:00
|
|
|
# -- Actions --
|
|
|
|
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
|
2015-04-15 02:54:10 +02:00
|
|
|
@PluginManager.acceptPlugins
|
2015-06-17 23:27:56 +02:00
|
|
|
class Actions(object):
|
2015-07-17 00:28:43 +02:00
|
|
|
def call(self, function_name, kwargs):
|
2016-09-07 17:41:09 +02:00
|
|
|
logging.info("Version: %s r%s, Python %s, Gevent: %s" % (config.version, config.rev, sys.version, gevent.__version__))
|
|
|
|
|
2015-07-17 00:28:43 +02:00
|
|
|
func = getattr(self, function_name, None)
|
2018-04-03 14:49:40 +02:00
|
|
|
back = func(**kwargs)
|
|
|
|
if back:
|
2019-03-15 21:06:59 +01:00
|
|
|
print(back)
|
2015-07-12 20:36:46 +02:00
|
|
|
|
2015-07-17 00:28:43 +02:00
|
|
|
# Default action: Start serving UiServer and FileServer
|
2015-06-17 23:27:56 +02:00
|
|
|
def main(self):
|
|
|
|
global ui_server, file_server
|
|
|
|
from File import FileServer
|
|
|
|
from Ui import UiServer
|
2015-09-24 22:08:08 +02:00
|
|
|
logging.info("Creating FileServer....")
|
|
|
|
file_server = FileServer()
|
2015-06-17 23:27:56 +02:00
|
|
|
logging.info("Creating UiServer....")
|
|
|
|
ui_server = UiServer()
|
2017-11-05 23:43:51 +01:00
|
|
|
file_server.ui_server = ui_server
|
2015-06-17 23:27:56 +02:00
|
|
|
|
|
|
|
logging.info("Removing old SSL certs...")
|
|
|
|
from Crypt import CryptConnection
|
|
|
|
CryptConnection.manager.removeCerts()
|
|
|
|
|
|
|
|
logging.info("Starting servers....")
|
|
|
|
gevent.joinall([gevent.spawn(ui_server.start), gevent.spawn(file_server.start)])
|
2018-07-10 03:28:02 +02:00
|
|
|
logging.info("All server stopped")
|
2015-06-17 23:27:56 +02:00
|
|
|
|
|
|
|
# Site commands
|
|
|
|
|
|
|
|
def siteCreate(self):
|
|
|
|
logging.info("Generating new privatekey...")
|
|
|
|
from Crypt import CryptBitcoin
|
|
|
|
privatekey = CryptBitcoin.newPrivatekey()
|
|
|
|
logging.info("----------------------------------------------------------------------")
|
|
|
|
logging.info("Site private key: %s" % privatekey)
|
|
|
|
logging.info(" !!! ^ Save it now, required to modify the site ^ !!!")
|
|
|
|
address = CryptBitcoin.privatekeyToAddress(privatekey)
|
|
|
|
logging.info("Site address: %s" % address)
|
|
|
|
logging.info("----------------------------------------------------------------------")
|
|
|
|
|
2015-09-02 19:15:55 +02:00
|
|
|
while True and not config.batch:
|
2019-03-15 21:06:59 +01:00
|
|
|
if input("? Have you secured your private key? (yes, no) > ").lower() == "yes":
|
2015-07-12 20:36:46 +02:00
|
|
|
break
|
|
|
|
else:
|
|
|
|
logging.info("Please, secure it now, you going to need it to modify your site!")
|
2015-06-17 23:27:56 +02:00
|
|
|
|
|
|
|
logging.info("Creating directory structure...")
|
|
|
|
from Site import Site
|
2016-11-16 11:18:44 +01:00
|
|
|
from Site import SiteManager
|
|
|
|
SiteManager.site_manager.load()
|
|
|
|
|
2015-06-17 23:27:56 +02:00
|
|
|
os.mkdir("%s/%s" % (config.data_dir, address))
|
|
|
|
open("%s/%s/index.html" % (config.data_dir, address), "w").write("Hello %s!" % address)
|
|
|
|
|
|
|
|
logging.info("Creating content.json...")
|
|
|
|
site = Site(address)
|
2016-02-21 11:44:10 +01:00
|
|
|
site.content_manager.sign(privatekey=privatekey, extend={"postmessage_nonce_security": True})
|
2015-06-17 23:27:56 +02:00
|
|
|
site.settings["own"] = True
|
|
|
|
site.saveSettings()
|
|
|
|
|
|
|
|
logging.info("Site created!")
|
|
|
|
|
2017-01-27 12:02:14 +01:00
|
|
|
def siteSign(self, address, privatekey=None, inner_path="content.json", publish=False, remove_missing_optional=False):
|
2015-06-17 23:27:56 +02:00
|
|
|
from Site import Site
|
2016-11-16 11:18:44 +01:00
|
|
|
from Site import SiteManager
|
2017-10-22 11:11:26 +02:00
|
|
|
from Debug import Debug
|
2016-11-16 11:18:44 +01:00
|
|
|
SiteManager.site_manager.load()
|
2015-06-17 23:27:56 +02:00
|
|
|
logging.info("Signing site: %s..." % address)
|
2015-07-12 20:36:46 +02:00
|
|
|
site = Site(address, allow_create=False)
|
2015-06-17 23:27:56 +02:00
|
|
|
|
2016-03-21 09:43:53 +01:00
|
|
|
if not privatekey: # If no privatekey defined
|
2015-11-08 12:33:13 +01:00
|
|
|
from User import UserManager
|
|
|
|
user = UserManager.user_manager.get()
|
2015-11-28 18:04:59 +01:00
|
|
|
if user:
|
|
|
|
site_data = user.getSiteData(address)
|
|
|
|
privatekey = site_data.get("privatekey")
|
|
|
|
else:
|
|
|
|
privatekey = None
|
2015-11-08 12:33:13 +01:00
|
|
|
if not privatekey:
|
|
|
|
# Not found in users.json, ask from console
|
|
|
|
import getpass
|
|
|
|
privatekey = getpass.getpass("Private key (input hidden):")
|
2017-06-19 16:14:36 +02:00
|
|
|
try:
|
|
|
|
succ = site.content_manager.sign(inner_path=inner_path, privatekey=privatekey, update_changed_files=True, remove_missing_optional=remove_missing_optional)
|
2019-03-15 21:06:59 +01:00
|
|
|
except Exception as err:
|
2017-10-22 11:11:26 +02:00
|
|
|
logging.error("Sign error: %s" % Debug.formatException(err))
|
2017-06-19 16:14:36 +02:00
|
|
|
succ = False
|
2015-06-17 23:27:56 +02:00
|
|
|
if succ and publish:
|
2018-04-03 14:49:40 +02:00
|
|
|
self.sitePublish(address, inner_path=inner_path)
|
2015-06-17 23:27:56 +02:00
|
|
|
|
|
|
|
def siteVerify(self, address):
|
|
|
|
import time
|
|
|
|
from Site import Site
|
2016-11-16 11:18:44 +01:00
|
|
|
from Site import SiteManager
|
|
|
|
SiteManager.site_manager.load()
|
|
|
|
|
2015-06-17 23:27:56 +02:00
|
|
|
s = time.time()
|
|
|
|
logging.info("Verifing site: %s..." % address)
|
|
|
|
site = Site(address)
|
|
|
|
bad_files = []
|
|
|
|
|
|
|
|
for content_inner_path in site.content_manager.contents:
|
2016-03-18 19:19:34 +01:00
|
|
|
s = time.time()
|
2015-06-17 23:27:56 +02:00
|
|
|
logging.info("Verifing %s signature..." % content_inner_path)
|
2017-06-19 15:49:39 +02:00
|
|
|
try:
|
|
|
|
file_correct = site.content_manager.verifyFile(
|
|
|
|
content_inner_path, site.storage.open(content_inner_path, "rb"), ignore_same=False
|
|
|
|
)
|
2019-03-15 21:06:59 +01:00
|
|
|
except Exception as err:
|
2017-06-19 15:49:39 +02:00
|
|
|
file_correct = False
|
|
|
|
|
2015-07-12 20:36:46 +02:00
|
|
|
if file_correct is True:
|
2016-03-19 18:11:12 +01:00
|
|
|
logging.info("[OK] %s (Done in %.3fs)" % (content_inner_path, time.time() - s))
|
2015-06-17 23:27:56 +02:00
|
|
|
else:
|
2017-06-19 15:49:39 +02:00
|
|
|
logging.error("[ERROR] %s: invalid file: %s!" % (content_inner_path, err))
|
2019-03-15 21:06:59 +01:00
|
|
|
input("Continue?")
|
2015-06-17 23:27:56 +02:00
|
|
|
bad_files += content_inner_path
|
|
|
|
|
|
|
|
logging.info("Verifying site files...")
|
2018-03-29 03:17:45 +02:00
|
|
|
bad_files += site.storage.verifyFiles()["bad_files"]
|
2015-06-17 23:27:56 +02:00
|
|
|
if not bad_files:
|
2015-07-12 20:36:46 +02:00
|
|
|
logging.info("[OK] All file sha512sum matches! (%.3fs)" % (time.time() - s))
|
2015-06-17 23:27:56 +02:00
|
|
|
else:
|
|
|
|
logging.error("[ERROR] Error during verifying site files!")
|
|
|
|
|
|
|
|
def dbRebuild(self, address):
|
|
|
|
from Site import Site
|
2016-08-10 12:44:17 +02:00
|
|
|
from Site import SiteManager
|
|
|
|
SiteManager.site_manager.load()
|
2016-11-16 11:18:44 +01:00
|
|
|
|
2015-06-17 23:27:56 +02:00
|
|
|
logging.info("Rebuilding site sql cache: %s..." % address)
|
2016-08-10 12:44:17 +02:00
|
|
|
site = SiteManager.site_manager.get(address)
|
2015-06-17 23:27:56 +02:00
|
|
|
s = time.time()
|
|
|
|
site.storage.rebuildDb()
|
2015-07-12 20:36:46 +02:00
|
|
|
logging.info("Done in %.3fs" % (time.time() - s))
|
2015-06-17 23:27:56 +02:00
|
|
|
|
|
|
|
def dbQuery(self, address, query):
|
|
|
|
from Site import Site
|
2016-11-16 11:18:44 +01:00
|
|
|
from Site import SiteManager
|
|
|
|
SiteManager.site_manager.load()
|
|
|
|
|
2015-06-17 23:27:56 +02:00
|
|
|
import json
|
|
|
|
site = Site(address)
|
|
|
|
result = []
|
|
|
|
for row in site.storage.query(query):
|
|
|
|
result.append(dict(row))
|
2019-03-15 21:06:59 +01:00
|
|
|
print(json.dumps(result, indent=4))
|
2015-06-17 23:27:56 +02:00
|
|
|
|
|
|
|
def siteAnnounce(self, address):
|
|
|
|
from Site.Site import Site
|
2016-11-16 11:18:44 +01:00
|
|
|
from Site import SiteManager
|
|
|
|
SiteManager.site_manager.load()
|
|
|
|
|
2018-02-13 13:18:40 +01:00
|
|
|
logging.info("Opening a simple connection server")
|
|
|
|
global file_server
|
|
|
|
from File import FileServer
|
|
|
|
file_server = FileServer("127.0.0.1", 1234)
|
2018-06-01 02:43:53 +02:00
|
|
|
file_server.start()
|
2018-02-13 13:18:40 +01:00
|
|
|
|
2015-06-17 23:27:56 +02:00
|
|
|
logging.info("Announcing site %s to tracker..." % address)
|
|
|
|
site = Site(address)
|
|
|
|
|
|
|
|
s = time.time()
|
|
|
|
site.announce()
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Response time: %.3fs" % (time.time() - s))
|
|
|
|
print(site.peers)
|
2015-06-17 23:27:56 +02:00
|
|
|
|
2016-03-19 18:11:12 +01:00
|
|
|
def siteDownload(self, address):
|
|
|
|
from Site import Site
|
2016-11-16 11:18:44 +01:00
|
|
|
from Site import SiteManager
|
|
|
|
SiteManager.site_manager.load()
|
2016-03-19 18:11:12 +01:00
|
|
|
|
|
|
|
logging.info("Opening a simple connection server")
|
|
|
|
global file_server
|
2018-02-13 13:18:40 +01:00
|
|
|
from File import FileServer
|
|
|
|
file_server = FileServer("127.0.0.1", 1234)
|
2018-07-02 15:42:16 +02:00
|
|
|
file_server_thread = gevent.spawn(file_server.start, check_sites=False)
|
2016-03-19 18:11:12 +01:00
|
|
|
|
|
|
|
site = Site(address)
|
|
|
|
|
|
|
|
on_completed = gevent.event.AsyncResult()
|
|
|
|
|
|
|
|
def onComplete(evt):
|
|
|
|
evt.set(True)
|
|
|
|
|
|
|
|
site.onComplete.once(lambda: onComplete(on_completed))
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Announcing...")
|
2016-03-19 18:11:12 +01:00
|
|
|
site.announce()
|
|
|
|
|
|
|
|
s = time.time()
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Downloading...")
|
2016-03-19 18:11:12 +01:00
|
|
|
site.downloadContent("content.json", check_modifications=True)
|
|
|
|
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Downloaded in %.3fs" % (time.time()-s))
|
2016-03-19 18:11:12 +01:00
|
|
|
|
|
|
|
|
2015-06-17 23:27:56 +02:00
|
|
|
def siteNeedFile(self, address, inner_path):
|
|
|
|
from Site import Site
|
2016-11-16 11:18:44 +01:00
|
|
|
from Site import SiteManager
|
|
|
|
SiteManager.site_manager.load()
|
2016-03-19 18:11:12 +01:00
|
|
|
|
2016-01-19 20:42:00 +01:00
|
|
|
def checker():
|
|
|
|
while 1:
|
|
|
|
s = time.time()
|
|
|
|
time.sleep(1)
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Switch time:", time.time() - s)
|
2016-01-19 20:42:00 +01:00
|
|
|
gevent.spawn(checker)
|
|
|
|
|
|
|
|
logging.info("Opening a simple connection server")
|
|
|
|
global file_server
|
2018-02-13 13:18:40 +01:00
|
|
|
from File import FileServer
|
|
|
|
file_server = FileServer("127.0.0.1", 1234)
|
2018-07-02 15:42:16 +02:00
|
|
|
file_server_thread = gevent.spawn(file_server.start, check_sites=False)
|
2016-01-19 20:42:00 +01:00
|
|
|
|
2015-06-17 23:27:56 +02:00
|
|
|
site = Site(address)
|
|
|
|
site.announce()
|
2019-03-15 21:06:59 +01:00
|
|
|
print(site.needFile(inner_path, update=True))
|
2015-06-17 23:27:56 +02:00
|
|
|
|
2018-04-03 14:47:43 +02:00
|
|
|
def siteCmd(self, address, cmd, parameters):
|
|
|
|
import json
|
|
|
|
from Site import SiteManager
|
|
|
|
|
|
|
|
site = SiteManager.site_manager.get(address)
|
|
|
|
|
|
|
|
ws = self.getWebsocket(site)
|
|
|
|
ws.send(json.dumps({"cmd": cmd, "params": parameters, "id": 1}))
|
|
|
|
res = json.loads(ws.recv())
|
|
|
|
if "result" in res:
|
|
|
|
return res["result"]
|
|
|
|
else:
|
|
|
|
return res
|
|
|
|
|
|
|
|
def getWebsocket(self, site):
|
|
|
|
from lib import websocket
|
|
|
|
ws = websocket.create_connection("ws://%s:%s/Websocket?wrapper_key=%s" % (config.ui_ip, config.ui_port, site.settings["wrapper_key"]))
|
|
|
|
return ws
|
|
|
|
|
2018-04-03 14:49:40 +02:00
|
|
|
def sitePublish(self, address, peer_ip=None, peer_port=15441, inner_path="content.json"):
|
2015-06-17 23:27:56 +02:00
|
|
|
global file_server
|
2016-09-28 20:36:02 +02:00
|
|
|
from Site import Site
|
2016-11-16 11:18:44 +01:00
|
|
|
from Site import SiteManager
|
2015-07-12 20:36:46 +02:00
|
|
|
from File import FileServer # We need fileserver to handle incoming file requests
|
Rev571, Optional file sizes to sidebar, Download all optional files option in sidebar, Optional file number in peer stats, Delete removed or changed optional files, Auto download optional files if autodownloadoptional checked, SiteReload command, Peer use global file server if no site defined, Allow browser cache video files, Allow more keepalive connections, Gevent 1.1 ranged request bugfix, Dont sent optional files details on websocket, Remove files from workermanager tasks if no longer in bad_files, Notify local client about changes on external siteSign
2015-11-09 00:44:03 +01:00
|
|
|
from Peer import Peer
|
2018-06-21 21:56:20 +02:00
|
|
|
file_server = FileServer()
|
2018-04-03 14:49:40 +02:00
|
|
|
site = SiteManager.site_manager.get(address)
|
2015-12-12 16:39:22 +01:00
|
|
|
logging.info("Loading site...")
|
2015-07-12 20:36:46 +02:00
|
|
|
site.settings["serving"] = True # Serving the site even if its disabled
|
Rev571, Optional file sizes to sidebar, Download all optional files option in sidebar, Optional file number in peer stats, Delete removed or changed optional files, Auto download optional files if autodownloadoptional checked, SiteReload command, Peer use global file server if no site defined, Allow browser cache video files, Allow more keepalive connections, Gevent 1.1 ranged request bugfix, Dont sent optional files details on websocket, Remove files from workermanager tasks if no longer in bad_files, Notify local client about changes on external siteSign
2015-11-09 00:44:03 +01:00
|
|
|
|
2018-04-03 14:49:40 +02:00
|
|
|
try:
|
|
|
|
ws = self.getWebsocket(site)
|
|
|
|
logging.info("Sending siteReload")
|
|
|
|
self.siteCmd(address, "siteReload", inner_path)
|
|
|
|
|
|
|
|
logging.info("Sending sitePublish")
|
|
|
|
self.siteCmd(address, "sitePublish", {"inner_path": inner_path, "sign": False})
|
|
|
|
logging.info("Done.")
|
|
|
|
|
|
|
|
except Exception as err:
|
|
|
|
logging.info("Can't connect to local websocket client: %s" % err)
|
|
|
|
logging.info("Creating FileServer....")
|
|
|
|
file_server_thread = gevent.spawn(file_server.start, check_sites=False) # Dont check every site integrity
|
|
|
|
time.sleep(0.001)
|
2015-12-12 16:39:22 +01:00
|
|
|
|
|
|
|
# Started fileserver
|
2019-02-09 13:56:44 +01:00
|
|
|
file_server.portCheck()
|
2015-12-12 16:39:22 +01:00
|
|
|
if peer_ip: # Announce ip specificed
|
|
|
|
site.addPeer(peer_ip, peer_port)
|
|
|
|
else: # Just ask the tracker
|
|
|
|
logging.info("Gathering peers from tracker")
|
|
|
|
site.announce() # Gather peers
|
2018-04-03 14:49:40 +02:00
|
|
|
published = site.publish(5, inner_path) # Push to peers
|
2015-12-12 16:39:22 +01:00
|
|
|
if published > 0:
|
|
|
|
time.sleep(3)
|
|
|
|
logging.info("Serving files (max 60s)...")
|
|
|
|
gevent.joinall([file_server_thread], timeout=60)
|
|
|
|
logging.info("Done.")
|
|
|
|
else:
|
|
|
|
logging.info("No peers found, sitePublish command only works if you already have visitors serving your site")
|
|
|
|
|
2015-06-17 23:27:56 +02:00
|
|
|
# Crypto commands
|
|
|
|
def cryptPrivatekeyToAddress(self, privatekey=None):
|
|
|
|
from Crypt import CryptBitcoin
|
2015-07-12 20:36:46 +02:00
|
|
|
if not privatekey: # If no privatekey in args then ask it now
|
2015-06-17 23:27:56 +02:00
|
|
|
import getpass
|
|
|
|
privatekey = getpass.getpass("Private key (input hidden):")
|
|
|
|
|
2019-03-15 21:06:59 +01:00
|
|
|
print(CryptBitcoin.privatekeyToAddress(privatekey))
|
2015-06-17 23:27:56 +02:00
|
|
|
|
|
|
|
def cryptSign(self, message, privatekey):
|
|
|
|
from Crypt import CryptBitcoin
|
2019-03-15 21:06:59 +01:00
|
|
|
print(CryptBitcoin.sign(message, privatekey))
|
2015-06-17 23:27:56 +02:00
|
|
|
|
2017-10-28 02:39:49 +02:00
|
|
|
def cryptVerify(self, message, sign, address):
|
|
|
|
from Crypt import CryptBitcoin
|
2019-03-15 21:06:59 +01:00
|
|
|
print(CryptBitcoin.verify(message, address, sign))
|
2017-10-28 02:39:49 +02:00
|
|
|
|
2018-03-19 02:58:38 +01:00
|
|
|
def cryptGetPrivatekey(self, master_seed, site_address_index=None):
|
|
|
|
from Crypt import CryptBitcoin
|
2019-01-29 03:03:42 +01:00
|
|
|
if len(master_seed) != 64:
|
|
|
|
logging.error("Error: Invalid master seed length: %s (required: 64)" % len(master_seed))
|
|
|
|
return False
|
|
|
|
privatekey = CryptBitcoin.hdPrivatekey(master_seed, site_address_index)
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Requested private key: %s" % privatekey)
|
2018-03-19 02:58:38 +01:00
|
|
|
|
2015-06-17 23:27:56 +02:00
|
|
|
# Peer
|
|
|
|
def peerPing(self, peer_ip, peer_port=None):
|
|
|
|
if not peer_port:
|
2018-04-04 15:33:39 +02:00
|
|
|
peer_port = 15441
|
2015-06-17 23:27:56 +02:00
|
|
|
logging.info("Opening a simple connection server")
|
|
|
|
global file_server
|
|
|
|
from Connection import ConnectionServer
|
|
|
|
file_server = ConnectionServer("127.0.0.1", 1234)
|
2018-06-01 02:43:53 +02:00
|
|
|
file_server.start(check_connections=False)
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
from Crypt import CryptConnection
|
|
|
|
CryptConnection.manager.loadCerts()
|
2015-06-17 23:27:56 +02:00
|
|
|
|
|
|
|
from Peer import Peer
|
|
|
|
logging.info("Pinging 5 times peer: %s:%s..." % (peer_ip, int(peer_port)))
|
2018-04-04 15:34:07 +02:00
|
|
|
s = time.time()
|
2015-06-17 23:27:56 +02:00
|
|
|
peer = Peer(peer_ip, peer_port)
|
2018-04-04 15:34:07 +02:00
|
|
|
peer.connect()
|
|
|
|
|
|
|
|
if not peer.connection:
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Error: Can't connect to peer (connection error: %s)" % peer.connection_error)
|
2018-04-04 15:34:07 +02:00
|
|
|
return False
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Connection time: %.3fs (connection error: %s)" % (time.time() - s, peer.connection_error))
|
2018-04-04 15:34:07 +02:00
|
|
|
|
2015-06-17 23:27:56 +02:00
|
|
|
for i in range(5):
|
2019-03-27 03:09:28 +01:00
|
|
|
ping_delay = peer.ping()
|
|
|
|
if "cipher" in dir(peer.connection.sock):
|
|
|
|
cipher = peer.connection.sock.cipher()[0]
|
|
|
|
tls_version = peer.connection.sock.version()
|
|
|
|
else:
|
|
|
|
cipher = peer.connection.crypt
|
|
|
|
tls_version = ""
|
|
|
|
print("Response time: %.3fs (crypt: %s %s %s)" % (ping_delay, peer.connection.crypt, cipher, tls_version))
|
2015-06-17 23:27:56 +02:00
|
|
|
time.sleep(1)
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
peer.remove()
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Reconnect test...")
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
peer = Peer(peer_ip, peer_port)
|
|
|
|
for i in range(5):
|
2019-03-27 03:09:28 +01:00
|
|
|
ping_delay = peer.ping()
|
|
|
|
if "cipher" in dir(peer.connection.sock):
|
|
|
|
cipher = peer.connection.sock.cipher()[0]
|
|
|
|
tls_version = peer.connection.sock.version()
|
|
|
|
else:
|
|
|
|
cipher = peer.connection.crypt
|
|
|
|
tls_version = ""
|
|
|
|
print("Response time: %.3fs (crypt: %s %s %s)" % (ping_delay, peer.connection.crypt, cipher, tls_version))
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
time.sleep(1)
|
2015-06-17 23:27:56 +02:00
|
|
|
|
2015-07-25 13:38:58 +02:00
|
|
|
def peerGetFile(self, peer_ip, peer_port, site, filename, benchmark=False):
|
2015-06-17 23:27:56 +02:00
|
|
|
logging.info("Opening a simple connection server")
|
|
|
|
global file_server
|
|
|
|
from Connection import ConnectionServer
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
file_server = ConnectionServer("127.0.0.1", 1234)
|
2018-06-01 02:43:53 +02:00
|
|
|
file_server.start(check_connections=False)
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
from Crypt import CryptConnection
|
|
|
|
CryptConnection.manager.loadCerts()
|
2015-06-17 23:27:56 +02:00
|
|
|
|
|
|
|
from Peer import Peer
|
|
|
|
logging.info("Getting %s/%s from peer: %s:%s..." % (site, filename, peer_ip, peer_port))
|
|
|
|
peer = Peer(peer_ip, peer_port)
|
|
|
|
s = time.time()
|
2015-07-25 13:38:58 +02:00
|
|
|
if benchmark:
|
|
|
|
for i in range(10):
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
peer.getFile(site, filename),
|
2019-03-15 21:06:59 +01:00
|
|
|
print("Response time: %.3fs" % (time.time() - s))
|
|
|
|
input("Check memory")
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
else:
|
2019-03-15 21:06:59 +01:00
|
|
|
print(peer.getFile(site, filename).read())
|
2015-07-25 13:38:58 +02:00
|
|
|
|
2015-06-17 23:27:56 +02:00
|
|
|
def peerCmd(self, peer_ip, peer_port, cmd, parameters):
|
|
|
|
logging.info("Opening a simple connection server")
|
|
|
|
global file_server
|
|
|
|
from Connection import ConnectionServer
|
|
|
|
file_server = ConnectionServer()
|
2018-06-01 02:43:53 +02:00
|
|
|
file_server.start(check_connections=False)
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
from Crypt import CryptConnection
|
|
|
|
CryptConnection.manager.loadCerts()
|
|
|
|
|
2015-06-17 23:27:56 +02:00
|
|
|
from Peer import Peer
|
|
|
|
peer = Peer(peer_ip, peer_port)
|
|
|
|
|
|
|
|
import json
|
|
|
|
if parameters:
|
|
|
|
parameters = json.loads(parameters.replace("'", '"'))
|
|
|
|
else:
|
|
|
|
parameters = {}
|
2017-06-20 20:29:11 +02:00
|
|
|
try:
|
|
|
|
res = peer.request(cmd, parameters)
|
2019-03-15 21:06:59 +01:00
|
|
|
print(json.dumps(res, indent=2, ensure_ascii=False))
|
|
|
|
except Exception as err:
|
|
|
|
print("Unknown response (%s): %s" % (err, res))
|
rev125, Class statistics, OpenSSL disabled on OSX by default because of possible segfault, --disable_openssl command line parameter, Save memory on Connection, Peer and FileRequest objects using slots, Dont store modification time from the far future, Able to query modified files from peer, Allow reannounce in 30secs, Use with command in SiteStorage, Always create dir before write file, PeerCmd shell command to query specific command from peer
2015-04-29 23:12:45 +02:00
|
|
|
|
2017-09-25 18:09:59 +02:00
|
|
|
def getConfig(self):
|
|
|
|
import json
|
2019-03-15 21:06:59 +01:00
|
|
|
print(json.dumps(config.getServerInfo(), indent=2, ensure_ascii=False))
|
|
|
|
|
2017-09-25 18:09:59 +02:00
|
|
|
|
rev125, Class statistics, OpenSSL disabled on OSX by default because of possible segfault, --disable_openssl command line parameter, Save memory on Connection, Peer and FileRequest objects using slots, Dont store modification time from the far future, Able to query modified files from peer, Allow reannounce in 30secs, Use with command in SiteStorage, Always create dir before write file, PeerCmd shell command to query specific command from peer
2015-04-29 23:12:45 +02:00
|
|
|
|
2015-04-15 02:54:10 +02:00
|
|
|
actions = Actions()
|
|
|
|
# Starts here when running zeronet.py
|
2015-07-12 20:36:46 +02:00
|
|
|
|
|
|
|
|
2015-04-15 02:54:10 +02:00
|
|
|
def start():
|
2015-06-17 23:27:56 +02:00
|
|
|
# Call function
|
|
|
|
action_kwargs = config.getActionArguments()
|
2015-07-17 00:28:43 +02:00
|
|
|
actions.call(config.action, action_kwargs)
|