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); }
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)); }
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); }
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)); }
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); }
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; }
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)); }
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(); }
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); }
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); }
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); }
/// <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; }
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)); }
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(); }
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)); } }
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); }
/// <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); } }
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); }
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)); }
/// <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); } }
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)); } }
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; }
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)); }
public OwinHostOutputStream(PeerCast peercast, OwinHost host, ConnectionStream connection, AccessControlInfo access_control, Channel channel) : base(peercast, connection, access_control, channel) { owinHost = host; }
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)); }