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); }
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); }
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); }
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); }
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); }
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); }
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)); }
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")); } }
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 { } }
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; } }
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); }
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(); }
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)); }
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); }
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); }