Пример #1
0
        JObject Vmess2Config(Model.Data.Vmess vmess)
        {
            if (vmess == null)
            {
                return(null);
            }

            // prepare template
            var config = cache.tpl.LoadTemplate("tplImportVmess") as JObject;

            config["v2raygcon"]["alias"] = vmess.ps;

            var outVmess = cache.tpl.LoadTemplate("outbVmess");

            outVmess["streamSettings"] = GenStreamSetting(vmess);
            var node = outVmess["settings"]["vnext"][0];

            node["address"]             = vmess.add;
            node["port"]                = Lib.Utils.Str2Int(vmess.port);
            node["users"][0]["id"]      = vmess.id;
            node["users"][0]["alterId"] = Lib.Utils.Str2Int(vmess.aid);

            var isV4    = setting.isUseV4;
            var inbound = Lib.Utils.CreateJObject(
                (isV4 ? "inbounds.0" : "inbound"),
                cache.tpl.LoadTemplate("inbSimSock"));

            var outbound = Lib.Utils.CreateJObject(
                (isV4 ? "outbounds.0" : "outbound"),
                outVmess);

            Lib.Utils.MergeJson(ref config, inbound);
            Lib.Utils.MergeJson(ref config, outbound);
            return(config.DeepClone() as JObject);
        }
Пример #2
0
        public static Model.Data.Vmess ConfigString2Vmess(string config)
        {
            Model.Data.Vmess vmess = new Model.Data.Vmess();
            JObject          json;

            try
            {
                json = JObject.Parse(config);
            }
            catch
            {
                return(null);
            }

            var GetStr = HelperGetStringByPrefixAndKey(json);

            vmess.ps = GetStr("v2raygcon", "alias");

            var prefix = "outbound.settings.vnext.0";

            vmess.add  = GetStr(prefix, "address");
            vmess.port = GetStr(prefix, "port");
            vmess.id   = GetStr(prefix, "users.0.id");
            vmess.aid  = GetStr(prefix, "users.0.alterId");

            prefix     = "outbound.streamSettings";
            vmess.net  = GetStr(prefix, "network");
            vmess.type = GetStr(prefix, "kcpSettings.header.type");
            vmess.host = GetStr(prefix, "wsSettings.path");
            vmess.tls  = GetStr(prefix, "security");
            return(vmess);
        }
Пример #3
0
        JToken GenStreamSetting(Model.Data.Vmess vmess)
        {
            // insert stream type
            string[] streamTypes = { "ws", "tcp", "kcp", "h2", "quic" };
            string   streamType  = vmess.net.ToLower();

            if (!streamTypes.Contains(streamType))
            {
                return(JToken.Parse(@"{}"));
            }

            if (streamType == "tcp" && vmess.type == "http")
            {
                streamType = "tcp_http";
            }
            var streamToken = cache.tpl.LoadTemplate(streamType);

            try
            {
                FillStreamSettingsDetail(vmess, streamType, streamToken);
            }
            catch { }

            try
            {
                streamToken["security"] = (vmess.tls?.ToLower() == "tls") ? "tls" : "none";
            }
            catch { }

            return(streamToken);
        }
Пример #4
0
        List <Tuple <Model.Data.Vmess, string> > GenVmessTestData()
        {
            var data = new List <Tuple <Model.Data.Vmess, string> >();

            var vmessStandard = new Model.Data.Vmess
            {
                v    = "2",
                add  = "1.2.3.4",
                port = "1234",
                id   = "0",
                ps   = "standard",
            };

            var linkStandard = vmessStandard.ToVmessLink();

            var vmessNonStandard = new Model.Data.Vmess
            {
                v    = "2",
                add  = "1.2.3.4",
                port = "1234",
                id   = "0",
                ps   = "standard",
            };

            var linkNonStandard = vmessStandard.ToVmessLink().Replace(@"=", @"");

            data.Add(new Tuple <Model.Data.Vmess, string>(vmessStandard, linkStandard));
            data.Add(new Tuple <Model.Data.Vmess, string>(vmessNonStandard, linkNonStandard));
            return(data);
        }
Пример #5
0
        JToken GenStreamSetting(Model.Data.Vmess vmess)
        {
            // insert stream type
            string[] streamTypes = { "ws", "tcp", "kcp", "h2", "quic" };
            string   streamType  = vmess.net.ToLower();

            if (!streamTypes.Contains(streamType))
            {
                return(JToken.Parse(@"{}"));
            }

            var cmin        = Resource.Resx.StrConst.config_min;
            var streamToken = cache.tpl.LoadTemplate(streamType);

            try
            {
                switch (streamType)
                {
                case "quic":
                    streamToken["quicSettings"]["header"]["type"] = vmess.type; // quic.type
                    streamToken["quicSettings"]["security"]       = vmess.host; // quic.security
                    streamToken["quicSettings"]["key"]            = vmess.path; // quic.key
                    break;

                case "tcp":
                    streamToken["tcpSettings"]["header"]["type"] = vmess.type;
                    break;

                case "kcp":
                    streamToken["kcpSettings"]["header"]["type"] = vmess.type;
                    break;

                case "ws":
                    streamToken["wsSettings"]["path"] =
                        string.IsNullOrEmpty(vmess.v) ? vmess.host : vmess.path;
                    if (vmess.v == "2" && !string.IsNullOrEmpty(vmess.host))
                    {
                        streamToken["wsSettings"]["headers"]["Host"] = vmess.host;
                    }
                    break;

                case "h2":
                    streamToken["httpSettings"]["path"] = vmess.path;
                    streamToken["httpSettings"]["host"] = Lib.Utils.Str2JArray(vmess.host);
                    break;
                }
            }
            catch { }

            try
            {
                streamToken["security"] =
                    vmess.tls?.ToLower() == "tls" ?
                    "tls" : "none";
            }
            catch { }

            return(streamToken);
        }
Пример #6
0
        public static Model.Data.Vmess ConfigString2Vmess(string config)
        {
            JObject json;

            try
            {
                json = JObject.Parse(config);
            }
            catch
            {
                return(null);
            }

            var GetStr = GetStringByPrefixAndKeyHelper(json);

            Model.Data.Vmess vmess = new Model.Data.Vmess
            {
                v  = "2",
                ps = GetStr("v2raygcon", "alias")
            };

            var isUseV4 = (GetStr("outbounds.0", "protocol")?.ToLower()) == "vmess";
            var root    = isUseV4 ? "outbounds.0" : "outbound";

            var prefix = root + "." + "settings.vnext.0";

            vmess.add  = GetStr(prefix, "address");
            vmess.port = GetStr(prefix, "port");
            vmess.id   = GetStr(prefix, "users.0.id");
            vmess.aid  = GetStr(prefix, "users.0.alterId");

            prefix     = root + "." + "streamSettings";
            vmess.net  = GetStr(prefix, "network");
            vmess.type = GetStr(prefix, "kcpSettings.header.type");
            vmess.tls  = GetStr(prefix, "security");

            switch (vmess.net)
            {
            case "ws":
                vmess.path = GetStr(prefix, "wsSettings.path");
                vmess.host = GetStr(prefix, "wsSettings.headers.Host");
                break;

            case "h2":
                try
                {
                    vmess.path = GetStr(prefix, "httpSettings.path");
                    var hosts = isUseV4 ?
                                json["outbounds"][0]["streamSettings"]["httpSettings"]["host"] :
                                json["outbound"]["streamSettings"]["httpSettings"]["host"];
                    vmess.host = JArray2Str(hosts as JArray);
                }
                catch { }
                break;
            }
            return(vmess);
        }
Пример #7
0
        public static string Vmess2VmessLink(Model.Data.Vmess vmess)
        {
            if (vmess == null)
            {
                return(string.Empty);
            }

            string content = JsonConvert.SerializeObject(vmess);

            return(AddLinkPrefix(
                       Base64Encode(content),
                       Model.Data.Enum.LinkTypes.vmess));
        }
Пример #8
0
 Model.Data.Vmess ExtractBasicInfo(
     Func <string, string, string> GetStr, string prefix)
 {
     Model.Data.Vmess vmess = new Model.Data.Vmess
     {
         v  = "2",
         ps = GetStr("v2raygcon", "alias")
     };
     vmess.add  = GetStr(prefix, "address");
     vmess.port = GetStr(prefix, "port");
     vmess.id   = GetStr(prefix, "users.0.id");
     vmess.aid  = GetStr(prefix, "users.0.alterId");
     return(vmess);
 }
        private void btnOK_Click(object sender, System.EventArgs e)
        {
            var vmess = new Model.Data.Vmess();

            vmess.add  = tboxHost.Text;
            vmess.port = tboxPort.Text;
            vmess.aid  = tboxAID.Text;
            vmess.id   = tboxUID.Text;
            vmess.ps   = tboxAlias.Text;

            if (rbtnWS.Checked)
            {
                vmess.net  = "ws";
                vmess.host = tboxWSPath.Text;
            }

            if (rbtnKCP.Checked)
            {
                vmess.net = "kcp";
                var index = Math.Max(0, cboxKCP.SelectedIndex);
                vmess.type = Model.Data.Table.kcpTypes[index];
            }

            if (rbtnTCP.Checked)
            {
                vmess.net = "tcp";
            }

            if (chkboxTLS.Checked)
            {
                vmess.tls = "tls";
            }

            var link = Lib.Utils.Vmess2VmessLink(vmess);

            if (setting.ImportLinks(link))
            {
                MessageBox.Show(I18N("AddServSuccess"));
                this.Close();
            }
            else
            {
                MessageBox.Show(I18N("AddServFail"));
            }
        }
Пример #10
0
 void ExtractTcpHttpSettings(JObject json, bool isUseV4, Model.Data.Vmess vmess)
 {
     try
     {
         var path = isUseV4 ?
                    json["outbounds"][0]["streamSettings"]["tcpSettings"]["header"]["request"]["path"] :
                    json["outbound"]["streamSettings"]["tcpSettings"]["header"]["request"]["path"];
         vmess.path = Lib.Utils.JArray2Str(path as JArray);
     }
     catch { }
     try
     {
         var hosts = isUseV4 ?
                     json["outbounds"][0]["streamSettings"]["tcpSettings"]["header"]["request"]["headers"]["Host"] :
                     json["outbound"]["streamSettings"]["tcpSettings"]["header"]["request"]["headers"]["Host"];
         vmess.host = Lib.Utils.JArray2Str(hosts as JArray);
     }
     catch { }
 }
Пример #11
0
        private static void FillStreamSettingsDetail(Model.Data.Vmess vmess, string streamType, JToken streamToken)
        {
            switch (streamType)
            {
            case "quic":
                streamToken["quicSettings"]["header"]["type"] = vmess.type; // quic.type
                streamToken["quicSettings"]["security"]       = vmess.host; // quic.security
                streamToken["quicSettings"]["key"]            = vmess.path; // quic.key
                break;

            case "tcp":
                // issue #7 should keep header.type = none
                // streamToken["tcpSettings"]["header"]["type"] = vmess.type;
                break;

            case "tcp_http":
                streamToken["tcpSettings"]["header"]["type"]            = vmess.type;
                streamToken["tcpSettings"]["header"]["request"]["path"] =
                    Lib.Utils.Str2JArray(string.IsNullOrEmpty(vmess.path) ? "/" : vmess.path);
                streamToken["tcpSettings"]["header"]["request"]["headers"]["Host"] =
                    Lib.Utils.Str2JArray(vmess.host);
                break;

            case "kcp":
                streamToken["kcpSettings"]["header"]["type"] = vmess.type;
                break;

            case "ws":
                streamToken["wsSettings"]["path"] =
                    string.IsNullOrEmpty(vmess.v) ? vmess.host : vmess.path;
                if (vmess.v == "2" && !string.IsNullOrEmpty(vmess.host))
                {
                    streamToken["wsSettings"]["headers"]["Host"] = vmess.host;
                }
                break;

            case "h2":
                streamToken["httpSettings"]["path"] = vmess.path;
                streamToken["httpSettings"]["host"] = Lib.Utils.Str2JArray(vmess.host);
                break;
            }
        }
Пример #12
0
        JToken GenStreamSetting(Model.Data.Vmess vmess)
        {
            // insert stream type
            string[] streamTypes = { "ws", "tcp", "kcp", "h2" };
            string   streamType  = vmess.net.ToLower();

            if (!streamTypes.Contains(streamType))
            {
                return(JToken.Parse(@"{}"));
            }

            var streamToken = cache.tpl.LoadTemplate(streamType);

            try
            {
                switch (streamType)
                {
                case "kcp":
                    streamToken["kcpSettings"]["header"]["type"] = vmess.type;
                    break;

                case "ws":
                    streamToken["wsSettings"]["path"] = string.IsNullOrEmpty(vmess.v) ? vmess.host : vmess.path;
                    if (vmess.v == "2" && !string.IsNullOrEmpty(vmess.host))
                    {
                        streamToken["wsSettings"]["headers"]["Host"] = vmess.host;
                    }
                    break;

                case "h2":
                    streamToken["httpSettings"]["path"] = vmess.path;
                    streamToken["httpSettings"]["host"] = Lib.Utils.Str2JArray(vmess.host);
                    break;
                }
            }
            catch { }

            return(streamToken);
        }
Пример #13
0
        private void btnOK_Click(object sender, System.EventArgs e)
        {
            // using vmess:// v1  do not need fix
            var vmess = new Model.Data.Vmess();

            vmess.add  = tboxHost.Text;
            vmess.port = tboxPort.Text;
            vmess.aid  = tboxAID.Text;
            vmess.id   = tboxUID.Text;
            vmess.ps   = tboxAlias.Text;

            if (rbtnWS.Checked)
            {
                vmess.net  = "ws";
                vmess.host = tboxWSPath.Text;
            }

            if (rbtnKCP.Checked)
            {
                vmess.net = "kcp";
                var index = Math.Max(0, cboxKCP.SelectedIndex);
                vmess.type = Model.Data.Table.kcpTypes[index];
            }

            if (rbtnTCP.Checked)
            {
                vmess.net = "tcp";
            }

            if (chkboxTLS.Checked)
            {
                vmess.tls = "tls";
            }

            var link = Lib.Utils.Vmess2VmessLink(vmess);

            servers.ImportLinks(link);
            this.Close();
        }
Пример #14
0
        Tuple <JObject, JToken> Vmess2Config(Model.Data.Vmess vmess)
        {
            if (vmess == null)
            {
                return(null);
            }

            var outVmess = cache.tpl.LoadTemplate("outbVmess");

            outVmess["streamSettings"] = GenStreamSetting(vmess);
            var node = outVmess["settings"]["vnext"][0];

            node["address"]             = vmess.add;
            node["port"]                = Lib.Utils.Str2Int(vmess.port);
            node["users"][0]["id"]      = vmess.id;
            node["users"][0]["alterId"] = Lib.Utils.Str2Int(vmess.aid);

            var tpl = cache.tpl.LoadTemplate("tplImportVmess") as JObject;

            tpl["v2raygcon"]["alias"] = vmess.ps;
            return(new Tuple <JObject, JToken>(tpl, outVmess));
        }
Пример #15
0
        public static JObject Vmess2Config(Model.Data.Vmess vmess)
        {
            if (vmess == null)
            {
                return(null);
            }

            // prepare template
            var config = cache.tpl.LoadTemplate("tplImportVmess");

            config["v2raygcon"]["alias"] = vmess.ps;

            var cPos = config["outbound"]["settings"]["vnext"][0];

            cPos["address"]             = vmess.add;
            cPos["port"]                = Lib.Utils.Str2Int(vmess.port);
            cPos["users"][0]["id"]      = vmess.id;
            cPos["users"][0]["alterId"] = Lib.Utils.Str2Int(vmess.aid);

            // insert stream type
            string[] streamTypes = { "ws", "tcp", "kcp", "h2" };
            string   streamType  = vmess.net.ToLower();

            if (!streamTypes.Contains(streamType))
            {
                return(config.DeepClone() as JObject);
            }

            config["outbound"]["streamSettings"] =
                cache.tpl.LoadTemplate(streamType);

            try
            {
                switch (streamType)
                {
                case "kcp":
                    config["outbound"]["streamSettings"]["kcpSettings"]["header"]["type"] = vmess.type;
                    break;

                case "ws":
                    config["outbound"]["streamSettings"]["wsSettings"]["path"] =
                        string.IsNullOrEmpty(vmess.v) ? vmess.host : vmess.path;
                    if (vmess.v == "2" && !string.IsNullOrEmpty(vmess.host))
                    {
                        config["outbound"]["streamSettings"]["wsSettings"]["headers"]["Host"] = vmess.host;
                    }
                    break;

                case "h2":
                    config["outbound"]["streamSettings"]["httpSettings"]["path"] = vmess.path;
                    config["outbound"]["streamSettings"]["httpSettings"]["host"] = Str2JArray(vmess.host);
                    break;
                }
            }
            catch { }

            try
            {
                // must place at the end. cos this key is add by streamSettings
                config["outbound"]["streamSettings"]["security"] = vmess.tls;
            }
            catch { }
            return(config.DeepClone() as JObject);
        }
Пример #16
0
        Model.Data.Vmess ConfigString2Vmess(string config)
        {
            if (!TryParseConfig(config, out JObject json))
            {
                return(null);
            }

            var GetStr = Lib.Utils.GetStringByPrefixAndKeyHelper(json);

            if (!TryDetectConfigVersion(GetStr, out bool isUseV4, out string root))
            {
                return(null);
            }

            var basicPrefix = root + "." + "settings.vnext.0";

            Model.Data.Vmess vmess = ExtractBasicInfo(GetStr, basicPrefix);

            var streamPrefix = root + "." + "streamSettings";

            vmess.net = GetStr(streamPrefix, "network");
            vmess.tls = GetStr(streamPrefix, "security");

            switch (vmess.net)
            {
            case "quic":
                vmess.type = GetStr(streamPrefix, "quicSettings.header.type");
                vmess.host = GetStr(streamPrefix, "quicSettings.security");
                vmess.path = GetStr(streamPrefix, "quicSettings.key");
                break;

            case "tcp":
                vmess.type = GetStr(streamPrefix, "tcpSettings.header.type");
                if (vmess.type?.ToLower() == "http")
                {
                    ExtractTcpHttpSettings(json, isUseV4, vmess);
                }
                break;

            case "kcp":
                vmess.type = GetStr(streamPrefix, "kcpSettings.header.type");
                break;

            case "ws":
                vmess.path = GetStr(streamPrefix, "wsSettings.path");
                vmess.host = GetStr(streamPrefix, "wsSettings.headers.Host");
                break;

            case "h2":
                try
                {
                    vmess.path = GetStr(streamPrefix, "httpSettings.path");
                    var hosts = isUseV4 ?
                                json["outbounds"][0]["streamSettings"]["httpSettings"]["host"] :
                                json["outbound"]["streamSettings"]["httpSettings"]["host"];
                    vmess.host = Lib.Utils.JArray2Str(hosts as JArray);
                }
                catch { }
                break;

            default:
                break;
            }
            return(vmess);
        }