@@ -1,4 +1,5 @@ | |||||
using System; | |||||
using NLog; | |||||
using System; | |||||
using System.IO; | using System.IO; | ||||
using System.IO.Compression; | using System.IO.Compression; | ||||
using System.Text; | using System.Text; | ||||
@@ -7,6 +8,8 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
public static class FileManager | public static class FileManager | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
public static bool ByteArrayToFile(string fileName, byte[] content) | public static bool ByteArrayToFile(string fileName, byte[] content) | ||||
{ | { | ||||
try | try | ||||
@@ -17,7 +20,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
Logging.Error(ex); | |||||
logger.Error(ex); | |||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
@@ -57,7 +60,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
Logging.Error(ex); | |||||
logger.Error(ex); | |||||
throw ex; | throw ex; | ||||
} | } | ||||
} | } | ||||
@@ -1,7 +1,7 @@ | |||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Windows.Forms; | using System.Windows.Forms; | ||||
using NLog; | |||||
using Shadowsocks.Controller.Hotkeys; | using Shadowsocks.Controller.Hotkeys; | ||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
@@ -9,6 +9,7 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
static class HotkeyReg | static class HotkeyReg | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
public static void RegAllHotkeys() | public static void RegAllHotkeys() | ||||
{ | { | ||||
var hotkeyConfig = Configuration.Load().hotkey; | var hotkeyConfig = Configuration.Load().hotkey; | ||||
@@ -60,7 +61,7 @@ namespace Shadowsocks.Controller | |||||
var hotkey = HotKeys.Str2HotKey(hotkeyStr); | var hotkey = HotKeys.Str2HotKey(hotkeyStr); | ||||
if (hotkey == null) | if (hotkey == null) | ||||
{ | { | ||||
Logging.Error($"Cannot parse hotkey: {hotkeyStr}"); | |||||
logger.Error($"Cannot parse hotkey: {hotkeyStr}"); | |||||
onComplete?.Invoke(RegResult.ParseError); | onComplete?.Invoke(RegResult.ParseError); | ||||
return false; | return false; | ||||
} | } | ||||
@@ -1,4 +1,5 @@ | |||||
using Microsoft.VisualBasic.FileIO; | using Microsoft.VisualBasic.FileIO; | ||||
using NLog; | |||||
using Shadowsocks.Properties; | using Shadowsocks.Properties; | ||||
using Shadowsocks.Util; | using Shadowsocks.Util; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
@@ -9,9 +10,10 @@ using System.Windows.Forms; | |||||
namespace Shadowsocks.Controller | namespace Shadowsocks.Controller | ||||
{ | { | ||||
public static class I18N | public static class I18N | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
public const string I18N_FILE = "i18n.csv"; | public const string I18N_FILE = "i18n.csv"; | ||||
private static Dictionary<string, string> _strings = new Dictionary<string, string>(); | private static Dictionary<string, string> _strings = new Dictionary<string, string>(); | ||||
@@ -47,12 +49,12 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
if (targetIndex != -1 && enIndex != targetIndex) | if (targetIndex != -1 && enIndex != targetIndex) | ||||
{ | { | ||||
Logging.Info($"Using {localeNames[targetIndex]} translation for {locale}"); | |||||
logger.Info($"Using {localeNames[targetIndex]} translation for {locale}"); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
// Still not found, exit | // Still not found, exit | ||||
Logging.Info($"Translation for {locale} not found"); | |||||
logger.Info($"Translation for {locale} not found"); | |||||
return; | return; | ||||
} | } | ||||
} | } | ||||
@@ -85,10 +87,10 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
Logging.Info("Using external translation"); | |||||
logger.Info("Using external translation"); | |||||
i18n = File.ReadAllText(I18N_FILE, Encoding.UTF8); | i18n = File.ReadAllText(I18N_FILE, Encoding.UTF8); | ||||
} | } | ||||
Logging.Info("Current language is: " + locale); | |||||
logger.Info("Current language is: " + locale); | |||||
Init(i18n, locale); | Init(i18n, locale); | ||||
} | } | ||||
@@ -0,0 +1,119 @@ | |||||
using System; | |||||
using System.ComponentModel; | |||||
using System.IO; | |||||
using System.Net.Sockets; | |||||
using System.Net; | |||||
using System.Diagnostics; | |||||
using System.Text; | |||||
using Shadowsocks.Util.SystemProxy; | |||||
namespace NLog | |||||
{ | |||||
public static class LoggerExtension | |||||
{ | |||||
public static void Dump(this Logger logger, string tag, byte[] arr, int length) | |||||
{ | |||||
if (logger.IsTraceEnabled) | |||||
{ | |||||
var sb = new StringBuilder($"{Environment.NewLine}{tag}: "); | |||||
for (int i = 0; i < length - 1; i++) | |||||
{ | |||||
sb.Append($"0x{arr[i]:X2}, "); | |||||
} | |||||
sb.Append($"0x{arr[length - 1]:X2}"); | |||||
sb.Append(Environment.NewLine); | |||||
logger.Trace(sb.ToString()); | |||||
} | |||||
} | |||||
public static void Debug(this Logger logger, EndPoint local, EndPoint remote, int len, string header = null, string tailer = null) | |||||
{ | |||||
if (logger.IsDebugEnabled) | |||||
{ | |||||
if (header == null && tailer == null) | |||||
logger.Debug($"{local} => {remote} (size={len})"); | |||||
else if (header == null && tailer != null) | |||||
logger.Debug($"{local} => {remote} (size={len}), {tailer}"); | |||||
else if (header != null && tailer == null) | |||||
logger.Debug($"{header}: {local} => {remote} (size={len})"); | |||||
else | |||||
logger.Debug($"{header}: {local} => {remote} (size={len}), {tailer}"); | |||||
} | |||||
} | |||||
public static void Debug(this Logger logger, Socket sock, int len, string header = null, string tailer = null) | |||||
{ | |||||
if (logger.IsDebugEnabled) | |||||
{ | |||||
logger.Debug(sock.LocalEndPoint, sock.RemoteEndPoint, len, header, tailer); | |||||
} | |||||
} | |||||
public static void LogUsefulException(this Logger logger, Exception e) | |||||
{ | |||||
// just log useful exceptions, not all of them | |||||
if (e is SocketException) | |||||
{ | |||||
SocketException se = (SocketException)e; | |||||
if (se.SocketErrorCode == SocketError.ConnectionAborted) | |||||
{ | |||||
// closed by browser when sending | |||||
// normally happens when download is canceled or a tab is closed before page is loaded | |||||
} | |||||
else if (se.SocketErrorCode == SocketError.ConnectionReset) | |||||
{ | |||||
// received rst | |||||
} | |||||
else if (se.SocketErrorCode == SocketError.NotConnected) | |||||
{ | |||||
// The application tried to send or receive data, and the System.Net.Sockets.Socket is not connected. | |||||
} | |||||
else if (se.SocketErrorCode == SocketError.HostUnreachable) | |||||
{ | |||||
// There is no network route to the specified host. | |||||
} | |||||
else if (se.SocketErrorCode == SocketError.TimedOut) | |||||
{ | |||||
// The connection attempt timed out, or the connected host has failed to respond. | |||||
} | |||||
else | |||||
{ | |||||
logger.Warn(e); | |||||
} | |||||
} | |||||
else if (e is ObjectDisposedException) | |||||
{ | |||||
} | |||||
else if (e is Win32Exception) | |||||
{ | |||||
var ex = (Win32Exception)e; | |||||
// Win32Exception (0x80004005): A 32 bit processes cannot access modules of a 64 bit process. | |||||
if ((uint)ex.ErrorCode != 0x80004005) | |||||
{ | |||||
logger.Warn(e); | |||||
} | |||||
} | |||||
else if (e is ProxyException) | |||||
{ | |||||
var ex = (ProxyException)e; | |||||
switch (ex.Type) | |||||
{ | |||||
case ProxyExceptionType.FailToRun: | |||||
case ProxyExceptionType.QueryReturnMalformed: | |||||
case ProxyExceptionType.SysproxyExitError: | |||||
logger.Error($"sysproxy - {ex.Type.ToString()}:{ex.Message}"); | |||||
break; | |||||
case ProxyExceptionType.QueryReturnEmpty: | |||||
case ProxyExceptionType.Unspecific: | |||||
logger.Error($"sysproxy - {ex.Type.ToString()}"); | |||||
break; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
logger.Warn(e); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -1,198 +0,0 @@ | |||||
using System; | |||||
using System.ComponentModel; | |||||
using System.IO; | |||||
using System.Net.Sockets; | |||||
using System.Net; | |||||
using System.Diagnostics; | |||||
using System.Text; | |||||
using Shadowsocks.Util; | |||||
using Shadowsocks.Util.SystemProxy; | |||||
namespace Shadowsocks.Controller | |||||
{ | |||||
public class Logging | |||||
{ | |||||
public static string LogFilePath; | |||||
private static FileStream _fs; | |||||
private static StreamWriterWithTimestamp _sw; | |||||
public static bool OpenLogFile() | |||||
{ | |||||
try | |||||
{ | |||||
LogFilePath = Utils.GetTempPath("shadowsocks.log"); | |||||
_fs = new FileStream(LogFilePath, FileMode.Append); | |||||
_sw = new StreamWriterWithTimestamp(_fs); | |||||
_sw.AutoFlush = true; | |||||
Console.SetOut(_sw); | |||||
Console.SetError(_sw); | |||||
return true; | |||||
} | |||||
catch (IOException e) | |||||
{ | |||||
Console.WriteLine(e.ToString()); | |||||
return false; | |||||
} | |||||
} | |||||
private static void WriteToLogFile(object o) | |||||
{ | |||||
try { | |||||
Console.WriteLine(o); | |||||
} catch(ObjectDisposedException) { | |||||
} | |||||
} | |||||
public static void Error(object o) | |||||
{ | |||||
WriteToLogFile("[E] " + o); | |||||
} | |||||
public static void Info(object o) | |||||
{ | |||||
WriteToLogFile(o); | |||||
} | |||||
public static void Clear() { | |||||
_sw.Close(); | |||||
_sw.Dispose(); | |||||
_fs.Close(); | |||||
_fs.Dispose(); | |||||
File.Delete(LogFilePath); | |||||
OpenLogFile(); | |||||
} | |||||
[Conditional("DEBUG")] | |||||
public static void Debug(object o) | |||||
{ | |||||
WriteToLogFile("[D] " + o); | |||||
} | |||||
[Conditional("DEBUG")] | |||||
public static void Dump(string tag, byte[] arr, int length) | |||||
{ | |||||
var sb = new StringBuilder($"{Environment.NewLine}{tag}: "); | |||||
for (int i = 0; i < length - 1; i++) { | |||||
sb.Append($"0x{arr[i]:X2}, "); | |||||
} | |||||
sb.Append($"0x{arr[length - 1]:X2}"); | |||||
sb.Append(Environment.NewLine); | |||||
Debug(sb.ToString()); | |||||
} | |||||
[Conditional("DEBUG")] | |||||
public static void Debug(EndPoint local, EndPoint remote, int len, string header = null, string tailer = null) | |||||
{ | |||||
if (header == null && tailer == null) | |||||
Debug($"{local} => {remote} (size={len})"); | |||||
else if (header == null && tailer != null) | |||||
Debug($"{local} => {remote} (size={len}), {tailer}"); | |||||
else if (header != null && tailer == null) | |||||
Debug($"{header}: {local} => {remote} (size={len})"); | |||||
else | |||||
Debug($"{header}: {local} => {remote} (size={len}), {tailer}"); | |||||
} | |||||
[Conditional("DEBUG")] | |||||
public static void Debug(Socket sock, int len, string header = null, string tailer = null) | |||||
{ | |||||
Debug(sock.LocalEndPoint, sock.RemoteEndPoint, len, header, tailer); | |||||
} | |||||
public static void LogUsefulException(Exception e) | |||||
{ | |||||
// just log useful exceptions, not all of them | |||||
if (e is SocketException) | |||||
{ | |||||
SocketException se = (SocketException)e; | |||||
if (se.SocketErrorCode == SocketError.ConnectionAborted) | |||||
{ | |||||
// closed by browser when sending | |||||
// normally happens when download is canceled or a tab is closed before page is loaded | |||||
} | |||||
else if (se.SocketErrorCode == SocketError.ConnectionReset) | |||||
{ | |||||
// received rst | |||||
} | |||||
else if (se.SocketErrorCode == SocketError.NotConnected) | |||||
{ | |||||
// The application tried to send or receive data, and the System.Net.Sockets.Socket is not connected. | |||||
} | |||||
else if (se.SocketErrorCode == SocketError.HostUnreachable) | |||||
{ | |||||
// There is no network route to the specified host. | |||||
} | |||||
else if (se.SocketErrorCode == SocketError.TimedOut) | |||||
{ | |||||
// The connection attempt timed out, or the connected host has failed to respond. | |||||
} | |||||
else | |||||
{ | |||||
Info(e); | |||||
} | |||||
} | |||||
else if (e is ObjectDisposedException) | |||||
{ | |||||
} | |||||
else if (e is Win32Exception) | |||||
{ | |||||
var ex = (Win32Exception) e; | |||||
// Win32Exception (0x80004005): A 32 bit processes cannot access modules of a 64 bit process. | |||||
if ((uint) ex.ErrorCode != 0x80004005) | |||||
{ | |||||
Info(e); | |||||
} | |||||
} | |||||
else if (e is ProxyException) | |||||
{ | |||||
var ex = (ProxyException)e; | |||||
switch (ex.Type) | |||||
{ | |||||
case ProxyExceptionType.FailToRun: | |||||
case ProxyExceptionType.QueryReturnMalformed: | |||||
case ProxyExceptionType.SysproxyExitError: | |||||
Error($"sysproxy - {ex.Type.ToString()}:{ex.Message}"); | |||||
break; | |||||
case ProxyExceptionType.QueryReturnEmpty: | |||||
case ProxyExceptionType.Unspecific: | |||||
Error($"sysproxy - {ex.Type.ToString()}"); | |||||
break; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
Info(e); | |||||
} | |||||
} | |||||
} | |||||
// Simply extended System.IO.StreamWriter for adding timestamp workaround | |||||
public class StreamWriterWithTimestamp : StreamWriter | |||||
{ | |||||
public StreamWriterWithTimestamp(Stream stream) : base(stream) | |||||
{ | |||||
} | |||||
private string GetTimestamp() | |||||
{ | |||||
return "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "] "; | |||||
} | |||||
public override void WriteLine(string value) | |||||
{ | |||||
base.WriteLine(GetTimestamp() + value); | |||||
} | |||||
public override void Write(string value) | |||||
{ | |||||
base.Write(GetTimestamp() + value); | |||||
} | |||||
} | |||||
} |
@@ -9,6 +9,7 @@ using System.Net.Sockets; | |||||
using System.Threading; | using System.Threading; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
using NLog; | |||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
using Shadowsocks.Util; | using Shadowsocks.Util; | ||||
@@ -18,6 +19,8 @@ namespace Shadowsocks.Controller | |||||
public sealed class AvailabilityStatistics : IDisposable | public sealed class AvailabilityStatistics : IDisposable | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
public const string DateTimePattern = "yyyy-MM-dd HH:mm:ss"; | public const string DateTimePattern = "yyyy-MM-dd HH:mm:ss"; | ||||
private const string StatisticsFilesName = "shadowsocks.availability.json"; | private const string StatisticsFilesName = "shadowsocks.availability.json"; | ||||
public static string AvailabilityStatisticsFile; | public static string AvailabilityStatisticsFile; | ||||
@@ -111,7 +114,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
@@ -155,7 +158,7 @@ namespace Shadowsocks.Controller | |||||
inR.Add(inboundSpeed); | inR.Add(inboundSpeed); | ||||
outR.Add(outboundSpeed); | outR.Add(outboundSpeed); | ||||
Logging.Debug( | |||||
logger.Debug( | |||||
$"{id}: current/max inbound {inboundSpeed}/{inR.Max()} KiB/s, current/max outbound {outboundSpeed}/{outR.Max()} KiB/s"); | $"{id}: current/max inbound {inboundSpeed}/{inR.Max()} KiB/s, current/max outbound {outboundSpeed}/{outR.Max()} KiB/s"); | ||||
} | } | ||||
} | } | ||||
@@ -213,7 +216,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.Debug("config changed asynchrously, just ignore this server"); | |||||
logger.Debug("config changed asynchrously, just ignore this server"); | |||||
} | } | ||||
} | } | ||||
@@ -235,7 +238,7 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
AppendRecord(server.Identifier(), record); | AppendRecord(server.Identifier(), record); | ||||
} | } | ||||
Logging.Debug($"Ping {server.FriendlyName()} {e.RoundtripTime.Count} times, {(100 - record.PackageLoss * 100)}% packages loss, min {record.MinResponse} ms, max {record.MaxResponse} ms, avg {record.AverageResponse} ms"); | |||||
logger.Debug($"Ping {server.FriendlyName()} {e.RoundtripTime.Count} times, {(100 - record.PackageLoss * 100)}% packages loss, min {record.MinResponse} ms, max {record.MaxResponse} ms, avg {record.AverageResponse} ms"); | |||||
if (Interlocked.Decrement(ref state.counter) == 0) | if (Interlocked.Decrement(ref state.counter) == 0) | ||||
{ | { | ||||
Save(); | Save(); | ||||
@@ -260,13 +263,13 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
private void Save() | private void Save() | ||||
{ | { | ||||
Logging.Debug($"save statistics to {AvailabilityStatisticsFile}"); | |||||
logger.Debug($"save statistics to {AvailabilityStatisticsFile}"); | |||||
if (RawStatistics.Count == 0) | if (RawStatistics.Count == 0) | ||||
{ | { | ||||
return; | return; | ||||
@@ -283,7 +286,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (IOException e) | catch (IOException e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
@@ -300,7 +303,7 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
try | try | ||||
{ | { | ||||
Logging.Debug("filter raw statistics"); | |||||
logger.Debug("filter raw statistics"); | |||||
if (RawStatistics == null) return; | if (RawStatistics == null) return; | ||||
var filteredStatistics = new Statistics(); | var filteredStatistics = new Statistics(); | ||||
@@ -315,7 +318,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
@@ -324,7 +327,7 @@ namespace Shadowsocks.Controller | |||||
try | try | ||||
{ | { | ||||
var path = AvailabilityStatisticsFile; | var path = AvailabilityStatisticsFile; | ||||
Logging.Debug($"loading statistics from {path}"); | |||||
logger.Debug($"loading statistics from {path}"); | |||||
if (!File.Exists(path)) | if (!File.Exists(path)) | ||||
{ | { | ||||
using (File.Create(path)) | using (File.Create(path)) | ||||
@@ -337,7 +340,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
Console.WriteLine($"failed to load statistics; use runtime statistics, some data may be lost"); | Console.WriteLine($"failed to load statistics; use runtime statistics, some data may be lost"); | ||||
} | } | ||||
} | } | ||||
@@ -411,6 +414,8 @@ namespace Shadowsocks.Controller | |||||
class MyPing | class MyPing | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
//arguments for ICMP tests | //arguments for ICMP tests | ||||
public const int TimeoutMilliseconds = 500; | public const int TimeoutMilliseconds = 500; | ||||
@@ -445,7 +450,7 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
try | try | ||||
{ | { | ||||
Logging.Debug($"Ping {server.FriendlyName()}"); | |||||
logger.Debug($"Ping {server.FriendlyName()}"); | |||||
if (ip == null) | if (ip == null) | ||||
{ | { | ||||
ip = Dns.GetHostAddresses(server.server) | ip = Dns.GetHostAddresses(server.server) | ||||
@@ -461,8 +466,8 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.Error($"An exception occured while eveluating {server.FriendlyName()}"); | |||||
Logging.LogUsefulException(e); | |||||
logger.Error($"An exception occured while eveluating {server.FriendlyName()}"); | |||||
logger.LogUsefulException(e); | |||||
FireCompleted(e, userstate); | FireCompleted(e, userstate); | ||||
} | } | ||||
} | } | ||||
@@ -473,20 +478,20 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
if (e.Reply.Status == IPStatus.Success) | if (e.Reply.Status == IPStatus.Success) | ||||
{ | { | ||||
Logging.Debug($"Ping {server.FriendlyName()} {e.Reply.RoundtripTime} ms"); | |||||
logger.Debug($"Ping {server.FriendlyName()} {e.Reply.RoundtripTime} ms"); | |||||
RoundtripTime.Add((int?)e.Reply.RoundtripTime); | RoundtripTime.Add((int?)e.Reply.RoundtripTime); | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
Logging.Debug($"Ping {server.FriendlyName()} timeout"); | |||||
logger.Debug($"Ping {server.FriendlyName()} timeout"); | |||||
RoundtripTime.Add(null); | RoundtripTime.Add(null); | ||||
} | } | ||||
TestNext(e.UserState); | TestNext(e.UserState); | ||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
Logging.Error($"An exception occured while eveluating {server.FriendlyName()}"); | |||||
Logging.LogUsefulException(ex); | |||||
logger.Error($"An exception occured while eveluating {server.FriendlyName()}"); | |||||
logger.LogUsefulException(ex); | |||||
FireCompleted(ex, e.UserState); | FireCompleted(ex, e.UserState); | ||||
} | } | ||||
} | } | ||||
@@ -5,7 +5,7 @@ using System.Net; | |||||
using System.Text; | using System.Text; | ||||
using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
using NLog; | |||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
using Shadowsocks.Properties; | using Shadowsocks.Properties; | ||||
using Shadowsocks.Util; | using Shadowsocks.Util; | ||||
@@ -14,6 +14,8 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
public class GFWListUpdater | public class GFWListUpdater | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private const string GFWLIST_URL = "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"; | private const string GFWLIST_URL = "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"; | ||||
public event EventHandler<ResultEventArgs> UpdateCompleted; | public event EventHandler<ResultEventArgs> UpdateCompleted; | ||||
@@ -93,10 +95,10 @@ var __RULES__ = {JsonConvert.SerializeObject(gfwLines, Formatting.Indented)}; | |||||
string gfwListUrl = GFWLIST_URL; | string gfwListUrl = GFWLIST_URL; | ||||
if (!string.IsNullOrWhiteSpace(config.gfwListUrl)) | if (!string.IsNullOrWhiteSpace(config.gfwListUrl)) | ||||
{ | { | ||||
Logging.Info("Found custom GFWListURL in config file"); | |||||
logger.Info("Found custom GFWListURL in config file"); | |||||
gfwListUrl = config.gfwListUrl; | gfwListUrl = config.gfwListUrl; | ||||
} | } | ||||
Logging.Info($"Checking GFWList from {gfwListUrl}"); | |||||
logger.Info($"Checking GFWList from {gfwListUrl}"); | |||||
WebClient http = new WebClient(); | WebClient http = new WebClient(); | ||||
if (config.enabled) | if (config.enabled) | ||||
{ | { | ||||
@@ -4,13 +4,15 @@ using System.Linq; | |||||
using System.Net; | using System.Net; | ||||
using System.Net.NetworkInformation; | using System.Net.NetworkInformation; | ||||
using System.Net.Sockets; | using System.Net.Sockets; | ||||
using NLog; | |||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
namespace Shadowsocks.Controller | namespace Shadowsocks.Controller | ||||
{ | { | ||||
public class Listener | public class Listener | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
public interface IService | public interface IService | ||||
{ | { | ||||
bool Handle(byte[] firstPacket, int length, Socket socket, object state); | bool Handle(byte[] firstPacket, int length, Socket socket, object state); | ||||
@@ -80,11 +82,8 @@ namespace Shadowsocks.Controller | |||||
_tcpSocket.Listen(1024); | _tcpSocket.Listen(1024); | ||||
// Start an asynchronous socket to listen for connections. | // Start an asynchronous socket to listen for connections. | ||||
Logging.Info($"Shadowsocks started ({UpdateChecker.Version})"); | |||||
if (_config.isVerboseLogging) | |||||
{ | |||||
Logging.Info(Encryption.EncryptorFactory.DumpRegisteredEncryptor()); | |||||
} | |||||
logger.Info($"Shadowsocks started ({UpdateChecker.Version})"); | |||||
logger.Debug(Encryption.EncryptorFactory.DumpRegisteredEncryptor()); | |||||
_tcpSocket.BeginAccept(new AsyncCallback(AcceptCallback), _tcpSocket); | _tcpSocket.BeginAccept(new AsyncCallback(AcceptCallback), _tcpSocket); | ||||
UDPState udpState = new UDPState(_udpSocket); | UDPState udpState = new UDPState(_udpSocket); | ||||
_udpSocket.BeginReceiveFrom(udpState.buffer, 0, udpState.buffer.Length, 0, ref udpState.remoteEndPoint, new AsyncCallback(RecvFromCallback), udpState); | _udpSocket.BeginReceiveFrom(udpState.buffer, 0, udpState.buffer.Length, 0, ref udpState.remoteEndPoint, new AsyncCallback(RecvFromCallback), udpState); | ||||
@@ -132,7 +131,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
Logging.Debug(ex); | |||||
logger.Debug(ex); | |||||
} | } | ||||
finally | finally | ||||
{ | { | ||||
@@ -171,7 +170,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
finally | finally | ||||
{ | { | ||||
@@ -187,7 +186,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -218,7 +217,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
conn.Close(); | conn.Close(); | ||||
} | } | ||||
} | } | ||||
@@ -1,4 +1,5 @@ | |||||
using Shadowsocks.Properties; | |||||
using NLog; | |||||
using Shadowsocks.Properties; | |||||
using Shadowsocks.Util; | using Shadowsocks.Util; | ||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
@@ -15,6 +16,8 @@ namespace Shadowsocks.Controller | |||||
/// </summary> | /// </summary> | ||||
public class PACDaemon | public class PACDaemon | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
public const string PAC_FILE = "pac.txt"; | public const string PAC_FILE = "pac.txt"; | ||||
public const string USER_RULE_FILE = "user-rule.txt"; | public const string USER_RULE_FILE = "user-rule.txt"; | ||||
public const string USER_ABP_FILE = "abp.txt"; | public const string USER_ABP_FILE = "abp.txt"; | ||||
@@ -100,7 +103,7 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
if (PACFileChanged != null) | if (PACFileChanged != null) | ||||
{ | { | ||||
Logging.Info($"Detected: PAC file '{e.Name}' was {e.ChangeType.ToString().ToLower()}."); | |||||
logger.Info($"Detected: PAC file '{e.Name}' was {e.ChangeType.ToString().ToLower()}."); | |||||
Task.Factory.StartNew(() => | Task.Factory.StartNew(() => | ||||
{ | { | ||||
((FileSystemWatcher)sender).EnableRaisingEvents = false; | ((FileSystemWatcher)sender).EnableRaisingEvents = false; | ||||
@@ -115,7 +118,7 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
if (UserRuleFileChanged != null) | if (UserRuleFileChanged != null) | ||||
{ | { | ||||
Logging.Info($"Detected: User Rule file '{e.Name}' was {e.ChangeType.ToString().ToLower()}."); | |||||
logger.Info($"Detected: User Rule file '{e.Name}' was {e.ChangeType.ToString().ToLower()}."); | |||||
Task.Factory.StartNew(() => | Task.Factory.StartNew(() => | ||||
{ | { | ||||
((FileSystemWatcher)sender).EnableRaisingEvents = false; | ((FileSystemWatcher)sender).EnableRaisingEvents = false; | ||||
@@ -6,11 +6,14 @@ using System.Net; | |||||
using System.Net.Sockets; | using System.Net.Sockets; | ||||
using System.Text; | using System.Text; | ||||
using System.Web; | using System.Web; | ||||
using NLog; | |||||
namespace Shadowsocks.Controller | namespace Shadowsocks.Controller | ||||
{ | { | ||||
public class PACServer : Listener.Service | public class PACServer : Listener.Service | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
public const string RESOURCE_NAME = "pac"; | public const string RESOURCE_NAME = "pac"; | ||||
private string PacSecret | private string PacSecret | ||||
@@ -43,7 +46,7 @@ namespace Shadowsocks.Controller | |||||
string usedSecret = _config.secureLocalPac ? $"&secret={PacSecret}" : ""; | string usedSecret = _config.secureLocalPac ? $"&secret={PacSecret}" : ""; | ||||
string contentHash = GetHash(_pacDaemon.GetPACContent()); | string contentHash = GetHash(_pacDaemon.GetPACContent()); | ||||
PacUrl = $"http://{config.localHost}:{config.localPort}/{RESOURCE_NAME}?hash={contentHash}{usedSecret}"; | PacUrl = $"http://{config.localHost}:{config.localPort}/{RESOURCE_NAME}?hash={contentHash}{usedSecret}"; | ||||
Logging.Debug("Set PAC URL:" + PacUrl); | |||||
logger.Debug("Set PAC URL:" + PacUrl); | |||||
} | } | ||||
private static string GetHash(string content) | private static string GetHash(string content) | ||||
@@ -177,7 +180,7 @@ Connection: Close | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
socket.Close(); | socket.Close(); | ||||
} | } | ||||
} | } | ||||
@@ -1,6 +1,7 @@ | |||||
using System; | using System; | ||||
using System.Net; | using System.Net; | ||||
using System.Net.Sockets; | using System.Net.Sockets; | ||||
using NLog; | |||||
using Shadowsocks.Util.Sockets; | using Shadowsocks.Util.Sockets; | ||||
namespace Shadowsocks.Controller | namespace Shadowsocks.Controller | ||||
@@ -26,6 +27,8 @@ namespace Shadowsocks.Controller | |||||
private class Handler | private class Handler | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private byte[] _firstPacket; | private byte[] _firstPacket; | ||||
private int _firstPacketLength; | private int _firstPacketLength; | ||||
private Socket _local; | private Socket _local; | ||||
@@ -58,7 +61,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -77,7 +80,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -94,7 +97,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -115,7 +118,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -142,7 +145,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -169,7 +172,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -188,7 +191,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -207,7 +210,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -239,7 +242,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
if (_remote != null) | if (_remote != null) | ||||
@@ -251,7 +254,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (SocketException e) | catch (SocketException e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -6,6 +6,7 @@ using System.Net; | |||||
using System.Net.Sockets; | using System.Net.Sockets; | ||||
using System.Text; | using System.Text; | ||||
using System.Windows.Forms; | using System.Windows.Forms; | ||||
using NLog; | |||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
using Shadowsocks.Properties; | using Shadowsocks.Properties; | ||||
using Shadowsocks.Util; | using Shadowsocks.Util; | ||||
@@ -15,6 +16,8 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
class PrivoxyRunner | class PrivoxyRunner | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private static int _uid; | private static int _uid; | ||||
private static string _uniqueConfigFile; | private static string _uniqueConfigFile; | ||||
private static Job _privoxyJob; | private static Job _privoxyJob; | ||||
@@ -33,7 +36,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (IOException e) | catch (IOException e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
@@ -106,7 +109,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
@@ -139,7 +142,7 @@ namespace Shadowsocks.Controller | |||||
* are already dead, and that will cause exceptions here. | * are already dead, and that will cause exceptions here. | ||||
* We could simply ignore those exceptions. | * We could simply ignore those exceptions. | ||||
*/ | */ | ||||
Logging.LogUsefulException(ex); | |||||
logger.LogUsefulException(ex); | |||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
@@ -159,7 +162,7 @@ namespace Shadowsocks.Controller | |||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
// in case access denied | // in case access denied | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
return defaultPort; | return defaultPort; | ||||
} | } | ||||
} | } | ||||
@@ -1,4 +1,5 @@ | |||||
using System; | |||||
using NLog; | |||||
using System; | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Linq; | using System.Linq; | ||||
using System.Net; | using System.Net; | ||||
@@ -17,6 +18,7 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
class TCPRelay : Listener.Service | class TCPRelay : Listener.Service | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private ShadowsocksController _controller; | private ShadowsocksController _controller; | ||||
private DateTime _lastSweepTime; | private DateTime _lastSweepTime; | ||||
private Configuration _config; | private Configuration _config; | ||||
@@ -54,7 +56,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
foreach (TCPHandler handler1 in handlersToClose) | foreach (TCPHandler handler1 in handlersToClose) | ||||
{ | { | ||||
Logging.Debug("Closing timed out TCP connection."); | |||||
logger.Debug("Closing timed out TCP connection."); | |||||
handler1.Close(); | handler1.Close(); | ||||
} | } | ||||
@@ -122,6 +124,8 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
} | } | ||||
private static Logger Logger = LogManager.GetCurrentClassLogger(); | |||||
private readonly int _serverTimeout; | private readonly int _serverTimeout; | ||||
private readonly int _proxyTimeout; | private readonly int _proxyTimeout; | ||||
@@ -217,7 +221,7 @@ namespace Shadowsocks.Controller | |||||
this._server = server; | this._server = server; | ||||
/* prepare address buffer length for AEAD */ | /* prepare address buffer length for AEAD */ | ||||
Logging.Debug($"_addrBufLength={_addrBufLength}"); | |||||
Logger.Debug($"_addrBufLength={_addrBufLength}"); | |||||
_encryptor.AddrBufLength = _addrBufLength; | _encryptor.AddrBufLength = _addrBufLength; | ||||
} | } | ||||
@@ -252,7 +256,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
} | } | ||||
if (_currentRemoteSession != null) | if (_currentRemoteSession != null) | ||||
@@ -265,7 +269,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
@@ -291,7 +295,7 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
// reject socks 4 | // reject socks 4 | ||||
response = new byte[] { 0, 91 }; | response = new byte[] { 0, 91 }; | ||||
Logging.Error("socks 5 protocol error"); | |||||
Logger.Error("socks 5 protocol error"); | |||||
} | } | ||||
_connection.BeginSend(response, 0, response.Length, SocketFlags.None, | _connection.BeginSend(response, 0, response.Length, SocketFlags.None, | ||||
HandshakeSendCallback, null); | HandshakeSendCallback, null); | ||||
@@ -301,7 +305,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -326,7 +330,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -358,21 +362,21 @@ namespace Shadowsocks.Controller | |||||
break; | break; | ||||
case CMD_BIND: // not implemented | case CMD_BIND: // not implemented | ||||
default: | default: | ||||
Logging.Debug("Unsupported CMD=" + _command); | |||||
Logger.Debug("Unsupported CMD=" + _command); | |||||
Close(); | Close(); | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
Logging.Debug( | |||||
Logger.Debug( | |||||
"failed to recv data in Shadowsocks.Controller.TCPHandler.handshakeReceive2Callback()"); | "failed to recv data in Shadowsocks.Controller.TCPHandler.handshakeReceive2Callback()"); | ||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -387,7 +391,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -409,7 +413,7 @@ namespace Shadowsocks.Controller | |||||
ReadAddress(16 + ADDR_PORT_LEN - 1, onSuccess); | ReadAddress(16 + ADDR_PORT_LEN - 1, onSuccess); | ||||
break; | break; | ||||
default: | default: | ||||
Logging.Debug("Unsupported ATYP=" + atyp); | |||||
Logger.Debug("Unsupported ATYP=" + atyp); | |||||
Close(); | Close(); | ||||
break; | break; | ||||
} | } | ||||
@@ -468,10 +472,7 @@ namespace Shadowsocks.Controller | |||||
break; | break; | ||||
} | } | ||||
if (_config.isVerboseLogging) | |||||
{ | |||||
Logging.Info($"connect to {dstAddr}:{dstPort}"); | |||||
} | |||||
Logger.Debug($"connect to {dstAddr}:{dstPort}"); | |||||
_destEndPoint = SocketUtil.GetEndPoint(dstAddr, dstPort); | _destEndPoint = SocketUtil.GetEndPoint(dstAddr, dstPort); | ||||
@@ -479,13 +480,13 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
Logging.Debug("failed to recv data in Shadowsocks.Controller.TCPHandler.OnAddressFullyRead()"); | |||||
Logger.Debug("failed to recv data in Shadowsocks.Controller.TCPHandler.OnAddressFullyRead()"); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -537,7 +538,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -631,7 +632,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -650,7 +651,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
var proxy = timer.Session.Remote; | var proxy = timer.Session.Remote; | ||||
Logging.Info($"Proxy {proxy.ProxyEndPoint} timed out"); | |||||
Logger.Info($"Proxy {proxy.ProxyEndPoint} timed out"); | |||||
proxy.Close(); | proxy.Close(); | ||||
Close(); | Close(); | ||||
} | } | ||||
@@ -678,12 +679,9 @@ namespace Shadowsocks.Controller | |||||
_proxyConnected = true; | _proxyConnected = true; | ||||
if (_config.isVerboseLogging) | |||||
if (!(remote is DirectConnect)) | |||||
{ | { | ||||
if (!(remote is DirectConnect)) | |||||
{ | |||||
Logging.Info($"Socket connected to proxy {remote.ProxyEndPoint}"); | |||||
} | |||||
Logger.Debug($"Socket connected to proxy {remote.ProxyEndPoint}"); | |||||
} | } | ||||
_startConnectTime = DateTime.Now; | _startConnectTime = DateTime.Now; | ||||
@@ -710,7 +708,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -731,7 +729,7 @@ namespace Shadowsocks.Controller | |||||
Server server = timer.Server; | Server server = timer.Server; | ||||
IStrategy strategy = _controller.GetCurrentStrategy(); | IStrategy strategy = _controller.GetCurrentStrategy(); | ||||
strategy?.SetFailure(server); | strategy?.SetFailure(server); | ||||
Logging.Info($"{server.FriendlyName()} timed out"); | |||||
Logger.Info($"{server.FriendlyName()} timed out"); | |||||
session.Remote.Close(); | session.Remote.Close(); | ||||
Close(); | Close(); | ||||
} | } | ||||
@@ -754,10 +752,7 @@ namespace Shadowsocks.Controller | |||||
_destConnected = true; | _destConnected = true; | ||||
if (_config.isVerboseLogging) | |||||
{ | |||||
Logging.Info($"Socket connected to ss server: {_server.FriendlyName()}"); | |||||
} | |||||
Logger.Debug($"Socket connected to ss server: {_server.FriendlyName()}"); | |||||
var latency = DateTime.Now - _startConnectTime; | var latency = DateTime.Now - _startConnectTime; | ||||
IStrategy strategy = _controller.GetCurrentStrategy(); | IStrategy strategy = _controller.GetCurrentStrategy(); | ||||
@@ -776,7 +771,7 @@ namespace Shadowsocks.Controller | |||||
IStrategy strategy = _controller.GetCurrentStrategy(); | IStrategy strategy = _controller.GetCurrentStrategy(); | ||||
strategy?.SetFailure(_server); | strategy?.SetFailure(_server); | ||||
} | } | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -803,12 +798,12 @@ namespace Shadowsocks.Controller | |||||
PipeRemoteReceiveCallback, session); | PipeRemoteReceiveCallback, session); | ||||
TryReadAvailableData(); | TryReadAvailableData(); | ||||
Logging.Debug($"_firstPacketLength = {_firstPacketLength}"); | |||||
Logger.Debug($"_firstPacketLength = {_firstPacketLength}"); | |||||
SendToServer(_firstPacketLength, session); | SendToServer(_firstPacketLength, session); | ||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -834,7 +829,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (CryptoErrorException) | catch (CryptoErrorException) | ||||
{ | { | ||||
Logging.Error("decryption error"); | |||||
Logger.Error("decryption error"); | |||||
Close(); | Close(); | ||||
return; | return; | ||||
} | } | ||||
@@ -842,12 +837,12 @@ namespace Shadowsocks.Controller | |||||
if (bytesToSend == 0) | if (bytesToSend == 0) | ||||
{ | { | ||||
// need more to decrypt | // need more to decrypt | ||||
Logging.Debug("Need more to decrypt"); | |||||
Logger.Debug("Need more to decrypt"); | |||||
session.Remote.BeginReceive(_remoteRecvBuffer, 0, RecvSize, SocketFlags.None, | session.Remote.BeginReceive(_remoteRecvBuffer, 0, RecvSize, SocketFlags.None, | ||||
PipeRemoteReceiveCallback, session); | PipeRemoteReceiveCallback, session); | ||||
return; | return; | ||||
} | } | ||||
Logging.Debug($"start sending {bytesToSend}"); | |||||
Logger.Debug($"start sending {bytesToSend}"); | |||||
_connection.BeginSend(_remoteSendBuffer, 0, bytesToSend, SocketFlags.None, | _connection.BeginSend(_remoteSendBuffer, 0, bytesToSend, SocketFlags.None, | ||||
PipeConnectionSendCallback, new object[] { session, bytesToSend }); | PipeConnectionSendCallback, new object[] { session, bytesToSend }); | ||||
IStrategy strategy = _controller.GetCurrentStrategy(); | IStrategy strategy = _controller.GetCurrentStrategy(); | ||||
@@ -862,7 +857,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -890,7 +885,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -907,7 +902,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (CryptoErrorException) | catch (CryptoErrorException) | ||||
{ | { | ||||
Logging.Debug("encryption error"); | |||||
Logger.Debug("encryption error"); | |||||
Close(); | Close(); | ||||
return; | return; | ||||
} | } | ||||
@@ -932,7 +927,7 @@ namespace Shadowsocks.Controller | |||||
int bytesRemaining = bytesShouldSend - bytesSent; | int bytesRemaining = bytesShouldSend - bytesSent; | ||||
if (bytesRemaining > 0) | if (bytesRemaining > 0) | ||||
{ | { | ||||
Logging.Info("reconstruct _connetionSendBuffer to re-send"); | |||||
Logger.Info("reconstruct _connetionSendBuffer to re-send"); | |||||
Buffer.BlockCopy(_connetionSendBuffer, bytesSent, _connetionSendBuffer, 0, bytesRemaining); | Buffer.BlockCopy(_connetionSendBuffer, bytesSent, _connetionSendBuffer, 0, bytesRemaining); | ||||
session.Remote.BeginSend(_connetionSendBuffer, 0, bytesRemaining, SocketFlags.None, | session.Remote.BeginSend(_connetionSendBuffer, 0, bytesRemaining, SocketFlags.None, | ||||
PipeRemoteSendCallback, new object[] { session, bytesRemaining }); | PipeRemoteSendCallback, new object[] { session, bytesRemaining }); | ||||
@@ -943,7 +938,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -960,7 +955,7 @@ namespace Shadowsocks.Controller | |||||
var bytesRemaining = bytesShouldSend - bytesSent; | var bytesRemaining = bytesShouldSend - bytesSent; | ||||
if (bytesRemaining > 0) | if (bytesRemaining > 0) | ||||
{ | { | ||||
Logging.Info("reconstruct _remoteSendBuffer to re-send"); | |||||
Logger.Info("reconstruct _remoteSendBuffer to re-send"); | |||||
Buffer.BlockCopy(_remoteSendBuffer, bytesSent, _remoteSendBuffer, 0, bytesRemaining); | Buffer.BlockCopy(_remoteSendBuffer, bytesSent, _remoteSendBuffer, 0, bytesRemaining); | ||||
_connection.BeginSend(_remoteSendBuffer, 0, bytesRemaining, SocketFlags.None, | _connection.BeginSend(_remoteSendBuffer, 0, bytesRemaining, SocketFlags.None, | ||||
PipeConnectionSendCallback, new object[] { session, bytesRemaining }); | PipeConnectionSendCallback, new object[] { session, bytesRemaining }); | ||||
@@ -971,7 +966,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
Logger.LogUsefulException(e); | |||||
Close(); | Close(); | ||||
} | } | ||||
} | } | ||||
@@ -3,6 +3,7 @@ using System.Collections.Generic; | |||||
using System.Net; | using System.Net; | ||||
using System.Net.Sockets; | using System.Net.Sockets; | ||||
using System.Runtime.CompilerServices; | using System.Runtime.CompilerServices; | ||||
using NLog; | |||||
using Shadowsocks.Controller.Strategy; | using Shadowsocks.Controller.Strategy; | ||||
using Shadowsocks.Encryption; | using Shadowsocks.Encryption; | ||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
@@ -49,6 +50,8 @@ namespace Shadowsocks.Controller | |||||
public class UDPHandler | public class UDPHandler | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private Socket _local; | private Socket _local; | ||||
private Socket _remote; | private Socket _remote; | ||||
@@ -98,14 +101,14 @@ namespace Shadowsocks.Controller | |||||
byte[] dataOut = new byte[65536]; // enough space for AEAD ciphers | byte[] dataOut = new byte[65536]; // enough space for AEAD ciphers | ||||
int outlen; | int outlen; | ||||
encryptor.EncryptUDP(dataIn, length - 3, dataOut, out outlen); | encryptor.EncryptUDP(dataIn, length - 3, dataOut, out outlen); | ||||
Logging.Debug(_localEndPoint, _remoteEndPoint, outlen, "UDP Relay"); | |||||
logger.Debug(_localEndPoint, _remoteEndPoint, outlen, "UDP Relay"); | |||||
_remote?.SendTo(dataOut, outlen, SocketFlags.None, _remoteEndPoint); | _remote?.SendTo(dataOut, outlen, SocketFlags.None, _remoteEndPoint); | ||||
} | } | ||||
public void Receive() | public void Receive() | ||||
{ | { | ||||
EndPoint remoteEndPoint = new IPEndPoint(GetIPAddress(), 0); | EndPoint remoteEndPoint = new IPEndPoint(GetIPAddress(), 0); | ||||
Logging.Debug($"++++++Receive Server Port, size:" + _buffer.Length); | |||||
logger.Debug($"++++++Receive Server Port, size:" + _buffer.Length); | |||||
_remote?.BeginReceiveFrom(_buffer, 0, _buffer.Length, 0, ref remoteEndPoint, new AsyncCallback(RecvFromCallback), null); | _remote?.BeginReceiveFrom(_buffer, 0, _buffer.Length, 0, ref remoteEndPoint, new AsyncCallback(RecvFromCallback), null); | ||||
} | } | ||||
@@ -126,7 +129,7 @@ namespace Shadowsocks.Controller | |||||
byte[] sendBuf = new byte[outlen + 3]; | byte[] sendBuf = new byte[outlen + 3]; | ||||
Array.Copy(dataOut, 0, sendBuf, 3, outlen); | Array.Copy(dataOut, 0, sendBuf, 3, outlen); | ||||
Logging.Debug(_localEndPoint, _remoteEndPoint, outlen, "UDP Relay"); | |||||
logger.Debug(_localEndPoint, _remoteEndPoint, outlen, "UDP Relay"); | |||||
_local?.SendTo(sendBuf, outlen + 3, 0, _localEndPoint); | _local?.SendTo(sendBuf, outlen + 3, 0, _localEndPoint); | ||||
Receive(); | Receive(); | ||||
@@ -4,7 +4,7 @@ using System.Net; | |||||
using System.Text.RegularExpressions; | using System.Text.RegularExpressions; | ||||
using Newtonsoft.Json.Linq; | using Newtonsoft.Json.Linq; | ||||
using NLog; | |||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
using Shadowsocks.Util; | using Shadowsocks.Util; | ||||
@@ -12,6 +12,8 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
public class UpdateChecker | public class UpdateChecker | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private const string UpdateURL = "https://api.github.com/repos/shadowsocks/shadowsocks-windows/releases"; | private const string UpdateURL = "https://api.github.com/repos/shadowsocks/shadowsocks-windows/releases"; | ||||
private const string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"; | private const string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"; | ||||
@@ -60,14 +62,14 @@ namespace Shadowsocks.Controller | |||||
try | try | ||||
{ | { | ||||
Logging.Debug("Checking updates..."); | |||||
logger.Debug("Checking updates..."); | |||||
WebClient http = CreateWebClient(); | WebClient http = CreateWebClient(); | ||||
http.DownloadStringCompleted += http_DownloadStringCompleted; | http.DownloadStringCompleted += http_DownloadStringCompleted; | ||||
http.DownloadStringAsync(new Uri(UpdateURL)); | http.DownloadStringAsync(new Uri(UpdateURL)); | ||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
Logging.LogUsefulException(ex); | |||||
logger.LogUsefulException(ex); | |||||
} | } | ||||
} | } | ||||
@@ -117,7 +119,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
Logging.Debug("No update is available"); | |||||
logger.Debug("No update is available"); | |||||
if (CheckUpdateCompleted != null) | if (CheckUpdateCompleted != null) | ||||
{ | { | ||||
CheckUpdateCompleted(this, new EventArgs()); | CheckUpdateCompleted(this, new EventArgs()); | ||||
@@ -126,7 +128,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
Logging.LogUsefulException(ex); | |||||
logger.LogUsefulException(ex); | |||||
} | } | ||||
} | } | ||||
@@ -141,7 +143,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
Logging.LogUsefulException(ex); | |||||
logger.LogUsefulException(ex); | |||||
} | } | ||||
} | } | ||||
@@ -151,10 +153,10 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
if (e.Error != null) | if (e.Error != null) | ||||
{ | { | ||||
Logging.LogUsefulException(e.Error); | |||||
logger.LogUsefulException(e.Error); | |||||
return; | return; | ||||
} | } | ||||
Logging.Debug($"New version {LatestVersionNumber}{LatestVersionSuffix} found: {LatestVersionLocalName}"); | |||||
logger.Debug($"New version {LatestVersionNumber}{LatestVersionSuffix} found: {LatestVersionLocalName}"); | |||||
if (CheckUpdateCompleted != null) | if (CheckUpdateCompleted != null) | ||||
{ | { | ||||
CheckUpdateCompleted(this, new EventArgs()); | CheckUpdateCompleted(this, new EventArgs()); | ||||
@@ -162,7 +164,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
Logging.LogUsefulException(ex); | |||||
logger.LogUsefulException(ex); | |||||
} | } | ||||
} | } | ||||
@@ -9,7 +9,7 @@ using System.Text; | |||||
using System.Threading; | using System.Threading; | ||||
using System.Web; | using System.Web; | ||||
using System.Windows.Forms; | using System.Windows.Forms; | ||||
using NLog; | |||||
using Shadowsocks.Controller.Service; | using Shadowsocks.Controller.Service; | ||||
using Shadowsocks.Controller.Strategy; | using Shadowsocks.Controller.Strategy; | ||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
@@ -19,6 +19,8 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
public class ShadowsocksController | public class ShadowsocksController | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
// controller: | // controller: | ||||
// handle user actions | // handle user actions | ||||
// manipulates UI | // manipulates UI | ||||
@@ -95,6 +97,11 @@ namespace Shadowsocks.Controller | |||||
_pluginsByServer = new ConcurrentDictionary<Server, Sip003Plugin>(); | _pluginsByServer = new ConcurrentDictionary<Server, Sip003Plugin>(); | ||||
StartReleasingMemory(); | StartReleasingMemory(); | ||||
StartTrafficStatistics(61); | StartTrafficStatistics(61); | ||||
ProgramUpdated += (o, e) => | |||||
{ | |||||
logger.Info($"Updated from {e.OldVersion} to {e.NewVersion}"); | |||||
}; | |||||
} | } | ||||
public void Start(bool regHotkeys = true) | public void Start(bool regHotkeys = true) | ||||
@@ -184,13 +191,13 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
if (plugin.StartIfNeeded()) | if (plugin.StartIfNeeded()) | ||||
{ | { | ||||
Logging.Info( | |||||
logger.Info( | |||||
$"Started SIP003 plugin for {server.Identifier()} on {plugin.LocalEndPoint} - PID: {plugin.ProcessId}"); | $"Started SIP003 plugin for {server.Identifier()} on {plugin.LocalEndPoint} - PID: {plugin.ProcessId}"); | ||||
} | } | ||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
Logging.Error("Failed to start SIP003 plugin: " + ex.Message); | |||||
logger.Error("Failed to start SIP003 plugin: " + ex.Message); | |||||
throw; | throw; | ||||
} | } | ||||
@@ -232,7 +239,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
@@ -271,6 +278,7 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
_config.isVerboseLogging = enabled; | _config.isVerboseLogging = enabled; | ||||
SaveConfig(_config); | SaveConfig(_config); | ||||
NLogConfig.LoadConfiguration(); // reload nlog | |||||
VerboseLoggingStatusChanged?.Invoke(this, new EventArgs()); | VerboseLoggingStatusChanged?.Invoke(this, new EventArgs()); | ||||
} | } | ||||
@@ -494,6 +502,9 @@ namespace Shadowsocks.Controller | |||||
Encryption.RNG.Reload(); | Encryption.RNG.Reload(); | ||||
// some logic in configuration updated the config when saving, we need to read it again | // some logic in configuration updated the config when saving, we need to read it again | ||||
_config = Configuration.Load(); | _config = Configuration.Load(); | ||||
NLogConfig.LoadConfiguration(); | |||||
StatisticsConfiguration = StatisticsStrategyConfiguration.Load(); | StatisticsConfiguration = StatisticsStrategyConfiguration.Load(); | ||||
privoxyRunner = privoxyRunner ?? new PrivoxyRunner(); | privoxyRunner = privoxyRunner ?? new PrivoxyRunner(); | ||||
@@ -552,7 +563,7 @@ namespace Shadowsocks.Controller | |||||
e = new Exception(I18N.GetString("Port {0} is reserved by system", _config.localPort), e); | e = new Exception(I18N.GetString("Port {0} is reserved by system", _config.localPort), e); | ||||
} | } | ||||
} | } | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
ReportError(e); | ReportError(e); | ||||
} | } | ||||
@@ -1,4 +1,5 @@ | |||||
using Shadowsocks.Model; | |||||
using NLog; | |||||
using Shadowsocks.Model; | |||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Net; | using System.Net; | ||||
@@ -8,6 +9,8 @@ namespace Shadowsocks.Controller.Strategy | |||||
{ | { | ||||
class HighAvailabilityStrategy : IStrategy | class HighAvailabilityStrategy : IStrategy | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
protected ServerStatus _currentServer; | protected ServerStatus _currentServer; | ||||
protected Dictionary<Server, ServerStatus> _serverStatus; | protected Dictionary<Server, ServerStatus> _serverStatus; | ||||
ShadowsocksController _controller; | ShadowsocksController _controller; | ||||
@@ -111,7 +114,7 @@ namespace Shadowsocks.Controller.Strategy | |||||
100 * 1000 * Math.Min(5 * 60, (now - status.lastFailure).TotalSeconds) | 100 * 1000 * Math.Min(5 * 60, (now - status.lastFailure).TotalSeconds) | ||||
-2 * 5 * (Math.Min(2000, status.latency.TotalMilliseconds) / (1 + (now - status.lastTimeDetectLatency).TotalSeconds / 30 / 10) + | -2 * 5 * (Math.Min(2000, status.latency.TotalMilliseconds) / (1 + (now - status.lastTimeDetectLatency).TotalSeconds / 30 / 10) + | ||||
-0.5 * 200 * Math.Min(5, (status.lastRead - status.lastWrite).TotalSeconds)); | -0.5 * 200 * Math.Min(5, (status.lastRead - status.lastWrite).TotalSeconds)); | ||||
Logging.Debug(String.Format("server: {0} latency:{1} score: {2}", status.server.FriendlyName(), status.latency, status.score)); | |||||
logger.Debug(String.Format("server: {0} latency:{1} score: {2}", status.server.FriendlyName(), status.latency, status.score)); | |||||
} | } | ||||
ServerStatus max = null; | ServerStatus max = null; | ||||
foreach (var status in servers) | foreach (var status in servers) | ||||
@@ -133,14 +136,14 @@ namespace Shadowsocks.Controller.Strategy | |||||
if (_currentServer == null || max.score - _currentServer.score > 200) | if (_currentServer == null || max.score - _currentServer.score > 200) | ||||
{ | { | ||||
_currentServer = max; | _currentServer = max; | ||||
Logging.Info($"HA switching to server: {_currentServer.server.FriendlyName()}"); | |||||
logger.Info($"HA switching to server: {_currentServer.server.FriendlyName()}"); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
public void UpdateLatency(Model.Server server, TimeSpan latency) | public void UpdateLatency(Model.Server server, TimeSpan latency) | ||||
{ | { | ||||
Logging.Debug($"latency: {server.FriendlyName()} {latency}"); | |||||
logger.Debug($"latency: {server.FriendlyName()} {latency}"); | |||||
ServerStatus status; | ServerStatus status; | ||||
if (_serverStatus.TryGetValue(server, out status)) | if (_serverStatus.TryGetValue(server, out status)) | ||||
@@ -152,7 +155,7 @@ namespace Shadowsocks.Controller.Strategy | |||||
public void UpdateLastRead(Model.Server server) | public void UpdateLastRead(Model.Server server) | ||||
{ | { | ||||
Logging.Debug($"last read: {server.FriendlyName()}"); | |||||
logger.Debug($"last read: {server.FriendlyName()}"); | |||||
ServerStatus status; | ServerStatus status; | ||||
if (_serverStatus.TryGetValue(server, out status)) | if (_serverStatus.TryGetValue(server, out status)) | ||||
@@ -163,7 +166,7 @@ namespace Shadowsocks.Controller.Strategy | |||||
public void UpdateLastWrite(Model.Server server) | public void UpdateLastWrite(Model.Server server) | ||||
{ | { | ||||
Logging.Debug($"last write: {server.FriendlyName()}"); | |||||
logger.Debug($"last write: {server.FriendlyName()}"); | |||||
ServerStatus status; | ServerStatus status; | ||||
if (_serverStatus.TryGetValue(server, out status)) | if (_serverStatus.TryGetValue(server, out status)) | ||||
@@ -174,7 +177,7 @@ namespace Shadowsocks.Controller.Strategy | |||||
public void SetFailure(Model.Server server) | public void SetFailure(Model.Server server) | ||||
{ | { | ||||
Logging.Debug($"failure: {server.FriendlyName()}"); | |||||
logger.Debug($"failure: {server.FriendlyName()}"); | |||||
ServerStatus status; | ServerStatus status; | ||||
if (_serverStatus.TryGetValue(server, out status)) | if (_serverStatus.TryGetValue(server, out status)) | ||||
@@ -5,7 +5,7 @@ using System.Net; | |||||
using System.Threading; | using System.Threading; | ||||
using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
using NLog; | |||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
namespace Shadowsocks.Controller.Strategy | namespace Shadowsocks.Controller.Strategy | ||||
@@ -14,6 +14,8 @@ namespace Shadowsocks.Controller.Strategy | |||||
internal class StatisticsStrategy : IStrategy, IDisposable | internal class StatisticsStrategy : IStrategy, IDisposable | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private readonly ShadowsocksController _controller; | private readonly ShadowsocksController _controller; | ||||
private Server _currentServer; | private Server _currentServer; | ||||
private readonly Timer _timer; | private readonly Timer _timer; | ||||
@@ -34,7 +36,7 @@ namespace Shadowsocks.Controller.Strategy | |||||
private void ReloadStatisticsAndChooseAServer(object obj) | private void ReloadStatisticsAndChooseAServer(object obj) | ||||
{ | { | ||||
Logging.Debug("Reloading statistics and choose a new server...."); | |||||
logger.Debug("Reloading statistics and choose a new server...."); | |||||
var servers = _controller.GetCurrentConfiguration().configs; | var servers = _controller.GetCurrentConfiguration().configs; | ||||
LoadStatistics(); | LoadStatistics(); | ||||
ChooseNewServer(servers); | ChooseNewServer(servers); | ||||
@@ -74,7 +76,7 @@ namespace Shadowsocks.Controller.Strategy | |||||
if (score != null) | if (score != null) | ||||
{ | { | ||||
Logging.Debug($"Highest score: {score} {JsonConvert.SerializeObject(averageRecord, Formatting.Indented)}"); | |||||
logger.Debug($"Highest score: {score} {JsonConvert.SerializeObject(averageRecord, Formatting.Indented)}"); | |||||
} | } | ||||
return score; | return score; | ||||
} | } | ||||
@@ -112,7 +114,7 @@ namespace Shadowsocks.Controller.Strategy | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
@@ -145,7 +147,7 @@ namespace Shadowsocks.Controller.Strategy | |||||
public void SetFailure(Server server) | public void SetFailure(Server server) | ||||
{ | { | ||||
Logging.Debug($"failure: {server.FriendlyName()}"); | |||||
logger.Debug($"failure: {server.FriendlyName()}"); | |||||
} | } | ||||
public void UpdateLastRead(Server server) | public void UpdateLastRead(Server server) | ||||
@@ -5,12 +5,15 @@ using System.Reflection; | |||||
using System.Runtime.InteropServices; | using System.Runtime.InteropServices; | ||||
using System.Windows.Forms; | using System.Windows.Forms; | ||||
using Microsoft.Win32; | using Microsoft.Win32; | ||||
using NLog; | |||||
using Shadowsocks.Util; | using Shadowsocks.Util; | ||||
namespace Shadowsocks.Controller | namespace Shadowsocks.Controller | ||||
{ | { | ||||
static class AutoStartup | static class AutoStartup | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
// Don't use Application.ExecutablePath | // Don't use Application.ExecutablePath | ||||
// see https://stackoverflow.com/questions/12945805/odd-c-sharp-path-issue | // see https://stackoverflow.com/questions/12945805/odd-c-sharp-path-issue | ||||
private static readonly string ExecutablePath = Assembly.GetEntryAssembly().Location; | private static readonly string ExecutablePath = Assembly.GetEntryAssembly().Location; | ||||
@@ -25,7 +28,7 @@ namespace Shadowsocks.Controller | |||||
runKey = Utils.OpenRegKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true); | runKey = Utils.OpenRegKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true); | ||||
if (runKey == null) | if (runKey == null) | ||||
{ | { | ||||
Logging.Error(@"Cannot find HKCU\Software\Microsoft\Windows\CurrentVersion\Run"); | |||||
logger.Error(@"Cannot find HKCU\Software\Microsoft\Windows\CurrentVersion\Run"); | |||||
return false; | return false; | ||||
} | } | ||||
if (enabled) | if (enabled) | ||||
@@ -42,7 +45,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
return false; | return false; | ||||
} | } | ||||
finally | finally | ||||
@@ -55,7 +58,7 @@ namespace Shadowsocks.Controller | |||||
runKey.Dispose(); | runKey.Dispose(); | ||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ Logging.LogUsefulException(e); } | |||||
{ logger.LogUsefulException(e); } | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -68,7 +71,7 @@ namespace Shadowsocks.Controller | |||||
runKey = Utils.OpenRegKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true); | runKey = Utils.OpenRegKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true); | ||||
if (runKey == null) | if (runKey == null) | ||||
{ | { | ||||
Logging.Error(@"Cannot find HKCU\Software\Microsoft\Windows\CurrentVersion\Run"); | |||||
logger.Error(@"Cannot find HKCU\Software\Microsoft\Windows\CurrentVersion\Run"); | |||||
return false; | return false; | ||||
} | } | ||||
string[] runList = runKey.GetValueNames(); | string[] runList = runKey.GetValueNames(); | ||||
@@ -91,7 +94,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
return false; | return false; | ||||
} | } | ||||
finally | finally | ||||
@@ -104,7 +107,7 @@ namespace Shadowsocks.Controller | |||||
runKey.Dispose(); | runKey.Dispose(); | ||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ Logging.LogUsefulException(e); } | |||||
{ logger.LogUsefulException(e); } | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -140,13 +143,13 @@ namespace Shadowsocks.Controller | |||||
// first parameter is process command line parameter | // first parameter is process command line parameter | ||||
// needn't include the name of the executable in the command line | // needn't include the name of the executable in the command line | ||||
RegisterApplicationRestart(cmdline, (int)(ApplicationRestartFlags.RESTART_NO_CRASH | ApplicationRestartFlags.RESTART_NO_HANG)); | RegisterApplicationRestart(cmdline, (int)(ApplicationRestartFlags.RESTART_NO_CRASH | ApplicationRestartFlags.RESTART_NO_HANG)); | ||||
Logging.Debug("Register restart after system reboot, command line:" + cmdline); | |||||
logger.Debug("Register restart after system reboot, command line:" + cmdline); | |||||
} | } | ||||
// requested unregister, which has no side effect | // requested unregister, which has no side effect | ||||
else if (!register) | else if (!register) | ||||
{ | { | ||||
UnregisterApplicationRestart(); | UnregisterApplicationRestart(); | ||||
Logging.Debug("Unregister restart after system reboot"); | |||||
logger.Debug("Unregister restart after system reboot"); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -1,5 +1,6 @@ | |||||
using System; | using System; | ||||
using System.Windows.Forms; | using System.Windows.Forms; | ||||
using NLog; | |||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
using Shadowsocks.Util.SystemProxy; | using Shadowsocks.Util.SystemProxy; | ||||
@@ -7,6 +8,8 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
public static class SystemProxy | public static class SystemProxy | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private static string GetTimestamp(DateTime value) | private static string GetTimestamp(DateTime value) | ||||
{ | { | ||||
return value.ToString("yyyyMMddHHmmssfff"); | return value.ToString("yyyyMMddHHmmssfff"); | ||||
@@ -52,7 +55,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (ProxyException ex) | catch (ProxyException ex) | ||||
{ | { | ||||
Logging.LogUsefulException(ex); | |||||
logger.LogUsefulException(ex); | |||||
if (ex.Type != ProxyExceptionType.Unspecific && !noRetry) | if (ex.Type != ProxyExceptionType.Unspecific && !noRetry) | ||||
{ | { | ||||
var ret = MessageBox.Show(I18N.GetString("Error occured when process proxy setting, do you want reset current setting and retry?"), I18N.GetString("Shadowsocks"), MessageBoxButtons.YesNo, MessageBoxIcon.Warning); | var ret = MessageBox.Show(I18N.GetString("Error occured when process proxy setting, do you want reset current setting and retry?"), I18N.GetString("Shadowsocks"), MessageBoxButtons.YesNo, MessageBoxIcon.Warning); | ||||
@@ -0,0 +1,13 @@ | |||||
<?xml version="1.0" encoding="utf-8" ?> | |||||
<!-- Warning: Configuration may reset after shadowsocks upgrade. --> | |||||
<!-- If you messed it up, delete this file and Shadowsocks will create a new one. --> | |||||
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | |||||
<targets> | |||||
<!-- This line is managed by Shadowsocks. Do not modify it unless you know what you are doing.--> | |||||
<target name="file" xsi:type="File" fileName="ss_win_temp\shadowsocks.log" writeBom="false" encoding="utf-8"/> | |||||
</targets> | |||||
<rules> | |||||
<!-- This line is managed by Shadowsocks. Do not modify it unless you know what you are doing. --> | |||||
<logger name="*" minlevel="Info" writeTo="file"/> | |||||
</rules> | |||||
</nlog> |
@@ -1,4 +1,4 @@ | |||||
en,ru-RU,zh-CN,zh-TW,ja | |||||
en,ru-RU,zh-CN,zh-TW,ja | |||||
#Restart program to apply translation,,,, | #Restart program to apply translation,,,, | ||||
#This is comment line,,,, | #This is comment line,,,, | ||||
#Always keep language name at head of file,,,, | #Always keep language name at head of file,,,, | ||||
@@ -75,6 +75,7 @@ Apply,Применить,应用,應用,適用 | |||||
New server,Новый сервер,未配置的服务器,新伺服器,新規サーバー | New server,Новый сервер,未配置的服务器,新伺服器,新規サーバー | ||||
Move &Up,Выше,上移(&U),上移 (&U),上に移動 (&U) | Move &Up,Выше,上移(&U),上移 (&U),上に移動 (&U) | ||||
Move D&own,Ниже,下移(&O),下移 (&O),下に移動 (&O) | Move D&own,Ниже,下移(&O),下移 (&O),下に移動 (&O) | ||||
deprecated,Устаревшее,不推荐,不推薦,非推奨 | |||||
,,,, | ,,,, | ||||
#Statistics Config,,,, | #Statistics Config,,,, | ||||
,,,, | ,,,, | ||||
@@ -1,4 +1,5 @@ | |||||
using System; | |||||
using NLog; | |||||
using System; | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Diagnostics; | using System.Diagnostics; | ||||
using System.Net; | using System.Net; | ||||
@@ -13,6 +14,7 @@ namespace Shadowsocks.Encryption.AEAD | |||||
public abstract class AEADEncryptor | public abstract class AEADEncryptor | ||||
: EncryptorBase | : EncryptorBase | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
// We are using the same saltLen and keyLen | // We are using the same saltLen and keyLen | ||||
private const string Info = "ss-subkey"; | private const string Info = "ss-subkey"; | ||||
private static readonly byte[] InfoBytes = Encoding.ASCII.GetBytes(Info); | private static readonly byte[] InfoBytes = Encoding.ASCII.GetBytes(Info); | ||||
@@ -122,7 +124,7 @@ namespace Shadowsocks.Encryption.AEAD | |||||
_decryptSalt = new byte[saltLen]; | _decryptSalt = new byte[saltLen]; | ||||
Array.Copy(salt, _decryptSalt, saltLen); | Array.Copy(salt, _decryptSalt, saltLen); | ||||
} | } | ||||
Logging.Dump("Salt", salt, saltLen); | |||||
logger.Dump("Salt", salt, saltLen); | |||||
} | } | ||||
public static void randBytes(byte[] buf, int length) { RNG.GetBytes(buf, length); } | public static void randBytes(byte[] buf, int length) { RNG.GetBytes(buf, length); } | ||||
@@ -139,7 +141,7 @@ namespace Shadowsocks.Encryption.AEAD | |||||
_encCircularBuffer.Put(buf, 0, length); | _encCircularBuffer.Put(buf, 0, length); | ||||
outlength = 0; | outlength = 0; | ||||
Logging.Debug("---Start Encryption"); | |||||
logger.Debug("---Start Encryption"); | |||||
if (! _encryptSaltSent) { | if (! _encryptSaltSent) { | ||||
_encryptSaltSent = true; | _encryptSaltSent = true; | ||||
// Generate salt | // Generate salt | ||||
@@ -148,7 +150,7 @@ namespace Shadowsocks.Encryption.AEAD | |||||
InitCipher(saltBytes, true, false); | InitCipher(saltBytes, true, false); | ||||
Array.Copy(saltBytes, 0, outbuf, 0, saltLen); | Array.Copy(saltBytes, 0, outbuf, 0, saltLen); | ||||
outlength = saltLen; | outlength = saltLen; | ||||
Logging.Debug($"_encryptSaltSent outlength {outlength}"); | |||||
logger.Debug($"_encryptSaltSent outlength {outlength}"); | |||||
} | } | ||||
if (! _tcpRequestSent) { | if (! _tcpRequestSent) { | ||||
@@ -161,7 +163,7 @@ namespace Shadowsocks.Encryption.AEAD | |||||
Debug.Assert(encAddrBufLength == AddrBufLength + tagLen * 2 + CHUNK_LEN_BYTES); | Debug.Assert(encAddrBufLength == AddrBufLength + tagLen * 2 + CHUNK_LEN_BYTES); | ||||
Array.Copy(encAddrBufBytes, 0, outbuf, outlength, encAddrBufLength); | Array.Copy(encAddrBufBytes, 0, outbuf, outlength, encAddrBufLength); | ||||
outlength += encAddrBufLength; | outlength += encAddrBufLength; | ||||
Logging.Debug($"_tcpRequestSent outlength {outlength}"); | |||||
logger.Debug($"_tcpRequestSent outlength {outlength}"); | |||||
} | } | ||||
// handle other chunks | // handle other chunks | ||||
@@ -176,15 +178,15 @@ namespace Shadowsocks.Encryption.AEAD | |||||
Debug.Assert(encChunkLength == chunklength + tagLen * 2 + CHUNK_LEN_BYTES); | Debug.Assert(encChunkLength == chunklength + tagLen * 2 + CHUNK_LEN_BYTES); | ||||
Buffer.BlockCopy(encChunkBytes, 0, outbuf, outlength, encChunkLength); | Buffer.BlockCopy(encChunkBytes, 0, outbuf, outlength, encChunkLength); | ||||
outlength += encChunkLength; | outlength += encChunkLength; | ||||
Logging.Debug("chunks enc outlength " + outlength); | |||||
logger.Debug("chunks enc outlength " + outlength); | |||||
// check if we have enough space for outbuf | // check if we have enough space for outbuf | ||||
if (outlength + TCPHandler.ChunkOverheadSize > TCPHandler.BufferSize) { | if (outlength + TCPHandler.ChunkOverheadSize > TCPHandler.BufferSize) { | ||||
Logging.Debug("enc outbuf almost full, giving up"); | |||||
logger.Debug("enc outbuf almost full, giving up"); | |||||
return; | return; | ||||
} | } | ||||
bufSize = (uint)_encCircularBuffer.Size; | bufSize = (uint)_encCircularBuffer.Size; | ||||
if (bufSize <= 0) { | if (bufSize <= 0) { | ||||
Logging.Debug("No more data to encrypt, leaving"); | |||||
logger.Debug("No more data to encrypt, leaving"); | |||||
return; | return; | ||||
} | } | ||||
} | } | ||||
@@ -199,7 +201,7 @@ namespace Shadowsocks.Encryption.AEAD | |||||
// drop all into buffer | // drop all into buffer | ||||
_decCircularBuffer.Put(buf, 0, length); | _decCircularBuffer.Put(buf, 0, length); | ||||
Logging.Debug("---Start Decryption"); | |||||
logger.Debug("---Start Decryption"); | |||||
if (! _decryptSaltReceived) { | if (! _decryptSaltReceived) { | ||||
bufSize = _decCircularBuffer.Size; | bufSize = _decCircularBuffer.Size; | ||||
// check if we get the leading salt | // check if we get the leading salt | ||||
@@ -210,7 +212,7 @@ namespace Shadowsocks.Encryption.AEAD | |||||
_decryptSaltReceived = true; | _decryptSaltReceived = true; | ||||
byte[] salt = _decCircularBuffer.Get(saltLen); | byte[] salt = _decCircularBuffer.Get(saltLen); | ||||
InitCipher(salt, false, false); | InitCipher(salt, false, false); | ||||
Logging.Debug("get salt len " + saltLen); | |||||
logger.Debug("get salt len " + saltLen); | |||||
} | } | ||||
// handle chunks | // handle chunks | ||||
@@ -218,7 +220,7 @@ namespace Shadowsocks.Encryption.AEAD | |||||
bufSize = _decCircularBuffer.Size; | bufSize = _decCircularBuffer.Size; | ||||
// check if we have any data | // check if we have any data | ||||
if (bufSize <= 0) { | if (bufSize <= 0) { | ||||
Logging.Debug("No data in _decCircularBuffer"); | |||||
logger.Debug("No data in _decCircularBuffer"); | |||||
return; | return; | ||||
} | } | ||||
@@ -241,13 +243,13 @@ namespace Shadowsocks.Encryption.AEAD | |||||
if (chunkLen > CHUNK_LEN_MASK) | if (chunkLen > CHUNK_LEN_MASK) | ||||
{ | { | ||||
// we get invalid chunk | // we get invalid chunk | ||||
Logging.Error($"Invalid chunk length: {chunkLen}"); | |||||
logger.Error($"Invalid chunk length: {chunkLen}"); | |||||
throw new CryptoErrorException(); | throw new CryptoErrorException(); | ||||
} | } | ||||
Logging.Debug("Get the real chunk len:" + chunkLen); | |||||
logger.Debug("Get the real chunk len:" + chunkLen); | |||||
bufSize = _decCircularBuffer.Size; | bufSize = _decCircularBuffer.Size; | ||||
if (bufSize < CHUNK_LEN_BYTES + tagLen /* we haven't remove them */+ chunkLen + tagLen) { | if (bufSize < CHUNK_LEN_BYTES + tagLen /* we haven't remove them */+ chunkLen + tagLen) { | ||||
Logging.Debug("No more data to decrypt one chunk"); | |||||
logger.Debug("No more data to decrypt one chunk"); | |||||
return; | return; | ||||
} | } | ||||
IncrementNonce(false); | IncrementNonce(false); | ||||
@@ -267,16 +269,16 @@ namespace Shadowsocks.Encryption.AEAD | |||||
// output to outbuf | // output to outbuf | ||||
Buffer.BlockCopy(decChunkBytes, 0, outbuf, outlength, (int) decChunkLen); | Buffer.BlockCopy(decChunkBytes, 0, outbuf, outlength, (int) decChunkLen); | ||||
outlength += (int)decChunkLen; | outlength += (int)decChunkLen; | ||||
Logging.Debug("aead dec outlength " + outlength); | |||||
logger.Debug("aead dec outlength " + outlength); | |||||
if (outlength + 100 > TCPHandler.BufferSize) | if (outlength + 100 > TCPHandler.BufferSize) | ||||
{ | { | ||||
Logging.Debug("dec outbuf almost full, giving up"); | |||||
logger.Debug("dec outbuf almost full, giving up"); | |||||
return; | return; | ||||
} | } | ||||
bufSize = _decCircularBuffer.Size; | bufSize = _decCircularBuffer.Size; | ||||
// check if we already done all of them | // check if we already done all of them | ||||
if (bufSize <= 0) { | if (bufSize <= 0) { | ||||
Logging.Debug("No data in _decCircularBuffer, already all done"); | |||||
logger.Debug("No data in _decCircularBuffer, already all done"); | |||||
return; | return; | ||||
} | } | ||||
} | } | ||||
@@ -319,7 +321,7 @@ namespace Shadowsocks.Encryption.AEAD | |||||
private void ChunkEncrypt(byte[] plaintext, int plainLen, byte[] ciphertext, out int cipherLen) | private void ChunkEncrypt(byte[] plaintext, int plainLen, byte[] ciphertext, out int cipherLen) | ||||
{ | { | ||||
if (plainLen > CHUNK_LEN_MASK) { | if (plainLen > CHUNK_LEN_MASK) { | ||||
Logging.Error("enc chunk too big"); | |||||
logger.Error("enc chunk too big"); | |||||
throw new CryptoErrorException(); | throw new CryptoErrorException(); | ||||
} | } | ||||
@@ -1,6 +1,7 @@ | |||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Diagnostics; | using System.Diagnostics; | ||||
using NLog; | |||||
using Shadowsocks.Controller; | using Shadowsocks.Controller; | ||||
using Shadowsocks.Encryption.Exception; | using Shadowsocks.Encryption.Exception; | ||||
@@ -9,6 +10,8 @@ namespace Shadowsocks.Encryption.AEAD | |||||
public class AEADSodiumEncryptor | public class AEADSodiumEncryptor | ||||
: AEADEncryptor, IDisposable | : AEADEncryptor, IDisposable | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private const int CIPHER_CHACHA20IETFPOLY1305 = 1; | private const int CIPHER_CHACHA20IETFPOLY1305 = 1; | ||||
private const int CIPHER_XCHACHA20IETFPOLY1305 = 2; | private const int CIPHER_XCHACHA20IETFPOLY1305 = 2; | ||||
private const int CIPHER_AES256GCM = 3; | private const int CIPHER_AES256GCM = 3; | ||||
@@ -55,9 +58,9 @@ namespace Shadowsocks.Encryption.AEAD | |||||
// outbuf: ciphertext + tag | // outbuf: ciphertext + tag | ||||
int ret; | int ret; | ||||
ulong encClen = 0; | ulong encClen = 0; | ||||
Logging.Dump("_encNonce before enc", _encNonce, nonceLen); | |||||
Logging.Dump("_sodiumEncSubkey", _sodiumEncSubkey, keyLen); | |||||
Logging.Dump("before cipherEncrypt: plain", plaintext, (int) plen); | |||||
logger.Dump("_encNonce before enc", _encNonce, nonceLen); | |||||
logger.Dump("_sodiumEncSubkey", _sodiumEncSubkey, keyLen); | |||||
logger.Dump("before cipherEncrypt: plain", plaintext, (int) plen); | |||||
switch (_cipher) | switch (_cipher) | ||||
{ | { | ||||
case CIPHER_CHACHA20IETFPOLY1305: | case CIPHER_CHACHA20IETFPOLY1305: | ||||
@@ -85,7 +88,7 @@ namespace Shadowsocks.Encryption.AEAD | |||||
throw new System.Exception("not implemented"); | throw new System.Exception("not implemented"); | ||||
} | } | ||||
if (ret != 0) throw new CryptoErrorException(String.Format("ret is {0}", ret)); | if (ret != 0) throw new CryptoErrorException(String.Format("ret is {0}", ret)); | ||||
Logging.Dump("after cipherEncrypt: cipher", ciphertext, (int) encClen); | |||||
logger.Dump("after cipherEncrypt: cipher", ciphertext, (int) encClen); | |||||
clen = (uint) encClen; | clen = (uint) encClen; | ||||
} | } | ||||
@@ -96,9 +99,9 @@ namespace Shadowsocks.Encryption.AEAD | |||||
// outbuf: plaintext | // outbuf: plaintext | ||||
int ret; | int ret; | ||||
ulong decPlen = 0; | ulong decPlen = 0; | ||||
Logging.Dump("_decNonce before dec", _decNonce, nonceLen); | |||||
Logging.Dump("_sodiumDecSubkey", _sodiumDecSubkey, keyLen); | |||||
Logging.Dump("before cipherDecrypt: cipher", ciphertext, (int) clen); | |||||
logger.Dump("_decNonce before dec", _decNonce, nonceLen); | |||||
logger.Dump("_sodiumDecSubkey", _sodiumDecSubkey, keyLen); | |||||
logger.Dump("before cipherDecrypt: cipher", ciphertext, (int) clen); | |||||
switch (_cipher) | switch (_cipher) | ||||
{ | { | ||||
case CIPHER_CHACHA20IETFPOLY1305: | case CIPHER_CHACHA20IETFPOLY1305: | ||||
@@ -127,7 +130,7 @@ namespace Shadowsocks.Encryption.AEAD | |||||
} | } | ||||
if (ret != 0) throw new CryptoErrorException(String.Format("ret is {0}", ret)); | if (ret != 0) throw new CryptoErrorException(String.Format("ret is {0}", ret)); | ||||
Logging.Dump("after cipherDecrypt: plain", plaintext, (int) decPlen); | |||||
logger.Dump("after cipherDecrypt: plain", plaintext, (int) decPlen); | |||||
plen = (uint) decPlen; | plen = (uint) decPlen; | ||||
} | } | ||||
@@ -1,6 +1,7 @@ | |||||
using System; | using System; | ||||
using System.IO; | using System.IO; | ||||
using System.Runtime.InteropServices; | using System.Runtime.InteropServices; | ||||
using NLog; | |||||
using Shadowsocks.Controller; | using Shadowsocks.Controller; | ||||
using Shadowsocks.Properties; | using Shadowsocks.Properties; | ||||
using Shadowsocks.Util; | using Shadowsocks.Util; | ||||
@@ -9,6 +10,8 @@ namespace Shadowsocks.Encryption | |||||
{ | { | ||||
public static class MbedTLS | public static class MbedTLS | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private const string DLLNAME = "libsscrypto.dll"; | private const string DLLNAME = "libsscrypto.dll"; | ||||
public const int MBEDTLS_ENCRYPT = 1; | public const int MBEDTLS_ENCRYPT = 1; | ||||
@@ -26,7 +29,7 @@ namespace Shadowsocks.Encryption | |||||
} | } | ||||
catch (System.Exception e) | catch (System.Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
LoadLibrary(dllPath); | LoadLibrary(dllPath); | ||||
} | } | ||||
@@ -3,6 +3,7 @@ using System.IO; | |||||
using System.Runtime.InteropServices; | using System.Runtime.InteropServices; | ||||
using System.Security; | using System.Security; | ||||
using System.Text; | using System.Text; | ||||
using NLog; | |||||
using Shadowsocks.Controller; | using Shadowsocks.Controller; | ||||
using Shadowsocks.Encryption.Exception; | using Shadowsocks.Encryption.Exception; | ||||
using Shadowsocks.Properties; | using Shadowsocks.Properties; | ||||
@@ -13,6 +14,8 @@ namespace Shadowsocks.Encryption | |||||
// XXX: only for OpenSSL 1.1.0 and higher | // XXX: only for OpenSSL 1.1.0 and higher | ||||
public static class OpenSSL | public static class OpenSSL | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private const string DLLNAME = "libsscrypto.dll"; | private const string DLLNAME = "libsscrypto.dll"; | ||||
public const int OPENSSL_ENCRYPT = 1; | public const int OPENSSL_ENCRYPT = 1; | ||||
@@ -34,7 +37,7 @@ namespace Shadowsocks.Encryption | |||||
} | } | ||||
catch (System.Exception e) | catch (System.Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
LoadLibrary(dllPath); | LoadLibrary(dllPath); | ||||
} | } | ||||
@@ -1,6 +1,7 @@ | |||||
using System; | using System; | ||||
using System.IO; | using System.IO; | ||||
using System.Runtime.InteropServices; | using System.Runtime.InteropServices; | ||||
using NLog; | |||||
using Shadowsocks.Controller; | using Shadowsocks.Controller; | ||||
using Shadowsocks.Properties; | using Shadowsocks.Properties; | ||||
using Shadowsocks.Util; | using Shadowsocks.Util; | ||||
@@ -9,6 +10,8 @@ namespace Shadowsocks.Encryption | |||||
{ | { | ||||
public static class Sodium | public static class Sodium | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private const string DLLNAME = "libsscrypto.dll"; | private const string DLLNAME = "libsscrypto.dll"; | ||||
private static bool _initialized = false; | private static bool _initialized = false; | ||||
@@ -28,7 +31,7 @@ namespace Shadowsocks.Encryption | |||||
} | } | ||||
catch (System.Exception e) | catch (System.Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
LoadLibrary(dllPath); | LoadLibrary(dllPath); | ||||
@@ -46,7 +49,7 @@ namespace Shadowsocks.Encryption | |||||
} | } | ||||
AES256GCMAvailable = crypto_aead_aes256gcm_is_available() == 1; | AES256GCMAvailable = crypto_aead_aes256gcm_is_available() == 1; | ||||
Logging.Debug($"sodium: AES256GCMAvailable is {AES256GCMAvailable}"); | |||||
logger.Debug($"sodium: AES256GCMAvailable is {AES256GCMAvailable}"); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -2,6 +2,7 @@ | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.IO; | using System.IO; | ||||
using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
using NLog; | |||||
using Shadowsocks.Controller; | using Shadowsocks.Controller; | ||||
namespace Shadowsocks.Model | namespace Shadowsocks.Model | ||||
@@ -9,6 +10,9 @@ namespace Shadowsocks.Model | |||||
[Serializable] | [Serializable] | ||||
public class Configuration | public class Configuration | ||||
{ | { | ||||
[JsonIgnore] | |||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
public string version; | public string version; | ||||
public List<Server> configs; | public List<Server> configs; | ||||
@@ -32,10 +36,14 @@ namespace Shadowsocks.Model | |||||
public bool autoCheckUpdate; | public bool autoCheckUpdate; | ||||
public bool checkPreRelease; | public bool checkPreRelease; | ||||
public bool isVerboseLogging; | public bool isVerboseLogging; | ||||
//public NLogConfig.LogLevel logLevel; | |||||
public LogViewerConfig logViewer; | public LogViewerConfig logViewer; | ||||
public ProxyConfig proxy; | public ProxyConfig proxy; | ||||
public HotkeyConfig hotkey; | public HotkeyConfig hotkey; | ||||
[JsonIgnore] | |||||
NLogConfig nLogConfig; | |||||
private static readonly string CONFIG_FILE = "gui-config.json"; | private static readonly string CONFIG_FILE = "gui-config.json"; | ||||
[JsonIgnore] | [JsonIgnore] | ||||
@@ -110,12 +118,35 @@ namespace Shadowsocks.Model | |||||
config.proxy.CheckConfig(); | config.proxy.CheckConfig(); | ||||
try | |||||
{ | |||||
config.nLogConfig = NLogConfig.LoadXML(); | |||||
switch (config.nLogConfig.GetLogLevel()) | |||||
{ | |||||
case NLogConfig.LogLevel.Fatal: | |||||
case NLogConfig.LogLevel.Error: | |||||
case NLogConfig.LogLevel.Warn: | |||||
case NLogConfig.LogLevel.Info: | |||||
config.isVerboseLogging = false; | |||||
break; | |||||
case NLogConfig.LogLevel.Debug: | |||||
case NLogConfig.LogLevel.Trace: | |||||
config.isVerboseLogging = true; | |||||
break; | |||||
} | |||||
} | |||||
catch (Exception e) | |||||
{ | |||||
// todo: route the error to UI since there is no log file in this scenario | |||||
logger.Error(e, "Cannot get the log level from NLog config file. Please check if the nlog config file exists with corresponding XML nodes."); | |||||
} | |||||
return config; | return config; | ||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
if (!(e is FileNotFoundException)) | if (!(e is FileNotFoundException)) | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
return new Configuration | return new Configuration | ||||
{ | { | ||||
index = 0, | index = 0, | ||||
@@ -128,7 +159,7 @@ namespace Shadowsocks.Model | |||||
}, | }, | ||||
logViewer = new LogViewerConfig(), | logViewer = new LogViewerConfig(), | ||||
proxy = new ProxyConfig(), | proxy = new ProxyConfig(), | ||||
hotkey = new HotkeyConfig() | |||||
hotkey = new HotkeyConfig(), | |||||
}; | }; | ||||
} | } | ||||
} | } | ||||
@@ -151,10 +182,20 @@ namespace Shadowsocks.Model | |||||
sw.Write(jsonString); | sw.Write(jsonString); | ||||
sw.Flush(); | sw.Flush(); | ||||
} | } | ||||
try | |||||
{ | |||||
// apply changs to NLog.config | |||||
config.nLogConfig.SetLogLevel(config.isVerboseLogging? NLogConfig.LogLevel.Trace: NLogConfig.LogLevel.Info); | |||||
NLogConfig.SaveXML(config.nLogConfig); | |||||
} | |||||
catch(Exception e) | |||||
{ | |||||
logger.Error(e, "Cannot set the log level to NLog config file. Please check if the nlog config file exists with corresponding XML nodes."); | |||||
} | |||||
} | } | ||||
catch (IOException e) | catch (IOException e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
@@ -0,0 +1,126 @@ | |||||
using NLog; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.IO; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Xml; | |||||
namespace Shadowsocks.Model | |||||
{ | |||||
public class NLogConfig | |||||
{ | |||||
public enum LogLevel | |||||
{ | |||||
Fatal, | |||||
Error, | |||||
Warn, | |||||
Info, | |||||
Debug, | |||||
Trace, | |||||
} | |||||
const string NLOG_CONFIG_FILE_NAME = "NLog.config"; | |||||
const string TARGET_MIN_LEVEL_ATTRIBUTE = "minlevel"; | |||||
const string LOGGER_FILE_NAME_ATTRIBUTE = "fileName"; | |||||
XmlDocument doc = new XmlDocument(); | |||||
XmlElement logFileNameElement; | |||||
XmlElement logLevelElement; | |||||
/// <summary> | |||||
/// Load the NLog config xml file content | |||||
/// </summary> | |||||
public static NLogConfig LoadXML() | |||||
{ | |||||
NLogConfig config = new NLogConfig(); | |||||
config.doc.Load(NLOG_CONFIG_FILE_NAME); | |||||
config.logLevelElement = (XmlElement)SelectSingleNode(config.doc, "//nlog:logger[@name='*']"); | |||||
config.logFileNameElement = (XmlElement)SelectSingleNode(config.doc, "//nlog:target[@name='file']"); | |||||
return config; | |||||
} | |||||
/// <summary> | |||||
/// Save the content to NLog config xml file | |||||
/// </summary> | |||||
public static void SaveXML(NLogConfig nLogConfig) | |||||
{ | |||||
nLogConfig.doc.Save(NLOG_CONFIG_FILE_NAME); | |||||
} | |||||
/// <summary> | |||||
/// Get the current minLogLevel from xml file | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public LogLevel GetLogLevel() | |||||
{ | |||||
LogLevel level = LogLevel.Warn; | |||||
string levelStr = logLevelElement.GetAttribute(TARGET_MIN_LEVEL_ATTRIBUTE); | |||||
Enum.TryParse(levelStr, out level); | |||||
return level; | |||||
} | |||||
/// <summary> | |||||
/// Get the target fileName from xml file | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public string GetLogFileName() | |||||
{ | |||||
return logFileNameElement.GetAttribute(LOGGER_FILE_NAME_ATTRIBUTE); | |||||
} | |||||
/// <summary> | |||||
/// Set the minLogLevel to xml file | |||||
/// </summary> | |||||
/// <param name="logLevel"></param> | |||||
public void SetLogLevel(LogLevel logLevel) | |||||
{ | |||||
logLevelElement.SetAttribute(TARGET_MIN_LEVEL_ATTRIBUTE, logLevel.ToString("G")); | |||||
} | |||||
/// <summary> | |||||
/// Set the target fileName to xml file | |||||
/// </summary> | |||||
/// <param name="fileName"></param> | |||||
public void SetLogFileName(string fileName) | |||||
{ | |||||
logFileNameElement.SetAttribute(LOGGER_FILE_NAME_ATTRIBUTE, fileName); | |||||
} | |||||
/// <summary> | |||||
/// Select a single XML node/elemant | |||||
/// </summary> | |||||
/// <param name="doc"></param> | |||||
/// <param name="xpath"></param> | |||||
/// <returns></returns> | |||||
private static XmlNode SelectSingleNode(XmlDocument doc, string xpath) | |||||
{ | |||||
XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); | |||||
manager.AddNamespace("nlog", "http://www.nlog-project.org/schemas/NLog.xsd"); | |||||
//return doc.SelectSingleNode("//nlog:logger[(@shadowsocks='managed') and (@name='*')]", manager); | |||||
return doc.SelectSingleNode(xpath, manager); | |||||
} | |||||
/// <summary> | |||||
/// Extract the pre-defined NLog configuration file is does not exist. Then reload the Nlog configuration. | |||||
/// </summary> | |||||
public static void TouchAndApplyNLogConfig() | |||||
{ | |||||
if (!File.Exists(NLOG_CONFIG_FILE_NAME)) | |||||
{ | |||||
File.WriteAllText(NLOG_CONFIG_FILE_NAME, Properties.Resources.NLog_config); | |||||
LogManager.LoadConfiguration(NLOG_CONFIG_FILE_NAME); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// NLog reload the config file and apply to current LogManager | |||||
/// </summary> | |||||
public static void LoadConfiguration() | |||||
{ | |||||
LogManager.LoadConfiguration(NLOG_CONFIG_FILE_NAME); | |||||
} | |||||
} | |||||
} |
@@ -5,7 +5,7 @@ using System.Linq; | |||||
using System.Reflection; | using System.Reflection; | ||||
using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
using NLog; | |||||
using Shadowsocks.Controller; | using Shadowsocks.Controller; | ||||
namespace Shadowsocks.Model | namespace Shadowsocks.Model | ||||
@@ -13,6 +13,8 @@ namespace Shadowsocks.Model | |||||
[Serializable] | [Serializable] | ||||
public class StatisticsStrategyConfiguration | public class StatisticsStrategyConfiguration | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
public static readonly string ID = "com.shadowsocks.strategy.statistics"; | public static readonly string ID = "com.shadowsocks.strategy.statistics"; | ||||
public bool StatisticsEnabled { get; set; } = false; | public bool StatisticsEnabled { get; set; } = false; | ||||
public bool ByHourOfDay { get; set; } = true; | public bool ByHourOfDay { get; set; } = true; | ||||
@@ -39,7 +41,7 @@ namespace Shadowsocks.Model | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
return new StatisticsStrategyConfiguration(); | return new StatisticsStrategyConfiguration(); | ||||
} | } | ||||
} | } | ||||
@@ -53,7 +55,7 @@ namespace Shadowsocks.Model | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
@@ -3,6 +3,7 @@ using System.Diagnostics; | |||||
using System.IO; | using System.IO; | ||||
using System.Threading; | using System.Threading; | ||||
using System.Windows.Forms; | using System.Windows.Forms; | ||||
using NLog; | |||||
using Microsoft.Win32; | using Microsoft.Win32; | ||||
using Shadowsocks.Controller; | using Shadowsocks.Controller; | ||||
@@ -14,6 +15,7 @@ namespace Shadowsocks | |||||
{ | { | ||||
static class Program | static class Program | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
public static ShadowsocksController MainController { get; private set; } | public static ShadowsocksController MainController { get; private set; } | ||||
public static MenuViewController MenuController { get; private set; } | public static MenuViewController MenuController { get; private set; } | ||||
public static string[] Args { get; private set; } | public static string[] Args { get; private set; } | ||||
@@ -24,6 +26,9 @@ namespace Shadowsocks | |||||
[STAThread] | [STAThread] | ||||
static void Main(string[] args) | static void Main(string[] args) | ||||
{ | { | ||||
// todo: initialize the NLog configuartion | |||||
Model.NLogConfig.TouchAndApplyNLogConfig(); | |||||
// .NET Framework 4.7.2 on Win7 compatibility | // .NET Framework 4.7.2 on Win7 compatibility | ||||
System.Net.ServicePointManager.SecurityProtocol |= | System.Net.ServicePointManager.SecurityProtocol |= | ||||
System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12; | System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12; | ||||
@@ -79,7 +84,6 @@ namespace Shadowsocks | |||||
} | } | ||||
Directory.SetCurrentDirectory(Application.StartupPath); | Directory.SetCurrentDirectory(Application.StartupPath); | ||||
Logging.OpenLogFile(); | |||||
#if DEBUG | #if DEBUG | ||||
// truncate privoxy log file while debugging | // truncate privoxy log file while debugging | ||||
string privoxyLogFilename = Utils.GetTempPath("privoxy.log"); | string privoxyLogFilename = Utils.GetTempPath("privoxy.log"); | ||||
@@ -89,11 +93,6 @@ namespace Shadowsocks | |||||
MainController = new ShadowsocksController(); | MainController = new ShadowsocksController(); | ||||
MenuController = new MenuViewController(MainController); | MenuController = new MenuViewController(MainController); | ||||
MainController.ProgramUpdated += (o, e) => | |||||
{ | |||||
Logging.Info($"Updated from {e.OldVersion} to {e.NewVersion}"); | |||||
}; | |||||
HotKeys.Init(MainController); | HotKeys.Init(MainController); | ||||
MainController.Start(); | MainController.Start(); | ||||
Application.Run(); | Application.Run(); | ||||
@@ -106,7 +105,7 @@ namespace Shadowsocks | |||||
if (Interlocked.Increment(ref exited) == 1) | if (Interlocked.Increment(ref exited) == 1) | ||||
{ | { | ||||
string errMsg = e.ExceptionObject.ToString(); | string errMsg = e.ExceptionObject.ToString(); | ||||
Logging.Error(errMsg); | |||||
logger.Error(errMsg); | |||||
MessageBox.Show( | MessageBox.Show( | ||||
$"{I18N.GetString("Unexpected error, shadowsocks will exit. Please report to")} https://github.com/shadowsocks/shadowsocks-windows/issues {Environment.NewLine}{errMsg}", | $"{I18N.GetString("Unexpected error, shadowsocks will exit. Please report to")} https://github.com/shadowsocks/shadowsocks-windows/issues {Environment.NewLine}{errMsg}", | ||||
"Shadowsocks non-UI Error", MessageBoxButtons.OK, MessageBoxIcon.Error); | "Shadowsocks non-UI Error", MessageBoxButtons.OK, MessageBoxIcon.Error); | ||||
@@ -119,7 +118,7 @@ namespace Shadowsocks | |||||
if (Interlocked.Increment(ref exited) == 1) | if (Interlocked.Increment(ref exited) == 1) | ||||
{ | { | ||||
string errorMsg = $"Exception Detail: {Environment.NewLine}{e.Exception}"; | string errorMsg = $"Exception Detail: {Environment.NewLine}{e.Exception}"; | ||||
Logging.Error(errorMsg); | |||||
logger.Error(errorMsg); | |||||
MessageBox.Show( | MessageBox.Show( | ||||
$"{I18N.GetString("Unexpected error, shadowsocks will exit. Please report to")} https://github.com/shadowsocks/shadowsocks-windows/issues {Environment.NewLine}{errorMsg}", | $"{I18N.GetString("Unexpected error, shadowsocks will exit. Please report to")} https://github.com/shadowsocks/shadowsocks-windows/issues {Environment.NewLine}{errorMsg}", | ||||
"Shadowsocks UI Error", MessageBoxButtons.OK, MessageBoxIcon.Error); | "Shadowsocks UI Error", MessageBoxButtons.OK, MessageBoxIcon.Error); | ||||
@@ -132,7 +131,7 @@ namespace Shadowsocks | |||||
switch (e.Mode) | switch (e.Mode) | ||||
{ | { | ||||
case PowerModes.Resume: | case PowerModes.Resume: | ||||
Logging.Info("os wake up"); | |||||
logger.Info("os wake up"); | |||||
if (MainController != null) | if (MainController != null) | ||||
{ | { | ||||
System.Threading.Tasks.Task.Factory.StartNew(() => | System.Threading.Tasks.Task.Factory.StartNew(() => | ||||
@@ -141,11 +140,11 @@ namespace Shadowsocks | |||||
try | try | ||||
{ | { | ||||
MainController.Start(false); | MainController.Start(false); | ||||
Logging.Info("controller started"); | |||||
logger.Info("controller started"); | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
Logging.LogUsefulException(ex); | |||||
logger.LogUsefulException(ex); | |||||
} | } | ||||
}); | }); | ||||
} | } | ||||
@@ -154,9 +153,9 @@ namespace Shadowsocks | |||||
if (MainController != null) | if (MainController != null) | ||||
{ | { | ||||
MainController.Stop(); | MainController.Stop(); | ||||
Logging.Info("controller stopped"); | |||||
logger.Info("controller stopped"); | |||||
} | } | ||||
Logging.Info("os suspend"); | |||||
logger.Info("os suspend"); | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -1,91 +1,91 @@ | |||||
//------------------------------------------------------------------------------ | |||||
// <auto-generated> | |||||
// 此代码由工具生成。 | |||||
// 运行时版本:4.0.30319.42000 | |||||
// | |||||
// 对此文件的更改可能会导致不正确的行为,并且如果 | |||||
// 重新生成代码,这些更改将会丢失。 | |||||
// </auto-generated> | |||||
//------------------------------------------------------------------------------ | |||||
namespace Shadowsocks.Properties { | |||||
using System; | |||||
/// <summary> | |||||
/// 一个强类型的资源类,用于查找本地化的字符串等。 | |||||
/// </summary> | |||||
// 此类是由 StronglyTypedResourceBuilder | |||||
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 | |||||
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen | |||||
// (以 /str 作为命令选项),或重新生成 VS 项目。 | |||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] | |||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] | |||||
internal class Resources { | |||||
private static global::System.Resources.ResourceManager resourceMan; | |||||
private static global::System.Globalization.CultureInfo resourceCulture; | |||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] | |||||
internal Resources() { | |||||
} | |||||
/// <summary> | |||||
/// 返回此类使用的缓存的 ResourceManager 实例。 | |||||
/// </summary> | |||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | |||||
internal static global::System.Resources.ResourceManager ResourceManager { | |||||
get { | |||||
if (object.ReferenceEquals(resourceMan, null)) { | |||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Shadowsocks.Properties.Resources", typeof(Resources).Assembly); | |||||
resourceMan = temp; | |||||
} | |||||
return resourceMan; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 重写当前线程的 CurrentUICulture 属性 | |||||
/// 重写当前线程的 CurrentUICulture 属性。 | |||||
/// </summary> | |||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | |||||
internal static global::System.Globalization.CultureInfo Culture { | |||||
get { | |||||
return resourceCulture; | |||||
} | |||||
set { | |||||
resourceCulture = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找类似 /* eslint-disable */ | |||||
///// Was generated by gfwlist2pac in precise mode | |||||
///// https://github.com/clowwindy/gfwlist2pac | |||||
/// | |||||
///// 2019-10-06: More 'javascript' way to interaction with main program | |||||
///// 2019-02-08: Updated to support shadowsocks-windows user rules. | |||||
/// | |||||
///var proxy = __PROXY__; | |||||
///var userrules = __USERRULES__; | |||||
///var rules = __RULES__; | |||||
/// | |||||
////* | |||||
///* This file is part of Adblock Plus <http://adblockplus.org/>, | |||||
///* Copyright (C) 2006-2014 Eyeo GmbH | |||||
///* | |||||
///* Adblock Plus is free software: you can redistribute it and/or [字符串的其余部分被截断]"; 的本地化字符串。 | |||||
/// </summary> | |||||
internal static string abp_js { | |||||
get { | |||||
return ResourceManager.GetString("abp_js", resourceCulture); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找类似 var __USERRULES__ = []; | |||||
//------------------------------------------------------------------------------ | |||||
// <auto-generated> | |||||
// This code was generated by a tool. | |||||
// Runtime Version:4.0.30319.42000 | |||||
// | |||||
// Changes to this file may cause incorrect behavior and will be lost if | |||||
// the code is regenerated. | |||||
// </auto-generated> | |||||
//------------------------------------------------------------------------------ | |||||
namespace Shadowsocks.Properties { | |||||
using System; | |||||
/// <summary> | |||||
/// A strongly-typed resource class, for looking up localized strings, etc. | |||||
/// </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. | |||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] | |||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] | |||||
internal class Resources { | |||||
private static global::System.Resources.ResourceManager resourceMan; | |||||
private static global::System.Globalization.CultureInfo resourceCulture; | |||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] | |||||
internal Resources() { | |||||
} | |||||
/// <summary> | |||||
/// Returns the cached ResourceManager instance used by this class. | |||||
/// </summary> | |||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | |||||
internal static global::System.Resources.ResourceManager ResourceManager { | |||||
get { | |||||
if (object.ReferenceEquals(resourceMan, null)) { | |||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Shadowsocks.Properties.Resources", typeof(Resources).Assembly); | |||||
resourceMan = temp; | |||||
} | |||||
return resourceMan; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Overrides the current thread's CurrentUICulture property for all | |||||
/// resource lookups using this strongly typed resource class. | |||||
/// </summary> | |||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | |||||
internal static global::System.Globalization.CultureInfo Culture { | |||||
get { | |||||
return resourceCulture; | |||||
} | |||||
set { | |||||
resourceCulture = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized string similar to /* eslint-disable */ | |||||
///// Was generated by gfwlist2pac in precise mode | |||||
///// https://github.com/clowwindy/gfwlist2pac | |||||
/// | |||||
///// 2019-10-06: More 'javascript' way to interaction with main program | |||||
///// 2019-02-08: Updated to support shadowsocks-windows user rules. | |||||
/// | |||||
///var proxy = __PROXY__; | |||||
///var userrules = __USERRULES__; | |||||
///var rules = __RULES__; | |||||
/// | |||||
////* | |||||
///* This file is part of Adblock Plus <http://adblockplus.org/>, | |||||
///* Copyright (C) 2006-2014 Eyeo GmbH | |||||
///* | |||||
///* Adblock Plus is free software: you can redistribute it and/or [rest of string was truncated]";. | |||||
/// </summary> | |||||
internal static string abp_js { | |||||
get { | |||||
return ResourceManager.GetString("abp_js", resourceCulture); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized string similar to var __USERRULES__ = []; | |||||
///var __RULES__ = [ | ///var __RULES__ = [ | ||||
/// "|http://85.17.73.31/", | /// "|http://85.17.73.31/", | ||||
/// "||agnesb.fr", | /// "||agnesb.fr", | ||||
@@ -106,154 +106,175 @@ namespace Shadowsocks.Properties { | |||||
/// "||beeg.com", | /// "||beeg.com", | ||||
/// "||global.bing.com", | /// "||global.bing.com", | ||||
/// "||bloombergview.com", | /// "||bloombergview.com", | ||||
/// " [字符串的其余部分被截断]"; 的本地化字符串。 | |||||
/// </summary> | |||||
internal static string default_abp_rule { | |||||
get { | |||||
return ResourceManager.GetString("default_abp_rule", resourceCulture); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找类似 en,zh-CN,zh-TW,ja | |||||
/// "||booktopia.com.au", | |||||
/// [rest of string was truncated]";. | |||||
/// </summary> | |||||
internal static string default_abp_rule { | |||||
get { | |||||
return ResourceManager.GetString("default_abp_rule", resourceCulture); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized string similar to en,zh-CN,zh-TW,ja | |||||
///#Restart program to apply translation,,, | |||||
///#This is comment line,,, | |||||
///#Always keep language name at head of file,,, | |||||
///#Language name is output in log,,, | |||||
///"#You can find it by search ""Current language is:""",,, | |||||
///#Please use UTF-8 with BOM encoding so we can edit it in Excel,,, | |||||
///,,, | ///,,, | ||||
///Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks | ///Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks | ||||
///,,, | ///,,, | ||||
///#Menu,,, | |||||
///,,, | |||||
///System Proxy,系统代理,系統代理,システムプロキシ | ///System Proxy,系统代理,系統代理,システムプロキシ | ||||
///Disable,禁用,禁用,無効 | ///Disable,禁用,禁用,無効 | ||||
///PAC,PAC 模式,PAC 模式,PAC | ///PAC,PAC 模式,PAC 模式,PAC | ||||
///Global,全局模式,全局模式,全般 | ///Global,全局模式,全局模式,全般 | ||||
///Servers,服务器,伺服器,サーバー | ///Servers,服务器,伺服器,サーバー | ||||
///Edit Servers...,编辑服务器...,編輯伺服器...,サーバーの編集... | |||||
///Statistics Config...,统计配置...,統計設定檔...,統計情報の設定... | |||||
///Start on Boot,开机启动,開機啟動,システムと同時に起動 | |||||
///Forward Proxy...,正向代理设置...,正向 Proxy 設定...,フォワードプロキシの設定... | |||||
///Allow other Devices to connect,允许其他设备连入,允許其他裝置連入,他のデバイスからの接続を許可する | |||||
///Local PAC,使用本地 PAC,使用本機 PAC,ローカル PAC | |||||
///Online PAC,使用在线 PAC,使 [字符串的其余部分被截断]"; 的本地化字符串。 | |||||
/// </summary> | |||||
internal static string i18n_csv { | |||||
get { | |||||
return ResourceManager.GetString("i18n_csv", resourceCulture); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找 System.Byte[] 类型的本地化资源。 | |||||
/// </summary> | |||||
internal static byte[] libsscrypto_dll { | |||||
get { | |||||
object obj = ResourceManager.GetObject("libsscrypto_dll", resourceCulture); | |||||
return ((byte[])(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找类似 listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ | |||||
///toggle 0 | |||||
///logfile ss_privoxy.log | |||||
///show-on-task-bar 0 | |||||
///activity-animation 0 | |||||
///forward-socks5 / __SOCKS_HOST__:__SOCKS_PORT__ . | |||||
///max-client-connections 2048 | |||||
///hide-console | |||||
/// 的本地化字符串。 | |||||
/// </summary> | |||||
internal static string privoxy_conf { | |||||
get { | |||||
return ResourceManager.GetString("privoxy_conf", resourceCulture); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找 System.Byte[] 类型的本地化资源。 | |||||
/// </summary> | |||||
internal static byte[] privoxy_exe { | |||||
get { | |||||
object obj = ResourceManager.GetObject("privoxy_exe", resourceCulture); | |||||
return ((byte[])(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。 | |||||
/// </summary> | |||||
internal static System.Drawing.Bitmap ss32Fill { | |||||
get { | |||||
object obj = ResourceManager.GetObject("ss32Fill", resourceCulture); | |||||
return ((System.Drawing.Bitmap)(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。 | |||||
/// </summary> | |||||
internal static System.Drawing.Bitmap ss32In { | |||||
get { | |||||
object obj = ResourceManager.GetObject("ss32In", resourceCulture); | |||||
return ((System.Drawing.Bitmap)(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。 | |||||
/// </summary> | |||||
internal static System.Drawing.Bitmap ss32Out { | |||||
get { | |||||
object obj = ResourceManager.GetObject("ss32Out", resourceCulture); | |||||
return ((System.Drawing.Bitmap)(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。 | |||||
/// </summary> | |||||
internal static System.Drawing.Bitmap ss32Outline { | |||||
get { | |||||
object obj = ResourceManager.GetObject("ss32Outline", resourceCulture); | |||||
return ((System.Drawing.Bitmap)(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。 | |||||
/// </summary> | |||||
internal static System.Drawing.Bitmap ssw128 { | |||||
get { | |||||
object obj = ResourceManager.GetObject("ssw128", resourceCulture); | |||||
return ((System.Drawing.Bitmap)(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找 System.Byte[] 类型的本地化资源。 | |||||
/// </summary> | |||||
internal static byte[] sysproxy_exe { | |||||
get { | |||||
object obj = ResourceManager.GetObject("sysproxy_exe", resourceCulture); | |||||
return ((byte[])(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找 System.Byte[] 类型的本地化资源。 | |||||
/// </summary> | |||||
internal static byte[] sysproxy64_exe { | |||||
get { | |||||
object obj = ResourceManager.GetObject("sysproxy64_exe", resourceCulture); | |||||
return ((byte[])(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 查找类似 ! Put user rules line by line in this file. | |||||
///! See https://adblockplus.org/en/filter-cheatsheet | |||||
/// 的本地化字符串。 | |||||
/// </summary> | |||||
internal static string user_rule { | |||||
get { | |||||
return ResourceManager.GetString("user_rule", resourceCulture); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
///Edit Servers...,编辑服务器...,編輯伺服器...,サーバーの編集.. [rest of string was truncated]";. | |||||
/// </summary> | |||||
internal static string i18n_csv { | |||||
get { | |||||
return ResourceManager.GetString("i18n_csv", resourceCulture); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized resource of type System.Byte[]. | |||||
/// </summary> | |||||
internal static byte[] libsscrypto_dll { | |||||
get { | |||||
object obj = ResourceManager.GetObject("libsscrypto_dll", resourceCulture); | |||||
return ((byte[])(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8" ?> | |||||
///<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | |||||
/// <targets> | |||||
/// <target name="file" xsi:type="File" fileName="shadowsocks.log"/> | |||||
/// | |||||
/// </targets> | |||||
/// <rules> | |||||
/// <logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" /> | |||||
/// </rules> | |||||
///</nlog>. | |||||
/// </summary> | |||||
internal static string NLog_config { | |||||
get { | |||||
return ResourceManager.GetString("NLog_config", resourceCulture); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized string similar to listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ | |||||
///toggle 0 | |||||
///logfile ss_privoxy.log | |||||
///show-on-task-bar 0 | |||||
///activity-animation 0 | |||||
///forward-socks5 / __SOCKS_HOST__:__SOCKS_PORT__ . | |||||
///max-client-connections 2048 | |||||
///hide-console | |||||
///. | |||||
/// </summary> | |||||
internal static string privoxy_conf { | |||||
get { | |||||
return ResourceManager.GetString("privoxy_conf", resourceCulture); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized resource of type System.Byte[]. | |||||
/// </summary> | |||||
internal static byte[] privoxy_exe { | |||||
get { | |||||
object obj = ResourceManager.GetObject("privoxy_exe", resourceCulture); | |||||
return ((byte[])(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized resource of type System.Drawing.Bitmap. | |||||
/// </summary> | |||||
internal static System.Drawing.Bitmap ss32Fill { | |||||
get { | |||||
object obj = ResourceManager.GetObject("ss32Fill", resourceCulture); | |||||
return ((System.Drawing.Bitmap)(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized resource of type System.Drawing.Bitmap. | |||||
/// </summary> | |||||
internal static System.Drawing.Bitmap ss32In { | |||||
get { | |||||
object obj = ResourceManager.GetObject("ss32In", resourceCulture); | |||||
return ((System.Drawing.Bitmap)(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized resource of type System.Drawing.Bitmap. | |||||
/// </summary> | |||||
internal static System.Drawing.Bitmap ss32Out { | |||||
get { | |||||
object obj = ResourceManager.GetObject("ss32Out", resourceCulture); | |||||
return ((System.Drawing.Bitmap)(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized resource of type System.Drawing.Bitmap. | |||||
/// </summary> | |||||
internal static System.Drawing.Bitmap ss32Outline { | |||||
get { | |||||
object obj = ResourceManager.GetObject("ss32Outline", resourceCulture); | |||||
return ((System.Drawing.Bitmap)(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized resource of type System.Drawing.Bitmap. | |||||
/// </summary> | |||||
internal static System.Drawing.Bitmap ssw128 { | |||||
get { | |||||
object obj = ResourceManager.GetObject("ssw128", resourceCulture); | |||||
return ((System.Drawing.Bitmap)(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized resource of type System.Byte[]. | |||||
/// </summary> | |||||
internal static byte[] sysproxy_exe { | |||||
get { | |||||
object obj = ResourceManager.GetObject("sysproxy_exe", resourceCulture); | |||||
return ((byte[])(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized resource of type System.Byte[]. | |||||
/// </summary> | |||||
internal static byte[] sysproxy64_exe { | |||||
get { | |||||
object obj = ResourceManager.GetObject("sysproxy64_exe", resourceCulture); | |||||
return ((byte[])(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized string similar to ! Put user rules line by line in this file. | |||||
///! See https://adblockplus.org/en/filter-cheatsheet | |||||
///. | |||||
/// </summary> | |||||
internal static string user_rule { | |||||
get { | |||||
return ResourceManager.GetString("user_rule", resourceCulture); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -130,6 +130,9 @@ | |||||
<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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | <value>..\Data\libsscrypto.dll.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||||
</data> | </data> | ||||
<data name="NLog_config" type="System.Resources.ResXFileRef, System.Windows.Forms"> | |||||
<value>..\data\nlog.config;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> | |||||
</data> | |||||
<data name="privoxy_conf" type="System.Resources.ResXFileRef, System.Windows.Forms"> | <data name="privoxy_conf" type="System.Resources.ResXFileRef, System.Windows.Forms"> | ||||
<value>..\data\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> | <value>..\data\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> | ||||
</data> | </data> | ||||
@@ -4,6 +4,7 @@ using System.Net.Sockets; | |||||
using System.Text; | using System.Text; | ||||
using System.Text.RegularExpressions; | using System.Text.RegularExpressions; | ||||
using System.Threading; | using System.Threading; | ||||
using NLog; | |||||
using Shadowsocks.Controller; | using Shadowsocks.Controller; | ||||
using Shadowsocks.Util.Sockets; | using Shadowsocks.Util.Sockets; | ||||
@@ -11,6 +12,8 @@ namespace Shadowsocks.Proxy | |||||
{ | { | ||||
public class HttpProxy : IProxy | public class HttpProxy : IProxy | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private class FakeAsyncResult : IAsyncResult | private class FakeAsyncResult : IAsyncResult | ||||
{ | { | ||||
public readonly HttpState innerState; | public readonly HttpState innerState; | ||||
@@ -179,7 +182,7 @@ namespace Shadowsocks.Proxy | |||||
private bool OnLineRead(string line, object state) | private bool OnLineRead(string line, object state) | ||||
{ | { | ||||
Logging.Debug(line); | |||||
logger.Debug(line); | |||||
if (_respondLineCount == 0) | if (_respondLineCount == 0) | ||||
{ | { | ||||
@@ -1,6 +1,7 @@ | |||||
using System; | using System; | ||||
using System.Diagnostics; | using System.Diagnostics; | ||||
using System.Runtime.InteropServices; | using System.Runtime.InteropServices; | ||||
using NLog; | |||||
using Shadowsocks.Controller; | using Shadowsocks.Controller; | ||||
namespace Shadowsocks.Util.ProcessManagement | namespace Shadowsocks.Util.ProcessManagement | ||||
@@ -11,6 +12,8 @@ namespace Shadowsocks.Util.ProcessManagement | |||||
*/ | */ | ||||
public class Job : IDisposable | public class Job : IDisposable | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private IntPtr handle = IntPtr.Zero; | private IntPtr handle = IntPtr.Zero; | ||||
public Job() | public Job() | ||||
@@ -54,7 +57,7 @@ namespace Shadowsocks.Util.ProcessManagement | |||||
if (!succ) | if (!succ) | ||||
{ | { | ||||
Logging.Error("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); | |||||
logger.Error("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); | |||||
} | } | ||||
return succ; | return succ; | ||||
@@ -1,4 +1,5 @@ | |||||
using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
using NLog; | |||||
using Shadowsocks.Controller; | using Shadowsocks.Controller; | ||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
using Shadowsocks.Properties; | using Shadowsocks.Properties; | ||||
@@ -14,6 +15,8 @@ namespace Shadowsocks.Util.SystemProxy | |||||
{ | { | ||||
public static class Sysproxy | public static class Sysproxy | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private const string _userWininetConfigFile = "user-wininet.json"; | private const string _userWininetConfigFile = "user-wininet.json"; | ||||
private readonly static string[] _lanIP = { | private readonly static string[] _lanIP = { | ||||
@@ -70,7 +73,7 @@ namespace Shadowsocks.Util.SystemProxy | |||||
} | } | ||||
catch (IOException e) | catch (IOException e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
@@ -233,7 +236,7 @@ namespace Shadowsocks.Util.SystemProxy | |||||
} | } | ||||
catch (IOException e) | catch (IOException e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
} | } | ||||
} | } | ||||
@@ -1,4 +1,5 @@ | |||||
using System; | |||||
using NLog; | |||||
using System; | |||||
using System.Diagnostics; | using System.Diagnostics; | ||||
using System.IO; | using System.IO; | ||||
using System.IO.Compression; | using System.IO.Compression; | ||||
@@ -26,6 +27,8 @@ namespace Shadowsocks.Util | |||||
public static class Utils | public static class Utils | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private static string _tempPath = null; | private static string _tempPath = null; | ||||
// return path to store temporary files | // return path to store temporary files | ||||
@@ -48,7 +51,7 @@ namespace Shadowsocks.Util | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.Error(e); | |||||
logger.Error(e); | |||||
throw; | throw; | ||||
} | } | ||||
} | } | ||||
@@ -58,7 +61,7 @@ namespace Shadowsocks.Util | |||||
public enum WindowsThemeMode { Dark, Light } | public enum WindowsThemeMode { Dark, Light } | ||||
// Support on Windows 10 1903+ | // Support on Windows 10 1903+ | ||||
public static WindowsThemeMode GetWindows10SystemThemeSetting(bool isVerbose) | |||||
public static WindowsThemeMode GetWindows10SystemThemeSetting() | |||||
{ | { | ||||
WindowsThemeMode themeMode = WindowsThemeMode.Dark; | WindowsThemeMode themeMode = WindowsThemeMode.Dark; | ||||
try | try | ||||
@@ -78,11 +81,10 @@ namespace Shadowsocks.Util | |||||
} | } | ||||
catch | catch | ||||
{ | { | ||||
if (isVerbose) | |||||
{ | |||||
Logging.Info( | |||||
$"Cannot get Windows 10 system theme mode, return default value 0 (dark mode)."); | |||||
} | |||||
logger.Debug( | |||||
$"Cannot get Windows 10 system theme mode, return default value 0 (dark mode)."); | |||||
} | } | ||||
return themeMode; | return themeMode; | ||||
} | } | ||||
@@ -251,7 +253,7 @@ namespace Shadowsocks.Util | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Logging.LogUsefulException(e); | |||||
logger.LogUsefulException(e); | |||||
return null; | return null; | ||||
} | } | ||||
} | } | ||||
@@ -106,10 +106,10 @@ | |||||
this.tableLayoutPanel1.Controls.Add(this.PluginArgumentsLabel, 0, 8); | this.tableLayoutPanel1.Controls.Add(this.PluginArgumentsLabel, 0, 8); | ||||
this.tableLayoutPanel1.Controls.Add(this.RemarksLabel, 0, 10); | this.tableLayoutPanel1.Controls.Add(this.RemarksLabel, 0, 10); | ||||
this.tableLayoutPanel1.Controls.Add(this.NeedPluginArgCheckBox, 1, 7); | this.tableLayoutPanel1.Controls.Add(this.NeedPluginArgCheckBox, 1, 7); | ||||
this.tableLayoutPanel1.Location = new System.Drawing.Point(8, 21); | |||||
this.tableLayoutPanel1.Location = new System.Drawing.Point(10, 26); | |||||
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(4); | |||||
this.tableLayoutPanel1.RowCount = 12; | this.tableLayoutPanel1.RowCount = 12; | ||||
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()); | ||||
@@ -123,16 +123,17 @@ | |||||
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(279, 292); | |||||
this.tableLayoutPanel1.Size = new System.Drawing.Size(394, 357); | |||||
this.tableLayoutPanel1.TabIndex = 0; | this.tableLayoutPanel1.TabIndex = 0; | ||||
// | // | ||||
// PluginOptionsLabel | // PluginOptionsLabel | ||||
// | // | ||||
this.PluginOptionsLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.PluginOptionsLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.PluginOptionsLabel.AutoSize = true; | this.PluginOptionsLabel.AutoSize = true; | ||||
this.PluginOptionsLabel.Location = new System.Drawing.Point(18, 166); | |||||
this.PluginOptionsLabel.Location = new System.Drawing.Point(24, 203); | |||||
this.PluginOptionsLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); | |||||
this.PluginOptionsLabel.Name = "PluginOptionsLabel"; | this.PluginOptionsLabel.Name = "PluginOptionsLabel"; | ||||
this.PluginOptionsLabel.Size = new System.Drawing.Size(89, 12); | |||||
this.PluginOptionsLabel.Size = new System.Drawing.Size(119, 15); | |||||
this.PluginOptionsLabel.TabIndex = 6; | this.PluginOptionsLabel.TabIndex = 6; | ||||
this.PluginOptionsLabel.Text = "Plugin Options"; | this.PluginOptionsLabel.Text = "Plugin Options"; | ||||
this.toolTip1.SetToolTip(this.PluginOptionsLabel, "Environment variables for plugin program"); | this.toolTip1.SetToolTip(this.PluginOptionsLabel, "Environment variables for plugin program"); | ||||
@@ -140,20 +141,22 @@ | |||||
// PluginTextBox | // PluginTextBox | ||||
// | // | ||||
this.PluginTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | this.PluginTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | ||||
this.PluginTextBox.Location = new System.Drawing.Point(113, 135); | |||||
this.PluginTextBox.Location = new System.Drawing.Point(151, 165); | |||||
this.PluginTextBox.Margin = new System.Windows.Forms.Padding(4); | |||||
this.PluginTextBox.MaxLength = 256; | this.PluginTextBox.MaxLength = 256; | ||||
this.PluginTextBox.Name = "PluginTextBox"; | this.PluginTextBox.Name = "PluginTextBox"; | ||||
this.PluginTextBox.Size = new System.Drawing.Size(160, 21); | |||||
this.PluginTextBox.Size = new System.Drawing.Size(235, 25); | |||||
this.PluginTextBox.TabIndex = 5; | this.PluginTextBox.TabIndex = 5; | ||||
this.PluginTextBox.WordWrap = false; | this.PluginTextBox.WordWrap = false; | ||||
// | // | ||||
// RemarksTextBox | // RemarksTextBox | ||||
// | // | ||||
this.RemarksTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | this.RemarksTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | ||||
this.RemarksTextBox.Location = new System.Drawing.Point(113, 238); | |||||
this.RemarksTextBox.Location = new System.Drawing.Point(151, 291); | |||||
this.RemarksTextBox.Margin = new System.Windows.Forms.Padding(4); | |||||
this.RemarksTextBox.MaxLength = 32; | this.RemarksTextBox.MaxLength = 32; | ||||
this.RemarksTextBox.Name = "RemarksTextBox"; | this.RemarksTextBox.Name = "RemarksTextBox"; | ||||
this.RemarksTextBox.Size = new System.Drawing.Size(160, 21); | |||||
this.RemarksTextBox.Size = new System.Drawing.Size(235, 25); | |||||
this.RemarksTextBox.TabIndex = 8; | this.RemarksTextBox.TabIndex = 8; | ||||
this.RemarksTextBox.WordWrap = false; | this.RemarksTextBox.WordWrap = false; | ||||
// | // | ||||
@@ -161,9 +164,10 @@ | |||||
// | // | ||||
this.IPLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.IPLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.IPLabel.AutoSize = true; | this.IPLabel.AutoSize = true; | ||||
this.IPLabel.Location = new System.Drawing.Point(48, 10); | |||||
this.IPLabel.Location = new System.Drawing.Point(64, 13); | |||||
this.IPLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); | |||||
this.IPLabel.Name = "IPLabel"; | this.IPLabel.Name = "IPLabel"; | ||||
this.IPLabel.Size = new System.Drawing.Size(59, 12); | |||||
this.IPLabel.Size = new System.Drawing.Size(79, 15); | |||||
this.IPLabel.TabIndex = 0; | this.IPLabel.TabIndex = 0; | ||||
this.IPLabel.Text = "Server IP"; | this.IPLabel.Text = "Server IP"; | ||||
// | // | ||||
@@ -171,9 +175,10 @@ | |||||
// | // | ||||
this.ServerPortLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.ServerPortLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.ServerPortLabel.AutoSize = true; | this.ServerPortLabel.AutoSize = true; | ||||
this.ServerPortLabel.Location = new System.Drawing.Point(36, 37); | |||||
this.ServerPortLabel.Location = new System.Drawing.Point(48, 46); | |||||
this.ServerPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); | |||||
this.ServerPortLabel.Name = "ServerPortLabel"; | this.ServerPortLabel.Name = "ServerPortLabel"; | ||||
this.ServerPortLabel.Size = new System.Drawing.Size(71, 12); | |||||
this.ServerPortLabel.Size = new System.Drawing.Size(95, 15); | |||||
this.ServerPortLabel.TabIndex = 1; | this.ServerPortLabel.TabIndex = 1; | ||||
this.ServerPortLabel.Text = "Server Port"; | this.ServerPortLabel.Text = "Server Port"; | ||||
// | // | ||||
@@ -181,9 +186,10 @@ | |||||
// | // | ||||
this.PasswordLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.PasswordLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.PasswordLabel.AutoSize = true; | this.PasswordLabel.AutoSize = true; | ||||
this.PasswordLabel.Location = new System.Drawing.Point(54, 64); | |||||
this.PasswordLabel.Location = new System.Drawing.Point(72, 79); | |||||
this.PasswordLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); | |||||
this.PasswordLabel.Name = "PasswordLabel"; | this.PasswordLabel.Name = "PasswordLabel"; | ||||
this.PasswordLabel.Size = new System.Drawing.Size(53, 12); | |||||
this.PasswordLabel.Size = new System.Drawing.Size(71, 15); | |||||
this.PasswordLabel.TabIndex = 2; | this.PasswordLabel.TabIndex = 2; | ||||
this.PasswordLabel.Text = "Password"; | this.PasswordLabel.Text = "Password"; | ||||
this.PasswordLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; | this.PasswordLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; | ||||
@@ -191,30 +197,34 @@ | |||||
// IPTextBox | // IPTextBox | ||||
// | // | ||||
this.IPTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | this.IPTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | ||||
this.IPTextBox.Location = new System.Drawing.Point(113, 6); | |||||
this.IPTextBox.Location = new System.Drawing.Point(151, 8); | |||||
this.IPTextBox.Margin = new System.Windows.Forms.Padding(4); | |||||
this.IPTextBox.MaxLength = 512; | this.IPTextBox.MaxLength = 512; | ||||
this.IPTextBox.Name = "IPTextBox"; | this.IPTextBox.Name = "IPTextBox"; | ||||
this.IPTextBox.Size = new System.Drawing.Size(160, 21); | |||||
this.IPTextBox.Size = new System.Drawing.Size(235, 25); | |||||
this.IPTextBox.TabIndex = 0; | this.IPTextBox.TabIndex = 0; | ||||
this.IPTextBox.WordWrap = false; | this.IPTextBox.WordWrap = false; | ||||
// | // | ||||
// ServerPortTextBox | // ServerPortTextBox | ||||
// | // | ||||
this.ServerPortTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | this.ServerPortTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | ||||
this.ServerPortTextBox.Location = new System.Drawing.Point(113, 33); | |||||
this.ServerPortTextBox.Location = new System.Drawing.Point(151, 41); | |||||
this.ServerPortTextBox.Margin = new System.Windows.Forms.Padding(4); | |||||
this.ServerPortTextBox.MaxLength = 10; | this.ServerPortTextBox.MaxLength = 10; | ||||
this.ServerPortTextBox.Name = "ServerPortTextBox"; | this.ServerPortTextBox.Name = "ServerPortTextBox"; | ||||
this.ServerPortTextBox.Size = new System.Drawing.Size(160, 21); | |||||
this.ServerPortTextBox.Size = new System.Drawing.Size(235, 25); | |||||
this.ServerPortTextBox.TabIndex = 1; | this.ServerPortTextBox.TabIndex = 1; | ||||
this.ServerPortTextBox.WordWrap = false; | this.ServerPortTextBox.WordWrap = false; | ||||
// | // | ||||
// PasswordTextBox | // PasswordTextBox | ||||
// | // | ||||
this.PasswordTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | this.PasswordTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | ||||
this.PasswordTextBox.Location = new System.Drawing.Point(113, 60); | |||||
this.PasswordTextBox.Font = new System.Drawing.Font("Consolas", 9F); | |||||
this.PasswordTextBox.Location = new System.Drawing.Point(151, 74); | |||||
this.PasswordTextBox.Margin = new System.Windows.Forms.Padding(4); | |||||
this.PasswordTextBox.MaxLength = 256; | this.PasswordTextBox.MaxLength = 256; | ||||
this.PasswordTextBox.Name = "PasswordTextBox"; | this.PasswordTextBox.Name = "PasswordTextBox"; | ||||
this.PasswordTextBox.Size = new System.Drawing.Size(160, 21); | |||||
this.PasswordTextBox.Size = new System.Drawing.Size(235, 25); | |||||
this.PasswordTextBox.TabIndex = 2; | this.PasswordTextBox.TabIndex = 2; | ||||
this.PasswordTextBox.UseSystemPasswordChar = true; | this.PasswordTextBox.UseSystemPasswordChar = true; | ||||
this.PasswordTextBox.WordWrap = false; | this.PasswordTextBox.WordWrap = false; | ||||
@@ -223,9 +233,10 @@ | |||||
// | // | ||||
this.EncryptionLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.EncryptionLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.EncryptionLabel.AutoSize = true; | this.EncryptionLabel.AutoSize = true; | ||||
this.EncryptionLabel.Location = new System.Drawing.Point(42, 113); | |||||
this.EncryptionLabel.Location = new System.Drawing.Point(56, 138); | |||||
this.EncryptionLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); | |||||
this.EncryptionLabel.Name = "EncryptionLabel"; | this.EncryptionLabel.Name = "EncryptionLabel"; | ||||
this.EncryptionLabel.Size = new System.Drawing.Size(65, 12); | |||||
this.EncryptionLabel.Size = new System.Drawing.Size(87, 15); | |||||
this.EncryptionLabel.TabIndex = 4; | this.EncryptionLabel.TabIndex = 4; | ||||
this.EncryptionLabel.Text = "Encryption"; | this.EncryptionLabel.Text = "Encryption"; | ||||
// | // | ||||
@@ -236,69 +247,54 @@ | |||||
this.EncryptionSelect.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; | this.EncryptionSelect.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; | ||||
this.EncryptionSelect.FormattingEnabled = true; | this.EncryptionSelect.FormattingEnabled = true; | ||||
this.EncryptionSelect.ImeMode = System.Windows.Forms.ImeMode.NoControl; | this.EncryptionSelect.ImeMode = System.Windows.Forms.ImeMode.NoControl; | ||||
this.EncryptionSelect.ItemHeight = 12; | |||||
this.EncryptionSelect.Items.AddRange(new object[] { | |||||
"rc4-md5", | |||||
"salsa20", | |||||
"chacha20", | |||||
"chacha20-ietf", | |||||
"aes-256-cfb", | |||||
"aes-192-cfb", | |||||
"aes-128-cfb", | |||||
"aes-256-ctr", | |||||
"aes-192-ctr", | |||||
"aes-128-ctr", | |||||
"bf-cfb", | |||||
"camellia-128-cfb", | |||||
"camellia-192-cfb", | |||||
"camellia-256-cfb", | |||||
"aes-128-gcm", | |||||
"aes-192-gcm", | |||||
"aes-256-gcm", | |||||
"chacha20-ietf-poly1305", | |||||
"xchacha20-ietf-poly1305"}); | |||||
this.EncryptionSelect.Location = new System.Drawing.Point(113, 109); | |||||
this.EncryptionSelect.ItemHeight = 15; | |||||
this.EncryptionSelect.Location = new System.Drawing.Point(151, 134); | |||||
this.EncryptionSelect.Margin = new System.Windows.Forms.Padding(4); | |||||
this.EncryptionSelect.Name = "EncryptionSelect"; | this.EncryptionSelect.Name = "EncryptionSelect"; | ||||
this.EncryptionSelect.Size = new System.Drawing.Size(160, 20); | |||||
this.EncryptionSelect.Size = new System.Drawing.Size(235, 23); | |||||
this.EncryptionSelect.TabIndex = 4; | this.EncryptionSelect.TabIndex = 4; | ||||
// | // | ||||
// TimeoutLabel | // TimeoutLabel | ||||
// | // | ||||
this.TimeoutLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.TimeoutLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.TimeoutLabel.AutoSize = true; | this.TimeoutLabel.AutoSize = true; | ||||
this.TimeoutLabel.Location = new System.Drawing.Point(30, 269); | |||||
this.TimeoutLabel.Location = new System.Drawing.Point(40, 329); | |||||
this.TimeoutLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); | |||||
this.TimeoutLabel.Name = "TimeoutLabel"; | this.TimeoutLabel.Name = "TimeoutLabel"; | ||||
this.TimeoutLabel.RightToLeft = System.Windows.Forms.RightToLeft.No; | this.TimeoutLabel.RightToLeft = System.Windows.Forms.RightToLeft.No; | ||||
this.TimeoutLabel.Size = new System.Drawing.Size(77, 12); | |||||
this.TimeoutLabel.Size = new System.Drawing.Size(103, 15); | |||||
this.TimeoutLabel.TabIndex = 9; | this.TimeoutLabel.TabIndex = 9; | ||||
this.TimeoutLabel.Text = "Timeout(Sec)"; | this.TimeoutLabel.Text = "Timeout(Sec)"; | ||||
// | // | ||||
// TimeoutTextBox | // TimeoutTextBox | ||||
// | // | ||||
this.TimeoutTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | this.TimeoutTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | ||||
this.TimeoutTextBox.Location = new System.Drawing.Point(113, 265); | |||||
this.TimeoutTextBox.Location = new System.Drawing.Point(151, 324); | |||||
this.TimeoutTextBox.Margin = new System.Windows.Forms.Padding(4); | |||||
this.TimeoutTextBox.MaxLength = 5; | this.TimeoutTextBox.MaxLength = 5; | ||||
this.TimeoutTextBox.Name = "TimeoutTextBox"; | this.TimeoutTextBox.Name = "TimeoutTextBox"; | ||||
this.TimeoutTextBox.Size = new System.Drawing.Size(160, 21); | |||||
this.TimeoutTextBox.Size = new System.Drawing.Size(235, 25); | |||||
this.TimeoutTextBox.TabIndex = 9; | this.TimeoutTextBox.TabIndex = 9; | ||||
// | // | ||||
// PluginLabel | // PluginLabel | ||||
// | // | ||||
this.PluginLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.PluginLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.PluginLabel.AutoSize = true; | this.PluginLabel.AutoSize = true; | ||||
this.PluginLabel.Location = new System.Drawing.Point(18, 139); | |||||
this.PluginLabel.Location = new System.Drawing.Point(24, 170); | |||||
this.PluginLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); | |||||
this.PluginLabel.Name = "PluginLabel"; | this.PluginLabel.Name = "PluginLabel"; | ||||
this.PluginLabel.Size = new System.Drawing.Size(89, 12); | |||||
this.PluginLabel.Size = new System.Drawing.Size(119, 15); | |||||
this.PluginLabel.TabIndex = 5; | this.PluginLabel.TabIndex = 5; | ||||
this.PluginLabel.Text = "Plugin Program"; | this.PluginLabel.Text = "Plugin Program"; | ||||
// | // | ||||
// PluginOptionsTextBox | // PluginOptionsTextBox | ||||
// | // | ||||
this.PluginOptionsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | this.PluginOptionsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | ||||
this.PluginOptionsTextBox.Location = new System.Drawing.Point(113, 162); | |||||
this.PluginOptionsTextBox.Location = new System.Drawing.Point(151, 198); | |||||
this.PluginOptionsTextBox.Margin = new System.Windows.Forms.Padding(4); | |||||
this.PluginOptionsTextBox.MaxLength = 256; | this.PluginOptionsTextBox.MaxLength = 256; | ||||
this.PluginOptionsTextBox.Name = "PluginOptionsTextBox"; | this.PluginOptionsTextBox.Name = "PluginOptionsTextBox"; | ||||
this.PluginOptionsTextBox.Size = new System.Drawing.Size(160, 21); | |||||
this.PluginOptionsTextBox.Size = new System.Drawing.Size(235, 25); | |||||
this.PluginOptionsTextBox.TabIndex = 6; | this.PluginOptionsTextBox.TabIndex = 6; | ||||
this.PluginOptionsTextBox.WordWrap = false; | this.PluginOptionsTextBox.WordWrap = false; | ||||
// | // | ||||
@@ -307,9 +303,10 @@ | |||||
this.ShowPasswdCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | this.ShowPasswdCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | ||||
| System.Windows.Forms.AnchorStyles.Left))); | | System.Windows.Forms.AnchorStyles.Left))); | ||||
this.ShowPasswdCheckBox.AutoSize = true; | this.ShowPasswdCheckBox.AutoSize = true; | ||||
this.ShowPasswdCheckBox.Location = new System.Drawing.Point(113, 87); | |||||
this.ShowPasswdCheckBox.Location = new System.Drawing.Point(151, 107); | |||||
this.ShowPasswdCheckBox.Margin = new System.Windows.Forms.Padding(4); | |||||
this.ShowPasswdCheckBox.Name = "ShowPasswdCheckBox"; | this.ShowPasswdCheckBox.Name = "ShowPasswdCheckBox"; | ||||
this.ShowPasswdCheckBox.Size = new System.Drawing.Size(102, 16); | |||||
this.ShowPasswdCheckBox.Size = new System.Drawing.Size(133, 19); | |||||
this.ShowPasswdCheckBox.TabIndex = 3; | this.ShowPasswdCheckBox.TabIndex = 3; | ||||
this.ShowPasswdCheckBox.Text = "Show Password"; | this.ShowPasswdCheckBox.Text = "Show Password"; | ||||
this.ShowPasswdCheckBox.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; | this.ShowPasswdCheckBox.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; | ||||
@@ -319,10 +316,11 @@ | |||||
// PluginArgumentsTextBox | // PluginArgumentsTextBox | ||||
// | // | ||||
this.PluginArgumentsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | this.PluginArgumentsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | ||||
this.PluginArgumentsTextBox.Location = new System.Drawing.Point(113, 211); | |||||
this.PluginArgumentsTextBox.Location = new System.Drawing.Point(151, 258); | |||||
this.PluginArgumentsTextBox.Margin = new System.Windows.Forms.Padding(4); | |||||
this.PluginArgumentsTextBox.MaxLength = 512; | this.PluginArgumentsTextBox.MaxLength = 512; | ||||
this.PluginArgumentsTextBox.Name = "PluginArgumentsTextBox"; | this.PluginArgumentsTextBox.Name = "PluginArgumentsTextBox"; | ||||
this.PluginArgumentsTextBox.Size = new System.Drawing.Size(160, 21); | |||||
this.PluginArgumentsTextBox.Size = new System.Drawing.Size(235, 25); | |||||
this.PluginArgumentsTextBox.TabIndex = 7; | this.PluginArgumentsTextBox.TabIndex = 7; | ||||
this.PluginArgumentsTextBox.WordWrap = false; | this.PluginArgumentsTextBox.WordWrap = false; | ||||
// | // | ||||
@@ -330,9 +328,10 @@ | |||||
// | // | ||||
this.PluginArgumentsLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.PluginArgumentsLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.PluginArgumentsLabel.AutoSize = true; | this.PluginArgumentsLabel.AutoSize = true; | ||||
this.PluginArgumentsLabel.Location = new System.Drawing.Point(6, 215); | |||||
this.PluginArgumentsLabel.Location = new System.Drawing.Point(8, 263); | |||||
this.PluginArgumentsLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); | |||||
this.PluginArgumentsLabel.Name = "PluginArgumentsLabel"; | this.PluginArgumentsLabel.Name = "PluginArgumentsLabel"; | ||||
this.PluginArgumentsLabel.Size = new System.Drawing.Size(101, 12); | |||||
this.PluginArgumentsLabel.Size = new System.Drawing.Size(135, 15); | |||||
this.PluginArgumentsLabel.TabIndex = 7; | this.PluginArgumentsLabel.TabIndex = 7; | ||||
this.PluginArgumentsLabel.Text = "Plugin Arguments"; | this.PluginArgumentsLabel.Text = "Plugin Arguments"; | ||||
this.toolTip1.SetToolTip(this.PluginArgumentsLabel, "Not a SIP003 standard. Used as CLI arguments.\r\nMandatory:\r\n%SS_LOCAL_HOST%, %SS_L" + | this.toolTip1.SetToolTip(this.PluginArgumentsLabel, "Not a SIP003 standard. Used as CLI arguments.\r\nMandatory:\r\n%SS_LOCAL_HOST%, %SS_L" + | ||||
@@ -342,18 +341,20 @@ | |||||
// | // | ||||
this.RemarksLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.RemarksLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.RemarksLabel.AutoSize = true; | this.RemarksLabel.AutoSize = true; | ||||
this.RemarksLabel.Location = new System.Drawing.Point(60, 242); | |||||
this.RemarksLabel.Location = new System.Drawing.Point(80, 296); | |||||
this.RemarksLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); | |||||
this.RemarksLabel.Name = "RemarksLabel"; | this.RemarksLabel.Name = "RemarksLabel"; | ||||
this.RemarksLabel.Size = new System.Drawing.Size(47, 12); | |||||
this.RemarksLabel.Size = new System.Drawing.Size(63, 15); | |||||
this.RemarksLabel.TabIndex = 8; | this.RemarksLabel.TabIndex = 8; | ||||
this.RemarksLabel.Text = "Remarks"; | this.RemarksLabel.Text = "Remarks"; | ||||
// | // | ||||
// NeedPluginArgCheckBox | // NeedPluginArgCheckBox | ||||
// | // | ||||
this.NeedPluginArgCheckBox.AutoSize = true; | this.NeedPluginArgCheckBox.AutoSize = true; | ||||
this.NeedPluginArgCheckBox.Location = new System.Drawing.Point(113, 189); | |||||
this.NeedPluginArgCheckBox.Location = new System.Drawing.Point(151, 231); | |||||
this.NeedPluginArgCheckBox.Margin = new System.Windows.Forms.Padding(4); | |||||
this.NeedPluginArgCheckBox.Name = "NeedPluginArgCheckBox"; | this.NeedPluginArgCheckBox.Name = "NeedPluginArgCheckBox"; | ||||
this.NeedPluginArgCheckBox.Size = new System.Drawing.Size(144, 16); | |||||
this.NeedPluginArgCheckBox.Size = new System.Drawing.Size(189, 19); | |||||
this.NeedPluginArgCheckBox.TabIndex = 10; | this.NeedPluginArgCheckBox.TabIndex = 10; | ||||
this.NeedPluginArgCheckBox.Text = "Need Plugin Argument"; | this.NeedPluginArgCheckBox.Text = "Need Plugin Argument"; | ||||
this.NeedPluginArgCheckBox.UseVisualStyleBackColor = true; | this.NeedPluginArgCheckBox.UseVisualStyleBackColor = true; | ||||
@@ -364,7 +365,8 @@ | |||||
this.panel2.Anchor = System.Windows.Forms.AnchorStyles.Top; | this.panel2.Anchor = System.Windows.Forms.AnchorStyles.Top; | ||||
this.panel2.AutoSize = true; | this.panel2.AutoSize = true; | ||||
this.panel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; | this.panel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; | ||||
this.panel2.Location = new System.Drawing.Point(165, 187); | |||||
this.panel2.Location = new System.Drawing.Point(206, 234); | |||||
this.panel2.Margin = new System.Windows.Forms.Padding(4); | |||||
this.panel2.Name = "panel2"; | this.panel2.Name = "panel2"; | ||||
this.panel2.Size = new System.Drawing.Size(0, 0); | this.panel2.Size = new System.Drawing.Size(0, 0); | ||||
this.panel2.TabIndex = 1; | this.panel2.TabIndex = 1; | ||||
@@ -373,10 +375,10 @@ | |||||
// | // | ||||
this.OKButton.DialogResult = System.Windows.Forms.DialogResult.OK; | this.OKButton.DialogResult = System.Windows.Forms.DialogResult.OK; | ||||
this.OKButton.Dock = System.Windows.Forms.DockStyle.Right; | this.OKButton.Dock = System.Windows.Forms.DockStyle.Right; | ||||
this.OKButton.Location = new System.Drawing.Point(3, 3); | |||||
this.OKButton.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0); | |||||
this.OKButton.Location = new System.Drawing.Point(4, 4); | |||||
this.OKButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 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(94, 29); | |||||
this.OKButton.TabIndex = 17; | this.OKButton.TabIndex = 17; | ||||
this.OKButton.Text = "OK"; | this.OKButton.Text = "OK"; | ||||
this.OKButton.UseVisualStyleBackColor = true; | this.OKButton.UseVisualStyleBackColor = true; | ||||
@@ -386,10 +388,10 @@ | |||||
// | // | ||||
this.MyCancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; | this.MyCancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; | ||||
this.MyCancelButton.Dock = System.Windows.Forms.DockStyle.Right; | this.MyCancelButton.Dock = System.Windows.Forms.DockStyle.Right; | ||||
this.MyCancelButton.Location = new System.Drawing.Point(84, 3); | |||||
this.MyCancelButton.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0); | |||||
this.MyCancelButton.Location = new System.Drawing.Point(106, 4); | |||||
this.MyCancelButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 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(94, 29); | |||||
this.MyCancelButton.TabIndex = 18; | this.MyCancelButton.TabIndex = 18; | ||||
this.MyCancelButton.Text = "Cancel"; | this.MyCancelButton.Text = "Cancel"; | ||||
this.MyCancelButton.UseVisualStyleBackColor = true; | this.MyCancelButton.UseVisualStyleBackColor = true; | ||||
@@ -399,10 +401,10 @@ | |||||
// | // | ||||
this.ApplyButton.Dock = System.Windows.Forms.DockStyle.Right; | this.ApplyButton.Dock = System.Windows.Forms.DockStyle.Right; | ||||
this.ApplyButton.Enabled = false; | this.ApplyButton.Enabled = false; | ||||
this.ApplyButton.Location = new System.Drawing.Point(165, 3); | |||||
this.ApplyButton.Margin = new System.Windows.Forms.Padding(3, 3, 0, 0); | |||||
this.ApplyButton.Location = new System.Drawing.Point(208, 4); | |||||
this.ApplyButton.Margin = new System.Windows.Forms.Padding(4, 4, 0, 0); | |||||
this.ApplyButton.Name = "ApplyButton"; | this.ApplyButton.Name = "ApplyButton"; | ||||
this.ApplyButton.Size = new System.Drawing.Size(75, 23); | |||||
this.ApplyButton.Size = new System.Drawing.Size(94, 29); | |||||
this.ApplyButton.TabIndex = 19; | this.ApplyButton.TabIndex = 19; | ||||
this.ApplyButton.Text = "Apply"; | this.ApplyButton.Text = "Apply"; | ||||
this.ApplyButton.UseVisualStyleBackColor = true; | this.ApplyButton.UseVisualStyleBackColor = true; | ||||
@@ -411,10 +413,10 @@ | |||||
// DeleteButton | // DeleteButton | ||||
// | // | ||||
this.DeleteButton.Dock = System.Windows.Forms.DockStyle.Right; | this.DeleteButton.Dock = System.Windows.Forms.DockStyle.Right; | ||||
this.DeleteButton.Location = new System.Drawing.Point(86, 6); | |||||
this.DeleteButton.Margin = new System.Windows.Forms.Padding(3, 6, 0, 3); | |||||
this.DeleteButton.Location = new System.Drawing.Point(108, 8); | |||||
this.DeleteButton.Margin = new System.Windows.Forms.Padding(4, 8, 0, 4); | |||||
this.DeleteButton.Name = "DeleteButton"; | this.DeleteButton.Name = "DeleteButton"; | ||||
this.DeleteButton.Size = new System.Drawing.Size(80, 23); | |||||
this.DeleteButton.Size = new System.Drawing.Size(100, 29); | |||||
this.DeleteButton.TabIndex = 13; | this.DeleteButton.TabIndex = 13; | ||||
this.DeleteButton.Text = "&Delete"; | this.DeleteButton.Text = "&Delete"; | ||||
this.DeleteButton.UseVisualStyleBackColor = true; | this.DeleteButton.UseVisualStyleBackColor = true; | ||||
@@ -423,10 +425,10 @@ | |||||
// AddButton | // AddButton | ||||
// | // | ||||
this.AddButton.Dock = System.Windows.Forms.DockStyle.Left; | this.AddButton.Dock = System.Windows.Forms.DockStyle.Left; | ||||
this.AddButton.Location = new System.Drawing.Point(0, 6); | |||||
this.AddButton.Margin = new System.Windows.Forms.Padding(0, 6, 3, 3); | |||||
this.AddButton.Location = new System.Drawing.Point(0, 8); | |||||
this.AddButton.Margin = new System.Windows.Forms.Padding(0, 8, 4, 4); | |||||
this.AddButton.Name = "AddButton"; | this.AddButton.Name = "AddButton"; | ||||
this.AddButton.Size = new System.Drawing.Size(80, 23); | |||||
this.AddButton.Size = new System.Drawing.Size(100, 29); | |||||
this.AddButton.TabIndex = 12; | this.AddButton.TabIndex = 12; | ||||
this.AddButton.Text = "&Add"; | this.AddButton.Text = "&Add"; | ||||
this.AddButton.UseVisualStyleBackColor = true; | this.AddButton.UseVisualStyleBackColor = true; | ||||
@@ -437,10 +439,11 @@ | |||||
this.ServerGroupBox.AutoSize = true; | this.ServerGroupBox.AutoSize = true; | ||||
this.ServerGroupBox.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; | this.ServerGroupBox.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; | ||||
this.ServerGroupBox.Controls.Add(this.tableLayoutPanel1); | this.ServerGroupBox.Controls.Add(this.tableLayoutPanel1); | ||||
this.ServerGroupBox.Location = new System.Drawing.Point(178, 0); | |||||
this.ServerGroupBox.Margin = new System.Windows.Forms.Padding(12, 0, 0, 0); | |||||
this.ServerGroupBox.Location = new System.Drawing.Point(223, 0); | |||||
this.ServerGroupBox.Margin = new System.Windows.Forms.Padding(15, 0, 0, 0); | |||||
this.ServerGroupBox.Name = "ServerGroupBox"; | this.ServerGroupBox.Name = "ServerGroupBox"; | ||||
this.ServerGroupBox.Size = new System.Drawing.Size(290, 330); | |||||
this.ServerGroupBox.Padding = new System.Windows.Forms.Padding(4); | |||||
this.ServerGroupBox.Size = new System.Drawing.Size(408, 405); | |||||
this.ServerGroupBox.TabIndex = 0; | this.ServerGroupBox.TabIndex = 0; | ||||
this.ServerGroupBox.TabStop = false; | this.ServerGroupBox.TabStop = false; | ||||
this.ServerGroupBox.Text = "Server"; | this.ServerGroupBox.Text = "Server"; | ||||
@@ -449,11 +452,11 @@ | |||||
// | // | ||||
this.ServersListBox.FormattingEnabled = true; | this.ServersListBox.FormattingEnabled = true; | ||||
this.ServersListBox.IntegralHeight = false; | this.ServersListBox.IntegralHeight = false; | ||||
this.ServersListBox.ItemHeight = 12; | |||||
this.ServersListBox.ItemHeight = 15; | |||||
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(206, 184); | |||||
this.ServersListBox.TabIndex = 11; | this.ServersListBox.TabIndex = 11; | ||||
this.ServersListBox.SelectedIndexChanged += new System.EventHandler(this.ServersListBox_SelectedIndexChanged); | this.ServersListBox.SelectedIndexChanged += new System.EventHandler(this.ServersListBox_SelectedIndexChanged); | ||||
// | // | ||||
@@ -470,14 +473,14 @@ | |||||
this.tableLayoutPanel2.Controls.Add(this.ServersListBox, 0, 0); | this.tableLayoutPanel2.Controls.Add(this.ServersListBox, 0, 0); | ||||
this.tableLayoutPanel2.Controls.Add(this.ServerGroupBox, 1, 0); | this.tableLayoutPanel2.Controls.Add(this.ServerGroupBox, 1, 0); | ||||
this.tableLayoutPanel2.Controls.Add(this.tableLayoutPanel4, 0, 1); | this.tableLayoutPanel2.Controls.Add(this.tableLayoutPanel4, 0, 1); | ||||
this.tableLayoutPanel2.Location = new System.Drawing.Point(12, 12); | |||||
this.tableLayoutPanel2.Location = new System.Drawing.Point(15, 15); | |||||
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(0); | this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(0); | ||||
this.tableLayoutPanel2.Name = "tableLayoutPanel2"; | this.tableLayoutPanel2.Name = "tableLayoutPanel2"; | ||||
this.tableLayoutPanel2.RowCount = 3; | this.tableLayoutPanel2.RowCount = 3; | ||||
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(468, 426); | |||||
this.tableLayoutPanel2.Size = new System.Drawing.Size(631, 528); | |||||
this.tableLayoutPanel2.TabIndex = 7; | this.tableLayoutPanel2.TabIndex = 7; | ||||
// | // | ||||
// tableLayoutPanel6 | // tableLayoutPanel6 | ||||
@@ -490,21 +493,21 @@ | |||||
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, 394); | |||||
this.tableLayoutPanel6.Location = new System.Drawing.Point(0, 487); | |||||
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; | ||||
this.tableLayoutPanel6.RowStyles.Add(new System.Windows.Forms.RowStyle()); | this.tableLayoutPanel6.RowStyles.Add(new System.Windows.Forms.RowStyle()); | ||||
this.tableLayoutPanel6.Size = new System.Drawing.Size(166, 32); | |||||
this.tableLayoutPanel6.Size = new System.Drawing.Size(208, 41); | |||||
this.tableLayoutPanel6.TabIndex = 10; | this.tableLayoutPanel6.TabIndex = 10; | ||||
// | // | ||||
// MoveDownButton | // MoveDownButton | ||||
// | // | ||||
this.MoveDownButton.Dock = System.Windows.Forms.DockStyle.Right; | this.MoveDownButton.Dock = System.Windows.Forms.DockStyle.Right; | ||||
this.MoveDownButton.Location = new System.Drawing.Point(86, 6); | |||||
this.MoveDownButton.Margin = new System.Windows.Forms.Padding(3, 6, 0, 3); | |||||
this.MoveDownButton.Location = new System.Drawing.Point(108, 8); | |||||
this.MoveDownButton.Margin = new System.Windows.Forms.Padding(4, 8, 0, 4); | |||||
this.MoveDownButton.Name = "MoveDownButton"; | this.MoveDownButton.Name = "MoveDownButton"; | ||||
this.MoveDownButton.Size = new System.Drawing.Size(80, 23); | |||||
this.MoveDownButton.Size = new System.Drawing.Size(100, 29); | |||||
this.MoveDownButton.TabIndex = 16; | this.MoveDownButton.TabIndex = 16; | ||||
this.MoveDownButton.Text = "Move D&own"; | this.MoveDownButton.Text = "Move D&own"; | ||||
this.MoveDownButton.UseVisualStyleBackColor = true; | this.MoveDownButton.UseVisualStyleBackColor = true; | ||||
@@ -513,10 +516,10 @@ | |||||
// MoveUpButton | // MoveUpButton | ||||
// | // | ||||
this.MoveUpButton.Dock = System.Windows.Forms.DockStyle.Left; | this.MoveUpButton.Dock = System.Windows.Forms.DockStyle.Left; | ||||
this.MoveUpButton.Location = new System.Drawing.Point(0, 6); | |||||
this.MoveUpButton.Margin = new System.Windows.Forms.Padding(0, 6, 3, 3); | |||||
this.MoveUpButton.Location = new System.Drawing.Point(0, 8); | |||||
this.MoveUpButton.Margin = new System.Windows.Forms.Padding(0, 8, 4, 4); | |||||
this.MoveUpButton.Name = "MoveUpButton"; | this.MoveUpButton.Name = "MoveUpButton"; | ||||
this.MoveUpButton.Size = new System.Drawing.Size(80, 23); | |||||
this.MoveUpButton.Size = new System.Drawing.Size(100, 29); | |||||
this.MoveUpButton.TabIndex = 15; | this.MoveUpButton.TabIndex = 15; | ||||
this.MoveUpButton.Text = "Move &Up"; | this.MoveUpButton.Text = "Move &Up"; | ||||
this.MoveUpButton.UseVisualStyleBackColor = true; | this.MoveUpButton.UseVisualStyleBackColor = true; | ||||
@@ -534,23 +537,24 @@ | |||||
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.Controls.Add(this.PortableModeCheckBox, 0, 1); | this.tableLayoutPanel5.Controls.Add(this.PortableModeCheckBox, 0, 1); | ||||
this.tableLayoutPanel5.Location = new System.Drawing.Point(166, 330); | |||||
this.tableLayoutPanel5.Location = new System.Drawing.Point(208, 405); | |||||
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(4); | |||||
this.tableLayoutPanel5.RowCount = 2; | this.tableLayoutPanel5.RowCount = 2; | ||||
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle()); | this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle()); | ||||
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle()); | this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle()); | ||||
this.tableLayoutPanel5.Size = new System.Drawing.Size(196, 64); | |||||
this.tableLayoutPanel5.Size = new System.Drawing.Size(251, 82); | |||||
this.tableLayoutPanel5.TabIndex = 9; | this.tableLayoutPanel5.TabIndex = 9; | ||||
// | // | ||||
// ProxyPortTextBox | // ProxyPortTextBox | ||||
// | // | ||||
this.ProxyPortTextBox.Anchor = System.Windows.Forms.AnchorStyles.Left; | this.ProxyPortTextBox.Anchor = System.Windows.Forms.AnchorStyles.Left; | ||||
this.ProxyPortTextBox.Location = new System.Drawing.Point(77, 6); | |||||
this.ProxyPortTextBox.Location = new System.Drawing.Point(103, 8); | |||||
this.ProxyPortTextBox.Margin = new System.Windows.Forms.Padding(4); | |||||
this.ProxyPortTextBox.MaxLength = 10; | this.ProxyPortTextBox.MaxLength = 10; | ||||
this.ProxyPortTextBox.Name = "ProxyPortTextBox"; | this.ProxyPortTextBox.Name = "ProxyPortTextBox"; | ||||
this.ProxyPortTextBox.Size = new System.Drawing.Size(113, 21); | |||||
this.ProxyPortTextBox.Size = new System.Drawing.Size(140, 25); | |||||
this.ProxyPortTextBox.TabIndex = 10; | this.ProxyPortTextBox.TabIndex = 10; | ||||
this.ProxyPortTextBox.WordWrap = false; | this.ProxyPortTextBox.WordWrap = false; | ||||
// | // | ||||
@@ -558,9 +562,10 @@ | |||||
// | // | ||||
this.ProxyPortLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.ProxyPortLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.ProxyPortLabel.AutoSize = true; | this.ProxyPortLabel.AutoSize = true; | ||||
this.ProxyPortLabel.Location = new System.Drawing.Point(6, 10); | |||||
this.ProxyPortLabel.Location = new System.Drawing.Point(8, 13); | |||||
this.ProxyPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); | |||||
this.ProxyPortLabel.Name = "ProxyPortLabel"; | this.ProxyPortLabel.Name = "ProxyPortLabel"; | ||||
this.ProxyPortLabel.Size = new System.Drawing.Size(65, 12); | |||||
this.ProxyPortLabel.Size = new System.Drawing.Size(87, 15); | |||||
this.ProxyPortLabel.TabIndex = 10; | this.ProxyPortLabel.TabIndex = 10; | ||||
this.ProxyPortLabel.Text = "Proxy Port"; | this.ProxyPortLabel.Text = "Proxy Port"; | ||||
// | // | ||||
@@ -569,9 +574,10 @@ | |||||
this.PortableModeCheckBox.Anchor = System.Windows.Forms.AnchorStyles.Left; | this.PortableModeCheckBox.Anchor = System.Windows.Forms.AnchorStyles.Left; | ||||
this.PortableModeCheckBox.AutoSize = true; | this.PortableModeCheckBox.AutoSize = true; | ||||
this.tableLayoutPanel5.SetColumnSpan(this.PortableModeCheckBox, 2); | this.tableLayoutPanel5.SetColumnSpan(this.PortableModeCheckBox, 2); | ||||
this.PortableModeCheckBox.Location = new System.Drawing.Point(6, 37); | |||||
this.PortableModeCheckBox.Location = new System.Drawing.Point(8, 48); | |||||
this.PortableModeCheckBox.Margin = new System.Windows.Forms.Padding(4); | |||||
this.PortableModeCheckBox.Name = "PortableModeCheckBox"; | this.PortableModeCheckBox.Name = "PortableModeCheckBox"; | ||||
this.PortableModeCheckBox.Size = new System.Drawing.Size(102, 16); | |||||
this.PortableModeCheckBox.Size = new System.Drawing.Size(133, 19); | |||||
this.PortableModeCheckBox.TabIndex = 11; | this.PortableModeCheckBox.TabIndex = 11; | ||||
this.PortableModeCheckBox.Text = "Portable Mode"; | this.PortableModeCheckBox.Text = "Portable Mode"; | ||||
this.toolTip1.SetToolTip(this.PortableModeCheckBox, "restart required"); | this.toolTip1.SetToolTip(this.PortableModeCheckBox, "restart required"); | ||||
@@ -585,17 +591,17 @@ | |||||
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); | this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); | ||||
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); | this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); | ||||
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); | this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); | ||||
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F)); | |||||
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 25F)); | |||||
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.Controls.Add(this.ApplyButton, 2, 0); | this.tableLayoutPanel3.Controls.Add(this.ApplyButton, 2, 0); | ||||
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Right; | this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Right; | ||||
this.tableLayoutPanel3.Location = new System.Drawing.Point(228, 397); | |||||
this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(3, 3, 0, 3); | |||||
this.tableLayoutPanel3.Location = new System.Drawing.Point(329, 491); | |||||
this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(4, 4, 0, 4); | |||||
this.tableLayoutPanel3.Name = "tableLayoutPanel3"; | this.tableLayoutPanel3.Name = "tableLayoutPanel3"; | ||||
this.tableLayoutPanel3.RowCount = 1; | this.tableLayoutPanel3.RowCount = 1; | ||||
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle()); | this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle()); | ||||
this.tableLayoutPanel3.Size = new System.Drawing.Size(240, 26); | |||||
this.tableLayoutPanel3.Size = new System.Drawing.Size(302, 33); | |||||
this.tableLayoutPanel3.TabIndex = 8; | this.tableLayoutPanel3.TabIndex = 8; | ||||
// | // | ||||
// tableLayoutPanel4 | // tableLayoutPanel4 | ||||
@@ -609,22 +615,22 @@ | |||||
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, 330); | |||||
this.tableLayoutPanel4.Location = new System.Drawing.Point(0, 405); | |||||
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 = 2; | this.tableLayoutPanel4.RowCount = 2; | ||||
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle()); | this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle()); | ||||
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle()); | this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle()); | ||||
this.tableLayoutPanel4.Size = new System.Drawing.Size(166, 64); | |||||
this.tableLayoutPanel4.Size = new System.Drawing.Size(208, 82); | |||||
this.tableLayoutPanel4.TabIndex = 8; | this.tableLayoutPanel4.TabIndex = 8; | ||||
// | // | ||||
// DuplicateButton | // DuplicateButton | ||||
// | // | ||||
this.DuplicateButton.Dock = System.Windows.Forms.DockStyle.Left; | this.DuplicateButton.Dock = System.Windows.Forms.DockStyle.Left; | ||||
this.DuplicateButton.Location = new System.Drawing.Point(0, 38); | |||||
this.DuplicateButton.Margin = new System.Windows.Forms.Padding(0, 6, 3, 3); | |||||
this.DuplicateButton.Location = new System.Drawing.Point(0, 49); | |||||
this.DuplicateButton.Margin = new System.Windows.Forms.Padding(0, 8, 4, 4); | |||||
this.DuplicateButton.Name = "DuplicateButton"; | this.DuplicateButton.Name = "DuplicateButton"; | ||||
this.DuplicateButton.Size = new System.Drawing.Size(80, 23); | |||||
this.DuplicateButton.Size = new System.Drawing.Size(100, 29); | |||||
this.DuplicateButton.TabIndex = 14; | this.DuplicateButton.TabIndex = 14; | ||||
this.DuplicateButton.Text = "Dupli&cate"; | this.DuplicateButton.Text = "Dupli&cate"; | ||||
this.DuplicateButton.UseVisualStyleBackColor = true; | this.DuplicateButton.UseVisualStyleBackColor = true; | ||||
@@ -633,19 +639,20 @@ | |||||
// ConfigForm | // ConfigForm | ||||
// | // | ||||
this.AcceptButton = this.OKButton; | this.AcceptButton = this.OKButton; | ||||
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); | |||||
this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); | |||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; | ||||
this.AutoSize = true; | this.AutoSize = true; | ||||
this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; | this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; | ||||
this.CancelButton = this.MyCancelButton; | this.CancelButton = this.MyCancelButton; | ||||
this.ClientSize = new System.Drawing.Size(491, 438); | |||||
this.ClientSize = new System.Drawing.Size(614, 548); | |||||
this.Controls.Add(this.tableLayoutPanel2); | this.Controls.Add(this.tableLayoutPanel2); | ||||
this.Controls.Add(this.panel2); | this.Controls.Add(this.panel2); | ||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; | ||||
this.Margin = new System.Windows.Forms.Padding(4); | |||||
this.MaximizeBox = false; | this.MaximizeBox = false; | ||||
this.MinimizeBox = false; | this.MinimizeBox = false; | ||||
this.Name = "ConfigForm"; | this.Name = "ConfigForm"; | ||||
this.Padding = new System.Windows.Forms.Padding(12, 12, 12, 9); | |||||
this.Padding = new System.Windows.Forms.Padding(15, 15, 15, 11); | |||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; | ||||
this.Text = "Edit Servers"; | this.Text = "Edit Servers"; | ||||
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.ConfigForm_FormClosed); | this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.ConfigForm_FormClosed); | ||||
@@ -2,7 +2,9 @@ using Shadowsocks.Controller; | |||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
using Shadowsocks.Properties; | using Shadowsocks.Properties; | ||||
using System; | using System; | ||||
using System.Collections.Generic; | |||||
using System.Drawing; | using System.Drawing; | ||||
using System.Linq; | |||||
using System.Windows.Forms; | using System.Windows.Forms; | ||||
namespace Shadowsocks.View | namespace Shadowsocks.View | ||||
@@ -17,10 +19,86 @@ namespace Shadowsocks.View | |||||
private bool isChange = false; | private bool isChange = false; | ||||
private class EncryptionMethod | |||||
{ | |||||
public readonly string name; | |||||
public readonly bool deprecated; | |||||
// Edit here to add/delete encryption method displayed in UI | |||||
private static string[] deprecatedMethod = new string[] | |||||
{ | |||||
"rc4-md5", | |||||
"salsa20", | |||||
"chacha20", | |||||
"bf-cfb", | |||||
"chacha20-ietf", | |||||
"aes-256-cfb", | |||||
"aes-192-cfb", | |||||
"aes-128-cfb", | |||||
"aes-256-ctr", | |||||
"aes-192-ctr", | |||||
"aes-128-ctr", | |||||
"camellia-256-cfb", | |||||
"camellia-192-cfb", | |||||
"camellia-128-cfb", | |||||
}; | |||||
private static string[] inuseMethod = new string[] | |||||
{ | |||||
"aes-256-gcm", | |||||
"aes-192-gcm", | |||||
"aes-128-gcm", | |||||
"chacha20-ietf-poly1305", | |||||
"xchacha20-ietf-poly1305", | |||||
}; | |||||
public static EncryptionMethod[] AllMethods | |||||
{ | |||||
get | |||||
{ | |||||
if (!init) Init(); | |||||
return allMethods; | |||||
} | |||||
} | |||||
private static bool init = false; | |||||
private static EncryptionMethod[] allMethods; | |||||
private static Dictionary<string, EncryptionMethod> methodByName = new Dictionary<string, EncryptionMethod>(); | |||||
private static void Init() | |||||
{ | |||||
var all = new List<EncryptionMethod>(); | |||||
all.AddRange(inuseMethod.Select(i => new EncryptionMethod(i, false))); | |||||
all.AddRange(deprecatedMethod.Select(d => new EncryptionMethod(d, true))); | |||||
allMethods = all.ToArray(); | |||||
foreach (var item in all) | |||||
{ | |||||
methodByName[item.name] = item; | |||||
} | |||||
init = true; | |||||
} | |||||
public static EncryptionMethod GetMethod(string name) | |||||
{ | |||||
if (!init) Init(); | |||||
return methodByName[name]; | |||||
} | |||||
private EncryptionMethod(string name, bool deprecated) | |||||
{ | |||||
this.name = name; | |||||
this.deprecated = deprecated; | |||||
} | |||||
public override string ToString() | |||||
{ | |||||
return deprecated ? $"{name} ({I18N.GetString("deprecated")})" : name; | |||||
} | |||||
} | |||||
public ConfigForm(ShadowsocksController controller) | public ConfigForm(ShadowsocksController controller) | ||||
{ | { | ||||
Font = SystemFonts.MessageBoxFont; | Font = SystemFonts.MessageBoxFont; | ||||
InitializeComponent(); | InitializeComponent(); | ||||
EncryptionSelect.Items.AddRange(EncryptionMethod.AllMethods); | |||||
// a dirty hack | // a dirty hack | ||||
ServersListBox.Dock = DockStyle.Fill; | ServersListBox.Dock = DockStyle.Fill; | ||||
@@ -115,7 +193,7 @@ namespace Shadowsocks.View | |||||
server = address, | server = address, | ||||
server_port = addressPort.Value, | server_port = addressPort.Value, | ||||
password = serverPassword, | password = serverPassword, | ||||
method = EncryptionSelect.Text, | |||||
method = ((EncryptionMethod)EncryptionSelect.SelectedItem).name, | |||||
plugin = PluginTextBox.Text, | plugin = PluginTextBox.Text, | ||||
plugin_opts = PluginOptionsTextBox.Text, | plugin_opts = PluginOptionsTextBox.Text, | ||||
plugin_args = PluginArgumentsTextBox.Text, | plugin_args = PluginArgumentsTextBox.Text, | ||||
@@ -316,7 +394,7 @@ namespace Shadowsocks.View | |||||
IPTextBox.Text = server.server; | IPTextBox.Text = server.server; | ||||
ServerPortTextBox.Text = server.server_port.ToString(); | ServerPortTextBox.Text = server.server_port.ToString(); | ||||
PasswordTextBox.Text = server.password; | PasswordTextBox.Text = server.password; | ||||
EncryptionSelect.Text = server.method ?? Server.DefaultMethod; | |||||
EncryptionSelect.SelectedItem = EncryptionMethod.GetMethod(server.method ?? Server.DefaultMethod); | |||||
PluginTextBox.Text = server.plugin; | PluginTextBox.Text = server.plugin; | ||||
PluginOptionsTextBox.Text = server.plugin_opts; | PluginOptionsTextBox.Text = server.plugin_opts; | ||||
PluginArgumentsTextBox.Text = server.plugin_args; | PluginArgumentsTextBox.Text = server.plugin_args; | ||||
@@ -11,11 +11,14 @@ using Shadowsocks.Properties; | |||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
using Shadowsocks.Util; | using Shadowsocks.Util; | ||||
using System.Text; | using System.Text; | ||||
using NLog; | |||||
namespace Shadowsocks.View | namespace Shadowsocks.View | ||||
{ | { | ||||
public partial class LogForm : Form | public partial class LogForm : Form | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
long lastOffset; | long lastOffset; | ||||
string filename; | string filename; | ||||
Timer timer; | Timer timer; | ||||
@@ -38,13 +41,27 @@ namespace Shadowsocks.View | |||||
TextAnnotation outboundAnnotation = new TextAnnotation(); | TextAnnotation outboundAnnotation = new TextAnnotation(); | ||||
#endregion | #endregion | ||||
public LogForm(ShadowsocksController controller, string filename) | |||||
public LogForm(ShadowsocksController controller) | |||||
{ | { | ||||
this.controller = controller; | this.controller = controller; | ||||
this.filename = filename; | |||||
InitializeComponent(); | InitializeComponent(); | ||||
Icon = Icon.FromHandle(Resources.ssw128.GetHicon()); | Icon = Icon.FromHandle(Resources.ssw128.GetHicon()); | ||||
var nLogConfig = NLogConfig.LoadXML(); | |||||
try | |||||
{ | |||||
this.filename = nLogConfig.GetLogFileName(); | |||||
} | |||||
catch(Exception) | |||||
{ | |||||
// failed to get the file name | |||||
} | |||||
if (string.IsNullOrEmpty(this.filename)) | |||||
{ | |||||
LogMessageTextBox.AppendText("Cannot get the log file name from NLog config file. Please check if the nlog config file exists with corresponding XML nodes."); | |||||
} | |||||
LogViewerConfig config = controller.GetConfigurationCopy().logViewer; | LogViewerConfig config = controller.GetConfigurationCopy().logViewer; | ||||
topMostTrigger = config.topMost; | topMostTrigger = config.topMost; | ||||
@@ -158,6 +175,8 @@ namespace Shadowsocks.View | |||||
private void InitContent() | private void InitContent() | ||||
{ | { | ||||
if (string.IsNullOrEmpty(filename) || !File.Exists(filename)) | |||||
return; | |||||
using (StreamReader reader = new StreamReader(new FileStream(filename, | using (StreamReader reader = new StreamReader(new FileStream(filename, | ||||
FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) | FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) | ||||
{ | { | ||||
@@ -170,7 +189,7 @@ namespace Shadowsocks.View | |||||
string line = ""; | string line = ""; | ||||
StringBuilder appendText = new StringBuilder(1024); | StringBuilder appendText = new StringBuilder(1024); | ||||
while ((line = reader.ReadLine()) != null) | while ((line = reader.ReadLine()) != null) | ||||
appendText.Append(line + Environment.NewLine); | |||||
appendText.AppendLine(line); | |||||
LogMessageTextBox.AppendText(appendText.ToString()); | LogMessageTextBox.AppendText(appendText.ToString()); | ||||
LogMessageTextBox.ScrollToCaret(); | LogMessageTextBox.ScrollToCaret(); | ||||
@@ -181,6 +200,11 @@ namespace Shadowsocks.View | |||||
private void UpdateContent() | private void UpdateContent() | ||||
{ | { | ||||
this.Text = I18N.GetString("Log Viewer") + | |||||
$" [in: {Utils.FormatBytes(controller.InboundCounter)}, out: {Utils.FormatBytes(controller.OutboundCounter)}]"; | |||||
if (string.IsNullOrEmpty(filename) || !File.Exists(filename)) | |||||
return; | |||||
try | try | ||||
{ | { | ||||
using (StreamReader reader = new StreamReader(new FileStream(filename, | using (StreamReader reader = new StreamReader(new FileStream(filename, | ||||
@@ -194,7 +218,7 @@ namespace Shadowsocks.View | |||||
while ((line = reader.ReadLine()) != null) | while ((line = reader.ReadLine()) != null) | ||||
{ | { | ||||
changed = true; | changed = true; | ||||
appendText.Append(line + Environment.NewLine); | |||||
appendText.AppendLine(line); | |||||
} | } | ||||
if (changed) | if (changed) | ||||
@@ -209,9 +233,6 @@ namespace Shadowsocks.View | |||||
catch (FileNotFoundException) | catch (FileNotFoundException) | ||||
{ | { | ||||
} | } | ||||
this.Text = I18N.GetString("Log Viewer") + | |||||
$" [in: {Utils.FormatBytes(controller.InboundCounter)}, out: {Utils.FormatBytes(controller.OutboundCounter)}]"; | |||||
} | } | ||||
private void LogForm_Load(object sender, EventArgs e) | private void LogForm_Load(object sender, EventArgs e) | ||||
@@ -270,7 +291,7 @@ namespace Shadowsocks.View | |||||
private void OpenLocationMenuItem_Click(object sender, EventArgs e) | private void OpenLocationMenuItem_Click(object sender, EventArgs e) | ||||
{ | { | ||||
string argument = "/select, \"" + filename + "\""; | string argument = "/select, \"" + filename + "\""; | ||||
Logging.Debug(argument); | |||||
logger.Debug(argument); | |||||
System.Diagnostics.Process.Start("explorer.exe", argument); | System.Diagnostics.Process.Start("explorer.exe", argument); | ||||
} | } | ||||
@@ -287,7 +308,11 @@ namespace Shadowsocks.View | |||||
#region Clean up the content in LogMessageTextBox. | #region Clean up the content in LogMessageTextBox. | ||||
private void DoClearLogs() | private void DoClearLogs() | ||||
{ | { | ||||
Logging.Clear(); | |||||
try | |||||
{ | |||||
File.Delete(filename); | |||||
} | |||||
catch { } | |||||
lastOffset = 0; | lastOffset = 0; | ||||
LogMessageTextBox.Clear(); | LogMessageTextBox.Clear(); | ||||
} | } | ||||
@@ -317,7 +342,7 @@ namespace Shadowsocks.View | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
Logging.LogUsefulException(ex); | |||||
logger.LogUsefulException(ex); | |||||
MessageBox.Show(ex.Message); | MessageBox.Show(ex.Message); | ||||
} | } | ||||
} | } | ||||
@@ -1,4 +1,5 @@ | |||||
using Shadowsocks.Controller; | |||||
using NLog; | |||||
using Shadowsocks.Controller; | |||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
using Shadowsocks.Properties; | using Shadowsocks.Properties; | ||||
using Shadowsocks.Util; | using Shadowsocks.Util; | ||||
@@ -17,6 +18,7 @@ namespace Shadowsocks.View | |||||
{ | { | ||||
public class MenuViewController | public class MenuViewController | ||||
{ | { | ||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
// yes this is just a menu view controller | // yes this is just a menu view controller | ||||
// when config form is closed, it moves away from RAM | // when config form is closed, it moves away from RAM | ||||
// and it should just do anything related to the config form | // and it should just do anything related to the config form | ||||
@@ -220,7 +222,7 @@ namespace Shadowsocks.View | |||||
{ | { | ||||
Color colorMask = Color.White; | Color colorMask = Color.White; | ||||
Utils.WindowsThemeMode currentWindowsThemeMode = Utils.GetWindows10SystemThemeSetting(controller.GetCurrentConfiguration().isVerboseLogging); | |||||
Utils.WindowsThemeMode currentWindowsThemeMode = Utils.GetWindows10SystemThemeSetting(); | |||||
if (isProxyEnabled) | if (isProxyEnabled) | ||||
{ | { | ||||
@@ -386,7 +388,7 @@ namespace Shadowsocks.View | |||||
void controller_UpdatePACFromGFWListError(object sender, System.IO.ErrorEventArgs e) | void controller_UpdatePACFromGFWListError(object sender, System.IO.ErrorEventArgs e) | ||||
{ | { | ||||
ShowBalloonTip(I18N.GetString("Failed to update PAC file"), e.GetException().Message, ToolTipIcon.Error, 5000); | ShowBalloonTip(I18N.GetString("Failed to update PAC file"), e.GetException().Message, ToolTipIcon.Error, 5000); | ||||
Logging.LogUsefulException(e.GetException()); | |||||
logger.LogUsefulException(e.GetException()); | |||||
} | } | ||||
void controller_UpdatePACFromGFWListCompleted(object sender, GFWListUpdater.ResultEventArgs e) | void controller_UpdatePACFromGFWListCompleted(object sender, GFWListUpdater.ResultEventArgs e) | ||||
@@ -454,30 +456,30 @@ namespace Shadowsocks.View | |||||
{ | { | ||||
items.RemoveAt(0); | items.RemoveAt(0); | ||||
} | } | ||||
int i = 0; | |||||
int strategyCount = 0; | |||||
foreach (var strategy in controller.GetStrategies()) | foreach (var strategy in controller.GetStrategies()) | ||||
{ | { | ||||
MenuItem item = new MenuItem(strategy.Name); | MenuItem item = new MenuItem(strategy.Name); | ||||
item.Tag = strategy.ID; | item.Tag = strategy.ID; | ||||
item.Click += AStrategyItem_Click; | item.Click += AStrategyItem_Click; | ||||
items.Add(i, item); | |||||
i++; | |||||
items.Add(strategyCount, item); | |||||
strategyCount++; | |||||
} | } | ||||
// user wants a seperator item between strategy and servers menugroup | // user wants a seperator item between strategy and servers menugroup | ||||
items.Add(i++, new MenuItem("-")); | |||||
items.Add(strategyCount++, new MenuItem("-")); | |||||
int strategyCount = i; | |||||
int serverCount = 0; | |||||
Configuration configuration = controller.GetConfigurationCopy(); | Configuration configuration = controller.GetConfigurationCopy(); | ||||
foreach (var server in configuration.configs) | foreach (var server in configuration.configs) | ||||
{ | { | ||||
if (Configuration.ChecksServer(server)) | if (Configuration.ChecksServer(server)) | ||||
{ | { | ||||
MenuItem item = new MenuItem(server.FriendlyName()); | MenuItem item = new MenuItem(server.FriendlyName()); | ||||
item.Tag = i - strategyCount; | |||||
item.Tag = configuration.configs.FindIndex(s => s == server); | |||||
item.Click += AServerItem_Click; | item.Click += AServerItem_Click; | ||||
items.Add(i, item); | |||||
i++; | |||||
items.Add(strategyCount + serverCount, item); | |||||
serverCount++; | |||||
} | } | ||||
} | } | ||||
@@ -543,7 +545,7 @@ namespace Shadowsocks.View | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
logForm = new LogForm(controller, Logging.LogFilePath); | |||||
logForm = new LogForm(controller); | |||||
logForm.Show(); | logForm.Show(); | ||||
logForm.Activate(); | logForm.Activate(); | ||||
logForm.FormClosed += logForm_FormClosed; | logForm.FormClosed += logForm_FormClosed; | ||||
@@ -5,6 +5,7 @@ | |||||
<package id="Fody" version="4.2.1" targetFramework="net472" developmentDependency="true" /> | <package id="Fody" version="4.2.1" targetFramework="net472" developmentDependency="true" /> | ||||
<package id="GlobalHotKey" version="1.1.0" targetFramework="net472" /> | <package id="GlobalHotKey" version="1.1.0" targetFramework="net472" /> | ||||
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net472" /> | <package id="Newtonsoft.Json" version="12.0.2" targetFramework="net472" /> | ||||
<package id="NLog" version="4.6.8" targetFramework="net472" /> | |||||
<package id="StringEx.CS" version="0.3.1" targetFramework="net472" developmentDependency="true" /> | <package id="StringEx.CS" version="0.3.1" targetFramework="net472" developmentDependency="true" /> | ||||
<package id="ZXing.Net" version="0.16.5" targetFramework="net472" /> | <package id="ZXing.Net" version="0.16.5" targetFramework="net472" /> | ||||
</packages> | </packages> |
@@ -82,12 +82,21 @@ | |||||
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> | <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> | ||||
<HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath> | <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath> | ||||
</Reference> | </Reference> | ||||
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> | |||||
<HintPath>..\packages\NLog.4.6.8\lib\net45\NLog.dll</HintPath> | |||||
</Reference> | |||||
<Reference Include="PresentationCore" /> | <Reference Include="PresentationCore" /> | ||||
<Reference Include="System" /> | <Reference Include="System" /> | ||||
<Reference Include="System.Configuration" /> | |||||
<Reference Include="System.Data" /> | <Reference Include="System.Data" /> | ||||
<Reference Include="System.Data.DataSetExtensions" /> | |||||
<Reference Include="System.Drawing" /> | <Reference Include="System.Drawing" /> | ||||
<Reference Include="System.IO.Compression" /> | |||||
<Reference Include="System.Management" /> | <Reference Include="System.Management" /> | ||||
<Reference Include="System.Net" /> | <Reference Include="System.Net" /> | ||||
<Reference Include="System.Runtime.Serialization" /> | |||||
<Reference Include="System.ServiceModel" /> | |||||
<Reference Include="System.Transactions" /> | |||||
<Reference Include="System.Web" /> | <Reference Include="System.Web" /> | ||||
<Reference Include="System.Windows.Forms" /> | <Reference Include="System.Windows.Forms" /> | ||||
<Reference Include="System.Windows.Forms.DataVisualization" /> | <Reference Include="System.Windows.Forms.DataVisualization" /> | ||||
@@ -102,6 +111,7 @@ | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<Compile Include="Controller\HotkeyReg.cs" /> | <Compile Include="Controller\HotkeyReg.cs" /> | ||||
<Compile Include="Controller\LoggerExtension.cs" /> | |||||
<Compile Include="Controller\Service\PACDaemon.cs" /> | <Compile Include="Controller\Service\PACDaemon.cs" /> | ||||
<Compile Include="Controller\System\Hotkeys\HotkeyCallbacks.cs" /> | <Compile Include="Controller\System\Hotkeys\HotkeyCallbacks.cs" /> | ||||
<Compile Include="Encryption\AEAD\AEADEncryptor.cs" /> | <Compile Include="Encryption\AEAD\AEADEncryptor.cs" /> | ||||
@@ -122,6 +132,7 @@ | |||||
<Compile Include="Encryption\Stream\StreamOpenSSLEncryptor.cs" /> | <Compile Include="Encryption\Stream\StreamOpenSSLEncryptor.cs" /> | ||||
<Compile Include="Encryption\Stream\StreamSodiumEncryptor.cs" /> | <Compile Include="Encryption\Stream\StreamSodiumEncryptor.cs" /> | ||||
<Compile Include="Model\HotKeyConfig.cs" /> | <Compile Include="Model\HotKeyConfig.cs" /> | ||||
<Compile Include="Model\NLogConfig.cs" /> | |||||
<Compile Include="Model\ProxyConfig.cs" /> | <Compile Include="Model\ProxyConfig.cs" /> | ||||
<Compile Include="Model\SysproxyConfig.cs" /> | <Compile Include="Model\SysproxyConfig.cs" /> | ||||
<Compile Include="Properties\Resources.Designer.cs"> | <Compile Include="Properties\Resources.Designer.cs"> | ||||
@@ -145,7 +156,6 @@ | |||||
<Compile Include="Controller\Service\GFWListUpdater.cs" /> | <Compile Include="Controller\Service\GFWListUpdater.cs" /> | ||||
<Compile Include="Controller\I18N.cs" /> | <Compile Include="Controller\I18N.cs" /> | ||||
<Compile Include="Controller\Service\Listener.cs" /> | <Compile Include="Controller\Service\Listener.cs" /> | ||||
<Compile Include="Controller\Logging.cs" /> | |||||
<Compile Include="Controller\Service\PortForwarder.cs" /> | <Compile Include="Controller\Service\PortForwarder.cs" /> | ||||
<Compile Include="Controller\Service\UDPRelay.cs" /> | <Compile Include="Controller\Service\UDPRelay.cs" /> | ||||
<Compile Include="Controller\Service\UpdateChecker.cs" /> | <Compile Include="Controller\Service\UpdateChecker.cs" /> | ||||
@@ -257,6 +267,7 @@ | |||||
</None> | </None> | ||||
<None Include="Data\i18n.csv" /> | <None Include="Data\i18n.csv" /> | ||||
<None Include="Data\libsscrypto.dll.gz" /> | <None Include="Data\libsscrypto.dll.gz" /> | ||||
<None Include="Data\NLog.config" /> | |||||
<None Include="Data\privoxy.exe.gz" /> | <None Include="Data\privoxy.exe.gz" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -1,7 +1,7 @@ | |||||
| | ||||
Microsoft Visual Studio Solution File, Format Version 12.00 | Microsoft Visual Studio Solution File, Format Version 12.00 | ||||
# Visual Studio 15 | |||||
VisualStudioVersion = 15.0.26228.10 | |||||
# Visual Studio Version 16 | |||||
VisualStudioVersion = 16.0.29709.97 | |||||
MinimumVisualStudioVersion = 10.0.40219.1 | MinimumVisualStudioVersion = 10.0.40219.1 | ||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "shadowsocks-csharp", "shadowsocks-csharp\shadowsocks-csharp.csproj", "{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}" | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "shadowsocks-csharp", "shadowsocks-csharp\shadowsocks-csharp.csproj", "{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}" | ||||
EndProject | EndProject | ||||
@@ -12,21 +12,30 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShadowsocksTest", "test\Sha | |||||
EndProject | EndProject | ||||
Global | Global | ||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
Debug|Any CPU = Debug|Any CPU | |||||
Debug|x86 = Debug|x86 | Debug|x86 = Debug|x86 | ||||
Release|Any CPU = Release|Any CPU | |||||
Release|x86 = Release|x86 | Release|x86 = Release|x86 | ||||
EndGlobalSection | EndGlobalSection | ||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|Any CPU.ActiveCfg = Debug|x86 | |||||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.ActiveCfg = Debug|x86 | {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.Build.0 = Debug|x86 | ||||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Deploy.0 = Debug|x86 | {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Deploy.0 = Debug|x86 | ||||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|Any CPU.ActiveCfg = Release|x86 | |||||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.ActiveCfg = Release|x86 | {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.ActiveCfg = Release|x86 | ||||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.Build.0 = Release|x86 | {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.Build.0 = Release|x86 | ||||
{45913187-0685-4903-B250-DCEF0479CD86}.Debug|Any CPU.ActiveCfg = Debug|x86 | |||||
{45913187-0685-4903-B250-DCEF0479CD86}.Debug|x86.ActiveCfg = Debug|x86 | {45913187-0685-4903-B250-DCEF0479CD86}.Debug|x86.ActiveCfg = Debug|x86 | ||||
{45913187-0685-4903-B250-DCEF0479CD86}.Debug|x86.Build.0 = Debug|x86 | {45913187-0685-4903-B250-DCEF0479CD86}.Debug|x86.Build.0 = Debug|x86 | ||||
{45913187-0685-4903-B250-DCEF0479CD86}.Release|Any CPU.ActiveCfg = Release|x86 | |||||
{45913187-0685-4903-B250-DCEF0479CD86}.Release|x86.ActiveCfg = Release|x86 | {45913187-0685-4903-B250-DCEF0479CD86}.Release|x86.ActiveCfg = Release|x86 | ||||
{45913187-0685-4903-B250-DCEF0479CD86}.Release|x86.Build.0 = Release|x86 | {45913187-0685-4903-B250-DCEF0479CD86}.Release|x86.Build.0 = Release|x86 | ||||
EndGlobalSection | EndGlobalSection | ||||
GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution | ||||
HideSolutionNode = FALSE | HideSolutionNode = FALSE | ||||
EndGlobalSection | EndGlobalSection | ||||
GlobalSection(ExtensibilityGlobals) = postSolution | |||||
SolutionGuid = {F7E7D35B-4FDA-4385-95CF-09DADED042EA} | |||||
EndGlobalSection | |||||
EndGlobal | EndGlobal |