Browse Source

Merge pull request #35 from wzxjohn/master

add cancel button for config
tags/3.2
clowwindy 10 years ago
parent
commit
f67413bdc6
9 changed files with 153 additions and 131 deletions
  1. +15
    -15
      shadowsocks-csharp/Controller/Local.cs
  2. +14
    -14
      shadowsocks-csharp/Controller/PACServer.cs
  3. +15
    -15
      shadowsocks-csharp/Controller/PolipoRunner.cs
  4. +16
    -16
      shadowsocks-csharp/Controller/ShadowsocksController.cs
  5. +35
    -14
      shadowsocks-csharp/Controller/SystemProxy.cs
  6. +15
    -15
      shadowsocks-csharp/Encrypt/EncryptorFactory.cs
  7. +10
    -10
      shadowsocks-csharp/Model/Configuration.cs
  8. +8
    -7
      shadowsocks-csharp/View/ConfigForm.Designer.cs
  9. +25
    -25
      shadowsocks-csharp/View/ConfigForm.cs

+ 15
- 15
shadowsocks-csharp/Controller/Local.cs View File

@@ -13,7 +13,7 @@ namespace Shadowsocks.Controller
{
private Server config;
//private Encryptor encryptor;
Socket listener;
Socket _listener;
public Local(Server config)
{
this.config = config;
@@ -25,24 +25,24 @@ namespace Shadowsocks.Controller
try
{
// Create a TCP/IP socket.
listener = new Socket(AddressFamily.InterNetwork,
_listener = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint localEndPoint = new IPEndPoint(0, config.local_port);
// Bind the socket to the local endpoint and listen for incoming connections.
listener.Bind(localEndPoint);
listener.Listen(100);
_listener.Bind(localEndPoint);
_listener.Listen(100);
// Start an asynchronous socket to listen for connections.
Console.WriteLine("Shadowsocks started");
listener.BeginAccept(
_listener.BeginAccept(
new AsyncCallback(AcceptCallback),
listener);
_listener);
}
catch(SocketException)
{
listener.Close();
_listener.Close();
throw;
}
@@ -50,7 +50,7 @@ namespace Shadowsocks.Controller
public void Stop()
{
listener.Close();
_listener.Close();
}
@@ -90,7 +90,7 @@ namespace Shadowsocks.Controller
//handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
// new AsyncCallback(ReadCallback), state);
}
catch (Exception)
catch
{
//Console.WriteLine(e.Message);
}
@@ -141,7 +141,7 @@ namespace Shadowsocks.Controller
// Connect to the remote endpoint.
remote.BeginConnect(remoteEP,
new AsyncCallback(connectCallback), null);
new AsyncCallback(ConnectCallback), null);
}
catch (Exception e)
{
@@ -182,7 +182,7 @@ namespace Shadowsocks.Controller
((IDisposable)encryptor).Dispose();
}
private void connectCallback(IAsyncResult ar)
private void ConnectCallback(IAsyncResult ar)
{
try
{
@@ -192,7 +192,7 @@ namespace Shadowsocks.Controller
//Console.WriteLine("Socket connected to {0}",
// remote.RemoteEndPoint.ToString());
handshakeReceive();
HandshakeReceive();
}
catch (Exception e)
{
@@ -201,12 +201,12 @@ namespace Shadowsocks.Controller
}
}
private void handshakeReceive()
private void HandshakeReceive()
{
try
{
connection.BeginReceive(connetionRecvBuffer, 0, 256, 0,
new AsyncCallback(handshakeReceiveCallback), null);
new AsyncCallback(HandshakeReceiveCallback), null);
}
catch (Exception e)
{
@@ -215,7 +215,7 @@ namespace Shadowsocks.Controller
}
}
private void handshakeReceiveCallback(IAsyncResult ar)
private void HandshakeReceiveCallback(IAsyncResult ar)
{
try
{


+ 14
- 14
shadowsocks-csharp/Controller/PACServer.cs View File

@@ -33,7 +33,7 @@ namespace Shadowsocks.Controller
new AsyncCallback(AcceptCallback),
listener);
watchPACFile();
WatchPacFile();
}
public string TouchPACFile()
@@ -61,7 +61,7 @@ namespace Shadowsocks.Controller
Socket conn = listener.EndAccept(ar);
conn.BeginReceive(new byte[1024], 0, 1024, 0,
new AsyncCallback(receiveCallback), conn);
new AsyncCallback(ReceiveCallback), conn);
}
catch (Exception e)
{
@@ -69,7 +69,7 @@ namespace Shadowsocks.Controller
}
}
private string getPACContent()
private string GetPACContent()
{
if (File.Exists(PAC_FILE))
{
@@ -92,17 +92,17 @@ namespace Shadowsocks.Controller
return System.Text.Encoding.UTF8.GetString(buffer, 0, n);
}
}
watchPACFile();
WatchPacFile();
}
private void receiveCallback(IAsyncResult ar)
private void ReceiveCallback(IAsyncResult ar)
{
Socket conn = (Socket)ar.AsyncState;
try
{
int bytesRead = conn.EndReceive(ar);
string pac = getPACContent();
string pac = GetPACContent();
string proxy = "PROXY 127.0.0.1:8123;";
@@ -118,7 +118,7 @@ Connection: Close
", System.Text.Encoding.UTF8.GetBytes(pac).Length) + pac;
byte[] response = System.Text.Encoding.UTF8.GetBytes(text);
conn.BeginSend(response, 0, response.Length, 0, new AsyncCallback(sendCallback), conn);
conn.BeginSend(response, 0, response.Length, 0, new AsyncCallback(SendCallback), conn);
}
else
{
@@ -132,13 +132,13 @@ Connection: Close
}
}
private void sendCallback(IAsyncResult ar)
private void SendCallback(IAsyncResult ar)
{
Socket conn = (Socket)ar.AsyncState;
conn.Shutdown(SocketShutdown.Send);
}
private void watchPACFile()
private void WatchPacFile()
{
if (watcher != null)
{
@@ -147,14 +147,14 @@ Connection: Close
watcher = new FileSystemWatcher(Directory.GetCurrentDirectory());
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = PAC_FILE;
watcher.Changed += watcher_Changed;
watcher.Created += watcher_Changed;
watcher.Deleted += watcher_Changed;
watcher.Renamed += watcher_Changed;
watcher.Changed += Watcher_Changed;
watcher.Created += Watcher_Changed;
watcher.Deleted += Watcher_Changed;
watcher.Renamed += Watcher_Changed;
watcher.EnableRaisingEvents = true;
}
void watcher_Changed(object sender, FileSystemEventArgs e)
private void Watcher_Changed(object sender, FileSystemEventArgs e)
{
if (PACFileChanged != null)
{


+ 15
- 15
shadowsocks-csharp/Controller/PolipoRunner.cs View File

@@ -11,11 +11,11 @@ namespace Shadowsocks.Controller
{
class PolipoRunner
{
private Process process;
private Process _process;
public void Start(Server config)
{
if (process == null)
if (_process == null)
{
Process[] existingPolipo = Process.GetProcessesByName("ss_polipo");
foreach (Process p in existingPolipo)
@@ -36,34 +36,34 @@ namespace Shadowsocks.Controller
FileManager.ByteArrayToFile(temppath + "/polipo.conf", System.Text.Encoding.UTF8.GetBytes(polipoConfig));
FileManager.UncompressFile(temppath + "/ss_polipo.exe", Resources.polipo_exe);
process = new Process();
_process = new Process();
// Configure the process using the StartInfo properties.
process.StartInfo.FileName = temppath + "/ss_polipo.exe";
process.StartInfo.Arguments = "-c \"" + temppath + "/polipo.conf\"";
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
_process.StartInfo.FileName = temppath + "/ss_polipo.exe";
_process.StartInfo.Arguments = "-c \"" + temppath + "/polipo.conf\"";
_process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
_process.StartInfo.UseShellExecute = false;
_process.StartInfo.CreateNoWindow = true;
_process.StartInfo.RedirectStandardOutput = true;
_process.StartInfo.RedirectStandardError = true;
//process.StandardOutput
process.Start();
_process.Start();
}
}
public void Stop()
{
if (process != null)
if (_process != null)
{
try
{
process.Kill();
process.WaitForExit();
_process.Kill();
_process.WaitForExit();
}
catch (InvalidOperationException)
{
// do nothing
}
process = null;
_process = null;
}
}
}


+ 16
- 16
shadowsocks-csharp/Controller/ShadowsocksController.cs View File

@@ -14,7 +14,7 @@ namespace Shadowsocks.Controller
private Local local;
private PACServer pacServer;
private Configuration config;
private Configuration _config;
private PolipoRunner polipoRunner;
private bool stopped = false;
@@ -31,10 +31,10 @@ namespace Shadowsocks.Controller
public ShadowsocksController()
{
config = Configuration.Load();
_config = Configuration.Load();
polipoRunner = new PolipoRunner();
polipoRunner.Start(config.GetCurrentServer());
local = new Local(config.GetCurrentServer());
polipoRunner.Start(_config.GetCurrentServer());
local = new Local(_config.GetCurrentServer());
try
{
local.Start();
@@ -47,20 +47,20 @@ namespace Shadowsocks.Controller
Console.WriteLine(e.Message);
}
updateSystemProxy();
UpdateSystemProxy();
}
public void SaveConfig(Configuration newConfig)
{
Configuration.Save(newConfig);
// some logic in configuration updated the config when saving, we need to read it again
config = Configuration.Load();
_config = Configuration.Load();
local.Stop();
polipoRunner.Stop();
polipoRunner.Start(config.GetCurrentServer());
polipoRunner.Start(_config.GetCurrentServer());
local = new Local(config.GetCurrentServer());
local = new Local(_config.GetCurrentServer());
local.Start();
if (ConfigChanged != null)
@@ -71,7 +71,7 @@ namespace Shadowsocks.Controller
public Server GetCurrentServer()
{
return config.GetCurrentServer();
return _config.GetCurrentServer();
}
// always return copy
@@ -83,9 +83,9 @@ namespace Shadowsocks.Controller
public void ToggleEnable(bool enabled)
{
config.enabled = enabled;
updateSystemProxy();
SaveConfig(config);
_config.enabled = enabled;
UpdateSystemProxy();
SaveConfig(_config);
if (EnableStatusChanged != null)
{
EnableStatusChanged(this, new EventArgs());
@@ -101,7 +101,7 @@ namespace Shadowsocks.Controller
stopped = true;
local.Stop();
polipoRunner.Stop();
if (config.enabled)
if (_config.enabled)
{
SystemProxy.Disable();
}
@@ -124,9 +124,9 @@ namespace Shadowsocks.Controller
return "ss://" + base64;
}
private void updateSystemProxy()
private void UpdateSystemProxy()
{
if (config.enabled)
if (_config.enabled)
{
SystemProxy.Enable();
}
@@ -138,7 +138,7 @@ namespace Shadowsocks.Controller
private void pacServer_PACFileChanged(object sender, EventArgs e)
{
updateSystemProxy();
UpdateSystemProxy();
}
}


+ 35
- 14
shadowsocks-csharp/Controller/SystemProxy.cs View File

@@ -1,4 +1,5 @@
using Microsoft.Win32;
using System.Windows.Forms;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
@@ -13,32 +14,52 @@ namespace Shadowsocks.Controller
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
public const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
public const int INTERNET_OPTION_REFRESH = 37;
static bool settingsReturn, refreshReturn;
static bool _settingsReturn, _refreshReturn;
public static void NotifyIE()
{
// These lines implement the Interface in the beginning of program
// They cause the OS to refresh the settings, causing IP to realy update
settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
_settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
_refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
}
public static void Enable()
{
RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
registry.SetValue("ProxyEnable", 0);
registry.SetValue("ProxyServer", "");
registry.SetValue("AutoConfigURL", "http://127.0.0.1:8090/pac?t=" + GetTimestamp(DateTime.Now));
SystemProxy.NotifyIE();
try
{
RegistryKey registry =
Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
true);
registry.SetValue("ProxyEnable", 0);
registry.SetValue("ProxyServer", "");
registry.SetValue("AutoConfigURL", "http://127.0.0.1:8090/pac?t=" + GetTimestamp(DateTime.Now));
SystemProxy.NotifyIE();
}
catch (Exception)
{
MessageBox.Show("can not change registry!");
throw;
}
}
public static void Disable()
{
RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
registry.SetValue("ProxyEnable", 0);
registry.SetValue("ProxyServer", "");
registry.SetValue("AutoConfigURL", "");
SystemProxy.NotifyIE();
try
{
RegistryKey registry =
Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
true);
registry.SetValue("ProxyEnable", 0);
registry.SetValue("ProxyServer", "");
registry.SetValue("AutoConfigURL", "");
SystemProxy.NotifyIE();
}
catch (Exception)
{
MessageBox.Show("can not change registry!");
throw;
}
}
private static String GetTimestamp(DateTime value)


+ 15
- 15
shadowsocks-csharp/Encrypt/EncryptorFactory.cs View File

@@ -1,16 +1,16 @@

namespace Shadowsocks.Encrypt
{
public static class EncryptorFactory
{
public static IEncryptor GetEncryptor(string method, string password)
{
if (string.IsNullOrEmpty(method) || method.ToLowerInvariant() == "table")
{
return new TableEncryptor(method, password);
}
return new PolarSSLEncryptor(method, password);
}
}
}
namespace Shadowsocks.Encrypt
{
public static class EncryptorFactory
{
public static IEncryptor GetEncryptor(string method, string password)
{
if (string.IsNullOrEmpty(method) || method.ToLowerInvariant() == "table")
{
return new TableEncryptor(method, password);
}
return new PolarSSLEncryptor(method, password);
}
}
}

+ 10
- 10
shadowsocks-csharp/Model/Configuration.cs View File

@@ -33,11 +33,11 @@ namespace Shadowsocks.Model
public static void CheckServer(Server server)
{
checkPort(server.local_port);
checkPort(server.server_port);
checkPassword(server.password);
checkServer(server.server);
checkRemark(server.remarks);
CheckPort(server.local_port);
CheckPort(server.server_port);
CheckPassword(server.password);
CheckServer(server.server);
CheckRemark(server.remarks);
}
public static Configuration Load()
@@ -106,7 +106,7 @@ namespace Shadowsocks.Model
};
}
private static void assert(bool condition)
private static void Assert(bool condition)
{
if (!condition)
{
@@ -114,7 +114,7 @@ namespace Shadowsocks.Model
}
}
private static void checkPort(int port)
private static void CheckPort(int port)
{
if (port <= 0 || port > 65535)
{
@@ -122,7 +122,7 @@ namespace Shadowsocks.Model
}
}
private static void checkPassword(string password)
private static void CheckPassword(string password)
{
if (string.IsNullOrEmpty(password))
{
@@ -130,7 +130,7 @@ namespace Shadowsocks.Model
}
}
private static void checkServer(string server)
private static void CheckServer(string server)
{
if (string.IsNullOrEmpty(server))
{
@@ -138,7 +138,7 @@ namespace Shadowsocks.Model
}
}
private static void checkRemark(string remark)
private static void CheckRemark(string remark)
{
//remark is optional
}


+ 8
- 7
shadowsocks-csharp/View/ConfigForm.Designer.cs View File

@@ -55,6 +55,7 @@
this.ConfigItem = new System.Windows.Forms.MenuItem();
this.menuItem4 = new System.Windows.Forms.MenuItem();
this.editPACFileItem = new System.Windows.Forms.MenuItem();
this.QRCodeItem = 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();
@@ -63,7 +64,6 @@
this.AddButton = new System.Windows.Forms.Button();
this.ServerGroupBox = new System.Windows.Forms.GroupBox();
this.ServersListBox = new System.Windows.Forms.ListBox();
this.QRCodeItem = new System.Windows.Forms.MenuItem();
this.tableLayoutPanel1.SuspendLayout();
this.panel1.SuspendLayout();
this.panel3.SuspendLayout();
@@ -329,6 +329,12 @@
this.editPACFileItem.Text = "Edit &PAC File...";
this.editPACFileItem.Click += new System.EventHandler(this.EditPACFileItem_Click);
//
// QRCodeItem
//
this.QRCodeItem.Index = 4;
this.QRCodeItem.Text = "Show &QRCode...";
this.QRCodeItem.Click += new System.EventHandler(this.QRCodeItem_Click);
//
// aboutItem
//
this.aboutItem.Index = 5;
@@ -396,18 +402,13 @@
this.ServersListBox.TabIndex = 5;
this.ServersListBox.SelectedIndexChanged += new System.EventHandler(this.ServersListBox_SelectedIndexChanged);
//
// QRCodeItem
//
this.QRCodeItem.Index = 4;
this.QRCodeItem.Text = "Show &QRCode...";
this.QRCodeItem.Click += new System.EventHandler(this.QRCodeItem_Click);
//
// ConfigForm
//
this.AcceptButton = this.OKButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.AutoSize = true;
this.CancelButton = this.MyCancelButton;
this.ClientSize = new System.Drawing.Size(489, 286);
this.Controls.Add(this.ServersListBox);
this.Controls.Add(this.ServerGroupBox);


+ 25
- 25
shadowsocks-csharp/View/ConfigForm.cs View File

@@ -29,12 +29,12 @@ namespace Shadowsocks.View
controller.ConfigChanged += controller_ConfigChanged;
controller.PACFileReadyToOpen += controller_PACFileReadyToOpen;
loadCurrentConfiguration();
LoadCurrentConfiguration();
}
private void controller_ConfigChanged(object sender, EventArgs e)
{
loadCurrentConfiguration();
LoadCurrentConfiguration();
}
private void controller_EnableStatusChanged(object sender, EventArgs e)
@@ -50,14 +50,14 @@ namespace Shadowsocks.View
}
private void showWindow()
private void ShowWindow()
{
this.Opacity = 1;
this.Show();
IPTextBox.Focus();
}
private bool saveOldSelectedServer()
private bool SaveOldSelectedServer()
{
try
{
@@ -89,7 +89,7 @@ namespace Shadowsocks.View
return false;
}
private void loadSelectedServer()
private void LoadSelectedServer()
{
if (ServersListBox.SelectedIndex >= 0 && ServersListBox.SelectedIndex < modifiedConfiguration.configs.Count)
{
@@ -102,7 +102,7 @@ namespace Shadowsocks.View
EncryptionSelect.Text = server.method == null ? "aes-256-cfb" : server.method;
RemarksTextBox.Text = server.remarks;
ServerGroupBox.Visible = true;
IPTextBox.Focus();
//IPTextBox.Focus();
}
else
{
@@ -110,7 +110,7 @@ namespace Shadowsocks.View
}
}
private void loadConfiguration(Configuration configuration)
private void LoadConfiguration(Configuration configuration)
{
ServersListBox.Items.Clear();
foreach (Server server in modifiedConfiguration.configs)
@@ -119,19 +119,19 @@ namespace Shadowsocks.View
}
}
private void loadCurrentConfiguration()
private void LoadCurrentConfiguration()
{
modifiedConfiguration = controller.GetConfiguration();
loadConfiguration(modifiedConfiguration);
LoadConfiguration(modifiedConfiguration);
oldSelectedIndex = modifiedConfiguration.index;
ServersListBox.SelectedIndex = modifiedConfiguration.index;
loadSelectedServer();
LoadSelectedServer();
updateServersMenu();
UpdateServersMenu();
enableItem.Checked = modifiedConfiguration.enabled;
}
private void updateServersMenu()
private void UpdateServersMenu()
{
var items = ServersItem.MenuItems;
@@ -178,25 +178,25 @@ namespace Shadowsocks.View
// we are moving back to oldSelectedIndex or doing a force move
return;
}
if (!saveOldSelectedServer())
if (!SaveOldSelectedServer())
{
// why this won't cause stack overflow?
ServersListBox.SelectedIndex = oldSelectedIndex;
return;
}
loadSelectedServer();
LoadSelectedServer();
oldSelectedIndex = ServersListBox.SelectedIndex;
}
private void AddButton_Click(object sender, EventArgs e)
{
if (!saveOldSelectedServer())
if (!SaveOldSelectedServer())
{
return;
}
Server server = Configuration.GetDefaultServer();
modifiedConfiguration.configs.Add(server);
loadConfiguration(modifiedConfiguration);
LoadConfiguration(modifiedConfiguration);
ServersListBox.SelectedIndex = modifiedConfiguration.configs.Count - 1;
oldSelectedIndex = ServersListBox.SelectedIndex;
}
@@ -214,14 +214,14 @@ namespace Shadowsocks.View
oldSelectedIndex = modifiedConfiguration.configs.Count - 1;
}
ServersListBox.SelectedIndex = oldSelectedIndex;
loadConfiguration(modifiedConfiguration);
LoadConfiguration(modifiedConfiguration);
ServersListBox.SelectedIndex = oldSelectedIndex;
loadSelectedServer();
LoadSelectedServer();
}
private void Config_Click(object sender, EventArgs e)
{
showWindow();
ShowWindow();
}
private void Quit_Click(object sender, EventArgs e)
@@ -229,7 +229,7 @@ namespace Shadowsocks.View
this.Close();
}
private void showFirstTimeBalloon()
private void ShowFirstTimeBalloon()
{
if (isFirstRun)
{
@@ -242,7 +242,7 @@ namespace Shadowsocks.View
private void OKButton_Click(object sender, EventArgs e)
{
if (!saveOldSelectedServer())
if (!SaveOldSelectedServer())
{
return;
}
@@ -253,14 +253,14 @@ namespace Shadowsocks.View
}
controller.SaveConfig(modifiedConfiguration);
this.Hide();
showFirstTimeBalloon();
ShowFirstTimeBalloon();
}
private void CancelButton_Click(object sender, EventArgs e)
{
this.Hide();
loadCurrentConfiguration();
showFirstTimeBalloon();
LoadCurrentConfiguration();
ShowFirstTimeBalloon();
}
private void ConfigForm_FormClosed(object sender, FormClosedEventArgs e)
@@ -275,7 +275,7 @@ namespace Shadowsocks.View
private void notifyIcon1_DoubleClick(object sender, EventArgs e)
{
showWindow();
ShowWindow();
}


Loading…
Cancel
Save