Ejemplo n.º 1
0
        private bool CheckAuthorization(string authorization_token, AccessControlInfo acinfo)
        {
            if (!acinfo.AuthorizationRequired || acinfo.AuthenticationKey == null)
            {
                return(true);
            }
            if (authorization_token == null)
            {
                return(false);
            }
            var authorized = false;

            try {
                var token = System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(authorization_token));
                var idx   = token.IndexOf(':');
                if (idx >= 0)
                {
                    var user = token.Substring(0, idx);
                    var pass = token.Substring(idx + 1);
                    authorized = acinfo.CheckAuthorization(user, pass);
                }
            }
            catch (FormatException) {
            }
            catch (ArgumentException) {
            }
            return(authorized);
        }
Ejemplo n.º 2
0
        public override Guid?ParseChannelID(byte[] header, AccessControlInfo acinfo)
        {
            var idx = Array.IndexOf(header, (byte)'\r');

            if (idx < 0 ||
                idx == header.Length - 1 ||
                header[idx + 1] != '\n')
            {
                return(null);
            }
            try {
                var reqline = HttpRequest.ParseRequestLine(System.Text.Encoding.ASCII.GetString(header, 0, idx));
                if (reqline != null)
                {
                    return(Guid.Empty);
                }
                else
                {
                    return(null);
                }
            }
            catch (ArgumentException) {
                return(null);
            }
        }
 public override IOutputStream Create(
     ConnectionStream connection,
     AccessControlInfo access_control,
     Guid channel_id)
 {
     return(new PCPPongOutputStream(PeerCast, connection, access_control));
 }
Ejemplo n.º 4
0
 public PCPOutputStream(
     PeerCast peercast,
     Stream input_stream,
     Stream output_stream,
     EndPoint remote_endpoint,
     AccessControlInfo access_control,
     Channel channel,
     RelayRequest request)
     : base(peercast, input_stream, output_stream, remote_endpoint, access_control, channel, null)
 {
     Logger.Debug("Initialized: Channel {0}, Remote {1}, Request {2} {3} ({4} {5})",
                  channel != null ? channel.ChannelID.ToString("N") : "(null)",
                  remote_endpoint,
                  request.Uri,
                  request.StreamPos,
                  request.PCPVersion,
                  request.UserAgent);
     this.Connection.ReadTimeout = 180000;
     this.Downhost          = null;
     this.UserAgent         = request.UserAgent;
     this.IsChannelFound    = channel != null && channel.Status == SourceStreamStatus.Receiving;
     this.IsRelayFull       = channel != null ? !channel.MakeRelayable(this) : false;
     this.IsProtocolMatched = channel != null ?
                              (channel.Network == NetworkType.IPv6 && request.PCPVersion == PCPVersion.ProtocolVersionIPv6 && remote_endpoint.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) ||
                              (channel.Network == NetworkType.IPv4 && request.PCPVersion == PCPVersion.ProtocolVersionIPv4 && remote_endpoint.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) : false;
     this.relayRequest = request;
     this.UserAgent    = request.UserAgent;
 }
 public PCPPongOutputStream(
     PeerCast peercast,
     ConnectionStream connection,
     AccessControlInfo access_control)
     : base(peercast, connection, access_control, null)
 {
     Logger.Debug("Initialized: Remote {0}", RemoteEndPoint);
 }
Ejemplo n.º 6
0
 public override IOutputStream Create(
     Stream input_stream,
     Stream output_stream,
     EndPoint remote_endpoint,
     AccessControlInfo access_control,
     Guid channel_id,
     byte[] header)
 {
     return(new PCPPongOutputStream(PeerCast, input_stream, output_stream, (IPEndPoint)remote_endpoint, access_control, header));
 }
Ejemplo n.º 7
0
 public PCPPongOutputStream(
     PeerCast peercast,
     Stream input_stream,
     Stream output_stream,
     IPEndPoint endpoint,
     AccessControlInfo access_control,
     byte[] header)
     : base(peercast, input_stream, output_stream, endpoint, access_control, null, header)
 {
     Logger.Debug("Initialized: Remote {0}", endpoint);
 }
Ejemplo n.º 8
0
 public HTTPDummyOutputStream(
     PeerCast peercast,
     Stream input_stream,
     Stream output_stream,
     EndPoint remote_endpoint,
     AccessControlInfo access_control,
     HTTPRequest req)
     : base(peercast, input_stream, output_stream, remote_endpoint, access_control, null, null)
 {
     Logger.Debug("Initialized: Remote {0}", remote_endpoint);
     this.request = req;
 }
Ejemplo n.º 9
0
        public Task Invoke(
            HttpRequest req,
            ConnectionStream stream,
            IPEndPoint localEndPoint,
            IPEndPoint remoteEndPoint,
            AccessControlInfo accessControlInfo,
            CancellationToken cancellationToken)
        {
            var ctx = new OwinContext(PeerCast, req, stream, localEndPoint, remoteEndPoint, accessControlInfo);

            return(ctx.Invoke(OwinApp, cancellationToken));
        }
Ejemplo n.º 10
0
    public void Update(AccessControlInfo info)
    {
        db.Open();

        string query = " UPDATE [dbo].[AccessControl] SET  "
                       + " [ID] = @ID "
                       + ", [Enable] = @Enable "
                       + " where FunctionName = @FunctionName  and Role = @Role ";


        db.Execute(query, info);
        db.Close();
    }
Ejemplo n.º 11
0
 public RTMPOutputStream(
     PeerCast peercast,
     ConnectionStream connection,
     AccessControlInfo access_control,
     Guid channel_id)
 {
     connection.ReadTimeout  = Timeout.Infinite;
     connection.WriteTimeout = 10000;
     this.peerCast           = peercast;
     this.inputStream        = connection;
     this.outputStream       = connection;
     this.accessControl      = access_control;
     this.connection         = new RTMPPlayConnection(this, this.inputStream, this.outputStream);
 }
Ejemplo n.º 12
0
 public HTMLHostOutputStream(
     HTMLHost owner,
     PeerCast peercast,
     Stream input_stream,
     Stream output_stream,
     EndPoint remote_endpoint,
     AccessControlInfo access_control,
     HTTPRequest request)
     : base(peercast, input_stream, output_stream, remote_endpoint, access_control, null, null)
 {
     this.owner   = owner;
     this.request = request;
     Logger.Debug("Initialized: Remote {0}", remote_endpoint);
 }
Ejemplo n.º 13
0
 public OWINHostOutputStream(
     PeerCast peercast,
     Stream input_stream,
     Stream output_stream,
     EndPoint remote_endpoint,
     AccessControlInfo access_control,
     HTTPRequest request,
     byte[] header,
     OWINApplication application)
     : base(peercast, input_stream, output_stream, remote_endpoint, access_control, null, header)
 {
     this.request     = request;
     this.application = application;
     Logger.Debug("Initialized: Remote {0}", remote_endpoint);
 }
Ejemplo n.º 14
0
 /// <summary>
 /// 元になるストリーム、チャンネル、リクエストからHTTPOutputStreamを初期化します
 /// </summary>
 /// <param name="peercast">所属するPeerCast</param>
 /// <param name="input_stream">元になる受信ストリーム</param>
 /// <param name="output_stream">元になる送信ストリーム</param>
 /// <param name="remote_endpoint">接続先のアドレス</param>
 /// <param name="access_control">接続可否および認証の情報</param>
 /// <param name="channel">所属するチャンネル。無い場合はnull</param>
 /// <param name="request">クライアントからのリクエスト</param>
 public HTTPOutputStream(
     PeerCast peercast,
     Stream input_stream,
     Stream output_stream,
     EndPoint remote_endpoint,
     AccessControlInfo access_control,
     Channel channel,
     HTTPRequest request)
     : base(peercast, input_stream, output_stream, remote_endpoint, access_control, channel, null)
 {
     Logger.Debug("Initialized: Channel {0}, Remote {1}, Request {2} {3}",
                  channel != null ? channel.ChannelID.ToString("N") : "(null)",
                  remote_endpoint,
                  request.Method,
                  request.Uri);
     this.request = request;
 }
Ejemplo n.º 15
0
 public override IOutputStream Create(
     System.IO.Stream input_stream,
     System.IO.Stream output_stream,
     System.Net.EndPoint remote_endpoint,
     AccessControlInfo access_control,
     Guid channel_id,
     byte[] header)
 {
     return(new RTMPOutputStream(
                PeerCast,
                input_stream,
                output_stream,
                remote_endpoint,
                access_control,
                channel_id,
                header));
 }
Ejemplo n.º 16
0
    public void Insert(AccessControlInfo info)
    {
        db.Open();

        string query = "INSERT INTO [dbo].[AccessControl] ( [ID] "
                       + ",[FunctionName] "
                       + ",[Role] "
                       + ",[Enable] "
                       + ") "
                       + "VALUES ( [ID] "
                       + ",@FunctionName "
                       + ",@Role "
                       + ",@Enable "
                       + ") ";


        db.Execute(query, info);
        db.Close();
    }
Ejemplo n.º 17
0
 public override IOutputStream Create(
     Stream input_stream,
     Stream output_stream,
     EndPoint remote_endpoint,
     AccessControlInfo access_control,
     Guid channel_id,
     byte[] header)
 {
     using (var stream = new MemoryStream(header)) {
         var req = HTTPRequestReader.Read(stream);
         return(new HTTPDummyOutputStream(
                    PeerCast,
                    input_stream,
                    output_stream,
                    remote_endpoint,
                    access_control,
                    req));
     }
 }
Ejemplo n.º 18
0
        public OwinContext(
            PeerCast peerCast,
            HttpRequest req,
            ConnectionStream stream,
            IPEndPoint localEndPoint,
            IPEndPoint remoteEndPoint,
            AccessControlInfo accessControlInfo)
        {
            Environment      = new OwinEnvironment();
            ConnectionStream = stream;
            RequestBody      = new OwinRequestBodyStream(this, ConnectionStream);
            ResponseBody     = new OwinResponseBodyStream(this, ConnectionStream);
            Environment.Environment[OwinEnvironment.Owin.Version]     = "1.0.1";
            Environment.Environment[OwinEnvironment.Host.TraceOutput] = TextWriter.Null;
            Environment.Environment[OwinEnvironment.Owin.RequestBody] = RequestBody;
            var requestHeaders = req.Headers.ToDictionary();

            if (!requestHeaders.TryGetValue("Host", out var values) || values.Length == 0 || String.IsNullOrEmpty(values[0]))
            {
                requestHeaders["Host"] = new string[] { localEndPoint.ToString() };
            }
            Environment.Environment[OwinEnvironment.Owin.RequestHeaders]               = requestHeaders;
            Environment.Environment[OwinEnvironment.Owin.RequestPath]                  = req.Path;
            Environment.Environment[OwinEnvironment.Owin.RequestPathBase]              = "";
            Environment.Environment[OwinEnvironment.Owin.RequestProtocol]              = req.Protocol;
            Environment.Environment[OwinEnvironment.Owin.RequestQueryString]           = req.QueryString;
            Environment.Environment[OwinEnvironment.Owin.RequestScheme]                = "http";
            Environment.Environment[OwinEnvironment.Owin.RequestMethod]                = req.Method;
            Environment.Environment[OwinEnvironment.Owin.ResponseBody]                 = ResponseBody;
            Environment.Environment[OwinEnvironment.Owin.ResponseHeaders]              = new Dictionary <string, string[]>(StringComparer.OrdinalIgnoreCase);
            Environment.Environment[OwinEnvironment.Server.RemoteIpAddress]            = remoteEndPoint.Address.ToString();
            Environment.Environment[OwinEnvironment.Server.RemotePort]                 = remoteEndPoint.Port.ToString();
            Environment.Environment[OwinEnvironment.Server.IsLocal]                    = remoteEndPoint.Address.GetAddressLocality() == 0;
            Environment.Environment[OwinEnvironment.Server.LocalIpAddress]             = localEndPoint.Address.ToString();
            Environment.Environment[OwinEnvironment.Server.LocalPort]                  = localEndPoint.Port.ToString();
            Environment.Environment[OwinEnvironment.Server.OnSendingHeaders]           = new Action <Action <object>, object>(OnSendingHeaders.Add);
            Environment.Environment[OwinEnvironment.PeerCastStation.PeerCast]          = peerCast;
            Environment.Environment[OwinEnvironment.PeerCastStation.AccessControlInfo] = accessControlInfo;
            Environment.Environment[OwinEnvironment.PeerCastStation.GetRecvRate]       = new Func <float>(() => stream.ReadRate);
            Environment.Environment[OwinEnvironment.PeerCastStation.GetSendRate]       = new Func <float>(() => stream.WriteRate);
            Environment.Environment[OwinEnvironment.Opaque.Upgrade]                    = new Action <IDictionary <string, object>, Func <IDictionary <string, object>, Task> >(OpaqueUpgrade);
        }
Ejemplo n.º 19
0
        /// <summary>
        /// 出力ストリームを作成します
        /// </summary>
        /// <param name="input_stream">元になる受信ストリーム</param>
        /// <param name="output_stream">元になる送信ストリーム</param>
        /// <param name="remote_endpoint">接続先。無ければnull</param>
        /// <param name="channel_id">所属するチャンネルID。</param>
        /// <param name="header">クライアントからのリクエスト</param>
        /// <returns>
        /// 作成できた場合はPCPOutputStreamのインスタンス。
        /// headerが正しく解析できなかった場合はnull
        /// </returns>
        public override IOutputStream Create(
            Stream input_stream,
            Stream output_stream,
            EndPoint remote_endpoint,
            AccessControlInfo access_control,
            Guid channel_id,
            byte[] header)
        {
            var request = ParseRequest(header);

            if (request != null)
            {
                var channel = this.PeerCast.RequestChannel(channel_id, null, false);
                return(new PCPOutputStream(this.PeerCast, input_stream, output_stream, remote_endpoint, access_control, channel, request));
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 20
0
        public RTMPOutputStream(
            PeerCast peercast,
            System.IO.Stream input_stream,
            System.IO.Stream output_stream,
            System.Net.EndPoint remote_endpoint,
            AccessControlInfo access_control,
            Guid channel_id,
            byte[] header)
        {
            input_stream.ReadTimeout = System.Threading.Timeout.Infinite;
            this.peerCast            = peercast;
            var stream = new ConnectionStream(new BufferedReadStream(input_stream, 8192, header), output_stream);

            this.inputStream    = stream;
            this.outputStream   = stream;
            stream.WriteTimeout = 10000;
            this.remoteEndPoint = remote_endpoint;
            this.accessControl  = access_control;
            this.connection     = new RTMPPlayConnection(this, this.inputStream, this.outputStream);
        }
Ejemplo n.º 21
0
            public override IOutputStream Create(
                Stream input_stream,
                Stream output_stream,
                EndPoint remote_endpoint,
                AccessControlInfo access_control,
                Guid channel_id,
                byte[] header)
            {
                HTTPRequest request = null;

                using (var stream = new MemoryStream(header)) {
                    try {
                        request = HTTPRequestReader.Read(stream);
                    }
                    catch (EndOfStreamException) {
                    }
                    catch (InvalidDataException) {
                    }
                }
                return(new HTMLHostOutputStream(owner, PeerCast, input_stream, output_stream, remote_endpoint, access_control, request));
            }
Ejemplo n.º 22
0
        /// <summary>
        /// 出力ストリームを作成します
        /// </summary>
        /// <param name="input_stream">元になる受信ストリーム</param>
        /// <param name="output_stream">元になる送信ストリーム</param>
        /// <param name="remote_endpoint">接続先。無ければnull</param>
        /// <param name="channel_id">所属するチャンネルのチャンネルID</param>
        /// <param name="header">クライアントからのリクエスト</param>
        /// <returns>
        /// 作成できた場合はHTTPOutputStreamのインスタンス。
        /// headerが正しく解析できなかった場合はnull
        /// </returns>
        public override IOutputStream Create(
            Stream input_stream,
            Stream output_stream,
            EndPoint remote_endpoint,
            AccessControlInfo access_control,
            Guid channel_id,
            byte[] header)
        {
            var request = ParseRequest(header);

            if (request != null)
            {
                Channel channel = null;
                Uri     tracker = CreateTrackerUri(channel_id, request.Uri);
                channel = PeerCast.RequestChannel(channel_id, tracker, true);
                return(new HTTPOutputStream(PeerCast, input_stream, output_stream, remote_endpoint, access_control, channel, request));
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 23
0
 public override IOutputStream Create(
     Stream input_stream,
     Stream output_stream,
     EndPoint remote_endpoint,
     AccessControlInfo access_control,
     Guid channel_id,
     byte[] header)
 {
     using (var stream = new MemoryStream(header)) {
         var req         = HTTPRequestReader.Read(stream);
         var bytes       = stream.Position;
         var application = FindApplication(req.Uri);
         return(new OWINHostOutputStream(
                    PeerCast,
                    input_stream,
                    output_stream,
                    remote_endpoint,
                    access_control,
                    req,
                    header.Skip((int)bytes).ToArray(),
                    application));
     }
 }
Ejemplo n.º 24
0
 public PCPOutputStream(
     PeerCast peercast,
     Stream input_stream,
     Stream output_stream,
     EndPoint remote_endpoint,
     AccessControlInfo access_control,
     Channel channel,
     RelayRequest request)
     : base(peercast, input_stream, output_stream, remote_endpoint, access_control, channel, null)
 {
     Logger.Debug("Initialized: Channel {0}, Remote {1}, Request {2} {3} ({4} {5})",
                  channel != null ? channel.ChannelID.ToString("N") : "(null)",
                  remote_endpoint,
                  request.Uri,
                  request.StreamPos,
                  request.PCPVersion,
                  request.UserAgent);
     this.Downhost       = null;
     this.UserAgent      = request.UserAgent;
     this.IsChannelFound = channel != null && channel.Status == SourceStreamStatus.Receiving;
     this.IsRelayFull    = channel != null ? !channel.MakeRelayable(this) : false;
     this.relayRequest   = request;
 }
Ejemplo n.º 25
0
        public override IOutputStream Create(
            Stream input_stream,
            Stream output_stream,
            EndPoint remote_endpoint,
            AccessControlInfo access_control,
            Guid channel_id,
            byte[] header)
        {
            HTTPRequest req    = null;
            var         stream = new MemoryStream(header);

            try {
                req = HTTPRequestReader.Read(stream);
            }
            catch (EndOfStreamException) {
            }
            return(new HTTPDummyOutputStream(
                       PeerCast,
                       input_stream,
                       output_stream,
                       remote_endpoint,
                       access_control,
                       req));
        }
Ejemplo n.º 26
0
 public OwinHostOutputStream(PeerCast peercast, OwinHost host, ConnectionStream connection, AccessControlInfo access_control, Channel channel)
     : base(peercast, connection, access_control, channel)
 {
     owinHost = host;
 }
Ejemplo n.º 27
0
        public override IOutputStream Create(ConnectionStream connection, AccessControlInfo access_control, Guid channel_id)
        {
            var channel = channel_id != Guid.Empty ? PeerCast.Channels.FirstOrDefault(c => c.ChannelID == channel_id) : null;

            return(new OwinHostOutputStream(PeerCast, owinHost, connection, access_control, channel));
        }