@@ -10,6 +10,7 @@ namespace shadowsocks_csharp | |||||
[Serializable] | [Serializable] | ||||
public class Config | public class Config | ||||
{ | { | ||||
public bool enabled; | |||||
public string server; | public string server; | ||||
public int server_port; | public int server_port; | ||||
public int local_port; | public int local_port; | ||||
@@ -51,6 +52,7 @@ namespace shadowsocks_csharp | |||||
local_port = 1080, | local_port = 1080, | ||||
password = "barfoo!", | password = "barfoo!", | ||||
method = "table", | method = "table", | ||||
enabled = true, | |||||
isDefault = true | isDefault = true | ||||
}; | }; | ||||
} | } | ||||
@@ -68,7 +70,8 @@ namespace shadowsocks_csharp | |||||
server_port = config.server_port, | server_port = config.server_port, | ||||
local_port = config.local_port, | local_port = config.local_port, | ||||
password = config.password, | password = config.password, | ||||
method = config.method | |||||
method = config.method, | |||||
enabled = config.enabled | |||||
}); | }); | ||||
sw.Write(jsonString); | sw.Write(jsonString); | ||||
sw.Flush(); | sw.Flush(); | ||||
@@ -42,18 +42,17 @@ | |||||
this.textBox3 = new System.Windows.Forms.TextBox(); | this.textBox3 = new System.Windows.Forms.TextBox(); | ||||
this.textBox4 = new System.Windows.Forms.TextBox(); | this.textBox4 = new System.Windows.Forms.TextBox(); | ||||
this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); | this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); | ||||
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); | |||||
this.ConfigItem = new System.Windows.Forms.ToolStripMenuItem(); | |||||
this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); | |||||
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); | |||||
this.QuitItem = new System.Windows.Forms.ToolStripMenuItem(); | |||||
this.panel2 = new System.Windows.Forms.Panel(); | this.panel2 = new System.Windows.Forms.Panel(); | ||||
this.button1 = new System.Windows.Forms.Button(); | this.button1 = new System.Windows.Forms.Button(); | ||||
this.button2 = new System.Windows.Forms.Button(); | this.button2 = new System.Windows.Forms.Button(); | ||||
this.panel1 = new System.Windows.Forms.Panel(); | this.panel1 = new System.Windows.Forms.Panel(); | ||||
this.EnableItem = new System.Windows.Forms.ToolStripMenuItem(); | |||||
this.contextMenu1 = new System.Windows.Forms.ContextMenu(); | |||||
this.enableItem = new System.Windows.Forms.MenuItem(); | |||||
this.aboutItem = new System.Windows.Forms.MenuItem(); | |||||
this.menuItem3 = new System.Windows.Forms.MenuItem(); | |||||
this.quitItem = new System.Windows.Forms.MenuItem(); | |||||
this.configItem = new System.Windows.Forms.MenuItem(); | |||||
this.tableLayoutPanel1.SuspendLayout(); | this.tableLayoutPanel1.SuspendLayout(); | ||||
this.contextMenuStrip1.SuspendLayout(); | |||||
this.panel1.SuspendLayout(); | this.panel1.SuspendLayout(); | ||||
this.SuspendLayout(); | this.SuspendLayout(); | ||||
// | // | ||||
@@ -192,50 +191,11 @@ | |||||
// | // | ||||
// notifyIcon1 | // notifyIcon1 | ||||
// | // | ||||
this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1; | |||||
this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon"))); | this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon"))); | ||||
this.notifyIcon1.Text = "shadowsocks"; | this.notifyIcon1.Text = "shadowsocks"; | ||||
this.notifyIcon1.Visible = true; | this.notifyIcon1.Visible = true; | ||||
this.notifyIcon1.DoubleClick += new System.EventHandler(this.notifyIcon1_DoubleClick); | this.notifyIcon1.DoubleClick += new System.EventHandler(this.notifyIcon1_DoubleClick); | ||||
// | // | ||||
// contextMenuStrip1 | |||||
// | |||||
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { | |||||
this.EnableItem, | |||||
this.ConfigItem, | |||||
this.aboutToolStripMenuItem, | |||||
this.toolStripSeparator2, | |||||
this.QuitItem}); | |||||
this.contextMenuStrip1.Name = "contextMenuStrip1"; | |||||
this.contextMenuStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; | |||||
this.contextMenuStrip1.Size = new System.Drawing.Size(153, 120); | |||||
// | |||||
// ConfigItem | |||||
// | |||||
this.ConfigItem.Name = "ConfigItem"; | |||||
this.ConfigItem.Size = new System.Drawing.Size(152, 22); | |||||
this.ConfigItem.Text = "Config"; | |||||
this.ConfigItem.Click += new System.EventHandler(this.Config_Click); | |||||
// | |||||
// aboutToolStripMenuItem | |||||
// | |||||
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; | |||||
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(152, 22); | |||||
this.aboutToolStripMenuItem.Text = "About"; | |||||
this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); | |||||
// | |||||
// toolStripSeparator2 | |||||
// | |||||
this.toolStripSeparator2.Name = "toolStripSeparator2"; | |||||
this.toolStripSeparator2.Size = new System.Drawing.Size(149, 6); | |||||
// | |||||
// QuitItem | |||||
// | |||||
this.QuitItem.Name = "QuitItem"; | |||||
this.QuitItem.Size = new System.Drawing.Size(152, 22); | |||||
this.QuitItem.Text = "Quit"; | |||||
this.QuitItem.Click += new System.EventHandler(this.Quit_Click); | |||||
// | |||||
// panel2 | // panel2 | ||||
// | // | ||||
this.panel2.Anchor = System.Windows.Forms.AnchorStyles.Top; | this.panel2.Anchor = System.Windows.Forms.AnchorStyles.Top; | ||||
@@ -280,14 +240,43 @@ | |||||
this.panel1.Size = new System.Drawing.Size(164, 30); | this.panel1.Size = new System.Drawing.Size(164, 30); | ||||
this.panel1.TabIndex = 1; | this.panel1.TabIndex = 1; | ||||
// | // | ||||
// EnableItem | |||||
// contextMenu1 | |||||
// | |||||
this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { | |||||
this.enableItem, | |||||
this.configItem, | |||||
this.aboutItem, | |||||
this.menuItem3, | |||||
this.quitItem}); | |||||
// | |||||
// enableItem | |||||
// | |||||
this.enableItem.Index = 0; | |||||
this.enableItem.Text = "Enable"; | |||||
this.enableItem.Click += new System.EventHandler(this.EnableItem_Click); | |||||
// | |||||
// aboutItem | |||||
// | |||||
this.aboutItem.Index = 2; | |||||
this.aboutItem.Text = "About"; | |||||
this.aboutItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); | |||||
// | |||||
// menuItem3 | |||||
// | |||||
this.menuItem3.Index = 3; | |||||
this.menuItem3.Text = "-"; | |||||
// | |||||
// quitItem | |||||
// | |||||
this.quitItem.Index = 4; | |||||
this.quitItem.Text = "Quit"; | |||||
this.quitItem.Click += new System.EventHandler(this.Quit_Click); | |||||
// | |||||
// configItem | |||||
// | // | ||||
this.EnableItem.Checked = true; | |||||
this.EnableItem.CheckState = System.Windows.Forms.CheckState.Checked; | |||||
this.EnableItem.Name = "EnableItem"; | |||||
this.EnableItem.Size = new System.Drawing.Size(152, 22); | |||||
this.EnableItem.Text = "Enable"; | |||||
this.EnableItem.Click += new System.EventHandler(this.EnableItem_Click); | |||||
this.configItem.Index = 1; | |||||
this.configItem.Text = "Options..."; | |||||
this.configItem.Click += new System.EventHandler(this.Config_Click); | |||||
// | // | ||||
// Form1 | // Form1 | ||||
// | // | ||||
@@ -309,7 +298,6 @@ | |||||
this.Load += new System.EventHandler(this.Form1_Load); | this.Load += new System.EventHandler(this.Form1_Load); | ||||
this.tableLayoutPanel1.ResumeLayout(false); | this.tableLayoutPanel1.ResumeLayout(false); | ||||
this.tableLayoutPanel1.PerformLayout(); | this.tableLayoutPanel1.PerformLayout(); | ||||
this.contextMenuStrip1.ResumeLayout(false); | |||||
this.panel1.ResumeLayout(false); | this.panel1.ResumeLayout(false); | ||||
this.ResumeLayout(false); | this.ResumeLayout(false); | ||||
this.PerformLayout(); | this.PerformLayout(); | ||||
@@ -328,18 +316,18 @@ | |||||
private System.Windows.Forms.TextBox textBox3; | private System.Windows.Forms.TextBox textBox3; | ||||
private System.Windows.Forms.TextBox textBox4; | private System.Windows.Forms.TextBox textBox4; | ||||
private System.Windows.Forms.NotifyIcon notifyIcon1; | private System.Windows.Forms.NotifyIcon notifyIcon1; | ||||
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; | |||||
private System.Windows.Forms.ToolStripMenuItem ConfigItem; | |||||
private System.Windows.Forms.ToolStripMenuItem QuitItem; | |||||
private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; | |||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; | |||||
private System.Windows.Forms.Label label5; | private System.Windows.Forms.Label label5; | ||||
private System.Windows.Forms.ComboBox comboBox1; | private System.Windows.Forms.ComboBox comboBox1; | ||||
private System.Windows.Forms.Panel panel2; | private System.Windows.Forms.Panel panel2; | ||||
private System.Windows.Forms.Button button1; | private System.Windows.Forms.Button button1; | ||||
private System.Windows.Forms.Button button2; | private System.Windows.Forms.Button button2; | ||||
private System.Windows.Forms.Panel panel1; | private System.Windows.Forms.Panel panel1; | ||||
private System.Windows.Forms.ToolStripMenuItem EnableItem; | |||||
private System.Windows.Forms.ContextMenu contextMenu1; | |||||
private System.Windows.Forms.MenuItem enableItem; | |||||
private System.Windows.Forms.MenuItem aboutItem; | |||||
private System.Windows.Forms.MenuItem menuItem3; | |||||
private System.Windows.Forms.MenuItem quitItem; | |||||
private System.Windows.Forms.MenuItem configItem; | |||||
} | } | ||||
} | } | ||||
@@ -19,9 +19,11 @@ namespace shadowsocks_csharp | |||||
{ | { | ||||
config = Config.Load(); | config = Config.Load(); | ||||
InitializeComponent(); | InitializeComponent(); | ||||
notifyIcon1.ContextMenu = contextMenu1; | |||||
enableItem.Checked = config.enabled; | |||||
configToTextBox(); | configToTextBox(); | ||||
} | } | ||||
private void showWindow() | private void showWindow() | ||||
{ | { | ||||
this.Opacity = 1; | this.Opacity = 1; | ||||
@@ -49,6 +51,7 @@ namespace shadowsocks_csharp | |||||
} | } | ||||
pacServer = new PACServer(); | pacServer = new PACServer(); | ||||
pacServer.Start(); | pacServer.Start(); | ||||
updateSystemProxy(); | |||||
} | } | ||||
private void reload(Config config) | private void reload(Config config) | ||||
@@ -120,6 +123,10 @@ namespace shadowsocks_csharp | |||||
{ | { | ||||
if (local != null) local.Stop(); | if (local != null) local.Stop(); | ||||
if (polipoRunner != null) polipoRunner.Stop(); | if (polipoRunner != null) polipoRunner.Stop(); | ||||
if (config.enabled) | |||||
{ | |||||
SystemProxy.Disable(); | |||||
} | |||||
} | } | ||||
private void aboutToolStripMenuItem_Click(object sender, EventArgs e) | private void aboutToolStripMenuItem_Click(object sender, EventArgs e) | ||||
@@ -132,10 +139,9 @@ namespace shadowsocks_csharp | |||||
showWindow(); | showWindow(); | ||||
} | } | ||||
private void EnableItem_Click(object sender, EventArgs e) | |||||
private void updateSystemProxy() | |||||
{ | { | ||||
EnableItem.Checked = !EnableItem.Checked; | |||||
if (EnableItem.Checked) | |||||
if (config.enabled) | |||||
{ | { | ||||
SystemProxy.Enable(); | SystemProxy.Enable(); | ||||
} | } | ||||
@@ -145,5 +151,13 @@ namespace shadowsocks_csharp | |||||
} | } | ||||
} | } | ||||
private void EnableItem_Click(object sender, EventArgs e) | |||||
{ | |||||
enableItem.Checked = !enableItem.Checked; | |||||
config.enabled = enableItem.Checked; | |||||
Config.Save(config); | |||||
updateSystemProxy(); | |||||
} | |||||
} | } | ||||
} | } |
@@ -120,9 +120,6 @@ | |||||
<metadata name="notifyIcon1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> | <metadata name="notifyIcon1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> | ||||
<value>17, 17</value> | <value>17, 17</value> | ||||
</metadata> | </metadata> | ||||
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> | |||||
<value>130, 17</value> | |||||
</metadata> | |||||
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> | <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> | ||||
<data name="notifyIcon1.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | <data name="notifyIcon1.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||||
<value> | <value> | ||||
@@ -148,6 +145,9 @@ | |||||
//8AAP//AAD//w== | //8AAP//AAD//w== | ||||
</value> | </value> | ||||
</data> | </data> | ||||
<metadata name="contextMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> | |||||
<value>146, 19</value> | |||||
</metadata> | |||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||||
<value> | <value> | ||||
AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA | AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA | ||||
@@ -1,6 +1,8 @@ | |||||
using shadowsocks_csharp.Properties; | using shadowsocks_csharp.Properties; | ||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.IO; | |||||
using System.IO.Compression; | |||||
using System.Net; | using System.Net; | ||||
using System.Net.Sockets; | using System.Net.Sockets; | ||||
using System.Text; | using System.Text; | ||||
@@ -46,6 +48,26 @@ namespace shadowsocks_csharp | |||||
} | } | ||||
} | } | ||||
private string getPACContent() | |||||
{ | |||||
// TODO try pac.txt in current directory | |||||
byte[] pacGZ = Resources.proxy_pac_txt; | |||||
byte[] buffer = new byte[1024 * 1024]; // builtin pac gzip size: maximum 1M | |||||
int n; | |||||
using (GZipStream input = new GZipStream(new MemoryStream(pacGZ), | |||||
CompressionMode.Decompress, false)) | |||||
{ | |||||
n = input.Read(buffer, 0, buffer.Length); | |||||
if (n == 0) | |||||
{ | |||||
throw new IOException("can not decompress pac"); | |||||
} | |||||
return System.Text.Encoding.UTF8.GetString(buffer, 0, n); | |||||
} | |||||
} | |||||
private void receiveCallback(IAsyncResult ar) | private void receiveCallback(IAsyncResult ar) | ||||
{ | { | ||||
Socket conn = (Socket)ar.AsyncState; | Socket conn = (Socket)ar.AsyncState; | ||||
@@ -53,7 +75,7 @@ namespace shadowsocks_csharp | |||||
{ | { | ||||
int bytesRead = conn.EndReceive(ar); | int bytesRead = conn.EndReceive(ar); | ||||
string pac = Resources.proxy_pac; | |||||
string pac = getPACContent(); | |||||
string proxy = "PROXY 127.0.0.1:8123; DIRECT;"; | string proxy = "PROXY 127.0.0.1:8123; DIRECT;"; | ||||
@@ -96,33 +96,12 @@ namespace shadowsocks_csharp.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized string similar to // Generated by gfwlist2pac | |||||
///// https://github.com/clowwindy/gfwlist2pac | |||||
/// | |||||
///var domains = { | |||||
/// "gimpshop.com": 1, | |||||
/// "directcreative.com": 1, | |||||
/// "speedpluss.org": 1, | |||||
/// "mingpaovan.com": 1, | |||||
/// "wikinews.org": 1, | |||||
/// "joachims.org": 1, | |||||
/// "maiio.net": 1, | |||||
/// "idv.tw": 1, | |||||
/// "mail-archive.com": 1, | |||||
/// "surfeasy.com.au": 1, | |||||
/// "hihistory.net": 1, | |||||
/// "alexlur.org": 1, | |||||
/// "finalion.jp": 1, | |||||
/// "nrk.no": 1, | |||||
/// "nyt.com": 1, | |||||
/// "cmule.com": 1, | |||||
/// "gappp.org": 1, | |||||
/// "givemesomethingtoread.com": 1, | |||||
/// [rest of string was truncated]";. | |||||
/// Looks up a localized resource of type System.Byte[]. | |||||
/// </summary> | /// </summary> | ||||
internal static string proxy_pac { | |||||
internal static byte[] proxy_pac_txt { | |||||
get { | get { | ||||
return ResourceManager.GetString("proxy_pac", resourceCulture); | |||||
object obj = ResourceManager.GetObject("proxy_pac_txt", resourceCulture); | |||||
return ((byte[])(obj)); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -124,7 +124,7 @@ | |||||
<data name="polipo_exe" type="System.Resources.ResXFileRef, System.Windows.Forms"> | <data name="polipo_exe" type="System.Resources.ResXFileRef, System.Windows.Forms"> | ||||
<value>..\polipo.exe.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | <value>..\polipo.exe.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||||
</data> | </data> | ||||
<data name="proxy_pac" type="System.Resources.ResXFileRef, System.Windows.Forms"> | |||||
<value>..\proxy.pac.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value> | |||||
<data name="proxy_pac_txt" type="System.Resources.ResXFileRef, System.Windows.Forms"> | |||||
<value>..\proxy.pac.txt.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |||||
</data> | </data> | ||||
</root> | </root> |
@@ -126,6 +126,7 @@ | |||||
<DesignTimeSharedInput>True</DesignTimeSharedInput> | <DesignTimeSharedInput>True</DesignTimeSharedInput> | ||||
</Compile> | </Compile> | ||||
<Compile Include="simple-json\src\SimpleJson\SimpleJson.cs" /> | <Compile Include="simple-json\src\SimpleJson\SimpleJson.cs" /> | ||||
<None Include="proxy.pac.txt.gz" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<None Include="config.txt" /> | <None Include="config.txt" /> | ||||