2015-03-02 08:32:21 +00:00
|
|
|
from __future__ import print_function
|
|
|
|
|
|
|
|
APPID = "lothar.com/wormhole/file-xfer"
|
|
|
|
|
2015-03-22 23:52:35 +00:00
|
|
|
def receive_file(args):
|
2015-03-02 08:32:21 +00:00
|
|
|
# we're receiving
|
2015-04-01 23:01:32 +00:00
|
|
|
import sys, os, json, binascii
|
|
|
|
from wormhole.blocking.transcribe import Receiver, WrongPasswordError
|
|
|
|
from wormhole.blocking.transit import TransitReceiver, TransitError
|
|
|
|
from .progress import start_progress, update_progress, finish_progress
|
|
|
|
|
2015-03-25 20:07:17 +00:00
|
|
|
transit_receiver = TransitReceiver(args.transit_helper)
|
2015-03-02 08:32:21 +00:00
|
|
|
|
2015-03-24 07:03:10 +00:00
|
|
|
r = Receiver(APPID, args.relay_url)
|
2015-03-22 23:52:35 +00:00
|
|
|
code = args.code
|
2015-03-16 06:26:06 +00:00
|
|
|
if not code:
|
2015-03-24 06:53:28 +00:00
|
|
|
code = r.input_code("Enter receive-file wormhole code: ",
|
|
|
|
args.code_length)
|
2015-03-16 06:26:06 +00:00
|
|
|
r.set_code(code)
|
2015-03-02 08:32:21 +00:00
|
|
|
|
2015-03-24 07:28:02 +00:00
|
|
|
if args.verify:
|
|
|
|
verifier = binascii.hexlify(r.get_verifier())
|
|
|
|
print("Verifier %s." % verifier)
|
|
|
|
|
2015-03-24 07:03:10 +00:00
|
|
|
mydata = json.dumps({
|
|
|
|
"transit": {
|
|
|
|
"direct_connection_hints": transit_receiver.get_direct_hints(),
|
|
|
|
"relay_connection_hints": transit_receiver.get_relay_hints(),
|
|
|
|
},
|
|
|
|
}).encode("utf-8")
|
2015-03-02 08:32:21 +00:00
|
|
|
try:
|
2015-03-24 07:03:10 +00:00
|
|
|
data = json.loads(r.get_data(mydata).decode("utf-8"))
|
2015-03-02 08:32:21 +00:00
|
|
|
except WrongPasswordError as e:
|
|
|
|
print("ERROR: " + e.explain(), file=sys.stderr)
|
|
|
|
return 1
|
|
|
|
#print("their data: %r" % (data,))
|
|
|
|
|
2015-03-24 07:28:02 +00:00
|
|
|
if "error" in data:
|
|
|
|
print("ERROR: " + data["error"], file=sys.stderr)
|
|
|
|
return 1
|
|
|
|
|
2015-03-02 08:32:21 +00:00
|
|
|
file_data = data["file"]
|
|
|
|
filename = os.path.basename(file_data["filename"]) # unicode
|
|
|
|
filesize = file_data["filesize"]
|
|
|
|
|
|
|
|
# now receive the rest of the owl
|
|
|
|
tdata = data["transit"]
|
|
|
|
transit_key = r.derive_key(APPID+"/transit-key")
|
|
|
|
transit_receiver.set_transit_key(transit_key)
|
|
|
|
transit_receiver.add_their_direct_hints(tdata["direct_connection_hints"])
|
|
|
|
transit_receiver.add_their_relay_hints(tdata["relay_connection_hints"])
|
2015-03-13 01:14:42 +00:00
|
|
|
record_pipe = transit_receiver.connect()
|
2015-03-02 20:45:55 +00:00
|
|
|
|
2015-03-12 21:50:40 +00:00
|
|
|
print("Receiving %d bytes for '%s' (%s).." % (filesize, filename,
|
|
|
|
transit_receiver.describe()))
|
2015-03-02 20:45:55 +00:00
|
|
|
|
2015-03-22 23:52:35 +00:00
|
|
|
target = args.output_file
|
2015-03-16 07:18:53 +00:00
|
|
|
if not target:
|
|
|
|
# allow the sender to specify the filename, but only write to the
|
|
|
|
# current directory, and never overwrite anything
|
|
|
|
here = os.path.abspath(os.getcwd())
|
|
|
|
target = os.path.abspath(os.path.join(here, filename))
|
|
|
|
if os.path.dirname(target) != here:
|
|
|
|
print("Error: suggested filename (%s) would be outside current directory"
|
|
|
|
% (filename,))
|
|
|
|
record_pipe.send_record("bad filename\n")
|
|
|
|
record_pipe.close()
|
|
|
|
return 1
|
2015-03-25 23:31:35 +00:00
|
|
|
if os.path.exists(target) and not args.overwrite:
|
2015-03-02 08:32:21 +00:00
|
|
|
print("Error: refusing to overwrite existing file %s" % (filename,))
|
2015-03-13 01:14:42 +00:00
|
|
|
record_pipe.send_record("file already exists\n")
|
|
|
|
record_pipe.close()
|
2015-03-02 08:32:21 +00:00
|
|
|
return 1
|
2015-03-13 01:14:42 +00:00
|
|
|
tmp = target + ".tmp"
|
|
|
|
|
|
|
|
with open(tmp, "wb") as f:
|
|
|
|
received = 0
|
|
|
|
next_update = start_progress(filesize)
|
|
|
|
while received < filesize:
|
|
|
|
try:
|
|
|
|
plaintext = record_pipe.receive_record()
|
|
|
|
except TransitError:
|
|
|
|
print()
|
|
|
|
print("Connection dropped before full file received")
|
|
|
|
print("got %d bytes, wanted %d" % (received, filesize))
|
|
|
|
return 1
|
|
|
|
f.write(plaintext)
|
|
|
|
received += len(plaintext)
|
|
|
|
next_update = update_progress(next_update, received, filesize)
|
|
|
|
finish_progress(filesize)
|
|
|
|
assert received == filesize
|
|
|
|
|
|
|
|
os.rename(tmp, target)
|
|
|
|
|
2015-03-16 07:18:53 +00:00
|
|
|
print("Received file written to %s" % target)
|
2015-03-13 01:14:42 +00:00
|
|
|
record_pipe.send_record("ok\n")
|
|
|
|
record_pipe.close()
|
2015-03-02 08:32:21 +00:00
|
|
|
return 0
|