@@ -1,3 +1,7 @@ | |||
2.0.4 | |||
- Try to fix data corruption | |||
- Remove all configuration except x86 | |||
2.0.3 | |||
- Support QRCode generation | |||
- Fix compatibility issues with some Chrome version | |||
@@ -84,18 +84,17 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
qrcodejs | |||
-------- | |||
https://github.com/davidshimjs/qrcodejs | |||
QRCode for C#4.0 Silverlight is translation of QRCode for JavaScript | |||
https://github.com/jeromeetienne/jquery-qrcode/ | |||
Copyright (c) 2012 davidshimjs | |||
Copyright (c) 2009 Kazuhiko Arase | |||
Permission is hereby granted, free of charge, | |||
to any person obtaining a copy of this software and associated documentation files (the "Software"), | |||
to deal in the Software without restriction, | |||
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, | |||
subject to the following conditions: | |||
URL: http://www.d-project.com/ | |||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. | |||
Licensed under the MIT license: | |||
http://www.opensource.org/licenses/mit-license.php | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
The word "QR Code" is registered trademark of | |||
DENSO WAVE INCORPORATED | |||
http://www.denso-wave.com/qrcode/faqpatent-e.html | |||
@@ -16,6 +16,10 @@ Shadowsocks for Windows | |||
Download [latest release]. | |||
For Windows 7 and older, please download Shadowsocks-win-x.x.x.zip. | |||
For Windows 8.1 and newer, please download Shadowsocks-win-dotnet4.0-x.x.x.zip. | |||
### Usage | |||
1. Find Shadowsocks icon in notification tray | |||
@@ -25,8 +29,8 @@ Download [latest release]. | |||
about the change automatically | |||
5. Please disable other proxy addons in your browser, or set them to use | |||
system proxy | |||
6. You may need to install VC 2008 Runtime and .Net 2.0 if Shadowsocks failed to | |||
start | |||
6. You may need to install VC 2008 Runtime and .Net framework if Shadowsocks | |||
failed to start | |||
### License | |||
@@ -5,19 +5,13 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "shadowsocks-csharp", "shado | |||
EndProject | |||
Global | |||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
Debug|Any CPU = Debug|Any CPU | |||
Debug|x86 = Debug|x86 | |||
Release|Any CPU = Release|Any CPU | |||
Release|x86 = Release|x86 | |||
EndGlobalSection | |||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.ActiveCfg = Debug|x86 | |||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Build.0 = Debug|x86 | |||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Deploy.0 = Debug|x86 | |||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|Any CPU.Build.0 = Release|Any CPU | |||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.ActiveCfg = Release|x86 | |||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.Build.0 = Release|x86 | |||
EndGlobalSection | |||
@@ -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,17 +182,17 @@ namespace Shadowsocks.Controller | |||
((IDisposable)encryptor).Dispose(); | |||
} | |||
private void connectCallback(IAsyncResult ar) | |||
private void ConnectCallback(IAsyncResult ar) | |||
{ | |||
try | |||
{ | |||
// Complete the connection. | |||
remote.EndConnect(ar); | |||
Console.WriteLine("Socket connected to {0}", | |||
remote.RemoteEndPoint.ToString()); | |||
//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 | |||
{ | |||
@@ -348,7 +348,6 @@ namespace Shadowsocks.Controller | |||
} | |||
else | |||
{ | |||
Console.WriteLine("bytesRead: " + bytesRead.ToString()); | |||
this.Close(); | |||
} | |||
} | |||
@@ -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) | |||
{ | |||
@@ -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; | |||
} | |||
} | |||
} | |||
@@ -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(); | |||
} | |||
} | |||
@@ -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) | |||
@@ -1,43 +0,0 @@ | |||
<!doctype html> | |||
<html> | |||
<head> | |||
<script> | |||
__QRCODELIB__ | |||
</script> | |||
<style> | |||
html, body, table, div { | |||
padding: 0px; | |||
margin: 0 !important; | |||
} | |||
div#qrcode { | |||
margin: 5px !important; | |||
text-align: center; | |||
vertical-align: center; | |||
} | |||
#qrcode { | |||
width:190px; | |||
height:190px; | |||
} | |||
table { | |||
width: 100%; | |||
height:100%; | |||
} | |||
</style> | |||
</head> | |||
<body> | |||
<div id="qrcode" name="qrcode"></div> | |||
<script type="text/javascript"> | |||
function genCode(code) { | |||
new QRCode("qrcode", { | |||
text: code, | |||
width: 200, | |||
height: 200, | |||
colorDark : "#000000", | |||
colorLight : "#ffffff", | |||
correctLevel : QRCode.CorrectLevel.H | |||
}); | |||
} | |||
genCode("__SSURL__"); | |||
</script> | |||
</body> | |||
</html> |
@@ -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); | |||
} | |||
} | |||
} |
@@ -3,6 +3,7 @@ using System.Collections.Generic; | |||
using System.Runtime.InteropServices; | |||
using System.Security.Cryptography; | |||
using System.Text; | |||
using System.Threading; | |||
namespace Shadowsocks.Encrypt | |||
{ | |||
@@ -166,20 +167,24 @@ namespace Shadowsocks.Encrypt | |||
randBytes(outbuf, ivLen); | |||
InitCipher(ref _encryptCtx, outbuf, true); | |||
outlength = length + ivLen; | |||
switch (_cipher) | |||
lock (tempbuf) | |||
{ | |||
case CIPHER_AES: | |||
PolarSSL.aes_crypt_cfb128(_encryptCtx, PolarSSL.AES_ENCRYPT, length, ref _encryptIVOffset, _encryptIV, buf, tempbuf); | |||
break; | |||
case CIPHER_BF: | |||
PolarSSL.blowfish_crypt_cfb64(_encryptCtx, PolarSSL.BLOWFISH_ENCRYPT, length, ref _encryptIVOffset, _encryptIV, buf, tempbuf); | |||
break; | |||
case CIPHER_RC4: | |||
PolarSSL.arc4_crypt(_encryptCtx, length, buf, tempbuf); | |||
break; | |||
// C# could be multi-threaded | |||
switch (_cipher) | |||
{ | |||
case CIPHER_AES: | |||
PolarSSL.aes_crypt_cfb128(_encryptCtx, PolarSSL.AES_ENCRYPT, length, ref _encryptIVOffset, _encryptIV, buf, tempbuf); | |||
break; | |||
case CIPHER_BF: | |||
PolarSSL.blowfish_crypt_cfb64(_encryptCtx, PolarSSL.BLOWFISH_ENCRYPT, length, ref _encryptIVOffset, _encryptIV, buf, tempbuf); | |||
break; | |||
case CIPHER_RC4: | |||
PolarSSL.arc4_crypt(_encryptCtx, length, buf, tempbuf); | |||
break; | |||
} | |||
outlength = length + ivLen; | |||
Buffer.BlockCopy(tempbuf, 0, outbuf, ivLen, outlength); | |||
} | |||
outlength = length + ivLen; | |||
Buffer.BlockCopy(tempbuf, 0, outbuf, ivLen, outlength); | |||
} | |||
else | |||
{ | |||
@@ -205,18 +210,22 @@ namespace Shadowsocks.Encrypt | |||
{ | |||
InitCipher(ref _decryptCtx, buf, false); | |||
outlength = length - ivLen; | |||
Buffer.BlockCopy(buf, ivLen, tempbuf, 0, length - ivLen); | |||
switch (_cipher) | |||
lock (tempbuf) | |||
{ | |||
case CIPHER_AES: | |||
PolarSSL.aes_crypt_cfb128(_decryptCtx, PolarSSL.AES_DECRYPT, length - ivLen, ref _decryptIVOffset, _decryptIV, tempbuf, outbuf); | |||
break; | |||
case CIPHER_BF: | |||
PolarSSL.blowfish_crypt_cfb64(_decryptCtx, PolarSSL.BLOWFISH_DECRYPT, length - ivLen, ref _decryptIVOffset, _decryptIV, tempbuf, outbuf); | |||
break; | |||
case CIPHER_RC4: | |||
PolarSSL.arc4_crypt(_decryptCtx, length - ivLen, tempbuf, outbuf); | |||
break; | |||
// C# could be multi-threaded | |||
Buffer.BlockCopy(buf, ivLen, tempbuf, 0, length - ivLen); | |||
switch (_cipher) | |||
{ | |||
case CIPHER_AES: | |||
PolarSSL.aes_crypt_cfb128(_decryptCtx, PolarSSL.AES_DECRYPT, length - ivLen, ref _decryptIVOffset, _decryptIV, tempbuf, outbuf); | |||
break; | |||
case CIPHER_BF: | |||
PolarSSL.blowfish_crypt_cfb64(_decryptCtx, PolarSSL.BLOWFISH_DECRYPT, length - ivLen, ref _decryptIVOffset, _decryptIV, tempbuf, outbuf); | |||
break; | |||
case CIPHER_RC4: | |||
PolarSSL.arc4_crypt(_decryptCtx, length - ivLen, tempbuf, outbuf); | |||
break; | |||
} | |||
} | |||
} | |||
else | |||
@@ -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 | |||
} | |||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices; | |||
// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值, | |||
// 方法是按如下所示使用“*”: | |||
// [assembly: AssemblyVersion("1.0.*")] | |||
[assembly: AssemblyVersion("2.0.3")] | |||
[assembly: AssemblyVersion("2.0.4")] | |||
// [assembly: AssemblyFileVersion("2.0.0")] |
@@ -104,50 +104,5 @@ namespace Shadowsocks.Properties { | |||
return ((byte[])(obj)); | |||
} | |||
} | |||
/// <summary> | |||
/// Looks up a localized string similar to <!doctype html> | |||
///<html> | |||
///<head> | |||
///<script> | |||
/// __QRCODELIB__ | |||
///</script> | |||
///<style> | |||
/// body { | |||
/// padding: 10px; | |||
/// margin: 0; | |||
/// } | |||
/// #qrcode { | |||
/// width:300px; | |||
/// height:300px; | |||
/// } | |||
///</style> | |||
///</head> | |||
///<body> | |||
///<div id="qrcode" name="qrcode"></div> | |||
///<script type="text/javascript"> | |||
/// function genCode(code) { | |||
/// new QRCode("qrcode", { | |||
/// text: code, | |||
/// width: 300, | |||
/// height: 300, | |||
/// colorDark : "#000000", | |||
/// colorLig [rest of string was truncated]";. | |||
/// </summary> | |||
internal static string qrcode { | |||
get { | |||
return ResourceManager.GetString("qrcode", resourceCulture); | |||
} | |||
} | |||
/// <summary> | |||
/// Looks up a localized resource of type System.Byte[]. | |||
/// </summary> | |||
internal static byte[] qrcode_min_js { | |||
get { | |||
object obj = ResourceManager.GetObject("qrcode_min_js", resourceCulture); | |||
return ((byte[])(obj)); | |||
} | |||
} | |||
} | |||
} |
@@ -130,10 +130,4 @@ | |||
<data name="proxy_pac_txt" type="System.Resources.ResXFileRef, System.Windows.Forms"> | |||
<value>..\Data\proxy.pac.txt.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |||
</data> | |||
<data name="qrcode" type="System.Resources.ResXFileRef, System.Windows.Forms"> | |||
<value>..\Data\qrcode.htm;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value> | |||
</data> | |||
<data name="qrcode_min_js" type="System.Resources.ResXFileRef, System.Windows.Forms"> | |||
<value>..\Data\qrcode.min.js.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |||
</data> | |||
</root> |
@@ -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); | |||
@@ -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(); | |||
} | |||
@@ -305,7 +305,9 @@ namespace Shadowsocks.View | |||
private void QRCodeItem_Click(object sender, EventArgs e) | |||
{ | |||
new QRCodeForm(controller.GetQRCodeForCurrentServer()).Show(); | |||
QRCodeForm qrCodeForm = new QRCodeForm(controller.GetQRCodeForCurrentServer()); | |||
qrCodeForm.Icon = this.Icon; | |||
qrCodeForm.Show(); | |||
} | |||
} | |||
} |
@@ -28,42 +28,56 @@ | |||
/// </summary> | |||
private void InitializeComponent() | |||
{ | |||
this.QRCodeWebBrowser = new System.Windows.Forms.WebBrowser(); | |||
this.pictureBox1 = new System.Windows.Forms.PictureBox(); | |||
this.panel1 = new System.Windows.Forms.Panel(); | |||
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); | |||
this.panel1.SuspendLayout(); | |||
this.SuspendLayout(); | |||
// | |||
// QRCodeWebBrowser | |||
// pictureBox1 | |||
// | |||
this.QRCodeWebBrowser.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | |||
| System.Windows.Forms.AnchorStyles.Left) | |||
| System.Windows.Forms.AnchorStyles.Right))); | |||
this.QRCodeWebBrowser.Location = new System.Drawing.Point(0, 0); | |||
this.QRCodeWebBrowser.Margin = new System.Windows.Forms.Padding(0); | |||
this.QRCodeWebBrowser.MinimumSize = new System.Drawing.Size(20, 20); | |||
this.QRCodeWebBrowser.Name = "QRCodeWebBrowser"; | |||
this.QRCodeWebBrowser.ScriptErrorsSuppressed = true; | |||
this.QRCodeWebBrowser.ScrollBarsEnabled = false; | |||
this.QRCodeWebBrowser.Size = new System.Drawing.Size(200, 200); | |||
this.QRCodeWebBrowser.TabIndex = 0; | |||
this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill; | |||
this.pictureBox1.Location = new System.Drawing.Point(10, 10); | |||
this.pictureBox1.Margin = new System.Windows.Forms.Padding(0); | |||
this.pictureBox1.Name = "pictureBox1"; | |||
this.pictureBox1.Size = new System.Drawing.Size(204, 202); | |||
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; | |||
this.pictureBox1.TabIndex = 1; | |||
this.pictureBox1.TabStop = false; | |||
// | |||
// panel1 | |||
// | |||
this.panel1.Controls.Add(this.pictureBox1); | |||
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; | |||
this.panel1.Location = new System.Drawing.Point(0, 0); | |||
this.panel1.Margin = new System.Windows.Forms.Padding(0); | |||
this.panel1.Name = "panel1"; | |||
this.panel1.Padding = new System.Windows.Forms.Padding(10); | |||
this.panel1.Size = new System.Drawing.Size(224, 222); | |||
this.panel1.TabIndex = 2; | |||
// | |||
// QRCodeForm | |||
// | |||
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(204, 202); | |||
this.Controls.Add(this.QRCodeWebBrowser); | |||
this.ClientSize = new System.Drawing.Size(224, 222); | |||
this.Controls.Add(this.panel1); | |||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; | |||
this.MaximizeBox = false; | |||
this.MinimizeBox = false; | |||
this.Name = "QRCodeForm"; | |||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; | |||
this.Text = "QRCode"; | |||
this.Load += new System.EventHandler(this.QRCodeForm_Load); | |||
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); | |||
this.panel1.ResumeLayout(false); | |||
this.ResumeLayout(false); | |||
} | |||
#endregion | |||
private System.Windows.Forms.WebBrowser QRCodeWebBrowser; | |||
private System.Windows.Forms.PictureBox pictureBox1; | |||
private System.Windows.Forms.Panel panel1; | |||
} | |||
} |
@@ -1,4 +1,5 @@ | |||
using Shadowsocks.Properties; | |||
using QRCode4CS; | |||
using Shadowsocks.Properties; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.ComponentModel; | |||
@@ -21,32 +22,49 @@ namespace Shadowsocks.View | |||
InitializeComponent(); | |||
} | |||
private string QRCodeHTML(string ssURL) | |||
private void GenQR(string ssconfig) | |||
{ | |||
string html = Resources.qrcode; | |||
string qrcodeLib; | |||
byte[] qrcodeGZ = Resources.qrcode_min_js; | |||
byte[] buffer = new byte[1024 * 1024]; // builtin pac gzip size: maximum 1M | |||
int n; | |||
using (GZipStream input = new GZipStream(new MemoryStream(qrcodeGZ), | |||
CompressionMode.Decompress, false)) | |||
string qrText = ssconfig; | |||
QRCode4CS.QRCode qrCoded = new QRCode4CS.QRCode(6, QRErrorCorrectLevel.H); | |||
qrCoded.AddData(qrText); | |||
qrCoded.Make(); | |||
int blockSize = 5; | |||
Bitmap drawArea = new Bitmap((qrCoded.GetModuleCount() * blockSize), (qrCoded.GetModuleCount() * blockSize)); | |||
for (int row = 0; row < qrCoded.GetModuleCount(); row++) | |||
{ | |||
n = input.Read(buffer, 0, buffer.Length); | |||
if (n == 0) | |||
for (int col = 0; col < qrCoded.GetModuleCount(); col++) | |||
{ | |||
throw new IOException("can not decompress qrcode lib"); | |||
bool isDark = qrCoded.IsDark(row, col); | |||
if (isDark) | |||
{ | |||
for (int y = 0; y < blockSize; y++) | |||
{ | |||
int myCol = (blockSize * (col - 1)) + (y + blockSize); | |||
for (int x = 0; x < blockSize; x++) | |||
{ | |||
drawArea.SetPixel((blockSize * (row - 1)) + (x + blockSize), myCol, Color.Black); | |||
} | |||
} | |||
} | |||
else | |||
{ | |||
for (int y = 0; y < blockSize; y++) | |||
{ | |||
int myCol = (blockSize * (col - 1)) + (y + blockSize); | |||
for (int x = 0; x < blockSize; x++) | |||
{ | |||
drawArea.SetPixel((blockSize * (row - 1)) + (x + blockSize), myCol, Color.White); | |||
} | |||
} | |||
} | |||
} | |||
qrcodeLib = System.Text.Encoding.UTF8.GetString(buffer, 0, n); | |||
} | |||
string result = html.Replace("__QRCODELIB__", qrcodeLib); | |||
return result.Replace("__SSURL__", ssURL); | |||
pictureBox1.Image = drawArea; | |||
} | |||
private void QRCodeForm_Load(object sender, EventArgs e) | |||
{ | |||
QRCodeWebBrowser.DocumentText = QRCodeHTML(code); | |||
GenQR(code); | |||
} | |||
} | |||
} |
@@ -1,6 +1,6 @@ | |||
<?xml version="1.0"?> | |||
<configuration> | |||
<startup> | |||
<supportedRuntime version="v2.0.50727"/> | |||
<supportedRuntime version="v4.0"/> | |||
<supportedRuntime version="v2.0.50727"/> | |||
</startup></configuration> |
@@ -21,7 +21,8 @@ | |||
<UpgradeBackupLocation> | |||
</UpgradeBackupLocation> | |||
<OldToolsVersion>3.5</OldToolsVersion> | |||
<TargetFrameworkProfile /> | |||
<TargetFrameworkProfile> | |||
</TargetFrameworkProfile> | |||
<PublishUrl>publish\</PublishUrl> | |||
<Install>true</Install> | |||
<InstallFrom>Disk</InstallFrom> | |||
@@ -37,26 +38,6 @@ | |||
<UseApplicationTrust>false</UseApplicationTrust> | |||
<BootstrapperEnabled>true</BootstrapperEnabled> | |||
</PropertyGroup> | |||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | |||
<DebugSymbols>true</DebugSymbols> | |||
<DebugType>full</DebugType> | |||
<Optimize>false</Optimize> | |||
<OutputPath>bin\Debug\</OutputPath> | |||
<DefineConstants>TRACE;DEBUG;SIMPLE_JSON_NO_LINQ_EXPRESSION</DefineConstants> | |||
<ErrorReport>prompt</ErrorReport> | |||
<WarningLevel>4</WarningLevel> | |||
<Prefer32Bit>false</Prefer32Bit> | |||
<UseVSHostingProcess>true</UseVSHostingProcess> | |||
</PropertyGroup> | |||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> | |||
<DebugType>pdbonly</DebugType> | |||
<Optimize>true</Optimize> | |||
<OutputPath>bin\Release\</OutputPath> | |||
<DefineConstants>TRACE;SIMPLE_JSON_NO_LINQ_EXPRESSION</DefineConstants> | |||
<ErrorReport>prompt</ErrorReport> | |||
<WarningLevel>4</WarningLevel> | |||
<Prefer32Bit>false</Prefer32Bit> | |||
</PropertyGroup> | |||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> | |||
<DebugSymbols>true</DebugSymbols> | |||
<OutputPath>bin\x86\Debug\</OutputPath> | |||
@@ -65,26 +46,26 @@ | |||
<PlatformTarget>x86</PlatformTarget> | |||
<ErrorReport>prompt</ErrorReport> | |||
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> | |||
<Prefer32Bit>false</Prefer32Bit> | |||
</PropertyGroup> | |||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> | |||
<OutputPath>bin\x86\Release\</OutputPath> | |||
<DefineConstants>TRACE;SIMPLE_JSON_NO_LINQ_EXPRESSION</DefineConstants> | |||
<DefineConstants>TRACE</DefineConstants> | |||
<Optimize>true</Optimize> | |||
<DebugType>pdbonly</DebugType> | |||
<PlatformTarget>x86</PlatformTarget> | |||
<ErrorReport>prompt</ErrorReport> | |||
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> | |||
<Prefer32Bit>false</Prefer32Bit> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<Reference Include="Microsoft.VisualBasic" /> | |||
<Reference Include="Microsoft.VisualBasic.PowerPacks.Vs, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" /> | |||
<Reference Include="System" /> | |||
<Reference Include="System.Data" /> | |||
<Reference Include="System.Drawing" /> | |||
<Reference Include="System.Windows.Forms" /> | |||
<Reference Include="System.Xml" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Compile Include="3rd\QRCodeCS.cs" /> | |||
<Compile Include="3rd\SimpleJson.cs" /> | |||
<Compile Include="Controller\FileManager.cs" /> | |||
<Compile Include="Encrypt\EncryptorBase.cs" /> | |||
@@ -134,7 +115,6 @@ | |||
<None Include="app.config" /> | |||
<None Include="Data\polarssl.dll.gz" /> | |||
<None Include="Data\polipo.exe.gz" /> | |||
<None Include="Data\qrcode.min.js.gz" /> | |||
<None Include="Properties\Settings.settings"> | |||
<Generator>SettingsSingleFileGenerator</Generator> | |||
<LastGenOutput>Settings.Designer.cs</LastGenOutput> | |||
@@ -147,7 +127,6 @@ | |||
<None Include="Data\proxy.pac.txt.gz" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Include="Data\qrcode.htm" /> | |||
<Content Include="shadowsocks.ico" /> | |||
<None Include="Data\polipo_config.txt" /> | |||
</ItemGroup> | |||