public async void OnConnectBtnClicked(object sender, EventArgs e) { var host = viewModel.CurretSelectHost; if (host == null) { await DisplayAlert( Resx.TextResource.Common_AlertTitle, Resx.TextResource.Hosts_PleaseAddHost, Resx.TextResource.Common_OK); return; } if (host.EnablePipeline && host.LoadBalance.Count > 0) { var hasInvalid = host.LoadBalance.Any(h => { var n = viewModel.FindHostByName(h); return(n == null || !n.EnablePipeline); }); if (hasInvalid) { await DisplayAlert( Resx.TextResource.Common_AlertTitle, Resx.TextResource.Hosts_LoadBalanceNodeError, Resx.TextResource.Common_OK); return; } } try { File.WriteAllText(App.Instance.ConfigPath, host.PrepareConfig(viewModel)); App.Instance.Start(viewModel.DataStore.Settings); viewModel.IsConnectBtnEnabled = false; viewModel.SetHostGoingToRun(host.HostName); } catch (Exception ex) { Console.WriteLine(ex.Message + "\n" + ex.StackTrace); } }
public string PrepareConfig(HostsViewModel hosts, bool isLoadBalancePrepare = false) { string config = ConfigTemplate; string appVersion = VersionTracking.CurrentVersion; string version_path = Path.Combine( App.Instance.DataPathParent, "version_" + appVersion); string gfwlist_path = Path.Combine(App.Instance.DataPathParent, "gfw_list"); string cn_ips_path = Path.Combine(App.Instance.DataPathParent, "cn_ips_list"); string cert_path = Path.Combine(App.Instance.DataPathParent, "cacert"); if (!File.Exists(version_path)) { File.WriteAllText(version_path, "TrojanPlus App Version: " + appVersion); File.WriteAllText(gfwlist_path, Resx.TextResource.gfwlist); File.WriteAllText(cn_ips_path, Resx.TextResource.cn_mainland_ips); File.WriteAllText(cert_path, Resx.TextResource.cacert); } config = config.Replace("${run_type}", "client_tun"); config = config.Replace("${remote_addr}", HostAddress); config = config.Replace("${remote_port}", HostPort.ToString()); config = config.Replace("${password}", Password); config = config.Replace("${udp_timeout}", "10"); config = config.Replace("${udp_socket_buf}", "16384"); config = config.Replace("${udp_recv_buf}", "4096"); config = config.Replace("${log_level}", EnableDebugLog ? "0" : "5"); config = config.Replace("${ssl.verify}", SSLVerify.ToLowerString()); config = config.Replace("${ssl.verify_hostname}", SSLVerify.ToLowerString()); config = config.Replace("${ssl.ssl_shutdown_wait_time}", "3"); config = config.Replace("${ssl.sni}", HostAddress); config = config.Replace("${ssl.cert}", cert_path); config = config.Replace("${tcp.fast_open}", EnableTCPFastOpen ? "true" : "false"); config = config.Replace("${tcp.connect_time_out}", "5"); config = config.Replace("${experimental.pipeline_num}", EnablePipeline ? "5" : "0"); config = config.Replace("${experimental.pipeline_ack_window}", "100"); if (!isLoadBalancePrepare && LoadBalance.Count > 0) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < LoadBalance.Count; i++) { var h = hosts.FindHostByName(LoadBalance[i]); if (h != null && h.EnablePipeline) { string loadConfig = h.PrepareConfig(hosts, true); string path = Path.Combine(App.Instance.DataPathParent, "balance_config" + i); File.WriteAllText(path, loadConfig); if (sb.Length > 0) { sb.Append(","); } sb.Append($"\"{path}\""); } } config = config.Replace("${experimental.pipeline_loadbalance_configs}", sb.ToString()); } else { config = config.Replace("${experimental.pipeline_loadbalance_configs}", string.Empty); if (isLoadBalancePrepare) { config = config.Replace("${tun.tun_fd}", "-1"); } } config = config.Replace("${tun.net_ip}", TunNetIP); config = config.Replace("${tun.mtu}", TunMtu.ToString()); config = config.Replace("${dns.udp_socket_buf}", "8192"); config = config.Replace("${dns.udp_recv_buf}", "1024"); config = config.Replace("${dns.up_dns_server}", UpStreamNS); config = config.Replace("${dns.up_gfw_dns_server}", GFWUpStreamNS); config = config.Replace("${dns.gfwlist}", gfwlist_path); config = config.Replace("${route.cn_mainland_ips_file}", cn_ips_path); config = config.Replace("${route.proxy_type}", ((int)Route).ToString()); string proxy_ips_path = Path.Combine(App.Instance.DataPathParent, "proxy_ips"); string white_ips_path = Path.Combine(App.Instance.DataPathParent, "white_ips"); File.WriteAllText(proxy_ips_path, string.Empty); File.WriteAllText(white_ips_path, string.Empty); config = config.Replace("${route.proxy_ips}", proxy_ips_path); config = config.Replace("${route.white_ips}", white_ips_path); return(config); }