[tahoe-lafs-trac-stream] [Tahoe-LAFS] #2889: i2p options, `tub.port = listen:i2p`
Tahoe-LAFS
trac at tahoe-lafs.org
Wed Jul 12 16:02:23 UTC 2017
#2889: i2p options, `tub.port = listen:i2p`
--------------------------+------------------------
Reporter: warner | Owner:
Type: defect | Status: new
Priority: normal | Milestone: soon
Component: code-network | Version: 1.12.1
Keywords: | Launchpad Bug:
--------------------------+------------------------
[https://github.com/tahoe-lafs/tahoe-lafs/pull/415 PR 415] adds a `--i2p-
i2cp-options=` flag to the `tahoe create-node` CLI command, and stores
these options in the tahoe.cfg file under `[i2p] i2cp.options=`, and
arranges to use these options when creating the SAM socket.
It must also store these options in the `[node] tub.port=` field, since
the SAM socket might be created by the Tub listener *or* the outbound
connection handler, and the I2P server will stick with the options
requested by whichever one arrives first. So to avoid a race, we must use
exactly the same options in both places.
This is complicated by the fact that `tub.port` is first parsed as a
comma-joined list of listener descriptors, then each element is parsed as
an Endpoint descriptor (which means splitting on colons). Since the I2CP
options are a dictionary, encoded with colons and commas, there's a lot of
escaping and de-escaping going on.
In yesterday's devchat, we decided that it would be cleaner to put these
options solely in the `[i2p] i2cp.options=` field (where they don't need
escaping), and not try to put them in `tub.port`. This DRY (Don't Repeat
Yourself) approach avoids the question of what happens if the two option-
setting keys disagree, and removes the quoting/escaping concern.
To accomplish this, we decided to change the `tub.port` semantics
slightly. It normally contains a comma-separated list of Endpoint
descriptors, each of which starts with a `TYPE:` prefix and then a list of
colon-separated arguments for that type of endpoint. We're comandeering
the `listen:` "type" to mean "ask the tahoe 'provider' for that type to
contribute some Server Endpoints". The provider will also be asked for one
or more Foolscap connection hints, to add to `tub.location`.
So `tub.port = listen:i2p` means "ask the i2p_provider for an endpoint".
`tub.port = tcp:12345,listen:i2p,listen:tor` will get one static TCP
endpoint, plus whatever I2P wants to use, plus whatever Tor wants to use.
The code in `Node.create_main_tub()` that handles `tub.port` will look for
the `listen:` prefix and call out to the provider, rather than passing the
raw string into `tub.listenOn()`. Once the provider returns a list of
Endpoints, they'll be passed one-at-a-time into `tub.listenOn()`.
If Twisted (or any active plugins) add an endpoint type named "listen",
this will prevent them from being used, but that doesn't seem too likely.
We could pick a tahoe-specific name to avoid this, but I think that would
be harder to read (e.g. `tub.port = tahoe-listen:i2p`). I'm not sure,
though.
The `i2p_provider` will then have a method to return a fully-formed
Endpoint, with the I2CP options baked in, instead of trying to shoehorn
these options into a string that's then passed to
`endpoints.serverFromString`.
We'll close PR415 in favor of a different one that adds these changes.
--
Ticket URL: <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2889>
Tahoe-LAFS <https://Tahoe-LAFS.org>
secure decentralized storage
More information about the tahoe-lafs-trac-stream
mailing list