work on WelcomeHandler, still incomplete
This commit is contained in:
parent
4c6cb1dddc
commit
105d9cc59f
|
@ -27,6 +27,7 @@ class Boss(object):
|
||||||
_side = attrib(validator=instance_of(type(u"")))
|
_side = attrib(validator=instance_of(type(u"")))
|
||||||
_url = attrib(validator=instance_of(type(u"")))
|
_url = attrib(validator=instance_of(type(u"")))
|
||||||
_appid = attrib(validator=instance_of(type(u"")))
|
_appid = attrib(validator=instance_of(type(u"")))
|
||||||
|
_welcome_handler = attrib() # TODO: validator: callable
|
||||||
_reactor = attrib()
|
_reactor = attrib()
|
||||||
_journal = attrib(validator=provides(_interfaces.IJournal))
|
_journal = attrib(validator=provides(_interfaces.IJournal))
|
||||||
_timing = attrib(validator=provides(_interfaces.ITiming))
|
_timing = attrib(validator=provides(_interfaces.ITiming))
|
||||||
|
@ -169,7 +170,7 @@ class Boss(object):
|
||||||
|
|
||||||
@m.output()
|
@m.output()
|
||||||
def process_welcome(self, welcome):
|
def process_welcome(self, welcome):
|
||||||
pass # TODO: ignored for now
|
self._welcome_handler(welcome)
|
||||||
|
|
||||||
@m.output()
|
@m.output()
|
||||||
def do_got_code(self, code):
|
def do_got_code(self, code):
|
||||||
|
|
|
@ -10,14 +10,14 @@ from .timing import DebugTiming
|
||||||
from .journal import ImmediateJournal
|
from .journal import ImmediateJournal
|
||||||
from ._boss import Boss
|
from ._boss import Boss
|
||||||
from ._key import derive_key
|
from ._key import derive_key
|
||||||
from .errors import NoKeyError
|
from .errors import WelcomeError, NoKeyError
|
||||||
from .util import to_bytes
|
from .util import to_bytes
|
||||||
|
|
||||||
# We can provide different APIs to different apps:
|
# We can provide different APIs to different apps:
|
||||||
# * Deferreds
|
# * Deferreds
|
||||||
# w.when_got_code().addCallback(print_code)
|
# w.when_code().addCallback(print_code)
|
||||||
# w.send(data)
|
# w.send(data)
|
||||||
# w.receive().addCallback(got_data)
|
# w.when_received().addCallback(got_data)
|
||||||
# w.close().addCallback(closed)
|
# w.close().addCallback(closed)
|
||||||
|
|
||||||
# * delegate callbacks (better for journaled environments)
|
# * delegate callbacks (better for journaled environments)
|
||||||
|
@ -38,6 +38,36 @@ def _log(client_name, machine_name, old_state, input, new_state):
|
||||||
print("%s.%s[%s].%s -> [%s]" % (client_name, machine_name,
|
print("%s.%s[%s].%s -> [%s]" % (client_name, machine_name,
|
||||||
old_state, input, new_state))
|
old_state, input, new_state))
|
||||||
|
|
||||||
|
class _WelcomeHandler:
|
||||||
|
def __init__(self, url, current_version, signal_error):
|
||||||
|
self._ws_url = url
|
||||||
|
self._version_warning_displayed = False
|
||||||
|
self._current_version = current_version
|
||||||
|
self._signal_error = signal_error
|
||||||
|
|
||||||
|
def handle_welcome(self, welcome):
|
||||||
|
if "motd" in welcome:
|
||||||
|
motd_lines = welcome["motd"].splitlines()
|
||||||
|
motd_formatted = "\n ".join(motd_lines)
|
||||||
|
print("Server (at %s) says:\n %s" %
|
||||||
|
(self._ws_url, motd_formatted), file=sys.stderr)
|
||||||
|
|
||||||
|
# Only warn if we're running a release version (e.g. 0.0.6, not
|
||||||
|
# 0.0.6-DISTANCE-gHASH). Only warn once.
|
||||||
|
if ("current_cli_version" in welcome
|
||||||
|
and "-" not in self._current_version
|
||||||
|
and not self._version_warning_displayed
|
||||||
|
and welcome["current_cli_version"] != self._current_version):
|
||||||
|
print("Warning: errors may occur unless both sides are running the same version", file=sys.stderr)
|
||||||
|
print("Server claims %s is current, but ours is %s"
|
||||||
|
% (welcome["current_cli_version"], self._current_version),
|
||||||
|
file=sys.stderr)
|
||||||
|
self._version_warning_displayed = True
|
||||||
|
|
||||||
|
if "error" in welcome:
|
||||||
|
return self._signal_error(WelcomeError(welcome["error"]),
|
||||||
|
"unwelcome")
|
||||||
|
|
||||||
@attrs
|
@attrs
|
||||||
@implementer(IWormhole)
|
@implementer(IWormhole)
|
||||||
class _DelegatedWormhole(object):
|
class _DelegatedWormhole(object):
|
||||||
|
@ -88,6 +118,8 @@ class _DelegatedWormhole(object):
|
||||||
# from below
|
# from below
|
||||||
def got_code(self, code):
|
def got_code(self, code):
|
||||||
self._delegate.wormhole_got_code(code)
|
self._delegate.wormhole_got_code(code)
|
||||||
|
def got_welcome(self, welcome):
|
||||||
|
pass # TODO
|
||||||
def got_key(self, key):
|
def got_key(self, key):
|
||||||
self._key = key # for derive_key()
|
self._key = key # for derive_key()
|
||||||
def got_verifier(self, verifier):
|
def got_verifier(self, verifier):
|
||||||
|
@ -189,6 +221,8 @@ class _DeferredWormhole(object):
|
||||||
for d in self._code_observers:
|
for d in self._code_observers:
|
||||||
d.callback(code)
|
d.callback(code)
|
||||||
self._code_observers[:] = []
|
self._code_observers[:] = []
|
||||||
|
def got_welcome(self, welcome):
|
||||||
|
pass # TODO
|
||||||
def got_key(self, key):
|
def got_key(self, key):
|
||||||
self._key = key # for derive_key()
|
self._key = key # for derive_key()
|
||||||
def got_verifier(self, verifier):
|
def got_verifier(self, verifier):
|
||||||
|
@ -226,16 +260,23 @@ class _DeferredWormhole(object):
|
||||||
for d in self._closed_observers:
|
for d in self._closed_observers:
|
||||||
d.callback(close_result)
|
d.callback(close_result)
|
||||||
|
|
||||||
|
|
||||||
def create(appid, relay_url, reactor, delegate=None, journal=None,
|
def create(appid, relay_url, reactor, delegate=None, journal=None,
|
||||||
tor_manager=None, timing=None, stderr=sys.stderr):
|
tor_manager=None, timing=None, welcome_handler=None,
|
||||||
|
stderr=sys.stderr):
|
||||||
timing = timing or DebugTiming()
|
timing = timing or DebugTiming()
|
||||||
side = bytes_to_hexstr(os.urandom(5))
|
side = bytes_to_hexstr(os.urandom(5))
|
||||||
journal = journal or ImmediateJournal()
|
journal = journal or ImmediateJournal()
|
||||||
|
if not welcome_handler:
|
||||||
|
from . import __version__
|
||||||
|
signal_error = NotImplemented # TODO
|
||||||
|
wh = _WelcomeHandler(relay_url, __version__, signal_error)
|
||||||
|
welcome_handler = wh.handle_welcome
|
||||||
if delegate:
|
if delegate:
|
||||||
w = _DelegatedWormhole(delegate)
|
w = _DelegatedWormhole(delegate)
|
||||||
else:
|
else:
|
||||||
w = _DeferredWormhole()
|
w = _DeferredWormhole()
|
||||||
b = Boss(w, side, relay_url, appid, reactor, journal, timing)
|
b = Boss(w, side, relay_url, appid, welcome_handler, reactor, journal, timing)
|
||||||
w._set_boss(b)
|
w._set_boss(b)
|
||||||
b.start()
|
b.start()
|
||||||
return w
|
return w
|
||||||
|
|
Loading…
Reference in New Issue
Block a user