Browse Source

support onetime auth

tags/3.0
Gang Zhuo 9 years ago
parent
commit
1564e9ff81
16 changed files with 219 additions and 84 deletions
  1. +1
    -1
      shadowsocks-csharp/Controller/Service/TCPRelay.cs
  2. +1
    -0
      shadowsocks-csharp/Data/cn.txt
  3. BIN
      shadowsocks-csharp/Data/libsscrypto2.dll.gz
  4. +3
    -1
      shadowsocks-csharp/Encryption/EncryptorBase.cs
  5. +3
    -3
      shadowsocks-csharp/Encryption/EncryptorFactory.cs
  6. +66
    -2
      shadowsocks-csharp/Encryption/IVEncryptor.cs
  7. +2
    -2
      shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs
  8. +36
    -1
      shadowsocks-csharp/Encryption/Sodium.cs
  9. +2
    -2
      shadowsocks-csharp/Encryption/SodiumEncryptor.cs
  10. +2
    -2
      shadowsocks-csharp/Encryption/TableEncryptor.cs
  11. +5
    -0
      shadowsocks-csharp/Model/Server.cs
  12. +57
    -49
      shadowsocks-csharp/Properties/Resources.Designer.cs
  13. +3
    -0
      shadowsocks-csharp/Properties/Resources.resx
  14. +33
    -20
      shadowsocks-csharp/View/ConfigForm.Designer.cs
  15. +4
    -1
      shadowsocks-csharp/View/ConfigForm.cs
  16. +1
    -0
      shadowsocks-csharp/shadowsocks-csharp.csproj

+ 1
- 1
shadowsocks-csharp/Controller/Service/TCPRelay.cs View File

@@ -124,7 +124,7 @@ namespace Shadowsocks.Controller
{ {
throw new ArgumentException("No server configured"); throw new ArgumentException("No server configured");
} }
this.encryptor = EncryptorFactory.GetEncryptor(server.method, server.password);
this.encryptor = EncryptorFactory.GetEncryptor(server.method, server.password, server.one_time_auth);
this.server = server; this.server = server;
} }


+ 1
- 0
shadowsocks-csharp/Data/cn.txt View File

@@ -39,6 +39,7 @@ Password=密码
Encryption=加密 Encryption=加密
Proxy Port=代理端口 Proxy Port=代理端口
Remarks=备注 Remarks=备注
One-time authorization=一次性授权
OK=确定 OK=确定
Cancel=取消 Cancel=取消
New server=未配置的服务器 New server=未配置的服务器


BIN
shadowsocks-csharp/Data/libsscrypto2.dll.gz View File


+ 3
- 1
shadowsocks-csharp/Encryption/EncryptorBase.cs View File

@@ -8,14 +8,16 @@ namespace Shadowsocks.Encryption
{ {
public const int MAX_INPUT_SIZE = 32768; public const int MAX_INPUT_SIZE = 32768;
protected EncryptorBase(string method, string password)
protected EncryptorBase(string method, string password, bool onetimeauth)
{ {
Method = method; Method = method;
Password = password; Password = password;
OnetimeAuth = onetimeauth;
} }
protected string Method; protected string Method;
protected string Password; protected string Password;
protected bool OnetimeAuth;
protected byte[] GetPasswordHash() protected byte[] GetPasswordHash()
{ {


+ 3
- 3
shadowsocks-csharp/Encryption/EncryptorFactory.cs View File

@@ -8,7 +8,7 @@ namespace Shadowsocks.Encryption
{ {
private static Dictionary<string, Type> _registeredEncryptors; private static Dictionary<string, Type> _registeredEncryptors;
private static Type[] _constructorTypes = new Type[] { typeof(string), typeof(string) };
private static Type[] _constructorTypes = new Type[] { typeof(string), typeof(string), typeof(bool) };
static EncryptorFactory() static EncryptorFactory()
{ {
@@ -27,7 +27,7 @@ namespace Shadowsocks.Encryption
} }
} }
public static IEncryptor GetEncryptor(string method, string password)
public static IEncryptor GetEncryptor(string method, string password, bool onetimeauth = false)
{ {
if (string.IsNullOrEmpty(method)) if (string.IsNullOrEmpty(method))
{ {
@@ -36,7 +36,7 @@ namespace Shadowsocks.Encryption
method = method.ToLowerInvariant(); method = method.ToLowerInvariant();
Type t = _registeredEncryptors[method]; Type t = _registeredEncryptors[method];
ConstructorInfo c = t.GetConstructor(_constructorTypes); ConstructorInfo c = t.GetConstructor(_constructorTypes);
IEncryptor result = (IEncryptor)c.Invoke(new object[] { method, password });
IEncryptor result = (IEncryptor)c.Invoke(new object[] { method, password, onetimeauth });
return result; return result;
} }
} }


+ 66
- 2
shadowsocks-csharp/Encryption/IVEncryptor.cs View File

@@ -2,12 +2,19 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using System.Net;
namespace Shadowsocks.Encryption namespace Shadowsocks.Encryption
{ {
public abstract class IVEncryptor public abstract class IVEncryptor
: EncryptorBase : EncryptorBase
{ {
public const int ONETIMEAUTH_FLAG = 0x10;
public const int ADDRTYPE_MASK = 0xF;
public const int ONETIMEAUTH_BYTES = 16;
public const int CRC_BUF_LEN = 128;
public const int CRC_BYTES = 2;
protected static byte[] tempbuf = new byte[MAX_INPUT_SIZE]; protected static byte[] tempbuf = new byte[MAX_INPUT_SIZE];
protected Dictionary<string, int[]> ciphers; protected Dictionary<string, int[]> ciphers;
@@ -25,11 +32,17 @@ namespace Shadowsocks.Encryption
protected byte[] _key; protected byte[] _key;
protected int keyLen; protected int keyLen;
protected int ivLen; protected int ivLen;
protected byte[] crc_buf;
protected int crc_idx = 0;
public IVEncryptor(string method, string password)
: base(method, password)
public IVEncryptor(string method, string password, bool onetimeauth)
: base(method, password, onetimeauth)
{ {
InitKey(method, password); InitKey(method, password);
if (OnetimeAuth)
{
crc_buf = new byte[CRC_BUF_LEN];
}
} }
protected abstract Dictionary<string, int[]> getCiphers(); protected abstract Dictionary<string, int[]> getCiphers();
@@ -112,6 +125,28 @@ namespace Shadowsocks.Encryption
protected abstract void cipherUpdate(bool isCipher, int length, byte[] buf, byte[] outbuf); protected abstract void cipherUpdate(bool isCipher, int length, byte[] buf, byte[] outbuf);
protected int GetSSHeadLength(byte[] buf, int length)
{
int len = 0;
int atyp = length > 0 ? (buf[0] & ADDRTYPE_MASK) : 0;
if (atyp == 1)
{
len = 7; // atyp (1 bytes) + ipv4 (4 bytes) + port (2 bytes)
}
else if (atyp == 3 && length > 1)
{
int nameLen = buf[1];
len = 4 + nameLen; // atyp (1 bytes) + name length (1 bytes) + name (n bytes) + port (2 bytes)
}
else if (atyp == 4)
{
len = 19; // atyp (1 bytes) + ipv6 (16 bytes) + port (2 bytes)
}
if (len == 0 || len > length)
throw new Exception($"invalid header with addr type {atyp}");
return len;
}
public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength) public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength)
{ {
if (!_encryptIVSent) if (!_encryptIVSent)
@@ -122,6 +157,24 @@ namespace Shadowsocks.Encryption
outlength = length + ivLen; outlength = length + ivLen;
lock (tempbuf) lock (tempbuf)
{ {
if (OnetimeAuth)
{
lock(crc_buf)
{
int headLen = GetSSHeadLength(buf, length);
int data_len = length - headLen;
Buffer.BlockCopy(buf, headLen, buf, headLen + ONETIMEAUTH_BYTES, data_len);
buf[0] |= ONETIMEAUTH_FLAG;
byte[] auth = new byte[ONETIMEAUTH_BYTES];
Sodium.ss_onetimeauth(auth, buf, headLen, _encryptIV, ivLen, _key, keyLen);
Buffer.BlockCopy(auth, 0, buf, headLen, ONETIMEAUTH_BYTES);
int buf_offset = headLen + ONETIMEAUTH_BYTES;
int rc = Sodium.ss_gen_crc(buf, ref buf_offset, ref data_len, crc_buf, ref crc_idx, buf.Length);
if (rc != 0)
throw new Exception("failed to generate crc");
length = headLen + ONETIMEAUTH_BYTES + data_len;
}
}
cipherUpdate(true, length, buf, tempbuf); cipherUpdate(true, length, buf, tempbuf);
outlength = length + ivLen; outlength = length + ivLen;
Buffer.BlockCopy(tempbuf, 0, outbuf, ivLen, length); Buffer.BlockCopy(tempbuf, 0, outbuf, ivLen, length);
@@ -129,6 +182,16 @@ namespace Shadowsocks.Encryption
} }
else else
{ {
if (OnetimeAuth)
{
lock(crc_buf)
{
int buf_offset = 0;
int rc = Sodium.ss_gen_crc(buf, ref buf_offset, ref length, crc_buf, ref crc_idx, buf.Length);
if (rc != 0)
throw new Exception("failed to generate crc");
}
}
outlength = length; outlength = length;
cipherUpdate(true, length, buf, outbuf); cipherUpdate(true, length, buf, outbuf);
} }
@@ -154,5 +217,6 @@ namespace Shadowsocks.Encryption
cipherUpdate(false, length, buf, outbuf); cipherUpdate(false, length, buf, outbuf);
} }
} }
} }
} }

+ 2
- 2
shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs View File

@@ -16,8 +16,8 @@ namespace Shadowsocks.Encryption
private IntPtr _encryptCtx = IntPtr.Zero; private IntPtr _encryptCtx = IntPtr.Zero;
private IntPtr _decryptCtx = IntPtr.Zero; private IntPtr _decryptCtx = IntPtr.Zero;
public PolarSSLEncryptor(string method, string password)
: base(method, password)
public PolarSSLEncryptor(string method, string password, bool onetimeauth)
: base(method, password, onetimeauth)
{ {
InitKey(method, password); InitKey(method, password);
} }


+ 36
- 1
shadowsocks-csharp/Encryption/Sodium.cs View File

@@ -12,8 +12,15 @@ namespace Shadowsocks.Encryption
public class Sodium public class Sodium
{ {
const string DLLNAME = "libsscrypto"; const string DLLNAME = "libsscrypto";
const string DLLNAME2 = "libsscrypto2";
static Sodium() static Sodium()
{
LoadSSCryptoLibrary();
LoadSSCrypto2Library();
}
static void LoadSSCryptoLibrary()
{ {
string tempPath = Utils.GetTempPath(); string tempPath = Utils.GetTempPath();
string dllPath = tempPath + "/libsscrypto.dll"; string dllPath = tempPath + "/libsscrypto.dll";
@@ -29,7 +36,24 @@ namespace Shadowsocks.Encryption
{ {
Console.WriteLine(e.ToString()); Console.WriteLine(e.ToString());
} }
LoadLibrary(dllPath);
}
static void LoadSSCrypto2Library()
{
string tempPath = Utils.GetTempPath();
string dllPath = tempPath + "/libsscrypto2.dll";
try
{
FileManager.UncompressFile(dllPath, Resources.libsscrypto2_dll);
LoadLibrary(dllPath);
}
catch (IOException)
{
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
} }
[DllImport("Kernel32.dll")] [DllImport("Kernel32.dll")]
@@ -40,5 +64,16 @@ namespace Shadowsocks.Encryption
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
public extern static void crypto_stream_chacha20_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, ulong ic, byte[] k); public extern static void crypto_stream_chacha20_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, ulong ic, byte[] k);
[DllImport(DLLNAME2, CallingConvention = CallingConvention.Cdecl)]
public extern static int ss_gen_crc(byte[] buf, ref int buf_offset, ref int data_len,
byte[] crc_buf, ref int crc_idx, int buf_size);
[DllImport(DLLNAME2, CallingConvention = CallingConvention.Cdecl)]
public extern static int ss_onetimeauth(byte[] auth,
byte[] msg, int msg_len,
byte[] iv, int iv_len,
byte[] key, int key_len);
} }
} }

+ 2
- 2
shadowsocks-csharp/Encryption/SodiumEncryptor.cs View File

@@ -20,8 +20,8 @@ namespace Shadowsocks.Encryption
protected ulong _encryptIC; protected ulong _encryptIC;
protected ulong _decryptIC; protected ulong _decryptIC;
public SodiumEncryptor(string method, string password)
: base(method, password)
public SodiumEncryptor(string method, string password, bool onetimeauth)
: base(method, password, onetimeauth)
{ {
InitKey(method, password); InitKey(method, password);
} }


+ 2
- 2
shadowsocks-csharp/Encryption/TableEncryptor.cs View File

@@ -6,8 +6,8 @@ namespace Shadowsocks.Encryption
public class TableEncryptor public class TableEncryptor
: EncryptorBase : EncryptorBase
{ {
public TableEncryptor(string method, string password)
: base(method, password)
public TableEncryptor(string method, string password, bool onetimeauth)
: base(method, password, onetimeauth)
{ {
byte[] hash = GetPasswordHash(); byte[] hash = GetPasswordHash();
// TODO endian // TODO endian


+ 5
- 0
shadowsocks-csharp/Model/Server.cs View File

@@ -17,6 +17,7 @@ namespace Shadowsocks.Model
public string password; public string password;
public string method; public string method;
public string remarks; public string remarks;
public bool one_time_auth;
public override int GetHashCode() public override int GetHashCode()
{ {
@@ -52,6 +53,7 @@ namespace Shadowsocks.Model
this.method = "aes-256-cfb"; this.method = "aes-256-cfb";
this.password = ""; this.password = "";
this.remarks = ""; this.remarks = "";
this.one_time_auth = false;
} }
public Server(string ssURL) : this() public Server(string ssURL) : this()
@@ -88,6 +90,9 @@ namespace Shadowsocks.Model
string[] parts = beforeAt.Split(new[] { ':' }); string[] parts = beforeAt.Split(new[] { ':' });
this.method = parts[0]; this.method = parts[0];
this.password = parts[1]; this.password = parts[1];
//TODO: read one_time_auth
} }
catch (IndexOutOfRangeException) catch (IndexOutOfRangeException)
{ {


+ 57
- 49
shadowsocks-csharp/Properties/Resources.Designer.cs View File

@@ -1,10 +1,10 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
// //
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@@ -13,12 +13,12 @@ namespace Shadowsocks.Properties {
/// <summary> /// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary> /// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
@@ -33,7 +33,7 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager { internal static global::System.Resources.ResourceManager ResourceManager {
@@ -47,8 +47,8 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// 使用此强类型资源类,为所有资源查找
/// 重写当前线程的 CurrentUICulture 属性。
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture { internal static global::System.Globalization.CultureInfo Culture {
@@ -61,7 +61,7 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Byte[].
/// 查找 System.Byte[] 类型的本地化资源。
/// </summary> /// </summary>
internal static byte[] abp_js { internal static byte[] abp_js {
get { get {
@@ -71,30 +71,28 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to # translation for Simplified Chinese
///
///Shadowsocks=Shadowsocks
///
///# Menu items
///
///Enable System Proxy=启用系统代理
///Mode=系统代理模式
///PAC=PAC 模式
///Global=全局模式
///Servers=服务器
///Edit Servers...=编辑服务器...
///Start on Boot=开机启动
///Allow Clients from LAN=允许来自局域网的连接
///Local PAC=使用本地 PAC
///Online PAC=使用在线 PAC
///Edit Local PAC File...=编辑本地 PAC 文件...
///Update Local PAC from GFWList=从 GFWList 更新本地 PAC
///Edit User Rule for GFWList...=编辑 GFWList 的用户规则...
///Show QRCode...=显示二维码...
///Scan QRCode from Screen...=扫描屏幕上的二维码...
///Show Logs...=显示日志...
///About...=关于...
///Quit=退出 [rest of string was truncated]&quot;;.
/// 查找类似 # translation for Simplified Chinese
///
///Shadowsocks=Shadowsocks
///
///# Menu items
///
///Enable System Proxy=启用系统代理
///Mode=系统代理模式
///PAC=PAC 模式
///Global=全局模式
///Servers=服务器
///Edit Servers...=编辑服务器...
///Start on Boot=开机启动
///Allow Clients from LAN=允许来自局域网的连接
///Local PAC=使用本地 PAC
///Online PAC=使用在线 PAC
///Edit Local PAC File...=编辑本地 PAC 文件...
///Update Local PAC from GFWList=从 GFWList 更新本地 PAC
///Edit User Rule for GFWList...=编辑 GFWList 的用户规则...
///Show QRCode...=显示二维码...
///Scan QRCode from Screen...=扫描屏幕上的二维码...
///Availability Statistic [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary> /// </summary>
internal static string cn { internal static string cn {
get { get {
@@ -103,7 +101,7 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Byte[].
/// 查找 System.Byte[] 类型的本地化资源。
/// </summary> /// </summary>
internal static byte[] libsscrypto_dll { internal static byte[] libsscrypto_dll {
get { get {
@@ -113,7 +111,17 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Byte[].
/// 查找 System.Byte[] 类型的本地化资源。
/// </summary>
internal static byte[] libsscrypto2_dll {
get {
object obj = ResourceManager.GetObject("libsscrypto2_dll", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// 查找 System.Byte[] 类型的本地化资源。
/// </summary> /// </summary>
internal static byte[] mgwz_dll { internal static byte[] mgwz_dll {
get { get {
@@ -123,11 +131,11 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to listen-address __POLIPO_BIND_IP__:8123
/// 查找类似 listen-address __POLIPO_BIND_IP__:8123
///show-on-task-bar 0 ///show-on-task-bar 0
///activity-animation 0 ///activity-animation 0
///forward-socks5 / 127.0.0.1:__SOCKS_PORT__ . ///forward-socks5 / 127.0.0.1:__SOCKS_PORT__ .
///hide-console.
///hide-console 的本地化字符串。
/// </summary> /// </summary>
internal static string privoxy_conf { internal static string privoxy_conf {
get { get {
@@ -136,7 +144,7 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Byte[].
/// 查找 System.Byte[] 类型的本地化资源。
/// </summary> /// </summary>
internal static byte[] privoxy_exe { internal static byte[] privoxy_exe {
get { get {
@@ -146,7 +154,7 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Byte[].
/// 查找 System.Byte[] 类型的本地化资源。
/// </summary> /// </summary>
internal static byte[] proxy_pac_txt { internal static byte[] proxy_pac_txt {
get { get {
@@ -156,7 +164,7 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary> /// </summary>
internal static System.Drawing.Bitmap ss16 { internal static System.Drawing.Bitmap ss16 {
get { get {
@@ -166,7 +174,7 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary> /// </summary>
internal static System.Drawing.Bitmap ss20 { internal static System.Drawing.Bitmap ss20 {
get { get {
@@ -176,7 +184,7 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary> /// </summary>
internal static System.Drawing.Bitmap ss24 { internal static System.Drawing.Bitmap ss24 {
get { get {
@@ -186,7 +194,7 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary> /// </summary>
internal static System.Drawing.Bitmap ssw128 { internal static System.Drawing.Bitmap ssw128 {
get { get {
@@ -196,9 +204,9 @@ namespace Shadowsocks.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to ! Put user rules line by line in this file.
/// 查找类似 ! Put user rules line by line in this file.
///! See https://adblockplus.org/en/filter-cheatsheet ///! See https://adblockplus.org/en/filter-cheatsheet
///.
/// 的本地化字符串。
/// </summary> /// </summary>
internal static string user_rule { internal static string user_rule {
get { get {


+ 3
- 0
shadowsocks-csharp/Properties/Resources.resx View File

@@ -124,6 +124,9 @@
<data name="cn" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="cn" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\data\cn.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> <value>..\data\cn.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data> </data>
<data name="libsscrypto2_dll" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Data\libsscrypto2.dll.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="libsscrypto_dll" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="libsscrypto_dll" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\data\libsscrypto.dll.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>..\data\libsscrypto.dll.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>


+ 33
- 20
shadowsocks-csharp/View/ConfigForm.Designer.cs View File

@@ -55,6 +55,7 @@
this.ProxyPortLabel = new System.Windows.Forms.Label(); this.ProxyPortLabel = new System.Windows.Forms.Label();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel(); this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel();
this.OneTimeAuth = new System.Windows.Forms.CheckBox();
this.tableLayoutPanel1.SuspendLayout(); this.tableLayoutPanel1.SuspendLayout();
this.ServerGroupBox.SuspendLayout(); this.ServerGroupBox.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout(); this.tableLayoutPanel2.SuspendLayout();
@@ -81,18 +82,20 @@
this.tableLayoutPanel1.Controls.Add(this.PasswordTextBox, 1, 2); this.tableLayoutPanel1.Controls.Add(this.PasswordTextBox, 1, 2);
this.tableLayoutPanel1.Controls.Add(this.EncryptionLabel, 0, 3); this.tableLayoutPanel1.Controls.Add(this.EncryptionLabel, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.EncryptionSelect, 1, 3); this.tableLayoutPanel1.Controls.Add(this.EncryptionSelect, 1, 3);
this.tableLayoutPanel1.Controls.Add(this.OneTimeAuth, 1, 6);
this.tableLayoutPanel1.Location = new System.Drawing.Point(8, 21); this.tableLayoutPanel1.Location = new System.Drawing.Point(8, 21);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(0); this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1"; this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(3); this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(3);
this.tableLayoutPanel1.RowCount = 6;
this.tableLayoutPanel1.RowCount = 7;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.Size = new System.Drawing.Size(238, 137);
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.Size = new System.Drawing.Size(238, 160);
this.tableLayoutPanel1.TabIndex = 0; this.tableLayoutPanel1.TabIndex = 0;
// //
// RemarksTextBox // RemarksTextBox
@@ -102,7 +105,7 @@
this.RemarksTextBox.MaxLength = 32; this.RemarksTextBox.MaxLength = 32;
this.RemarksTextBox.Name = "RemarksTextBox"; this.RemarksTextBox.Name = "RemarksTextBox";
this.RemarksTextBox.Size = new System.Drawing.Size(160, 20); this.RemarksTextBox.Size = new System.Drawing.Size(160, 20);
this.RemarksTextBox.TabIndex = 10;
this.RemarksTextBox.TabIndex = 4;
this.RemarksTextBox.WordWrap = false; this.RemarksTextBox.WordWrap = false;
// //
// RemarksLabel // RemarksLabel
@@ -188,7 +191,7 @@
// //
// EncryptionSelect // EncryptionSelect
// //
this.EncryptionSelect.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
this.EncryptionSelect.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.EncryptionSelect.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.EncryptionSelect.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.EncryptionSelect.FormattingEnabled = true; this.EncryptionSelect.FormattingEnabled = true;
@@ -226,7 +229,7 @@
this.OKButton.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0); this.OKButton.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0);
this.OKButton.Name = "OKButton"; this.OKButton.Name = "OKButton";
this.OKButton.Size = new System.Drawing.Size(75, 23); this.OKButton.Size = new System.Drawing.Size(75, 23);
this.OKButton.TabIndex = 8;
this.OKButton.TabIndex = 12;
this.OKButton.Text = "OK"; this.OKButton.Text = "OK";
this.OKButton.UseVisualStyleBackColor = true; this.OKButton.UseVisualStyleBackColor = true;
this.OKButton.Click += new System.EventHandler(this.OKButton_Click); this.OKButton.Click += new System.EventHandler(this.OKButton_Click);
@@ -239,7 +242,7 @@
this.MyCancelButton.Margin = new System.Windows.Forms.Padding(3, 3, 0, 0); this.MyCancelButton.Margin = new System.Windows.Forms.Padding(3, 3, 0, 0);
this.MyCancelButton.Name = "MyCancelButton"; this.MyCancelButton.Name = "MyCancelButton";
this.MyCancelButton.Size = new System.Drawing.Size(75, 23); this.MyCancelButton.Size = new System.Drawing.Size(75, 23);
this.MyCancelButton.TabIndex = 9;
this.MyCancelButton.TabIndex = 13;
this.MyCancelButton.Text = "Cancel"; this.MyCancelButton.Text = "Cancel";
this.MyCancelButton.UseVisualStyleBackColor = true; this.MyCancelButton.UseVisualStyleBackColor = true;
this.MyCancelButton.Click += new System.EventHandler(this.CancelButton_Click); this.MyCancelButton.Click += new System.EventHandler(this.CancelButton_Click);
@@ -251,7 +254,7 @@
this.DeleteButton.Margin = new System.Windows.Forms.Padding(3, 6, 0, 3); this.DeleteButton.Margin = new System.Windows.Forms.Padding(3, 6, 0, 3);
this.DeleteButton.Name = "DeleteButton"; this.DeleteButton.Name = "DeleteButton";
this.DeleteButton.Size = new System.Drawing.Size(80, 23); this.DeleteButton.Size = new System.Drawing.Size(80, 23);
this.DeleteButton.TabIndex = 7;
this.DeleteButton.TabIndex = 9;
this.DeleteButton.Text = "&Delete"; this.DeleteButton.Text = "&Delete";
this.DeleteButton.UseVisualStyleBackColor = true; this.DeleteButton.UseVisualStyleBackColor = true;
this.DeleteButton.Click += new System.EventHandler(this.DeleteButton_Click); this.DeleteButton.Click += new System.EventHandler(this.DeleteButton_Click);
@@ -263,7 +266,7 @@
this.AddButton.Margin = new System.Windows.Forms.Padding(0, 6, 3, 3); this.AddButton.Margin = new System.Windows.Forms.Padding(0, 6, 3, 3);
this.AddButton.Name = "AddButton"; this.AddButton.Name = "AddButton";
this.AddButton.Size = new System.Drawing.Size(80, 23); this.AddButton.Size = new System.Drawing.Size(80, 23);
this.AddButton.TabIndex = 6;
this.AddButton.TabIndex = 8;
this.AddButton.Text = "&Add"; this.AddButton.Text = "&Add";
this.AddButton.UseVisualStyleBackColor = true; this.AddButton.UseVisualStyleBackColor = true;
this.AddButton.Click += new System.EventHandler(this.AddButton_Click); this.AddButton.Click += new System.EventHandler(this.AddButton_Click);
@@ -276,8 +279,8 @@
this.ServerGroupBox.Location = new System.Drawing.Point(178, 0); this.ServerGroupBox.Location = new System.Drawing.Point(178, 0);
this.ServerGroupBox.Margin = new System.Windows.Forms.Padding(12, 0, 0, 0); this.ServerGroupBox.Margin = new System.Windows.Forms.Padding(12, 0, 0, 0);
this.ServerGroupBox.Name = "ServerGroupBox"; this.ServerGroupBox.Name = "ServerGroupBox";
this.ServerGroupBox.Size = new System.Drawing.Size(249, 174);
this.ServerGroupBox.TabIndex = 6;
this.ServerGroupBox.Size = new System.Drawing.Size(249, 197);
this.ServerGroupBox.TabIndex = 0;
this.ServerGroupBox.TabStop = false; this.ServerGroupBox.TabStop = false;
this.ServerGroupBox.Text = "Server"; this.ServerGroupBox.Text = "Server";
// //
@@ -285,12 +288,11 @@
// //
this.ServersListBox.FormattingEnabled = true; this.ServersListBox.FormattingEnabled = true;
this.ServersListBox.IntegralHeight = false; this.ServersListBox.IntegralHeight = false;
this.ServersListBox.ItemHeight = 12;
this.ServersListBox.Location = new System.Drawing.Point(0, 0); this.ServersListBox.Location = new System.Drawing.Point(0, 0);
this.ServersListBox.Margin = new System.Windows.Forms.Padding(0); this.ServersListBox.Margin = new System.Windows.Forms.Padding(0);
this.ServersListBox.Name = "ServersListBox"; this.ServersListBox.Name = "ServersListBox";
this.ServersListBox.Size = new System.Drawing.Size(166, 148); this.ServersListBox.Size = new System.Drawing.Size(166, 148);
this.ServersListBox.TabIndex = 5;
this.ServersListBox.TabIndex = 7;
this.ServersListBox.SelectedIndexChanged += new System.EventHandler(this.ServersListBox_SelectedIndexChanged); this.ServersListBox.SelectedIndexChanged += new System.EventHandler(this.ServersListBox_SelectedIndexChanged);
// //
// tableLayoutPanel2 // tableLayoutPanel2
@@ -313,7 +315,7 @@
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel2.Size = new System.Drawing.Size(427, 238);
this.tableLayoutPanel2.Size = new System.Drawing.Size(427, 261);
this.tableLayoutPanel2.TabIndex = 7; this.tableLayoutPanel2.TabIndex = 7;
// //
// tableLayoutPanel6 // tableLayoutPanel6
@@ -326,7 +328,7 @@
this.tableLayoutPanel6.Controls.Add(this.MoveDownButton, 1, 0); this.tableLayoutPanel6.Controls.Add(this.MoveDownButton, 1, 0);
this.tableLayoutPanel6.Controls.Add(this.MoveUpButton, 0, 0); this.tableLayoutPanel6.Controls.Add(this.MoveUpButton, 0, 0);
this.tableLayoutPanel6.Dock = System.Windows.Forms.DockStyle.Top; this.tableLayoutPanel6.Dock = System.Windows.Forms.DockStyle.Top;
this.tableLayoutPanel6.Location = new System.Drawing.Point(0, 211);
this.tableLayoutPanel6.Location = new System.Drawing.Point(0, 229);
this.tableLayoutPanel6.Margin = new System.Windows.Forms.Padding(0); this.tableLayoutPanel6.Margin = new System.Windows.Forms.Padding(0);
this.tableLayoutPanel6.Name = "tableLayoutPanel6"; this.tableLayoutPanel6.Name = "tableLayoutPanel6";
this.tableLayoutPanel6.RowCount = 1; this.tableLayoutPanel6.RowCount = 1;
@@ -341,7 +343,7 @@
this.MoveDownButton.Margin = new System.Windows.Forms.Padding(3, 6, 0, 3); this.MoveDownButton.Margin = new System.Windows.Forms.Padding(3, 6, 0, 3);
this.MoveDownButton.Name = "MoveDownButton"; this.MoveDownButton.Name = "MoveDownButton";
this.MoveDownButton.Size = new System.Drawing.Size(80, 23); this.MoveDownButton.Size = new System.Drawing.Size(80, 23);
this.MoveDownButton.TabIndex = 7;
this.MoveDownButton.TabIndex = 11;
this.MoveDownButton.Text = "Move D&own"; this.MoveDownButton.Text = "Move D&own";
this.MoveDownButton.UseVisualStyleBackColor = true; this.MoveDownButton.UseVisualStyleBackColor = true;
this.MoveDownButton.Click += new System.EventHandler(this.MoveDownButton_Click); this.MoveDownButton.Click += new System.EventHandler(this.MoveDownButton_Click);
@@ -353,7 +355,7 @@
this.MoveUpButton.Margin = new System.Windows.Forms.Padding(0, 6, 3, 3); this.MoveUpButton.Margin = new System.Windows.Forms.Padding(0, 6, 3, 3);
this.MoveUpButton.Name = "MoveUpButton"; this.MoveUpButton.Name = "MoveUpButton";
this.MoveUpButton.Size = new System.Drawing.Size(80, 23); this.MoveUpButton.Size = new System.Drawing.Size(80, 23);
this.MoveUpButton.TabIndex = 6;
this.MoveUpButton.TabIndex = 10;
this.MoveUpButton.Text = "Move &Up"; this.MoveUpButton.Text = "Move &Up";
this.MoveUpButton.UseVisualStyleBackColor = true; this.MoveUpButton.UseVisualStyleBackColor = true;
this.MoveUpButton.Click += new System.EventHandler(this.MoveUpButton_Click); this.MoveUpButton.Click += new System.EventHandler(this.MoveUpButton_Click);
@@ -369,7 +371,7 @@
this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel5.Controls.Add(this.ProxyPortTextBox, 1, 0); this.tableLayoutPanel5.Controls.Add(this.ProxyPortTextBox, 1, 0);
this.tableLayoutPanel5.Controls.Add(this.ProxyPortLabel, 0, 0); this.tableLayoutPanel5.Controls.Add(this.ProxyPortLabel, 0, 0);
this.tableLayoutPanel5.Location = new System.Drawing.Point(241, 174);
this.tableLayoutPanel5.Location = new System.Drawing.Point(241, 197);
this.tableLayoutPanel5.Margin = new System.Windows.Forms.Padding(0); this.tableLayoutPanel5.Margin = new System.Windows.Forms.Padding(0);
this.tableLayoutPanel5.Name = "tableLayoutPanel5"; this.tableLayoutPanel5.Name = "tableLayoutPanel5";
this.tableLayoutPanel5.Padding = new System.Windows.Forms.Padding(3); this.tableLayoutPanel5.Padding = new System.Windows.Forms.Padding(3);
@@ -389,7 +391,7 @@
this.ProxyPortTextBox.MaxLength = 10; this.ProxyPortTextBox.MaxLength = 10;
this.ProxyPortTextBox.Name = "ProxyPortTextBox"; this.ProxyPortTextBox.Name = "ProxyPortTextBox";
this.ProxyPortTextBox.Size = new System.Drawing.Size(113, 20); this.ProxyPortTextBox.Size = new System.Drawing.Size(113, 20);
this.ProxyPortTextBox.TabIndex = 4;
this.ProxyPortTextBox.TabIndex = 6;
this.ProxyPortTextBox.WordWrap = false; this.ProxyPortTextBox.WordWrap = false;
// //
// ProxyPortLabel // ProxyPortLabel
@@ -413,7 +415,7 @@
this.tableLayoutPanel3.Controls.Add(this.MyCancelButton, 1, 0); this.tableLayoutPanel3.Controls.Add(this.MyCancelButton, 1, 0);
this.tableLayoutPanel3.Controls.Add(this.OKButton, 0, 0); this.tableLayoutPanel3.Controls.Add(this.OKButton, 0, 0);
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Right; this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Right;
this.tableLayoutPanel3.Location = new System.Drawing.Point(268, 209);
this.tableLayoutPanel3.Location = new System.Drawing.Point(268, 232);
this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(3, 3, 0, 3); this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(3, 3, 0, 3);
this.tableLayoutPanel3.Name = "tableLayoutPanel3"; this.tableLayoutPanel3.Name = "tableLayoutPanel3";
this.tableLayoutPanel3.RowCount = 1; this.tableLayoutPanel3.RowCount = 1;
@@ -431,7 +433,7 @@
this.tableLayoutPanel4.Controls.Add(this.DeleteButton, 1, 0); this.tableLayoutPanel4.Controls.Add(this.DeleteButton, 1, 0);
this.tableLayoutPanel4.Controls.Add(this.AddButton, 0, 0); this.tableLayoutPanel4.Controls.Add(this.AddButton, 0, 0);
this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Top; this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Top;
this.tableLayoutPanel4.Location = new System.Drawing.Point(0, 174);
this.tableLayoutPanel4.Location = new System.Drawing.Point(0, 197);
this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(0); this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(0);
this.tableLayoutPanel4.Name = "tableLayoutPanel4"; this.tableLayoutPanel4.Name = "tableLayoutPanel4";
this.tableLayoutPanel4.RowCount = 1; this.tableLayoutPanel4.RowCount = 1;
@@ -439,6 +441,16 @@
this.tableLayoutPanel4.Size = new System.Drawing.Size(166, 32); this.tableLayoutPanel4.Size = new System.Drawing.Size(166, 32);
this.tableLayoutPanel4.TabIndex = 8; this.tableLayoutPanel4.TabIndex = 8;
// //
// OneTimeAuth
//
this.OneTimeAuth.AutoSize = true;
this.OneTimeAuth.Location = new System.Drawing.Point(72, 137);
this.OneTimeAuth.Name = "OneTimeAuth";
this.OneTimeAuth.Size = new System.Drawing.Size(131, 17);
this.OneTimeAuth.TabIndex = 5;
this.OneTimeAuth.Text = "One-time authorization";
this.OneTimeAuth.UseVisualStyleBackColor = true;
//
// ConfigForm // ConfigForm
// //
this.AcceptButton = this.OKButton; this.AcceptButton = this.OKButton;
@@ -505,6 +517,7 @@
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel6; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel6;
private System.Windows.Forms.Button MoveDownButton; private System.Windows.Forms.Button MoveDownButton;
private System.Windows.Forms.Button MoveUpButton; private System.Windows.Forms.Button MoveUpButton;
private System.Windows.Forms.CheckBox OneTimeAuth;
} }
} }

+ 4
- 1
shadowsocks-csharp/View/ConfigForm.cs View File

@@ -48,6 +48,7 @@ namespace Shadowsocks.View
EncryptionLabel.Text = I18N.GetString("Encryption"); EncryptionLabel.Text = I18N.GetString("Encryption");
ProxyPortLabel.Text = I18N.GetString("Proxy Port"); ProxyPortLabel.Text = I18N.GetString("Proxy Port");
RemarksLabel.Text = I18N.GetString("Remarks"); RemarksLabel.Text = I18N.GetString("Remarks");
OneTimeAuth.Text = I18N.GetString("One-time authorization");
ServerGroupBox.Text = I18N.GetString("Server"); ServerGroupBox.Text = I18N.GetString("Server");
OKButton.Text = I18N.GetString("OK"); OKButton.Text = I18N.GetString("OK");
MyCancelButton.Text = I18N.GetString("Cancel"); MyCancelButton.Text = I18N.GetString("Cancel");
@@ -82,7 +83,8 @@ namespace Shadowsocks.View
server_port = int.Parse(ServerPortTextBox.Text), server_port = int.Parse(ServerPortTextBox.Text),
password = PasswordTextBox.Text, password = PasswordTextBox.Text,
method = EncryptionSelect.Text, method = EncryptionSelect.Text,
remarks = RemarksTextBox.Text
remarks = RemarksTextBox.Text,
one_time_auth = OneTimeAuth.Checked
}; };
int localPort = int.Parse(ProxyPortTextBox.Text); int localPort = int.Parse(ProxyPortTextBox.Text);
Configuration.CheckServer(server); Configuration.CheckServer(server);
@@ -115,6 +117,7 @@ namespace Shadowsocks.View
ProxyPortTextBox.Text = _modifiedConfiguration.localPort.ToString(); ProxyPortTextBox.Text = _modifiedConfiguration.localPort.ToString();
EncryptionSelect.Text = server.method ?? "aes-256-cfb"; EncryptionSelect.Text = server.method ?? "aes-256-cfb";
RemarksTextBox.Text = server.remarks; RemarksTextBox.Text = server.remarks;
OneTimeAuth.Checked = server.one_time_auth;
} }
} }


+ 1
- 0
shadowsocks-csharp/shadowsocks-csharp.csproj View File

@@ -205,6 +205,7 @@
</None> </None>
<None Include="Data\abp.js.gz" /> <None Include="Data\abp.js.gz" />
<None Include="Data\libsscrypto.dll.gz" /> <None Include="Data\libsscrypto.dll.gz" />
<None Include="Data\libsscrypto2.dll.gz" />
<None Include="Data\mgwz.dll.gz" /> <None Include="Data\mgwz.dll.gz" />
<None Include="Data\privoxy.exe.gz" /> <None Include="Data\privoxy.exe.gz" />
<None Include="Data\proxy.pac.txt.gz" /> <None Include="Data\proxy.pac.txt.gz" />


Loading…
Cancel
Save