public void setResponseBodyData( object obj ) { //if( Log.isLogging( LoggingConstants.DEBUG ) && ( obj != null ) ) // Log.log( LoggingConstants.DEBUG, "AMFMessage:setResponseBodyData type: " + obj.GetType() + " object: " + obj ); if( ( obj is Exception ) && !(obj is ServiceException) ) { obj = new ServiceException( obj.ToString(), (Exception) obj ); //debugCall.setError( currentBody ); } if( (obj is Exception) && isV3Request() ) obj = new ErrMessage( null, (Exception)obj ); //debugCall.setReturnValue( currentBody, obj ); bodyParts[ currentBody ].responseDataObject = obj; responseBodies.Add( bodyParts[ currentBody ] ); }
public override V3Message execute( Request message, RequestContext context ) { object returnValue = null; switch ( operation ) { case SUBSCRIBE_OPERATION: { IDestination destObj = ORBConfig.GetInstance().GetDataServices().GetDestinationManager().GetDestination(destination); Hashtable headers = new Hashtable(); RTMPConnection connection = (RTMPConnection) ConnectionHub.getConnectionLocal(); if (destObj != null) { String selectorName = (String) this.headers["DSSelector"]; String subtopic = (String) this.headers["DSSubtopic"]; String dsId = connection == null ? (String) this.headers["DSId"] : connection.GetHashCode().ToString(); String channel = (String) this.headers["DSEndpoint"]; Subscriber subscriber = SubscriptionsManager.GetInstance().getSubscriber( Subscriber.buildId(dsId, destObj.GetName(), subtopic, selectorName)); if (clientId == null || clientId.Equals("")) clientId = Guid.NewGuid().ToString().ToUpper(); if (subscriber != null) { if (subscriber.addClient(clientId.ToString())) destObj.GetServiceHandler().HandleSubscribe(subscriber, clientId.ToString(), this); return new AckMessage(messageId, clientId, null, headers); } object wsContext = ThreadContext.getProperties()[ORBConstants.WEB_SOCKET_MODE]; if (wsContext != null) { subscriber = new WebSocketSubscriber(selectorName, destObj, (UserContext) wsContext); } else if (connection != null) { subscriber = new DedicatedSubscriber(selectorName, destObj); subscriber.setChannelId(RTMPHandler.getChannelId()); subscriber.setConnection(connection); } else { subscriber = SubscriberFactory.CreateSubscriber(channel, selectorName, destObj); } subscriber.setDSId(dsId); subscriber.setSubtopic(subtopic); subscriber.addClient((String) clientId); try { SubscriptionsManager.GetInstance().AddSubscriber(dsId, destObj.GetName(), subscriber); } catch (Exception e) { if (Log.isLogging(LoggingConstants.EXCEPTION)) Log.log(LoggingConstants.EXCEPTION, e); } destObj.GetServiceHandler().HandleSubscribe(subscriber, clientId.ToString(), this); } else { String error = "Unknown destination " + destination + ". Cannot handle subscription request"; if (Log.isLogging(LoggingConstants.ERROR)) Log.log(LoggingConstants.ERROR, error); return new ErrMessage(messageId, new Exception(error)); } return new AckMessage(messageId, clientId, null, headers); } break; case UNSUBSCRIBE_OPERATION: { String subtopic = (String) this.headers["DSSubtopic"]; String dsId = (String) this.headers["DSId"]; String selectorName = (String) this.headers["DSSelector"]; RTMPConnection connection = (RTMPConnection) ConnectionHub.getConnectionLocal(); if (connection != null) dsId = connection.GetHashCode().ToString(); Subscriber subscriber = SubscriptionsManager.GetInstance().getSubscriber( Subscriber.buildId(dsId, destination, subtopic, selectorName)); if (subscriber != null) { SubscriptionsManager.GetInstance().unsubscribe(subscriber, clientId.ToString(), this); } } break; case DISCONNECT_OPERATION: { String dsId = (String) this.headers["DSId"]; RTMPConnection connection = (RTMPConnection) ConnectionHub.getConnectionLocal(); if (connection != null) dsId = connection.GetHashCode().ToString(); SubscriptionsManager subscriptionsManager = SubscriptionsManager.GetInstance(); List<Subscriber> subscribers = subscriptionsManager.getSubscribersByDsId(dsId); if (subscribers != null) foreach (Subscriber subscriber in subscribers ) if (subscriber != null) subscriptionsManager.unsubscribe(subscriber, this); subscriptionsManager.removeSubscriber(dsId); } break; case POLL_OPERATION: { String dsId = (String) this.headers["DSId"]; RTMPConnection connection = (RTMPConnection) ConnectionHub.getConnectionLocal(); if (connection != null) dsId = connection.GetHashCode().ToString() + ""; try { WebORBArray<V3Message> messages = new WebORBArray<V3Message>(SubscriptionsManager.GetInstance().getMessages(dsId)); if (messages.Count == 0) return new AckMessage(null, null, null, new Hashtable()); return new CommandMessage(CLIENT_SYNC_OPERATION, messages); } catch (Exception e) { String error = "Invalid client id " + dsId; if (Log.isLogging(LoggingConstants.ERROR)) Log.log(LoggingConstants.ERROR, error, e); return new ErrMessage(messageId, new Exception(error)); } } break; case CLIENT_PING_OPERATION: { Hashtable headers = new Hashtable(); RTMPConnection connection = (RTMPConnection) ConnectionHub.getConnectionLocal(); if (connection != null) headers.Add("DSId", connection.GetHashCode().ToString()); else headers.Add("DSId", Guid.NewGuid().ToString().ToUpper()); return new AckMessage(messageId, clientId, null, headers); } break; case LOGOUT_OPERATION: { ThreadContext.setCallerCredentials(null, null); Thread.CurrentPrincipal = null; } break; case LOGIN_OPERATION: { String credentials = (String) ((IAdaptingType) ((object[]) body.body)[0]).defaultAdapt(); byte[] bytes = Convert.FromBase64String(credentials); credentials = new String(Encoding.UTF8.GetChars(bytes)); IAuthenticationHandler authHandler = ORBConfig.GetInstance().getSecurity().GetAuthenticationHandler(); if (authHandler == null) { ErrMessage errorMessage = new ErrMessage(messageId, new ServiceException("Missing authentication handler")); errorMessage.faultCode = "Client.Authentication"; return errorMessage; } int index = credentials.IndexOf(":"); string userid = null; string password = null; if (index != -1 && index != 0 && index != credentials.Length - 1) { userid = credentials.Substring(0, index); password = credentials.Substring(index + 1); try { IPrincipal principal = authHandler.CheckCredentials(userid, password, message); try { Thread.CurrentPrincipal = principal; ThreadContext.currentHttpContext().User = principal; } catch (Exception exception) { if (Log.isLogging(LoggingConstants.ERROR)) Log.log(LoggingConstants.ERROR, "Unable to set current principal. Make sure your current permission set allows Principal Control", exception); throw exception; } Credentials creds = new Credentials(); creds.userid = userid; creds.password = password; ThreadContext.setCallerCredentials(creds, principal); } catch (Exception exception) { ErrMessage errorMessage = new ErrMessage(messageId, exception); errorMessage.faultCode = "Client.Authentication"; return errorMessage; } } else { ErrMessage errorMessage = new ErrMessage(messageId, new ServiceException("Invalid credentials")); errorMessage.faultCode = "Client.Authentication"; return errorMessage; } } break; } return new AckMessage( messageId, clientId, returnValue, new Hashtable() ); }
public override V3Message execute(Request message, RequestContext context) { object returnValue = null; switch (operation) { case SUBSCRIBE_OPERATION: { IDestination destObj = ORBConfig.GetInstance().GetDataServices().GetDestinationManager().GetDestination(destination); Hashtable headers = new Hashtable(); RTMPConnection connection = (RTMPConnection)ConnectionHub.getConnectionLocal(); if (destObj != null) { String selectorName = (String)this.headers["DSSelector"]; String subtopic = (String)this.headers["DSSubtopic"]; String dsId = connection == null ? (String)this.headers["DSId"] : connection.GetHashCode().ToString(); String channel = (String)this.headers["DSEndpoint"]; Subscriber subscriber = SubscriptionsManager.GetInstance().getSubscriber( Subscriber.buildId(dsId, destObj.GetName(), subtopic, selectorName)); if (clientId == null || clientId.Equals("")) { clientId = Guid.NewGuid().ToString().ToUpper(); } if (subscriber != null) { if (subscriber.addClient(clientId.ToString())) { destObj.GetServiceHandler().HandleSubscribe(subscriber, clientId.ToString(), this); } return(new AckMessage(messageId, clientId, null, headers)); } object wsContext = ThreadContext.getProperties()[ORBConstants.WEB_SOCKET_MODE]; if (wsContext != null) { subscriber = new WebSocketSubscriber(selectorName, destObj, (UserContext)wsContext); } else if (connection != null) { subscriber = new DedicatedSubscriber(selectorName, destObj); subscriber.setChannelId(RTMPHandler.getChannelId()); subscriber.setConnection(connection); } else { subscriber = SubscriberFactory.CreateSubscriber(channel, selectorName, destObj); } subscriber.setDSId(dsId); subscriber.setSubtopic(subtopic); subscriber.addClient((String)clientId); try { SubscriptionsManager.GetInstance().AddSubscriber(dsId, destObj.GetName(), subscriber); } catch (Exception e) { if (Log.isLogging(LoggingConstants.EXCEPTION)) { Log.log(LoggingConstants.EXCEPTION, e); } } destObj.GetServiceHandler().HandleSubscribe(subscriber, clientId.ToString(), this); } else { String error = "Unknown destination " + destination + ". Cannot handle subscription request"; if (Log.isLogging(LoggingConstants.ERROR)) { Log.log(LoggingConstants.ERROR, error); } return(new ErrMessage(messageId, new Exception(error))); } return(new AckMessage(messageId, clientId, null, headers)); } break; case UNSUBSCRIBE_OPERATION: { String subtopic = (String)this.headers["DSSubtopic"]; String dsId = (String)this.headers["DSId"]; String selectorName = (String)this.headers["DSSelector"]; RTMPConnection connection = (RTMPConnection)ConnectionHub.getConnectionLocal(); if (connection != null) { dsId = connection.GetHashCode().ToString(); } Subscriber subscriber = SubscriptionsManager.GetInstance().getSubscriber( Subscriber.buildId(dsId, destination, subtopic, selectorName)); if (subscriber != null) { SubscriptionsManager.GetInstance().unsubscribe(subscriber, clientId.ToString(), this); } } break; case DISCONNECT_OPERATION: { String dsId = (String)this.headers["DSId"]; RTMPConnection connection = (RTMPConnection)ConnectionHub.getConnectionLocal(); if (connection != null) { dsId = connection.GetHashCode().ToString(); } SubscriptionsManager subscriptionsManager = SubscriptionsManager.GetInstance(); List <Subscriber> subscribers = subscriptionsManager.getSubscribersByDsId(dsId); if (subscribers != null) { foreach (Subscriber subscriber in subscribers) { if (subscriber != null) { subscriptionsManager.unsubscribe(subscriber, this); } } } subscriptionsManager.removeSubscriber(dsId); } break; case POLL_OPERATION: { String dsId = (String)this.headers["DSId"]; RTMPConnection connection = (RTMPConnection)ConnectionHub.getConnectionLocal(); if (connection != null) { dsId = connection.GetHashCode().ToString() + ""; } try { WebORBArray <V3Message> messages = new WebORBArray <V3Message>(SubscriptionsManager.GetInstance().getMessages(dsId)); if (messages.Count == 0) { return(new AckMessage(null, null, null, new Hashtable())); } return(new CommandMessage(CLIENT_SYNC_OPERATION, messages)); } catch (Exception e) { String error = "Invalid client id " + dsId; if (Log.isLogging(LoggingConstants.ERROR)) { Log.log(LoggingConstants.ERROR, error, e); } return(new ErrMessage(messageId, new Exception(error))); } } break; case CLIENT_PING_OPERATION: { Hashtable headers = new Hashtable(); RTMPConnection connection = (RTMPConnection)ConnectionHub.getConnectionLocal(); if (connection != null) { headers.Add("DSId", connection.GetHashCode().ToString()); } else { headers.Add("DSId", Guid.NewGuid().ToString().ToUpper()); } return(new AckMessage(messageId, clientId, null, headers)); } break; case LOGOUT_OPERATION: { ThreadContext.setCallerCredentials(null, null); Thread.CurrentPrincipal = null; } break; case LOGIN_OPERATION: { String credentials = (String)((IAdaptingType)((object[])body.body)[0]).defaultAdapt(); byte[] bytes = Convert.FromBase64String(credentials); credentials = new String(Encoding.UTF8.GetChars(bytes)); IAuthenticationHandler authHandler = ORBConfig.GetInstance().getSecurity().GetAuthenticationHandler(); if (authHandler == null) { ErrMessage errorMessage = new ErrMessage(messageId, new ServiceException("Missing authentication handler")); errorMessage.faultCode = "Client.Authentication"; return(errorMessage); } int index = credentials.IndexOf(":"); string userid = null; string password = null; if (index != -1 && index != 0 && index != credentials.Length - 1) { userid = credentials.Substring(0, index); password = credentials.Substring(index + 1); try { IPrincipal principal = authHandler.CheckCredentials(userid, password, message); try { Thread.CurrentPrincipal = principal; ThreadContext.currentHttpContext().User = principal; } catch (Exception exception) { if (Log.isLogging(LoggingConstants.ERROR)) { Log.log(LoggingConstants.ERROR, "Unable to set current principal. Make sure your current permission set allows Principal Control", exception); } throw exception; } Credentials creds = new Credentials(); creds.userid = userid; creds.password = password; ThreadContext.setCallerCredentials(creds, principal); } catch (Exception exception) { ErrMessage errorMessage = new ErrMessage(messageId, exception); errorMessage.faultCode = "Client.Authentication"; return(errorMessage); } } else { ErrMessage errorMessage = new ErrMessage(messageId, new ServiceException("Invalid credentials")); errorMessage.faultCode = "Client.Authentication"; return(errorMessage); } } break; } return(new AckMessage(messageId, clientId, returnValue, new Hashtable())); }