internal override bool MustWaitFor(SecurityActivity olderActivity) { if (olderActivity is MembershipActivity) { return(true); } // There aren't any valid scenarios if the olderActivity is ModifySecurityEntityOwnerActivity or SetAclActivity var createSecurityEntityActivity = olderActivity as CreateSecurityEntityActivity; if (createSecurityEntityActivity != null) { return(createSecurityEntityActivity.EntityId == this.ParentEntityId); } var deleteSecurityEntityActivity = olderActivity as DeleteSecurityEntityActivity; if (deleteSecurityEntityActivity != null) { return(deleteSecurityEntityActivity.EntityId == this.EntityId || DependencyTools.IsInTree(this.Context, this.ParentEntityId, deleteSecurityEntityActivity.EntityId)); } var moveSecurityEntityActivity = olderActivity as MoveSecurityEntityActivity; if (moveSecurityEntityActivity != null) { return((moveSecurityEntityActivity.SourceId == this.EntityId) || (moveSecurityEntityActivity.TargetId == this.EntityId)); } return(false); }
internal override bool MustWaitFor(SecurityActivity olderActivity) { if (olderActivity is MembershipActivity) { return(true); } // There aren't any valid scenarios if the olderActivity is ModifySecurityEntityOwnerActivity or MoveSecurityEntityActivity var createSecurityEntityActivity = olderActivity as CreateSecurityEntityActivity; if (createSecurityEntityActivity != null) { return(this.AllEntityIds.Contains(createSecurityEntityActivity.EntityId)); } var deleteSecurityEntityActivity = olderActivity as DeleteSecurityEntityActivity; if (deleteSecurityEntityActivity != null) { return(DependencyTools.AnyIsInTree(this.Context, this.AllEntityIds, deleteSecurityEntityActivity.EntityId)); } var setAclActivity = olderActivity as SetAclActivity; if (setAclActivity != null) { return(setAclActivity.AllEntityIds.Intersect(this.AllEntityIds).Any()); } return(false); }
internal override bool MustWaitFor(SecurityActivity olderActivity) { if (olderActivity is MembershipActivity) { return(true); } // There aren't any valid scenarios if the olderActivity is ModifySecurityEntityOwnerActivity or SetAclActivity if (olderActivity is CreateSecurityEntityActivity createSecurityEntityActivity) { return(createSecurityEntityActivity.EntityId == ParentEntityId); } if (olderActivity is DeleteSecurityEntityActivity deleteSecurityEntityActivity) { return(deleteSecurityEntityActivity.EntityId == EntityId || DependencyTools.IsInTree(Context, ParentEntityId, deleteSecurityEntityActivity.EntityId)); } if (olderActivity is MoveSecurityEntityActivity moveSecurityEntityActivity) { return(moveSecurityEntityActivity.SourceId == EntityId || moveSecurityEntityActivity.TargetId == EntityId); } return(false); }
internal override bool MustWaitFor(SecurityActivity olderActivity) { if (olderActivity is MembershipActivity) { return(true); } // There aren't any valid scenarios if the olderActivity is ModifySecurityEntityOwnerActivity or SetAclActivity var createSecurityEntityActivity = olderActivity as CreateSecurityEntityActivity; if (createSecurityEntityActivity != null) { return((this.SourceId == createSecurityEntityActivity.EntityId) || (this.TargetId == createSecurityEntityActivity.EntityId)); } var deleteSecurityEntityActivity = olderActivity as DeleteSecurityEntityActivity; if (deleteSecurityEntityActivity != null) { var ctx = this.Context; var entities = SecurityEntity.PeekEntities(ctx, deleteSecurityEntityActivity.EntityId, this.SourceId, this.TargetId); var deleteTarget = entities[0]; var moveSource = entities[1]; var moveTarget = entities[2]; if (DependencyTools.HasAncestorRelation(ctx, moveSource, deleteTarget)) { return(true); } if (DependencyTools.HasAncestorRelation(ctx, moveTarget, deleteTarget)) { return(true); } } var moveSecurityEntityActivity = olderActivity as MoveSecurityEntityActivity; if (moveSecurityEntityActivity != null) { var ctx = this.Context; var entities = SecurityEntity.PeekEntities(ctx, this.SourceId, this.TargetId, moveSecurityEntityActivity.SourceId, moveSecurityEntityActivity.TargetId); var move1Source = entities[0]; var move1Target = entities[1]; var move2Source = entities[2]; var move2Target = entities[3]; if ( DependencyTools.HasAncestorRelation(ctx, move1Source, move2Source) || DependencyTools.HasAncestorRelation(ctx, move1Source, move2Target) || DependencyTools.HasAncestorRelation(ctx, move1Target, move2Source) || DependencyTools.HasAncestorRelation(ctx, move1Target, move2Target) ) { return(true); } } return(false); }
internal override bool MustWaitFor(SecurityActivity olderActivity) { if (olderActivity is MembershipActivity) { return(true); } var createSecurityEntityActivity = olderActivity as CreateSecurityEntityActivity; if (createSecurityEntityActivity != null) { return((createSecurityEntityActivity.EntityId == this.EntityId) || DependencyTools.IsInTree(this.Context, createSecurityEntityActivity.ParentEntityId, this.EntityId)); } var deleteSecurityEntityActivity = olderActivity as DeleteSecurityEntityActivity; if (deleteSecurityEntityActivity != null) { return(DependencyTools.HasAncestorRelation(this.Context, this.EntityId, deleteSecurityEntityActivity.EntityId)); } var modifySecurityEntityOwnerActivity = olderActivity as ModifySecurityEntityOwnerActivity; if (modifySecurityEntityOwnerActivity != null) { return(DependencyTools.IsInTree(this.Context, modifySecurityEntityOwnerActivity.EntityId, this.EntityId)); } var moveSecurityEntityActivity = olderActivity as MoveSecurityEntityActivity; if (moveSecurityEntityActivity != null) { var ctx = this.Context; var entities = SecurityEntity.PeekEntities(ctx, this.EntityId, moveSecurityEntityActivity.SourceId, moveSecurityEntityActivity.TargetId); var deleteTarget = entities[0]; var moveSource = entities[1]; var moveTarget = entities[2]; if (DependencyTools.HasAncestorRelation(ctx, moveSource, deleteTarget)) { return(true); } if (DependencyTools.IsInTree(ctx, moveTarget, this.EntityId)) { return(true); } } var setAclActivity = olderActivity as SetAclActivity; if (setAclActivity != null) { return(DependencyTools.AnyIsInTree(this.Context, setAclActivity.AllEntityIds, this.EntityId)); } return(false); }
internal void WaitFor(SecurityActivity olderActivity) { // this method must called from thread safe block. if (this.WaitingFor.All(x => x.Id != olderActivity.Id)) { this.WaitingFor.Add(olderActivity); } if (olderActivity.WaitingForMe.All(x => x.Id != this.Id)) { olderActivity.WaitingForMe.Add(this); } }
internal override bool MustWaitFor(SecurityActivity olderActivity) { if (olderActivity is MembershipActivity) { return(true); } // There aren't any valid scenarios if the olderActivity is ModifySecurityEntityOwnerActivity or SetAclActivity if (olderActivity is CreateSecurityEntityActivity createSecurityEntityActivity) { return(SourceId == createSecurityEntityActivity.EntityId || TargetId == createSecurityEntityActivity.EntityId); } if (olderActivity is DeleteSecurityEntityActivity deleteSecurityEntityActivity) { var ctx = Context; var entities = ctx.SecuritySystem.EntityManager.PeekEntities(deleteSecurityEntityActivity.EntityId, SourceId, TargetId); var deleteTarget = entities[0]; var moveSource = entities[1]; var moveTarget = entities[2]; if (DependencyTools.HasAncestorRelation(ctx, moveSource, deleteTarget)) { return(true); } if (DependencyTools.HasAncestorRelation(ctx, moveTarget, deleteTarget)) { return(true); } } if (olderActivity is MoveSecurityEntityActivity moveSecurityEntityActivity) { var ctx = Context; var entities = ctx.SecuritySystem.EntityManager.PeekEntities(SourceId, TargetId, moveSecurityEntityActivity.SourceId, moveSecurityEntityActivity.TargetId); var move1Source = entities[0]; var move1Target = entities[1]; var move2Source = entities[2]; var move2Target = entities[3]; if ( DependencyTools.HasAncestorRelation(ctx, move1Source, move2Source) || DependencyTools.HasAncestorRelation(ctx, move1Source, move2Target) || DependencyTools.HasAncestorRelation(ctx, move1Target, move2Source) || DependencyTools.HasAncestorRelation(ctx, move1Target, move2Target)) { return(true); } } return(false); }
internal override bool MustWaitFor(SecurityActivity olderActivity) { if (olderActivity is MembershipActivity) { return(true); } if (olderActivity is CreateSecurityEntityActivity createSecurityEntityActivity) { return(createSecurityEntityActivity.EntityId == EntityId || DependencyTools.IsInTree(Context, createSecurityEntityActivity.ParentEntityId, EntityId)); } if (olderActivity is DeleteSecurityEntityActivity deleteSecurityEntityActivity) { return(DependencyTools.HasAncestorRelation(Context, EntityId, deleteSecurityEntityActivity.EntityId)); } if (olderActivity is ModifySecurityEntityOwnerActivity modifySecurityEntityOwnerActivity) { return(DependencyTools.IsInTree(Context, modifySecurityEntityOwnerActivity.EntityId, EntityId)); } if (olderActivity is MoveSecurityEntityActivity moveSecurityEntityActivity) { var ctx = Context; var entities = ctx.SecuritySystem.EntityManager.PeekEntities(EntityId, moveSecurityEntityActivity.SourceId, moveSecurityEntityActivity.TargetId); var deleteTarget = entities[0]; var moveSource = entities[1]; var moveTarget = entities[2]; if (DependencyTools.HasAncestorRelation(ctx, moveSource, deleteTarget)) { return(true); } if (DependencyTools.IsInTree(ctx, moveTarget, EntityId)) { return(true); } } if (olderActivity is SetAclActivity setAclActivity) { return(DependencyTools.AnyIsInTree(Context, setAclActivity.AllEntityIds, EntityId)); } return(false); }
/// <summary> /// When an activity gets executed and needs to be finalized, all activity objects that have /// the same id need to be finalized too. The Attach methods puts all activities with the /// same id to a chain to let the Finish method call the Finish method of each object in the chain. /// This method was needed because it is possible that the same activity arrives from different /// sources: e.g from messaging, from database or from direct execution. /// </summary> /// <param name="activity"></param> internal void Attach(SecurityActivity activity) { if (ReferenceEquals(this, activity)) { return; } if (AttachedActivity == null) { AttachedActivity = activity; } else { AttachedActivity.Attach(activity); } }
/// <summary> /// Deserializes an activity that comes from the to database. /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static SecurityActivity DeserializeActivity(byte[] bytes) { Stream data = new MemoryStream(bytes); var bf = new BinaryFormatter(); SecurityActivity activity = null; try { activity = (SecurityActivity)bf.Deserialize(data); } catch (SerializationException e) // logged { SnLog.WriteException(e, EventMessage.Error.Deserialization, EventId.Serialization); } return(activity); }
/// <summary> /// Serializes an activity for persisting to database. /// </summary> public static byte[] SerializeActivity(SecurityActivity activity) { try { var ms = new MemoryStream(); var bf = new BinaryFormatter(); bf.Serialize(ms, activity); ms.Flush(); ms.Position = 0; return(ms.GetBuffer()); } catch (Exception e) // logged and rethrown { SnLog.WriteException(e, EventMessage.Error.Serialization, EventId.Serialization); throw; } }
internal override bool MustWaitFor(SecurityActivity olderActivity) { if (olderActivity is MembershipActivity) { return(true); } // There aren't any valid scenarios if the olderActivity is DeleteSecurityEntityActivity, MoveSecurityEntityActivity or SetAclActivity if (olderActivity is CreateSecurityEntityActivity createSecurityEntityActivity) { return(createSecurityEntityActivity.EntityId == EntityId); } var modifySecurityEntityOwnerActivity = olderActivity as ModifySecurityEntityOwnerActivity; return(modifySecurityEntityOwnerActivity?.EntityId == EntityId); }
private static void RemoveDependency(List <SecurityActivity> dependencyList, SecurityActivity activity) { // this method must called from thread safe block. dependencyList.RemoveAll(x => x.Id == activity.Id); }
internal abstract bool MustWaitFor(SecurityActivity olderActivity);
internal override bool MustWaitFor(SecurityActivity olderActivity) { return(true); }
/// <summary> /// WARNING! Do not use this method in your code. /// Called by the message receiver. /// </summary> public static void Apply(SecurityActivity activity) { activity.Execute(SecurityContext.General, false); }
internal void FinishWaiting(SecurityActivity olderActivity) { // this method must called from thread safe block. RemoveDependency(this.WaitingFor, olderActivity); RemoveDependency(olderActivity.WaitingForMe, this); }