Esempio n. 1
0
        public void Update(UpdateOpContext context)
        {
            ExchangeConnector        exconn = (ExchangeConnector)context.Connector;
            ActiveDirectoryConnector adconn = exconn.ActiveDirectoryConnector;

            adconn.Update(context.UpdateType, context.ObjectClass, context.Uid, context.Attributes, context.Options);
        }
        public void TestContainerChange_account()
        {
            ActiveDirectoryConnector connector = new ActiveDirectoryConnector();
            connector.Init(ConfigHelper.GetConfiguration());

            Uid createOuUid = null;
            Uid createUserUid = null;

            try
            {
                // create container for this test
                ICollection<ConnectorAttribute> ouAttributes = GetNormalAttributes_OrganizationalUnit();
                createOuUid = CreateAndVerifyObject(connector,
                    ActiveDirectoryConnector.ouObjectClass, ouAttributes);
                ICollection<ConnectorObject> ouResults = TestHelpers.SearchToList(
                    connector, ActiveDirectoryConnector.ouObjectClass, FilterBuilder.EqualTo(createOuUid));
                Assert.AreEqual(1, ouResults.Count);
                Assert.AreEqual(createOuUid, ouResults.ElementAt(0).Uid);

                // as a reminder, the uid is the dn for non account objects (idm backward compatiblity)
                String ouPath = createOuUid.GetUidValue();

                // create user
                ICollection<ConnectorAttribute> userAttributes = GetNormalAttributes_Account();
                createUserUid = CreateAndVerifyObject(connector,
                    ObjectClass.ACCOUNT, userAttributes);

                //now change user container to the newly created one
                Name createdName = ConnectorAttributeUtil.GetNameFromAttributes(userAttributes);
                String newName = ActiveDirectoryUtils.GetRelativeName(createdName);
                newName += ", " + ouPath;
                ICollection<ConnectorAttribute> updateAttrs = new HashSet<ConnectorAttribute>();
                updateAttrs.Add(new Name(newName));
                updateAttrs.Add(createUserUid);

                connector.Update(UpdateType.REPLACE, ObjectClass.ACCOUNT, updateAttrs, null);

                ICollection<ConnectorObject> results = TestHelpers.SearchToList(
                    connector, ObjectClass.ACCOUNT, FilterBuilder.EqualTo(createUserUid));
                Assert.AreEqual(1, results.Count);
                Assert.AreEqual(createUserUid, results.ElementAt(0).Uid);
                ConnectorAttribute foundContainerAttr = results.ElementAt(0).GetAttributeByName("ad_container");
                Assert.IsNotNull(foundContainerAttr);

                String lhs = ActiveDirectoryUtils.NormalizeLdapString(ouPath);
                String rhs = ActiveDirectoryUtils.NormalizeLdapString(ConnectorAttributeUtil.GetStringValue(foundContainerAttr));
                Assert.AreEqual(lhs, rhs);
            }
            finally
            {
                if (createUserUid != null)
                {
                    //remove the one we created
                    DeleteAndVerifyObject(connector, ObjectClass.ACCOUNT,
                        createUserUid, false, true);
                }

                if (createOuUid != null)
                {
                    //remove the one we created
                    DeleteAndVerifyObject(connector, ActiveDirectoryConnector.ouObjectClass,
                        createOuUid, false, true);
                }
            }
        }
        public Uid UpdateReplaceAndVerifyObject(ActiveDirectoryConnector connector,
            ObjectClass oclass, Uid uid, ICollection<ConnectorAttribute> attributes)
        {
            attributes.Add(uid);
            Filter uidFilter = FilterBuilder.EqualTo(uid);

            // find the object ... can't update if it doesn't exist
            ICollection<ConnectorObject> currentConnectorObjects = TestHelpers.SearchToList(
                connector, oclass, uidFilter);
            Assert.AreEqual(1, currentConnectorObjects.Count);

            Uid updatedUid = connector.Update(UpdateType.REPLACE, oclass,
                attributes, null);

            Assert.IsNotNull(updatedUid);

            uidFilter = FilterBuilder.EqualTo(updatedUid);
            ICollection<ConnectorObject> updatedConnectorObjects = TestHelpers.SearchToList(
                connector, oclass, uidFilter);
            Assert.IsTrue(updatedConnectorObjects.Count == 1);
            VerifyObject(attributes, updatedConnectorObjects.ElementAt(0));
            return updatedUid;
        }
        public Uid UpdateAddAndVerifyUser(ActiveDirectoryConnector connector,
            ObjectClass oclass, Uid uid, ICollection<ConnectorAttribute> attributes,
            OperationOptions searchOptions)
        {
            // find the existing one, and save off all attributes
            Filter uidFilter = FilterBuilder.EqualTo(uid);
            ICollection<ConnectorObject> currentObjects = TestHelpers.SearchToList(
                connector, oclass, uidFilter, searchOptions);
            Assert.IsTrue(currentObjects.Count == 1);
            ICollection<ConnectorAttribute> currentAttributes =
                currentObjects.ElementAt(0).GetAttributes();

            // build a list that has the 'added' values added to the existing values
            ICollection<ConnectorAttribute> comparisonAttributes = new List<ConnectorAttribute>();
            foreach (ConnectorAttribute updateAttribute in attributes)
            {
                ConnectorAttribute existingAttribute = ConnectorAttributeUtil.Find(
                    updateAttribute.Name, currentAttributes);
                comparisonAttributes.Add(AttConcat(updateAttribute, existingAttribute));
            }

            // make sure the uid is present in the attributes
            attributes.Add(uid);
            // now update with ADD to add additional home phones
            Uid updatedUid = connector.Update(UpdateType.ADD, oclass,
                attributes, null);

            // find it back
            ICollection<ConnectorObject> updatedObjects = TestHelpers.SearchToList(
                connector, oclass, uidFilter, searchOptions);
            Assert.IsTrue(updatedObjects.Count == 1);

            VerifyObject(comparisonAttributes, updatedObjects.ElementAt(0));

            return updatedUid;
        }
        public void TestSync(bool searchChildDomains, String container)
        {
            //Initialize Connector
            ActiveDirectoryConnector connector = new ActiveDirectoryConnector();
            ActiveDirectoryConfiguration configuration =
                (ActiveDirectoryConfiguration)ConfigHelper.GetConfiguration();
            configuration.SearchContext = container;
            configuration.SearchChildDomains = searchChildDomains;
            connector.Init(configuration);

            Uid createUid = null;

            ICollection<Uid> createdUids = new List<Uid>();
            try
            {
                SyncTestHelper syncHelper = new SyncTestHelper();

                // do the first sync
                //connector.Sync(ObjectClass.ACCOUNT, syncHelper.Token, syncHelper.SyncHandler_Initial, null);

                syncHelper.Init(connector.GetLatestSyncToken(ObjectClass.ACCOUNT));
                ICollection<ConnectorAttribute> attributes = null;

                // create some users
                for (int i = 0; i < 10; i++)
                {
                    attributes = GetNormalAttributes_Account();
                    createUid = CreateAndVerifyObject(connector, ObjectClass.ACCOUNT,
                        attributes);
                    syncHelper.AddModUid(createUid, attributes);
                    createdUids.Add(createUid);
                }

                // sync, and verify
                connector.Sync(ObjectClass.ACCOUNT, syncHelper._token, syncHelper.SyncHandler_ModifiedAccounts, null);
                syncHelper.CheckAllSyncsProcessed();

                // reset everything
                syncHelper.Init(connector.GetLatestSyncToken(ObjectClass.ACCOUNT));

                // modify a user, then add some users, then modify one of the added users
                attributes = new List<ConnectorAttribute>();
                attributes.Add(createdUids.First());
                attributes.Add(ConnectorAttributeBuilder.Build("sn", "replaced"));
                connector.Update(UpdateType.REPLACE, ObjectClass.ACCOUNT, attributes, null);
                syncHelper.AddModUid(createdUids.First(), attributes);

                for (int i = 0; i < 10; i++)
                {
                    attributes = GetNormalAttributes_Account();
                    createUid = CreateAndVerifyObject(connector, ObjectClass.ACCOUNT,
                        attributes);
                    syncHelper.AddModUid(createUid, attributes);
                    createdUids.Add(createUid);
                }

                attributes = new List<ConnectorAttribute>();
                attributes.Add(createdUids.Last());
                attributes.Add(ConnectorAttributeBuilder.Build("sn", "replaced"));
                connector.Update(UpdateType.REPLACE, ObjectClass.ACCOUNT, attributes, null);
                syncHelper.AddModUid(createdUids.Last(), attributes);

                // sync, and verify
                connector.Sync(ObjectClass.ACCOUNT, syncHelper._token, syncHelper.SyncHandler_ModifiedAccounts, null);
                syncHelper.CheckAllSyncsProcessed();

                syncHelper.Init(connector.GetLatestSyncToken(ObjectClass.ACCOUNT));
                // delete the user
                foreach (Uid uid in createdUids)
                {
                    DeleteAndVerifyObject(connector, ObjectClass.ACCOUNT, uid,
                        false, true);
                    syncHelper.AddDelUid(uid);
                }
                // sync and verify
                connector.Sync(ObjectClass.ACCOUNT, syncHelper._token, syncHelper.SyncHandler_DeletedAccounts, null);
                syncHelper.CheckAllSyncsProcessed();

                createUid = CreateAndVerifyObject(connector, ObjectClass.ACCOUNT,
                    GetNormalAttributes_Account());
                syncHelper.AddModUid(createUid, attributes);
                createdUids.Add(createUid);

                // now get the latest sync token, and it
                // should be greater or equal to the last one we saw
                SyncToken latestToken = connector.GetLatestSyncToken(ObjectClass.ACCOUNT);
                Assert.Greater(GetUpdateUsnFromToken(latestToken), GetUpdateUsnFromToken(syncHelper._token));
                Assert.GreaterOrEqual(GetDeleteUsnFromToken(latestToken), GetDeleteUsnFromToken(syncHelper._token));
            }
            finally
            {
                foreach (Uid uid in createdUids)
                {
                    DeleteAndVerifyObject(connector, ObjectClass.ACCOUNT, uid,
                        false, false);
                }
            }
        }
        public void TestRemoveAttributeValue()
        {
            ActiveDirectoryConnector connector = new ActiveDirectoryConnector();
            connector.Init(ConfigHelper.GetConfiguration());

            Uid createUid = null;

            try
            {
                int randomNumber = GetRandomNumber();
                ICollection<ConnectorAttribute> attributes = new HashSet<ConnectorAttribute>();

                attributes.Add(ConnectorAttributeBuilder.Build(
                    "ad_container", GetProperty(ConfigHelper.CONFIG_PROPERTY_CONTAINER)));
                attributes.Add(ConnectorAttributeBuilder.Build(
                    "userPassword", "secret"));
                attributes.Add(ConnectorAttributeBuilder.Build(
                    "sAMAccountName", "nunit" + randomNumber));
                attributes.Add(ConnectorAttributeBuilder.Build(
                    "givenName", "nunit"));
                attributes.Add(ConnectorAttributeBuilder.Build(
                    "sn", "TestUser" + randomNumber));
                attributes.Add(ConnectorAttributeBuilder.Build(
                    "displayName", "nunit test user " + randomNumber));
                attributes.Add(ConnectorAttributeBuilder.Build(
                    Name.NAME, "cn=nunit" + randomNumber + "," +
                    GetProperty(ConfigHelper.CONFIG_PROPERTY_CONTAINER)));
                attributes.Add(ConnectorAttributeBuilder.Build(
                    "mail", "nunitUser" + randomNumber + "@some.com"));
                attributes.Add(ConnectorAttributeBuilder.Build(
                    "otherHomePhone", "512.555.1212", "512.123.4567"));

                createUid = CreateAndVerifyObject(connector, ObjectClass.ACCOUNT,
                    attributes);

                ICollection<ConnectorAttribute> modifyAttributes = new HashSet<ConnectorAttribute>();
                modifyAttributes.Add(createUid);
                modifyAttributes.Add(ConnectorAttributeBuilder.Build("otherHomePhone", "512.555.1212"));

                connector.Update(UpdateType.DELETE, ObjectClass.ACCOUNT, modifyAttributes, null);

                Filter uidFilter = FilterBuilder.EqualTo(createUid);
                IList<ConnectorObject> objects = TestHelpers.SearchToList(connector, ObjectClass.ACCOUNT, uidFilter);
                Assert.AreEqual(1, objects.Count);

                ConnectorAttribute otherHomePhoneAttr = ConnectorAttributeUtil.Find(
                    "otherHomePhone", objects[0].GetAttributes());

                Assert.AreEqual(1, otherHomePhoneAttr.Value.Count);
                Assert.AreEqual("512.123.4567", ConnectorAttributeUtil.GetSingleValue(otherHomePhoneAttr));
            }
            finally
            {
                if (createUid != null)
                {
                    //remove the one we created
                    DeleteAndVerifyObject(connector, ObjectClass.ACCOUNT,
                        createUid, false, true);
                }
            }
        }
Esempio n. 7
0
        public void Update(UpdateOpContext context)
        {
            ExchangeConnector        exconn = (ExchangeConnector)context.Connector;
            ActiveDirectoryConnector adconn = exconn.ActiveDirectoryConnector;

            // update in AD first
            var filtered = ExchangeUtility.FilterOut(
                context.Attributes,
                PSExchangeConnector.CommandInfo.EnableMailbox,
                PSExchangeConnector.CommandInfo.EnableMailUser,
                PSExchangeConnector.CommandInfo.SetMailbox,
                PSExchangeConnector.CommandInfo.SetMailUser);

            adconn.Update(context.UpdateType, context.ObjectClass, context.Uid, filtered, context.Options);

            // retrieve Exchange-related information about the user
            string          query         = "(objectGUID=" + ActiveDirectoryUtils.ConvertUIDToSearchString(context.Uid) + ")";
            ConnectorObject currentObject = _helper.GetCurrentObject(context, query);
            ICollection <ConnectorAttribute> attributesForReplace = _helper.DetermineNewAttributeValues(context, currentObject);

            attributesForReplace = DeduplicateEmailAddresses(context, attributesForReplace);

            string origRcptType;
            var    newRcptType = _helper.DetermineOrigAndNewAttributeValue(context, currentObject, attributesForReplace, ExchangeConnectorAttributes.AttRecipientType, out origRcptType);

            if (newRcptType == null)
            {
                newRcptType = ExchangeConnectorAttributes.RcptTypeUser;
            }

            string origDatabase;
            var    newDatabase = _helper.DetermineOrigAndNewAttributeValue(context, currentObject, attributesForReplace, ExchangeConnectorAttributes.AttDatabase, out origDatabase);

            // PART 1 - DEALING WITH MailUser CASE

            if (ExchangeConnectorAttributes.RcptTypeMailUser.Equals(newRcptType))
            {
                // disabling Mailbox if needed
                if (ExchangeConnectorAttributes.RcptTypeMailBox.Equals(origRcptType))
                {
                    Command cmdDisable = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.DisableMailbox, attributesForReplace, context.Uid, exconn.Configuration);
                    cmdDisable.Parameters.Add("Confirm", false);
                    _helper.InvokePipeline(exconn, cmdDisable);
                }

                // enabling MailUser if needed
                if (!ExchangeConnectorAttributes.RcptTypeMailUser.Equals(origRcptType))
                {
                    // Enable-MailUser needs the value of ExternalEmailAddress, so we have to get it
                    string origExternalEmailAddress;
                    var    newExternalEmailAddress = _helper.DetermineOrigAndNewAttributeValue(context, currentObject, attributesForReplace, ExchangeConnectorAttributes.AttExternalEmailAddress, out origExternalEmailAddress);

                    if (String.IsNullOrEmpty(newExternalEmailAddress))
                    {
                        throw new InvalidOperationException("Missing ExternalEmailAddress value, which is required for a MailUser");
                    }
                    ExchangeUtility.SetAttValue(ExchangeConnectorAttributes.AttExternalEmailAddress, newExternalEmailAddress, attributesForReplace);

                    // now execute the Enable-MailUser command
                    Command cmdEnable = ExchangeUtility.GetCommand(
                        PSExchangeConnector.CommandInfo.EnableMailUser, attributesForReplace, context.Uid, exconn.Configuration);
                    _helper.InvokePipeline(exconn, cmdEnable);
                }

                // setting MailUser attributes
                Command cmdSet = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.SetMailUser, attributesForReplace, context.Uid, exconn.Configuration);
                _helper.InvokePipeline(exconn, cmdSet);
            }

            // PART 2 - DEALING WITH UserMailbox CASE

            else if (ExchangeConnectorAttributes.RcptTypeMailBox.Equals(newRcptType))
            {
                // enable mailbox if necessary

                // we should execute something like this here:
                // get-user -identity id|?{$_.RecipientType -eq "User"}|enable-mailbox -database "db"
                // unfortunately I was not able to get it working with the pipeline... that's why there are two commands
                // executed :-(
                // alternatively there can be something like:
                // get-user -identity id -RecipientTypeDetails User|enable-mailbox -database "db", but we have then trouble
                // with detecting attempt to change the database attribute
                if (!ExchangeConnectorAttributes.RcptTypeMailBox.Equals(origRcptType))
                {
                    Command cmdEnable = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.EnableMailbox, attributesForReplace, context.Uid, exconn.Configuration);
                    _helper.InvokePipeline(exconn, cmdEnable);
                }
                else
                {
                    // are we trying to update the database?
                    if (newDatabase != null && origDatabase != null && !newDatabase.Equals(origDatabase))
                    {
                        throw new ArgumentException(
                                  context.ConnectorConfiguration.ConnectorMessages.Format(
                                      "ex_not_updatable", "Update of [{0}] attribute is not supported", ExchangeConnectorAttributes.AttDatabase));
                    }
                }

                Command cmdSet = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.SetMailbox, attributesForReplace, context.Uid, exconn.Configuration);
                _helper.InvokePipeline(exconn, cmdSet);
            }

            // PART 3 - DEALING WITH User CASE

            else if (ExchangeConnectorAttributes.RcptTypeUser.Equals(newRcptType))
            {
                if (ExchangeConnectorAttributes.RcptTypeMailBox.Equals(origRcptType))
                {
                    Command cmdDisable = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.DisableMailbox, attributesForReplace, context.Uid, exconn.Configuration);
                    cmdDisable.Parameters.Add("Confirm", false);
                    _helper.InvokePipeline(exconn, cmdDisable);
                }
                else if (ExchangeConnectorAttributes.RcptTypeMailUser.Equals(origRcptType))
                {
                    Command cmdDisable = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.DisableMailUser, attributesForReplace, context.Uid, exconn.Configuration);
                    cmdDisable.Parameters.Add("Confirm", false);
                    _helper.InvokePipeline(exconn, cmdDisable);
                }
                else if (ExchangeConnectorAttributes.RcptTypeUser.Equals(origRcptType))
                {
                    // if orig is User, there is no need to disable anything
                }
                else
                {
                    throw new InvalidOperationException("Invalid original recipient type: " + origRcptType);
                }

                Command cmdSet = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.SetUser, attributesForReplace, context.Uid, exconn.Configuration);
                _helper.InvokePipeline(exconn, cmdSet);
            }
            else
            {
                // unsupported rcpt type
                throw new ArgumentException(
                          context.ConnectorConfiguration.ConnectorMessages.Format(
                              "ex_bad_rcpt", "Recipient type [{0}] is not supported", newRcptType));
            }
        }