From e0612854d65dd121a2b4b6e1ee6b3ac60d81c2d9 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Fri, 20 Mar 2015 00:39:31 -0400 Subject: [PATCH 01/10] support online pac, see https://github.com/shadowsocks/shadowsocks-csharp/issues/163 --- shadowsocks-csharp/Controller/PACServer.cs | 29 ++++- .../Controller/ShadowsocksController.cs | 22 ++++ shadowsocks-csharp/Data/cn.txt | 8 +- shadowsocks-csharp/Model/Configuration.cs | 2 + shadowsocks-csharp/View/MenuViewController.cs | 65 ++++++++++- shadowsocks-csharp/View/PACUrlForm.Designer.cs | 105 ++++++++++++++++++ shadowsocks-csharp/View/PACUrlForm.cs | 69 ++++++++++++ shadowsocks-csharp/View/PACUrlForm.resx | 120 +++++++++++++++++++++ shadowsocks-csharp/shadowsocks-csharp.csproj | 9 ++ 9 files changed, 423 insertions(+), 6 deletions(-) create mode 100644 shadowsocks-csharp/View/PACUrlForm.Designer.cs create mode 100644 shadowsocks-csharp/View/PACUrlForm.cs create mode 100644 shadowsocks-csharp/View/PACUrlForm.resx diff --git a/shadowsocks-csharp/Controller/PACServer.cs b/shadowsocks-csharp/Controller/PACServer.cs index e193d9b4..b987e84d 100755 --- a/shadowsocks-csharp/Controller/PACServer.cs +++ b/shadowsocks-csharp/Controller/PACServer.cs @@ -71,7 +71,10 @@ namespace Shadowsocks.Controller } if (hostMatch && pathMatch) { - SendResponse(firstPacket, length, socket, useSocks); + if (_config.useOnlinePac && !string.IsNullOrEmpty(_config.pacUrl)) + RedirectToOnlinePAC(firstPacket, length, socket, useSocks); + else + SendResponse(firstPacket, length, socket, useSocks); return true; } return false; @@ -121,6 +124,30 @@ namespace Shadowsocks.Controller } } + private void RedirectToOnlinePAC(byte[] firstPacket, int length, Socket socket, bool useSocks) + { + try + { + string friendlyMessage = "Redirect to online pac " + _config.pacUrl; + string text = String.Format(@"HTTP/1.1 302 Found +Server: Shadowsocks +Content-Type: text/html; charset=utf-8 +Location: {0} +Content-Length: {1} +Connection: Close + +", _config.pacUrl, System.Text.Encoding.UTF8.GetBytes(friendlyMessage).Length) + friendlyMessage; + byte[] response = System.Text.Encoding.UTF8.GetBytes(text); + socket.BeginSend(response, 0, response.Length, 0, new AsyncCallback(SendCallback), socket); + Util.Utils.ReleaseMemory(); + } + catch (Exception e) + { + Console.WriteLine(e); + socket.Close(); + } + } + public void SendResponse(byte[] firstPacket, int length, Socket socket, bool useSocks) { try diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index 8d271372..734f27d1 100755 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -192,6 +192,28 @@ namespace Shadowsocks.Controller } } + public void SavePACUrl(string pacUrl) + { + _config.pacUrl = pacUrl; + UpdateSystemProxy(); + SaveConfig(_config); + if (ConfigChanged != null) + { + ConfigChanged(this, new EventArgs()); + } + } + + public void UseOnlinePAC(bool useOnlinePac) + { + _config.useOnlinePac = useOnlinePac; + UpdateSystemProxy(); + SaveConfig(_config); + if (ConfigChanged != null) + { + ConfigChanged(this, new EventArgs()); + } + } + protected void Reload() { // some logic in configuration updated the config when saving, we need to read it again diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index 486ba27d..c3fc26f1 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -40,6 +40,11 @@ New server=未配置的服务器 QRCode=二维码 +# PAC Url Form + +Update Online PAC URL=更新在线 PAC 网址 +PAC Url=PAC 网址 + # Messages Shadowsocks Error: {0}=Shadowsocks 错误: {0} @@ -63,4 +68,5 @@ No QRCode found. Try to zoom in or move it to the center of the screen.=未发 Failed to decode QRCode=无法解析二维码 Failed to update registry=无法修改注册表 System Proxy On: =系统代理已启用: -Running: Port {0}=正在运行:端口 {0} \ No newline at end of file +Running: Port {0}=正在运行:端口 {0} +PAC Url can not be blank=PAC 网址不能为空 diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index 56c91759..b78358e8 100755 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -17,6 +17,8 @@ namespace Shadowsocks.Model public bool shareOverLan; public bool isDefault; public int localPort; + public string pacUrl; + public bool useOnlinePac; private static string CONFIG_FILE = "gui-config.json"; diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index 0660f182..f60be124 100755 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -35,7 +35,10 @@ namespace Shadowsocks.View private MenuItem ServersItem; private MenuItem globalModeItem; private MenuItem PACModeItem; + private MenuItem localPACItem; + private MenuItem onlinePACItem; private ConfigForm configForm; + private PACUrlForm pacUrlForm; private string _urlToOpen; public MenuViewController(ShadowsocksController controller) @@ -151,10 +154,15 @@ namespace Shadowsocks.View CreateMenuItem("Show QRCode...", new EventHandler(this.QRCodeItem_Click)), CreateMenuItem("Scan QRCode from Screen...", new EventHandler(this.ScanQRCodeItem_Click)) }), - new MenuItem("-"), - CreateMenuItem("Edit PAC File...", new EventHandler(this.EditPACFileItem_Click)), - CreateMenuItem("Update PAC from GFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)), - CreateMenuItem("Edit User Rule for GFWList...", new EventHandler(this.EditUserRuleFileForGFWListItem_Click)), + CreateMenuGroup("PAC", new MenuItem[] { + this.localPACItem = CreateMenuItem("Local PAC", new EventHandler(this.LocalPACItem_Click)), + this.onlinePACItem = CreateMenuItem("Online PAC", new EventHandler(this.OnlinePACItem_Click)), + new MenuItem("-"), + CreateMenuItem("Edit PAC File...", new EventHandler(this.EditPACFileItem_Click)), + CreateMenuItem("Update PAC from GFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)), + CreateMenuItem("Edit User Rule for GFWList...", new EventHandler(this.EditUserRuleFileForGFWListItem_Click)), + CreateMenuItem("Update Online PAC URL", new EventHandler(this.UpdateOnlinePACURLItem_Click)), + }), new MenuItem("-"), this.AutoStartupItem = CreateMenuItem("Start on Boot", new EventHandler(this.AutoStartupItem_Click)), this.ShareOverLANItem = CreateMenuItem("Allow Clients from LAN", new EventHandler(this.ShareOverLANItem_Click)), @@ -240,6 +248,9 @@ namespace Shadowsocks.View PACModeItem.Checked = !config.global; ShareOverLANItem.Checked = config.shareOverLan; AutoStartupItem.Checked = AutoStartup.Check(); + onlinePACItem.Enabled = !string.IsNullOrEmpty(config.pacUrl); + onlinePACItem.Checked = onlinePACItem.Enabled && config.useOnlinePac; + localPACItem.Checked = !onlinePACItem.Checked; } private void UpdateServersMenu() @@ -481,5 +492,51 @@ namespace Shadowsocks.View MessageBox.Show(I18N.GetString("Failed to update registry")); } } + + private void LocalPACItem_Click(object sender, EventArgs e) + { + if (!localPACItem.Checked) + { + localPACItem.Checked = true; + onlinePACItem.Checked = false; + controller.UseOnlinePAC(false); + } + } + + private void OnlinePACItem_Click(object sender, EventArgs e) + { + if (!onlinePACItem.Checked) + { + localPACItem.Checked = false; + onlinePACItem.Checked = true; + controller.UseOnlinePAC(true); + } + } + + private void showPACUrlForm() + { + if (pacUrlForm != null) + { + pacUrlForm.Activate(); + } + else + { + pacUrlForm = new PACUrlForm(controller); + pacUrlForm.Show(); + pacUrlForm.FormClosed += pacUrlForm_FormClosed; + } + } + + private void pacUrlForm_FormClosed(object sender, FormClosedEventArgs e) + { + pacUrlForm = null; + Util.Utils.ReleaseMemory(); + ShowFirstTimeBalloon(); + } + + private void UpdateOnlinePACURLItem_Click(object sender, EventArgs e) + { + showPACUrlForm(); + } } } diff --git a/shadowsocks-csharp/View/PACUrlForm.Designer.cs b/shadowsocks-csharp/View/PACUrlForm.Designer.cs new file mode 100644 index 00000000..feff4bb1 --- /dev/null +++ b/shadowsocks-csharp/View/PACUrlForm.Designer.cs @@ -0,0 +1,105 @@ +namespace Shadowsocks.View +{ + partial class PACUrlForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.PACUrlTextBox = new System.Windows.Forms.TextBox(); + this.PACUrlLabel = new System.Windows.Forms.Label(); + this.OkButton = new System.Windows.Forms.Button(); + this.CancelButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // PACUrlTextBox + // + this.PACUrlTextBox.Location = new System.Drawing.Point(61, 12); + this.PACUrlTextBox.MaxLength = 256; + this.PACUrlTextBox.Name = "PACUrlTextBox"; + this.PACUrlTextBox.Size = new System.Drawing.Size(245, 20); + this.PACUrlTextBox.TabIndex = 4; + this.PACUrlTextBox.WordWrap = false; + // + // PACUrlLabel + // + this.PACUrlLabel.AutoSize = true; + this.PACUrlLabel.Location = new System.Drawing.Point(6, 15); + this.PACUrlLabel.Name = "PACUrlLabel"; + this.PACUrlLabel.Size = new System.Drawing.Size(44, 13); + this.PACUrlLabel.TabIndex = 3; + this.PACUrlLabel.Text = "PAC Url"; + // + // OkButton + // + this.OkButton.Location = new System.Drawing.Point(150, 50); + this.OkButton.Name = "OkButton"; + this.OkButton.Size = new System.Drawing.Size(75, 23); + this.OkButton.TabIndex = 5; + this.OkButton.Text = "OK"; + this.OkButton.UseVisualStyleBackColor = true; + this.OkButton.Click += new System.EventHandler(this.OkButton_Click); + // + // CancelButton + // + this.CancelButton.Location = new System.Drawing.Point(231, 50); + this.CancelButton.Name = "CancelButton"; + this.CancelButton.Size = new System.Drawing.Size(75, 23); + this.CancelButton.TabIndex = 6; + this.CancelButton.Text = "Cancel"; + this.CancelButton.UseVisualStyleBackColor = true; + this.CancelButton.Click += new System.EventHandler(this.CancelButton_Click); + // + // PACUrlForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSize = true; + this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.ClientSize = new System.Drawing.Size(327, 88); + this.Controls.Add(this.CancelButton); + this.Controls.Add(this.OkButton); + this.Controls.Add(this.PACUrlTextBox); + this.Controls.Add(this.PACUrlLabel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "PACUrlForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Update Online PAC URL"; + this.Load += new System.EventHandler(this.PACUrlForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox PACUrlTextBox; + private System.Windows.Forms.Label PACUrlLabel; + private System.Windows.Forms.Button OkButton; + private System.Windows.Forms.Button CancelButton; + } +} \ No newline at end of file diff --git a/shadowsocks-csharp/View/PACUrlForm.cs b/shadowsocks-csharp/View/PACUrlForm.cs new file mode 100644 index 00000000..d2232700 --- /dev/null +++ b/shadowsocks-csharp/View/PACUrlForm.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using Shadowsocks.Controller; +using Shadowsocks.Model; +using Shadowsocks.Properties; + +namespace Shadowsocks.View +{ + public partial class PACUrlForm : Form + { + private ShadowsocksController controller; + private string orig_pacUrl; + + public PACUrlForm(ShadowsocksController controller) + { + this.Font = System.Drawing.SystemFonts.MessageBoxFont; + InitializeComponent(); + + UpdateTexts(); + this.Icon = Icon.FromHandle(Resources.ssw128.GetHicon()); + + this.controller = controller; + controller.ConfigChanged += controller_ConfigChanged; + } + + private void UpdateTexts() + { + OkButton.Text = I18N.GetString("OK"); + CancelButton.Text = I18N.GetString("Cancel"); + PACUrlLabel.Text = I18N.GetString("PAC Url"); + this.Text = I18N.GetString("Update Online PAC URL"); + } + + private void controller_ConfigChanged(object sender, EventArgs e) + { + orig_pacUrl = PACUrlTextBox.Text = controller.GetConfiguration().pacUrl; + } + + private void PACUrlForm_Load(object sender, EventArgs e) + { + PACUrlTextBox.Text = controller.GetConfiguration().pacUrl; + } + + private void OkButton_Click(object sender, EventArgs e) + { + string pacUrl = PACUrlTextBox.Text.Trim(); + if (string.IsNullOrEmpty(pacUrl)) + { + MessageBox.Show(I18N.GetString("PAC Url can not be blank")); + return; + } + if (pacUrl != this.orig_pacUrl) + { + controller.SavePACUrl(pacUrl); + } + this.Close(); + } + + private void CancelButton_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/shadowsocks-csharp/View/PACUrlForm.resx b/shadowsocks-csharp/View/PACUrlForm.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/shadowsocks-csharp/View/PACUrlForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index fd849f85..273b9f52 100755 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -162,6 +162,12 @@ + + Form + + + PACUrlForm.cs + Form @@ -180,6 +186,9 @@ Designer Resources.Designer.cs + + PACUrlForm.cs + QRCodeForm.cs From f946b0d99c91e39249bbc588ad8cfbf9027b6fb0 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Fri, 20 Mar 2015 01:07:10 -0400 Subject: [PATCH 02/10] fix I18N --- shadowsocks-csharp/Data/cn.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index c3fc26f1..43cffdf2 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -42,6 +42,8 @@ QRCode=二维码 # PAC Url Form +Local PAC=使用本地 PAC +Online PAC=使用在线 PAC Update Online PAC URL=更新在线 PAC 网址 PAC Url=PAC 网址 From 4d4d02604cbf113fd8c81513146e7ad7c967aa55 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Fri, 20 Mar 2015 01:08:01 -0400 Subject: [PATCH 03/10] layout by TableLayoutPanel --- shadowsocks-csharp/View/PACUrlForm.Designer.cs | 64 ++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/shadowsocks-csharp/View/PACUrlForm.Designer.cs b/shadowsocks-csharp/View/PACUrlForm.Designer.cs index feff4bb1..ae8dbcdd 100644 --- a/shadowsocks-csharp/View/PACUrlForm.Designer.cs +++ b/shadowsocks-csharp/View/PACUrlForm.Designer.cs @@ -32,11 +32,16 @@ this.PACUrlLabel = new System.Windows.Forms.Label(); this.OkButton = new System.Windows.Forms.Button(); this.CancelButton = new System.Windows.Forms.Button(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel1.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); this.SuspendLayout(); // // PACUrlTextBox // - this.PACUrlTextBox.Location = new System.Drawing.Point(61, 12); + this.PACUrlTextBox.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.PACUrlTextBox.Location = new System.Drawing.Point(53, 3); this.PACUrlTextBox.MaxLength = 256; this.PACUrlTextBox.Name = "PACUrlTextBox"; this.PACUrlTextBox.Size = new System.Drawing.Size(245, 20); @@ -45,16 +50,19 @@ // // PACUrlLabel // + this.PACUrlLabel.Anchor = System.Windows.Forms.AnchorStyles.Left; this.PACUrlLabel.AutoSize = true; - this.PACUrlLabel.Location = new System.Drawing.Point(6, 15); + this.PACUrlLabel.Location = new System.Drawing.Point(3, 6); + this.PACUrlLabel.Margin = new System.Windows.Forms.Padding(3); this.PACUrlLabel.Name = "PACUrlLabel"; this.PACUrlLabel.Size = new System.Drawing.Size(44, 13); this.PACUrlLabel.TabIndex = 3; this.PACUrlLabel.Text = "PAC Url"; + this.PACUrlLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // OkButton // - this.OkButton.Location = new System.Drawing.Point(150, 50); + this.OkButton.Location = new System.Drawing.Point(3, 3); this.OkButton.Name = "OkButton"; this.OkButton.Size = new System.Drawing.Size(75, 23); this.OkButton.TabIndex = 5; @@ -64,7 +72,7 @@ // // CancelButton // - this.CancelButton.Location = new System.Drawing.Point(231, 50); + this.CancelButton.Location = new System.Drawing.Point(84, 3); this.CancelButton.Name = "CancelButton"; this.CancelButton.Size = new System.Drawing.Size(75, 23); this.CancelButton.TabIndex = 6; @@ -72,24 +80,60 @@ this.CancelButton.UseVisualStyleBackColor = true; this.CancelButton.Click += new System.EventHandler(this.CancelButton_Click); // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.AutoSize = true; + this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.Controls.Add(this.PACUrlLabel, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.PACUrlTextBox, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 1, 1); + this.tableLayoutPanel1.Location = new System.Drawing.Point(9, 9); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + 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(301, 61); + this.tableLayoutPanel1.TabIndex = 7; + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.tableLayoutPanel2.AutoSize = true; + this.tableLayoutPanel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanel2.ColumnCount = 2; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel2.Controls.Add(this.OkButton, 0, 0); + this.tableLayoutPanel2.Controls.Add(this.CancelButton, 1, 0); + this.tableLayoutPanel2.Location = new System.Drawing.Point(136, 29); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 1; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel2.Size = new System.Drawing.Size(162, 29); + this.tableLayoutPanel2.TabIndex = 5; + // // PACUrlForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoSize = true; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.ClientSize = new System.Drawing.Size(327, 88); - this.Controls.Add(this.CancelButton); - this.Controls.Add(this.OkButton); - this.Controls.Add(this.PACUrlTextBox); - this.Controls.Add(this.PACUrlLabel); + this.ClientSize = new System.Drawing.Size(351, 101); + this.Controls.Add(this.tableLayoutPanel1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "PACUrlForm"; + this.Padding = new System.Windows.Forms.Padding(3); this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Update Online PAC URL"; this.Load += new System.EventHandler(this.PACUrlForm_Load); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + this.tableLayoutPanel2.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -101,5 +145,7 @@ private System.Windows.Forms.Label PACUrlLabel; private System.Windows.Forms.Button OkButton; private System.Windows.Forms.Button CancelButton; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; } } \ No newline at end of file From 1bb01bb68e186c82dcc285e3fc5f9783a968ffcc Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Fri, 20 Mar 2015 01:37:05 -0400 Subject: [PATCH 04/10] rename CancelButton to MyCancelButton --- shadowsocks-csharp/View/PACUrlForm.Designer.cs | 22 +++++++++++----------- shadowsocks-csharp/View/PACUrlForm.cs | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/shadowsocks-csharp/View/PACUrlForm.Designer.cs b/shadowsocks-csharp/View/PACUrlForm.Designer.cs index ae8dbcdd..f2c48632 100644 --- a/shadowsocks-csharp/View/PACUrlForm.Designer.cs +++ b/shadowsocks-csharp/View/PACUrlForm.Designer.cs @@ -31,7 +31,7 @@ this.PACUrlTextBox = new System.Windows.Forms.TextBox(); this.PACUrlLabel = new System.Windows.Forms.Label(); this.OkButton = new System.Windows.Forms.Button(); - this.CancelButton = new System.Windows.Forms.Button(); + this.MyCancelButton = new System.Windows.Forms.Button(); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); this.tableLayoutPanel1.SuspendLayout(); @@ -70,15 +70,15 @@ this.OkButton.UseVisualStyleBackColor = true; this.OkButton.Click += new System.EventHandler(this.OkButton_Click); // - // CancelButton + // MyCancelButton // - this.CancelButton.Location = new System.Drawing.Point(84, 3); - this.CancelButton.Name = "CancelButton"; - this.CancelButton.Size = new System.Drawing.Size(75, 23); - this.CancelButton.TabIndex = 6; - this.CancelButton.Text = "Cancel"; - this.CancelButton.UseVisualStyleBackColor = true; - this.CancelButton.Click += new System.EventHandler(this.CancelButton_Click); + this.MyCancelButton.Location = new System.Drawing.Point(84, 3); + this.MyCancelButton.Name = "MyCancelButton"; + this.MyCancelButton.Size = new System.Drawing.Size(75, 23); + this.MyCancelButton.TabIndex = 6; + this.MyCancelButton.Text = "Cancel"; + this.MyCancelButton.UseVisualStyleBackColor = true; + this.MyCancelButton.Click += new System.EventHandler(this.MyCancelButton_Click); // // tableLayoutPanel1 // @@ -107,7 +107,7 @@ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); this.tableLayoutPanel2.Controls.Add(this.OkButton, 0, 0); - this.tableLayoutPanel2.Controls.Add(this.CancelButton, 1, 0); + this.tableLayoutPanel2.Controls.Add(this.MyCancelButton, 1, 0); this.tableLayoutPanel2.Location = new System.Drawing.Point(136, 29); this.tableLayoutPanel2.Name = "tableLayoutPanel2"; this.tableLayoutPanel2.RowCount = 1; @@ -144,7 +144,7 @@ private System.Windows.Forms.TextBox PACUrlTextBox; private System.Windows.Forms.Label PACUrlLabel; private System.Windows.Forms.Button OkButton; - private System.Windows.Forms.Button CancelButton; + private System.Windows.Forms.Button MyCancelButton; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; } diff --git a/shadowsocks-csharp/View/PACUrlForm.cs b/shadowsocks-csharp/View/PACUrlForm.cs index d2232700..b2e93d48 100644 --- a/shadowsocks-csharp/View/PACUrlForm.cs +++ b/shadowsocks-csharp/View/PACUrlForm.cs @@ -31,7 +31,7 @@ namespace Shadowsocks.View private void UpdateTexts() { OkButton.Text = I18N.GetString("OK"); - CancelButton.Text = I18N.GetString("Cancel"); + MyCancelButton.Text = I18N.GetString("Cancel"); PACUrlLabel.Text = I18N.GetString("PAC Url"); this.Text = I18N.GetString("Update Online PAC URL"); } @@ -61,7 +61,7 @@ namespace Shadowsocks.View this.Close(); } - private void CancelButton_Click(object sender, EventArgs e) + private void MyCancelButton_Click(object sender, EventArgs e) { this.Close(); } From b762c8046a86a4c56980db73e9a6c4c2cdc80bff Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Fri, 20 Mar 2015 21:14:27 +0800 Subject: [PATCH 05/10] Direct set the system PAC to the online PAC URL --- shadowsocks-csharp/Controller/PACServer.cs | 29 +--------------------------- shadowsocks-csharp/Controller/SystemProxy.cs | 7 ++++++- 2 files changed, 7 insertions(+), 29 deletions(-) diff --git a/shadowsocks-csharp/Controller/PACServer.cs b/shadowsocks-csharp/Controller/PACServer.cs index b987e84d..e193d9b4 100755 --- a/shadowsocks-csharp/Controller/PACServer.cs +++ b/shadowsocks-csharp/Controller/PACServer.cs @@ -71,10 +71,7 @@ namespace Shadowsocks.Controller } if (hostMatch && pathMatch) { - if (_config.useOnlinePac && !string.IsNullOrEmpty(_config.pacUrl)) - RedirectToOnlinePAC(firstPacket, length, socket, useSocks); - else - SendResponse(firstPacket, length, socket, useSocks); + SendResponse(firstPacket, length, socket, useSocks); return true; } return false; @@ -124,30 +121,6 @@ namespace Shadowsocks.Controller } } - private void RedirectToOnlinePAC(byte[] firstPacket, int length, Socket socket, bool useSocks) - { - try - { - string friendlyMessage = "Redirect to online pac " + _config.pacUrl; - string text = String.Format(@"HTTP/1.1 302 Found -Server: Shadowsocks -Content-Type: text/html; charset=utf-8 -Location: {0} -Content-Length: {1} -Connection: Close - -", _config.pacUrl, System.Text.Encoding.UTF8.GetBytes(friendlyMessage).Length) + friendlyMessage; - byte[] response = System.Text.Encoding.UTF8.GetBytes(text); - socket.BeginSend(response, 0, response.Length, 0, new AsyncCallback(SendCallback), socket); - Util.Utils.ReleaseMemory(); - } - catch (Exception e) - { - Console.WriteLine(e); - socket.Close(); - } - } - public void SendResponse(byte[] firstPacket, int length, Socket socket, bool useSocks) { try diff --git a/shadowsocks-csharp/Controller/SystemProxy.cs b/shadowsocks-csharp/Controller/SystemProxy.cs index dfbc4bc1..5fe8a244 100755 --- a/shadowsocks-csharp/Controller/SystemProxy.cs +++ b/shadowsocks-csharp/Controller/SystemProxy.cs @@ -49,9 +49,14 @@ namespace Shadowsocks.Controller } else { + string pacUrl; + if (config.useOnlinePac && !string.IsNullOrEmpty(config.pacUrl)) + pacUrl = config.pacUrl; + else + pacUrl = "http://127.0.0.1:" + config.localPort.ToString() + "/pac?t=" + GetTimestamp(DateTime.Now); registry.SetValue("ProxyEnable", 0); registry.SetValue("ProxyServer", ""); - registry.SetValue("AutoConfigURL", "http://127.0.0.1:" + config.localPort.ToString() + "/pac?t=" + GetTimestamp(DateTime.Now)); + registry.SetValue("AutoConfigURL", pacUrl); } } else From 5f2ec3ccff4504ed09616e44a472a1ca88612bfd Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Fri, 20 Mar 2015 21:26:31 +0800 Subject: [PATCH 06/10] Use VB.NET InputBox instead of implement a message box --- shadowsocks-csharp/Data/cn.txt | 2 +- shadowsocks-csharp/View/MenuViewController.cs | 30 ++--- shadowsocks-csharp/View/PACUrlForm.Designer.cs | 151 ------------------------- shadowsocks-csharp/View/PACUrlForm.cs | 69 ----------- shadowsocks-csharp/View/PACUrlForm.resx | 120 -------------------- shadowsocks-csharp/shadowsocks-csharp.csproj | 10 +- 6 files changed, 10 insertions(+), 372 deletions(-) delete mode 100644 shadowsocks-csharp/View/PACUrlForm.Designer.cs delete mode 100644 shadowsocks-csharp/View/PACUrlForm.cs delete mode 100644 shadowsocks-csharp/View/PACUrlForm.resx diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index 43cffdf2..90a2b2c0 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -45,7 +45,7 @@ QRCode=二维码 Local PAC=使用本地 PAC Online PAC=使用在线 PAC Update Online PAC URL=更新在线 PAC 网址 -PAC Url=PAC 网址 +Please input PAC Url=请输入 PAC 网址 # Messages diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index f60be124..53284975 100755 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -38,7 +38,6 @@ namespace Shadowsocks.View private MenuItem localPACItem; private MenuItem onlinePACItem; private ConfigForm configForm; - private PACUrlForm pacUrlForm; private string _urlToOpen; public MenuViewController(ShadowsocksController controller) @@ -513,30 +512,17 @@ namespace Shadowsocks.View } } - private void showPACUrlForm() + private void UpdateOnlinePACURLItem_Click(object sender, EventArgs e) { - if (pacUrlForm != null) - { - pacUrlForm.Activate(); - } - else + string origPacUrl = controller.GetConfiguration().pacUrl; + string pacUrl = Microsoft.VisualBasic.Interaction.InputBox( + I18N.GetString("Please input PAC Url"), + I18N.GetString("Update Online PAC URL"), + origPacUrl, -1, -1); + if (!string.IsNullOrEmpty(pacUrl) && pacUrl != origPacUrl) { - pacUrlForm = new PACUrlForm(controller); - pacUrlForm.Show(); - pacUrlForm.FormClosed += pacUrlForm_FormClosed; + controller.SavePACUrl(pacUrl); } } - - private void pacUrlForm_FormClosed(object sender, FormClosedEventArgs e) - { - pacUrlForm = null; - Util.Utils.ReleaseMemory(); - ShowFirstTimeBalloon(); - } - - private void UpdateOnlinePACURLItem_Click(object sender, EventArgs e) - { - showPACUrlForm(); - } } } diff --git a/shadowsocks-csharp/View/PACUrlForm.Designer.cs b/shadowsocks-csharp/View/PACUrlForm.Designer.cs deleted file mode 100644 index f2c48632..00000000 --- a/shadowsocks-csharp/View/PACUrlForm.Designer.cs +++ /dev/null @@ -1,151 +0,0 @@ -namespace Shadowsocks.View -{ - partial class PACUrlForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.PACUrlTextBox = new System.Windows.Forms.TextBox(); - this.PACUrlLabel = new System.Windows.Forms.Label(); - this.OkButton = new System.Windows.Forms.Button(); - this.MyCancelButton = new System.Windows.Forms.Button(); - this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); - this.tableLayoutPanel1.SuspendLayout(); - this.tableLayoutPanel2.SuspendLayout(); - this.SuspendLayout(); - // - // PACUrlTextBox - // - this.PACUrlTextBox.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.PACUrlTextBox.Location = new System.Drawing.Point(53, 3); - this.PACUrlTextBox.MaxLength = 256; - this.PACUrlTextBox.Name = "PACUrlTextBox"; - this.PACUrlTextBox.Size = new System.Drawing.Size(245, 20); - this.PACUrlTextBox.TabIndex = 4; - this.PACUrlTextBox.WordWrap = false; - // - // PACUrlLabel - // - this.PACUrlLabel.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.PACUrlLabel.AutoSize = true; - this.PACUrlLabel.Location = new System.Drawing.Point(3, 6); - this.PACUrlLabel.Margin = new System.Windows.Forms.Padding(3); - this.PACUrlLabel.Name = "PACUrlLabel"; - this.PACUrlLabel.Size = new System.Drawing.Size(44, 13); - this.PACUrlLabel.TabIndex = 3; - this.PACUrlLabel.Text = "PAC Url"; - this.PACUrlLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // - // OkButton - // - this.OkButton.Location = new System.Drawing.Point(3, 3); - this.OkButton.Name = "OkButton"; - this.OkButton.Size = new System.Drawing.Size(75, 23); - this.OkButton.TabIndex = 5; - this.OkButton.Text = "OK"; - this.OkButton.UseVisualStyleBackColor = true; - this.OkButton.Click += new System.EventHandler(this.OkButton_Click); - // - // MyCancelButton - // - this.MyCancelButton.Location = new System.Drawing.Point(84, 3); - this.MyCancelButton.Name = "MyCancelButton"; - this.MyCancelButton.Size = new System.Drawing.Size(75, 23); - this.MyCancelButton.TabIndex = 6; - this.MyCancelButton.Text = "Cancel"; - this.MyCancelButton.UseVisualStyleBackColor = true; - this.MyCancelButton.Click += new System.EventHandler(this.MyCancelButton_Click); - // - // tableLayoutPanel1 - // - this.tableLayoutPanel1.AutoSize = true; - this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.tableLayoutPanel1.ColumnCount = 2; - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel1.Controls.Add(this.PACUrlLabel, 0, 0); - this.tableLayoutPanel1.Controls.Add(this.PACUrlTextBox, 1, 0); - this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 1, 1); - this.tableLayoutPanel1.Location = new System.Drawing.Point(9, 9); - this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.RowCount = 2; - 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(301, 61); - this.tableLayoutPanel1.TabIndex = 7; - // - // tableLayoutPanel2 - // - this.tableLayoutPanel2.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.tableLayoutPanel2.AutoSize = true; - this.tableLayoutPanel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.tableLayoutPanel2.ColumnCount = 2; - this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel2.Controls.Add(this.OkButton, 0, 0); - this.tableLayoutPanel2.Controls.Add(this.MyCancelButton, 1, 0); - this.tableLayoutPanel2.Location = new System.Drawing.Point(136, 29); - this.tableLayoutPanel2.Name = "tableLayoutPanel2"; - this.tableLayoutPanel2.RowCount = 1; - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.Size = new System.Drawing.Size(162, 29); - this.tableLayoutPanel2.TabIndex = 5; - // - // PACUrlForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.AutoSize = true; - this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.ClientSize = new System.Drawing.Size(351, 101); - this.Controls.Add(this.tableLayoutPanel1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "PACUrlForm"; - this.Padding = new System.Windows.Forms.Padding(3); - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "Update Online PAC URL"; - this.Load += new System.EventHandler(this.PACUrlForm_Load); - this.tableLayoutPanel1.ResumeLayout(false); - this.tableLayoutPanel1.PerformLayout(); - this.tableLayoutPanel2.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.TextBox PACUrlTextBox; - private System.Windows.Forms.Label PACUrlLabel; - private System.Windows.Forms.Button OkButton; - private System.Windows.Forms.Button MyCancelButton; - private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; - private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; - } -} \ No newline at end of file diff --git a/shadowsocks-csharp/View/PACUrlForm.cs b/shadowsocks-csharp/View/PACUrlForm.cs deleted file mode 100644 index b2e93d48..00000000 --- a/shadowsocks-csharp/View/PACUrlForm.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using Shadowsocks.Controller; -using Shadowsocks.Model; -using Shadowsocks.Properties; - -namespace Shadowsocks.View -{ - public partial class PACUrlForm : Form - { - private ShadowsocksController controller; - private string orig_pacUrl; - - public PACUrlForm(ShadowsocksController controller) - { - this.Font = System.Drawing.SystemFonts.MessageBoxFont; - InitializeComponent(); - - UpdateTexts(); - this.Icon = Icon.FromHandle(Resources.ssw128.GetHicon()); - - this.controller = controller; - controller.ConfigChanged += controller_ConfigChanged; - } - - private void UpdateTexts() - { - OkButton.Text = I18N.GetString("OK"); - MyCancelButton.Text = I18N.GetString("Cancel"); - PACUrlLabel.Text = I18N.GetString("PAC Url"); - this.Text = I18N.GetString("Update Online PAC URL"); - } - - private void controller_ConfigChanged(object sender, EventArgs e) - { - orig_pacUrl = PACUrlTextBox.Text = controller.GetConfiguration().pacUrl; - } - - private void PACUrlForm_Load(object sender, EventArgs e) - { - PACUrlTextBox.Text = controller.GetConfiguration().pacUrl; - } - - private void OkButton_Click(object sender, EventArgs e) - { - string pacUrl = PACUrlTextBox.Text.Trim(); - if (string.IsNullOrEmpty(pacUrl)) - { - MessageBox.Show(I18N.GetString("PAC Url can not be blank")); - return; - } - if (pacUrl != this.orig_pacUrl) - { - controller.SavePACUrl(pacUrl); - } - this.Close(); - } - - private void MyCancelButton_Click(object sender, EventArgs e) - { - this.Close(); - } - } -} diff --git a/shadowsocks-csharp/View/PACUrlForm.resx b/shadowsocks-csharp/View/PACUrlForm.resx deleted file mode 100644 index 7080a7d1..00000000 --- a/shadowsocks-csharp/View/PACUrlForm.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index 273b9f52..aa2c9000 100755 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -63,6 +63,7 @@ app.manifest + @@ -162,12 +163,6 @@ - - Form - - - PACUrlForm.cs - Form @@ -186,9 +181,6 @@ Designer Resources.Designer.cs - - PACUrlForm.cs - QRCodeForm.cs From 80dc5c0e9065b7216afcc5276417eb8d868104fd Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Fri, 20 Mar 2015 21:51:07 +0800 Subject: [PATCH 07/10] remove not use message --- shadowsocks-csharp/Data/cn.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index 90a2b2c0..22a6478b 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -70,5 +70,4 @@ No QRCode found. Try to zoom in or move it to the center of the screen.=未发 Failed to decode QRCode=无法解析二维码 Failed to update registry=无法修改注册表 System Proxy On: =系统代理已启用: -Running: Port {0}=正在运行:端口 {0} -PAC Url can not be blank=PAC 网址不能为空 +Running: Port {0}=正在运行:端口 {0} \ No newline at end of file From 00f57ee329f76fe2306f964fe121017b57d2379c Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Sat, 21 Mar 2015 18:47:05 +0800 Subject: [PATCH 08/10] validate user input --- shadowsocks-csharp/Data/cn.txt | 5 +++-- shadowsocks-csharp/View/MenuViewController.cs | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index 22a6478b..80c2bbf7 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -45,7 +45,7 @@ QRCode=二维码 Local PAC=使用本地 PAC Online PAC=使用在线 PAC Update Online PAC URL=更新在线 PAC 网址 -Please input PAC Url=请输入 PAC 网址 +Please input PAC Url, e.g. http://autoproxy2pac.appspot.com/pac/proxy/127.0.0.1/1080=请输入 PAC 网址,例如:http://autoproxy2pac.appspot.com/pac/proxy/127.0.0.1/1080 # Messages @@ -70,4 +70,5 @@ No QRCode found. Try to zoom in or move it to the center of the screen.=未发 Failed to decode QRCode=无法解析二维码 Failed to update registry=无法修改注册表 System Proxy On: =系统代理已启用: -Running: Port {0}=正在运行:端口 {0} \ No newline at end of file +Running: Port {0}=正在运行:端口 {0} +Please input a valid url=请输入一个有效的网址 \ No newline at end of file diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index 53284975..3a854865 100755 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -515,10 +515,20 @@ namespace Shadowsocks.View private void UpdateOnlinePACURLItem_Click(object sender, EventArgs e) { string origPacUrl = controller.GetConfiguration().pacUrl; - string pacUrl = Microsoft.VisualBasic.Interaction.InputBox( - I18N.GetString("Please input PAC Url"), - I18N.GetString("Update Online PAC URL"), - origPacUrl, -1, -1); + string pacUrl = null; + while (true) + { + pacUrl = Microsoft.VisualBasic.Interaction.InputBox( + I18N.GetString("Please input PAC Url, e.g. http://autoproxy2pac.appspot.com/pac/proxy/127.0.0.1/1080"), + I18N.GetString("Update Online PAC URL"), + pacUrl == null ? origPacUrl : pacUrl, -1, -1); + if (!string.IsNullOrEmpty(pacUrl) && !System.Text.RegularExpressions.Regex.IsMatch(pacUrl, + @"^http(s)?://([a-zA-Z0-9_-]+)(\.[a-zA-Z0-9_-]+)/?", System.Text.RegularExpressions.RegexOptions.IgnoreCase)) + MessageBox.Show(I18N.GetString("Please input a valid url")); + else + break; + } + if (!string.IsNullOrEmpty(pacUrl) && pacUrl != origPacUrl) { controller.SavePACUrl(pacUrl); From c6e6d019f137adb02cf642971a5c557f2933fbb7 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Sat, 21 Mar 2015 19:02:17 +0800 Subject: [PATCH 09/10] fix regular expression --- shadowsocks-csharp/View/MenuViewController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index 3a854865..365276b0 100755 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -523,7 +523,7 @@ namespace Shadowsocks.View I18N.GetString("Update Online PAC URL"), pacUrl == null ? origPacUrl : pacUrl, -1, -1); if (!string.IsNullOrEmpty(pacUrl) && !System.Text.RegularExpressions.Regex.IsMatch(pacUrl, - @"^http(s)?://([a-zA-Z0-9_-]+)(\.[a-zA-Z0-9_-]+)/?", System.Text.RegularExpressions.RegexOptions.IgnoreCase)) + @"^http(s)?://([a-zA-Z0-9_-]+)+(\.[a-zA-Z0-9_-]+)+((/|\?)[\w \.\/\?%&= ]*)?$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)) MessageBox.Show(I18N.GetString("Please input a valid url")); else break; From 532a53c97123e462963dcb33ee513a017800c667 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Sat, 21 Mar 2015 19:07:58 +0800 Subject: [PATCH 10/10] revert --- shadowsocks-csharp/Data/cn.txt | 5 ++--- shadowsocks-csharp/View/MenuViewController.cs | 18 ++++-------------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index 80c2bbf7..22a6478b 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -45,7 +45,7 @@ QRCode=二维码 Local PAC=使用本地 PAC Online PAC=使用在线 PAC Update Online PAC URL=更新在线 PAC 网址 -Please input PAC Url, e.g. http://autoproxy2pac.appspot.com/pac/proxy/127.0.0.1/1080=请输入 PAC 网址,例如:http://autoproxy2pac.appspot.com/pac/proxy/127.0.0.1/1080 +Please input PAC Url=请输入 PAC 网址 # Messages @@ -70,5 +70,4 @@ No QRCode found. Try to zoom in or move it to the center of the screen.=未发 Failed to decode QRCode=无法解析二维码 Failed to update registry=无法修改注册表 System Proxy On: =系统代理已启用: -Running: Port {0}=正在运行:端口 {0} -Please input a valid url=请输入一个有效的网址 \ No newline at end of file +Running: Port {0}=正在运行:端口 {0} \ No newline at end of file diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index 365276b0..53284975 100755 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -515,20 +515,10 @@ namespace Shadowsocks.View private void UpdateOnlinePACURLItem_Click(object sender, EventArgs e) { string origPacUrl = controller.GetConfiguration().pacUrl; - string pacUrl = null; - while (true) - { - pacUrl = Microsoft.VisualBasic.Interaction.InputBox( - I18N.GetString("Please input PAC Url, e.g. http://autoproxy2pac.appspot.com/pac/proxy/127.0.0.1/1080"), - I18N.GetString("Update Online PAC URL"), - pacUrl == null ? origPacUrl : pacUrl, -1, -1); - if (!string.IsNullOrEmpty(pacUrl) && !System.Text.RegularExpressions.Regex.IsMatch(pacUrl, - @"^http(s)?://([a-zA-Z0-9_-]+)+(\.[a-zA-Z0-9_-]+)+((/|\?)[\w \.\/\?%&= ]*)?$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)) - MessageBox.Show(I18N.GetString("Please input a valid url")); - else - break; - } - + string pacUrl = Microsoft.VisualBasic.Interaction.InputBox( + I18N.GetString("Please input PAC Url"), + I18N.GetString("Update Online PAC URL"), + origPacUrl, -1, -1); if (!string.IsNullOrEmpty(pacUrl) && pacUrl != origPacUrl) { controller.SavePACUrl(pacUrl);