Brian Warner
ccea1a7d3c
py3: don't emit noisy b"" prefix for --verify
2015-09-28 16:59:15 -07:00
Brian Warner
429c5cd962
tests: clean up pairs-of-Deferreds patterns
2015-09-28 16:52:12 -07:00
Brian Warner
8d3ed79ce6
add verifier tests
2015-09-28 16:49:36 -07:00
Brian Warner
5ae1c2d020
tests: switch to defer.gatherResults
2015-09-28 16:44:00 -07:00
Brian Warner
336eea5e78
tests: handle argparse on py3.3
...
which sends --version to stderr, not stdout. This might make the py3.3
tests pass.
2015-09-28 16:31:35 -07:00
Brian Warner
b088747ae3
rename to ServerEndpointService, for consistency with Twisted
2015-09-28 16:23:00 -07:00
Brian Warner
540fceb795
add py3.4 compatibility
...
The "bytes % bytes" syntax only appeared on py3.5, so don't use it.
Updated travis to expect py3.4 works.
The twisted side is probably even more broken for py3.4 than it is for
py3.5.
2015-09-28 16:15:55 -07:00
Brian Warner
1522658c9b
skip test_twisted on py3 until more of Twisted has been ported
2015-09-28 00:45:33 -07:00
Brian Warner
2d7f701849
eventsource_twisted: return unicode, not bytes
...
This roughly parallels the way that blocking/eventsource.py and the pypi
"requests" modules work: the server can set the encoding (with
"Content-Type: text/event-stream; charset=utf-8"), and the EventSource
parser will decode accordingly. However eventsource_twisted.py *always*
returns unicode (on both py2/py3), even when the server hasn't set an
encoding. blocking/eventsource.py returns bytes (on py3, and str on py2)
when the server doesn't set an encoding.
In the future, eventsource_twisted.py should return bytes when the
server doesn't set an encoding.
eventsource_twisted.py includes an alternate approach that might be
necessary (a to_unicode() function instead of always using .decode), but
I won't be sure until enough of Twisted has been ported to allow the
EventSourceParser to be tested.
Also fix demo.py for python3.
2015-09-28 00:44:32 -07:00
Brian Warner
b5d470fcda
make blocking/send-file work on py3
...
* declare transit records and handshake keys are bytes, not str
* declare transit connection hints to be str
* use six.moves.socketserver, six.moves.input for Verifier query
* argparse "--version" writes to stderr on py2, stdout on py3
* avoid xrange(), use subprocess.Popen(universal_newlines=True)
2015-09-28 00:24:36 -07:00
Brian Warner
8fe41e135d
make blocking/send-text work on py3, add dependency on 'six'
...
* use modern/portable "next(iter)" instead of "iter.next()"
* use six.moves.input() instead of raw_input()
* tell requests' Response.iter_lines that we want str, not bytes
2015-09-28 00:24:36 -07:00
Brian Warner
a7213d9c9a
enforce bytes-vs-str in the API
...
The main wormhole code is str (unicode in py3, bytes in py2). Most
everything else must be passed as bytes in both py2/py3.
Keep the internal "side" string as a str, to make it easier to merge
with other URL pieces.
2015-09-28 00:24:36 -07:00
Brian Warner
6614783c43
make relay work under py3
...
Current twisted.web wants bytes in most places (this will probably
change when twisted.web is properly ported to py3).
2015-09-28 00:24:00 -07:00
Brian Warner
15cc0a1429
test_server: make sure the server is reachable
...
used to exercise py3 issues with the server
2015-09-28 00:24:00 -07:00
Brian Warner
5d93dccb88
appid and derive_key(purpose=) must be bytes, not unicode
2015-09-28 00:24:00 -07:00
Brian Warner
e8626fcea2
relay: deliver EventSource as utf-8
...
This allows the client (requests.py) to produce unicode fields and
lines, instead of binary, which is necessary for py3 compatibility.
2015-09-27 14:35:10 -07:00
Brian Warner
2b37c62150
server: add -n/--no-daemon, to run on py3
...
The twisted.python.logfile in Twisted-15.4.0 is not yet compatible with
py3, but can be bypassed by not daemonizing the server (so it doesn't
write to a logfile). This has been fixed in twisted trunk, so when
15.4.1 or 15.5.0 comes out, this will no longer be needed. But I think
we'll leave it in place, since sometimes it's handy to run a server
without daemonization.
2015-09-27 14:24:03 -07:00
Brian Warner
e9d87828c2
scripts/runner: make py3-compatible
2015-09-27 13:54:20 -07:00
Brian Warner
2e2bd1bb5f
tests: split blocking out to its own file
...
also clean up the output when pip-e -vs- entrypoint -vs- Versioneer
makes the entrypoint script refuse to run from a version mismatch.
2015-09-27 10:43:25 -07:00
Brian Warner
adf55175fb
test_scripts: wormhole should live next to python
...
not necessarily beneath the current working directory
2015-09-26 18:29:46 -07:00
Brian Warner
d3ef3aa29a
more verbose, to figure out travis failure
2015-09-26 18:21:56 -07:00
Brian Warner
5ee37cab64
test_scripts: make found-wrong-wormhole error more verbose
2015-09-26 18:17:50 -07:00
Brian Warner
be124e686a
relay: avoid using Twisted strports
...
strports aren't ported to py3 yet, so we stick with Endpoints and
Services, which have been.
2015-09-26 18:15:35 -07:00
Brian Warner
b069e69d35
test scripts too (with spawnToThread)
2015-09-26 18:02:02 -07:00
Brian Warner
1e6fc4601e
tests: split common code out
2015-09-26 18:02:02 -07:00
Brian Warner
bdb8b395b5
database: make py3-compatible
2015-09-26 17:51:21 -07:00
Brian Warner
cbc40697f7
use "except x as y:" everywhere, for py3
2015-09-26 17:47:13 -07:00
Brian Warner
4c4b5d081b
RelayServer: use in-memory DB for tests
...
This avoids problems where a leftover DB from one run causes "wrong
code" errors in the next.
2015-09-26 17:44:20 -07:00
Brian Warner
797074d03e
runner.py: cosmetic changes
2015-09-23 18:13:35 -07:00
Brian Warner
532aa0811c
update idSymmetric= to match SPAKE2-0.3
2015-09-22 01:07:46 -07:00
Brian Warner
88dab265de
test blocking code, using twisted+deferToThread
...
Unfortunately Twisted still requires python2, so we can't use this to
test the intended python3-compatibility of the blocking code.
2015-09-21 23:21:40 -07:00
Brian Warner
46f1fd2cd0
factor error classes into a common file
2015-09-21 23:21:26 -07:00
Brian Warner
8f1ce1f835
update twisted/demo.py
2015-07-24 18:04:15 -07:00
Brian Warner
aec8b65724
rename twisted/eventsource.py in prep for directory merge
2015-07-24 17:55:23 -07:00
Brian Warner
efd6d27cc6
rename SymmetricWormhole to just "Wormhole"
...
Update docs too. Now both blocking/ and twisted/ use "Wormhole".
2015-07-24 17:47:46 -07:00
Brian Warner
d8ca850d1a
blocking: finish alignment
2015-07-24 17:28:55 -07:00
Brian Warner
2ad65e13fe
blocking: more alignment with twisted/transcribe.py
2015-07-24 17:22:02 -07:00
Brian Warner
2e44181e6d
blocking: introduce _post_message()/_post_json()
2015-07-24 17:16:33 -07:00
Brian Warner
5951015f79
rearrange twisted+blocking to look roughly the same
2015-07-24 17:02:32 -07:00
Brian Warner
cebfa71563
minor reformatting, improve test error messages
2015-07-24 16:57:19 -07:00
Brian Warner
cdeaac0ad0
twisted: deallocate in more errorful situations
2015-07-24 16:56:41 -07:00
Brian Warner
62ebd07036
twisted/transcribe: refactoring
2015-07-24 16:46:39 -07:00
Brian Warner
77b80495c9
improve typechecking, nacl.utils.EncryptedMessage is not a bytestring
...
but it derives from one
2015-07-24 16:45:20 -07:00
Brian Warner
a46a405487
refactor: _get_message() (singular) does unhexlify too
2015-07-24 16:33:29 -07:00
Brian Warner
5e1690cad8
rearrange slightly
2015-07-24 16:26:01 -07:00
Brian Warner
e5fcc6a8c8
rename some methods to make them more private
2015-07-24 16:18:03 -07:00
Brian Warner
effbd27047
minor rearrangement
2015-07-24 16:00:13 -07:00
Brian Warner
cfe51f73c1
replace base asserts with UsageError
2015-07-24 15:55:42 -07:00
Brian Warner
056cf107fc
replace blocking Initiator/Receiver with just symmetric Wormhole
...
first pass, seems to work
2015-07-17 17:23:07 -07:00
Brian Warner
bc54a0bbca
move blocking/eventsource out to a separate file
2015-07-17 16:55:29 -07:00
Brian Warner
894da44244
relay: make it possible to omit the Transit server
2015-06-21 21:08:21 -07:00
Brian Warner
dc65b4354d
twisted: split allocate_ports() out to util.py
...
so it can be used by downstream projects
2015-06-21 21:04:33 -07:00
Brian Warner
6ee09f5316
add demo of twisted flow, update docs
...
python -m wormhole.twisted.demo send-text TEXT -> CODE
python -m wormhole.twisted.demo receive-text CODE -> TEXT
2015-06-20 19:18:29 -07:00
Brian Warner
25472423c6
make twisted work, get serialization into shape, add proper tests
2015-06-20 19:18:21 -07:00
Brian Warner
0f58f3906d
rough out twisted.SymmetricWormhole
2015-06-20 18:55:08 -07:00
Brian Warner
85dd3ba948
make twisted/ a real package
2015-06-20 18:55:07 -07:00
Brian Warner
951da1a59b
eventsource: add Agent, deliver eventtype correctly
...
import eventual.py from the right place
2015-06-20 18:54:37 -07:00
Brian Warner
5241c07b8c
copy eventsource.py from petmail c98d5a0
2015-06-20 18:34:26 -07:00
Brian Warner
b6b6c6aea4
upgrade to versioneer-0.15, fixes 'setup.py develop'
2015-05-31 16:39:39 -07:00
Brian Warner
d7415b7053
minor expiration cleanups
2015-05-04 18:28:54 -07:00
Brian Warner
183303e11e
rework expiration, prune after 3 days, check every 2 hours
2015-05-04 18:28:04 -07:00
Brian Warner
dc3f2eee43
server: build ChannelList from db, not self.channels
2015-05-04 18:25:52 -07:00
Brian Warner
1aab908091
allocate_channel_id: use DB to get list of previous allocations
2015-05-04 18:24:23 -07:00
Brian Warner
a03fb3900e
relay: track allocations through DB
2015-05-04 18:24:23 -07:00
Brian Warner
043392ee2a
relay: add database, not used yet
2015-05-04 18:24:23 -07:00
Brian Warner
c3b048a4d3
relay: remove/disable unused code, hush pyflakes
2015-04-20 18:34:45 -07:00
Brian Warner
c393e09e8a
server: add --advertise-version option
2015-04-20 18:34:13 -07:00
Brian Warner
790ae9a0dc
change channel-allocation web API (incompatibly)
...
This will make it easier to manage channel allocation later, when we
switch to a database.
2015-04-10 22:03:08 -05:00
Brian Warner
819a37476b
add "-0" mode: no codes, no auth, fixed channel
...
Like roulette but with forward security.
2015-04-09 23:06:57 -05:00
Brian Warner
5f35fcee61
send --verify: tell user to include --verify on receiver too
...
In the long run, this needs to be included in the second PAKE message,
and the MitM consequences thought through.
2015-04-09 22:56:39 -05:00
Brian Warner
5e593509b4
allow pre-generated (human-offline-created) codes
...
Just make up a code like NUMBER-STUFF, and add --code= to the
send-text/send-file command. Also don't use tab-completion on the
codewords part of the receiving side, unless you stuck to the even/odd
PGP wordlist. (tab still works for the channel-id).
2015-04-09 22:50:07 -05:00
Brian Warner
3aa7e22708
relay: don't require allocate(): first message creates the Channel
...
this enables pre-generated (human-offline-created) codes, as long as
they use a channel id high enough to avoid colliding with any allocated
ones.
2015-04-09 22:46:18 -05:00
Brian Warner
c8d2fc8750
relay: improve the way we allocate channels
...
Now the server allocates a channel randomly from set of available ids
with the shortest possible length. So concurrency=1 will always yield a
channel-id between 1 and 9 (inclusive). If we have 9 simultaneous
sessions, we'll start allocating channels from 10 to 99. 100
simultaneous connections kicks us into the 100-999 bucket, etc.
2015-04-09 22:45:04 -05:00
Brian Warner
ecc04ff675
display message-of-the-day, if the server offers one
2015-04-09 12:45:12 -07:00
Brian Warner
5ff59c92e0
display current-version-is-different even when erroring out
2015-04-09 12:35:07 -07:00
Brian Warner
e881d169a6
error out if server gives a "sorry we're closed" error
2015-04-09 12:29:26 -07:00
Brian Warner
6da9f3ec3a
warn (to stderr) if the client version differs from the server's
...
This is a proxy for the other client's version, and encourages both
sides to upgrade to the current version each time the server is
upgraded (which will be once per release).
2015-04-09 11:46:23 -07:00
Brian Warner
782214813b
server+client: fix SSE alternate-event-type handling
...
I think the server needs to put blank lines after *every* field, not
just the data: fields.
2015-04-09 11:37:50 -07:00
Brian Warner
9d7cd1d7de
server: add "welcome message" to all responses, including server version
2015-04-08 21:03:27 -07:00
Brian Warner
dc9bc0c575
Use "wormhole server start" to launch a relay server.
2015-04-08 18:39:33 -07:00
Brian Warner
cf592d0766
CLI: avoid importing anything until command is actually run
...
In prep for moving the server launch command into the main CLI path,
without imposing dependency on pynacl/etc.
2015-04-01 16:01:32 -07:00
Brian Warner
0217a13da6
change relay URL: use more distinctive path prefix
...
This might make it easier for an application's web site to include a
relay, without competing with some other resource named "relay".
2015-03-25 16:51:55 -07:00
Brian Warner
883cacf903
wormhole receive-file: add --overwrite
2015-03-25 16:31:35 -07:00
Brian Warner
717bfa3b0b
move public relays to new hostnames and ports
2015-03-25 14:46:35 -07:00
Brian Warner
106991fe0d
require caller to provide transit relay too
2015-03-25 13:07:17 -07:00
Brian Warner
fae14ebe6a
Add --verify (display/check key-verifier). Not entirely usable yet.
...
To be useful, both sides must add -v. If the sender uses -v but the
receiver doesn't, the receiver won't show the verification string, so
the sender can't compare it to anything (and must either abort the
transfer or accept it blindly). Maybe the receiver should show the
verification string unconditionally. Maybe the sender should
indicate (in unprotected plaintext, along with the PAKE message) whether
the receiver should show it or not.
2015-03-24 00:28:02 -07:00
Brian Warner
ed1809d521
change API to support upcoming --verify flag
2015-03-24 00:03:10 -07:00
Brian Warner
af1e3c51ec
add --code-length, to configure the size of the PAKE code (in bytes/words)
2015-03-23 23:53:28 -07:00
Brian Warner
8e456dea5e
rewrite CLI tools to use argparse, remove Twisted dependency
...
We used to use twisted.python.usage.Options, hence we depended upon
Twisted. Now we depend upon "argparse" instead, which is in the py2.7
stdlib (and on pypi for 2.6). This package will still (eventually)
provide Twisted support, but applications which need it will already
express a dependency on twisted themselves, so by removing the
dependency here, we make life easier for applications that don't use it.
2015-03-22 16:52:35 -07:00
Brian Warner
9e7d807171
rename const.py to public_relay.py, to make it clear what it offers
2015-03-22 11:55:13 -07:00
Brian Warner
7c5cb058a2
require caller to provide relay, no more default
...
Applications should feel free to pass wormhole.const.RENDEZVOUS_RELAY
here, but I figure it should be clear that you're using a public service
that's hosted *somewhere* external.
2015-03-22 11:53:48 -07:00
Brian Warner
fd3e4f3508
change relay URL scheme, allow arbitrary relay-phase messages
2015-03-22 11:45:16 -07:00
Brian Warner
55577d9721
send-file: tolerate zero-byte files
2015-03-20 17:53:19 -07:00
Brian Warner
cc37d2dc2f
add CLI args to override the relay hosts (rendezvous and transit)
2015-03-20 17:45:03 -07:00
Brian Warner
84aa7ff248
receive-file: add --output-file to override local output filename
2015-03-16 00:18:53 -07:00
Brian Warner
5fd85fd884
cmd_receive_text: remove unused 'time' import
2015-03-16 00:17:11 -07:00
Brian Warner
cef9abcdd7
receive-text/file: accept CODE in argv
2015-03-15 23:26:06 -07:00
Brian Warner
12414fd8be
code-completer: re-fetch channelids upon TAB, if necessary
...
This fixes the situation where you start the receiver first, then start
the sender, then you hit TAB on the receiver.
This somewhat improves the situation where you start the receiver first,
hit TAB (getting nothing), then start the sender, then hit TAB on the
receiver again. The second TAB will list the channel-ids, but won't
insert the only one as it's supposed to. You must type something (which
you can erase) and then hit TAB again to get a unique channel-id
inserted. But at least you can tell which one to type.
The first TAB runs the completer with readline.get_completion_type()
equal to 9=TAB=try-to-insert. The second (and subsequent) TABs use
63=?=list-matches, and it won't go back to 9 until you type something.
2015-03-13 01:50:21 -07:00
Brian Warner
3456d36039
cosmetic changes to frontend commands
2015-03-12 23:32:58 -07:00
Brian Warner
315d7c5614
make rendezvous happen in real-time: replace polling with EventSource
2015-03-12 23:07:47 -07:00
Brian Warner
a8b6cad827
transcribe: refactor in anticipation of EventSource client
2015-03-12 23:03:57 -07:00
Brian Warner
8741d5adaa
relay: refactor in anticipation of a realtime EventSource-based protocol
2015-03-12 19:44:31 -07:00
Brian Warner
cda5634b1d
relay.py: minor refactoring in anticipation of multi-pass rendezvous
2015-03-12 19:22:34 -07:00
Brian Warner
fcf3b080f9
transit: don't complain about the relay connection failing or being dropped
2015-03-12 18:38:42 -07:00
Brian Warner
fcd2678dfd
transit: provide encrypted record-pipe, use it for file-xfer
2015-03-12 18:14:42 -07:00
Brian Warner
8b3e5836ee
relay: log total bytes sent in each direction
2015-03-12 16:25:34 -07:00
Brian Warner
8dfe4e7b8d
TRANSIT_RELAY: update to new hint format
2015-03-12 16:03:14 -07:00
Brian Warner
cedd04a2fb
transit.py: add debug prints, disabled
2015-03-12 16:03:00 -07:00
Brian Warner
35630661a5
increase establish_connection() timeout to let relay work
...
If all the direct hints resulted in timeouts (e.g. they were to bad IP
addresses where connections just hang), the relay connection would fail.
The establish_connection() function had the same TIMEOUT as the
direct-hint connector, so it would give up just before the relay
connection was initiated.
2015-03-12 15:52:11 -07:00
Brian Warner
b5ff8a5d4a
format inbound-hint better
2015-03-12 15:24:34 -07:00
Brian Warner
b27cbd19b6
change hint format to "tcp:HOST:PORT"
2015-03-12 15:20:06 -07:00
Brian Warner
d71c8492c1
transit: describe the connection
2015-03-12 14:50:40 -07:00
Brian Warner
c9e0246266
relay: reset channel-id to 1 when all channels are idle
2015-03-02 22:04:58 -08:00
Brian Warner
9a11f355ea
relay: expire any rendezvous channel after one hour
2015-03-02 21:22:56 -08:00
Brian Warner
20fd7c40ae
add progress updates to send/receive file
2015-03-02 12:45:55 -08:00
Brian Warner
7a99c04d64
add "wormhole" entrypoint script. requires twisted.
...
I'm using Twisted for the subcommand argument parsing. It might be nice
to use something smaller.
2015-03-02 00:32:21 -08:00
Brian Warner
5682ddff8e
fix transit relay
...
stop using web setup for now
2015-03-02 00:09:17 -08:00
Brian Warner
dc8d6e979f
more transit-relay work
2015-03-01 11:33:16 -08:00
Brian Warner
cd54eff994
start on transit relay client
2015-02-20 01:40:09 -08:00
Brian Warner
3cc4461049
reduce transit timeout to 15s
2015-02-20 01:39:31 -08:00
Brian Warner
f5741f9a52
offer a wrong-password error message
2015-02-20 00:32:48 -08:00
Brian Warner
3171a4bb56
transit: don't use hard-coded listening ports
2015-02-20 00:00:27 -08:00
Brian Warner
e4390859d1
transit: switch to proper handshakes, with keyid
2015-02-19 23:56:56 -08:00
Brian Warner
6f64b6d326
transit: finish refactoring, combine mostly into a single class
2015-02-19 23:55:05 -08:00
Brian Warner
af5f2053b8
transit: start to factor into common superclass
2015-02-19 19:16:51 -08:00
Brian Warner
99e08c2e37
transit: use bidirectional connections
2015-02-19 19:09:08 -08:00
Brian Warner
01dbec820b
transit: set key on both ends, instead of generate+send
2015-02-19 18:24:10 -08:00
Brian Warner
66ad6fb272
rearrange transit.py in preparation for refactoring
2015-02-19 18:19:17 -08:00
Brian Warner
12845f191b
add derive_key(), use it for file-xfer bulk-encryption key
2015-02-19 17:16:43 -08:00
Brian Warner
50e466b581
don't complain about unconnectable sockets, improve error messages
2015-02-19 16:51:59 -08:00
Brian Warner
3ccd7bd61e
file-xfer: add ack, print encouraging messages, remove noise
2015-02-19 16:30:24 -08:00
Brian Warner
0ba01b2ce7
hush exception noise
2015-02-19 15:55:59 -08:00
Brian Warner
9f998221da
transit: fix race, file-xfer basically works, but noisy
...
The failed connections are throwing exceptions that should be caught and
ignored.
2015-02-19 15:30:16 -08:00
Brian Warner
ae68dad441
make transit mostly work, but the race condition kills it
2015-02-18 17:23:09 -08:00
Brian Warner
f459d59b48
transit: fix handshake
...
Also make all threads daemonic, so they won't keep the process alive.
Also crank up the timeouts for manual testing.
2015-02-18 16:20:35 -08:00
Brian Warner
18ff9f9fd6
transit: plausibly correct
2015-02-18 13:02:17 -08:00
Brian Warner
71e3e73c99
stumbling towards transit implementation
2015-02-17 13:59:08 -08:00
Brian Warner
9dd4c6039f
better sketch of transit-client API
2015-02-15 14:42:59 -08:00
Brian Warner
38b9c07566
sketch out transit-client API
2015-02-15 09:53:59 -08:00
Brian Warner
d6ef752152
update code to match rearranged source tree
2015-02-15 09:32:19 -08:00
Brian Warner
e3964cd797
rearrange source tree
2015-02-15 09:29:28 -08:00
Brian Warner
f82730bfab
add function to find local IP addresses
...
This is a stripped-down copy of the synchronous/blocking portion of
Tahoe-LAFS's src/allmydata/utils/iputil.py .
2015-02-15 09:26:59 -08:00
Brian Warner
db724a7b91
simplify ask-user-for-code (with completion) API
2015-02-15 09:16:17 -08:00
Brian Warner
bc1b367f06
deallocate channel even if key-exchange fails (wrong password)
2015-02-14 18:50:31 -08:00
Brian Warner
0474cc18d5
add list-channels API to relay, use it in receiver
2015-02-14 18:45:29 -08:00
Brian Warner
e2e2206159
use completing-input for wormhole code read, not sys.argv
2015-02-14 17:48:38 -08:00
Brian Warner
e10cd515fe
import the PGP wordlist (2*256), use 16-bit codes
2015-02-13 23:37:05 -08:00
Brian Warner
d5d4a3f97a
start on transit service
2015-02-11 18:13:54 -08:00
Brian Warner
ab8d9f7678
default to a relay hosted on my own domain, for now
2015-02-11 16:48:53 -08:00
Brian Warner
a67d6365f8
transcribe.py: properly encrypt the transferred data
2015-02-11 02:09:08 -08:00
Brian Warner
04ef43f872
transcribe: more refactoring, speed polling to 2Hz
2015-02-11 01:46:33 -08:00
Brian Warner
48476f0840
transcribe.py: factor out common polling code
2015-02-11 01:35:11 -08:00
Brian Warner
6f055c84b9
fix relay URLs
2015-02-11 01:18:18 -08:00
Brian Warner
13a02df636
implement relay, fix transcribe.py to use it properly
2015-02-11 01:05:11 -08:00
Brian Warner
8e522d5387
move scripts to bin/
2015-02-11 01:04:37 -08:00
Brian Warner
c690e8101c
transcribe.Initiator: mostly complete
2015-02-10 21:08:26 -08:00
Brian Warner
3ddfac3eeb
copy eventual.py/observer.py from Foolscap
2015-02-10 18:34:34 -08:00
Brian Warner
f5a0b3e5c6
fill in initiator flow, define relay API
2015-02-10 18:34:13 -08:00
Brian Warner
246e080c7c
sample clients: fill in more details
2015-02-10 17:04:28 -08:00
Brian Warner
84852f26f5
start on sample clients
2015-02-10 16:50:32 -08:00
Brian Warner
c14749fae0
add first unit test, 'setup.py test' support
2015-02-10 01:05:15 -08:00
Brian Warner
d782a8b63b
initial setup.py, versioneer-ification
2015-02-10 00:48:19 -08:00