private static void ImportUsers()
 {
     if (allConf["user-conf"].Count >= 1)
     {
         string pathOfUsersConf = allConf["user-conf"][0];
         if (File.Exists(pathOfUsersConf))
         {
             string usersText = File.ReadAllText(pathOfUsersConf);
             usersText = usersText.Replace("\r\n", "\n");
             string[] usersArray = usersText.Split('\n');
             usersArray = Format(usersArray);
             foreach (string line in usersArray)
             {
                 if (EagleTunnelUser.TryParse(line, out EagleTunnelUser user))
                 {
                     if (!Users.ContainsKey(user.ID))
                     {
                         Users.Add(user.ID, user);
                     }
                 }
             }
         }
         else
         {
             Console.WriteLine("user-conf file not found: {0}", pathOfUsersConf);
         }
     }
 }
        private static EagleTunnelUser CheckAuthen(Tunnel tunnel)
        {
            EagleTunnelUser result = null;

            if (Conf.allConf.ContainsKey("user-check") && Conf.allConf["user-check"][0] == "on")
            {
                string req = tunnel.ReadStringL();
                if (!string.IsNullOrEmpty(req))
                {
                    if (EagleTunnelUser.TryParse(req, out EagleTunnelUser user, false))
                    {
                        result = EagleTunnelUser.Check(user.ID, user.Password);
                    }
                }
                string reply = result != null ? "valid" : "invalid";
                result = tunnel.WriteL(reply) ? result : null;
            }
            else
            {
                if (EagleTunnelUser.users.ContainsKey("anonymous"))
                {
                    result = EagleTunnelUser.users["anonymous"];
                }
            }
            return(result);
        }
        private static bool CheckAuthen(Tunnel tunnel)
        {
            bool result = false;

            if (!Conf.allConf.ContainsKey("user-conf"))
            {
                result = true;
            }
            else
            {
                byte[] buffer = new byte[100];
                string req    = tunnel.ReadStringL();
                if (!string.IsNullOrEmpty(req))
                {
                    if (EagleTunnelUser.TryParse(req, out EagleTunnelUser user))
                    {
                        if (Conf.Users.ContainsKey(user.ID))
                        {
                            result = Conf.Users[user.ID].CheckAuthen(user.Password);
                        }
                    }
                }
                string reply = result ? "valid" : "invalid";
                result &= tunnel.WriteL(reply);
            }
            return(result);
        }
        public static void Init(string confPath = "/etc/eagle-tunnel.conf")
        {
            allConf = new Dictionary <string, List <string> > (StringComparer.OrdinalIgnoreCase);
            ReadAll(confPath);

            if (allConf.ContainsKey("user-conf"))
            {
                Users =
                    new Dictionary <string, EagleTunnelUser> ();
                ImportUsers();
                Console.WriteLine("find user(s): {0}", Users.Count);
            }

            LocalUser = null;
            if (allConf.ContainsKey("user"))
            {
                if (EagleTunnelUser.TryParse(allConf["user"][0], out EagleTunnelUser user))
                {
                    LocalUser = user;
                }
            }
            if (LocalUser != null)
            {
                Console.WriteLine("User: {0}", LocalUser.ID);
            }

            maxClientsCount = 200;
            if (allConf.ContainsKey("worker"))
            {
                if (int.TryParse(allConf["worker"][0], out int workerCount))
                {
                    maxClientsCount = workerCount;
                }
            }
            Console.WriteLine("worker: {0}", maxClientsCount);

            remoteAddresses = null;
            try {
                List <string> remoteAddressStrs = Conf.allConf["relayer"];
                remoteAddresses = CreateEndPoints(remoteAddressStrs);
            } catch (KeyNotFoundException) {
                Console.WriteLine("`Relayer` not found.");
            }
            if (remoteAddresses != null)
            {
                Console.WriteLine("Count of `Relayer`: {0}", remoteAddresses.Length);
            }
            localAddresses = null;
            try {
                List <string> localAddressStrs = Conf.allConf["listen"];
                localAddresses = CreateEndPoints(localAddressStrs);
                lockOfIndex    = new object();
            } catch (KeyNotFoundException) {
                Console.WriteLine("`Listen` not found");
            }

            if (allConf.ContainsKey("socks"))
            {
                if (allConf["socks"][0] == "on")
                {
                    EnableSOCKS = true;
                }
            }
            Console.WriteLine("SOCKS Switch: {0}", EnableSOCKS.ToString());

            if (allConf.ContainsKey("http"))
            {
                if (allConf["http"][0] == "on")
                {
                    EnableHTTP = true;
                }
            }
            Console.WriteLine("HTTP Switch: {0}", EnableHTTP.ToString());

            if (allConf.ContainsKey("eagle tunnel"))
            {
                if (allConf["eagle tunnel"][0] == "on")
                {
                    EnableEagleTunnel = true;
                }
            }
            Console.WriteLine("Eagle Tunnel Switch: {0}", EnableEagleTunnel.ToString());
        }
        public static void Init(string confPath)
        {
            allConf      = new ConcurrentDictionary <string, List <string> > (StringComparer.OrdinalIgnoreCase);
            confFilePath = confPath;
            ReadAll();

            ImportUsers();
            Console.WriteLine("find user(s): {0}", EagleTunnelUser.users.Count);

            encryptionKey = 0x22;
            if (allConf.ContainsKey("data-key"))
            {
                if (byte.TryParse(allConf["data-key"][0], out byte tmpByte))
                {
                    encryptionKey = tmpByte;
                }
            }

            if (allConf.ContainsKey("user"))
            {
                if (EagleTunnelUser.TryParse(allConf["user"][0], out EagleTunnelUser user, true))
                {
                    localUser = user;
                }
            }
            if (LocalUser != null)
            {
                Console.WriteLine("User: {0}", LocalUser.ID);
            }

            PipeTimeOut = 0;
            if (Conf.allConf.ContainsKey("timeout"))
            {
                if (int.TryParse(Conf.allConf["timeout"][0], out int timeout))
                {
                    PipeTimeOut = timeout;
                }
            }
            Console.WriteLine("TimeOut(ms): {0} (0 means infinite timeout period.)", PipeTimeOut);

            maxClientsCount = 500;
            if (allConf.ContainsKey("worker"))
            {
                if (int.TryParse(allConf["worker"][0], out int workerCount))
                {
                    maxClientsCount = workerCount;
                }
            }
            Console.WriteLine("worker: {0}", maxClientsCount);

            try
            {
                List <string> remoteAddressStrs = Conf.allConf["relayer"];
                remoteAddresses = CreateEndPoints(remoteAddressStrs);
            }
            catch (KeyNotFoundException)
            {
                Console.WriteLine("Warning: Relayer not found.");
            }
            if (RemoteAddresses != null)
            {
                Console.WriteLine("Count of Relayer: {0}", RemoteAddresses.Length);
            }

            try
            {
                List <string> localAddressStrs = Conf.allConf["listen"];
                localAddresses = CreateEndPoints(localAddressStrs);
            }
            catch (KeyNotFoundException)
            {
                Console.WriteLine("Warning: Listen not found");
            }

            if (allConf.ContainsKey("socks"))
            {
                if (allConf["socks"][0] == "on")
                {
                    enableSOCKS = true;
                }
            }
            Console.WriteLine("SOCKS Switch: {0}", EnableSOCKS.ToString());

            if (allConf.ContainsKey("http"))
            {
                if (allConf["http"][0] == "on")
                {
                    enableHTTP = true;
                }
            }
            Console.WriteLine("HTTP Switch: {0}", EnableHTTP.ToString());

            if (allConf.ContainsKey("et"))
            {
                if (allConf["et"][0] == "on")
                {
                    enableEagleTunnel = true;
                }
            }
            Console.WriteLine("Eagle Tunnel Switch: {0}", EnableEagleTunnel.ToString());

            if (allConf.ContainsKey("proxy-status"))
            {
                proxyStatus = (ProxyStatus)Enum.Parse(typeof(Conf.ProxyStatus),
                                                      allConf["proxy-status"][0].ToUpper());
            }
            else
            {
                proxyStatus = ProxyStatus.ENABLE; // default enable proxy
            }
            Console.WriteLine("Proxy Status: {0}", proxyStatus.ToString());
            ImportList("whitelist_domain.txt", out whitelist_domain);
            ImportList("whitelist_ip.txt", out whitelist_ip);
            ImportList("blacklist_ip.txt", out blacklist_ip);
            ImportHosts(out hosts);
        }