Example #1
0
    public IEnumerable <Server> ParseUri(string text)
    {
        var data = new VMessServer();

        string s;

        try
        {
            s = ShareLink.URLSafeBase64Decode(text.Substring(8));
        }
        catch
        {
            return(V2rayUtils.ParseVUri(text));
        }

        V2rayNJObject vmess = JsonSerializer.Deserialize <V2rayNJObject>(s,
                                                                         new JsonSerializerOptions {
            NumberHandling = JsonNumberHandling.WriteAsString | JsonNumberHandling.AllowReadingFromString
        }) !;

        data.Remark           = vmess.ps;
        data.Hostname         = vmess.add;
        data.EncryptMethod    = vmess.scy;
        data.Port             = vmess.port;
        data.UserID           = vmess.id;
        data.AlterID          = vmess.aid;
        data.TransferProtocol = vmess.net;
        data.FakeType         = vmess.type;
        data.ServerName       = vmess.sni;

        if (data.TransferProtocol == "quic")
        {
            data.QUICSecure = vmess.host;
            data.QUICSecret = vmess.path;
        }
        else
        {
            data.Host = vmess.host;
            data.Path = vmess.path;
        }

        data.TLSSecureType = vmess.tls;

        return(new[] { data });
    }
Example #2
0
    private static StreamSettings boundStreamSettings(VMessServer server)
    {
        // https://xtls.github.io/config/transports

        var streamSettings = new StreamSettings
        {
            network  = server.TransferProtocol,
            security = server.TLSSecureType
        };

        if (server.TLSSecureType != "none")
        {
            var tlsSettings = new TlsSettings
            {
                allowInsecure = Global.Settings.V2RayConfig.AllowInsecure,
                serverName    = server.ServerName.ValueOrDefault() ?? server.Host.SplitOrDefault()?[0]
            };

            switch (server.TLSSecureType)
            {
            case "tls":
                streamSettings.tlsSettings = tlsSettings;
                break;

            case "xtls":
                streamSettings.xtlsSettings = tlsSettings;
                break;
            }
        }

        switch (server.TransferProtocol)
        {
        case "tcp":

            streamSettings.tcpSettings = new TcpSettings
            {
                header = new
                {
                    type    = server.FakeType,
                    request = server.FakeType switch
                    {
                        "none" => null,
                        "http" => new
                        {
                            path    = server.Path.SplitOrDefault(),
                            headers = new
                            {
                                Host = server.Host.SplitOrDefault()
                            }
                        },
                        _ => throw new MessageException($"Invalid tcp type {server.FakeType}")
                    }
                }
            };

            break;

        case "ws":

            streamSettings.wsSettings = new WsSettings
            {
                path    = server.Path.ValueOrDefault(),
                headers = new
                {
                    Host = server.Host.ValueOrDefault()
                }
            };

            break;

        case "kcp":

            streamSettings.kcpSettings = new KcpSettings
            {
                mtu              = Global.Settings.V2RayConfig.KcpConfig.mtu,
                tti              = Global.Settings.V2RayConfig.KcpConfig.tti,
                uplinkCapacity   = Global.Settings.V2RayConfig.KcpConfig.uplinkCapacity,
                downlinkCapacity = Global.Settings.V2RayConfig.KcpConfig.downlinkCapacity,
                congestion       = Global.Settings.V2RayConfig.KcpConfig.congestion,
                readBufferSize   = Global.Settings.V2RayConfig.KcpConfig.readBufferSize,
                writeBufferSize  = Global.Settings.V2RayConfig.KcpConfig.writeBufferSize,
                header           = new
                {
                    type = server.FakeType
                },
                seed = server.Path.ValueOrDefault()
            };

            break;

        case "h2":

            streamSettings.httpSettings = new HttpSettings
            {
                host = server.Host.SplitOrDefault(),
                path = server.Path.ValueOrDefault()
            };

            break;

        case "quic":

            streamSettings.quicSettings = new QuicSettings
            {
                security = server.QUICSecure,
                key      = server.QUICSecret,
                header   = new
                {
                    type = server.FakeType
                }
            };

            break;

        case "grpc":

            streamSettings.grpcSettings = new GrpcSettings
            {
                serviceName = server.Path,
                multiMode   = server.FakeType == "multi"
            };

            break;

        default:
            throw new MessageException($"transfer protocol \"{server.TransferProtocol}\" not implemented yet");
        }

        return(streamSettings);
    }