From 4a34160f01d1a486ba1e00246f6e64edc18b23d2 Mon Sep 17 00:00:00 2001 From: Sui Date: Thu, 27 Nov 2014 10:45:33 +0800 Subject: [PATCH] Add ss protocol URI parse input. --- shadowsocks-csharp/Model/Configuration.cs | 69 +++++++++++++++++ shadowsocks-csharp/View/ConfigForm.Designer.cs | 100 +++++++++++++++++-------- shadowsocks-csharp/View/ConfigForm.cs | 17 ++++- shadowsocks-csharp/shadowsocks-csharp.csproj | 1 + 4 files changed, 154 insertions(+), 33 deletions(-) diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index db02b840..e4012fe3 100755 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Text; using System.Windows.Forms; +using System.Text.RegularExpressions; namespace Shadowsocks.Model { @@ -91,6 +92,63 @@ namespace Shadowsocks.Model } } + public static bool load_uri(string uri, ref Server server) + { + Regex regex_ss_head = new Regex("^(?i:(ss://))"); + Regex regex_ss = new Regex("^(?i:(aes-256-cfb|aes-128-cfb|aes-192-cfb|aes-256-ofb|aes-128-ofb|aes-192-ofb|aes-128-ctr|aes-192-ctr|aes-256-ctr|aes-128-cfb8|aes-192-cfb8|aes-256-cfb8|aes-128-cfb1|aes-192-cfb1|aes-256-cfb1|bf-cfb|camellia-128-cfb|camellia-192-cfb|camellia-256-cfb|cast5-cfb|des-cfb|idea-cfb|rc2-cfb|rc4-md5|seed-cfb|salsa20-ctr)):[a-zA-Z0-9\\.\\-]+@((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\\-]+\\.)*[a-zA-Z0-9\\-]+\\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))\\:[0-9]+"); + Regex regexbase64 = new Regex("^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?"); + + string uri_core = ""; + + try + { + + if (regex_ss_head.IsMatch(uri)) + { + string[] sArray = Regex.Split(uri, "://", RegexOptions.IgnoreCase); + uri_core = sArray[1].ToString(); + } + else + { + uri_core = uri; + } + + if (regex_ss.IsMatch(uri_core)) + { + server = parse_ss_uri(uri_core); + return true; + } + else + { + if (regexbase64.IsMatch(uri_core)) + { + byte[] arr = System.Convert.FromBase64String(uri_core); + string uri_core2 = System.Text.Encoding.UTF8.GetString(arr); + if (regex_ss.IsMatch(uri_core2)) + { + server = parse_ss_uri(uri_core2); + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + } + catch (IOException e) + { + Console.Error.WriteLine(e); + } + return false; + + } + + public static Server GetDefaultServer() { return new Server() @@ -112,6 +170,17 @@ namespace Shadowsocks.Model } } + private static Server parse_ss_uri(string uri) + { + string[] sArray=uri.Split(new char[2]{':','@'}); + + Server server = Configuration.GetDefaultServer(); + server.method = sArray[0].ToString(); + server.password = sArray[1].ToString(); + server.server = sArray[2].ToString(); + server.server_port = int.Parse(sArray[3].ToString()); + return server; + } private static void CheckPort(int port) { if (port <= 0 || port > 65535) diff --git a/shadowsocks-csharp/View/ConfigForm.Designer.cs b/shadowsocks-csharp/View/ConfigForm.Designer.cs index 50273d07..e632582d 100755 --- a/shadowsocks-csharp/View/ConfigForm.Designer.cs +++ b/shadowsocks-csharp/View/ConfigForm.Designer.cs @@ -50,6 +50,9 @@ this.AddButton = new System.Windows.Forms.Button(); this.ServerGroupBox = new System.Windows.Forms.GroupBox(); this.ServersListBox = new System.Windows.Forms.ListBox(); + this.ParseURIButton = new System.Windows.Forms.Button(); + this.label7 = new System.Windows.Forms.Label(); + this.URITextBox = new System.Windows.Forms.TextBox(); this.tableLayoutPanel1.SuspendLayout(); this.panel1.SuspendLayout(); this.panel3.SuspendLayout(); @@ -75,7 +78,7 @@ this.tableLayoutPanel1.Controls.Add(this.PasswordTextBox, 1, 2); this.tableLayoutPanel1.Controls.Add(this.label5, 0, 3); this.tableLayoutPanel1.Controls.Add(this.EncryptionSelect, 1, 3); - this.tableLayoutPanel1.Location = new System.Drawing.Point(8, 21); + this.tableLayoutPanel1.Location = new System.Drawing.Point(8, 15); this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(5); this.tableLayoutPanel1.Name = "tableLayoutPanel1"; this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(5); @@ -86,15 +89,15 @@ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.Size = new System.Drawing.Size(242, 167); + this.tableLayoutPanel1.Size = new System.Drawing.Size(253, 171); this.tableLayoutPanel1.TabIndex = 0; // // RemarksTextBox // this.RemarksTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.RemarksTextBox.Location = new System.Drawing.Point(74, 139); + this.RemarksTextBox.Location = new System.Drawing.Point(85, 142); this.RemarksTextBox.Name = "RemarksTextBox"; - this.RemarksTextBox.Size = new System.Drawing.Size(160, 20); + this.RemarksTextBox.Size = new System.Drawing.Size(160, 21); this.RemarksTextBox.TabIndex = 10; this.RemarksTextBox.WordWrap = false; // @@ -102,9 +105,9 @@ // this.label6.Anchor = System.Windows.Forms.AnchorStyles.Right; this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(19, 142); + this.label6.Location = new System.Drawing.Point(32, 146); this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(49, 13); + this.label6.Size = new System.Drawing.Size(47, 12); this.label6.TabIndex = 9; this.label6.Text = "Remarks"; // @@ -112,9 +115,9 @@ // this.label1.Anchor = System.Windows.Forms.AnchorStyles.Right; this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(17, 11); + this.label1.Location = new System.Drawing.Point(20, 12); this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(51, 13); + this.label1.Size = new System.Drawing.Size(59, 12); this.label1.TabIndex = 0; this.label1.Text = "Server IP"; // @@ -122,18 +125,18 @@ // this.label2.Anchor = System.Windows.Forms.AnchorStyles.Right; this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(8, 37); + this.label2.Location = new System.Drawing.Point(8, 39); this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(60, 13); + this.label2.Size = new System.Drawing.Size(71, 12); this.label2.TabIndex = 1; this.label2.Text = "Server Port"; // // ProxyPortTextBox // this.ProxyPortTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.ProxyPortTextBox.Location = new System.Drawing.Point(74, 113); + this.ProxyPortTextBox.Location = new System.Drawing.Point(85, 115); this.ProxyPortTextBox.Name = "ProxyPortTextBox"; - this.ProxyPortTextBox.Size = new System.Drawing.Size(160, 20); + this.ProxyPortTextBox.Size = new System.Drawing.Size(160, 21); this.ProxyPortTextBox.TabIndex = 4; this.ProxyPortTextBox.WordWrap = false; // @@ -141,9 +144,9 @@ // this.label4.Anchor = System.Windows.Forms.AnchorStyles.Right; this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(13, 116); + this.label4.Location = new System.Drawing.Point(14, 119); this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(55, 13); + this.label4.Size = new System.Drawing.Size(65, 12); this.label4.TabIndex = 3; this.label4.Text = "Proxy Port"; // @@ -151,37 +154,37 @@ // this.label3.Anchor = System.Windows.Forms.AnchorStyles.Right; this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(15, 63); + this.label3.Location = new System.Drawing.Point(26, 66); this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(53, 13); + this.label3.Size = new System.Drawing.Size(53, 12); this.label3.TabIndex = 2; this.label3.Text = "Password"; // // IPTextBox // this.IPTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.IPTextBox.Location = new System.Drawing.Point(74, 8); + this.IPTextBox.Location = new System.Drawing.Point(85, 8); this.IPTextBox.Name = "IPTextBox"; - this.IPTextBox.Size = new System.Drawing.Size(160, 20); + this.IPTextBox.Size = new System.Drawing.Size(160, 21); this.IPTextBox.TabIndex = 0; this.IPTextBox.WordWrap = false; // // ServerPortTextBox // this.ServerPortTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.ServerPortTextBox.Location = new System.Drawing.Point(74, 34); + this.ServerPortTextBox.Location = new System.Drawing.Point(85, 35); this.ServerPortTextBox.Name = "ServerPortTextBox"; - this.ServerPortTextBox.Size = new System.Drawing.Size(160, 20); + this.ServerPortTextBox.Size = new System.Drawing.Size(160, 21); this.ServerPortTextBox.TabIndex = 1; this.ServerPortTextBox.WordWrap = false; // // PasswordTextBox // this.PasswordTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.PasswordTextBox.Location = new System.Drawing.Point(74, 60); + this.PasswordTextBox.Location = new System.Drawing.Point(85, 62); this.PasswordTextBox.Name = "PasswordTextBox"; this.PasswordTextBox.PasswordChar = '*'; - this.PasswordTextBox.Size = new System.Drawing.Size(160, 20); + this.PasswordTextBox.Size = new System.Drawing.Size(160, 21); this.PasswordTextBox.TabIndex = 2; this.PasswordTextBox.WordWrap = false; // @@ -189,9 +192,9 @@ // this.label5.Anchor = System.Windows.Forms.AnchorStyles.Right; this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(11, 90); + this.label5.Location = new System.Drawing.Point(14, 93); this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(57, 13); + this.label5.Size = new System.Drawing.Size(65, 12); this.label5.TabIndex = 8; this.label5.Text = "Encryption"; // @@ -202,7 +205,7 @@ this.EncryptionSelect.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.EncryptionSelect.FormattingEnabled = true; this.EncryptionSelect.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.EncryptionSelect.ItemHeight = 13; + this.EncryptionSelect.ItemHeight = 12; this.EncryptionSelect.Items.AddRange(new object[] { "table", "rc4-md5", @@ -210,9 +213,9 @@ "aes-192-cfb", "aes-128-cfb", "rc4"}); - this.EncryptionSelect.Location = new System.Drawing.Point(74, 86); + this.EncryptionSelect.Location = new System.Drawing.Point(85, 89); this.EncryptionSelect.Name = "EncryptionSelect"; - this.EncryptionSelect.Size = new System.Drawing.Size(160, 21); + this.EncryptionSelect.Size = new System.Drawing.Size(160, 20); this.EncryptionSelect.TabIndex = 3; // // panel2 @@ -243,7 +246,7 @@ this.MyCancelButton.Name = "MyCancelButton"; this.MyCancelButton.Size = new System.Drawing.Size(75, 23); this.MyCancelButton.TabIndex = 9; - this.MyCancelButton.Text = "Cancel"; + this.MyCancelButton.Text = "Exit"; this.MyCancelButton.UseVisualStyleBackColor = true; this.MyCancelButton.Click += new System.EventHandler(this.CancelButton_Click); // @@ -264,7 +267,7 @@ this.panel3.AutoSize = true; this.panel3.Controls.Add(this.DeleteButton); this.panel3.Controls.Add(this.AddButton); - this.panel3.Location = new System.Drawing.Point(12, 220); + this.panel3.Location = new System.Drawing.Point(12, 248); this.panel3.Margin = new System.Windows.Forms.Padding(0); this.panel3.Name = "panel3"; this.panel3.Size = new System.Drawing.Size(192, 31); @@ -293,9 +296,9 @@ // ServerGroupBox // this.ServerGroupBox.Controls.Add(this.tableLayoutPanel1); - this.ServerGroupBox.Location = new System.Drawing.Point(223, 12); + this.ServerGroupBox.Location = new System.Drawing.Point(223, 3); this.ServerGroupBox.Name = "ServerGroupBox"; - this.ServerGroupBox.Size = new System.Drawing.Size(255, 205); + this.ServerGroupBox.Size = new System.Drawing.Size(255, 194); this.ServerGroupBox.TabIndex = 6; this.ServerGroupBox.TabStop = false; this.ServerGroupBox.Text = "Server"; @@ -303,12 +306,39 @@ // ServersListBox // this.ServersListBox.FormattingEnabled = true; + this.ServersListBox.ItemHeight = 12; this.ServersListBox.Location = new System.Drawing.Point(12, 12); this.ServersListBox.Name = "ServersListBox"; - this.ServersListBox.Size = new System.Drawing.Size(192, 173); + this.ServersListBox.Size = new System.Drawing.Size(192, 172); this.ServersListBox.TabIndex = 5; this.ServersListBox.SelectedIndexChanged += new System.EventHandler(this.ServersListBox_SelectedIndexChanged); // + // ParseURIButton + // + this.ParseURIButton.Location = new System.Drawing.Point(426, 202); + this.ParseURIButton.Name = "ParseURIButton"; + this.ParseURIButton.Size = new System.Drawing.Size(52, 23); + this.ParseURIButton.TabIndex = 7; + this.ParseURIButton.Text = "&Parse"; + this.ParseURIButton.UseVisualStyleBackColor = true; + this.ParseURIButton.Click += new System.EventHandler(this.ParseURIButton_Click); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(10, 207); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(23, 12); + this.label7.TabIndex = 8; + this.label7.Text = "URI"; + // + // URITextBox + // + this.URITextBox.Location = new System.Drawing.Point(39, 204); + this.URITextBox.Name = "URITextBox"; + this.URITextBox.Size = new System.Drawing.Size(385, 21); + this.URITextBox.TabIndex = 9; + // // ConfigForm // this.AcceptButton = this.OKButton; @@ -317,6 +347,9 @@ this.AutoSize = true; this.CancelButton = this.MyCancelButton; this.ClientSize = new System.Drawing.Size(489, 287); + this.Controls.Add(this.URITextBox); + this.Controls.Add(this.label7); + this.Controls.Add(this.ParseURIButton); this.Controls.Add(this.ServersListBox); this.Controls.Add(this.ServerGroupBox); this.Controls.Add(this.panel1); @@ -366,6 +399,9 @@ private System.Windows.Forms.ListBox ServersListBox; private System.Windows.Forms.TextBox RemarksTextBox; private System.Windows.Forms.Label label6; + private System.Windows.Forms.Button ParseURIButton; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.TextBox URITextBox; } } diff --git a/shadowsocks-csharp/View/ConfigForm.cs b/shadowsocks-csharp/View/ConfigForm.cs index 1601e0ef..6c483783 100755 --- a/shadowsocks-csharp/View/ConfigForm.cs +++ b/shadowsocks-csharp/View/ConfigForm.cs @@ -180,7 +180,8 @@ namespace Shadowsocks.View return; } controller.SaveServers(_modifiedConfiguration.configs); - this.Close(); + // delete it for some inconvenience. + //this.Close(); } private void CancelButton_Click(object sender, EventArgs e) @@ -198,5 +199,19 @@ namespace Shadowsocks.View controller.ConfigChanged -= controller_ConfigChanged; } + private void ParseURIButton_Click(object sender, EventArgs e) + { + if (!SaveOldSelectedServer()) + { + return; + } + Server server = Configuration.GetDefaultServer(); + if (true == Configuration.load_uri(URITextBox.Text, ref server)) + URITextBox.Text = ""; + _modifiedConfiguration.configs.Add(server); + LoadConfiguration(_modifiedConfiguration); + ServersListBox.SelectedIndex = _modifiedConfiguration.configs.Count - 1; + _oldSelectedIndex = ServersListBox.SelectedIndex; + } } } diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index 6221c918..a8c072b5 100755 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -65,6 +65,7 @@ +