new introducer: signed extensible dictionary-based messages! refs #466
authorBrian Warner <warner@lothar.com>
Sun, 20 Nov 2011 10:21:32 +0000 (02:21 -0800)
committerBrian Warner <warner@lothar.com>
Wed, 14 Mar 2012 01:24:32 +0000 (18:24 -0700)
commitbc21726dfd73b434c8c513ec482f582cce88fc2a
tree5623ed70d0b0ef5a7c802bf4ca55410347ce20d4
parent5ea8b698a5b51c4468185e1d03497de00975f868
new introducer: signed extensible dictionary-based messages! refs #466

This introduces new client and server halves to the Introducer (renaming the
old one with a _V1 suffix). Both have fallbacks to accomodate talking to a
different version: the publishing client switches on whether the server's
.get_version() advertises V2 support, the server switches on which
subscription method was invoked by the subscribing client.

The V2 protocol sends a three-tuple of (serialized announcement dictionary,
signature, pubkey) for each announcement. The V2 server dispatches messages
to subscribers according to the service-name, and throws errors for invalid
signatures, but does not otherwise examine the messages. The V2 receiver's
subscription callback will receive a (serverid, ann_dict) pair. The
'serverid' will be equal to the pubkey if all of the following are true:

  the originating client is V2, and was told a privkey to use
  the announcement went through a V2 server
  the signature is valid

If not, 'serverid' will be equal to the tubid portion of the announced FURL,
as was the case for V1 receivers.

Servers will create a keypair if one does not exist yet, stored in
private/server.privkey .

The signed announcement dictionary puts the server FURL in a key named
"anonymous-storage-FURL", which anticipates upcoming Accounting-related
changes in the server advertisements. It also provides a key named
"permutation-seed-base32" to tell clients what permutation seed to use. This
is computed at startup, using tubid if there are existing shares, otherwise
the pubkey, to retain share-order compatibility for existing servers.
17 files changed:
src/allmydata/client.py
src/allmydata/interfaces.py
src/allmydata/introducer/client.py
src/allmydata/introducer/common.py [new file with mode: 0644]
src/allmydata/introducer/interfaces.py
src/allmydata/introducer/old.py [new file with mode: 0644]
src/allmydata/introducer/server.py
src/allmydata/node.py
src/allmydata/storage/server.py
src/allmydata/storage_client.py
src/allmydata/test/test_checker.py
src/allmydata/test/test_client.py
src/allmydata/test/test_introducer.py
src/allmydata/test/test_mutable.py
src/allmydata/test/test_system.py
src/allmydata/test/test_upload.py
src/allmydata/web/introweb.py