Skip to content

Commit

Permalink
Services,Tests: create HS streams on demand
Browse files Browse the repository at this point in the history
There are multiple usecases when you need multiple
streams for your communication with HS client (e.g
sending multiple http requests), this was not supported
before and this commit fixes that.
  • Loading branch information
aarani committed May 3, 2023
1 parent 7662941 commit d2b8a00
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 11 deletions.
8 changes: 5 additions & 3 deletions NOnion.Tests/HiddenServicesTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,8 @@ public async Task BrowseFacebookOverHS()
TorDirectory directory = await TorDirectory.BootstrapAsync(FallbackDirectorySelector.GetRandomFallbackDirectory(), new DirectoryInfo(Path.GetTempPath()));

var client = await TorServiceClient.ConnectAsync(directory, "facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion");
var httpClient = new TorHttpClient(client.GetStream(), "facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion");
var stream = await client.GetStreamAsync();
var httpClient = new TorHttpClient(stream, "facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion");
await httpClient.GetAsStringAsync("/", false);
}

Expand All @@ -117,8 +118,9 @@ public async Task BrowseFacebookOverHSWithTLS()
TorDirectory directory = await TorDirectory.BootstrapAsync(FallbackDirectorySelector.GetRandomFallbackDirectory(), new DirectoryInfo(Path.GetTempPath()));

var client = await TorServiceClient.ConnectAsync(directory, "facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion:443");
var stream = await client.GetStreamAsync();

var sslStream = new SslStream(client.GetStream(), true, (sender, cert, chain, sslPolicyErrors) => true);
var sslStream = new SslStream(stream, true, (sender, cert, chain, sslPolicyErrors) => true);
await sslStream.AuthenticateAsClientAsync(string.Empty, null, SslProtocols.Tls12, false);

var httpClientOverSslStream = new TorHttpClient(sslStream, "www.facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion");
Expand Down Expand Up @@ -164,7 +166,7 @@ public async Task EstablishAndCommunicateOverHSConnectionOnionStyle()
var clientSide =
Task.Run(async () => {
var client = await TorServiceClient.ConnectAsync(directory, host.ExportUrl());
var stream = client.GetStream();
var stream = await client.GetStreamAsync();
var lengthBytes = new byte[sizeof(int)];
await ReadExact(stream, lengthBytes, 0, lengthBytes.Length);
var length = BitConverter.ToInt32(lengthBytes);
Expand Down
21 changes: 13 additions & 8 deletions NOnion/Services/TorServiceClient.fs
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,21 @@ type TorServiceClient =
{
RendezvousGuard: TorGuard
RendezvousCircuit: TorCircuit
Stream: TorStream
Port: int
}

member self.GetStream() =
self.Stream
async {
// We can't use the "use" keyword since this stream needs
// to outlive this function.
let serviceStream = new TorStream(self.RendezvousCircuit)
do! serviceStream.ConnectToService self.Port |> Async.Ignore

return serviceStream
}

member self.GetStreamAsync() =
self.GetStream() |> Async.StartAsTask

static member ConnectAsync (directory: TorDirectory) (url: string) =
TorServiceClient.Connect directory url |> Async.StartAsTask
Expand Down Expand Up @@ -500,16 +510,11 @@ type TorServiceClient =
Async.Parallel [ introduceJob; rendezvousJoin ]
|> Async.Ignore

// We can't use the "use" keyword since this stream needs
// to outlive this function.
let serviceStream = new TorStream(rendezvousCircuit)
do! serviceStream.ConnectToService port |> Async.Ignore

return
{
RendezvousGuard = rendezvousGuard
RendezvousCircuit = rendezvousCircuit
Stream = serviceStream
Port = port
}
| _ ->
return
Expand Down

0 comments on commit d2b8a00

Please sign in to comment.