Commit Graph

109 Commits

Author SHA1 Message Date
Dan Ballard 7a1c1eb97e Merge branch 'rename' of openprivacy/libricochet-go into master 2018-06-09 16:08:40 +00:00
Sarah Jamie Lewis e382c8eb69 Rename 2018-06-08 15:05:22 -07:00
Dan Ballard 5a94afa0f7 add application integration test: (#42)
- start two peers alice, bob
- make alice requests contact with bob
- they send messages
- they shutdown
- verify (and fix) no threads leaked
- verify messages
- add inbound connection handler to chatChannelHandler
- add Open and AcceptAllContactHandler to application
2018-05-30 10:51:40 -07:00
Sarah Jamie Lewis 417d25dc7c BUGFIX: deadlock 2018-05-09 13:48:41 -07:00
Sarah Jamie Lewis 6f9718596d fmt and travis update 2018-05-09 12:40:07 -07:00
Sarah Jamie Lewis 9980da3bd5 Fixing channelmanager race condition, deleting vendoring 2018-05-09 12:06:34 -07:00
Dan Ballard 3920d33a77 add util to get onion address from private key (#39)
* add util to get onion address from private key

* PR comments: added test, using go-ricochet errors, function argument a privateKey

* remove unnecesary cast and variable
2018-04-30 18:03:06 -07:00
Sarah Jamie Lewis 92b9a0eb1f Commenting 2018-01-17 13:18:46 -05:00
Sarah Jamie Lewis 71685b9c3a Bugfix: Repeated channel opening attempts failed because err was shadowed 2018-01-16 12:13:46 -05:00
Sarah Jamie Lewis 9191b7530e Consolidating Channel Building / Teardown logic 2018-01-16 11:53:34 -05:00
Sarah Jamie Lewis 1e33c17ae3 Extract Authorization Logic / Refactoring OpenChannel Control Logic 2018-01-15 13:07:54 -05:00
Sarah Jamie Lewis 4994e54025 Identity Tests 2018-01-14 12:45:47 -05:00
Sarah Jamie Lewis f9209e187c Testing ContactChannel, Fixing CloseChannel Conditions 2018-01-14 12:16:14 -05:00
Sarah Jamie Lewis a04b3fe08b Moving ChannelResult processing to ControlChannel file and testing 2018-01-14 11:50:15 -05:00
Sarah Jamie Lewis cf46554922 Ensuring Channels Properly Close Themselves 2018-01-13 15:57:37 -05:00
Sarah Jamie Lewis 5d9f2ce9e3 Fixing identity tests and adding them to travis 2018-01-13 15:35:48 -05:00
Sarah Jamie Lewis 88d32191f7 Breaking out KeepAlive into a new control channel file for easier testing 2018-01-13 11:44:40 -05:00
Sarah Jamie Lewis b378c4c825 Revert "Protocol Question TODO"
This reverts commit 9788c07ac4.
2018-01-12 13:59:52 -05:00
Sarah Jamie Lewis 9788c07ac4 Protocol Question TODO 2018-01-12 13:56:32 -05:00
Sarah Jamie Lewis bf19d1b20c Moving FeaturesEnabled logic to another file, adding tests 2018-01-12 13:31:47 -05:00
Sarah Jamie Lewis 39cf4d3871 Removing go 1.7 from travis 2018-01-12 13:07:15 -05:00
Sarah Jamie Lewis 339995c101 Fixing gofmt 2018-01-12 13:04:20 -05:00
Sarah Jamie Lewis 4ccf95bee0 Adding RandNumber util to simplify chatchannel logic 2018-01-12 13:02:15 -05:00
Sarah Jamie Lewis 30808c71b2 Testing MultiChannel Response Condition in Channel Manage 2018-01-12 12:37:45 -05:00
Sarah Jamie Lewis 6e2bfbbc14 Application comments and notes 2018-01-09 17:31:54 -08:00
Sarah Jamie Lewis 4b700d4223 More golint fixing in utils 2018-01-08 11:02:04 -08:00
Sarah Jamie Lewis 1a2fb40d91 Refactoring Application to remove channel handler duplications
Also simplfies application a lot, still not complete, but i like this approach much more
2018-01-07 16:51:46 -08:00
Sarah Jamie Lewis be62634c46 Fixing go vet issues with errorf params 2018-01-06 16:37:07 -08:00
Sarah Jamie Lewis 05e8675ed5 Fixing a few golint issues 2018-01-05 14:16:52 -08:00
Sarah Jamie Lewis f6cc472c6e Removing Erroneous SendMessage & Adding SupportChannelTypes Test 2018-01-04 15:51:32 -08:00
Sarah Jamie Lewis 617ca019f8 Adding stub tests for MessageBuilder 2018-01-04 15:32:37 -08:00
Sarah Jamie Lewis 7f215e86c4 Adding Open Connection Failed Test 2018-01-03 10:20:53 -08:00
Sarah Jamie Lewis 84d7336602 Adding successful version negotiation tests.
This change also simplifies ricochet_test.go to only exercise the Open()
function.
2018-01-03 10:12:59 -08:00
Sarah Jamie Lewis 049a0ea15f Stubbing OutboundVersionNegotiationTest
Actually committing enable features work!
2018-01-02 09:23:20 -08:00
Sarah Jamie Lewis 6d449e230f Improving Testing Documentation & Coverage Starting With Inbound Version Negotiation 2018-01-01 10:55:59 -08:00
Sarah Jamie Lewis f537fb4f76 Adding Simple Application Broadcast & Features Enabled 2018-01-01 10:06:58 -08:00
Sarah Jamie Lewis 1433b31e6f Change inbound/outbound handlers to use Identity.
Add Inbound Version Negotiation Test
2017-12-13 11:42:54 -08:00
Sarah Jamie Lewis 43b357fdb6 First cut of minimizing private_key exposure in the code base
Minor formatting
2017-12-05 11:00:04 -08:00
Sarah Jamie Lewis e1031861a2 Adding basic tests for crypto_utils 2017-11-04 13:31:37 -07:00
Sarah Jamie Lewis 958e07bf66 Fixing minor govet / misspell issue 2017-11-04 08:56:20 -07:00
Sarah Jamie Lewis 5057dd68ee Formatting + Checking Connection Error in Echobot 2017-11-02 16:45:27 -07:00
Sarah Jamie Lewis 9d2e898157
Update README.md
Fixing the examples & adding removing untrue statements.
2017-11-02 16:15:12 -07:00
Sarah Jamie Lewis 3e6dc80670 Fixup Application to align with new Connection API 2017-11-02 16:05:01 -07:00
Sarah Jamie Lewis dc285b18a9 Merge branch 'master' of https://github.com/dballard/go-ricochet into dballard-master 2017-11-02 15:53:01 -07:00
Sarah Jamie Lewis 8fe7b84fc9 Merge branch 'fix/chatchannel-api' of https://github.com/special/go-ricochet-protocol into special-fix/chatchannel-api 2017-11-02 15:45:09 -07:00
John Brooks 9a65aeed77 Improve ContactRequestChannel's API
After the RequestOpenChannel changes, it's now possible to specify the
name and message of an outbound request as variables of the channel handler,
instead implementing an interface method to return them.

Also added the SendResponse method, which is necessary to respond to an
inbound request that was in the Pending state.
2017-11-02 15:43:07 -07:00
John Brooks b2c87b1b72 Fix concurrency issues in ProcessAuthAsClient/Server
There were a few related issues with ProcessAuthAsClient/Server that
could cause deadlocks or leak goroutines:

Break() could end up being called more than once, which is always a
deadlock. This is fixed by using a sync.Once.

RequestOpenChannel was called without Do, and was called before
Process in the same goroutine, which would have deadlocked if Do was
used.

Timing out the authentication attempt wouldn't directly abort
Process(); it would only exit if the connection was closed somewhere
else.

It may be a good idea to change some of this to guarantee that
ProcessAuthAsClient returns either an authenticated connection or closes
the connection, but I'll leave that as a separate task for the moment.
2017-11-02 15:41:35 -07:00
John Brooks e459a56286 Prevent deadlocks with Do or Break and closing connections
After the last round of fixes in Do, there was still one major issue
making it impossible to use Do or Break safely: closing connections.

Connections can be closed spontaneously, and this causes Process to
return. At that moment any ongoing call to Do or Break has deadlocked;
nothing will ever read those channels again. To prevent this, we have to
ensure that Do or Break won't try to send to Process' channels once it
has stopped reading from them. Doing that without other races is tricky.

The solution here, briefly, is to acquire a mutex in Do and Break before
checking the `closed` boolean, and hold that mutex for the entire
operation (including any blocking channel operations). When Process is
closing down the connection, it uses a separate goroutine to acquire the
same mutex and change the boolean, while still handling channel reads.
Once the boolean has changed, the mutex guarantees that nothing will try
to send to these channels again.

I've tried to document the problems and solutions in the code, because
it is subtle in some places and this is definitely critical code.
2017-11-02 15:41:34 -07:00
John Brooks c24773809e Fix and document safety problems with Connection.Do
There were several issues with the Do function that made it nearly
impossible to write safe code.

First, Do cannot be called recursively -- it will deadlock. There is
actually no way to implement a safe and recursive Do (or mutex) in Go,
because there is no primitive that will identify the current goroutine.

RequestOpenChannel used Do internally, which made it impossible to open
channels safely in many circumstances. That has been removed, so all
calls to RequestOpenChannel must be changed to happen under Do now.

Do now has more documentation and a new rule: no code exposed through
API can use Do, unless it has sole custody of the connection (such as
ProcessAuthAsClient).

Related to that problem, Do was impossible to call from inside handlers
(or anything else on the process goroutine) -- it would again just
deadlock. This is resolved by wrapping calls into user code to continue
handling invocations of Do (and only those) while the handler is
executing.

There is a third issue with connection close, but it will be addressed
in a separate commit

And finally, because it's impossible to timeout or interrupt a call to
Do, I also added a DoContext method that takes a go Context, which is
also passed through to the called function.
2017-11-02 15:41:30 -07:00
John Brooks 0f47f62465 Return the new channel from RequestOpenChannel
This fixes a quirk where it would've been difficult to tell which of
several channels of the same type+direction is the one you just created.

It's also a fairly common pattern to want to interact with a channel
right after opening it; for example, a chat channel is opened and can
immediately send messages before getting the peer response. It's
convenient to not have to do a separate lookup.
2017-11-02 15:40:02 -07:00