diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpWebServerB.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpWebServerB.cs index 55310546..b3b43530 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/HttpWebServerB.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpWebServerB.cs @@ -2,6 +2,7 @@ using System.IO; using System.Net; using System.Net.Sockets; +using System.Text; using System.Threading; namespace v2rayN.HttpProxyHandler @@ -37,12 +38,42 @@ namespace v2rayN.HttpProxyHandler { if (listener != null) { - TcpClient client = listener.EndAcceptTcpClient(ares); + TcpClient tcpClient = listener.EndAcceptTcpClient(ares); listener.BeginAcceptTcpClient(callback, null); - if (client != null && _responderMethod != null) + if (tcpClient != null && _responderMethod != null) { - _responderMethod(client); + string pac = _responderMethod(tcpClient); + + NetworkStream netStream = tcpClient.GetStream(); + if (netStream.CanRead) + { + // Reads NetworkStream into a byte buffer. + byte[] bytes = new byte[tcpClient.ReceiveBufferSize]; + + // Read can return anything from 0 to numBytesToRead. + // This method blocks until at least one byte is read. + netStream.Read(bytes, 0, (int)tcpClient.ReceiveBufferSize); + + // Returns the data received from the host to the console. + string returndata = Encoding.UTF8.GetString(bytes); + if (!string.IsNullOrEmpty(returndata) + && returndata.IndexOf("/pac/") >= 0 + && netStream.CanWrite) + { + BinaryWriter writer = new BinaryWriter(netStream); + //writeSuccess(writer, pac); + + Byte[] sendBytes = Encoding.UTF8.GetBytes(writeSuccess(pac)); + writer.Write(sendBytes, 0, sendBytes.Length); + writer.Flush(); + + writer.Close(); + } + } + + netStream.Close(); + tcpClient.Close(); } } } @@ -64,6 +95,38 @@ namespace v2rayN.HttpProxyHandler listener = null; } } + + + //private static void writeSuccess(BinaryWriter writer, string pac) + //{ + // writer.Write("HTTP/1.0 200 OK"); + // writer.Write(Environment.NewLine); + // writer.Write("Content-Type:application/x-ns-proxy-autoconfig; charset=UTF-8"); + // writer.Write(Environment.NewLine); + // writer.Write("Content-Length: " + pac.Length); + // writer.Write(Environment.NewLine); + // writer.Write(Environment.NewLine); + // writer.Write(pac); + // writer.Flush(); + + //} + + private static string writeSuccess(string pac) + { + StringBuilder sb = new StringBuilder(); + string content_type = "application/x-ns-proxy-autoconfig"; + + sb.Append("HTTP/1.0 200 OK"); + sb.AppendLine(); + sb.Append(String.Format("Content-Type:{0};charset=utf-8", content_type)); + sb.AppendLine(); + //sb.Append("Connection: close"); + //sb.AppendLine(); + sb.Append(pac); + sb.AppendLine(); + + return sb.ToString(); + } } } diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpWebServerC.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpWebServerC.cs deleted file mode 100644 index d0842a27..00000000 --- a/v2rayN/v2rayN/HttpProxyHandler/HttpWebServerC.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.IO; -using System.Net; -using System.Net.Sockets; -using System.Threading; - -namespace v2rayN.HttpProxyHandler -{ - public class HttpWebServerC - { - private int port; - private TcpListener listener; - private bool is_active = true; - private string pacRespone = string.Empty; - - public HttpWebServerC(int port, string pacRespone) - { - this.port = port; - this.pacRespone = pacRespone; - } - - public void WorkThread() - { - is_active = true; - Listen(); - } - - public void Listen() - { - try - { - listener = new TcpListener(new IPEndPoint(IPAddress.Any, port)); - listener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - listener.Start(); - - Utils.SaveLog("WebserverB running..."); - - while (is_active) - { - TcpClient client = listener.AcceptTcpClient(); - //HttpWebProcessor processor = new HttpWebProcessor(client, pacRespone); - //Thread thread = new Thread(new ThreadStart(processor.process)); - //thread.Start(); - //Thread.Sleep(1); - } - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - } - - public void Stop() - { - if (listener != null) - { - is_active = false; - listener.Stop(); - listener = null; - } - } - } -} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs index f52c8107..74f4d3be 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs @@ -15,43 +15,26 @@ namespace v2rayN.HttpProxyHandler /// class PACServerHandle { - //private static Hashtable httpWebServer = new Hashtable(); - //private static Hashtable pacList = new Hashtable(); - - //private static string pac = ""; private static int pacPort = 0; - private static HttpWebServerB server; - // private static HttpWebServerC server; - //static Thread thread; + private static HttpWebServer server; + private static HttpWebServerB serverB; public static void Init(Config config) { - InitServer("127.0.0.1"); - //if (config.allowLANConn) - //{ - // List lstIPAddress = Utils.GetHostIPAddress(); - // if (lstIPAddress.Count <= 0) - // { - // return; - // } - // InitServer(lstIPAddress[0]); - // //foreach (string str in lstIPAddress) - // //{ - // // InitServer(str); - // //} - //} - //else - //{ - // InitServer("127.0.0.1"); - //} + if (Utils.IsAdministrator()) + { + InitServer("127.0.0.1"); + } + else + { + InitServerB("127.0.0.1"); + } } public static void InitServer(string address) { try { - //pac = GetPacList(address); - if (pacPort != Global.pacPort) { if (server != null) @@ -62,44 +45,66 @@ namespace v2rayN.HttpProxyHandler if (server == null) { - server = new HttpWebServerB(Global.pacPort, SendResponse); - //server = new HttpWebServerC(Global.pacPort, pac); + string prefixes = string.Format("http://{0}:{1}/pac/", "+", Global.pacPort); + Utils.SaveLog("Webserver prefixes " + prefixes); + + HttpWebServer ws = new HttpWebServer(SendResponse, prefixes); + ws.Run(); + pacPort = Global.pacPort; } } - - //thread = new Thread(server.WorkThread); - //thread.IsBackground = true; - //thread.Start(); Utils.SaveLog("Webserver at " + address); } catch (Exception ex) { Utils.SaveLog("Webserver InitServer " + ex.Message); } - - // if (!pacList.ContainsKey(address)) - // { - // pacList.Add(address, GetPacList(address)); - // } - - // string prefixes = string.Format("http://{0}:{1}/pac/", address, Global.pacPort); - // Utils.SaveLog("Webserver prefixes " + prefixes); - - // HttpWebServer ws = new HttpWebServer(SendResponse, prefixes); - // ws.Run(); - - // if (!httpWebServer.ContainsKey(address) && ws != null) - // { - // httpWebServer.Add(address, ws); - // } - //} - //catch (Exception ex) - //{ - // Utils.SaveLog("Webserver InitServer " + ex.Message); - //} } + + public static void InitServerB(string address) + { + try + { + if (pacPort != Global.pacPort) + { + if (serverB != null) + { + serverB.Stop(); + serverB = null; + } + + if (serverB == null) + { + serverB = new HttpWebServerB(Global.pacPort, SendResponse); + pacPort = Global.pacPort; + } + } + Utils.SaveLog("Webserver at " + address); + } + catch (Exception ex) + { + Utils.SaveLog("Webserver InitServer " + ex.Message); + } + } + + public static string SendResponse(HttpListenerRequest request) + { + try + { + string address = request.LocalEndPoint.Address.ToString(); + var pac = GetPacList(address); + return pac; + } + catch (Exception ex) + { + Utils.SaveLog("Webserver SendResponse " + ex.Message); + return ex.Message; + } + } + + public static string SendResponse(TcpClient tcpClient) { try @@ -108,33 +113,9 @@ namespace v2rayN.HttpProxyHandler var pac = GetPacList(address); Console.WriteLine("SendResponse addr " + address); - Utils.SaveLog("SendResponse addr " + address); - - NetworkStream netStream = tcpClient.GetStream(); - if (netStream.CanRead) - { - // Reads NetworkStream into a byte buffer. - byte[] bytes = new byte[tcpClient.ReceiveBufferSize]; - - // Read can return anything from 0 to numBytesToRead. - // This method blocks until at least one byte is read. - netStream.Read(bytes, 0, (int)tcpClient.ReceiveBufferSize); - - // Returns the data received from the host to the console. - string returndata = Encoding.UTF8.GetString(bytes); - if (!string.IsNullOrEmpty(returndata) - && returndata.IndexOf("/pac/") >= 0 - && netStream.CanWrite) - { - - Byte[] sendBytes = Encoding.UTF8.GetBytes(writeSuccess(pac)); - netStream.Write(sendBytes, 0, sendBytes.Length); - } - } - - netStream.Close(); - tcpClient.Close(); - return ""; + //Utils.SaveLog("SendResponse addr " + address); + + return pac; } catch (Exception ex) { @@ -144,44 +125,6 @@ namespace v2rayN.HttpProxyHandler } - private static string writeSuccess(string pac) - { - StringBuilder sb = new StringBuilder(); - string content_type = "application/x-ns-proxy-autoconfig"; - - sb.Append("HTTP/1.0 200 OK"); - sb.AppendLine(); - sb.Append(String.Format("Content-Type:{0};charset=utf-8", content_type)); - sb.AppendLine(); - sb.Append("Connection: close"); - sb.AppendLine(); - sb.Append(pac); - sb.AppendLine(); - - return sb.ToString(); - } - - /* - public static string SendResponse(HttpListenerRequest request) - { - try - { - string[] arrAddress = request.UserHostAddress.Split(':'); - string address = "127.0.0.1"; - if (arrAddress.Length > 0) - { - address = arrAddress[0]; - } - return pacList[address].ToString(); - } - catch (Exception ex) - { - Utils.SaveLog("Webserver SendResponse " + ex.Message); - return ex.Message; - } - } - */ - public static void Stop() { //try diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 5aec7833..5e3d85a2 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Microsoft")] [assembly: AssemblyProduct("v2rayN")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2018")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -33,4 +33,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("2.34")] +[assembly: AssemblyFileVersion("2.35")] diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index d78cb10e..f206454d 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -17,6 +17,7 @@ using System.Drawing; using ZXing; using ZXing.Common; using ZXing.QrCode; +using System.Security.Principal; namespace v2rayN { @@ -671,6 +672,25 @@ namespace v2rayN return string.Empty; } + /// + /// IsAdministrator + /// + /// + public static bool IsAdministrator() + { + try + { + WindowsIdentity current = WindowsIdentity.GetCurrent(); + WindowsPrincipal windowsPrincipal = new WindowsPrincipal(current); + //WindowsBuiltInRole可以枚举出很多权限,例如系统用户、User、Guest等等 + return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator); + } + catch + { + return false; + } + } + #endregion #region TempPath diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 8fafdba5..a27c4be7 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -145,11 +145,11 @@ - +