예제 #1
0
        public void RemovesPermissionsForRemovedAccessType()
        {
            var accessType0 = AccessTypeDefinition.NewObject();
            var accessType1 = AccessTypeDefinition.NewObject();
            var accessType2 = AccessTypeDefinition.NewObject();

            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.AddAccessType(accessType0);
            securableClassDefinition.AddAccessType(accessType1);
            securableClassDefinition.AddAccessType(accessType2);

            var testHelper = new AccessControlTestHelper(ClientTransaction.Current);
            var acls       = new List <AccessControlList>();

            acls.Add(testHelper.CreateStatefulAcl(securableClassDefinition));
            acls.Add(testHelper.CreateStatelessAcl(securableClassDefinition));

            foreach (var acl in acls)
            {
                acl.CreateAccessControlEntry();
            }

            securableClassDefinition.RemoveAccessType(accessType1);
            foreach (var acl in acls)
            {
                var permissions = acl.AccessControlEntries[0].GetPermissions();
                Assert.That(permissions.Count, Is.EqualTo(2));
                Assert.That(permissions[0].AccessType, Is.SameAs(accessType0));
                Assert.That(permissions[1].AccessType, Is.SameAs(accessType2));
            }
        }
예제 #2
0
        public void LeavesPermissionsUntouched()
        {
            var accessType0 = AccessTypeDefinition.NewObject();
            var accessType1 = AccessTypeDefinition.NewObject();
            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.AddAccessType(accessType0);
            securableClassDefinition.AddAccessType(accessType1);

            var testHelper = new AccessControlTestHelper(ClientTransaction.Current);
            var acls       = new List <AccessControlList>();

            acls.Add(testHelper.CreateStatefulAcl(securableClassDefinition));
            acls.Add(testHelper.CreateStatelessAcl(securableClassDefinition));

            foreach (var acl in acls)
            {
                var ace = acl.CreateAccessControlEntry();
                ace.DenyAccess(accessType0);
                ace.AllowAccess(accessType1);
            }

            securableClassDefinition.MoveAccessType(0, accessType1);
            foreach (var acl in acls)
            {
                var permissions = acl.AccessControlEntries[0].GetPermissions();
                Assert.That(permissions.Count, Is.EqualTo(2));
                Assert.That(permissions[0].AccessType, Is.SameAs(accessType1));
                Assert.That(permissions[0].Allowed, Is.True);
                Assert.That(permissions[1].AccessType, Is.SameAs(accessType0));
                Assert.That(permissions[1].Allowed, Is.False);
            }
        }
예제 #3
0
        public void MoveToLaterPosition()
        {
            var accessType0 = AccessTypeDefinition.NewObject();
            var accessType1 = AccessTypeDefinition.NewObject();
            var accessType2 = AccessTypeDefinition.NewObject();
            var accessType3 = AccessTypeDefinition.NewObject();
            var accessType4 = AccessTypeDefinition.NewObject();
            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.AddAccessType(accessType0);
            securableClassDefinition.AddAccessType(accessType1);
            securableClassDefinition.AddAccessType(accessType2);
            securableClassDefinition.AddAccessType(accessType3);
            securableClassDefinition.AddAccessType(accessType4);

            securableClassDefinition.MoveAccessType(3, accessType1);

            Assert.That(securableClassDefinition.AccessTypes, Is.EqualTo(new[] { accessType0, accessType2, accessType3, accessType1, accessType4 }));
            var references = new SecurableClassDefinitionWrapper(securableClassDefinition).AccessTypeReferences;

            for (int i = 0; i < references.Count; i++)
            {
                Assert.That(((AccessTypeReference)references[i]).Index, Is.EqualTo(i));
            }
        }
예제 #4
0
        public void RemovesAccessType()
        {
            var accessType0 = AccessTypeDefinition.NewObject();
            var accessType1 = AccessTypeDefinition.NewObject();
            var accessType2 = AccessTypeDefinition.NewObject();
            var accessType3 = AccessTypeDefinition.NewObject();
            var accessType4 = AccessTypeDefinition.NewObject();

            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.AddAccessType(accessType0);
            securableClassDefinition.AddAccessType(accessType1);
            securableClassDefinition.AddAccessType(accessType2);
            securableClassDefinition.AddAccessType(accessType3);
            securableClassDefinition.AddAccessType(accessType4);

            securableClassDefinition.RemoveAccessType(accessType2);

            Assert.That(securableClassDefinition.AccessTypes, Is.EqualTo(new[] { accessType0, accessType1, accessType3, accessType4 }));
            var references = new SecurableClassDefinitionWrapper(securableClassDefinition).AccessTypeReferences;

            Assert.That(((AccessTypeReference)references[0]).Index, Is.EqualTo(0));
            Assert.That(((AccessTypeReference)references[1]).Index, Is.EqualTo(1));
            Assert.That(((AccessTypeReference)references[2]).Index, Is.EqualTo(2));
            Assert.That(((AccessTypeReference)references[3]).Index, Is.EqualTo(3));
        }
예제 #5
0
        public void AddsStateProperty()
        {
            var stateProperty            = StatePropertyDefinition.NewObject();
            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.AddStateProperty(stateProperty);

            Assert.That(securableClassDefinition.StateProperties, Is.EqualTo(new[] { stateProperty }));
        }
예제 #6
0
        public void DeleteFailsIfStatePropertyDefinitionIsAssociatedWithSecurableClassDefinition()
        {
            var securableClassDefinition = SecurableClassDefinition.NewObject();
            var property = _testHelper.CreateNewStateProperty("NewProperty");

            securableClassDefinition.AddStateProperty(property);

            var messge = "State property 'NewProperty' cannot be deleted because it is associated with at least one securable class definition.";

            Assert.That(() => property.Delete(), Throws.InvalidOperationException.And.Message.EqualTo(messge));
        }
예제 #7
0
        private SecurableClassDefinition CreateSecurableClassDefinition(ClientTransaction transaction, Guid metadataItemID, string name)
        {
            using (transaction.EnterNonDiscardingScope())
            {
                SecurableClassDefinition classDefinition = SecurableClassDefinition.NewObject();
                classDefinition.MetadataItemID = metadataItemID;
                classDefinition.Name           = name;

                return(classDefinition);
            }
        }
예제 #8
0
 private void CreateDerivedSecurableClassDefinitions(SecurableClassDefinition baseClassDefinition, int classDefinitionCount)
 {
     for (int i = 0; i < classDefinitionCount; i++)
     {
         SecurableClassDefinition classDefinition = SecurableClassDefinition.NewObject();
         classDefinition.MetadataItemID = Guid.NewGuid();
         classDefinition.Name           = string.Format("{0} - Subsclass {0}", baseClassDefinition.Name, i);
         classDefinition.Index          = i;
         classDefinition.BaseClass      = baseClassDefinition;
     }
 }
예제 #9
0
        public SecurableClassDefinition CreateClassDefinition(string name, SecurableClassDefinition baseClass)
        {
            using (_transaction.EnterNonDiscardingScope())
            {
                SecurableClassDefinition classDefinition = SecurableClassDefinition.NewObject();
                classDefinition.Name      = name;
                classDefinition.BaseClass = baseClass;

                return(classDefinition);
            }
        }
예제 #10
0
        public void FailsForIndexGreaterThanNumberOfItems()
        {
            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.Name = "Class";
            securableClassDefinition.AddAccessType(AccessTypeDefinition.NewObject());
            Assert.That(
                () => securableClassDefinition.InsertAccessType(2, AccessTypeDefinition.NewObject()),
                Throws.TypeOf <ArgumentOutOfRangeException>()
                .And.Message.StartsWith(
                    "The index must not be less than 0 or greater than the total number of access types for the securable class definition."));
        }
예제 #11
0
        public void FailsForNonExistentAccessType()
        {
            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.Name = "Class";
            securableClassDefinition.AddAccessType(AccessTypeDefinition.NewObject());
            securableClassDefinition.AddAccessType(AccessTypeDefinition.NewObject());
            Assert.That(
                () => securableClassDefinition.RemoveAccessType(AccessTypeDefinition.NewObject(Guid.NewGuid(), "Test", 42)),
                Throws.ArgumentException
                .And.Message.StartsWith("The access type 'Test' is not associated with the securable class definition."));
        }
예제 #12
0
        public void DeleteFailsIfStateDefinitionIsAssociatedWithStateProperty()
        {
            var accessType = _testHelper.CreateAccessTypeCreate(0);
            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.AddAccessType(accessType);

            var messge = "Access type 'Create|Remotion.Security.GeneralAccessTypes, Remotion.Security' "
                         + "cannot be deleted because it is associated with at least one securable class definition.";

            Assert.That(() => accessType.Delete(), Throws.InvalidOperationException.And.Message.EqualTo(messge));
        }
예제 #13
0
        public void RegisterForCommit_AfterCreation()
        {
            using (ClientTransaction.CreateRootTransaction().EnterNonDiscardingScope())
            {
                SecurableClassDefinition classDefinition = SecurableClassDefinition.NewObject();

                Assert.That(classDefinition.State, Is.EqualTo(StateType.New));

                Assert.That(() => classDefinition.RegisterForCommit(), Throws.Nothing);
                Assert.That(classDefinition.State, Is.EqualTo(StateType.New));
            }
        }
예제 #14
0
        public void FailsForNonExistentStateProperty()
        {
            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.Name = "Class";
            securableClassDefinition.AddStateProperty(StatePropertyDefinition.NewObject());
            securableClassDefinition.AddStateProperty(StatePropertyDefinition.NewObject());
            Assert.That(
                () => securableClassDefinition.RemoveStateProperty(StatePropertyDefinition.NewObject(Guid.NewGuid(), "Test")),
                Throws.ArgumentException
                .And.Message.StartsWith("The property 'Test' does not exist on the securable class definition."));
        }
예제 #15
0
        public void FailsForExistingAccessType()
        {
            var accessType = AccessTypeDefinition.NewObject(Guid.NewGuid(), "Test", 42);

            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.Name = "Class";
            securableClassDefinition.AddAccessType(accessType);
            Assert.That(
                () => securableClassDefinition.AddAccessType(accessType),
                Throws.ArgumentException
                .And.Message.StartsWith("The access type 'Test' has already been added to the securable class definition."));
        }
예제 #16
0
        public void RegisterForCommit_AfterDiscard()
        {
            using (ClientTransaction.CreateRootTransaction().EnterNonDiscardingScope())
            {
                SecurableClassDefinition classDefinition = SecurableClassDefinition.NewObject();

                classDefinition.Delete();

                Assert.That(classDefinition.State, Is.EqualTo(StateType.Invalid));

                Assert.That(() => classDefinition.RegisterForCommit(), Throws.TypeOf <ObjectInvalidException>());
            }
        }
예제 #17
0
        public void RemovesStateProperty()
        {
            var stateProperty0           = StatePropertyDefinition.NewObject();
            var stateProperty1           = StatePropertyDefinition.NewObject();
            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.AddStateProperty(stateProperty0);
            securableClassDefinition.AddStateProperty(stateProperty1);

            securableClassDefinition.RemoveStateProperty(stateProperty0);

            Assert.That(securableClassDefinition.StateProperties, Is.EqualTo(new[] { stateProperty1 }));
        }
예제 #18
0
        public void FailsForExistingStateProperty()
        {
            var stateProperty = StatePropertyDefinition.NewObject(Guid.NewGuid(), "Test");

            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.Name = "Class";
            securableClassDefinition.AddStateProperty(stateProperty);
            Assert.That(
                () => securableClassDefinition.AddStateProperty(stateProperty),
                Throws.ArgumentException
                .And.Message.StartsWith("The property 'Test' has already been added to the securable class definition."));
        }
예제 #19
0
        public void TouchesSecurableClassDefinition()
        {
            var securableClassDefinition = SecurableClassDefinition.NewObject();

            using (ClientTransaction.Current.CreateSubTransaction().EnterDiscardingScope())
            {
                securableClassDefinition.EnsureDataAvailable();
                Assert.That(securableClassDefinition.State, Is.EqualTo(StateType.Unchanged));

                securableClassDefinition.AddAccessType(AccessTypeDefinition.NewObject());

                Assert.That(securableClassDefinition.State, Is.EqualTo(StateType.Changed));
            }
        }
예제 #20
0
        public void FailsForIndexLessThanZero()
        {
            var accessType = AccessTypeDefinition.NewObject();
            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.Name = "Class";
            securableClassDefinition.AddAccessType(AccessTypeDefinition.NewObject());
            securableClassDefinition.AddAccessType(accessType);
            Assert.That(
                () => securableClassDefinition.MoveAccessType(-1, accessType),
                Throws.TypeOf <ArgumentOutOfRangeException>()
                .And.Message.StartsWith(
                    "The index must not be less than 0 or greater than the top index of the access types for the securable class definition."));
        }
예제 #21
0
        public void RegisterForCommit_InNotLoadedState()
        {
            using (ClientTransaction.CreateRootTransaction().EnterNonDiscardingScope())
            {
                SecurableClassDefinition classDefinition = SecurableClassDefinition.NewObject();
                using (ClientTransaction.Current.CreateSubTransaction().EnterDiscardingScope())
                {
                    Assert.That(classDefinition.State, Is.EqualTo(StateType.NotLoadedYet));

                    Assert.That(() => classDefinition.RegisterForCommit(), Throws.Nothing);
                    Assert.That(classDefinition.State, Is.EqualTo(StateType.Changed));
                }
            }
        }
예제 #22
0
 private SecurableClassDefinition[] CreateSecurableClassDefinitions(int classDefinitionCount, int derivedClassDefinitionCount)
 {
     SecurableClassDefinition[] classDefinitions = new SecurableClassDefinition[classDefinitionCount];
     for (int i = 0; i < classDefinitionCount; i++)
     {
         SecurableClassDefinition classDefinition = SecurableClassDefinition.NewObject();
         classDefinition.MetadataItemID = Guid.NewGuid();
         classDefinition.Name           = string.Format("Class {0}", i);
         classDefinition.Index          = i;
         classDefinitions[i]            = classDefinition;
         CreateDerivedSecurableClassDefinitions(classDefinition, derivedClassDefinitionCount);
     }
     return(classDefinitions);
 }
예제 #23
0
        public void CreateStateCombination_WithoutClassDefinition()
        {
            StatefulAccessControlList acl = _testHelper.CreateStatefulAcl(SecurableClassDefinition.NewObject());

            using (_testHelper.Transaction.CreateSubTransaction().EnterDiscardingScope())
            {
                acl.EnsureDataAvailable();
                Assert.That(acl.State, Is.EqualTo(StateType.Unchanged));

                acl.CreateStateCombination();

                Assert.That(acl.State, Is.EqualTo(StateType.Changed));
            }
        }
예제 #24
0
        public void AddsAccessTypes()
        {
            var accessType0 = AccessTypeDefinition.NewObject();
            var accessType1 = AccessTypeDefinition.NewObject();
            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.AddAccessType(accessType0);
            securableClassDefinition.AddAccessType(accessType1);

            Assert.That(securableClassDefinition.AccessTypes, Is.EqualTo(new[] { accessType0, accessType1 }));
            var references = new SecurableClassDefinitionWrapper(securableClassDefinition).AccessTypeReferences;

            Assert.That(((AccessTypeReference)references[0]).Index, Is.EqualTo(0));
            Assert.That(((AccessTypeReference)references[1]).Index, Is.EqualTo(1));
        }
예제 #25
0
        public void CreateStatelessAccessControlList_Twice()
        {
            using (ClientTransaction.CreateRootTransaction().EnterNonDiscardingScope())
            {
                SecurableClassDefinition classDefinition = SecurableClassDefinition.NewObject();
                using (ClientTransaction.Current.CreateSubTransaction().EnterDiscardingScope())
                {
                    classDefinition.EnsureDataAvailable();
                    Assert.That(classDefinition.State, Is.EqualTo(StateType.Unchanged));

                    classDefinition.CreateStatelessAccessControlList();
                    classDefinition.CreateStatelessAccessControlList();
                }
            }
        }
예제 #26
0
        public override void SetUp()
        {
            base.SetUp();

            ClientTransaction.CreateRootTransaction().EnterNonDiscardingScope();

            _metadataObject      = SecurableClassDefinition.NewObject();
            _metadataObject.Name = "Technical Name";

            _cultureInvariant = Culture.NewObject(string.Empty);
            _cultureDe        = Culture.NewObject("de");
            _cultureDeAt      = Culture.NewObject("de-AT");
            _cultureRu        = Culture.NewObject("ru");

            _backupCulture   = Thread.CurrentThread.CurrentCulture;
            _backupUICulture = Thread.CurrentThread.CurrentUICulture;
        }
예제 #27
0
        public void CreateStatelessAccessControlList()
        {
            using (ClientTransaction.CreateRootTransaction().EnterNonDiscardingScope())
            {
                SecurableClassDefinition classDefinition = SecurableClassDefinition.NewObject();
                using (ClientTransaction.Current.CreateSubTransaction().EnterDiscardingScope())
                {
                    classDefinition.EnsureDataAvailable();
                    Assert.That(classDefinition.State, Is.EqualTo(StateType.Unchanged));

                    StatelessAccessControlList accessControlList = classDefinition.CreateStatelessAccessControlList();

                    Assert.That(accessControlList.Class, Is.SameAs(classDefinition));
                    Assert.IsNotEmpty(accessControlList.AccessControlEntries);
                    Assert.That(classDefinition.State, Is.EqualTo(StateType.Changed));
                }
            }
        }
예제 #28
0
        public void RemoveStateProperty_DeletesAssociatedAccessControlListIfDeletedStateCombinationWasLastStateCombination()
        {
            var state1        = StateDefinition.NewObject("Test", 1);
            var state2        = StateDefinition.NewObject();
            var stateProperty = StatePropertyDefinition.NewObject();

            stateProperty.AddState(state1);

            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.AddStateProperty(stateProperty);
            var acl1 = securableClassDefinition.CreateStatefulAccessControlList();

            acl1.StateCombinations[0].AttachState(state1);

            var acl2 = securableClassDefinition.CreateStatefulAccessControlList();

            Assert.That(acl2.StateCombinations, Is.Not.Empty);

            var acl3 = securableClassDefinition.CreateStatefulAccessControlList();

            acl3.StateCombinations[0].Delete();

            var acl4 = securableClassDefinition.CreateStatefulAccessControlList();

            acl4.StateCombinations[0].AttachState(state2);

            securableClassDefinition.RemoveStateProperty(stateProperty);

            Assert.That(acl1.State, Is.EqualTo(StateType.Invalid));

            Assert.That(acl2.State, Is.EqualTo(StateType.New));
            Assert.That(acl2.StateCombinations.Count, Is.EqualTo(1));
            Assert.That(acl2.StateCombinations[0].GetStates(), Is.Empty);

            Assert.That(acl3.State, Is.EqualTo(StateType.New));
            Assert.That(acl3.StateCombinations, Is.Empty);

            Assert.That(acl4.State, Is.EqualTo(StateType.New));
            Assert.That(acl4.StateCombinations.Count, Is.EqualTo(1));
            Assert.That(acl4.StateCombinations[0].GetStates(), Is.EqualTo(new[] { state2 }));
        }
예제 #29
0
        public void OnCommitting_WithChangedStatePropertyReference_RegistersClassForCommit()
        {
            var classDefinition = SecurableClassDefinition.NewObject();
            var stateProperty   = _testHelper.CreateFileStateProperty(0);

            using (ClientTransaction.Current.CreateSubTransaction().EnterDiscardingScope())
            {
                bool commitOnClassWasCalled = false;
                classDefinition.Committing += (sender, e) =>
                {
                    commitOnClassWasCalled = true;
                    Assert.That(GetDataContainer((DomainObject)sender).HasBeenMarkedChanged, Is.True);
                };
                classDefinition.AddStateProperty(stateProperty);

                ClientTransaction.Current.Commit();

                Assert.That(commitOnClassWasCalled, Is.True);
            }
        }
예제 #30
0
        public void RemoveStateProperty_DeletesAssociatedStateCombinations()
        {
            var state1        = StateDefinition.NewObject("Test", 1);
            var state2        = StateDefinition.NewObject();
            var stateProperty = StatePropertyDefinition.NewObject();

            stateProperty.AddState(state1);

            var securableClassDefinition = SecurableClassDefinition.NewObject();

            securableClassDefinition.AddStateProperty(stateProperty);
            var acl = securableClassDefinition.CreateStatefulAccessControlList();

            acl.StateCombinations[0].AttachState(state1);
            acl.CreateStateCombination().AttachState(state2);

            securableClassDefinition.RemoveStateProperty(stateProperty);

            Assert.That(acl.StateCombinations.Count, Is.EqualTo(1));
            Assert.That(acl.StateCombinations[0].GetStates(), Is.EqualTo(new[] { state2 }));
        }