private string GetFullUri(string relativePath, params object[] parameters) { relativePath = String.Format(relativePath, parameters ?? new object[0]); var uri = _Address.GetRoutableUri(true).AbsoluteUri; if (!uri.EndsWith("/", StringComparison.Ordinal)) { uri += "/"; } uri += relativePath; return(uri); }
async Task ConfigureAsyncCore(TumblerConfiguration conf, ClientInteraction interaction) { Cooperative = conf.Cooperative; ClassicTumblerParameters = conf.ClassicTumblerParameters.Clone(); Network = conf.Network; LocalEndpoint = conf.Listen; TumblerProtocol = conf.TumblerProtocol; bool torConfigured = false; if (conf.TorSettings != null) { Exception error = null; try { _Resources.Add(await conf.TorSettings.SetupAsync(interaction, conf.TorPath).ConfigureAwait(false)); Logs.Configuration.LogInformation("Successfully authenticated to Tor"); var torRSA = Path.Combine(conf.DataDir, "Tor.rsa"); TorPrivateKey = null; if (File.Exists(torRSA)) { TorPrivateKey = File.ReadAllText(torRSA, Encoding.UTF8); } TorConnection = conf.TorSettings.CreateTorClient2(); _Resources.Add(TorConnection); await TorConnection.ConnectAsync().ConfigureAwait(false); await TorConnection.AuthenticateAsync().ConfigureAwait(false); var result = await TorConnection.RegisterHiddenServiceAsync(conf.Listen, conf.TorSettings.VirtualPort, TorPrivateKey).ConfigureAwait(false); if (TorPrivateKey == null) { File.WriteAllText(torRSA, result.PrivateKey, Encoding.UTF8); Logs.Configuration.LogWarning($"Tor RSA private key generated to {torRSA}"); } var tumblerUri = new TumblerUrlBuilder { Host = result.HiddenServiceUri.Host, Port = result.HiddenServiceUri.Port }; TumblerUris.Add(tumblerUri); TorUri = tumblerUri.GetRoutableUri(false); ClassicTumblerParameters.ExpectedAddress = TorUri.AbsoluteUri; Logs.Configuration.LogInformation($"Tor configured on {result.HiddenServiceUri}"); torConfigured = true; } catch (ConfigException ex) { error = ex; } catch (TorException ex) { error = ex; } catch (ClientInteractionException) { } if (error != null) { Logs.Configuration.LogWarning("Error while configuring Tor hidden service: " + error.Message); } } if (!torConfigured) { Logs.Configuration.LogWarning("The tumbler is not configured as a Tor Hidden service"); } var tumlerKeyData = LoadRSAKeyData(conf.DataDir, "Tumbler.pem", conf.NoRSAProof); var voucherKeyData = LoadRSAKeyData(conf.DataDir, "Voucher.pem", conf.NoRSAProof); ClassicTumblerParameters.ServerKey = tumlerKeyData.Item2; ClassicTumblerParameters.VoucherKey = voucherKeyData.Item2; TumblerKey = tumlerKeyData.Item1; VoucherKey = voucherKeyData.Item1; if (!conf.TorMandatory) { // Construct a valid 16 character long onion address which will be used as a reference (it is not meant to be a valid IP address or hostname) string dummyOnionAddress = Environment.MachineName; if (dummyOnionAddress.Length < 16) { dummyOnionAddress = dummyOnionAddress.PadRight(16, '-'); } TumblerUrlBuilder httpUri; //Set the Tor URI only if the Tor address has not been already set if (TorUri == null) { //Add onion style address, this is just a display address used when running MasterNode without Tor httpUri = new TumblerUrlBuilder() { Host = $"{dummyOnionAddress}.dummy", Port = conf.Listen.Port }; TumblerUris.Add(httpUri); TorUri = httpUri.GetRoutableUri(false); //Add IP address of the network card with Internet connection httpUri = new TumblerUrlBuilder() { Host = LocalEndpoint.Address.ToString(), Port = LocalEndpoint.Port }; TumblerUris.Add(httpUri); if (String.IsNullOrEmpty(ClassicTumblerParameters.ExpectedAddress)) { ClassicTumblerParameters.ExpectedAddress = httpUri.GetRoutableUri(false).AbsoluteUri; } } else { if (String.IsNullOrEmpty(ClassicTumblerParameters.ExpectedAddress)) { ClassicTumblerParameters.ExpectedAddress = TorUri.AbsoluteUri; } } } ClassicTumblerParametersHash = ClassicTumblerParameters.GetHash(); var configurationHash = ClassicTumblerParameters.GetHash(); foreach (var uri in TumblerUris) { uri.ConfigurationHash = configurationHash; } Logs.Configuration.LogInformation(""); Logs.Configuration.LogInformation($"--------------------------------"); Logs.Configuration.LogInformation($"Shareable URIs of the running tumbler are:"); foreach (var uri in TumblerUris) { Logs.Configuration.LogInformation(uri.ToString()); } Logs.Configuration.LogInformation($"--------------------------------"); Logs.Configuration.LogInformation(""); Repository = conf.DBreezeRepository; _Resources.Add(Repository); Tracker = conf.Tracker; Services = conf.Services; }
async Task ConfigureAsyncCore(TumblerConfiguration conf, ClientInteraction interaction) { Cooperative = conf.Cooperative; ClassicTumblerParameters = conf.ClassicTumblerParameters.Clone(); Network = conf.Network; LocalEndpoint = conf.Listen; RPCClient rpcClient = null; try { rpcClient = conf.RPC.ConfigureRPCClient(conf.Network); } catch { throw new ConfigException("Please, fix rpc settings in " + conf.ConfigurationFile); } bool torConfigured = false; if (conf.TorSettings != null) { Exception error = null; try { _Resources.Add(await conf.TorSettings.SetupAsync(interaction, conf.TorPath).ConfigureAwait(false)); Logs.Configuration.LogInformation("Successfully authenticated to Tor"); var torRSA = Path.Combine(conf.DataDir, "Tor.rsa"); TorPrivateKey = null; if (File.Exists(torRSA)) { TorPrivateKey = File.ReadAllText(torRSA, Encoding.UTF8); } TorConnection = conf.TorSettings.CreateTorClient2(); _Resources.Add(TorConnection); await TorConnection.ConnectAsync().ConfigureAwait(false); await TorConnection.AuthenticateAsync().ConfigureAwait(false); var result = await TorConnection.RegisterHiddenServiceAsync(conf.Listen, conf.TorSettings.VirtualPort, TorPrivateKey).ConfigureAwait(false); if (TorPrivateKey == null) { File.WriteAllText(torRSA, result.PrivateKey, Encoding.UTF8); Logs.Configuration.LogWarning($"Tor RSA private key generated to {torRSA}"); } var tumblerUri = new TumblerUrlBuilder { Port = result.HiddenServiceUri.Port, Host = result.HiddenServiceUri.Host }; TumblerUris.Add(tumblerUri); TorUri = tumblerUri.GetRoutableUri(false); ClassicTumblerParameters.ExpectedAddress = TorUri.AbsoluteUri; Logs.Configuration.LogInformation($"Tor configured on {result.HiddenServiceUri}"); torConfigured = true; } catch (ConfigException ex) { error = ex; } catch (TorException ex) { error = ex; } catch (ClientInteractionException) { } if (error != null) { Logs.Configuration.LogWarning("Error while configuring Tor hidden service: " + error.Message); } } if (!torConfigured) { Logs.Configuration.LogWarning("The tumbler is not configured as a Tor Hidden service"); } var tumlerKeyData = LoadRSAKeyData(conf.DataDir, "Tumbler.pem", conf.NoRSAProof); var voucherKeyData = LoadRSAKeyData(conf.DataDir, "Voucher.pem", conf.NoRSAProof); ClassicTumblerParameters.ServerKey = tumlerKeyData.Item2; ClassicTumblerParameters.VoucherKey = voucherKeyData.Item2; TumblerKey = tumlerKeyData.Item1; VoucherKey = voucherKeyData.Item1; if (!conf.TorMandatory) { var httpUri = new TumblerUrlBuilder() { Host = LocalEndpoint.Address.ToString(), Port = LocalEndpoint.Port, }; TumblerUris.Add(httpUri); if (String.IsNullOrEmpty(ClassicTumblerParameters.ExpectedAddress)) { ClassicTumblerParameters.ExpectedAddress = httpUri.GetRoutableUri(false).AbsoluteUri; } } ClassicTumblerParametersHash = ClassicTumblerParameters.GetHash(); var configurationHash = ClassicTumblerParameters.GetHash(); foreach (var uri in TumblerUris) { uri.ConfigurationHash = configurationHash; } Logs.Configuration.LogInformation(""); Logs.Configuration.LogInformation($"--------------------------------"); Logs.Configuration.LogInformation($"Shareable URIs of the running tumbler are:"); foreach (var uri in TumblerUris) { Logs.Configuration.LogInformation(uri.ToString()); } Logs.Configuration.LogInformation($"--------------------------------"); Logs.Configuration.LogInformation(""); var dbreeze = new DBreezeRepository(Path.Combine(conf.DataDir, "db2")); Repository = dbreeze; _Resources.Add(dbreeze); Tracker = new Tracker(dbreeze, Network); Services = ExternalServices.CreateFromRPCClient(rpcClient, dbreeze, Tracker, true); }