Using NLog as the logger No wrapper is used since we would use NLog for some time. Currently the UI is not fully ready to select all log levels.tags/4.1.9.3
@@ -1,4 +1,5 @@ | |||
using System; | |||
using NLog; | |||
using System; | |||
using System.IO; | |||
using System.IO.Compression; | |||
using System.Text; | |||
@@ -7,6 +8,8 @@ namespace Shadowsocks.Controller | |||
{ | |||
public static class FileManager | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
public static bool ByteArrayToFile(string fileName, byte[] content) | |||
{ | |||
try | |||
@@ -17,7 +20,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception ex) | |||
{ | |||
Logging.Error(ex); | |||
logger.Error(ex); | |||
} | |||
return false; | |||
} | |||
@@ -57,7 +60,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception ex) | |||
{ | |||
Logging.Error(ex); | |||
logger.Error(ex); | |||
throw ex; | |||
} | |||
} | |||
@@ -1,7 +1,7 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Windows.Forms; | |||
using NLog; | |||
using Shadowsocks.Controller.Hotkeys; | |||
using Shadowsocks.Model; | |||
@@ -9,6 +9,7 @@ namespace Shadowsocks.Controller | |||
{ | |||
static class HotkeyReg | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
public static void RegAllHotkeys() | |||
{ | |||
var hotkeyConfig = Configuration.Load().hotkey; | |||
@@ -60,7 +61,7 @@ namespace Shadowsocks.Controller | |||
var hotkey = HotKeys.Str2HotKey(hotkeyStr); | |||
if (hotkey == null) | |||
{ | |||
Logging.Error($"Cannot parse hotkey: {hotkeyStr}"); | |||
logger.Error($"Cannot parse hotkey: {hotkeyStr}"); | |||
onComplete?.Invoke(RegResult.ParseError); | |||
return false; | |||
} | |||
@@ -1,4 +1,5 @@ | |||
using Microsoft.VisualBasic.FileIO; | |||
using NLog; | |||
using Shadowsocks.Properties; | |||
using Shadowsocks.Util; | |||
using System.Collections.Generic; | |||
@@ -9,9 +10,10 @@ using System.Windows.Forms; | |||
namespace Shadowsocks.Controller | |||
{ | |||
public static class I18N | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
public const string I18N_FILE = "i18n.csv"; | |||
private static Dictionary<string, string> _strings = new Dictionary<string, string>(); | |||
@@ -47,12 +49,12 @@ namespace Shadowsocks.Controller | |||
} | |||
if (targetIndex != -1 && enIndex != targetIndex) | |||
{ | |||
Logging.Info($"Using {localeNames[targetIndex]} translation for {locale}"); | |||
logger.Info($"Using {localeNames[targetIndex]} translation for {locale}"); | |||
} | |||
else | |||
{ | |||
// Still not found, exit | |||
Logging.Info($"Translation for {locale} not found"); | |||
logger.Info($"Translation for {locale} not found"); | |||
return; | |||
} | |||
} | |||
@@ -85,10 +87,10 @@ namespace Shadowsocks.Controller | |||
} | |||
else | |||
{ | |||
Logging.Info("Using external translation"); | |||
logger.Info("Using external translation"); | |||
i18n = File.ReadAllText(I18N_FILE, Encoding.UTF8); | |||
} | |||
Logging.Info("Current language is: " + locale); | |||
logger.Info("Current language is: " + 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.Tasks; | |||
using Newtonsoft.Json; | |||
using NLog; | |||
using Shadowsocks.Model; | |||
using Shadowsocks.Util; | |||
@@ -18,6 +19,8 @@ namespace Shadowsocks.Controller | |||
public sealed class AvailabilityStatistics : IDisposable | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
public const string DateTimePattern = "yyyy-MM-dd HH:mm:ss"; | |||
private const string StatisticsFilesName = "shadowsocks.availability.json"; | |||
public static string AvailabilityStatisticsFile; | |||
@@ -111,7 +114,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
} | |||
@@ -155,7 +158,7 @@ namespace Shadowsocks.Controller | |||
inR.Add(inboundSpeed); | |||
outR.Add(outboundSpeed); | |||
Logging.Debug( | |||
logger.Debug( | |||
$"{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) | |||
{ | |||
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); | |||
} | |||
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) | |||
{ | |||
Save(); | |||
@@ -260,13 +263,13 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
} | |||
private void Save() | |||
{ | |||
Logging.Debug($"save statistics to {AvailabilityStatisticsFile}"); | |||
logger.Debug($"save statistics to {AvailabilityStatisticsFile}"); | |||
if (RawStatistics.Count == 0) | |||
{ | |||
return; | |||
@@ -283,7 +286,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (IOException e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
} | |||
@@ -300,7 +303,7 @@ namespace Shadowsocks.Controller | |||
{ | |||
try | |||
{ | |||
Logging.Debug("filter raw statistics"); | |||
logger.Debug("filter raw statistics"); | |||
if (RawStatistics == null) return; | |||
var filteredStatistics = new Statistics(); | |||
@@ -315,7 +318,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
} | |||
@@ -324,7 +327,7 @@ namespace Shadowsocks.Controller | |||
try | |||
{ | |||
var path = AvailabilityStatisticsFile; | |||
Logging.Debug($"loading statistics from {path}"); | |||
logger.Debug($"loading statistics from {path}"); | |||
if (!File.Exists(path)) | |||
{ | |||
using (File.Create(path)) | |||
@@ -337,7 +340,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
Console.WriteLine($"failed to load statistics; use runtime statistics, some data may be lost"); | |||
} | |||
} | |||
@@ -411,6 +414,8 @@ namespace Shadowsocks.Controller | |||
class MyPing | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
//arguments for ICMP tests | |||
public const int TimeoutMilliseconds = 500; | |||
@@ -445,7 +450,7 @@ namespace Shadowsocks.Controller | |||
{ | |||
try | |||
{ | |||
Logging.Debug($"Ping {server.FriendlyName()}"); | |||
logger.Debug($"Ping {server.FriendlyName()}"); | |||
if (ip == null) | |||
{ | |||
ip = Dns.GetHostAddresses(server.server) | |||
@@ -461,8 +466,8 @@ namespace Shadowsocks.Controller | |||
} | |||
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); | |||
} | |||
} | |||
@@ -473,20 +478,20 @@ namespace Shadowsocks.Controller | |||
{ | |||
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); | |||
} | |||
else | |||
{ | |||
Logging.Debug($"Ping {server.FriendlyName()} timeout"); | |||
logger.Debug($"Ping {server.FriendlyName()} timeout"); | |||
RoundtripTime.Add(null); | |||
} | |||
TestNext(e.UserState); | |||
} | |||
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); | |||
} | |||
} | |||
@@ -5,7 +5,7 @@ using System.Net; | |||
using System.Text; | |||
using Newtonsoft.Json; | |||
using NLog; | |||
using Shadowsocks.Model; | |||
using Shadowsocks.Properties; | |||
using Shadowsocks.Util; | |||
@@ -14,6 +14,8 @@ namespace Shadowsocks.Controller | |||
{ | |||
public class GFWListUpdater | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private const string GFWLIST_URL = "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"; | |||
public event EventHandler<ResultEventArgs> UpdateCompleted; | |||
@@ -93,10 +95,10 @@ var __RULES__ = {JsonConvert.SerializeObject(gfwLines, Formatting.Indented)}; | |||
string gfwListUrl = GFWLIST_URL; | |||
if (!string.IsNullOrWhiteSpace(config.gfwListUrl)) | |||
{ | |||
Logging.Info("Found custom GFWListURL in config file"); | |||
logger.Info("Found custom GFWListURL in config file"); | |||
gfwListUrl = config.gfwListUrl; | |||
} | |||
Logging.Info($"Checking GFWList from {gfwListUrl}"); | |||
logger.Info($"Checking GFWList from {gfwListUrl}"); | |||
WebClient http = new WebClient(); | |||
if (config.enabled) | |||
{ | |||
@@ -4,13 +4,15 @@ using System.Linq; | |||
using System.Net; | |||
using System.Net.NetworkInformation; | |||
using System.Net.Sockets; | |||
using NLog; | |||
using Shadowsocks.Model; | |||
namespace Shadowsocks.Controller | |||
{ | |||
public class Listener | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
public interface IService | |||
{ | |||
bool Handle(byte[] firstPacket, int length, Socket socket, object state); | |||
@@ -80,11 +82,8 @@ namespace Shadowsocks.Controller | |||
_tcpSocket.Listen(1024); | |||
// 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); | |||
UDPState udpState = new UDPState(_udpSocket); | |||
_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) | |||
{ | |||
Logging.Debug(ex); | |||
logger.Debug(ex); | |||
} | |||
finally | |||
{ | |||
@@ -171,7 +170,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
finally | |||
{ | |||
@@ -187,7 +186,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
} | |||
} | |||
@@ -218,7 +217,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
conn.Close(); | |||
} | |||
} | |||
@@ -1,4 +1,5 @@ | |||
using Shadowsocks.Properties; | |||
using NLog; | |||
using Shadowsocks.Properties; | |||
using Shadowsocks.Util; | |||
using System; | |||
using System.Collections.Generic; | |||
@@ -15,6 +16,8 @@ namespace Shadowsocks.Controller | |||
/// </summary> | |||
public class PACDaemon | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
public const string PAC_FILE = "pac.txt"; | |||
public const string USER_RULE_FILE = "user-rule.txt"; | |||
public const string USER_ABP_FILE = "abp.txt"; | |||
@@ -100,7 +103,7 @@ namespace Shadowsocks.Controller | |||
{ | |||
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(() => | |||
{ | |||
((FileSystemWatcher)sender).EnableRaisingEvents = false; | |||
@@ -115,7 +118,7 @@ namespace Shadowsocks.Controller | |||
{ | |||
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(() => | |||
{ | |||
((FileSystemWatcher)sender).EnableRaisingEvents = false; | |||
@@ -6,11 +6,14 @@ using System.Net; | |||
using System.Net.Sockets; | |||
using System.Text; | |||
using System.Web; | |||
using NLog; | |||
namespace Shadowsocks.Controller | |||
{ | |||
public class PACServer : Listener.Service | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
public const string RESOURCE_NAME = "pac"; | |||
private string PacSecret | |||
@@ -43,7 +46,7 @@ namespace Shadowsocks.Controller | |||
string usedSecret = _config.secureLocalPac ? $"&secret={PacSecret}" : ""; | |||
string contentHash = GetHash(_pacDaemon.GetPACContent()); | |||
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) | |||
@@ -177,7 +180,7 @@ Connection: Close | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
socket.Close(); | |||
} | |||
} | |||
@@ -1,6 +1,7 @@ | |||
using System; | |||
using System.Net; | |||
using System.Net.Sockets; | |||
using NLog; | |||
using Shadowsocks.Util.Sockets; | |||
namespace Shadowsocks.Controller | |||
@@ -26,6 +27,8 @@ namespace Shadowsocks.Controller | |||
private class Handler | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private byte[] _firstPacket; | |||
private int _firstPacketLength; | |||
private Socket _local; | |||
@@ -58,7 +61,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -77,7 +80,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -94,7 +97,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -115,7 +118,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -142,7 +145,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -169,7 +172,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -188,7 +191,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -207,7 +210,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -239,7 +242,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
} | |||
if (_remote != null) | |||
@@ -251,7 +254,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (SocketException e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
} | |||
} | |||
@@ -6,6 +6,7 @@ using System.Net; | |||
using System.Net.Sockets; | |||
using System.Text; | |||
using System.Windows.Forms; | |||
using NLog; | |||
using Shadowsocks.Model; | |||
using Shadowsocks.Properties; | |||
using Shadowsocks.Util; | |||
@@ -15,6 +16,8 @@ namespace Shadowsocks.Controller | |||
{ | |||
class PrivoxyRunner | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private static int _uid; | |||
private static string _uniqueConfigFile; | |||
private static Job _privoxyJob; | |||
@@ -33,7 +36,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (IOException e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
} | |||
@@ -106,7 +109,7 @@ namespace Shadowsocks.Controller | |||
} | |||
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. | |||
* We could simply ignore those exceptions. | |||
*/ | |||
Logging.LogUsefulException(ex); | |||
logger.LogUsefulException(ex); | |||
return false; | |||
} | |||
} | |||
@@ -159,7 +162,7 @@ namespace Shadowsocks.Controller | |||
catch (Exception e) | |||
{ | |||
// in case access denied | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
return defaultPort; | |||
} | |||
} | |||
@@ -1,4 +1,5 @@ | |||
using System; | |||
using NLog; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Net; | |||
@@ -17,6 +18,7 @@ namespace Shadowsocks.Controller | |||
{ | |||
class TCPRelay : Listener.Service | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private ShadowsocksController _controller; | |||
private DateTime _lastSweepTime; | |||
private Configuration _config; | |||
@@ -54,7 +56,7 @@ namespace Shadowsocks.Controller | |||
} | |||
foreach (TCPHandler handler1 in handlersToClose) | |||
{ | |||
Logging.Debug("Closing timed out TCP connection."); | |||
logger.Debug("Closing timed out TCP connection."); | |||
handler1.Close(); | |||
} | |||
@@ -122,6 +124,8 @@ namespace Shadowsocks.Controller | |||
} | |||
} | |||
private static Logger Logger = LogManager.GetCurrentClassLogger(); | |||
private readonly int _serverTimeout; | |||
private readonly int _proxyTimeout; | |||
@@ -217,7 +221,7 @@ namespace Shadowsocks.Controller | |||
this._server = server; | |||
/* prepare address buffer length for AEAD */ | |||
Logging.Debug($"_addrBufLength={_addrBufLength}"); | |||
Logger.Debug($"_addrBufLength={_addrBufLength}"); | |||
_encryptor.AddrBufLength = _addrBufLength; | |||
} | |||
@@ -252,7 +256,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
} | |||
if (_currentRemoteSession != null) | |||
@@ -265,7 +269,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
} | |||
} | |||
@@ -291,7 +295,7 @@ namespace Shadowsocks.Controller | |||
{ | |||
// reject socks 4 | |||
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, | |||
HandshakeSendCallback, null); | |||
@@ -301,7 +305,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -326,7 +330,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -358,21 +362,21 @@ namespace Shadowsocks.Controller | |||
break; | |||
case CMD_BIND: // not implemented | |||
default: | |||
Logging.Debug("Unsupported CMD=" + _command); | |||
Logger.Debug("Unsupported CMD=" + _command); | |||
Close(); | |||
break; | |||
} | |||
} | |||
else | |||
{ | |||
Logging.Debug( | |||
Logger.Debug( | |||
"failed to recv data in Shadowsocks.Controller.TCPHandler.handshakeReceive2Callback()"); | |||
Close(); | |||
} | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -387,7 +391,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -409,7 +413,7 @@ namespace Shadowsocks.Controller | |||
ReadAddress(16 + ADDR_PORT_LEN - 1, onSuccess); | |||
break; | |||
default: | |||
Logging.Debug("Unsupported ATYP=" + atyp); | |||
Logger.Debug("Unsupported ATYP=" + atyp); | |||
Close(); | |||
break; | |||
} | |||
@@ -468,10 +472,7 @@ namespace Shadowsocks.Controller | |||
break; | |||
} | |||
if (_config.isVerboseLogging) | |||
{ | |||
Logging.Info($"connect to {dstAddr}:{dstPort}"); | |||
} | |||
Logger.Debug($"connect to {dstAddr}:{dstPort}"); | |||
_destEndPoint = SocketUtil.GetEndPoint(dstAddr, dstPort); | |||
@@ -479,13 +480,13 @@ namespace Shadowsocks.Controller | |||
} | |||
else | |||
{ | |||
Logging.Debug("failed to recv data in Shadowsocks.Controller.TCPHandler.OnAddressFullyRead()"); | |||
Logger.Debug("failed to recv data in Shadowsocks.Controller.TCPHandler.OnAddressFullyRead()"); | |||
Close(); | |||
} | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -537,7 +538,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -631,7 +632,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -650,7 +651,7 @@ namespace Shadowsocks.Controller | |||
} | |||
var proxy = timer.Session.Remote; | |||
Logging.Info($"Proxy {proxy.ProxyEndPoint} timed out"); | |||
Logger.Info($"Proxy {proxy.ProxyEndPoint} timed out"); | |||
proxy.Close(); | |||
Close(); | |||
} | |||
@@ -678,12 +679,9 @@ namespace Shadowsocks.Controller | |||
_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; | |||
@@ -710,7 +708,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -731,7 +729,7 @@ namespace Shadowsocks.Controller | |||
Server server = timer.Server; | |||
IStrategy strategy = _controller.GetCurrentStrategy(); | |||
strategy?.SetFailure(server); | |||
Logging.Info($"{server.FriendlyName()} timed out"); | |||
Logger.Info($"{server.FriendlyName()} timed out"); | |||
session.Remote.Close(); | |||
Close(); | |||
} | |||
@@ -754,10 +752,7 @@ namespace Shadowsocks.Controller | |||
_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; | |||
IStrategy strategy = _controller.GetCurrentStrategy(); | |||
@@ -776,7 +771,7 @@ namespace Shadowsocks.Controller | |||
IStrategy strategy = _controller.GetCurrentStrategy(); | |||
strategy?.SetFailure(_server); | |||
} | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -803,12 +798,12 @@ namespace Shadowsocks.Controller | |||
PipeRemoteReceiveCallback, session); | |||
TryReadAvailableData(); | |||
Logging.Debug($"_firstPacketLength = {_firstPacketLength}"); | |||
Logger.Debug($"_firstPacketLength = {_firstPacketLength}"); | |||
SendToServer(_firstPacketLength, session); | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -834,7 +829,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (CryptoErrorException) | |||
{ | |||
Logging.Error("decryption error"); | |||
Logger.Error("decryption error"); | |||
Close(); | |||
return; | |||
} | |||
@@ -842,12 +837,12 @@ namespace Shadowsocks.Controller | |||
if (bytesToSend == 0) | |||
{ | |||
// need more to decrypt | |||
Logging.Debug("Need more to decrypt"); | |||
Logger.Debug("Need more to decrypt"); | |||
session.Remote.BeginReceive(_remoteRecvBuffer, 0, RecvSize, SocketFlags.None, | |||
PipeRemoteReceiveCallback, session); | |||
return; | |||
} | |||
Logging.Debug($"start sending {bytesToSend}"); | |||
Logger.Debug($"start sending {bytesToSend}"); | |||
_connection.BeginSend(_remoteSendBuffer, 0, bytesToSend, SocketFlags.None, | |||
PipeConnectionSendCallback, new object[] { session, bytesToSend }); | |||
IStrategy strategy = _controller.GetCurrentStrategy(); | |||
@@ -862,7 +857,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -890,7 +885,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -907,7 +902,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (CryptoErrorException) | |||
{ | |||
Logging.Debug("encryption error"); | |||
Logger.Debug("encryption error"); | |||
Close(); | |||
return; | |||
} | |||
@@ -932,7 +927,7 @@ namespace Shadowsocks.Controller | |||
int bytesRemaining = bytesShouldSend - bytesSent; | |||
if (bytesRemaining > 0) | |||
{ | |||
Logging.Info("reconstruct _connetionSendBuffer to re-send"); | |||
Logger.Info("reconstruct _connetionSendBuffer to re-send"); | |||
Buffer.BlockCopy(_connetionSendBuffer, bytesSent, _connetionSendBuffer, 0, bytesRemaining); | |||
session.Remote.BeginSend(_connetionSendBuffer, 0, bytesRemaining, SocketFlags.None, | |||
PipeRemoteSendCallback, new object[] { session, bytesRemaining }); | |||
@@ -943,7 +938,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -960,7 +955,7 @@ namespace Shadowsocks.Controller | |||
var bytesRemaining = bytesShouldSend - bytesSent; | |||
if (bytesRemaining > 0) | |||
{ | |||
Logging.Info("reconstruct _remoteSendBuffer to re-send"); | |||
Logger.Info("reconstruct _remoteSendBuffer to re-send"); | |||
Buffer.BlockCopy(_remoteSendBuffer, bytesSent, _remoteSendBuffer, 0, bytesRemaining); | |||
_connection.BeginSend(_remoteSendBuffer, 0, bytesRemaining, SocketFlags.None, | |||
PipeConnectionSendCallback, new object[] { session, bytesRemaining }); | |||
@@ -971,7 +966,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
Logger.LogUsefulException(e); | |||
Close(); | |||
} | |||
} | |||
@@ -3,6 +3,7 @@ using System.Collections.Generic; | |||
using System.Net; | |||
using System.Net.Sockets; | |||
using System.Runtime.CompilerServices; | |||
using NLog; | |||
using Shadowsocks.Controller.Strategy; | |||
using Shadowsocks.Encryption; | |||
using Shadowsocks.Model; | |||
@@ -49,6 +50,8 @@ namespace Shadowsocks.Controller | |||
public class UDPHandler | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private Socket _local; | |||
private Socket _remote; | |||
@@ -98,14 +101,14 @@ namespace Shadowsocks.Controller | |||
byte[] dataOut = new byte[65536]; // enough space for AEAD ciphers | |||
int 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); | |||
} | |||
public void Receive() | |||
{ | |||
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); | |||
} | |||
@@ -126,7 +129,7 @@ namespace Shadowsocks.Controller | |||
byte[] sendBuf = new byte[outlen + 3]; | |||
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); | |||
Receive(); | |||
@@ -4,7 +4,7 @@ using System.Net; | |||
using System.Text.RegularExpressions; | |||
using Newtonsoft.Json.Linq; | |||
using NLog; | |||
using Shadowsocks.Model; | |||
using Shadowsocks.Util; | |||
@@ -12,6 +12,8 @@ namespace Shadowsocks.Controller | |||
{ | |||
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 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 | |||
{ | |||
Logging.Debug("Checking updates..."); | |||
logger.Debug("Checking updates..."); | |||
WebClient http = CreateWebClient(); | |||
http.DownloadStringCompleted += http_DownloadStringCompleted; | |||
http.DownloadStringAsync(new Uri(UpdateURL)); | |||
} | |||
catch (Exception ex) | |||
{ | |||
Logging.LogUsefulException(ex); | |||
logger.LogUsefulException(ex); | |||
} | |||
} | |||
@@ -117,7 +119,7 @@ namespace Shadowsocks.Controller | |||
} | |||
else | |||
{ | |||
Logging.Debug("No update is available"); | |||
logger.Debug("No update is available"); | |||
if (CheckUpdateCompleted != null) | |||
{ | |||
CheckUpdateCompleted(this, new EventArgs()); | |||
@@ -126,7 +128,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception ex) | |||
{ | |||
Logging.LogUsefulException(ex); | |||
logger.LogUsefulException(ex); | |||
} | |||
} | |||
@@ -141,7 +143,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception ex) | |||
{ | |||
Logging.LogUsefulException(ex); | |||
logger.LogUsefulException(ex); | |||
} | |||
} | |||
@@ -151,10 +153,10 @@ namespace Shadowsocks.Controller | |||
{ | |||
if (e.Error != null) | |||
{ | |||
Logging.LogUsefulException(e.Error); | |||
logger.LogUsefulException(e.Error); | |||
return; | |||
} | |||
Logging.Debug($"New version {LatestVersionNumber}{LatestVersionSuffix} found: {LatestVersionLocalName}"); | |||
logger.Debug($"New version {LatestVersionNumber}{LatestVersionSuffix} found: {LatestVersionLocalName}"); | |||
if (CheckUpdateCompleted != null) | |||
{ | |||
CheckUpdateCompleted(this, new EventArgs()); | |||
@@ -162,7 +164,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception ex) | |||
{ | |||
Logging.LogUsefulException(ex); | |||
logger.LogUsefulException(ex); | |||
} | |||
} | |||
@@ -9,7 +9,7 @@ using System.Text; | |||
using System.Threading; | |||
using System.Web; | |||
using System.Windows.Forms; | |||
using NLog; | |||
using Shadowsocks.Controller.Service; | |||
using Shadowsocks.Controller.Strategy; | |||
using Shadowsocks.Model; | |||
@@ -19,6 +19,8 @@ namespace Shadowsocks.Controller | |||
{ | |||
public class ShadowsocksController | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
// controller: | |||
// handle user actions | |||
// manipulates UI | |||
@@ -165,13 +167,13 @@ namespace Shadowsocks.Controller | |||
{ | |||
if (plugin.StartIfNeeded()) | |||
{ | |||
Logging.Info( | |||
logger.Info( | |||
$"Started SIP003 plugin for {server.Identifier()} on {plugin.LocalEndPoint} - PID: {plugin.ProcessId}"); | |||
} | |||
} | |||
catch (Exception ex) | |||
{ | |||
Logging.Error("Failed to start SIP003 plugin: " + ex.Message); | |||
logger.Error("Failed to start SIP003 plugin: " + ex.Message); | |||
throw; | |||
} | |||
@@ -213,7 +215,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
return false; | |||
} | |||
} | |||
@@ -252,6 +254,7 @@ namespace Shadowsocks.Controller | |||
{ | |||
_config.isVerboseLogging = enabled; | |||
SaveConfig(_config); | |||
NLogConfig.LoadConfiguration(); // reload nlog | |||
VerboseLoggingStatusChanged?.Invoke(this, new EventArgs()); | |||
} | |||
@@ -475,6 +478,9 @@ namespace Shadowsocks.Controller | |||
Encryption.RNG.Reload(); | |||
// some logic in configuration updated the config when saving, we need to read it again | |||
_config = Configuration.Load(); | |||
NLogConfig.LoadConfiguration(); | |||
StatisticsConfiguration = StatisticsStrategyConfiguration.Load(); | |||
privoxyRunner = privoxyRunner ?? new PrivoxyRunner(); | |||
@@ -533,7 +539,7 @@ namespace Shadowsocks.Controller | |||
e = new Exception(I18N.GetString("Port {0} is reserved by system", _config.localPort), e); | |||
} | |||
} | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
ReportError(e); | |||
} | |||
@@ -1,4 +1,5 @@ | |||
using Shadowsocks.Model; | |||
using NLog; | |||
using Shadowsocks.Model; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Net; | |||
@@ -8,6 +9,8 @@ namespace Shadowsocks.Controller.Strategy | |||
{ | |||
class HighAvailabilityStrategy : IStrategy | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
protected ServerStatus _currentServer; | |||
protected Dictionary<Server, ServerStatus> _serverStatus; | |||
ShadowsocksController _controller; | |||
@@ -111,7 +114,7 @@ namespace Shadowsocks.Controller.Strategy | |||
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) + | |||
-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; | |||
foreach (var status in servers) | |||
@@ -133,14 +136,14 @@ namespace Shadowsocks.Controller.Strategy | |||
if (_currentServer == null || max.score - _currentServer.score > 200) | |||
{ | |||
_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) | |||
{ | |||
Logging.Debug($"latency: {server.FriendlyName()} {latency}"); | |||
logger.Debug($"latency: {server.FriendlyName()} {latency}"); | |||
ServerStatus status; | |||
if (_serverStatus.TryGetValue(server, out status)) | |||
@@ -152,7 +155,7 @@ namespace Shadowsocks.Controller.Strategy | |||
public void UpdateLastRead(Model.Server server) | |||
{ | |||
Logging.Debug($"last read: {server.FriendlyName()}"); | |||
logger.Debug($"last read: {server.FriendlyName()}"); | |||
ServerStatus status; | |||
if (_serverStatus.TryGetValue(server, out status)) | |||
@@ -163,7 +166,7 @@ namespace Shadowsocks.Controller.Strategy | |||
public void UpdateLastWrite(Model.Server server) | |||
{ | |||
Logging.Debug($"last write: {server.FriendlyName()}"); | |||
logger.Debug($"last write: {server.FriendlyName()}"); | |||
ServerStatus status; | |||
if (_serverStatus.TryGetValue(server, out status)) | |||
@@ -174,7 +177,7 @@ namespace Shadowsocks.Controller.Strategy | |||
public void SetFailure(Model.Server server) | |||
{ | |||
Logging.Debug($"failure: {server.FriendlyName()}"); | |||
logger.Debug($"failure: {server.FriendlyName()}"); | |||
ServerStatus status; | |||
if (_serverStatus.TryGetValue(server, out status)) | |||
@@ -5,7 +5,7 @@ using System.Net; | |||
using System.Threading; | |||
using Newtonsoft.Json; | |||
using NLog; | |||
using Shadowsocks.Model; | |||
namespace Shadowsocks.Controller.Strategy | |||
@@ -14,6 +14,8 @@ namespace Shadowsocks.Controller.Strategy | |||
internal class StatisticsStrategy : IStrategy, IDisposable | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private readonly ShadowsocksController _controller; | |||
private Server _currentServer; | |||
private readonly Timer _timer; | |||
@@ -34,7 +36,7 @@ namespace Shadowsocks.Controller.Strategy | |||
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; | |||
LoadStatistics(); | |||
ChooseNewServer(servers); | |||
@@ -74,7 +76,7 @@ namespace Shadowsocks.Controller.Strategy | |||
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; | |||
} | |||
@@ -112,7 +114,7 @@ namespace Shadowsocks.Controller.Strategy | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
} | |||
@@ -145,7 +147,7 @@ namespace Shadowsocks.Controller.Strategy | |||
public void SetFailure(Server server) | |||
{ | |||
Logging.Debug($"failure: {server.FriendlyName()}"); | |||
logger.Debug($"failure: {server.FriendlyName()}"); | |||
} | |||
public void UpdateLastRead(Server server) | |||
@@ -5,12 +5,15 @@ using System.Reflection; | |||
using System.Runtime.InteropServices; | |||
using System.Windows.Forms; | |||
using Microsoft.Win32; | |||
using NLog; | |||
using Shadowsocks.Util; | |||
namespace Shadowsocks.Controller | |||
{ | |||
static class AutoStartup | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
// Don't use Application.ExecutablePath | |||
// see https://stackoverflow.com/questions/12945805/odd-c-sharp-path-issue | |||
private static readonly string ExecutablePath = Assembly.GetEntryAssembly().Location; | |||
@@ -25,7 +28,7 @@ namespace Shadowsocks.Controller | |||
runKey = Utils.OpenRegKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true); | |||
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; | |||
} | |||
if (enabled) | |||
@@ -42,7 +45,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
return false; | |||
} | |||
finally | |||
@@ -55,7 +58,7 @@ namespace Shadowsocks.Controller | |||
runKey.Dispose(); | |||
} | |||
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); | |||
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; | |||
} | |||
string[] runList = runKey.GetValueNames(); | |||
@@ -91,7 +94,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
return false; | |||
} | |||
finally | |||
@@ -104,7 +107,7 @@ namespace Shadowsocks.Controller | |||
runKey.Dispose(); | |||
} | |||
catch (Exception e) | |||
{ Logging.LogUsefulException(e); } | |||
{ logger.LogUsefulException(e); } | |||
} | |||
} | |||
} | |||
@@ -140,13 +143,13 @@ namespace Shadowsocks.Controller | |||
// first parameter is process command line parameter | |||
// needn't include the name of the executable in the command line | |||
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 | |||
else if (!register) | |||
{ | |||
UnregisterApplicationRestart(); | |||
Logging.Debug("Unregister restart after system reboot"); | |||
logger.Debug("Unregister restart after system reboot"); | |||
} | |||
} | |||
} | |||
@@ -1,5 +1,6 @@ | |||
using System; | |||
using System.Windows.Forms; | |||
using NLog; | |||
using Shadowsocks.Model; | |||
using Shadowsocks.Util.SystemProxy; | |||
@@ -7,6 +8,8 @@ namespace Shadowsocks.Controller | |||
{ | |||
public static class SystemProxy | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private static string GetTimestamp(DateTime value) | |||
{ | |||
return value.ToString("yyyyMMddHHmmssfff"); | |||
@@ -52,7 +55,7 @@ namespace Shadowsocks.Controller | |||
} | |||
catch (ProxyException ex) | |||
{ | |||
Logging.LogUsefulException(ex); | |||
logger.LogUsefulException(ex); | |||
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); | |||
@@ -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,5 @@ | |||
using System; | |||
using NLog; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Diagnostics; | |||
using System.Net; | |||
@@ -13,6 +14,7 @@ namespace Shadowsocks.Encryption.AEAD | |||
public abstract class AEADEncryptor | |||
: EncryptorBase | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
// We are using the same saltLen and keyLen | |||
private const string Info = "ss-subkey"; | |||
private static readonly byte[] InfoBytes = Encoding.ASCII.GetBytes(Info); | |||
@@ -122,7 +124,7 @@ namespace Shadowsocks.Encryption.AEAD | |||
_decryptSalt = new byte[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); } | |||
@@ -139,7 +141,7 @@ namespace Shadowsocks.Encryption.AEAD | |||
_encCircularBuffer.Put(buf, 0, length); | |||
outlength = 0; | |||
Logging.Debug("---Start Encryption"); | |||
logger.Debug("---Start Encryption"); | |||
if (! _encryptSaltSent) { | |||
_encryptSaltSent = true; | |||
// Generate salt | |||
@@ -148,7 +150,7 @@ namespace Shadowsocks.Encryption.AEAD | |||
InitCipher(saltBytes, true, false); | |||
Array.Copy(saltBytes, 0, outbuf, 0, saltLen); | |||
outlength = saltLen; | |||
Logging.Debug($"_encryptSaltSent outlength {outlength}"); | |||
logger.Debug($"_encryptSaltSent outlength {outlength}"); | |||
} | |||
if (! _tcpRequestSent) { | |||
@@ -161,7 +163,7 @@ namespace Shadowsocks.Encryption.AEAD | |||
Debug.Assert(encAddrBufLength == AddrBufLength + tagLen * 2 + CHUNK_LEN_BYTES); | |||
Array.Copy(encAddrBufBytes, 0, outbuf, outlength, encAddrBufLength); | |||
outlength += encAddrBufLength; | |||
Logging.Debug($"_tcpRequestSent outlength {outlength}"); | |||
logger.Debug($"_tcpRequestSent outlength {outlength}"); | |||
} | |||
// handle other chunks | |||
@@ -176,15 +178,15 @@ namespace Shadowsocks.Encryption.AEAD | |||
Debug.Assert(encChunkLength == chunklength + tagLen * 2 + CHUNK_LEN_BYTES); | |||
Buffer.BlockCopy(encChunkBytes, 0, outbuf, outlength, encChunkLength); | |||
outlength += encChunkLength; | |||
Logging.Debug("chunks enc outlength " + outlength); | |||
logger.Debug("chunks enc outlength " + outlength); | |||
// check if we have enough space for outbuf | |||
if (outlength + TCPHandler.ChunkOverheadSize > TCPHandler.BufferSize) { | |||
Logging.Debug("enc outbuf almost full, giving up"); | |||
logger.Debug("enc outbuf almost full, giving up"); | |||
return; | |||
} | |||
bufSize = (uint)_encCircularBuffer.Size; | |||
if (bufSize <= 0) { | |||
Logging.Debug("No more data to encrypt, leaving"); | |||
logger.Debug("No more data to encrypt, leaving"); | |||
return; | |||
} | |||
} | |||
@@ -199,7 +201,7 @@ namespace Shadowsocks.Encryption.AEAD | |||
// drop all into buffer | |||
_decCircularBuffer.Put(buf, 0, length); | |||
Logging.Debug("---Start Decryption"); | |||
logger.Debug("---Start Decryption"); | |||
if (! _decryptSaltReceived) { | |||
bufSize = _decCircularBuffer.Size; | |||
// check if we get the leading salt | |||
@@ -210,7 +212,7 @@ namespace Shadowsocks.Encryption.AEAD | |||
_decryptSaltReceived = true; | |||
byte[] salt = _decCircularBuffer.Get(saltLen); | |||
InitCipher(salt, false, false); | |||
Logging.Debug("get salt len " + saltLen); | |||
logger.Debug("get salt len " + saltLen); | |||
} | |||
// handle chunks | |||
@@ -218,7 +220,7 @@ namespace Shadowsocks.Encryption.AEAD | |||
bufSize = _decCircularBuffer.Size; | |||
// check if we have any data | |||
if (bufSize <= 0) { | |||
Logging.Debug("No data in _decCircularBuffer"); | |||
logger.Debug("No data in _decCircularBuffer"); | |||
return; | |||
} | |||
@@ -241,13 +243,13 @@ namespace Shadowsocks.Encryption.AEAD | |||
if (chunkLen > CHUNK_LEN_MASK) | |||
{ | |||
// we get invalid chunk | |||
Logging.Error($"Invalid chunk length: {chunkLen}"); | |||
logger.Error($"Invalid chunk length: {chunkLen}"); | |||
throw new CryptoErrorException(); | |||
} | |||
Logging.Debug("Get the real chunk len:" + chunkLen); | |||
logger.Debug("Get the real chunk len:" + chunkLen); | |||
bufSize = _decCircularBuffer.Size; | |||
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; | |||
} | |||
IncrementNonce(false); | |||
@@ -267,16 +269,16 @@ namespace Shadowsocks.Encryption.AEAD | |||
// output to outbuf | |||
Buffer.BlockCopy(decChunkBytes, 0, outbuf, outlength, (int) decChunkLen); | |||
outlength += (int)decChunkLen; | |||
Logging.Debug("aead dec outlength " + outlength); | |||
logger.Debug("aead dec outlength " + outlength); | |||
if (outlength + 100 > TCPHandler.BufferSize) | |||
{ | |||
Logging.Debug("dec outbuf almost full, giving up"); | |||
logger.Debug("dec outbuf almost full, giving up"); | |||
return; | |||
} | |||
bufSize = _decCircularBuffer.Size; | |||
// check if we already done all of them | |||
if (bufSize <= 0) { | |||
Logging.Debug("No data in _decCircularBuffer, already all done"); | |||
logger.Debug("No data in _decCircularBuffer, already all done"); | |||
return; | |||
} | |||
} | |||
@@ -319,7 +321,7 @@ namespace Shadowsocks.Encryption.AEAD | |||
private void ChunkEncrypt(byte[] plaintext, int plainLen, byte[] ciphertext, out int cipherLen) | |||
{ | |||
if (plainLen > CHUNK_LEN_MASK) { | |||
Logging.Error("enc chunk too big"); | |||
logger.Error("enc chunk too big"); | |||
throw new CryptoErrorException(); | |||
} | |||
@@ -1,6 +1,7 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Diagnostics; | |||
using NLog; | |||
using Shadowsocks.Controller; | |||
using Shadowsocks.Encryption.Exception; | |||
@@ -9,6 +10,8 @@ namespace Shadowsocks.Encryption.AEAD | |||
public class AEADSodiumEncryptor | |||
: AEADEncryptor, IDisposable | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private const int CIPHER_CHACHA20IETFPOLY1305 = 1; | |||
private const int CIPHER_XCHACHA20IETFPOLY1305 = 2; | |||
private const int CIPHER_AES256GCM = 3; | |||
@@ -55,9 +58,9 @@ namespace Shadowsocks.Encryption.AEAD | |||
// outbuf: ciphertext + tag | |||
int ret; | |||
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) | |||
{ | |||
case CIPHER_CHACHA20IETFPOLY1305: | |||
@@ -85,7 +88,7 @@ namespace Shadowsocks.Encryption.AEAD | |||
throw new System.Exception("not implemented"); | |||
} | |||
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; | |||
} | |||
@@ -96,9 +99,9 @@ namespace Shadowsocks.Encryption.AEAD | |||
// outbuf: plaintext | |||
int ret; | |||
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) | |||
{ | |||
case CIPHER_CHACHA20IETFPOLY1305: | |||
@@ -127,7 +130,7 @@ namespace Shadowsocks.Encryption.AEAD | |||
} | |||
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; | |||
} | |||
@@ -1,6 +1,7 @@ | |||
using System; | |||
using System.IO; | |||
using System.Runtime.InteropServices; | |||
using NLog; | |||
using Shadowsocks.Controller; | |||
using Shadowsocks.Properties; | |||
using Shadowsocks.Util; | |||
@@ -9,6 +10,8 @@ namespace Shadowsocks.Encryption | |||
{ | |||
public static class MbedTLS | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private const string DLLNAME = "libsscrypto.dll"; | |||
public const int MBEDTLS_ENCRYPT = 1; | |||
@@ -26,7 +29,7 @@ namespace Shadowsocks.Encryption | |||
} | |||
catch (System.Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
LoadLibrary(dllPath); | |||
} | |||
@@ -3,6 +3,7 @@ using System.IO; | |||
using System.Runtime.InteropServices; | |||
using System.Security; | |||
using System.Text; | |||
using NLog; | |||
using Shadowsocks.Controller; | |||
using Shadowsocks.Encryption.Exception; | |||
using Shadowsocks.Properties; | |||
@@ -13,6 +14,8 @@ namespace Shadowsocks.Encryption | |||
// XXX: only for OpenSSL 1.1.0 and higher | |||
public static class OpenSSL | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private const string DLLNAME = "libsscrypto.dll"; | |||
public const int OPENSSL_ENCRYPT = 1; | |||
@@ -34,7 +37,7 @@ namespace Shadowsocks.Encryption | |||
} | |||
catch (System.Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
LoadLibrary(dllPath); | |||
} | |||
@@ -1,6 +1,7 @@ | |||
using System; | |||
using System.IO; | |||
using System.Runtime.InteropServices; | |||
using NLog; | |||
using Shadowsocks.Controller; | |||
using Shadowsocks.Properties; | |||
using Shadowsocks.Util; | |||
@@ -9,6 +10,8 @@ namespace Shadowsocks.Encryption | |||
{ | |||
public static class Sodium | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private const string DLLNAME = "libsscrypto.dll"; | |||
private static bool _initialized = false; | |||
@@ -28,7 +31,7 @@ namespace Shadowsocks.Encryption | |||
} | |||
catch (System.Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
LoadLibrary(dllPath); | |||
@@ -46,7 +49,7 @@ namespace Shadowsocks.Encryption | |||
} | |||
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.IO; | |||
using Newtonsoft.Json; | |||
using NLog; | |||
using Shadowsocks.Controller; | |||
namespace Shadowsocks.Model | |||
@@ -9,6 +10,9 @@ namespace Shadowsocks.Model | |||
[Serializable] | |||
public class Configuration | |||
{ | |||
[JsonIgnore] | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
public string version; | |||
public List<Server> configs; | |||
@@ -32,10 +36,14 @@ namespace Shadowsocks.Model | |||
public bool autoCheckUpdate; | |||
public bool checkPreRelease; | |||
public bool isVerboseLogging; | |||
//public NLogConfig.LogLevel logLevel; | |||
public LogViewerConfig logViewer; | |||
public ProxyConfig proxy; | |||
public HotkeyConfig hotkey; | |||
[JsonIgnore] | |||
NLogConfig nLogConfig; | |||
private static readonly string CONFIG_FILE = "gui-config.json"; | |||
[JsonIgnore] | |||
public string localHost => GetLocalHost(); | |||
@@ -100,12 +108,35 @@ namespace Shadowsocks.Model | |||
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; | |||
} | |||
catch (Exception e) | |||
{ | |||
if (!(e is FileNotFoundException)) | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
return new Configuration | |||
{ | |||
index = 0, | |||
@@ -118,7 +149,7 @@ namespace Shadowsocks.Model | |||
}, | |||
logViewer = new LogViewerConfig(), | |||
proxy = new ProxyConfig(), | |||
hotkey = new HotkeyConfig() | |||
hotkey = new HotkeyConfig(), | |||
}; | |||
} | |||
} | |||
@@ -141,10 +172,20 @@ namespace Shadowsocks.Model | |||
sw.Write(jsonString); | |||
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) | |||
{ | |||
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 Newtonsoft.Json; | |||
using NLog; | |||
using Shadowsocks.Controller; | |||
namespace Shadowsocks.Model | |||
@@ -13,6 +13,8 @@ namespace Shadowsocks.Model | |||
[Serializable] | |||
public class StatisticsStrategyConfiguration | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
public static readonly string ID = "com.shadowsocks.strategy.statistics"; | |||
public bool StatisticsEnabled { get; set; } = false; | |||
public bool ByHourOfDay { get; set; } = true; | |||
@@ -39,7 +41,7 @@ namespace Shadowsocks.Model | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
return new StatisticsStrategyConfiguration(); | |||
} | |||
} | |||
@@ -53,7 +55,7 @@ namespace Shadowsocks.Model | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
} | |||
@@ -3,6 +3,7 @@ using System.Diagnostics; | |||
using System.IO; | |||
using System.Threading; | |||
using System.Windows.Forms; | |||
using NLog; | |||
using Microsoft.Win32; | |||
using Shadowsocks.Controller; | |||
@@ -14,6 +15,7 @@ namespace Shadowsocks | |||
{ | |||
static class Program | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
public static ShadowsocksController MainController { get; private set; } | |||
public static MenuViewController MenuController { get; private set; } | |||
public static string[] Args { get; private set; } | |||
@@ -24,6 +26,9 @@ namespace Shadowsocks | |||
[STAThread] | |||
static void Main(string[] args) | |||
{ | |||
// todo: initialize the NLog configuartion | |||
Model.NLogConfig.TouchAndApplyNLogConfig(); | |||
// .NET Framework 4.7.2 on Win7 compatibility | |||
System.Net.ServicePointManager.SecurityProtocol |= | |||
System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12; | |||
@@ -79,14 +84,10 @@ namespace Shadowsocks | |||
} | |||
Directory.SetCurrentDirectory(Application.StartupPath); | |||
#if DEBUG | |||
Logging.OpenLogFile(); | |||
// truncate privoxy log file while debugging | |||
string privoxyLogFilename = Utils.GetTempPath("privoxy.log"); | |||
if (File.Exists(privoxyLogFilename)) | |||
using (new FileStream(privoxyLogFilename, FileMode.Truncate)) { } | |||
#else | |||
Logging.OpenLogFile(); | |||
#endif | |||
MainController = new ShadowsocksController(); | |||
MenuController = new MenuViewController(MainController); | |||
@@ -102,7 +103,7 @@ namespace Shadowsocks | |||
if (Interlocked.Increment(ref exited) == 1) | |||
{ | |||
string errMsg = e.ExceptionObject.ToString(); | |||
Logging.Error(errMsg); | |||
logger.Error(errMsg); | |||
MessageBox.Show( | |||
$"{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); | |||
@@ -115,7 +116,7 @@ namespace Shadowsocks | |||
if (Interlocked.Increment(ref exited) == 1) | |||
{ | |||
string errorMsg = $"Exception Detail: {Environment.NewLine}{e.Exception}"; | |||
Logging.Error(errorMsg); | |||
logger.Error(errorMsg); | |||
MessageBox.Show( | |||
$"{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); | |||
@@ -128,7 +129,7 @@ namespace Shadowsocks | |||
switch (e.Mode) | |||
{ | |||
case PowerModes.Resume: | |||
Logging.Info("os wake up"); | |||
logger.Info("os wake up"); | |||
if (MainController != null) | |||
{ | |||
System.Threading.Tasks.Task.Factory.StartNew(() => | |||
@@ -137,11 +138,11 @@ namespace Shadowsocks | |||
try | |||
{ | |||
MainController.Start(false); | |||
Logging.Info("controller started"); | |||
logger.Info("controller started"); | |||
} | |||
catch (Exception ex) | |||
{ | |||
Logging.LogUsefulException(ex); | |||
logger.LogUsefulException(ex); | |||
} | |||
}); | |||
} | |||
@@ -150,9 +151,9 @@ namespace Shadowsocks | |||
if (MainController != null) | |||
{ | |||
MainController.Stop(); | |||
Logging.Info("controller stopped"); | |||
logger.Info("controller stopped"); | |||
} | |||
Logging.Info("os suspend"); | |||
logger.Info("os suspend"); | |||
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__ = [ | |||
/// "|http://85.17.73.31/", | |||
/// "||agnesb.fr", | |||
@@ -106,154 +106,175 @@ namespace Shadowsocks.Properties { | |||
/// "||beeg.com", | |||
/// "||global.bing.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 | |||
///,,, | |||
///#Menu,,, | |||
///,,, | |||
///System Proxy,系统代理,系統代理,システムプロキシ | |||
///Disable,禁用,禁用,無効 | |||
///PAC,PAC 模式,PAC 模式,PAC | |||
///Global,全局模式,全局模式,全般 | |||
///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"> | |||
<value>..\Data\libsscrypto.dll.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |||
</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"> | |||
<value>..\data\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> | |||
</data> | |||
@@ -4,6 +4,7 @@ using System.Net.Sockets; | |||
using System.Text; | |||
using System.Text.RegularExpressions; | |||
using System.Threading; | |||
using NLog; | |||
using Shadowsocks.Controller; | |||
using Shadowsocks.Util.Sockets; | |||
@@ -11,6 +12,8 @@ namespace Shadowsocks.Proxy | |||
{ | |||
public class HttpProxy : IProxy | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private class FakeAsyncResult : IAsyncResult | |||
{ | |||
public readonly HttpState innerState; | |||
@@ -179,7 +182,7 @@ namespace Shadowsocks.Proxy | |||
private bool OnLineRead(string line, object state) | |||
{ | |||
Logging.Debug(line); | |||
logger.Debug(line); | |||
if (_respondLineCount == 0) | |||
{ | |||
@@ -1,6 +1,7 @@ | |||
using System; | |||
using System.Diagnostics; | |||
using System.Runtime.InteropServices; | |||
using NLog; | |||
using Shadowsocks.Controller; | |||
namespace Shadowsocks.Util.ProcessManagement | |||
@@ -11,6 +12,8 @@ namespace Shadowsocks.Util.ProcessManagement | |||
*/ | |||
public class Job : IDisposable | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private IntPtr handle = IntPtr.Zero; | |||
public Job() | |||
@@ -54,7 +57,7 @@ namespace Shadowsocks.Util.ProcessManagement | |||
if (!succ) | |||
{ | |||
Logging.Error("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); | |||
logger.Error("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); | |||
} | |||
return succ; | |||
@@ -1,4 +1,5 @@ | |||
using Newtonsoft.Json; | |||
using NLog; | |||
using Shadowsocks.Controller; | |||
using Shadowsocks.Model; | |||
using Shadowsocks.Properties; | |||
@@ -14,6 +15,8 @@ namespace Shadowsocks.Util.SystemProxy | |||
{ | |||
public static class Sysproxy | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private const string _userWininetConfigFile = "user-wininet.json"; | |||
private readonly static string[] _lanIP = { | |||
@@ -70,7 +73,7 @@ namespace Shadowsocks.Util.SystemProxy | |||
} | |||
catch (IOException e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
} | |||
@@ -233,7 +236,7 @@ namespace Shadowsocks.Util.SystemProxy | |||
} | |||
catch (IOException e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
} | |||
} | |||
@@ -1,4 +1,5 @@ | |||
using System; | |||
using NLog; | |||
using System; | |||
using System.Diagnostics; | |||
using System.IO; | |||
using System.IO.Compression; | |||
@@ -26,6 +27,8 @@ namespace Shadowsocks.Util | |||
public static class Utils | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
private static string _tempPath = null; | |||
// return path to store temporary files | |||
@@ -48,7 +51,7 @@ namespace Shadowsocks.Util | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.Error(e); | |||
logger.Error(e); | |||
throw; | |||
} | |||
} | |||
@@ -58,7 +61,7 @@ namespace Shadowsocks.Util | |||
public enum WindowsThemeMode { Dark, Light } | |||
// Support on Windows 10 1903+ | |||
public static WindowsThemeMode GetWindows10SystemThemeSetting(bool isVerbose) | |||
public static WindowsThemeMode GetWindows10SystemThemeSetting() | |||
{ | |||
WindowsThemeMode themeMode = WindowsThemeMode.Dark; | |||
try | |||
@@ -78,11 +81,10 @@ namespace Shadowsocks.Util | |||
} | |||
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; | |||
} | |||
@@ -251,7 +253,7 @@ namespace Shadowsocks.Util | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
logger.LogUsefulException(e); | |||
return null; | |||
} | |||
} | |||
@@ -11,11 +11,14 @@ using Shadowsocks.Properties; | |||
using Shadowsocks.Model; | |||
using Shadowsocks.Util; | |||
using System.Text; | |||
using NLog; | |||
namespace Shadowsocks.View | |||
{ | |||
public partial class LogForm : Form | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
long lastOffset; | |||
string filename; | |||
Timer timer; | |||
@@ -38,13 +41,27 @@ namespace Shadowsocks.View | |||
TextAnnotation outboundAnnotation = new TextAnnotation(); | |||
#endregion | |||
public LogForm(ShadowsocksController controller, string filename) | |||
public LogForm(ShadowsocksController controller) | |||
{ | |||
this.controller = controller; | |||
this.filename = filename; | |||
InitializeComponent(); | |||
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; | |||
topMostTrigger = config.topMost; | |||
@@ -158,6 +175,8 @@ namespace Shadowsocks.View | |||
private void InitContent() | |||
{ | |||
if (string.IsNullOrEmpty(filename)) | |||
return; | |||
using (StreamReader reader = new StreamReader(new FileStream(filename, | |||
FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) | |||
{ | |||
@@ -170,7 +189,7 @@ namespace Shadowsocks.View | |||
string line = ""; | |||
StringBuilder appendText = new StringBuilder(1024); | |||
while ((line = reader.ReadLine()) != null) | |||
appendText.Append(line + Environment.NewLine); | |||
appendText.AppendLine(line); | |||
LogMessageTextBox.AppendText(appendText.ToString()); | |||
LogMessageTextBox.ScrollToCaret(); | |||
@@ -181,6 +200,11 @@ namespace Shadowsocks.View | |||
private void UpdateContent() | |||
{ | |||
this.Text = I18N.GetString("Log Viewer") + | |||
$" [in: {Utils.FormatBytes(controller.InboundCounter)}, out: {Utils.FormatBytes(controller.OutboundCounter)}]"; | |||
if (string.IsNullOrEmpty(filename)) | |||
return; | |||
try | |||
{ | |||
using (StreamReader reader = new StreamReader(new FileStream(filename, | |||
@@ -194,7 +218,7 @@ namespace Shadowsocks.View | |||
while ((line = reader.ReadLine()) != null) | |||
{ | |||
changed = true; | |||
appendText.Append(line + Environment.NewLine); | |||
appendText.AppendLine(line); | |||
} | |||
if (changed) | |||
@@ -209,9 +233,6 @@ namespace Shadowsocks.View | |||
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) | |||
@@ -270,7 +291,7 @@ namespace Shadowsocks.View | |||
private void OpenLocationMenuItem_Click(object sender, EventArgs e) | |||
{ | |||
string argument = "/select, \"" + filename + "\""; | |||
Logging.Debug(argument); | |||
logger.Debug(argument); | |||
System.Diagnostics.Process.Start("explorer.exe", argument); | |||
} | |||
@@ -287,7 +308,11 @@ namespace Shadowsocks.View | |||
#region Clean up the content in LogMessageTextBox. | |||
private void DoClearLogs() | |||
{ | |||
Logging.Clear(); | |||
try | |||
{ | |||
File.Delete(filename); | |||
} | |||
catch { } | |||
lastOffset = 0; | |||
LogMessageTextBox.Clear(); | |||
} | |||
@@ -317,7 +342,7 @@ namespace Shadowsocks.View | |||
} | |||
catch (Exception ex) | |||
{ | |||
Logging.LogUsefulException(ex); | |||
logger.LogUsefulException(ex); | |||
MessageBox.Show(ex.Message); | |||
} | |||
} | |||
@@ -1,4 +1,5 @@ | |||
using Shadowsocks.Controller; | |||
using NLog; | |||
using Shadowsocks.Controller; | |||
using Shadowsocks.Model; | |||
using Shadowsocks.Properties; | |||
using Shadowsocks.Util; | |||
@@ -17,6 +18,7 @@ namespace Shadowsocks.View | |||
{ | |||
public class MenuViewController | |||
{ | |||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||
// yes this is just a menu view controller | |||
// when config form is closed, it moves away from RAM | |||
// and it should just do anything related to the config form | |||
@@ -220,7 +222,7 @@ namespace Shadowsocks.View | |||
{ | |||
Color colorMask = Color.White; | |||
Utils.WindowsThemeMode currentWindowsThemeMode = Utils.GetWindows10SystemThemeSetting(controller.GetCurrentConfiguration().isVerboseLogging); | |||
Utils.WindowsThemeMode currentWindowsThemeMode = Utils.GetWindows10SystemThemeSetting(); | |||
if (isProxyEnabled) | |||
{ | |||
@@ -386,7 +388,7 @@ namespace Shadowsocks.View | |||
void controller_UpdatePACFromGFWListError(object sender, System.IO.ErrorEventArgs e) | |||
{ | |||
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) | |||
@@ -543,7 +545,7 @@ namespace Shadowsocks.View | |||
} | |||
else | |||
{ | |||
logForm = new LogForm(controller, Logging.LogFilePath); | |||
logForm = new LogForm(controller); | |||
logForm.Show(); | |||
logForm.Activate(); | |||
logForm.FormClosed += logForm_FormClosed; | |||
@@ -5,6 +5,7 @@ | |||
<package id="Fody" version="4.2.1" targetFramework="net472" developmentDependency="true" /> | |||
<package id="GlobalHotKey" version="1.1.0" 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="ZXing.Net" version="0.16.5" targetFramework="net472" /> | |||
</packages> |
@@ -82,12 +82,21 @@ | |||
<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> | |||
</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="System" /> | |||
<Reference Include="System.Configuration" /> | |||
<Reference Include="System.Data" /> | |||
<Reference Include="System.Data.DataSetExtensions" /> | |||
<Reference Include="System.Drawing" /> | |||
<Reference Include="System.IO.Compression" /> | |||
<Reference Include="System.Management" /> | |||
<Reference Include="System.Net" /> | |||
<Reference Include="System.Runtime.Serialization" /> | |||
<Reference Include="System.ServiceModel" /> | |||
<Reference Include="System.Transactions" /> | |||
<Reference Include="System.Web" /> | |||
<Reference Include="System.Windows.Forms" /> | |||
<Reference Include="System.Windows.Forms.DataVisualization" /> | |||
@@ -102,6 +111,7 @@ | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Compile Include="Controller\HotkeyReg.cs" /> | |||
<Compile Include="Controller\LoggerExtension.cs" /> | |||
<Compile Include="Controller\Service\PACDaemon.cs" /> | |||
<Compile Include="Controller\System\Hotkeys\HotkeyCallbacks.cs" /> | |||
<Compile Include="Encryption\AEAD\AEADEncryptor.cs" /> | |||
@@ -122,6 +132,7 @@ | |||
<Compile Include="Encryption\Stream\StreamOpenSSLEncryptor.cs" /> | |||
<Compile Include="Encryption\Stream\StreamSodiumEncryptor.cs" /> | |||
<Compile Include="Model\HotKeyConfig.cs" /> | |||
<Compile Include="Model\NLogConfig.cs" /> | |||
<Compile Include="Model\ProxyConfig.cs" /> | |||
<Compile Include="Model\SysproxyConfig.cs" /> | |||
<Compile Include="Properties\Resources.Designer.cs"> | |||
@@ -145,7 +156,6 @@ | |||
<Compile Include="Controller\Service\GFWListUpdater.cs" /> | |||
<Compile Include="Controller\I18N.cs" /> | |||
<Compile Include="Controller\Service\Listener.cs" /> | |||
<Compile Include="Controller\Logging.cs" /> | |||
<Compile Include="Controller\Service\PortForwarder.cs" /> | |||
<Compile Include="Controller\Service\UDPRelay.cs" /> | |||
<Compile Include="Controller\Service\UpdateChecker.cs" /> | |||
@@ -257,6 +267,7 @@ | |||
</None> | |||
<None Include="Data\i18n.csv" /> | |||
<None Include="Data\libsscrypto.dll.gz" /> | |||
<None Include="Data\NLog.config" /> | |||
<None Include="Data\privoxy.exe.gz" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
@@ -1,7 +1,7 @@ | |||
| |||
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 | |||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "shadowsocks-csharp", "shadowsocks-csharp\shadowsocks-csharp.csproj", "{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}" | |||
EndProject | |||
@@ -12,21 +12,30 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShadowsocksTest", "test\Sha | |||
EndProject | |||
Global | |||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
Debug|Any CPU = Debug|Any CPU | |||
Debug|x86 = Debug|x86 | |||
Release|Any CPU = Release|Any CPU | |||
Release|x86 = Release|x86 | |||
EndGlobalSection | |||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|Any CPU.ActiveCfg = Debug|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.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.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.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.Build.0 = Release|x86 | |||
EndGlobalSection | |||
GlobalSection(SolutionProperties) = preSolution | |||
HideSolutionNode = FALSE | |||
EndGlobalSection | |||
GlobalSection(ExtensibilityGlobals) = postSolution | |||
SolutionGuid = {F7E7D35B-4FDA-4385-95CF-09DADED042EA} | |||
EndGlobalSection | |||
EndGlobal |