diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.resx b/v2rayN/v2rayN/Forms/AddServer3Form.resx index 11e4d167..0f5bdcb4 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer3Form.resx @@ -126,7 +126,7 @@ - 4 + 1 &Cancel @@ -199,7 +199,7 @@ 278, 20 - 6 + 3 cmbSecurity @@ -220,7 +220,7 @@ 278, 21 - 11 + 4 txtRemarks @@ -295,7 +295,7 @@ 278, 21 - 5 + 2 txtId @@ -343,7 +343,7 @@ 194, 21 - 3 + 1 txtPort @@ -391,7 +391,7 @@ 359, 21 - 1 + 0 txtAddress @@ -466,7 +466,7 @@ 75, 23 - 5 + 0 &OK diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.resx b/v2rayN/v2rayN/Forms/AddServer4Form.resx index e70189c3..45725ec7 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer4Form.resx @@ -126,7 +126,7 @@ - 4 + 1 &Cancel @@ -150,7 +150,7 @@ 278, 21 - 26 + 2 txtSecurity @@ -202,7 +202,7 @@ 278, 21 - 24 + 3 txtId @@ -280,7 +280,7 @@ 278, 21 - 11 + 4 txtRemarks @@ -328,7 +328,7 @@ 194, 21 - 3 + 1 txtPort @@ -376,7 +376,7 @@ 359, 21 - 1 + 0 txtAddress @@ -451,7 +451,7 @@ 75, 23 - 5 + 0 &OK diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs index bd68c62f..44915372 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs @@ -35,32 +35,6 @@ this.label4 = new System.Windows.Forms.Label(); this.btnGUID = new System.Windows.Forms.Button(); this.label13 = new System.Windows.Forms.Label(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.label25 = new System.Windows.Forms.Label(); - this.label24 = new System.Windows.Forms.Label(); - this.label23 = new System.Windows.Forms.Label(); - this.panTlsMore = new System.Windows.Forms.Panel(); - this.txtSNI = new System.Windows.Forms.TextBox(); - this.label22 = new System.Windows.Forms.Label(); - this.label21 = new System.Windows.Forms.Label(); - this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); - this.label9 = new System.Windows.Forms.Label(); - this.label20 = new System.Windows.Forms.Label(); - this.txtPath = new System.Windows.Forms.TextBox(); - this.cmbNetwork = new System.Windows.Forms.ComboBox(); - this.label7 = new System.Windows.Forms.Label(); - this.label19 = new System.Windows.Forms.Label(); - this.label18 = new System.Windows.Forms.Label(); - this.label17 = new System.Windows.Forms.Label(); - this.label16 = new System.Windows.Forms.Label(); - this.label14 = new System.Windows.Forms.Label(); - this.label15 = new System.Windows.Forms.Label(); - this.cmbStreamSecurity = new System.Windows.Forms.ComboBox(); - this.label12 = new System.Windows.Forms.Label(); - this.txtRequestHost = new System.Windows.Forms.TextBox(); - this.label11 = new System.Windows.Forms.Label(); - this.label10 = new System.Windows.Forms.Label(); - this.cmbHeaderType = new System.Windows.Forms.ComboBox(); this.label8 = new System.Windows.Forms.Label(); this.cmbSecurity = new System.Windows.Forms.ComboBox(); this.txtRemarks = new System.Windows.Forms.TextBox(); @@ -75,10 +49,11 @@ this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.transportControl = new v2rayN.Forms.ServerTransportControl(); this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.panTlsMore.SuspendLayout(); this.panel2.SuspendLayout(); + this.panel3.SuspendLayout(); this.SuspendLayout(); // // btnClose @@ -95,7 +70,6 @@ this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.btnGUID); this.groupBox1.Controls.Add(this.label13); - this.groupBox1.Controls.Add(this.groupBox2); this.groupBox1.Controls.Add(this.label8); this.groupBox1.Controls.Add(this.cmbSecurity); this.groupBox1.Controls.Add(this.txtRemarks); @@ -140,195 +114,6 @@ resources.ApplyResources(this.label13, "label13"); this.label13.Name = "label13"; // - // groupBox2 - // - this.groupBox2.Controls.Add(this.label25); - this.groupBox2.Controls.Add(this.label24); - this.groupBox2.Controls.Add(this.label23); - this.groupBox2.Controls.Add(this.panTlsMore); - this.groupBox2.Controls.Add(this.label9); - this.groupBox2.Controls.Add(this.label20); - this.groupBox2.Controls.Add(this.txtPath); - this.groupBox2.Controls.Add(this.cmbNetwork); - this.groupBox2.Controls.Add(this.label7); - this.groupBox2.Controls.Add(this.label19); - this.groupBox2.Controls.Add(this.label18); - this.groupBox2.Controls.Add(this.label17); - this.groupBox2.Controls.Add(this.label16); - this.groupBox2.Controls.Add(this.label14); - this.groupBox2.Controls.Add(this.label15); - this.groupBox2.Controls.Add(this.cmbStreamSecurity); - this.groupBox2.Controls.Add(this.label12); - this.groupBox2.Controls.Add(this.txtRequestHost); - this.groupBox2.Controls.Add(this.label11); - this.groupBox2.Controls.Add(this.label10); - this.groupBox2.Controls.Add(this.cmbHeaderType); - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; - // - // label25 - // - resources.ApplyResources(this.label25, "label25"); - this.label25.Name = "label25"; - // - // label24 - // - resources.ApplyResources(this.label24, "label24"); - this.label24.Name = "label24"; - // - // label23 - // - resources.ApplyResources(this.label23, "label23"); - this.label23.Name = "label23"; - // - // panTlsMore - // - this.panTlsMore.Controls.Add(this.txtSNI); - this.panTlsMore.Controls.Add(this.label22); - this.panTlsMore.Controls.Add(this.label21); - this.panTlsMore.Controls.Add(this.cmbAllowInsecure); - resources.ApplyResources(this.panTlsMore, "panTlsMore"); - this.panTlsMore.Name = "panTlsMore"; - // - // txtSNI - // - resources.ApplyResources(this.txtSNI, "txtSNI"); - this.txtSNI.Name = "txtSNI"; - // - // label22 - // - resources.ApplyResources(this.label22, "label22"); - this.label22.Name = "label22"; - // - // label21 - // - resources.ApplyResources(this.label21, "label21"); - this.label21.Name = "label21"; - // - // cmbAllowInsecure - // - this.cmbAllowInsecure.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbAllowInsecure.FormattingEnabled = true; - this.cmbAllowInsecure.Items.AddRange(new object[] { - resources.GetString("cmbAllowInsecure.Items"), - resources.GetString("cmbAllowInsecure.Items1"), - resources.GetString("cmbAllowInsecure.Items2")}); - resources.ApplyResources(this.cmbAllowInsecure, "cmbAllowInsecure"); - this.cmbAllowInsecure.Name = "cmbAllowInsecure"; - // - // label9 - // - resources.ApplyResources(this.label9, "label9"); - this.label9.Name = "label9"; - // - // label20 - // - resources.ApplyResources(this.label20, "label20"); - this.label20.Name = "label20"; - // - // txtPath - // - resources.ApplyResources(this.txtPath, "txtPath"); - this.txtPath.Name = "txtPath"; - // - // cmbNetwork - // - this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbNetwork.FormattingEnabled = true; - this.cmbNetwork.Items.AddRange(new object[] { - resources.GetString("cmbNetwork.Items"), - resources.GetString("cmbNetwork.Items1"), - resources.GetString("cmbNetwork.Items2"), - resources.GetString("cmbNetwork.Items3"), - resources.GetString("cmbNetwork.Items4"), - resources.GetString("cmbNetwork.Items5")}); - resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); - this.cmbNetwork.Name = "cmbNetwork"; - this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); - // - // label7 - // - resources.ApplyResources(this.label7, "label7"); - this.label7.Name = "label7"; - // - // label19 - // - resources.ApplyResources(this.label19, "label19"); - this.label19.Name = "label19"; - // - // label18 - // - resources.ApplyResources(this.label18, "label18"); - this.label18.Name = "label18"; - // - // label17 - // - resources.ApplyResources(this.label17, "label17"); - this.label17.Name = "label17"; - // - // label16 - // - resources.ApplyResources(this.label16, "label16"); - this.label16.Name = "label16"; - // - // label14 - // - resources.ApplyResources(this.label14, "label14"); - this.label14.Name = "label14"; - // - // label15 - // - resources.ApplyResources(this.label15, "label15"); - this.label15.Name = "label15"; - // - // cmbStreamSecurity - // - this.cmbStreamSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbStreamSecurity.FormattingEnabled = true; - this.cmbStreamSecurity.Items.AddRange(new object[] { - resources.GetString("cmbStreamSecurity.Items"), - resources.GetString("cmbStreamSecurity.Items1"), - resources.GetString("cmbStreamSecurity.Items2")}); - resources.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); - this.cmbStreamSecurity.Name = "cmbStreamSecurity"; - this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged); - // - // label12 - // - resources.ApplyResources(this.label12, "label12"); - this.label12.Name = "label12"; - // - // txtRequestHost - // - resources.ApplyResources(this.txtRequestHost, "txtRequestHost"); - this.txtRequestHost.Name = "txtRequestHost"; - // - // label11 - // - resources.ApplyResources(this.label11, "label11"); - this.label11.Name = "label11"; - // - // label10 - // - resources.ApplyResources(this.label10, "label10"); - this.label10.Name = "label10"; - // - // cmbHeaderType - // - this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbHeaderType.FormattingEnabled = true; - this.cmbHeaderType.Items.AddRange(new object[] { - resources.GetString("cmbHeaderType.Items"), - resources.GetString("cmbHeaderType.Items1"), - resources.GetString("cmbHeaderType.Items2"), - resources.GetString("cmbHeaderType.Items3"), - resources.GetString("cmbHeaderType.Items4"), - resources.GetString("cmbHeaderType.Items5"), - resources.GetString("cmbHeaderType.Items6")}); - resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); - this.cmbHeaderType.Name = "cmbHeaderType"; - // // label8 // resources.ApplyResources(this.label8, "label8"); @@ -407,12 +192,25 @@ resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // + // panel3 + // + this.panel3.Controls.Add(this.transportControl); + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Name = "panel3"; + // + // transportControl + // + this.transportControl.AllowXtls = false; + resources.ApplyResources(this.transportControl, "transportControl"); + this.transportControl.Name = "transportControl"; + // // AddServer5Form // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnClose; this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel3); this.Controls.Add(this.panel2); this.Controls.Add(this.panel1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; @@ -420,11 +218,8 @@ this.Load += new System.EventHandler(this.AddServer5Form_Load); this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.panTlsMore.ResumeLayout(false); - this.panTlsMore.PerformLayout(); this.panel2.ResumeLayout(false); + this.panel3.ResumeLayout(false); this.ResumeLayout(false); } @@ -444,38 +239,14 @@ private System.Windows.Forms.TextBox txtAddress; private System.Windows.Forms.Label label1; private System.Windows.Forms.ComboBox cmbSecurity; - private System.Windows.Forms.ComboBox cmbNetwork; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.Label label9; private System.Windows.Forms.Label label8; private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.TextBox txtRequestHost; - private System.Windows.Forms.Label label10; - private System.Windows.Forms.Label label11; - private System.Windows.Forms.ComboBox cmbHeaderType; - private System.Windows.Forms.Label label12; - private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.Label label13; - private System.Windows.Forms.Label label15; - private System.Windows.Forms.ComboBox cmbStreamSecurity; private System.Windows.Forms.Button btnGUID; - private System.Windows.Forms.Label label16; - private System.Windows.Forms.Label label14; - private System.Windows.Forms.Label label17; - private System.Windows.Forms.Label label18; - private System.Windows.Forms.Label label19; - private System.Windows.Forms.TextBox txtPath; - private System.Windows.Forms.Label label20; - private System.Windows.Forms.Label label21; - private System.Windows.Forms.ComboBox cmbAllowInsecure; - private System.Windows.Forms.Panel panTlsMore; - private System.Windows.Forms.Label label24; - private System.Windows.Forms.Label label23; private System.Windows.Forms.ComboBox cmbFlow; private System.Windows.Forms.Label label4; - private System.Windows.Forms.TextBox txtSNI; - private System.Windows.Forms.Label label22; - private System.Windows.Forms.Label label25; + private System.Windows.Forms.Panel panel3; + private ServerTransportControl transportControl; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.cs b/v2rayN/v2rayN/Forms/AddServer5Form.cs index 9c2f350a..43d52751 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.cs @@ -15,6 +15,7 @@ namespace v2rayN.Forms private void AddServer5Form_Load(object sender, EventArgs e) { + transportControl.AllowXtls = true; if (EditIndex >= 0) { vmessItem = config.vmess[EditIndex]; @@ -37,15 +38,9 @@ namespace v2rayN.Forms txtId.Text = vmessItem.id; cmbFlow.Text = vmessItem.flow; cmbSecurity.Text = vmessItem.security; - cmbNetwork.Text = vmessItem.network; txtRemarks.Text = vmessItem.remarks; - cmbHeaderType.Text = vmessItem.headerType; - txtRequestHost.Text = vmessItem.requestHost; - txtPath.Text = vmessItem.path; - cmbStreamSecurity.Text = vmessItem.streamSecurity; - cmbAllowInsecure.Text = vmessItem.allowInsecure; - txtSNI.Text = vmessItem.sni; + transportControl.BindingServer(vmessItem); } @@ -59,62 +54,9 @@ namespace v2rayN.Forms txtId.Text = ""; cmbFlow.Text = ""; cmbSecurity.Text = Global.None; - cmbNetwork.Text = Global.DefaultNetwork; txtRemarks.Text = ""; - cmbHeaderType.Text = Global.None; - txtRequestHost.Text = ""; - cmbStreamSecurity.Text = ""; - cmbAllowInsecure.Text = ""; - txtPath.Text = ""; - txtSNI.Text = ""; - } - - - private void cmbNetwork_SelectedIndexChanged(object sender, EventArgs e) - { - SetHeaderType(); - } - - - /// - /// 设置伪装选项 - /// - private void SetHeaderType() - { - cmbHeaderType.Items.Clear(); - - string network = cmbNetwork.Text; - if (Utils.IsNullOrEmpty(network)) - { - cmbHeaderType.Items.Add(Global.None); - return; - } - - if (network.Equals(Global.DefaultNetwork)) - { - cmbHeaderType.Items.Add(Global.None); - cmbHeaderType.Items.Add(Global.TcpHeaderHttp); - } - else if (network.Equals("kcp") || network.Equals("quic")) - { - cmbHeaderType.Items.Add(Global.None); - cmbHeaderType.Items.Add("srtp"); - cmbHeaderType.Items.Add("utp"); - cmbHeaderType.Items.Add("wechat-video"); - cmbHeaderType.Items.Add("dtls"); - cmbHeaderType.Items.Add("wireguard"); - } - else if (network.Equals("grpc")) - { - cmbHeaderType.Items.Add(Global.GrpcgunMode); - cmbHeaderType.Items.Add(Global.GrpcmultiMode); - } - else - { - cmbHeaderType.Items.Add(Global.None); - } - cmbHeaderType.SelectedIndex = 0; + transportControl.ClearServer(vmessItem); } private void btnOK_Click(object sender, EventArgs e) @@ -124,16 +66,8 @@ namespace v2rayN.Forms string id = txtId.Text; string flow = cmbFlow.Text; string security = cmbSecurity.Text; - string network = cmbNetwork.Text; string remarks = txtRemarks.Text; - string headerType = cmbHeaderType.Text; - string requestHost = txtRequestHost.Text; - string path = txtPath.Text; - string streamSecurity = cmbStreamSecurity.Text; - string allowInsecure = cmbAllowInsecure.Text; - string sni = txtSNI.Text; - if (Utils.IsNullOrEmpty(address)) { UI.Show(UIRes.I18N("FillServerAddress")); @@ -150,22 +84,15 @@ namespace v2rayN.Forms return; } + transportControl.EndBindingServer(); vmessItem.address = address; vmessItem.port = Utils.ToInt(port); vmessItem.id = id; vmessItem.flow = flow; vmessItem.security = security; - vmessItem.network = network; vmessItem.remarks = remarks; - vmessItem.headerType = headerType; - vmessItem.requestHost = requestHost.Replace(" ", ""); - vmessItem.path = path.Replace(" ", ""); - vmessItem.streamSecurity = streamSecurity; - vmessItem.allowInsecure = allowInsecure; - vmessItem.sni = sni; - if (ConfigHandler.AddVlessServer(ref config, vmessItem, EditIndex) == 0) { this.DialogResult = DialogResult.OK; @@ -185,18 +112,5 @@ namespace v2rayN.Forms { this.DialogResult = DialogResult.Cancel; } - - private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e) - { - string security = cmbStreamSecurity.Text; - if (Utils.IsNullOrEmpty(security)) - { - panTlsMore.Hide(); - } - else - { - panTlsMore.Show(); - } - } } -} +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.resx b/v2rayN/v2rayN/Forms/AddServer5Form.resx index b86110a6..d8a0fd00 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer5Form.resx @@ -165,7 +165,7 @@ 211, 20 - 24 + 3 cmbFlow @@ -261,738 +261,6 @@ 3 - - True - - - NoControl - - - 529, 210 - - - 113, 12 - - - 37 - - - 4)grpc serviceName - - - label25 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - True - - - NoControl - - - 529, 197 - - - 119, 12 - - - 35 - - - 3)QUIC key/Kcp seed - - - label24 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - True - - - NoControl - - - 465, 140 - - - 89, 12 - - - 34 - - - 4)QUIC securty - - - label23 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 2 - - - 297, 7 - - - 200, 21 - - - 35 - - - txtSNI - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 0 - - - True - - - NoControl - - - 267, 11 - - - 23, 12 - - - 34 - - - SNI - - - label22 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 1 - - - True - - - NoControl - - - 12, 11 - - - 83, 12 - - - 31 - - - allowInsecure - - - label21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 2 - - - - - - true - - - false - - - 100, 7 - - - 80, 20 - - - 30 - - - cmbAllowInsecure - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 3 - - - 200, 232 - - - 500, 35 - - - 33 - - - panTlsMore - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 3 - - - True - - - 353, 32 - - - 113, 12 - - - 15 - - - *Default value tcp - - - label9 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 4 - - - True - - - 464, 124 - - - 203, 12 - - - 29 - - - 3)h2 host Separated by commas (,) - - - label20 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 5 - - - 127, 169 - - - True - - - 396, 54 - - - 28 - - - txtPath - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 6 - - - tcp - - - kcp - - - ws - - - h2 - - - quic - - - grpc - - - 192, 28 - - - 143, 20 - - - 12 - - - cmbNetwork - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 7 - - - True - - - 9, 32 - - - 167, 12 - - - 13 - - - Transport protocol(network) - - - label7 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 8 - - - True - - - 9, 169 - - - 29, 12 - - - 27 - - - Path - - - label19 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 9 - - - True - - - 529, 183 - - - 59, 12 - - - 26 - - - 2)h2 path - - - label18 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 10 - - - True - - - 464, 109 - - - 59, 12 - - - 25 - - - 2)ws host - - - label17 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 11 - - - True - - - 529, 169 - - - 59, 12 - - - 24 - - - 1)ws path - - - label16 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 12 - - - True - - - 464, 94 - - - 215, 12 - - - 23 - - - 1)http host Separated by commas (,) - - - label14 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 13 - - - True - - - 9, 243 - - - 23, 12 - - - 22 - - - TLS - - - label15 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 14 - - - - - - tls - - - xtls - - - 127, 239 - - - 60, 20 - - - 21 - - - cmbStreamSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 15 - - - True - - - 282, 68 - - - 293, 12 - - - 20 - - - *tcp or kcp or QUIC camouflage type or grpc mode - - - label12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 16 - - - 158, 100 - - - True - - - 300, 53 - - - 16 - - - txtRequestHost - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 17 - - - True - - - 9, 68 - - - 95, 12 - - - 19 - - - Camouflage type - - - label11 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 18 - - - True - - - 9, 100 - - - 143, 12 - - - 17 - - - Camouflage domain(host) - - - label10 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 19 - - - none - - - http - - - srtp - - - utp - - - wechat-video - - - dtls - - - wireguard - - - 127, 64 - - - 143, 20 - - - 18 - - - cmbHeaderType - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 20 - - - Bottom - - - 3, 240 - - - 723, 281 - - - 21 - - - Transport - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - True @@ -1021,7 +289,7 @@ groupBox1 - 5 + 4 none @@ -1033,7 +301,7 @@ 211, 20 - 6 + 4 cmbSecurity @@ -1045,7 +313,7 @@ groupBox1 - 6 + 5 127, 185 @@ -1054,7 +322,7 @@ 211, 21 - 11 + 5 txtRemarks @@ -1066,7 +334,7 @@ groupBox1 - 7 + 6 True @@ -1093,7 +361,7 @@ groupBox1 - 8 + 7 True @@ -1120,7 +388,7 @@ groupBox1 - 9 + 8 127, 91 @@ -1129,7 +397,7 @@ 278, 21 - 5 + 2 txtId @@ -1141,7 +409,7 @@ groupBox1 - 10 + 9 True @@ -1168,7 +436,7 @@ groupBox1 - 11 + 10 127, 59 @@ -1177,7 +445,7 @@ 143, 21 - 3 + 1 txtPort @@ -1189,7 +457,7 @@ groupBox1 - 12 + 11 True @@ -1216,7 +484,7 @@ groupBox1 - 13 + 12 127, 27 @@ -1225,7 +493,7 @@ 359, 21 - 1 + 0 txtAddress @@ -1237,7 +505,7 @@ groupBox1 - 14 + 13 True @@ -1264,7 +532,7 @@ groupBox1 - 15 + 14 Fill @@ -1273,7 +541,7 @@ 0, 10 - 729, 524 + 729, 226 3 @@ -1321,7 +589,7 @@ Bottom - 0, 534 + 0, 456 729, 60 @@ -1339,7 +607,7 @@ $this - 1 + 2 Top @@ -1363,7 +631,55 @@ $this - 2 + 3 + + + Fill + + + 0, 0 + + + 729, 220 + + + 0 + + + transportControl + + + v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + panel3 + + + 0 + + + Bottom + + + 0, 236 + + + 729, 220 + + + 9 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 True @@ -1375,7 +691,7 @@ 6, 12 - 729, 594 + 729, 516 Edit or add a [VLESS] server diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx index bd048332..3d03d416 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx @@ -136,126 +136,6 @@ *手填,方便识别管理 - - 149, 12 - - - 3)QUIC 加密密钥/Kcp seed - - - 95, 12 - - - 4)QUIC 加密方式 - - - 167, 12 - - - 跳过证书验证(allowInsecure) - - - 181, 7 - - - 353, 36 - - - 143, 12 - - - *默认tcp,选错会无法连接 - - - 149, 12 - - - 3)h2 host中间逗号(,)隔开 - - - 127, 168 - - - 127, 32 - - - 220, 20 - - - 9, 36 - - - 107, 12 - - - 传输协议(network) - - - 9, 168 - - - 65, 12 - - - 路径(path) - - - 161, 12 - - - 1)http host中间逗号(,)隔开 - - - 9, 241 - - - 107, 12 - - - 底层传输安全(tls) - - - 127, 237 - - - 282, 71 - - - 197, 12 - - - *tcp或kcp或QUIC伪装类型或grpc模式 - - - 127, 102 - - - 334, 51 - - - 9, 71 - - - 89, 12 - - - 伪装类型(type) - - - 9, 102 - - - 89, 12 - - - 伪装域名(host) - - - 127, 67 - - - 底层传输方式(transport) - 353, 158 @@ -307,37 +187,6 @@ 确定(&O) - - 171, 22 - - - 导入客户端配置 - - - 171, 22 - - - 导入服务端配置 - - - 168, 6 - - - 171, 22 - - - 从剪贴板导入URL - - - - False - - - 92, 21 - - - 导入配置文件 - 编辑或添加[VLESS]服务器 diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs index a50084f4..6ad64150 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs @@ -31,12 +31,8 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer6Form)); this.btnClose = new System.Windows.Forms.Button(); this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.label21 = new System.Windows.Forms.Label(); - this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); - this.label15 = new System.Windows.Forms.Label(); - this.cmbStreamSecurity = new System.Windows.Forms.ComboBox(); + this.cmbFlow = new System.Windows.Forms.ComboBox(); this.label4 = new System.Windows.Forms.Label(); - this.txtSNI = new System.Windows.Forms.TextBox(); this.label13 = new System.Windows.Forms.Label(); this.txtRemarks = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); @@ -46,10 +42,13 @@ this.label2 = new System.Windows.Forms.Label(); this.txtAddress = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); + this.panel3 = new System.Windows.Forms.Panel(); + this.transportControl = new v2rayN.Forms.ServerTransportControl(); this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); this.groupBox1.SuspendLayout(); + this.panel3.SuspendLayout(); this.panel2.SuspendLayout(); this.SuspendLayout(); // @@ -63,12 +62,8 @@ // // groupBox1 // - this.groupBox1.Controls.Add(this.label21); - this.groupBox1.Controls.Add(this.cmbAllowInsecure); - this.groupBox1.Controls.Add(this.label15); - this.groupBox1.Controls.Add(this.cmbStreamSecurity); + this.groupBox1.Controls.Add(this.cmbFlow); this.groupBox1.Controls.Add(this.label4); - this.groupBox1.Controls.Add(this.txtSNI); this.groupBox1.Controls.Add(this.label13); this.groupBox1.Controls.Add(this.txtRemarks); this.groupBox1.Controls.Add(this.label6); @@ -82,47 +77,23 @@ this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // - // label21 + // cmbFlow // - resources.ApplyResources(this.label21, "label21"); - this.label21.Name = "label21"; - // - // cmbAllowInsecure - // - this.cmbAllowInsecure.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbAllowInsecure.FormattingEnabled = true; - this.cmbAllowInsecure.Items.AddRange(new object[] { - resources.GetString("cmbAllowInsecure.Items"), - resources.GetString("cmbAllowInsecure.Items1"), - resources.GetString("cmbAllowInsecure.Items2")}); - resources.ApplyResources(this.cmbAllowInsecure, "cmbAllowInsecure"); - this.cmbAllowInsecure.Name = "cmbAllowInsecure"; - // - // label15 - // - resources.ApplyResources(this.label15, "label15"); - this.label15.Name = "label15"; - // - // cmbStreamSecurity - // - this.cmbStreamSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbStreamSecurity.FormattingEnabled = true; - this.cmbStreamSecurity.Items.AddRange(new object[] { - resources.GetString("cmbStreamSecurity.Items"), - resources.GetString("cmbStreamSecurity.Items1")}); - resources.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); - this.cmbStreamSecurity.Name = "cmbStreamSecurity"; + this.cmbFlow.FormattingEnabled = true; + this.cmbFlow.Items.AddRange(new object[] { + resources.GetString("cmbFlow.Items"), + resources.GetString("cmbFlow.Items1"), + resources.GetString("cmbFlow.Items2"), + resources.GetString("cmbFlow.Items3"), + resources.GetString("cmbFlow.Items4")}); + resources.ApplyResources(this.cmbFlow, "cmbFlow"); + this.cmbFlow.Name = "cmbFlow"; // // label4 // resources.ApplyResources(this.label4, "label4"); this.label4.Name = "label4"; // - // txtSNI - // - resources.ApplyResources(this.txtSNI, "txtSNI"); - this.txtSNI.Name = "txtSNI"; - // // label13 // resources.ApplyResources(this.label13, "label13"); @@ -168,6 +139,18 @@ resources.ApplyResources(this.label1, "label1"); this.label1.Name = "label1"; // + // panel3 + // + this.panel3.Controls.Add(this.transportControl); + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Name = "panel3"; + // + // transportControl + // + this.transportControl.AllowXtls = false; + resources.ApplyResources(this.transportControl, "transportControl"); + this.transportControl.Name = "transportControl"; + // // panel2 // this.panel2.Controls.Add(this.btnClose); @@ -193,6 +176,7 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnClose; this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel3); this.Controls.Add(this.panel2); this.Controls.Add(this.panel1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; @@ -201,6 +185,7 @@ this.Load += new System.EventHandler(this.AddServer6Form_Load); this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); + this.panel3.ResumeLayout(false); this.panel2.ResumeLayout(false); this.ResumeLayout(false); @@ -222,11 +207,9 @@ private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Panel panel2; private System.Windows.Forms.Label label13; + private System.Windows.Forms.Panel panel3; + private ServerTransportControl transportControl; + private System.Windows.Forms.ComboBox cmbFlow; private System.Windows.Forms.Label label4; - private System.Windows.Forms.TextBox txtSNI; - private System.Windows.Forms.Label label15; - private System.Windows.Forms.ComboBox cmbStreamSecurity; - private System.Windows.Forms.Label label21; - private System.Windows.Forms.ComboBox cmbAllowInsecure; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.cs b/v2rayN/v2rayN/Forms/AddServer6Form.cs index e7d35165..beab1dc7 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer6Form.cs @@ -14,6 +14,7 @@ namespace v2rayN.Forms private void AddServer6Form_Load(object sender, EventArgs e) { + transportControl.AllowXtls = true; if (EditIndex >= 0) { vmessItem = config.vmess[EditIndex]; @@ -31,14 +32,13 @@ namespace v2rayN.Forms /// private void BindingServer() { - txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); txtId.Text = vmessItem.id; - txtSNI.Text = vmessItem.sni; + cmbFlow.Text = vmessItem.flow; txtRemarks.Text = vmessItem.remarks; - cmbStreamSecurity.Text = vmessItem.streamSecurity; - cmbAllowInsecure.Text = vmessItem.allowInsecure; + + transportControl.BindingServer(vmessItem); } @@ -50,10 +50,10 @@ namespace v2rayN.Forms txtAddress.Text = ""; txtPort.Text = ""; txtId.Text = ""; - txtSNI.Text = ""; + cmbFlow.Text = ""; txtRemarks.Text = ""; - cmbStreamSecurity.Text = "tls"; - cmbAllowInsecure.Text = ""; + + transportControl.ClearServer(vmessItem); } private void btnOK_Click(object sender, EventArgs e) @@ -61,10 +61,8 @@ namespace v2rayN.Forms string address = txtAddress.Text; string port = txtPort.Text; string id = txtId.Text; - string sni = txtSNI.Text; + string flow = cmbFlow.Text; string remarks = txtRemarks.Text; - string streamSecurity = cmbStreamSecurity.Text; - string allowInsecure = cmbAllowInsecure.Text; if (Utils.IsNullOrEmpty(address)) { @@ -80,15 +78,15 @@ namespace v2rayN.Forms { UI.Show(UIRes.I18N("FillPassword")); return; - } + } + + transportControl.EndBindingServer(); vmessItem.address = address; vmessItem.port = Utils.ToInt(port); vmessItem.id = id; - vmessItem.sni = sni.Replace(" ", ""); + vmessItem.flow = flow; vmessItem.remarks = remarks; - vmessItem.streamSecurity = streamSecurity; - vmessItem.allowInsecure = allowInsecure; if (ConfigHandler.AddTrojanServer(ref config, vmessItem, EditIndex) == 0) { diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.resx b/v2rayN/v2rayN/Forms/AddServer6Form.resx index 37224494..245e7469 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer6Form.resx @@ -117,6 +117,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + 396, 17 @@ -143,124 +147,42 @@ 0 - - True - - - - NoControl - - - 224, 189 - - - 83, 12 - - - 33 - - - allowInsecure - - - label21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - + - - true + + xtls-rprx-origin - - false + + xtls-rprx-origin-udp443 - - 312, 185 + + xtls-rprx-direct - - 80, 20 + + xtls-rprx-direct-udp443 - - 32 + + 127, 123 - - cmbAllowInsecure + + 211, 20 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - True - - - NoControl - - - 12, 189 - - - 23, 12 - - - 26 - - - TLS - - - label15 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - tls - - - xtls - - - 127, 185 - - - 60, 20 - - - 25 - - - cmbStreamSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - + 3 + + cmbFlow + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + True @@ -268,16 +190,16 @@ NoControl - 12, 156 + 12, 127 - 23, 12 + 29, 12 - 24 + 27 - SNI + Flow label4 @@ -289,34 +211,16 @@ groupBox1 - 4 - - - 127, 152 - - - 359, 21 - - - 23 - - - txtSNI - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 + 1 True + + NoControl + - 428, 124 + 428, 158 113, 12 @@ -337,16 +241,16 @@ groupBox1 - 6 + 2 - 127, 121 + 127, 155 265, 21 - 11 + 4 txtRemarks @@ -358,13 +262,16 @@ groupBox1 - 7 + 3 True + + NoControl + - 12, 125 + 12, 159 95, 12 @@ -385,7 +292,7 @@ groupBox1 - 8 + 4 127, 91 @@ -394,7 +301,7 @@ 265, 21 - 5 + 2 txtId @@ -406,11 +313,14 @@ groupBox1 - 9 + 5 True + + NoControl + 12, 93 @@ -433,7 +343,7 @@ groupBox1 - 10 + 6 127, 59 @@ -442,7 +352,7 @@ 194, 21 - 3 + 1 txtPort @@ -454,11 +364,14 @@ groupBox1 - 11 + 7 True + + NoControl + 12, 62 @@ -481,7 +394,7 @@ groupBox1 - 12 + 8 127, 27 @@ -490,7 +403,7 @@ 359, 21 - 1 + 0 txtAddress @@ -502,11 +415,14 @@ groupBox1 - 13 + 9 True + + NoControl + 12, 31 @@ -529,7 +445,7 @@ groupBox1 - 14 + 10 Fill @@ -538,7 +454,7 @@ 0, 10 - 547, 221 + 707, 195 3 @@ -558,6 +474,57 @@ 0 + + Fill + + + 0, 0 + + + 707, 220 + + + 0 + + + transportControl + + + v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + panel3 + + + 0 + + + Bottom + + + 0, 205 + + + 707, 220 + + + 8 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + NoControl + 303, 17 @@ -586,10 +553,10 @@ Bottom - 0, 231 + 0, 425 - 547, 60 + 707, 60 7 @@ -604,7 +571,7 @@ $this - 1 + 2 Top @@ -613,7 +580,7 @@ 0, 0 - 547, 10 + 707, 10 6 @@ -628,7 +595,7 @@ $this - 2 + 3 True @@ -637,7 +604,180 @@ 6, 12 - 547, 291 + 707, 485 + + + + AAABAAYAICAQAAAAAADoAgAAZgAAABAQEAAAAAAAKAEAAE4DAAAgIAAAAQAIAKgIAAB2BAAAEBAAAAEA + CABoBQAAHg0AACAgAAABACAAqBAAAIYSAAAQEAAAAQAgAGgEAAAuIwAAKAAAACAAAABAAAAAAQAEAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA + /wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIoiI + iIiIiIiIiIiIiIiIiIiCIigiIiIozMzMzMzMyCIogiIoIiIiKM7m5ubm5sgiKIIiKCIiIijObm5ubm7I + IiiCIigiIiIozubm5ubmyCIogiIoIiIiKM5ubm5ubsgiKIIiKCIiIijO5ubm5ubIIiiIiIiIiIiIzm5u + bm5uyCIogRERERERGM7u7u7u7sgiKIHZWVlZWRjMzMzMzMzIIiiB1ZWVlZUYiIiIiIiIiIiIgdlZWVlZ + GDMzMzMzMzMzOIHVlZWVlRg/uLi4uLi4uDiB2VlZWVkYP7uLi4uLi4s4gdWVlZWVGD+4uLi4uLi4OIHZ + WVlZWRg/u4uLi4uLiziB1ZWVlZUYP7i4uLi4uLg4gdlZWVlZGD+7i4uLi4uLOIHVlZWVlRg/uLi4uLi4 + uDiB3d3d3d0YP7uLi4uLi4s4gRERERERGD+4uLi4uLi4OIiIiIiIiIg/u4uLi4uLiziCIiIiIiIoP7i4 + uLi4uLg4giIiIiIiKD+7i4uLi4uLOIIiIiIiIig/uLi4uLi4uDiCIiIiIiIoP7u7u7u7u7s4giIiIiIi + KD//////////OIIiIiIiIigzMzMzMzMzMziIiIiIiIiIiIiIiIiIiIiIIiIiIiIiIiIiIiIiIiIiIv// + ////////AAAAAHv4AA57+AAOe/gADnv4AA57+AAOe/gADgAAAA4AAAAOAAAADgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAB/+AAAf/gAAH/4AAB/+AAAf/gAAAAA + AAD/////KAAAABAAAAAgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACA + gACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAiIiIiIiIiIoiI + iIiIiIiIgigijMzMyCiCKCKM5mbIKIiIiIzu7sgogRERjMzMyCiB2ZGIiIiIiIHZkYMzMzM4gdmRg/u7 + uziB3dGD+7u7OIEREYP7u7s4iIiIg/u7uziCIiKD+7u7OIIiIoP///84giIigzMzMziIiIiIiIiIiP// + KCIAACjObALm5mwCIigAAoiIAAKIzgAAbm4AACIoAAAREQAAGM4AAO7uAAAiKHwAWVl8ABjMfADMzAAA + IigoAAAAIAAAAEAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA + AACAAIAAgIAAAICAgADA3MAA8MqmAKo/KgD/PyoAAF8qAFVfKgCqXyoA/18qAAB/KgBVfyoAqn8qAP9/ + KgAAnyoAVZ8qAKqfKgD/nyoAAL8qAFW/KgCqvyoA/78qAADfKgBV3yoAqt8qAP/fKgAA/yoAVf8qAKr/ + KgD//yoAAABVAFUAVQCqAFUA/wBVAAAfVQBVH1UAqh9VAP8fVQAAP1UAVT9VAKo/VQD/P1UAAF9VAFVf + VQCqX1UA/19VAAB/VQBVf1UAqn9VAP9/VQAAn1UAVZ9VAKqfVQD/n1UAAL9VAFW/VQCqv1UA/79VAADf + VQBV31UAqt9VAP/fVQAA/1UAVf9VAKr/VQD//1UAAAB/AFUAfwCqAH8A/wB/AAAffwBVH38Aqh9/AP8f + fwAAP38AVT9/AKo/fwD/P38AAF9/AFVffwCqX38A/19/AAB/fwBVf38Aqn9/AP9/fwAAn38AVZ9/AKqf + fwD/n38AAL9/AFW/fwCqv38A/79/AADffwBV338Aqt9/AP/ffwAA/38AVf9/AKr/fwD//38AAACqAFUA + qgCqAKoA/wCqAAAfqgBVH6oAqh+qAP8fqgAAP6oAVT+qAKo/qgD/P6oAAF+qAFVfqgCqX6oA/1+qAAB/ + qgBVf6oAqn+qAP9/qgAAn6oAVZ+qAKqfqgD/n6oAAL+qAFW/qgCqv6oA/7+qAADfqgBV36oAqt+qAP/f + qgAA/6oAVf+qAKr/qgD//6oAAADUAFUA1ACqANQA/wDUAAAf1ABVH9QAqh/UAP8f1AAAP9QAVT/UAKo/ + 1AD/P9QAAF/UAFVf1ACqX9QA/1/UAAB/1ABVf9QAqn/UAP9/1AAAn9QAVZ/UAKqf1AD/n9QAAL/UAFW/ + 1ACqv9QA/7/UAADf1ABV39QAqt/UAP/f1AAA/9QAVf/UAKr/1AD//9QAVQD/AKoA/wAAH/8AVR//AKof + /wD/H/8AAD//AFU//wCqP/8A/z//AABf/wBVX/8Aql//AP9f/wAAf/8AVX//AKp//wD/f/8AAJ//AFWf + /wCqn/8A/5//AAC//wBVv/8Aqr//AP+//wAA3/8AVd//AKrf/wD/3/8AVf//AKr//wD/zMwA/8z/AP// + MwD//2YA//+ZAP//zAAAfwAAVX8AAKp/AAD/fwAAAJ8AAFWfAACqnwAA/58AAAC/AABVvwAAqr8AAP+/ + AAAA3wAAVd8AAKrfAAD/3wAAVf8AAKr/AAAAACoAVQAqAKoAKgD/ACoAAB8qAFUfKgCqHyoA/x8qAAA/ + KgBVPyoA8Pv/AKSgoACAgIAAAAD/AAD/AAAA//8A/wAAAAAAAAD//wAA////AP39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39qoYIqoYIhqoIqgiqCaoIqgiqhqqGhoYIhoYIqv39/f0I/f39 + /ar9/f39/YY2Ng4yDg4ODgoOCgoKCgqG/f39/Yb9/f39CP39/f39qjY7Ozs3Nzc3NjMSMjIOCqr9/f39 + qv39/f2G/f39/f0IN19fOzs3Nzc3NjcODg4KCP39/f0I/f39/ar9/f39/ao6X19fXzs7Ozc3NzY3NgqG + /f39/Yb9/f39CP39/f39hl9jY19jX187Ozs7Nzc3Dqr9/f39qv39/f2G/f39/f0IOodjh19jX19fXztf + OzcOCP39/f0ICAmqCAiqCKoICapfCYdjh2ODY19fXzs7Ow6q/f39/QhITEwoSCUoKSQoqmMJCYcJCWNj + Y2NfY19fNgj9/f39qkyZmZmYmJRwlCmqX19fXl9fX186WzY3Njc2gv39/f0JcJ2dmZmZlJmUJAmqCaoJ + hggIqggICKoIqggI/f39/YZwnp2dnZmZmJVMqnx8fHx8fFR8VHhUVFRUVKr9/f39CHChoZ2dnZ2ZmUwJ + fKSkxqSkxqSkpKSkpKBUCP39/f2qcKLDoqGdnZ2ZTKp8ysakxqSkxqSkxqSkpFSq/f39/QiUpqbDoqHE + nZ1Mq3ykqMakyqSkxqSkpKSkVAj9/f39hpTIyKbHoqGhoXAIfMrLpMqkxqSkxqTGpKRUqv39/f0IlMym + yKbIpcShcAh8y6jKpMqkxsqkpKSkxlQI/f39/aqUzMzMyKbIpqJwqnzLy8qpxsqkpMakxqSkeAj9/f39 + CJSUlJSUlJSUlJQJgMupy8qpysqkyqSkxqRUqv39/f2GCKoIqgiqCKoIhgigrcvPqcuoy8qkxsqkxnyG + /f39/ar9/f39/f39/f39qnzPz6nLy8uoyqnKpKTKVAj9/f39CP39/f39/f39/f0IfNDPz8+py8upyqjG + yqR8hv39/f2G/f39/f39/f39/Qik0K7P0M+ty8vLy6jKpXyq/f39/ar9/f39/f39/f39CHzQ09Ctz8/P + qcupy6jKeAj9/f39CP39/f39/f39/f2qoNPQ0NPQ0M/Qz8vLy6l8CP39/f2G/f39/f39/f39/QmkfKR8 + oHx8fHx8fHx8fHyG/f39/aoIqgiqCKoIqgiqCKoIqgiqCKoIqgiqCKoIqgj9/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3///////////// + ///AAAAD3vgAA974AAPe+AAD3vgAA974AAPe+AADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA + AAPAAAADwAAAA8AAAAPAAAADwAAAA9/4AAPf+AAD3/gAA9/4AAPf+AAD3/gAA8AAAAP//////////ygA + AAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAA + gACAgAAAgICAAMDcwADwyqYAqj8qAP8/KgAAXyoAVV8qAKpfKgD/XyoAAH8qAFV/KgCqfyoA/38qAACf + KgBVnyoAqp8qAP+fKgAAvyoAVb8qAKq/KgD/vyoAAN8qAFXfKgCq3yoA/98qAAD/KgBV/yoAqv8qAP// + KgAAAFUAVQBVAKoAVQD/AFUAAB9VAFUfVQCqH1UA/x9VAAA/VQBVP1UAqj9VAP8/VQAAX1UAVV9VAKpf + VQD/X1UAAH9VAFV/VQCqf1UA/39VAACfVQBVn1UAqp9VAP+fVQAAv1UAVb9VAKq/VQD/v1UAAN9VAFXf + VQCq31UA/99VAAD/VQBV/1UAqv9VAP//VQAAAH8AVQB/AKoAfwD/AH8AAB9/AFUffwCqH38A/x9/AAA/ + fwBVP38Aqj9/AP8/fwAAX38AVV9/AKpffwD/X38AAH9/AFV/fwCqf38A/39/AACffwBVn38Aqp9/AP+f + fwAAv38AVb9/AKq/fwD/v38AAN9/AFXffwCq338A/99/AAD/fwBV/38Aqv9/AP//fwAAAKoAVQCqAKoA + qgD/AKoAAB+qAFUfqgCqH6oA/x+qAAA/qgBVP6oAqj+qAP8/qgAAX6oAVV+qAKpfqgD/X6oAAH+qAFV/ + qgCqf6oA/3+qAACfqgBVn6oAqp+qAP+fqgAAv6oAVb+qAKq/qgD/v6oAAN+qAFXfqgCq36oA/9+qAAD/ + qgBV/6oAqv+qAP//qgAAANQAVQDUAKoA1AD/ANQAAB/UAFUf1ACqH9QA/x/UAAA/1ABVP9QAqj/UAP8/ + 1AAAX9QAVV/UAKpf1AD/X9QAAH/UAFV/1ACqf9QA/3/UAACf1ABVn9QAqp/UAP+f1AAAv9QAVb/UAKq/ + 1AD/v9QAAN/UAFXf1ACq39QA/9/UAAD/1ABV/9QAqv/UAP//1ABVAP8AqgD/AAAf/wBVH/8Aqh//AP8f + /wAAP/8AVT//AKo//wD/P/8AAF//AFVf/wCqX/8A/1//AAB//wBVf/8Aqn//AP9//wAAn/8AVZ//AKqf + /wD/n/8AAL//AFW//wCqv/8A/7//AADf/wBV3/8Aqt//AP/f/wBV//8Aqv//AP/MzAD/zP8A//8zAP// + ZgD//5kA///MAAB/AABVfwAAqn8AAP9/AAAAnwAAVZ8AAKqfAAD/nwAAAL8AAFW/AACqvwAA/78AAADf + AABV3wAAqt8AAP/fAABV/wAAqv8AAAAAKgBVACoAqgAqAP8AKgAAHyoAVR8qAKofKgD/HyoAAD8qAFU/ + KgDw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAAAAAAAP//AAD///8A/f39/f39/f39/f39/f39/f0I + hgiqCKoICKoICKaGCP39qv39hv2GNg4ODjII/ar9/Yb9/ar9qjdjXzsOCP2G/f0IhquGCAleCWNfNob9 + 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 + bv+3d0n/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/FRqE/0dN1v8/RNL/Nz3Q/y40zv8nLcz/ISfK/xwh + yf8WHMf/GxJh/8K/wf/gr3r/4K96/+Cvev/gr3r/3614/9yqdf/apnL/16Nw/9Sea//Rmmj/zZZk/8qR + X//GjFz/w4dW/7+CUv/Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf8SHZD/WF3a/05U1/9FS9X/PUPS/zU7 + 0P8uM83/JyzL/yAmyf8aFGn/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/ + wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/xAfnP9obt7/YGTc/1Zb + 2f9NU9f/RUrU/ztB0v80OdD/LDHO/xgWcv/Cv8H/Dn+n/w18pP8MeqH/DHie/wt1m/8Kc5j/CXGV/wlv + k/8JbJD/CGqN/wdpi/8HZ4j/BmWH/wZkhf8GYoP/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/DiKp/3l+ + 4/9vdeH/Zmze/11i2/9UWtn/S1HW/0NI1P86P9H/Fhh9/8K/wf8Ogar/Barp/wGo6P8Apef/AKPm/wCi + 5P8An+L/AJ7h/wCd3/8AnN7/AJnc/wCY2/8AmNn/AJbX/wZjhP/Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/ + wf8MJbX/iI7n/4CF5v93fOP/bnPg/2Vr3f9bYdv/UljY/0lP1v8UGoj/wr/B/w+Erf8Lrur/Bqvq/wOo + 6f8Apuf/AKTm/wCi5f8AoOT/AJ/i/wCd4f8AnN//AJrd/wCZ2/8AmNr/BmWH/8K/wf8AAAAAAAAAAAAA + AAAAAAAAwr/B/wkowP+WnOz/jpTq/4aL6P9+hOX/dXri/2xx4P9jaN3/WV/b/xEek//Cv8H/EIaw/xay + 7P8Or+z/Cavr/wWq6v8Bp+j/AKbn/wCj5f8AoeT/AJ/j/wCe4f8AnOD/AJve/wCa3f8HZ4n/wr/B/wAA + AAAAAAAAAAAAAAAAAADCv8H/CCrK/6Ko7/+coe7/lZrr/42T6f+Fiub/fIHl/3N54v9rcN//ECGg/8K/ + wf8QiLP/I7nu/xq07f8Ssez/C63r/war6v8Cqen/AKbo/wCk5v8AouX/AKHk/wCf4f8AneH/AJzf/who + i//Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf8GLNP/q7Hy/6as8P+hpu//mp/u/5OY6/+LkOj/g4nm/3qA + 5P8NI6z/wr/B/xCKtv8xvvD/J7rv/x627f8Vsuz/Dq/s/wmr6/8Equn/Aafo/wCl5/8Ao+X/AKHk/wCf + 4v8AnuH/CGqO/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/wUu2/+vtPP/r7Tz/6qv8v+mq/D/oKXv/5me + 7f+Sl+v/io/p/wsmt//Cv8H/Eo24/0HF8f82wfD/LLzv/yK47v8atO3/EbHs/wut6/8Gq+r/A6np/wCm + 6P8Apeb/AKLl/wCh5P8IbJD/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/BC/h/wQv3/8FL9z/BS3Z/wYt + 1v8GLNL/ByvP/wgqy/8IKcb/CSnC/8K/wf8Sjrv/Uszy/0fH8f87w/H/Mb7v/ye67/8et+7/FbPt/w6v + 6/8IrOv/BKnp/wGo6P8Apef/AKPl/wluk//Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf/Cv8H/wr/B/8K/ + wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/xKRvf9j0/P/WM/z/0zK8f9BxfH/N8Hw/yy8 + 7/8iuO7/GbTt/xGx7P8Lruv/Bqrq/wOo6f8Apuf/CnGV/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCv8H/E5LA/3Ta8/9q1fP/XtHz/1LM + 8v9Hx/H/O8Pw/zG+7/8nu+//Hrbt/xay7f8Or+v/CKzq/wSq6f8Kc5j/wr/B/wAAAAAAAAAAAAAAAAAA + AADCv8H/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMK/wf8UlMH/hOD1/3rc + 9f9v2PP/ZNTy/1jO8v9NyvH/Qsbx/zbB8P8svO//I7ju/xm07f8SsOz/C67r/wt2m//Cv8H/AAAAAAAA + AAAAAAAAAAAAAMK/wf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwr/B/xSW + w/+T5vb/iuL1/3/e9P912vT/adbz/13R8/9SzPL/R8jx/zzD8P8xvvD/J7rv/x627v8Vsuz/C3ie/8K/ + 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 + Edit or add a [Trojan] server diff --git a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs index 3f862d35..d6393c60 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs @@ -33,32 +33,6 @@ this.groupBox1 = new System.Windows.Forms.GroupBox(); this.btnGUID = new System.Windows.Forms.Button(); this.label13 = new System.Windows.Forms.Label(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.label25 = new System.Windows.Forms.Label(); - this.label24 = new System.Windows.Forms.Label(); - this.label23 = new System.Windows.Forms.Label(); - this.panTlsMore = new System.Windows.Forms.Panel(); - this.txtSNI = new System.Windows.Forms.TextBox(); - this.label22 = new System.Windows.Forms.Label(); - this.label21 = new System.Windows.Forms.Label(); - this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); - this.label9 = new System.Windows.Forms.Label(); - this.label20 = new System.Windows.Forms.Label(); - this.txtPath = new System.Windows.Forms.TextBox(); - this.cmbNetwork = new System.Windows.Forms.ComboBox(); - this.label7 = new System.Windows.Forms.Label(); - this.label19 = new System.Windows.Forms.Label(); - this.label18 = new System.Windows.Forms.Label(); - this.label17 = new System.Windows.Forms.Label(); - this.label16 = new System.Windows.Forms.Label(); - this.label14 = new System.Windows.Forms.Label(); - this.label15 = new System.Windows.Forms.Label(); - this.cmbStreamSecurity = new System.Windows.Forms.ComboBox(); - this.label12 = new System.Windows.Forms.Label(); - this.txtRequestHost = new System.Windows.Forms.TextBox(); - this.label11 = new System.Windows.Forms.Label(); - this.label10 = new System.Windows.Forms.Label(); - this.cmbHeaderType = new System.Windows.Forms.ComboBox(); this.label8 = new System.Windows.Forms.Label(); this.cmbSecurity = new System.Windows.Forms.ComboBox(); this.txtRemarks = new System.Windows.Forms.TextBox(); @@ -81,11 +55,12 @@ this.MenuItemImportServer = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.MenuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.panel3 = new System.Windows.Forms.Panel(); + this.transportControl = new v2rayN.Forms.ServerTransportControl(); this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.panTlsMore.SuspendLayout(); this.panel2.SuspendLayout(); this.menuServer.SuspendLayout(); + this.panel3.SuspendLayout(); this.SuspendLayout(); // // btnClose @@ -100,7 +75,6 @@ // this.groupBox1.Controls.Add(this.btnGUID); this.groupBox1.Controls.Add(this.label13); - this.groupBox1.Controls.Add(this.groupBox2); this.groupBox1.Controls.Add(this.label8); this.groupBox1.Controls.Add(this.cmbSecurity); this.groupBox1.Controls.Add(this.txtRemarks); @@ -130,194 +104,6 @@ resources.ApplyResources(this.label13, "label13"); this.label13.Name = "label13"; // - // groupBox2 - // - this.groupBox2.Controls.Add(this.label25); - this.groupBox2.Controls.Add(this.label24); - this.groupBox2.Controls.Add(this.label23); - this.groupBox2.Controls.Add(this.panTlsMore); - this.groupBox2.Controls.Add(this.label9); - this.groupBox2.Controls.Add(this.label20); - this.groupBox2.Controls.Add(this.txtPath); - this.groupBox2.Controls.Add(this.cmbNetwork); - this.groupBox2.Controls.Add(this.label7); - this.groupBox2.Controls.Add(this.label19); - this.groupBox2.Controls.Add(this.label18); - this.groupBox2.Controls.Add(this.label17); - this.groupBox2.Controls.Add(this.label16); - this.groupBox2.Controls.Add(this.label14); - this.groupBox2.Controls.Add(this.label15); - this.groupBox2.Controls.Add(this.cmbStreamSecurity); - this.groupBox2.Controls.Add(this.label12); - this.groupBox2.Controls.Add(this.txtRequestHost); - this.groupBox2.Controls.Add(this.label11); - this.groupBox2.Controls.Add(this.label10); - this.groupBox2.Controls.Add(this.cmbHeaderType); - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; - // - // label25 - // - resources.ApplyResources(this.label25, "label25"); - this.label25.Name = "label25"; - // - // label24 - // - resources.ApplyResources(this.label24, "label24"); - this.label24.Name = "label24"; - // - // label23 - // - resources.ApplyResources(this.label23, "label23"); - this.label23.Name = "label23"; - // - // panTlsMore - // - this.panTlsMore.Controls.Add(this.txtSNI); - this.panTlsMore.Controls.Add(this.label22); - this.panTlsMore.Controls.Add(this.label21); - this.panTlsMore.Controls.Add(this.cmbAllowInsecure); - resources.ApplyResources(this.panTlsMore, "panTlsMore"); - this.panTlsMore.Name = "panTlsMore"; - // - // txtSNI - // - resources.ApplyResources(this.txtSNI, "txtSNI"); - this.txtSNI.Name = "txtSNI"; - // - // label22 - // - resources.ApplyResources(this.label22, "label22"); - this.label22.Name = "label22"; - // - // label21 - // - resources.ApplyResources(this.label21, "label21"); - this.label21.Name = "label21"; - // - // cmbAllowInsecure - // - this.cmbAllowInsecure.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbAllowInsecure.FormattingEnabled = true; - this.cmbAllowInsecure.Items.AddRange(new object[] { - resources.GetString("cmbAllowInsecure.Items"), - resources.GetString("cmbAllowInsecure.Items1"), - resources.GetString("cmbAllowInsecure.Items2")}); - resources.ApplyResources(this.cmbAllowInsecure, "cmbAllowInsecure"); - this.cmbAllowInsecure.Name = "cmbAllowInsecure"; - // - // label9 - // - resources.ApplyResources(this.label9, "label9"); - this.label9.Name = "label9"; - // - // label20 - // - resources.ApplyResources(this.label20, "label20"); - this.label20.Name = "label20"; - // - // txtPath - // - resources.ApplyResources(this.txtPath, "txtPath"); - this.txtPath.Name = "txtPath"; - // - // cmbNetwork - // - this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbNetwork.FormattingEnabled = true; - this.cmbNetwork.Items.AddRange(new object[] { - resources.GetString("cmbNetwork.Items"), - resources.GetString("cmbNetwork.Items1"), - resources.GetString("cmbNetwork.Items2"), - resources.GetString("cmbNetwork.Items3"), - resources.GetString("cmbNetwork.Items4"), - resources.GetString("cmbNetwork.Items5")}); - resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); - this.cmbNetwork.Name = "cmbNetwork"; - this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); - // - // label7 - // - resources.ApplyResources(this.label7, "label7"); - this.label7.Name = "label7"; - // - // label19 - // - resources.ApplyResources(this.label19, "label19"); - this.label19.Name = "label19"; - // - // label18 - // - resources.ApplyResources(this.label18, "label18"); - this.label18.Name = "label18"; - // - // label17 - // - resources.ApplyResources(this.label17, "label17"); - this.label17.Name = "label17"; - // - // label16 - // - resources.ApplyResources(this.label16, "label16"); - this.label16.Name = "label16"; - // - // label14 - // - resources.ApplyResources(this.label14, "label14"); - this.label14.Name = "label14"; - // - // label15 - // - resources.ApplyResources(this.label15, "label15"); - this.label15.Name = "label15"; - // - // cmbStreamSecurity - // - this.cmbStreamSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbStreamSecurity.FormattingEnabled = true; - this.cmbStreamSecurity.Items.AddRange(new object[] { - resources.GetString("cmbStreamSecurity.Items"), - resources.GetString("cmbStreamSecurity.Items1")}); - resources.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); - this.cmbStreamSecurity.Name = "cmbStreamSecurity"; - this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged); - // - // label12 - // - resources.ApplyResources(this.label12, "label12"); - this.label12.Name = "label12"; - // - // txtRequestHost - // - resources.ApplyResources(this.txtRequestHost, "txtRequestHost"); - this.txtRequestHost.Name = "txtRequestHost"; - // - // label11 - // - resources.ApplyResources(this.label11, "label11"); - this.label11.Name = "label11"; - // - // label10 - // - resources.ApplyResources(this.label10, "label10"); - this.label10.Name = "label10"; - // - // cmbHeaderType - // - this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbHeaderType.FormattingEnabled = true; - this.cmbHeaderType.Items.AddRange(new object[] { - resources.GetString("cmbHeaderType.Items"), - resources.GetString("cmbHeaderType.Items1"), - resources.GetString("cmbHeaderType.Items2"), - resources.GetString("cmbHeaderType.Items3"), - resources.GetString("cmbHeaderType.Items4"), - resources.GetString("cmbHeaderType.Items5"), - resources.GetString("cmbHeaderType.Items6")}); - resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); - this.cmbHeaderType.Name = "cmbHeaderType"; - // // label8 // resources.ApplyResources(this.label8, "label8"); @@ -450,12 +236,25 @@ resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); this.MenuItemImportClipboard.Click += new System.EventHandler(this.MenuItemImportClipboard_Click); // + // panel3 + // + this.panel3.Controls.Add(this.transportControl); + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Name = "panel3"; + // + // transportControl + // + this.transportControl.AllowXtls = false; + resources.ApplyResources(this.transportControl, "transportControl"); + this.transportControl.Name = "transportControl"; + // // AddServerForm // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnClose; this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel3); this.Controls.Add(this.panel2); this.Controls.Add(this.panel1); this.Controls.Add(this.menuServer); @@ -464,13 +263,10 @@ this.Load += new System.EventHandler(this.AddServerForm_Load); this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.panTlsMore.ResumeLayout(false); - this.panTlsMore.PerformLayout(); this.panel2.ResumeLayout(false); this.menuServer.ResumeLayout(false); this.menuServer.PerformLayout(); + this.panel3.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -493,42 +289,18 @@ private System.Windows.Forms.TextBox txtAddress; private System.Windows.Forms.Label label1; private System.Windows.Forms.ComboBox cmbSecurity; - private System.Windows.Forms.ComboBox cmbNetwork; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.Label label9; private System.Windows.Forms.Label label8; private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.TextBox txtRequestHost; - private System.Windows.Forms.Label label10; - private System.Windows.Forms.Label label11; - private System.Windows.Forms.ComboBox cmbHeaderType; - private System.Windows.Forms.Label label12; - private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.Label label13; private System.Windows.Forms.MenuStrip menuServer; private System.Windows.Forms.ToolStripMenuItem MenuItem1; private System.Windows.Forms.ToolStripMenuItem MenuItemImportClient; private System.Windows.Forms.ToolStripMenuItem MenuItemImportServer; - private System.Windows.Forms.Label label15; - private System.Windows.Forms.ComboBox cmbStreamSecurity; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripMenuItem MenuItemImportClipboard; private System.Windows.Forms.Button btnGUID; - private System.Windows.Forms.Label label16; - private System.Windows.Forms.Label label14; - private System.Windows.Forms.Label label17; - private System.Windows.Forms.Label label18; - private System.Windows.Forms.Label label19; - private System.Windows.Forms.TextBox txtPath; - private System.Windows.Forms.Label label20; - private System.Windows.Forms.Label label21; - private System.Windows.Forms.ComboBox cmbAllowInsecure; - private System.Windows.Forms.Panel panTlsMore; - private System.Windows.Forms.Label label24; - private System.Windows.Forms.Label label23; - private System.Windows.Forms.Label label22; - private System.Windows.Forms.TextBox txtSNI; - private System.Windows.Forms.Label label25; + private System.Windows.Forms.Panel panel3; + private ServerTransportControl transportControl; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index a7de10ad..fe344d8e 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -37,15 +37,9 @@ namespace v2rayN.Forms txtId.Text = vmessItem.id; txtAlterId.Text = vmessItem.alterId.ToString(); cmbSecurity.Text = vmessItem.security; - cmbNetwork.Text = vmessItem.network; txtRemarks.Text = vmessItem.remarks; - cmbHeaderType.Text = vmessItem.headerType; - txtRequestHost.Text = vmessItem.requestHost; - txtPath.Text = vmessItem.path; - cmbStreamSecurity.Text = vmessItem.streamSecurity; - cmbAllowInsecure.Text = vmessItem.allowInsecure; - txtSNI.Text = vmessItem.sni; + transportControl.BindingServer(vmessItem); } @@ -59,63 +53,11 @@ namespace v2rayN.Forms txtId.Text = ""; txtAlterId.Text = "0"; cmbSecurity.Text = Global.DefaultSecurity; - cmbNetwork.Text = Global.DefaultNetwork; txtRemarks.Text = ""; - cmbHeaderType.Text = Global.None; - txtRequestHost.Text = ""; - cmbStreamSecurity.Text = ""; - cmbAllowInsecure.Text = ""; - txtPath.Text = ""; - txtSNI.Text = ""; + transportControl.ClearServer(vmessItem); } - - - private void cmbNetwork_SelectedIndexChanged(object sender, EventArgs e) - { - SetHeaderType(); - } - - /// - /// 设置伪装选项 - /// - private void SetHeaderType() - { - cmbHeaderType.Items.Clear(); - - string network = cmbNetwork.Text; - if (Utils.IsNullOrEmpty(network)) - { - cmbHeaderType.Items.Add(Global.None); - return; - } - - if (network.Equals(Global.DefaultNetwork)) - { - cmbHeaderType.Items.Add(Global.None); - cmbHeaderType.Items.Add(Global.TcpHeaderHttp); - } - else if (network.Equals("kcp") || network.Equals("quic")) - { - cmbHeaderType.Items.Add(Global.None); - cmbHeaderType.Items.Add("srtp"); - cmbHeaderType.Items.Add("utp"); - cmbHeaderType.Items.Add("wechat-video"); - cmbHeaderType.Items.Add("dtls"); - cmbHeaderType.Items.Add("wireguard"); - } - else if (network.Equals("grpc")) - { - cmbHeaderType.Items.Add(Global.GrpcgunMode); - cmbHeaderType.Items.Add(Global.GrpcmultiMode); - } - else - { - cmbHeaderType.Items.Add(Global.None); - } - cmbHeaderType.SelectedIndex = 0; - } - + private void btnOK_Click(object sender, EventArgs e) { string address = txtAddress.Text; @@ -123,16 +65,8 @@ namespace v2rayN.Forms string id = txtId.Text; string alterId = txtAlterId.Text; string security = cmbSecurity.Text; - string network = cmbNetwork.Text; string remarks = txtRemarks.Text; - string headerType = cmbHeaderType.Text; - string requestHost = txtRequestHost.Text; - string path = txtPath.Text; - string streamSecurity = cmbStreamSecurity.Text; - string allowInsecure = cmbAllowInsecure.Text; - string sni = txtSNI.Text; - if (Utils.IsNullOrEmpty(address)) { UI.Show(UIRes.I18N("FillServerAddress")); @@ -154,21 +88,15 @@ namespace v2rayN.Forms return; } + transportControl.EndBindingServer(); + vmessItem.address = address; vmessItem.port = Utils.ToInt(port); vmessItem.id = id; vmessItem.alterId = Utils.ToInt(alterId); vmessItem.security = security; - vmessItem.network = network; vmessItem.remarks = remarks; - vmessItem.headerType = headerType; - vmessItem.requestHost = requestHost.Replace(" ", ""); - vmessItem.path = path.Replace(" ", ""); - vmessItem.streamSecurity = streamSecurity; - vmessItem.allowInsecure = allowInsecure; - vmessItem.sni = sni; - if (ConfigHandler.AddServer(ref config, vmessItem, EditIndex) == 0) { this.DialogResult = DialogResult.OK; @@ -189,19 +117,6 @@ namespace v2rayN.Forms this.DialogResult = DialogResult.Cancel; } - private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e) - { - string security = cmbStreamSecurity.Text; - if (Utils.IsNullOrEmpty(security)) - { - panTlsMore.Hide(); - } - else - { - panTlsMore.Show(); - } - } - #region 导入客户端/服务端配置 /// @@ -243,31 +158,29 @@ namespace v2rayN.Forms return; } string msg; - VmessItem vmessItem; + VmessItem vmessItemTemp; if (type.Equals(1)) { - vmessItem = V2rayConfigHandler.ImportFromClientConfig(fileName, out msg); + vmessItemTemp = V2rayConfigHandler.ImportFromClientConfig(fileName, out msg); } else { - vmessItem = V2rayConfigHandler.ImportFromServerConfig(fileName, out msg); + vmessItemTemp = V2rayConfigHandler.ImportFromServerConfig(fileName, out msg); } - if (vmessItem == null) + if (vmessItemTemp == null) { UI.ShowWarning(msg); return; } + vmessItem = vmessItemTemp; txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); txtId.Text = vmessItem.id; txtAlterId.Text = vmessItem.alterId.ToString(); txtRemarks.Text = vmessItem.remarks; - cmbNetwork.Text = vmessItem.network; - cmbHeaderType.Text = vmessItem.headerType; - txtRequestHost.Text = vmessItem.requestHost; - txtPath.Text = vmessItem.path; - cmbStreamSecurity.Text = vmessItem.streamSecurity; + + transportControl.BindingServer(vmessItem); } /// @@ -279,23 +192,21 @@ namespace v2rayN.Forms { ClearServer(); - VmessItem vmessItem = ShareHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); - if (vmessItem == null) + VmessItem vmessItemTemp = ShareHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); + if (vmessItemTemp == null) { UI.ShowWarning(msg); return; } + vmessItem = vmessItemTemp; txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); txtId.Text = vmessItem.id; txtAlterId.Text = vmessItem.alterId.ToString(); txtRemarks.Text = vmessItem.remarks; - cmbNetwork.Text = vmessItem.network; - cmbHeaderType.Text = vmessItem.headerType; - txtRequestHost.Text = vmessItem.requestHost; - txtPath.Text = vmessItem.path; - cmbStreamSecurity.Text = vmessItem.streamSecurity; + + transportControl.BindingServer(vmessItem); } #endregion diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index a13e5ab4..82469f68 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -194,733 +194,6 @@ 1 - - True - - - - NoControl - - - 529, 211 - - - 113, 12 - - - 36 - - - 4)grpc serviceName - - - label25 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - True - - - NoControl - - - 529, 197 - - - 119, 12 - - - 35 - - - 3)QUIC key/Kcp seed - - - label24 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - True - - - NoControl - - - 465, 146 - - - 89, 12 - - - 34 - - - 4)QUIC securty - - - label23 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 2 - - - 300, 7 - - - 197, 21 - - - 33 - - - txtSNI - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 0 - - - True - - - NoControl - - - 270, 11 - - - 23, 12 - - - 32 - - - SNI - - - label22 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 1 - - - True - - - 12, 11 - - - 83, 12 - - - 31 - - - allowInsecure - - - label21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 2 - - - - - - true - - - false - - - 100, 7 - - - 80, 20 - - - 30 - - - cmbAllowInsecure - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 3 - - - 200, 234 - - - 500, 35 - - - 33 - - - panTlsMore - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 3 - - - True - - - 350, 32 - - - 113, 12 - - - 15 - - - *Default value tcp - - - label9 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 4 - - - True - - - 464, 130 - - - 203, 12 - - - 29 - - - 3)h2 host Separated by commas (,) - - - label20 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 5 - - - 127, 169 - - - True - - - 396, 54 - - - 28 - - - txtPath - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 6 - - - tcp - - - kcp - - - ws - - - h2 - - - quic - - - grpc - - - 192, 28 - - - 143, 20 - - - 12 - - - cmbNetwork - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 7 - - - True - - - 9, 32 - - - 167, 12 - - - 13 - - - Transport protocol(network) - - - label7 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 8 - - - True - - - 9, 169 - - - 29, 12 - - - 27 - - - Path - - - label19 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 9 - - - True - - - 529, 183 - - - 59, 12 - - - 26 - - - 2)h2 path - - - label18 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 10 - - - True - - - 464, 115 - - - 59, 12 - - - 25 - - - 2)ws host - - - label17 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 11 - - - True - - - 529, 169 - - - 59, 12 - - - 24 - - - 1)ws path - - - label16 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 12 - - - True - - - 464, 100 - - - 215, 12 - - - 23 - - - 1)http host Separated by commas (,) - - - label14 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 13 - - - True - - - 9, 243 - - - 23, 12 - - - 22 - - - TLS - - - label15 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 14 - - - - - - tls - - - 127, 239 - - - 60, 20 - - - 21 - - - cmbStreamSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 15 - - - True - - - 282, 66 - - - 293, 12 - - - 20 - - - *tcp or kcp or QUIC camouflage type or grpc mode - - - label12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 16 - - - 158, 100 - - - True - - - 300, 53 - - - 16 - - - txtRequestHost - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 17 - - - True - - - 9, 66 - - - 95, 12 - - - 19 - - - Camouflage type - - - label11 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 18 - - - True - - - 9, 100 - - - 143, 12 - - - 17 - - - Camouflage domain(host) - - - label10 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 19 - - - none - - - http - - - srtp - - - utp - - - wechat-video - - - dtls - - - wireguard - - - 127, 64 - - - 143, 20 - - - 18 - - - cmbHeaderType - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 20 - - - Bottom - - - 3, 215 - - - 723, 281 - - - 21 - - - Transport - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - True @@ -946,7 +219,7 @@ groupBox1 - 3 + 2 aes-128-gcm @@ -970,7 +243,7 @@ 210, 20 - 6 + 4 cmbSecurity @@ -982,7 +255,7 @@ groupBox1 - 4 + 3 127, 171 @@ -991,7 +264,7 @@ 278, 21 - 11 + 5 txtRemarks @@ -1003,7 +276,7 @@ groupBox1 - 5 + 4 True @@ -1030,7 +303,7 @@ groupBox1 - 6 + 5 True @@ -1057,7 +330,7 @@ groupBox1 - 7 + 6 127, 114 @@ -1066,7 +339,7 @@ 143, 21 - 7 + 3 txtAlterId @@ -1078,7 +351,7 @@ groupBox1 - 8 + 7 True @@ -1105,7 +378,7 @@ groupBox1 - 9 + 8 127, 85 @@ -1114,7 +387,7 @@ 278, 21 - 5 + 2 txtId @@ -1126,7 +399,7 @@ groupBox1 - 10 + 9 True @@ -1153,7 +426,7 @@ groupBox1 - 11 + 10 127, 56 @@ -1162,7 +435,7 @@ 143, 21 - 3 + 1 txtPort @@ -1174,7 +447,7 @@ groupBox1 - 12 + 11 True @@ -1201,7 +474,7 @@ groupBox1 - 13 + 12 127, 27 @@ -1210,7 +483,7 @@ 359, 21 - 1 + 0 txtAddress @@ -1222,7 +495,7 @@ groupBox1 - 14 + 13 True @@ -1249,8 +522,9 @@ groupBox1 - 15 + 14 + Fill @@ -1258,7 +532,7 @@ 0, 35 - 729, 499 + 729, 219 3 @@ -1306,7 +580,7 @@ Bottom - 0, 534 + 0, 474 729, 60 @@ -1324,7 +598,7 @@ $this - 1 + 2 Top @@ -1348,7 +622,7 @@ $this - 2 + 3 17, 17 @@ -1399,7 +673,55 @@ $this - 3 + 4 + + + Fill + + + 0, 0 + + + 729, 220 + + + 0 + + + transportControl + + + v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + panel3 + + + 0 + + + Bottom + + + 0, 254 + + + 729, 220 + + + 9 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 True @@ -1411,7 +733,7 @@ 6, 12 - 729, 594 + 729, 534 Edit or add a [VMess] server diff --git a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx index a8f9b0ae..47b4d4cd 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx @@ -130,21 +130,12 @@ 149, 12 - - 3)QUIC 加密密钥/Kcp seed - 95, 12 - - 4)QUIC 加密方式 - 167, 12 - - 跳过证书验证(allowInsecure) - 180, 7 @@ -154,15 +145,9 @@ 143, 12 - - *默认tcp,选错会无法连接 - 149, 12 - - 3)h2 host中间逗号(,)隔开 - 127, 168 @@ -178,33 +163,21 @@ 107, 12 - - 传输协议(network) - 9, 168 65, 12 - - 路径(path) - 161, 12 - - 1)http host中间逗号(,)隔开 - 9, 237 107, 12 - - 底层传输安全(tls) - 127, 237 @@ -214,9 +187,6 @@ 197, 12 - - *tcp或kcp或QUIC伪装类型或grpc模式 - 127, 102 @@ -229,24 +199,15 @@ 89, 12 - - 伪装类型(type) - 9, 102 89, 12 - - 伪装域名(host) - 127, 67 - - 底层传输方式(transport) - 113, 12 diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx index caef34ad..481e5f26 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx @@ -171,8 +171,8 @@ panel1 - - $this + + 3 75, 23 @@ -267,8 +267,8 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 47, 12 + + 8 txtCustomIcon @@ -292,7 +292,7 @@ 95, 21 - 128*128 + PNG(128*128) panel1 @@ -324,8 +324,8 @@ cmsLv - - 8 + + 5 Add @@ -342,8 +342,8 @@ tabPage2 - - toolStripMenuItem1 + + 644, 48 menuMoveBottom @@ -375,8 +375,8 @@ RoutingRuleSettingForm - - panel2 + + 166, 21 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -390,6 +390,9 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuServer + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -402,6 +405,9 @@ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + btnClose + Up (U) @@ -411,9 +417,6 @@ btnOK - - 53, 12 - 47, 12 @@ -432,14 +435,11 @@ $this - - panel2 - 3, 3 - 18, 117 + 10, 117 menuImportRulesFromClipboard @@ -480,6 +480,9 @@ 660, 104 + + $this + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -500,14 +503,11 @@ 34 - - 36 - 2 - - 247, 22 + + 1 label4 @@ -521,8 +521,8 @@ True - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 247, 22 panel2 @@ -545,18 +545,15 @@ 91, 45 - - 166, 21 - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 644, 48 - menuMoveDown + + panel2 + 202, 22 @@ -575,8 +572,8 @@ 11 - - 3 + + panel2 7 @@ -590,9 +587,6 @@ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 5 - panel1 @@ -620,6 +614,9 @@ RuleList + + toolStripMenuItem1 + 563, 21 @@ -629,8 +626,8 @@ Select All (Ctrl+A) - - btnClose + + 53, 12 Fill @@ -653,8 +650,8 @@ Export Selected Rules - - menuServer + + 36 91, 13 @@ -728,6 +725,9 @@ NoControl + + 77, 12 + 0 @@ -755,8 +755,8 @@ txtRemarks - - 1 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx index d6544331..6c7dcd5f 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx @@ -136,6 +136,9 @@ 670, 104 + + 浏览(&B) + 101, 105 diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs new file mode 100644 index 00000000..db395e1e --- /dev/null +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs @@ -0,0 +1,243 @@ +namespace v2rayN.Forms +{ + partial class ServerTransportControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServerTransportControl)); + this.gbTransport = new System.Windows.Forms.GroupBox(); + this.panTlsMore = new System.Windows.Forms.Panel(); + this.txtSNI = new System.Windows.Forms.TextBox(); + this.labSNI = new System.Windows.Forms.Label(); + this.labAllowInsecure = new System.Windows.Forms.Label(); + this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); + this.tipNetwork = new System.Windows.Forms.Label(); + this.txtPath = new System.Windows.Forms.TextBox(); + this.cmbNetwork = new System.Windows.Forms.ComboBox(); + this.labNetwork = new System.Windows.Forms.Label(); + this.labPath = new System.Windows.Forms.Label(); + this.tipPath = new System.Windows.Forms.Label(); + this.tipRequestHost = new System.Windows.Forms.Label(); + this.labStreamSecurity = new System.Windows.Forms.Label(); + this.cmbStreamSecurity = new System.Windows.Forms.ComboBox(); + this.tipHeaderType = new System.Windows.Forms.Label(); + this.txtRequestHost = new System.Windows.Forms.TextBox(); + this.labHeaderType = new System.Windows.Forms.Label(); + this.labRequestHost = new System.Windows.Forms.Label(); + this.cmbHeaderType = new System.Windows.Forms.ComboBox(); + this.gbTransport.SuspendLayout(); + this.panTlsMore.SuspendLayout(); + this.SuspendLayout(); + // + // gbTransport + // + this.gbTransport.Controls.Add(this.panTlsMore); + this.gbTransport.Controls.Add(this.tipNetwork); + this.gbTransport.Controls.Add(this.txtPath); + this.gbTransport.Controls.Add(this.cmbNetwork); + this.gbTransport.Controls.Add(this.labNetwork); + this.gbTransport.Controls.Add(this.labPath); + this.gbTransport.Controls.Add(this.tipPath); + this.gbTransport.Controls.Add(this.tipRequestHost); + this.gbTransport.Controls.Add(this.labStreamSecurity); + this.gbTransport.Controls.Add(this.cmbStreamSecurity); + this.gbTransport.Controls.Add(this.tipHeaderType); + this.gbTransport.Controls.Add(this.txtRequestHost); + this.gbTransport.Controls.Add(this.labHeaderType); + this.gbTransport.Controls.Add(this.labRequestHost); + this.gbTransport.Controls.Add(this.cmbHeaderType); + resources.ApplyResources(this.gbTransport, "gbTransport"); + this.gbTransport.Name = "gbTransport"; + this.gbTransport.TabStop = false; + // + // panTlsMore + // + this.panTlsMore.Controls.Add(this.txtSNI); + this.panTlsMore.Controls.Add(this.labSNI); + this.panTlsMore.Controls.Add(this.labAllowInsecure); + this.panTlsMore.Controls.Add(this.cmbAllowInsecure); + resources.ApplyResources(this.panTlsMore, "panTlsMore"); + this.panTlsMore.Name = "panTlsMore"; + // + // txtSNI + // + resources.ApplyResources(this.txtSNI, "txtSNI"); + this.txtSNI.Name = "txtSNI"; + // + // labSNI + // + resources.ApplyResources(this.labSNI, "labSNI"); + this.labSNI.Name = "labSNI"; + // + // labAllowInsecure + // + resources.ApplyResources(this.labAllowInsecure, "labAllowInsecure"); + this.labAllowInsecure.Name = "labAllowInsecure"; + // + // cmbAllowInsecure + // + this.cmbAllowInsecure.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbAllowInsecure.FormattingEnabled = true; + this.cmbAllowInsecure.Items.AddRange(new object[] { + resources.GetString("cmbAllowInsecure.Items"), + resources.GetString("cmbAllowInsecure.Items1"), + resources.GetString("cmbAllowInsecure.Items2")}); + resources.ApplyResources(this.cmbAllowInsecure, "cmbAllowInsecure"); + this.cmbAllowInsecure.Name = "cmbAllowInsecure"; + // + // tipNetwork + // + resources.ApplyResources(this.tipNetwork, "tipNetwork"); + this.tipNetwork.Name = "tipNetwork"; + // + // txtPath + // + resources.ApplyResources(this.txtPath, "txtPath"); + this.txtPath.Name = "txtPath"; + // + // cmbNetwork + // + this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbNetwork.FormattingEnabled = true; + this.cmbNetwork.Items.AddRange(new object[] { + resources.GetString("cmbNetwork.Items"), + resources.GetString("cmbNetwork.Items1"), + resources.GetString("cmbNetwork.Items2"), + resources.GetString("cmbNetwork.Items3"), + resources.GetString("cmbNetwork.Items4"), + resources.GetString("cmbNetwork.Items5")}); + resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); + this.cmbNetwork.Name = "cmbNetwork"; + this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); + // + // labNetwork + // + resources.ApplyResources(this.labNetwork, "labNetwork"); + this.labNetwork.Name = "labNetwork"; + // + // labPath + // + resources.ApplyResources(this.labPath, "labPath"); + this.labPath.Name = "labPath"; + // + // tipPath + // + resources.ApplyResources(this.tipPath, "tipPath"); + this.tipPath.Name = "tipPath"; + // + // tipRequestHost + // + resources.ApplyResources(this.tipRequestHost, "tipRequestHost"); + this.tipRequestHost.Name = "tipRequestHost"; + // + // labStreamSecurity + // + resources.ApplyResources(this.labStreamSecurity, "labStreamSecurity"); + this.labStreamSecurity.Name = "labStreamSecurity"; + // + // cmbStreamSecurity + // + this.cmbStreamSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbStreamSecurity.FormattingEnabled = true; + resources.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); + this.cmbStreamSecurity.Name = "cmbStreamSecurity"; + this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged); + // + // tipHeaderType + // + resources.ApplyResources(this.tipHeaderType, "tipHeaderType"); + this.tipHeaderType.Name = "tipHeaderType"; + // + // txtRequestHost + // + resources.ApplyResources(this.txtRequestHost, "txtRequestHost"); + this.txtRequestHost.Name = "txtRequestHost"; + // + // labHeaderType + // + resources.ApplyResources(this.labHeaderType, "labHeaderType"); + this.labHeaderType.Name = "labHeaderType"; + // + // labRequestHost + // + resources.ApplyResources(this.labRequestHost, "labRequestHost"); + this.labRequestHost.Name = "labRequestHost"; + // + // cmbHeaderType + // + this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbHeaderType.FormattingEnabled = true; + this.cmbHeaderType.Items.AddRange(new object[] { + resources.GetString("cmbHeaderType.Items"), + resources.GetString("cmbHeaderType.Items1"), + resources.GetString("cmbHeaderType.Items2"), + resources.GetString("cmbHeaderType.Items3"), + resources.GetString("cmbHeaderType.Items4"), + resources.GetString("cmbHeaderType.Items5"), + resources.GetString("cmbHeaderType.Items6")}); + resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); + this.cmbHeaderType.Name = "cmbHeaderType"; + // + // ServerTransportControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.gbTransport); + this.Name = "ServerTransportControl"; + this.Load += new System.EventHandler(this.ServerTransportControl_Load); + this.gbTransport.ResumeLayout(false); + this.gbTransport.PerformLayout(); + this.panTlsMore.ResumeLayout(false); + this.panTlsMore.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox gbTransport; + private System.Windows.Forms.Panel panTlsMore; + private System.Windows.Forms.TextBox txtSNI; + private System.Windows.Forms.Label labSNI; + private System.Windows.Forms.Label labAllowInsecure; + private System.Windows.Forms.ComboBox cmbAllowInsecure; + private System.Windows.Forms.Label tipNetwork; + private System.Windows.Forms.TextBox txtPath; + private System.Windows.Forms.ComboBox cmbNetwork; + private System.Windows.Forms.Label labNetwork; + private System.Windows.Forms.Label labPath; + private System.Windows.Forms.Label tipPath; + private System.Windows.Forms.Label tipRequestHost; + private System.Windows.Forms.Label labStreamSecurity; + private System.Windows.Forms.ComboBox cmbStreamSecurity; + private System.Windows.Forms.Label tipHeaderType; + private System.Windows.Forms.TextBox txtRequestHost; + private System.Windows.Forms.Label labHeaderType; + private System.Windows.Forms.Label labRequestHost; + private System.Windows.Forms.ComboBox cmbHeaderType; + } +} diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.cs new file mode 100644 index 00000000..40c6a9c5 --- /dev/null +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.cs @@ -0,0 +1,179 @@ +using System; +using System.Windows.Forms; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class ServerTransportControl : UserControl + { + public bool AllowXtls { get; set; } + private VmessItem vmessItem = null; + + public ServerTransportControl() + { + InitializeComponent(); + } + private void ServerTransportControl_Load(object sender, EventArgs e) + { + } + + private void Init(VmessItem item) + { + vmessItem = item; + + cmbStreamSecurity.Items.Clear(); + cmbStreamSecurity.Items.Add(string.Empty); + cmbStreamSecurity.Items.Add(Global.StreamSecurity); + if (AllowXtls) + { + cmbStreamSecurity.Items.Add(Global.StreamSecurityX); + } + } + + public void BindingServer(VmessItem item) + { + Init(item); + + cmbNetwork.Text = vmessItem.network; + cmbHeaderType.Text = vmessItem.headerType; + txtRequestHost.Text = vmessItem.requestHost; + txtPath.Text = vmessItem.path; + cmbStreamSecurity.Text = vmessItem.streamSecurity; + cmbAllowInsecure.Text = vmessItem.allowInsecure; + txtSNI.Text = vmessItem.sni; + } + + public void ClearServer(VmessItem item) + { + Init(item); + + cmbNetwork.Text = Global.DefaultNetwork; + cmbHeaderType.Text = Global.None; + txtRequestHost.Text = ""; + cmbStreamSecurity.Text = ""; + cmbAllowInsecure.Text = ""; + txtPath.Text = ""; + txtSNI.Text = ""; + } + + public void EndBindingServer() + { + string network = cmbNetwork.Text; + string headerType = cmbHeaderType.Text; + string requestHost = txtRequestHost.Text; + string path = txtPath.Text; + string streamSecurity = cmbStreamSecurity.Text; + string allowInsecure = cmbAllowInsecure.Text; + string sni = txtSNI.Text; + + vmessItem.network = network; + vmessItem.headerType = headerType; + vmessItem.requestHost = requestHost.Replace(" ", ""); + vmessItem.path = path.Replace(" ", ""); + vmessItem.streamSecurity = streamSecurity; + vmessItem.allowInsecure = allowInsecure; + vmessItem.sni = sni; + } + + private void cmbNetwork_SelectedIndexChanged(object sender, EventArgs e) + { + SetHeaderType(); + SetTips(); + } + + private void SetHeaderType() + { + cmbHeaderType.Items.Clear(); + + string network = cmbNetwork.Text; + if (Utils.IsNullOrEmpty(network)) + { + cmbHeaderType.Items.Add(Global.None); + return; + } + + if (network.Equals(Global.DefaultNetwork)) + { + cmbHeaderType.Items.Add(Global.None); + cmbHeaderType.Items.Add(Global.TcpHeaderHttp); + } + else if (network.Equals("kcp") || network.Equals("quic")) + { + cmbHeaderType.Items.Add(Global.None); + cmbHeaderType.Items.Add("srtp"); + cmbHeaderType.Items.Add("utp"); + cmbHeaderType.Items.Add("wechat-video"); + cmbHeaderType.Items.Add("dtls"); + cmbHeaderType.Items.Add("wireguard"); + } + else if (network.Equals("grpc")) + { + cmbHeaderType.Items.Add(Global.GrpcgunMode); + cmbHeaderType.Items.Add(Global.GrpcmultiMode); + } + else + { + cmbHeaderType.Items.Add(Global.None); + } + cmbHeaderType.SelectedIndex = 0; + } + + private void SetTips() + { + string network = cmbNetwork.Text; + if (Utils.IsNullOrEmpty(network)) + { + network = Global.DefaultNetwork; + } + labHeaderType.Visible = true; + tipRequestHost.Text = + tipPath.Text = + tipHeaderType.Text = string.Empty; + + if (network.Equals(Global.DefaultNetwork)) + { + tipRequestHost.Text = UIRes.I18N("TransportRequestHostTip1"); + tipHeaderType.Text = UIRes.I18N("TransportHeaderTypeTip1"); + } + else if (network.Equals("kcp")) + { + tipHeaderType.Text = UIRes.I18N("TransportHeaderTypeTip2"); + } + else if (network.Equals("ws")) + { + tipRequestHost.Text = UIRes.I18N("TransportRequestHostTip2"); + tipPath.Text = UIRes.I18N("TransportPathTip1"); + } + else if (network.Equals("h2")) + { + tipRequestHost.Text = UIRes.I18N("TransportRequestHostTip3"); + tipPath.Text = UIRes.I18N("TransportPathTip2"); + } + else if (network.Equals("quic")) + { + tipRequestHost.Text = UIRes.I18N("TransportRequestHostTip4"); + tipPath.Text = UIRes.I18N("TransportPathTip3"); + tipHeaderType.Text = UIRes.I18N("TransportHeaderTypeTip3"); + } + else if (network.Equals("grpc")) + { + tipPath.Text = UIRes.I18N("TransportPathTip4"); + tipHeaderType.Text = UIRes.I18N("TransportHeaderTypeTip4"); + labHeaderType.Visible = false; + } + } + + private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e) + { + string security = cmbStreamSecurity.Text; + if (Utils.IsNullOrEmpty(security)) + { + panTlsMore.Hide(); + } + else + { + panTlsMore.Show(); + } + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.resx b/v2rayN/v2rayN/Forms/ServerTransportControl.resx new file mode 100644 index 00000000..32e2e234 --- /dev/null +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.resx @@ -0,0 +1,717 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 300, 7 + + + 197, 21 + + + + 1 + + + txtSNI + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 0 + + + True + + + + NoControl + + + 270, 11 + + + 23, 12 + + + 32 + + + SNI + + + labSNI + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 1 + + + True + + + NoControl + + + 12, 11 + + + 83, 12 + + + 31 + + + allowInsecure + + + labAllowInsecure + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 2 + + + + + + true + + + false + + + 100, 7 + + + 80, 20 + + + 0 + + + cmbAllowInsecure + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 3 + + + 200, 171 + + + 500, 35 + + + 33 + + + panTlsMore + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 0 + + + True + + + NoControl + + + 350, 32 + + + 113, 12 + + + 15 + + + *Default value tcp + + + tipNetwork + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 1 + + + 127, 136 + + + True + + + 396, 20 + + + 4 + + + txtPath + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 2 + + + tcp + + + kcp + + + ws + + + h2 + + + quic + + + grpc + + + 192, 28 + + + 143, 20 + + + 1 + + + cmbNetwork + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 3 + + + True + + + NoControl + + + 9, 32 + + + 167, 12 + + + 13 + + + Transport protocol(network) + + + labNetwork + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 4 + + + True + + + NoControl + + + 9, 140 + + + 29, 12 + + + 27 + + + Path + + + labPath + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 5 + + + True + + + NoControl + + + 529, 140 + + + 11, 12 + + + 24 + + + * + + + tipPath + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 6 + + + True + + + NoControl + + + 464, 104 + + + 11, 12 + + + 23 + + + * + + + tipRequestHost + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 7 + + + True + + + NoControl + + + 9, 182 + + + 23, 12 + + + 22 + + + TLS + + + labStreamSecurity + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 8 + + + 127, 178 + + + 60, 20 + + + 5 + + + cmbStreamSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 9 + + + True + + + NoControl + + + 282, 66 + + + 11, 12 + + + 20 + + + * + + + tipHeaderType + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 10 + + + 158, 100 + + + True + + + 300, 20 + + + 3 + + + txtRequestHost + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 11 + + + True + + + NoControl + + + 9, 66 + + + 95, 12 + + + 19 + + + Camouflage type + + + labHeaderType + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 12 + + + True + + + NoControl + + + 9, 104 + + + 143, 12 + + + 17 + + + Camouflage domain(host) + + + labRequestHost + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 13 + + + none + + + http + + + srtp + + + utp + + + wechat-video + + + dtls + + + wireguard + + + 127, 64 + + + 143, 20 + + + 2 + + + cmbHeaderType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 14 + + + Fill + + + 0, 0 + + + 723, 220 + + + 22 + + + Transport + + + gbTransport + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 12 + + + 723, 220 + + + ServerTransportControl + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx new file mode 100644 index 00000000..a70f28e7 --- /dev/null +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 167, 12 + + + 跳过证书验证(allowInsecure) + + + 183, 7 + + + 143, 12 + + + *默认tcp,选错会无法连接 + + + 127, 28 + + + 208, 20 + + + 107, 12 + + + 传输协议(network) + + + 65, 12 + + + 路径(path) + + + 107, 12 + + + 底层传输安全(tls) + + + 203, 12 + + + 127, 100 + + + 331, 20 + + + 89, 12 + + + 伪装类型(type) + + + 89, 12 + + + 伪装域名(host) + + + 底层传输方式(transport) + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 739d8d3b..a9f2eb65 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -639,8 +639,10 @@ namespace v2rayN.Handler vmessItem.address = vmessItem.address.TrimEx(); vmessItem.id = vmessItem.id.TrimEx(); - - vmessItem.streamSecurity = Global.StreamSecurity; + if (Utils.IsNullOrEmpty(vmessItem.streamSecurity)) + { + vmessItem.streamSecurity = Global.StreamSecurity; + } if (Utils.IsNullOrEmpty(vmessItem.allowInsecure)) { vmessItem.allowInsecure = config.defAllowInsecure.ToString(); diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 325b6654..65756763 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -30,207 +30,25 @@ namespace v2rayN.Handler string url = string.Empty; VmessItem item = config.vmess[index]; - if (item.configType == (int)EConfigType.Vmess) - { - VmessQRCode vmessQRCode = new VmessQRCode - { - v = item.configVersion.ToString(), - ps = item.remarks.TrimEx(), //备注也许很长 ; - add = item.address, - port = item.port.ToString(), - id = item.id, - aid = item.alterId.ToString(), - scy = item.security, - net = item.network, - type = item.headerType, - host = item.requestHost, - path = item.path, - tls = item.streamSecurity, - sni = item.sni - }; - - url = Utils.ToJson(vmessQRCode); - url = Utils.Base64Encode(url); - url = string.Format("{0}{1}", Global.vmessProtocol, url); - - } - else if (item.configType == (int)EConfigType.Shadowsocks) - { - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - url = string.Format("{0}:{1}@{2}:{3}", - item.security, - item.id, - item.address, - item.port); - url = Utils.Base64Encode(url); - url = string.Format("{0}{1}{2}", Global.ssProtocol, url, remark); - } - else if (item.configType == (int)EConfigType.Socks) - { - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - url = string.Format("{0}:{1}@{2}:{3}", - item.security, - item.id, - item.address, - item.port); - url = Utils.Base64Encode(url); - url = string.Format("{0}{1}{2}", Global.socksProtocol, url, remark); - } - else if (item.configType == (int)EConfigType.Trojan) - { - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - string query = string.Empty; - if (!Utils.IsNullOrEmpty(item.sni)) - { - query = string.Format("?sni={0}", Utils.UrlEncode(item.sni)); - } - url = string.Format("{0}@{1}:{2}", - item.id, - GetIpv6(item.address), - item.port); - url = string.Format("{0}{1}{2}{3}", Global.trojanProtocol, url, query, remark); - } - else if (item.configType == (int)EConfigType.VLESS) - { - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - var dicQuery = new Dictionary(); - if (!Utils.IsNullOrEmpty(item.flow)) - { - dicQuery.Add("flow", item.flow); - } - if (!Utils.IsNullOrEmpty(item.security)) - { - dicQuery.Add("encryption", item.security); - } - else - { - dicQuery.Add("encryption", "none"); - } - if (!Utils.IsNullOrEmpty(item.streamSecurity)) - { - dicQuery.Add("security", item.streamSecurity); - } - else - { - dicQuery.Add("security", "none"); - } - if (!Utils.IsNullOrEmpty(item.sni)) - { - dicQuery.Add("sni", item.sni); - } - if (!Utils.IsNullOrEmpty(item.network)) - { - dicQuery.Add("type", item.network); - } - else - { - dicQuery.Add("type", "tcp"); - } - - switch (item.network) - { - case "tcp": - if (!Utils.IsNullOrEmpty(item.headerType)) - { - dicQuery.Add("headerType", item.headerType); - } - else - { - dicQuery.Add("headerType", "none"); - } - if (!Utils.IsNullOrEmpty(item.requestHost)) - { - dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); - } - break; - case "kcp": - if (!Utils.IsNullOrEmpty(item.headerType)) - { - dicQuery.Add("headerType", item.headerType); - } - else - { - dicQuery.Add("headerType", "none"); - } - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("seed", Utils.UrlEncode(item.path)); - } - break; - - case "ws": - if (!Utils.IsNullOrEmpty(item.requestHost)) - { - dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); - } - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("path", Utils.UrlEncode(item.path)); - } - break; - - case "http": - case "h2": - dicQuery["type"] = "http"; - if (!Utils.IsNullOrEmpty(item.requestHost)) - { - dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); - } - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("path", Utils.UrlEncode(item.path)); - } - break; - - case "quic": - if (!Utils.IsNullOrEmpty(item.headerType)) - { - dicQuery.Add("headerType", item.headerType); - } - else - { - dicQuery.Add("headerType", "none"); - } - dicQuery.Add("quicSecurity", Utils.UrlEncode(item.requestHost)); - dicQuery.Add("key", Utils.UrlEncode(item.path)); - break; - case "grpc": - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("serviceName", Utils.UrlEncode(item.path)); - if (item.headerType == Global.GrpcgunMode || item.headerType == Global.GrpcmultiMode) - { - dicQuery.Add("mode", Utils.UrlEncode(item.headerType)); - } - } - break; - } - string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); - - url = string.Format("{0}@{1}:{2}", - item.id, - GetIpv6(item.address), - item.port); - url = string.Format("{0}{1}{2}{3}", Global.vlessProtocol, url, query, remark); - } - else + switch (item.configType) { + case (int)EConfigType.Vmess: + url = ShareVmess(item); + break; + case (int)EConfigType.Shadowsocks: + url = ShareShadowsocks(item); + break; + case (int)EConfigType.Socks: + url = ShareSocks(item); + break; + case (int)EConfigType.Trojan: + url = ShareTrojan(item); + break; + case (int)EConfigType.VLESS: + url = ShareVLESS(item); + break; + default: + break; } return url; } @@ -240,6 +58,224 @@ namespace v2rayN.Handler } } + private static string ShareVmess(VmessItem item) + { + string url = string.Empty; + + VmessQRCode vmessQRCode = new VmessQRCode + { + v = item.configVersion.ToString(), + ps = item.remarks.TrimEx(), //备注也许很长 ; + add = item.address, + port = item.port.ToString(), + id = item.id, + aid = item.alterId.ToString(), + scy = item.security, + net = item.network, + type = item.headerType, + host = item.requestHost, + path = item.path, + tls = item.streamSecurity, + sni = item.sni + }; + + url = Utils.ToJson(vmessQRCode); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}", Global.vmessProtocol, url); + + return url; + } + + private static string ShareShadowsocks(VmessItem item) + { + string url = string.Empty; + + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + url = string.Format("{0}:{1}@{2}:{3}", + item.security, + item.id, + item.address, + item.port); + url = Utils.Base64Encode(url); + //new + //var pw = Utils.Base64Encode($"{item.security}:{item.id}"); + //url = $"{pw}@{item.address}:{ item.port}"; + url = string.Format("{0}{1}{2}", Global.ssProtocol, url, remark); + return url; + } + + private static string ShareSocks(VmessItem item) + { + string url = string.Empty; + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + url = string.Format("{0}:{1}@{2}:{3}", + item.security, + item.id, + item.address, + item.port); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}{2}", Global.socksProtocol, url, remark); + return url; + } + + private static string ShareTrojan(VmessItem item) + { + string url = string.Empty; + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + string query = string.Empty; + if (!Utils.IsNullOrEmpty(item.sni)) + { + query = string.Format("?sni={0}", Utils.UrlEncode(item.sni)); + } + url = string.Format("{0}@{1}:{2}", + item.id, + GetIpv6(item.address), + item.port); + url = string.Format("{0}{1}{2}{3}", Global.trojanProtocol, url, query, remark); + return url; + } + + private static string ShareVLESS(VmessItem item) + { + string url = string.Empty; + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + var dicQuery = new Dictionary(); + if (!Utils.IsNullOrEmpty(item.flow)) + { + dicQuery.Add("flow", item.flow); + } + if (!Utils.IsNullOrEmpty(item.security)) + { + dicQuery.Add("encryption", item.security); + } + else + { + dicQuery.Add("encryption", "none"); + } + if (!Utils.IsNullOrEmpty(item.streamSecurity)) + { + dicQuery.Add("security", item.streamSecurity); + } + else + { + dicQuery.Add("security", "none"); + } + if (!Utils.IsNullOrEmpty(item.sni)) + { + dicQuery.Add("sni", item.sni); + } + if (!Utils.IsNullOrEmpty(item.network)) + { + dicQuery.Add("type", item.network); + } + else + { + dicQuery.Add("type", "tcp"); + } + + switch (item.network) + { + case "tcp": + if (!Utils.IsNullOrEmpty(item.headerType)) + { + dicQuery.Add("headerType", item.headerType); + } + else + { + dicQuery.Add("headerType", "none"); + } + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); + } + break; + case "kcp": + if (!Utils.IsNullOrEmpty(item.headerType)) + { + dicQuery.Add("headerType", item.headerType); + } + else + { + dicQuery.Add("headerType", "none"); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("seed", Utils.UrlEncode(item.path)); + } + break; + + case "ws": + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("path", Utils.UrlEncode(item.path)); + } + break; + + case "http": + case "h2": + dicQuery["type"] = "http"; + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("path", Utils.UrlEncode(item.path)); + } + break; + + case "quic": + if (!Utils.IsNullOrEmpty(item.headerType)) + { + dicQuery.Add("headerType", item.headerType); + } + else + { + dicQuery.Add("headerType", "none"); + } + dicQuery.Add("quicSecurity", Utils.UrlEncode(item.requestHost)); + dicQuery.Add("key", Utils.UrlEncode(item.path)); + break; + case "grpc": + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("serviceName", Utils.UrlEncode(item.path)); + if (item.headerType == Global.GrpcgunMode || item.headerType == Global.GrpcmultiMode) + { + dicQuery.Add("mode", Utils.UrlEncode(item.headerType)); + } + } + break; + } + string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); + + url = string.Format("{0}@{1}:{2}", + item.id, + GetIpv6(item.address), + item.port); + url = string.Format("{0}{1}{2}{3}", Global.vlessProtocol, url, query, remark); + return url; + } private static string GetIpv6(string address) { return Utils.IsIpv6(address) ? $"[{address}]" : address; @@ -279,50 +315,7 @@ namespace v2rayN.Handler } else { - vmessItem.configType = (int)EConfigType.Vmess; - result = result.Substring(Global.vmessProtocol.Length); - result = Utils.Base64Decode(result); - - //转成Json - VmessQRCode vmessQRCode = Utils.FromJson(result); - if (vmessQRCode == null) - { - msg = UIRes.I18N("FailedConversionConfiguration"); - return null; - } - - vmessItem.network = Global.DefaultNetwork; - vmessItem.headerType = Global.None; - - vmessItem.configVersion = Utils.ToInt(vmessQRCode.v); - vmessItem.remarks = Utils.ToString(vmessQRCode.ps); - vmessItem.address = Utils.ToString(vmessQRCode.add); - vmessItem.port = Utils.ToInt(vmessQRCode.port); - vmessItem.id = Utils.ToString(vmessQRCode.id); - vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); - vmessItem.security = Utils.ToString(vmessQRCode.scy); - - if (!Utils.IsNullOrEmpty(vmessQRCode.scy)) - { - vmessItem.security = vmessQRCode.scy; - } - else - { - vmessItem.security = Global.DefaultSecurity; - } - if (!Utils.IsNullOrEmpty(vmessQRCode.net)) - { - vmessItem.network = vmessQRCode.net; - } - if (!Utils.IsNullOrEmpty(vmessQRCode.type)) - { - vmessItem.headerType = vmessQRCode.type; - } - - vmessItem.requestHost = Utils.ToString(vmessQRCode.host); - vmessItem.path = Utils.ToString(vmessQRCode.path); - vmessItem.streamSecurity = Utils.ToString(vmessQRCode.tls); - vmessItem.sni = Utils.ToString(vmessQRCode.sni); + vmessItem = ResolveVmess(result, out msg); } ConfigHandler.UpgradeServerVersion(ref vmessItem); @@ -351,69 +344,13 @@ namespace v2rayN.Handler { msg = UIRes.I18N("ConfigurationFormatIncorrect"); - vmessItem.configType = (int)EConfigType.Socks; - result = result.Substring(Global.socksProtocol.Length); - //remark - int indexRemark = result.IndexOf("#"); - if (indexRemark > 0) - { - try - { - vmessItem.remarks = Utils.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); - } - catch { } - result = result.Substring(0, indexRemark); - } - //part decode - int indexS = result.IndexOf("@"); - if (indexS > 0) - { - } - else - { - result = Utils.Base64Decode(result); - } - - string[] arr1 = result.Split('@'); - if (arr1.Length != 2) - { - return null; - } - string[] arr21 = arr1[0].Split(':'); - //string[] arr22 = arr1[1].Split(':'); - int indexPort = arr1[1].LastIndexOf(":"); - if (arr21.Length != 2 || indexPort < 0) - { - return null; - } - vmessItem.address = arr1[1].Substring(0, indexPort); - vmessItem.port = Utils.ToInt(arr1[1].Substring(indexPort + 1, arr1[1].Length - (indexPort + 1))); - vmessItem.security = arr21[0]; - vmessItem.id = arr21[1]; + vmessItem = ResolveSocks(result); } else if (result.StartsWith(Global.trojanProtocol)) { msg = UIRes.I18N("ConfigurationFormatIncorrect"); - vmessItem.configType = (int)EConfigType.Trojan; - - Uri uri = new Uri(result); - vmessItem.address = uri.IdnHost; - vmessItem.port = uri.Port; - vmessItem.id = uri.UserInfo; - - var qurery = HttpUtility.ParseQueryString(uri.Query); - vmessItem.sni = qurery["sni"] ?? ""; - - var remarks = uri.Fragment.Replace("#", ""); - if (Utils.IsNullOrEmpty(remarks)) - { - vmessItem.remarks = "NONE"; - } - else - { - vmessItem.remarks = Utils.UrlDecode(remarks); - } + vmessItem = ResolveTrojan(result); } else if (result.StartsWith(Global.vlessProtocol)) { @@ -436,6 +373,58 @@ namespace v2rayN.Handler return vmessItem; } + private static VmessItem ResolveVmess(string result, out string msg) + { + msg = string.Empty; + VmessItem vmessItem = new VmessItem(); + + vmessItem.configType = (int)EConfigType.Vmess; + result = result.Substring(Global.vmessProtocol.Length); + result = Utils.Base64Decode(result); + + //转成Json + VmessQRCode vmessQRCode = Utils.FromJson(result); + if (vmessQRCode == null) + { + msg = UIRes.I18N("FailedConversionConfiguration"); + return null; + } + + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + + vmessItem.configVersion = Utils.ToInt(vmessQRCode.v); + vmessItem.remarks = Utils.ToString(vmessQRCode.ps); + vmessItem.address = Utils.ToString(vmessQRCode.add); + vmessItem.port = Utils.ToInt(vmessQRCode.port); + vmessItem.id = Utils.ToString(vmessQRCode.id); + vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); + vmessItem.security = Utils.ToString(vmessQRCode.scy); + + if (!Utils.IsNullOrEmpty(vmessQRCode.scy)) + { + vmessItem.security = vmessQRCode.scy; + } + else + { + vmessItem.security = Global.DefaultSecurity; + } + if (!Utils.IsNullOrEmpty(vmessQRCode.net)) + { + vmessItem.network = vmessQRCode.net; + } + if (!Utils.IsNullOrEmpty(vmessQRCode.type)) + { + vmessItem.headerType = vmessQRCode.type; + } + + vmessItem.requestHost = Utils.ToString(vmessQRCode.host); + vmessItem.path = Utils.ToString(vmessQRCode.path); + vmessItem.streamSecurity = Utils.ToString(vmessQRCode.tls); + vmessItem.sni = Utils.ToString(vmessQRCode.sni); + + return vmessItem; + } private static VmessItem ResolveVmess4Kitsunebi(string result) { @@ -476,6 +465,92 @@ namespace v2rayN.Handler return vmessItem; } + private static VmessItem ResolveStdVmess(string result) + { + VmessItem i = new VmessItem + { + configType = (int)EConfigType.Vmess, + security = "auto" + }; + + Uri u = new Uri(result); + + i.address = u.IdnHost; + i.port = u.Port; + i.remarks = u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + var q = HttpUtility.ParseQueryString(u.Query); + + var m = StdVmessUserInfo.Match(u.UserInfo); + if (!m.Success) return null; + + i.id = m.Groups["id"].Value; + if (!int.TryParse(m.Groups["alterId"].Value, out int aid)) + { + return null; + } + i.alterId = aid; + + if (m.Groups["streamSecurity"].Success) + { + i.streamSecurity = m.Groups["streamSecurity"].Value; + } + switch (i.streamSecurity) + { + case "tls": + // TODO tls config + break; + default: + if (!string.IsNullOrWhiteSpace(i.streamSecurity)) + return null; + break; + } + + i.network = m.Groups["network"].Value; + switch (i.network) + { + case "tcp": + string t1 = q["type"] ?? "none"; + i.headerType = t1; + // TODO http option + + break; + case "kcp": + i.headerType = q["type"] ?? "none"; + // TODO kcp seed + break; + + case "ws": + string p1 = q["path"] ?? "/"; + string h1 = q["host"] ?? ""; + i.requestHost = Utils.UrlDecode(h1); + i.path = p1; + break; + + case "http": + case "h2": + i.network = "h2"; + string p2 = q["path"] ?? "/"; + string h2 = q["host"] ?? ""; + i.requestHost = Utils.UrlDecode(h2); + i.path = p2; + break; + + case "quic": + string s = q["security"] ?? "none"; + string k = q["key"] ?? ""; + string t3 = q["type"] ?? "none"; + i.headerType = t3; + i.requestHost = Utils.UrlDecode(s); + i.path = k; + break; + + default: + return null; + } + + return i; + } + private static VmessItem ResolveSip002(string result) { Uri parsedUrl; @@ -563,92 +638,77 @@ namespace v2rayN.Handler private static readonly Regex StdVmessUserInfo = new Regex( @"^(?[a-z]+)(\+(?[a-z]+))?:(?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})-(?[0-9]+)$"); - private static VmessItem ResolveStdVmess(string result) + private static VmessItem ResolveSocks(string result) { - VmessItem i = new VmessItem + VmessItem vmessItem = new VmessItem(); + vmessItem.configType = (int)EConfigType.Socks; + result = result.Substring(Global.socksProtocol.Length); + //remark + int indexRemark = result.IndexOf("#"); + if (indexRemark > 0) { - configType = (int)EConfigType.Vmess, - security = "auto" - }; + try + { + vmessItem.remarks = Utils.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); + } + catch { } + result = result.Substring(0, indexRemark); + } + //part decode + int indexS = result.IndexOf("@"); + if (indexS > 0) + { + } + else + { + result = Utils.Base64Decode(result); + } - Uri u = new Uri(result); - - i.address = u.IdnHost; - i.port = u.Port; - i.remarks = u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - var q = HttpUtility.ParseQueryString(u.Query); - - var m = StdVmessUserInfo.Match(u.UserInfo); - if (!m.Success) return null; - - i.id = m.Groups["id"].Value; - if (!int.TryParse(m.Groups["alterId"].Value, out int aid)) + string[] arr1 = result.Split('@'); + if (arr1.Length != 2) { return null; } - i.alterId = aid; - - if (m.Groups["streamSecurity"].Success) + string[] arr21 = arr1[0].Split(':'); + //string[] arr22 = arr1[1].Split(':'); + int indexPort = arr1[1].LastIndexOf(":"); + if (arr21.Length != 2 || indexPort < 0) { - i.streamSecurity = m.Groups["streamSecurity"].Value; - } - switch (i.streamSecurity) - { - case "tls": - // TODO tls config - break; - default: - if (!string.IsNullOrWhiteSpace(i.streamSecurity)) - return null; - break; + return null; } + vmessItem.address = arr1[1].Substring(0, indexPort); + vmessItem.port = Utils.ToInt(arr1[1].Substring(indexPort + 1, arr1[1].Length - (indexPort + 1))); + vmessItem.security = arr21[0]; + vmessItem.id = arr21[1]; - i.network = m.Groups["network"].Value; - switch (i.network) - { - case "tcp": - string t1 = q["type"] ?? "none"; - i.headerType = t1; - // TODO http option - - break; - case "kcp": - i.headerType = q["type"] ?? "none"; - // TODO kcp seed - break; - - case "ws": - string p1 = q["path"] ?? "/"; - string h1 = q["host"] ?? ""; - i.requestHost = Utils.UrlDecode(h1); - i.path = p1; - break; - - case "http": - case "h2": - i.network = "h2"; - string p2 = q["path"] ?? "/"; - string h2 = q["host"] ?? ""; - i.requestHost = Utils.UrlDecode(h2); - i.path = p2; - break; - - case "quic": - string s = q["security"] ?? "none"; - string k = q["key"] ?? ""; - string t3 = q["type"] ?? "none"; - i.headerType = t3; - i.requestHost = Utils.UrlDecode(s); - i.path = k; - break; - - default: - return null; - } - - return i; + return vmessItem; } + private static VmessItem ResolveTrojan(string result) + { + VmessItem vmessItem = new VmessItem(); + + vmessItem.configType = (int)EConfigType.Trojan; + + Uri uri = new Uri(result); + vmessItem.address = uri.IdnHost; + vmessItem.port = uri.Port; + vmessItem.id = uri.UserInfo; + + var qurery = HttpUtility.ParseQueryString(uri.Query); + vmessItem.sni = qurery["sni"] ?? ""; + + var remarks = uri.Fragment.Replace("#", ""); + if (Utils.IsNullOrEmpty(remarks)) + { + vmessItem.remarks = "NONE"; + } + else + { + vmessItem.remarks = Utils.UrlDecode(remarks); + } + return vmessItem; + } private static VmessItem ResolveStdVLESS(string result) { VmessItem item = new VmessItem @@ -702,7 +762,7 @@ namespace v2rayN.Handler break; case "grpc": item.path = Utils.UrlDecode(query["serviceName"] ?? ""); - item.headerType= Utils.UrlDecode(query["mode"] ?? Global.GrpcgunMode); + item.headerType = Utils.UrlDecode(query["mode"] ?? Global.GrpcgunMode); break; default: return null; diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 61df26d0..972c8309 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -525,9 +525,26 @@ namespace v2rayN.Handler serversItem.address = config.address(); serversItem.port = config.port(); serversItem.password = config.id(); + serversItem.flow = string.Empty; serversItem.ota = false; serversItem.level = 1; + + //if xtls + if (config.streamSecurity() == Global.StreamSecurityX) + { + if (Utils.IsNullOrEmpty(config.flow())) + { + serversItem.flow = "xtls-rprx-origin"; + } + else + { + serversItem.flow = config.flow().Replace("splice", "direct"); + } + + outbound.mux.enabled = false; + outbound.mux.concurrency = -1; + } outbound.mux.enabled = false; outbound.mux.concurrency = -1; diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index 3cbd5c9a..b2680243 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -25,7 +25,7 @@ namespace v2rayN.Mode /// 统计需要, 空对象 /// public Stats stats { get; set; } - + /// public API api { get; set; } @@ -133,14 +133,14 @@ namespace v2rayN.Mode /// public List clients { get; set; } - + /// /// VLESS /// public string decryption { get; set; } public bool allowTransparent { get; set; } - + } public class UsersItem @@ -170,7 +170,7 @@ namespace v2rayN.Mode /// /// VLESS /// - public string flow { get; set; } + public string flow { get; set; } } public class Sniffing { @@ -271,6 +271,11 @@ namespace v2rayN.Mode /// public int level { get; set; } + /// + /// trojan + /// + public string flow { get; set; } + /// /// /// @@ -402,7 +407,7 @@ namespace v2rayN.Mode } public class TcpSettings - { + { /// /// 数据包头部伪装设置 /// @@ -466,7 +471,7 @@ namespace v2rayN.Mode } public class WsSettings - { + { /// /// /// diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 2145ed2a..e46c2dff 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -195,6 +195,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Please fill in the correct custom DNS 的本地化字符串。 + /// + internal static string FillCorrectDNSText { + get { + return ResourceManager.GetString("FillCorrectDNSText", resourceCulture); + } + } + /// /// 查找类似 Please fill in the correct format server port 的本地化字符串。 /// @@ -897,5 +906,113 @@ namespace v2rayN.Resx { return ResourceManager.GetString("TestMeOutput", resourceCulture); } } + + /// + /// 查找类似 1)tcp camouflage type 的本地化字符串。 + /// + internal static string TransportHeaderTypeTip1 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip1", resourceCulture); + } + } + + /// + /// 查找类似 2)kcp camouflage type 的本地化字符串。 + /// + internal static string TransportHeaderTypeTip2 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip2", resourceCulture); + } + } + + /// + /// 查找类似 3)QUIC camouflage type 的本地化字符串。 + /// + internal static string TransportHeaderTypeTip3 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip3", resourceCulture); + } + } + + /// + /// 查找类似 4)grpc mode 的本地化字符串。 + /// + internal static string TransportHeaderTypeTip4 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip4", resourceCulture); + } + } + + /// + /// 查找类似 1)ws path 的本地化字符串。 + /// + internal static string TransportPathTip1 { + get { + return ResourceManager.GetString("TransportPathTip1", resourceCulture); + } + } + + /// + /// 查找类似 2)h2 path 的本地化字符串。 + /// + internal static string TransportPathTip2 { + get { + return ResourceManager.GetString("TransportPathTip2", resourceCulture); + } + } + + /// + /// 查找类似 3)QUIC key/Kcp seed 的本地化字符串。 + /// + internal static string TransportPathTip3 { + get { + return ResourceManager.GetString("TransportPathTip3", resourceCulture); + } + } + + /// + /// 查找类似 4)grpc serviceName 的本地化字符串。 + /// + internal static string TransportPathTip4 { + get { + return ResourceManager.GetString("TransportPathTip4", resourceCulture); + } + } + + /// + /// 查找类似 1)http host Separated by commas (,) 的本地化字符串。 + /// + internal static string TransportRequestHostTip1 { + get { + return ResourceManager.GetString("TransportRequestHostTip1", resourceCulture); + } + } + + /// + /// 查找类似 2)ws host 的本地化字符串。 + /// + internal static string TransportRequestHostTip2 { + get { + return ResourceManager.GetString("TransportRequestHostTip2", resourceCulture); + } + } + + /// + /// 查找类似 3)h2 host Separated by commas (,) 的本地化字符串。 + /// + internal static string TransportRequestHostTip3 { + get { + return ResourceManager.GetString("TransportRequestHostTip3", resourceCulture); + } + } + + /// + /// 查找类似 4)QUIC securty 的本地化字符串。 + /// + internal static string TransportRequestHostTip4 { + get { + return ResourceManager.GetString("TransportRequestHostTip4", resourceCulture); + } + } } } diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index b58ee145..1bf358cb 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -397,4 +397,43 @@ Custom Icon + + Please fill in the correct custom DNS + + + 1)ws path + + + 2)h2 path + + + 3)QUIC key/Kcp seed + + + 4)grpc serviceName + + + 1)http host Separated by commas (,) + + + 2)ws host + + + 3)h2 host Separated by commas (,) + + + 4)QUIC securty + + + 1)tcp camouflage type + + + 2)kcp camouflage type + + + 3)QUIC camouflage type + + + 4)grpc mode + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index 64ca6267..2bf6f56e 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -397,4 +397,43 @@ 自定义图标 + + 请填写正确的自定义DNS + + + 1)ws path + + + 2)h2 path + + + 3)QUIC 加密密钥/Kcp seed + + + 4)grpc serviceName + + + 1)http host中间逗号(,)隔开 + + + 2)ws host + + + 3)h2 host中间逗号(,)隔开 + + + 4)QUIC 加密方式 + + + 1)tcp伪装类型 + + + 2)kcp伪装类型 + + + 3)QUIC伪装类型 + + + 4)grpc 模式 + \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 98fc93a2..b2601936 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -143,6 +143,12 @@ RoutingRuleSettingForm.cs + + UserControl + + + ServerTransportControl.cs + @@ -256,6 +262,7 @@ + @@ -336,6 +343,12 @@ RoutingRuleSettingForm.cs + + ServerTransportControl.cs + + + ServerTransportControl.cs + SubSettingControl.cs Designer @@ -484,6 +497,9 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + + 2.0.13 + 12.0.3