wormhole/invitation code is now unicode
This commit is contained in:
parent
7f6410812c
commit
35768d6738
11
docs/api.md
11
docs/api.md
|
@ -157,8 +157,8 @@ include randomly-selected words or characters. Dice, coin flips, shuffled
|
|||
cards, or repeated sampling of a high-resolution stopwatch are all useful
|
||||
techniques.
|
||||
|
||||
Note that the code is a human-readable string (the python "str" type: so
|
||||
unicode in python3, plain bytes in python2).
|
||||
Note that the code is a human-readable string (the python "unicode" type in
|
||||
python2, "str" in python3).
|
||||
|
||||
## Application Identifier
|
||||
|
||||
|
@ -248,13 +248,10 @@ python2, "bytes" in python3):
|
|||
* data in/out
|
||||
* transit records in/out
|
||||
|
||||
Some human-readable parameters are passed as strings: "str" in python2, "str"
|
||||
(i.e. unicode) in python3:
|
||||
Other (human-facing) values are always unicode ("unicode" in python2, "str"
|
||||
in python3):
|
||||
|
||||
* wormhole code
|
||||
|
||||
And some are always unicode, in both python2 and python3:
|
||||
|
||||
* relay URL
|
||||
* transit URLs
|
||||
* transit connection hints (e.g. "host:port")
|
||||
|
|
|
@ -186,7 +186,7 @@ class Wormhole:
|
|||
if self.code is not None: raise UsageError
|
||||
channelid = self._channel_manager.allocate()
|
||||
code = codes.make_code(channelid, code_length)
|
||||
assert isinstance(code, str), type(code)
|
||||
assert isinstance(code, type(u"")), type(code)
|
||||
self._set_code_and_channelid(code)
|
||||
self._start()
|
||||
return code
|
||||
|
@ -198,7 +198,7 @@ class Wormhole:
|
|||
return code
|
||||
|
||||
def set_code(self, code): # used for human-made pre-generated codes
|
||||
if not isinstance(code, str): raise UsageError
|
||||
if not isinstance(code, type(u"")): raise UsageError
|
||||
if self.code is not None: raise UsageError
|
||||
self._set_code_and_channelid(code)
|
||||
self._start()
|
||||
|
@ -215,7 +215,7 @@ class Wormhole:
|
|||
|
||||
def _start(self):
|
||||
# allocate the rest now too, so it can be serialized
|
||||
self.sp = SPAKE2_Symmetric(self.code.encode("ascii"),
|
||||
self.sp = SPAKE2_Symmetric(to_bytes(self.code),
|
||||
idSymmetric=to_bytes(self._appid))
|
||||
self.msg1 = self.sp.start()
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ def make_code(channel_id, code_length):
|
|||
words.append(byte_to_odd_word[os.urandom(1)].lower())
|
||||
else:
|
||||
words.append(byte_to_even_word[os.urandom(1)].lower())
|
||||
return str(channel_id) + "-" + "-".join(words)
|
||||
return u"%d-%s" % (channel_id, u"-".join(words))
|
||||
|
||||
def extract_channel_id(code):
|
||||
channel_id = int(code.split("-")[0])
|
||||
|
@ -82,7 +82,7 @@ def input_code_with_completion(prompt, get_channel_ids, code_length):
|
|||
readline.set_completer(c.wrap_completer)
|
||||
readline.set_completer_delims("")
|
||||
code = six.moves.input(prompt)
|
||||
return code
|
||||
return code.decode("utf-8")
|
||||
|
||||
if __name__ == "__main__":
|
||||
code = input_code_with_completion("Enter wormhole code: ", lambda: [], 2)
|
||||
|
|
|
@ -15,7 +15,7 @@ def receive(args):
|
|||
w = Wormhole(APPID, args.relay_url)
|
||||
if args.zeromode:
|
||||
assert not args.code
|
||||
args.code = "0-"
|
||||
args.code = u"0-"
|
||||
code = args.code
|
||||
if not code:
|
||||
code = w.input_code("Enter receive wormhole code: ", args.code_length)
|
||||
|
|
|
@ -46,7 +46,7 @@ def send(args):
|
|||
w = Wormhole(APPID, args.relay_url)
|
||||
if args.zeromode:
|
||||
assert not args.code
|
||||
args.code = "0-"
|
||||
args.code = u"0-"
|
||||
if args.code:
|
||||
w.set_code(args.code)
|
||||
code = args.code
|
||||
|
|
|
@ -69,7 +69,8 @@ p = subparsers.add_parser("send",
|
|||
usage="wormhole send [FILENAME]")
|
||||
p.add_argument("--text", metavar="MESSAGE",
|
||||
help="text message to send, instead of a file")
|
||||
p.add_argument("--code", metavar="CODE", help="human-generated code phrase")
|
||||
p.add_argument("--code", metavar="CODE", help="human-generated code phrase",
|
||||
type=type(u""))
|
||||
p.add_argument("-0", dest="zeromode", action="store_true",
|
||||
help="enable no-code anything-goes mode")
|
||||
p.add_argument("what", nargs="?", default=None, metavar="[FILENAME]",
|
||||
|
@ -95,6 +96,7 @@ p.add_argument("code", nargs="?", default=None, metavar="[CODE]",
|
|||
help=dedent("""\
|
||||
The magic-wormhole code, from the sender. If omitted, the
|
||||
program will ask for it, using tab-completion."""),
|
||||
type=type(u""),
|
||||
)
|
||||
p.set_defaults(func=cmd_receive.receive)
|
||||
|
||||
|
|
|
@ -140,8 +140,8 @@ class Blocking(ServerBase, unittest.TestCase):
|
|||
def test_fixed_code(self):
|
||||
w1 = BlockingWormhole(APPID, self.relayurl)
|
||||
w2 = BlockingWormhole(APPID, self.relayurl)
|
||||
w1.set_code("123-purple-elephant")
|
||||
w2.set_code("123-purple-elephant")
|
||||
w1.set_code(u"123-purple-elephant")
|
||||
w2.set_code(u"123-purple-elephant")
|
||||
d = self.doBoth([w1.send_data, b"data1"], [w2.send_data, b"data2"])
|
||||
def _sent(res):
|
||||
return self.doBoth([w1.get_data], [w2.get_data])
|
||||
|
@ -201,7 +201,7 @@ class Blocking(ServerBase, unittest.TestCase):
|
|||
self.assertRaises(UsageError, w1.get_verifier)
|
||||
self.assertRaises(UsageError, w1.get_data)
|
||||
self.assertRaises(UsageError, w1.send_data, b"data")
|
||||
w1.set_code("123-purple-elephant")
|
||||
w1.set_code(u"123-purple-elephant")
|
||||
self.assertRaises(UsageError, w1.set_code, "123-nope")
|
||||
self.assertRaises(UsageError, w1.get_code)
|
||||
w2 = BlockingWormhole(APPID, self.relayurl)
|
||||
|
|
|
@ -82,7 +82,7 @@ class Scripts(ServerBase, ScriptsBase, unittest.TestCase):
|
|||
def test_send_text_pre_generated_code(self):
|
||||
wormhole = self.find_executable()
|
||||
server_args = ["--relay-url", self.relayurl]
|
||||
code = "1-abc"
|
||||
code = u"1-abc"
|
||||
message = "test message"
|
||||
send_args = server_args + [
|
||||
"send",
|
||||
|
@ -120,7 +120,7 @@ class Scripts(ServerBase, ScriptsBase, unittest.TestCase):
|
|||
|
||||
def test_send_file_pre_generated_code(self):
|
||||
self.maxDiff=None
|
||||
code = "1-abc"
|
||||
code = u"1-abc"
|
||||
filename = "testfile"
|
||||
message = "test message"
|
||||
|
||||
|
|
|
@ -128,8 +128,8 @@ class Basic(ServerBase, unittest.TestCase):
|
|||
def test_fixed_code(self):
|
||||
w1 = Wormhole(APPID, self.relayurl)
|
||||
w2 = Wormhole(APPID, self.relayurl)
|
||||
w1.set_code("123-purple-elephant")
|
||||
w2.set_code("123-purple-elephant")
|
||||
w1.set_code(u"123-purple-elephant")
|
||||
w2.set_code(u"123-purple-elephant")
|
||||
d = self.doBoth(w1.send_data(b"data1"), w2.send_data(b"data2"))
|
||||
def _sent(res):
|
||||
return self.doBoth(w1.get_data(), w2.get_data())
|
||||
|
@ -188,7 +188,7 @@ class Basic(ServerBase, unittest.TestCase):
|
|||
self.assertRaises(UsageError, w1.get_verifier)
|
||||
self.assertRaises(UsageError, w1.send_data, b"data")
|
||||
self.assertRaises(UsageError, w1.get_data)
|
||||
w1.set_code("123-purple-elephant")
|
||||
w1.set_code(u"123-purple-elephant")
|
||||
self.assertRaises(UsageError, w1.set_code, "123-nope")
|
||||
self.assertRaises(UsageError, w1.get_code)
|
||||
w2 = Wormhole(APPID, self.relayurl)
|
||||
|
|
|
@ -223,7 +223,7 @@ class Wormhole:
|
|||
d = self._channel_manager.allocate()
|
||||
def _got_channelid(channelid):
|
||||
code = codes.make_code(channelid, code_length)
|
||||
assert isinstance(code, str), type(code)
|
||||
assert isinstance(code, type(u"")), type(code)
|
||||
self._set_code_and_channelid(code)
|
||||
self._start()
|
||||
return code
|
||||
|
@ -231,7 +231,7 @@ class Wormhole:
|
|||
return d
|
||||
|
||||
def set_code(self, code):
|
||||
if not isinstance(code, str): raise UsageError
|
||||
if not isinstance(code, type(u"")): raise UsageError
|
||||
if self.code is not None: raise UsageError
|
||||
self._set_code_and_channelid(code)
|
||||
self._start()
|
||||
|
@ -248,7 +248,7 @@ class Wormhole:
|
|||
|
||||
def _start(self):
|
||||
# allocate the rest now too, so it can be serialized
|
||||
self.sp = SPAKE2_Symmetric(self.code.encode("ascii"),
|
||||
self.sp = SPAKE2_Symmetric(to_bytes(self.code),
|
||||
idSymmetric=to_bytes(self._appid))
|
||||
self.msg1 = self.sp.start()
|
||||
|
||||
|
@ -274,7 +274,7 @@ class Wormhole:
|
|||
d = json.loads(data)
|
||||
self = klass(d["appid"], d["relay_url"])
|
||||
self._set_side(d["side"].encode("ascii"))
|
||||
self._set_code_and_channelid(d["code"].encode("ascii"))
|
||||
self._set_code_and_channelid(d["code"])
|
||||
self.sp = SPAKE2_Symmetric.from_serialized(json.dumps(d["spake2"]))
|
||||
self.msg1 = d["msg1"].decode("hex")
|
||||
return self
|
||||
|
|
Loading…
Reference in New Issue
Block a user