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);
        }
Beispiel #3
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
 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);
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
 /// <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);
     }
 }
Beispiel #10
0
        /// <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);
        }
Beispiel #11
0
 /// <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);
        }
Beispiel #13
0
 private static void RemoveDependency(List <SecurityActivity> dependencyList, SecurityActivity activity)
 {
     // this method must called from thread safe block.
     dependencyList.RemoveAll(x => x.Id == activity.Id);
 }
Beispiel #14
0
 internal abstract bool MustWaitFor(SecurityActivity olderActivity);
 internal override bool MustWaitFor(SecurityActivity olderActivity)
 {
     return(true);
 }
Beispiel #16
0
 /// <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);
 }
Beispiel #17
0
 internal void FinishWaiting(SecurityActivity olderActivity)
 {
     // this method must called from thread safe block.
     RemoveDependency(this.WaitingFor, olderActivity);
     RemoveDependency(olderActivity.WaitingForMe, this);
 }