Example #1
0
        /// <summary>
        /// 从剪贴板导入URL
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static VmessItem ImportFromClipboardConfig(string clipboardData, out string msg)
        {
            msg = string.Empty;
            VmessItem vmessItem = new VmessItem();

            try
            {
                //载入配置文件
                string result = clipboardData.Trim();// Utils.GetClipboardData();
                if (Utils.IsNullOrEmpty(result))
                {
                    msg = "读取配置文件失败";
                    return(null);
                }

                if (result.StartsWith(Global.vmessProtocol))
                {
                    int indexSplit = result.IndexOf("?");
                    if (indexSplit > 0)
                    {
                        vmessItem = ResolveVmess4Kitsunebi(result);
                    }
                    else
                    {
                        vmessItem.configType = (int)EConfigType.Vmess;
                        result = result.Substring(Global.vmessProtocol.Length);
                        result = Utils.Base64Decode(result);

                        //转成Json
                        VmessQRCode vmessQRCode = Utils.FromJson <VmessQRCode>(result);
                        if (vmessQRCode == null)
                        {
                            msg = "转换配置文件失败";
                            return(null);
                        }
                        vmessItem.security   = Global.DefaultSecurity;
                        vmessItem.network    = Global.DefaultNetwork;
                        vmessItem.headerType = Global.None;

                        vmessItem.configVersion  = Utils.ToInt(vmessQRCode.v);
                        vmessItem.remarks        = vmessQRCode.ps;
                        vmessItem.address        = vmessQRCode.add;
                        vmessItem.port           = Utils.ToInt(vmessQRCode.port);
                        vmessItem.id             = vmessQRCode.id;
                        vmessItem.alterId        = Utils.ToInt(vmessQRCode.aid);
                        vmessItem.network        = vmessQRCode.net;
                        vmessItem.headerType     = vmessQRCode.type;
                        vmessItem.requestHost    = vmessQRCode.host;
                        vmessItem.path           = vmessQRCode.path;
                        vmessItem.streamSecurity = vmessQRCode.tls;
                    }

                    ConfigHandler.UpgradeServerVersion(ref vmessItem);
                }
                else if (result.StartsWith(Global.ssProtocol))
                {
                    msg = "配置格式不正确";

                    vmessItem.configType = (int)EConfigType.Shadowsocks;
                    result = result.Substring(Global.ssProtocol.Length);
                    //remark
                    int indexRemark = result.IndexOf("#");
                    if (indexRemark > 0)
                    {
                        try
                        {
                            vmessItem.remarks = WebUtility.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1));
                        }
                        catch { }
                        result = result.Substring(0, indexRemark);
                    }
                    //part decode
                    int indexS = result.IndexOf("@");
                    if (indexS > 0)
                    {
                        result = Utils.Base64Decode(result.Substring(0, indexS)) + result.Substring(indexS, result.Length - indexS);
                    }
                    else
                    {
                        result = Utils.Base64Decode(result);
                    }

                    string[] arr1 = result.Split('@');
                    if (arr1.Length != 2)
                    {
                        return(null);
                    }
                    string[] arr21 = arr1[0].Split(':');
                    string[] arr22 = arr1[1].Split(':');
                    if (arr21.Length != 2 || arr21.Length != 2)
                    {
                        return(null);
                    }
                    vmessItem.address  = arr22[0];
                    vmessItem.port     = Utils.ToInt(arr22[1]);
                    vmessItem.security = arr21[0];
                    vmessItem.id       = arr21[1];
                }
                else
                {
                    msg = "非vmess或ss协议";
                    return(null);
                }
            }
            catch
            {
                msg = "异常,不是正确的配置,请检查";
                return(null);
            }

            return(vmessItem);
        }
Example #2
0
        /// <summary>
        /// 从剪贴板导入URL
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static VmessItem ImportFromClipboardConfig(string clipboardData, out string msg)
        {
            msg = string.Empty;
            VmessItem vmessItem = new VmessItem();

            try
            {
                //载入配置文件
                string result = clipboardData.TrimEx();// Utils.GetClipboardData();
                if (Utils.IsNullOrEmpty(result))
                {
                    msg = UIRes.I18N("FailedReadConfiguration");
                    return(null);
                }

                if (result.StartsWith(Global.vmessProtocol))
                {
                    int indexSplit = result.IndexOf("?");
                    if (indexSplit > 0)
                    {
                        vmessItem = ResolveStdVmess(result) ?? ResolveVmess4Kitsunebi(result);
                    }
                    else
                    {
                        vmessItem.configType = (int)EConfigType.Vmess;
                        result = result.Substring(Global.vmessProtocol.Length);
                        result = Utils.Base64Decode(result);

                        //转成Json
                        VmessQRCode vmessQRCode = Utils.FromJson <VmessQRCode>(result);
                        if (vmessQRCode == null)
                        {
                            msg = UIRes.I18N("FailedConversionConfiguration");
                            return(null);
                        }
                        vmessItem.security   = Global.DefaultSecurity;
                        vmessItem.network    = Global.DefaultNetwork;
                        vmessItem.headerType = Global.None;


                        vmessItem.configVersion = Utils.ToInt(vmessQRCode.v);
                        vmessItem.remarks       = Utils.ToString(vmessQRCode.ps);
                        vmessItem.address       = Utils.ToString(vmessQRCode.add);
                        vmessItem.port          = Utils.ToInt(vmessQRCode.port);
                        vmessItem.id            = Utils.ToString(vmessQRCode.id);
                        vmessItem.alterId       = Utils.ToInt(vmessQRCode.aid);

                        if (!Utils.IsNullOrEmpty(vmessQRCode.net))
                        {
                            vmessItem.network = vmessQRCode.net;
                        }
                        if (!Utils.IsNullOrEmpty(vmessQRCode.type))
                        {
                            vmessItem.headerType = vmessQRCode.type;
                        }

                        vmessItem.requestHost    = Utils.ToString(vmessQRCode.host);
                        vmessItem.path           = Utils.ToString(vmessQRCode.path);
                        vmessItem.streamSecurity = Utils.ToString(vmessQRCode.tls);
                        vmessItem.sni            = Utils.ToString(vmessQRCode.sni);
                    }

                    ConfigHandler.UpgradeServerVersion(ref vmessItem);
                }
                else if (result.StartsWith(Global.ssProtocol))
                {
                    msg = UIRes.I18N("ConfigurationFormatIncorrect");

                    vmessItem = ResolveSSLegacy(result);
                    if (vmessItem == null)
                    {
                        vmessItem = ResolveSip002(result);
                    }
                    if (vmessItem == null)
                    {
                        return(null);
                    }
                    if (vmessItem.address.Length == 0 || vmessItem.port == 0 || vmessItem.security.Length == 0 || vmessItem.id.Length == 0)
                    {
                        return(null);
                    }

                    vmessItem.configType = (int)EConfigType.Shadowsocks;
                }
                else if (result.StartsWith(Global.socksProtocol))
                {
                    msg = UIRes.I18N("ConfigurationFormatIncorrect");

                    vmessItem.configType = (int)EConfigType.Socks;
                    result = result.Substring(Global.socksProtocol.Length);
                    //remark
                    int indexRemark = result.IndexOf("#");
                    if (indexRemark > 0)
                    {
                        try
                        {
                            vmessItem.remarks = Utils.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1));
                        }
                        catch { }
                        result = result.Substring(0, indexRemark);
                    }
                    //part decode
                    int indexS = result.IndexOf("@");
                    if (indexS > 0)
                    {
                    }
                    else
                    {
                        result = Utils.Base64Decode(result);
                    }

                    string[] arr1 = result.Split('@');
                    if (arr1.Length != 2)
                    {
                        return(null);
                    }
                    string[] arr21 = arr1[0].Split(':');
                    //string[] arr22 = arr1[1].Split(':');
                    int indexPort = arr1[1].LastIndexOf(":");
                    if (arr21.Length != 2 || indexPort < 0)
                    {
                        return(null);
                    }
                    vmessItem.address  = arr1[1].Substring(0, indexPort);
                    vmessItem.port     = Utils.ToInt(arr1[1].Substring(indexPort + 1, arr1[1].Length - (indexPort + 1)));
                    vmessItem.security = arr21[0];
                    vmessItem.id       = arr21[1];
                }
                else if (result.StartsWith(Global.trojanProtocol))
                {
                    msg = UIRes.I18N("ConfigurationFormatIncorrect");

                    vmessItem.configType = (int)EConfigType.Trojan;

                    Uri uri = new Uri(result);
                    vmessItem.address = uri.IdnHost;
                    vmessItem.port    = uri.Port;
                    vmessItem.id      = uri.UserInfo;

                    var qurery = HttpUtility.ParseQueryString(uri.Query);
                    vmessItem.sni = qurery["sni"] ?? "";

                    var remarks = uri.Fragment.Replace("#", "");
                    if (Utils.IsNullOrEmpty(remarks))
                    {
                        vmessItem.remarks = "NONE";
                    }
                    else
                    {
                        vmessItem.remarks = Utils.UrlDecode(remarks);
                    }
                }
                else if (result.StartsWith(Global.vlessProtocol))
                {
                    vmessItem = ResolveStdVLESS(result);

                    ConfigHandler.UpgradeServerVersion(ref vmessItem);
                }
                else
                {
                    msg = UIRes.I18N("NonvmessOrssProtocol");
                    return(null);
                }
            }
            catch
            {
                msg = UIRes.I18N("Incorrectconfiguration");
                return(null);
            }

            return(vmessItem);
        }
Example #3
0
        /// <summary>
        /// 从剪贴板导入URL
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static VmessItem ImportFromClipboardConfig(string clipboardData, out string msg)
        {
            msg = string.Empty;
            VmessItem vmessItem = new VmessItem();

            try
            {
                //载入配置文件
                string result = clipboardData.TrimEx();// Utils.GetClipboardData();
                if (Utils.IsNullOrEmpty(result))
                {
                    msg = UIRes.I18N("FailedReadConfiguration");
                    return(null);
                }

                if (result.StartsWith(Global.vmessProtocol))
                {
                    int indexSplit = result.IndexOf("?");
                    if (indexSplit > 0)
                    {
                        vmessItem = ResolveStdVmess(result) ?? ResolveVmess4Kitsunebi(result);
                    }
                    else
                    {
                        vmessItem = ResolveVmess(result, out msg);
                    }

                    ConfigHandler.UpgradeServerVersion(ref vmessItem);
                }
                else if (result.StartsWith(Global.ssProtocol))
                {
                    msg = UIRes.I18N("ConfigurationFormatIncorrect");

                    vmessItem = ResolveSSLegacy(result);
                    if (vmessItem == null)
                    {
                        vmessItem = ResolveSip002(result);
                    }
                    if (vmessItem == null)
                    {
                        return(null);
                    }
                    if (vmessItem.address.Length == 0 || vmessItem.port == 0 || vmessItem.security.Length == 0 || vmessItem.id.Length == 0)
                    {
                        return(null);
                    }

                    vmessItem.configType = (int)EConfigType.Shadowsocks;
                }
                else if (result.StartsWith(Global.socksProtocol))
                {
                    msg = UIRes.I18N("ConfigurationFormatIncorrect");

                    vmessItem = ResolveSocks(result);
                }
                else if (result.StartsWith(Global.trojanProtocol))
                {
                    msg = UIRes.I18N("ConfigurationFormatIncorrect");

                    vmessItem = ResolveTrojan(result);
                }
                else if (result.StartsWith(Global.vlessProtocol))
                {
                    vmessItem = ResolveStdVLESS(result);

                    ConfigHandler.UpgradeServerVersion(ref vmessItem);
                }
                else
                {
                    msg = UIRes.I18N("NonvmessOrssProtocol");
                    return(null);
                }
            }
            catch
            {
                msg = UIRes.I18N("Incorrectconfiguration");
                return(null);
            }

            return(vmessItem);
        }
Example #4
0
        /// <summary>
        /// 传入字符串来生成vmess配置
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="str"></param>
        /// <returns></returns>
        public static List <VmessItem> ImportFromStrConfig(out string msg, string str)
        {
            msg = string.Empty;
            List <VmessItem> vmessItems = new List <VmessItem>();

            try
            {
                if (Utils.IsNullOrEmpty(str))
                {
                    msg = "读取配置文件失败";
                    return(null);
                }

                if (!str.Contains(Global.vmessProtocol) && !str.Contains(Global.ssProtocol))
                {
                    msg = "非vmess或ss协议";
                    return(null);
                }

                //去除vmess://或者ss://前面开头的多余字符
                int vIndex = str.IndexOf(Global.vmessProtocol, StringComparison.Ordinal);
                int sIndex = str.IndexOf(Global.ssProtocol, StringComparison.Ordinal);
                int index  = vIndex > sIndex ? (sIndex == -1?vIndex:sIndex) : (vIndex == -1 ? sIndex : vIndex);
                str = str.Substring(index);

                //以vmess://和ss://为分割符,应对混合批量字符串
                string[] strArray = str.Trim().Split(new string[] { Global.vmessProtocol, Global.ssProtocol }, StringSplitOptions.RemoveEmptyEntries);

                foreach (string s in strArray)
                {
                    string temp      = s.Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", "");
                    Match  tempMatch = Regex.Match(temp, "([A-Za-z0-9_=-]+)", RegexOptions.IgnoreCase);

                    temp = Utils.Base64Decode(tempMatch.Groups[0].Value);

                    //base64转为失败则忽略这条
                    if (Utils.IsNullOrEmpty(temp))
                    {
                        continue;
                    }

                    VmessItem vmessItem = new VmessItem();

                    //vmess://字符串处理
                    if (temp.Contains("aid") && temp.Contains("ps"))
                    {
                        vmessItem.configType = (int)EConfigType.Vmess;

                        //转成Json
                        VmessQRCode vmessQRCode = Utils.FromJson <VmessQRCode>(temp);
                        if (vmessQRCode == null)
                        {
                            msg = "转换配置文件失败";
                            return(null);
                        }
                        vmessItem.security   = Global.DefaultSecurity;
                        vmessItem.network    = Global.DefaultNetwork;
                        vmessItem.headerType = Global.None;

                        vmessItem.configVersion  = Utils.ToInt(vmessQRCode.v);
                        vmessItem.remarks        = vmessQRCode.ps;
                        vmessItem.address        = vmessQRCode.add;
                        vmessItem.port           = Convert.ToInt32(vmessQRCode.port);
                        vmessItem.id             = vmessQRCode.id;
                        vmessItem.alterId        = Convert.ToInt32(vmessQRCode.aid);
                        vmessItem.network        = vmessQRCode.net;
                        vmessItem.headerType     = vmessQRCode.type;
                        vmessItem.requestHost    = vmessQRCode.host;
                        vmessItem.path           = vmessQRCode.path;
                        vmessItem.streamSecurity = vmessQRCode.tls;

                        ConfigHandler.UpgradeServerVersion(ref vmessItem);

                        vmessItems.Add(vmessItem);
                    }
                    //ss://字符串处理
                    else
                    {
                        vmessItem.configType = (int)EConfigType.Shadowsocks;
                        int indexRemark = temp.IndexOf("#", StringComparison.Ordinal);
                        if (indexRemark > 0)
                        {
                            temp = temp.Substring(0, indexRemark);
                        }

                        string[] arr1 = temp.Split('@');
                        if (arr1.Length != 2)
                        {
                            continue;
                        }

                        string[] arr21 = arr1[0].Split(':');
                        string[] arr22 = arr1[1].Split(':');
                        if (arr21.Length != 2 || arr21.Length != 2)
                        {
                            continue;
                        }

                        vmessItem.address  = arr22[0];
                        vmessItem.port     = Convert.ToInt32(arr22[1]);
                        vmessItem.security = arr21[0];
                        vmessItem.id       = arr21[1];

                        vmessItems.Add(vmessItem);
                    }
                }
            }
            catch
            {
                msg = "异常,不是正确的配置,请检查";
                return(null);
            }

            return(vmessItems);
        }