/// <summary> /// Call handlers and check if sending a message to the clients connected to the SO is allowed. /// </summary> /// <param name="message"></param> /// <param name="arguments"></param> /// <returns></returns> protected bool IsSendAllowed(string message, IList arguments) { // Check internal handlers first foreach (ISharedObjectSecurity handler in _securityHandlers) { if (!handler.IsSendAllowed(this, message, arguments)) { return(false); } } // Check global SO handlers next IEnumerator handlers = GetSecurityHandlers(); if (handlers == null) { return(true); } while (handlers.MoveNext()) { ISharedObjectSecurity handler = handlers.Current as ISharedObjectSecurity; if (!handler.IsSendAllowed(this, message, arguments)) { return(false); } } return(true); }
/// <summary> /// Call handlers and check if deleting a property from the SO is allowed. /// </summary> /// <param name="key"></param> /// <returns></returns> protected bool IsDeleteAllowed(String key) { // Check internal handlers first foreach (ISharedObjectSecurity handler in _securityHandlers) { if (!handler.IsDeleteAllowed(this, key)) { return(false); } } // Check global SO handlers next IEnumerator handlers = GetSecurityHandlers(); if (handlers == null) { return(true); } while (handlers.MoveNext()) { ISharedObjectSecurity handler = handlers.Current as ISharedObjectSecurity; if (!handler.IsDeleteAllowed(this, key)) { return(false); } } return(true); }
protected override void OnSharedObject(RtmpConnection connection, RtmpChannel channel, RtmpHeader header, SharedObjectMessage message) { ISharedObject sharedObject = null; string name = message.Name; IScope scope = connection.Scope; bool isPersistent = message.IsPersistent; if (scope == null) { SharedObjectMessage message2; if (connection.ObjectEncoding == ObjectEncoding.AMF0) { message2 = new SharedObjectMessage(name, 0, isPersistent); } else { message2 = new FlexSharedObjectMessage(name, 0, isPersistent); } message2.AddEvent(new SharedObjectEvent(SharedObjectEventType.CLIENT_STATUS, "SharedObject.NoObjectFound", "error")); connection.GetChannel(3).Write(message2); } else { ISharedObjectService scopeService = ScopeUtils.GetScopeService(scope, typeof(ISharedObjectService)) as ISharedObjectService; if (!scopeService.HasSharedObject(scope, name)) { ISharedObjectSecurityService service2 = ScopeUtils.GetScopeService(scope, typeof(ISharedObjectSecurityService)) as ISharedObjectSecurityService; if (service2 != null) { IEnumerator sharedObjectSecurity = service2.GetSharedObjectSecurity(); while (sharedObjectSecurity.MoveNext()) { ISharedObjectSecurity current = sharedObjectSecurity.Current as ISharedObjectSecurity; if (!current.IsCreationAllowed(scope, name, isPersistent)) { SendSOCreationFailed(connection, name, isPersistent); return; } } } if (!scopeService.CreateSharedObject(scope, name, isPersistent)) { SendSOCreationFailed(connection, name, isPersistent); return; } } sharedObject = scopeService.GetSharedObject(scope, name); if (sharedObject.IsPersistentObject != isPersistent) { log.Debug(string.Format("Shared object '{0}' persistence mismatch", name)); SendSOPersistenceMismatch(connection, name, isPersistent); } else { sharedObject.DispatchEvent(message); } } }
protected override void OnSharedObject(RtmpConnection connection, RtmpChannel channel, RtmpHeader header, SharedObjectMessage message) { ISharedObject so = null; string name = message.Name; IScope scope = connection.Scope; bool persistent = message.IsPersistent; if (scope == null) { // The scope already has been deleted. SendSOCreationFailed(connection, name, persistent); return; } ISharedObjectService sharedObjectService = ScopeUtils.GetScopeService(scope, typeof(ISharedObjectService)) as ISharedObjectService; if (!sharedObjectService.HasSharedObject(scope, name)) { ISharedObjectSecurityService securityService = ScopeUtils.GetScopeService(scope, typeof(ISharedObjectSecurityService)) as ISharedObjectSecurityService; if (securityService != null) { // Check handlers to see if creation is allowed IEnumerator enumerator = securityService.GetSharedObjectSecurity(); while (enumerator.MoveNext()) { ISharedObjectSecurity handler = enumerator.Current as ISharedObjectSecurity; if (!handler.IsCreationAllowed(scope, name, persistent)) { SendSOCreationFailed(connection, name, persistent); return; } } } if (!sharedObjectService.CreateSharedObject(scope, name, persistent)) { SendSOCreationFailed(connection, name, persistent); return; } } so = sharedObjectService.GetSharedObject(scope, name); if (so.IsPersistentObject != persistent) { log.Debug(string.Format("Shared object '{0}' persistence mismatch", name)); SendSOPersistenceMismatch(connection, name, persistent); return; } so.DispatchEvent(message); }
public void UnregisterSharedObjectSecurity(ISharedObjectSecurity handler) { _securityHandlers.Remove(handler); }
public void RegisterSharedObjectSecurity(ISharedObjectSecurity handler) { _securityHandlers.Add(handler); }
/// <summary> /// Removes handler that protects shared objects. /// </summary> /// <param name="handler">The ISharedObjectSecurity handler.</param> public void UnregisterSharedObjectSecurity(ISharedObjectSecurity handler) { _sharedObjectSecurityHandlers.Remove(handler); }
/// <summary> /// Adds handler that protects shared objects. /// </summary> /// <param name="handler">The ISharedObjectSecurity handler.</param> public void RegisterSharedObjectSecurity(ISharedObjectSecurity handler) { _sharedObjectSecurityHandlers.Add(handler); }