/// <summary>
        /// Constructs a CSEntryChangeResult object appropriate to the specified exception
        /// </summary>
        /// <param name="csentryChange">The CSEntryChange object that triggered the exception</param>
        /// <param name="ex">The exception that was caught</param>
        /// <returns>A CSEntryChangeResult object with the correct error code for the exception that was encountered</returns>
        private CSEntryChangeResult GetExportChangeResultFromException(CSEntryChange csentryChange, Exception ex)
        {
            if (ManagementAgent.MAParameters.LaunchDebuggerOnException)
            {
                System.Diagnostics.Debugger.Launch();
            }

            if (ex is NoSuchObjectException)
            {
                return(CSEntryChangeResult.Create(csentryChange.Identifier, null, MAExportError.ExportErrorConnectedDirectoryMissingObject));
            }
            else if (ex is ReferencedObjectNotPresentException)
            {
                Logger.WriteLine(string.Format("Reference attribute not available for csentry {0}. Flagging for retry", csentryChange.DN));
                return(CSEntryChangeResult.Create(csentryChange.Identifier, null, MAExportError.ExportActionRetryReferenceAttribute));
            }
            else
            {
                Logger.WriteLine(string.Format("An unexpected exception occured for csentry {0} with DN {1}", csentryChange.Identifier.ToString(), csentryChange.DN ?? string.Empty));
                Logger.WriteException(ex);
                return(CSEntryChangeResult.Create(csentryChange.Identifier, null, MAExportError.ExportErrorCustomContinueRun, ex.Message, ex.StackTrace));
            }
        }
Exemplo n.º 2
0
        public void ContactAdd()
        {
            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Add;
            cs.DN         = Guid.NewGuid().ToString();
            cs.ObjectType = SchemaConstants.Contact;

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("billingInformation", "billingInformation"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("birthday", "2000-01-01"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("directoryServer", "directoryServer"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("initials", "initials"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("location", "location"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("maidenName", "maidenName"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("mileage", "mileage"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("nickname", "nickname"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("occupation", "occupation"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("sensitivity", "private"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("shortName", "shortName"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("subject", "subject"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("externalIds_work", "eidwork"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("externalIds_home", "eidhome"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_name", "name"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_title", "title"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_department", "department"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_symbol", "symbol"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_jobDescription", "jobDescription"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_location", "location"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("phones_work", "phwork"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("phones_home", "phhome"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("email_work", "*****@*****.**"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("email_home", "*****@*****.**"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("ims_work_address", "*****@*****.**"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("ims_work_protocol", "proto"));

            string id = null;

            try
            {
                CSEntryChangeResult result = ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Contact], UnitTestControl.TestParameters);

                id = result.AnchorAttributes["id"].GetValueAdd <string>();

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                ContactEntry e = UnitTestControl.TestParameters.ContactsService.GetContact(id);
                Assert.AreEqual("billingInformation", e.BillingInformation);
                Assert.AreEqual("2000-01-01", e.Birthday);
                Assert.AreEqual("directoryServer", e.DirectoryServer);
                Assert.AreEqual("initials", e.Initials);
                Assert.AreEqual("location", e.Location);
                Assert.AreEqual("maidenName", e.MaidenName);
                Assert.AreEqual("mileage", e.Mileage);
                Assert.AreEqual("nickname", e.Nickname);
                Assert.AreEqual("occupation", e.Occupation);
                Assert.AreEqual("private", e.Sensitivity);
                Assert.AreEqual("shortName", e.ShortName);
                Assert.AreEqual("subject", e.Subject);

                Assert.AreEqual(2, e.ExternalIds.Count);
                Assert.AreEqual("eidwork", e.ExternalIds[0].Value);
                Assert.AreEqual("eidhome", e.ExternalIds[1].Value);

                Assert.AreEqual(1, e.Organizations.Count);
                Assert.AreEqual("name", e.Organizations[0].Name);
                Assert.AreEqual("title", e.Organizations[0].Title);
                Assert.AreEqual("department", e.Organizations[0].Department);
                Assert.AreEqual("symbol", e.Organizations[0].Symbol);
                Assert.AreEqual("jobDescription", e.Organizations[0].JobDescription);
                Assert.AreEqual("location", e.Organizations[0].Location);

                Assert.AreEqual(2, e.Phonenumbers.Count);
                Assert.AreEqual("phwork", e.Phonenumbers[0].Value);
                Assert.AreEqual("phhome", e.Phonenumbers[1].Value);

                Assert.AreEqual(2, e.Emails.Count);
                Assert.AreEqual("*****@*****.**", e.Emails[0].Address);
                Assert.AreEqual("*****@*****.**", e.Emails[1].Address);
                Assert.AreEqual("*****@*****.**", e.PrimaryEmail.Address);

                Assert.AreEqual(1, e.IMs.Count);
                Assert.AreEqual("*****@*****.**", e.IMs[0].Address);
                Assert.AreEqual("proto", e.IMs[0].Protocol);
            }
            finally
            {
                if (id != null)
                {
                    UnitTestControl.TestParameters.ContactsService.Delete(id);
                }
            }
        }
Exemplo n.º 3
0
        private CSEntryChangeResult PutCSEntryChangeUpdate(CSEntryChange csentry, ExportContext context)
        {
            IOktaClient client = ((OktaConnectionContext)context.ConnectionContext).Client;

            IUser user    = null;
            bool  partial = true;

            if (csentry.AttributeChanges.Any(t =>
                                             t.ModificationType == AttributeModificationType.Delete ||
                                             t.Name == "suspended" ||
                                             t.DataType == AttributeType.Reference // this should only need to include MV attributes, but there's an issue where MIM sends an attribute update with a value delete for a single valued ref that it doesn't know about
                                             ))
            {
                logger.Trace($"Getting user {csentry.DN} for FULL update");
                user    = AsyncHelper.RunSync(client.Users.GetUserAsync(csentry.DN, context.CancellationTokenSource.Token), context.CancellationTokenSource.Token);
                partial = false;
            }
            else
            {
                user         = new User();
                user.Profile = new UserProfile();
            }

            foreach (AttributeChange change in csentry.AttributeChanges)
            {
                if (change.Name == "suspended")
                {
                    bool suspend;

                    if (change.ModificationType == AttributeModificationType.Delete)
                    {
                        suspend = false;
                    }
                    else
                    {
                        suspend = change.GetValueAdd <bool>();
                    }

                    if (user.Status == UserStatus.Active && suspend)
                    {
                        logger.Info($"Suspending user {user.Id}");
                        AsyncHelper.RunSync(user.SuspendAsync(context.CancellationTokenSource.Token), context.CancellationTokenSource.Token);
                    }
                    else if (user.Status == UserStatus.Suspended && !suspend)
                    {
                        logger.Info($"Unsuspending user {user.Id}");
                        AsyncHelper.RunSync(user.UnsuspendAsync(context.CancellationTokenSource.Token), context.CancellationTokenSource.Token);
                    }
                }
                else
                {
                    if (change.IsMultiValued)
                    {
                        IList <object> existingItems = user.Profile[change.Name] as IList <object> ?? new List <object>();
                        IList <object> newList       = change.ApplyAttributeChanges((IList)existingItems);
                        user.Profile[change.Name] = newList;

                        logger.Info($"{change.ModificationType} {change.Name} -> {newList.Count} items");
                    }
                    else
                    {
                        user.Profile[change.Name] = change.GetValueAdd <object>();
                        logger.Info($"{change.ModificationType} {change.Name} -> {user.Profile[change.Name] ?? "<null>"}");
                    }
                }
            }

            if (partial)
            {
                AsyncHelper.RunSync(client.PostAsync <User>($"/api/v1/users/{csentry.DN}", user, context.CancellationTokenSource.Token), context.CancellationTokenSource.Token);
            }
            else
            {
                AsyncHelper.RunSync(client.Users.UpdateUserAsync(user, csentry.DN, context.CancellationTokenSource.Token), context.CancellationTokenSource.Token);
            }

            return(CSEntryChangeResult.Create(csentry.Identifier, null, MAExportError.Success));
        }
Exemplo n.º 4
0
        public void UpdateCalendarClearValues()
        {
            CalendarResource calendar = new CalendarResource();

            calendar.ResourceId             = Guid.NewGuid().ToString("n");
            calendar.ResourceName           = "test-name";
            calendar.BuildingId             = "testbuilding2";
            calendar.Capacity               = 9;
            calendar.FloorName              = "G";
            calendar.FloorSection           = "39b";
            calendar.ResourceCategory       = "OTHER";
            calendar.ResourceDescription    = "internal description 1";
            calendar.UserVisibleDescription = "my description 2";
            calendar.FeatureInstances       = new List <FeatureInstance>()
            {
                new FeatureInstance()
                {
                    Feature = new Feature()
                    {
                        Name = "Test1"
                    }
                },
                new FeatureInstance()
                {
                    Feature = new Feature()
                    {
                        Name = "Test2"
                    }
                },
            };

            UnitTestControl.TestParameters.ResourcesService.AddCalendar(UnitTestControl.TestParameters.CustomerID, calendar);

            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Update;
            cs.DN         = "*****@*****.**";
            cs.ObjectType = SchemaConstants.Calendar;
            cs.AnchorAttributes.Add(AnchorAttribute.Create("id", calendar.ResourceId));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete("buildingId"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete("capacity"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete("floorName"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete("floorSection"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete("resourceDescription"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete("userVisibleDescription"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete("features"));

            string id = calendar.ResourceId;

            try
            {
                CSEntryChangeResult result = ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Calendar], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                Thread.Sleep(UnitTestControl.PostGoogleOperationSleepInterval);

                CalendarResource c = UnitTestControl.TestParameters.ResourcesService.GetCalendar(UnitTestControl.TestParameters.CustomerID, id);
                Assert.IsNull(c.BuildingId);
                Assert.IsNull(c.Capacity);
                Assert.IsNull(c.FloorName);
                Assert.IsNull(c.FloorSection);
                Assert.IsNull(c.ResourceDescription);
                Assert.IsNull(c.UserVisibleDescription);
                Assert.IsNull(c.FeatureInstances);
            }
            finally
            {
                if (id != null)
                {
                    UnitTestControl.TestParameters.ResourcesService.DeleteCalendar(UnitTestControl.TestParameters.CustomerID, id);
                }
            }
        }
Exemplo n.º 5
0
        public void UpdateCalendar()
        {
            CalendarResource calendar = new CalendarResource();

            calendar.ResourceId             = Guid.NewGuid().ToString("n");
            calendar.ResourceName           = "test-name";
            calendar.BuildingId             = "testbuilding2";
            calendar.Capacity               = 9;
            calendar.FloorName              = "G";
            calendar.FloorSection           = "39b";
            calendar.ResourceCategory       = "OTHER";
            calendar.ResourceDescription    = "internal description 1";
            calendar.UserVisibleDescription = "my description 2";
            calendar.FeatureInstances       = new List <FeatureInstance>()
            {
                new FeatureInstance()
                {
                    Feature = new Feature()
                    {
                        Name = "Test1"
                    }
                },
                new FeatureInstance()
                {
                    Feature = new Feature()
                    {
                        Name = "Test2"
                    }
                },
            };

            UnitTestControl.TestParameters.ResourcesService.AddCalendar(UnitTestControl.TestParameters.CustomerID, calendar);

            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Update;
            cs.DN         = "*****@*****.**";
            cs.ObjectType = SchemaConstants.Calendar;
            cs.AnchorAttributes.Add(AnchorAttribute.Create("id", calendar.ResourceId));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeUpdate("buildingId", new List <ValueChange>()
            {
                ValueChange.CreateValueAdd("testbuilding1")
            }));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeReplace("capacity", 33L));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeReplace("floorName", "G"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeReplace("floorSection", "33B"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeReplace("resourceCategory", "CONFERENCE_ROOM"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeReplace("resourceDescription", "internal description"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeReplace("userVisibleDescription", "user description"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeUpdate("features", new List <ValueChange>()
            {
                ValueChange.CreateValueAdd("Test3"),
                ValueChange.CreateValueDelete("Test1"),
            }));

            string id = calendar.ResourceId;

            try
            {
                CSEntryChangeResult result = ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Calendar], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                Thread.Sleep(UnitTestControl.PostGoogleOperationSleepInterval);

                CalendarResource c = UnitTestControl.TestParameters.ResourcesService.GetCalendar(UnitTestControl.TestParameters.CustomerID, id);
                Assert.AreEqual(cs.DN, "*****@*****.**");
                Assert.AreEqual("test-name", c.ResourceName);
                Assert.AreEqual("testbuilding1", c.BuildingId);
                Assert.AreEqual(33, c.Capacity);
                Assert.AreEqual("G", c.FloorName);
                Assert.AreEqual("33B", c.FloorSection);
                Assert.AreEqual("CONFERENCE_ROOM", c.ResourceCategory);
                Assert.AreEqual("internal description", c.ResourceDescription);
                Assert.AreEqual("user description", c.UserVisibleDescription);
                CollectionAssert.AreEquivalent(new string[] { "Test2", "Test3" }, ApiInterfaceCalendar.GetFeatureNames(c).ToList());
            }
            finally
            {
                if (id != null)
                {
                    UnitTestControl.TestParameters.ResourcesService.DeleteCalendar(UnitTestControl.TestParameters.CustomerID, id);
                }
            }
        }
Exemplo n.º 6
0
        // PutExportEntries
        public PutExportEntriesResults PutExportEntries(IList <CSEntryChange> _csentries)
        {
            utils.Logger(TraceEventType.Information,
                         ConstDefinition.ID0800_START_PUTEXPORTENTRIES,
                         ConstDefinition.MSG0800_START_PUTEXPORTENTRIES);
            PutExportEntriesResults _exportEntriesResults = new PutExportEntriesResults();

            try
            {
                foreach (CSEntryChange _csentryChange in _csentries)
                {
#if DEBUG
                    utils.Logger(TraceEventType.Verbose, ConstDefinition.ID0850_VERBOSE_PUTEXPORTENTRIES, _csentryChange.DN.ToString());
#endif
                    // build json to POST
                    var _attr = new Dictionary <string, string>();
                    // anchor attribute
                    _attr.Add("Username", _csentryChange.DN.ToString());
                    switch (_csentryChange.ObjectModificationType)
                    {
                    case ObjectModificationType.Add:
                    case ObjectModificationType.Update:
#if DEBUG
                        utils.Logger(TraceEventType.Verbose, ConstDefinition.ID0850_VERBOSE_PUTEXPORTENTRIES, "ObjectModificationType : Add / Update");
#endif
                        foreach (string _attribName in _csentryChange.ChangedAttributeNames)
                        {
                            var _attributeChange = _csentryChange.AttributeChanges[_attribName];
                            var _valueChanges    = _attributeChange.ValueChanges;
                            if (_valueChanges != null)
                            {
                                foreach (var _valueChange in _valueChanges)
                                {
                                    if (_valueChange.ModificationType == ValueModificationType.Add)
                                    {
                                        // new value
#if DEBUG
                                        utils.Logger(TraceEventType.Verbose, ConstDefinition.ID0850_VERBOSE_PUTEXPORTENTRIES, _attribName + " : " + _valueChange.Value.ToString());
#endif
                                        _attr.Add(_attribName, _valueChange.Value.ToString());
                                        break;
                                    }
                                }
                            }
                        }
                        // build json
                        string _exportDataJSON = JsonConvert.SerializeObject(_attr);
#if DEBUG
                        utils.Logger(TraceEventType.Verbose, ConstDefinition.ID0850_VERBOSE_PUTEXPORTENTRIES, _exportDataJSON);
#endif
                        string _exportResult = utils.PostContentsWithAccessToken(resource_uri, auth_token, _exportDataJSON, null);

                        _exportEntriesResults.CSEntryChangeResults.Add(
                            CSEntryChangeResult.Create(_csentryChange.Identifier,
                                                       _csentryChange.AttributeChanges,
                                                       MAExportError.Success));
                        break;

                    case ObjectModificationType.Delete:
                        // NOT Implemented
                        break;

                    default:
                        // error
                        utils.Logger(TraceEventType.Error,
                                     ConstDefinition.ID0899_ERROR_PUTEXPORTENTRIES,
                                     ConstDefinition.MSG0899_ERROR_PUTEXPORTENTRIES + "Unknown Operation Type : " + _csentryChange.ObjectModificationType);
                        _exportEntriesResults.CSEntryChangeResults.Add(
                            CSEntryChangeResult.Create(_csentryChange.Identifier,
                                                       _csentryChange.AttributeChanges,
                                                       MAExportError.ExportErrorConnectedDirectoryError,
                                                       "Operation Error",
                                                       "Unknown Operation Type : " + _csentryChange.ObjectModificationType
                                                       ));
                        break;
                    }
                }
                return(_exportEntriesResults);
            }
            catch (Exception ex)
            {
                utils.Logger(TraceEventType.Error,
                             ConstDefinition.ID0899_ERROR_PUTEXPORTENTRIES,
                             ConstDefinition.MSG0899_ERROR_PUTEXPORTENTRIES + ex.Message);
                throw new ExtensibleExtensionException(ex.Message);
            }
        }
Exemplo n.º 7
0
        private static void AddTeamToCleanupTask(CSEntryChangeResult c)
        {
            string teamid = c.GetAnchorValueOrDefault <string>("id");

            AddTeamToCleanupTask(teamid);
        }
        public void DeleteStringValuesAsAttributeDeleteOnObjectUpdate()
        {
            User u = UserTests.CreateUser();

            // Create the initial object
            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Update;
            cs.DN         = u.PrimaryEmail;
            cs.ObjectType = SchemaConstants.User;
            cs.AnchorAttributes.Add(AnchorAttribute.Create("id", u.Id));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestSVString", "string1"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestMVString", new List <object> {
                "test2", "test3"
            }));

            try
            {
                CSEntryChangeResult result = ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.User], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                Thread.Sleep(UnitTestControl.PostGoogleOperationSleepInterval);

                User e = UnitTestControl.TestParameters.UsersService.Get(u.Id);
                Assert.AreEqual(cs.DN, e.PrimaryEmail);

                Assert.AreEqual("string1", (string)e.CustomSchemas[TestSchemaName]["TestSVString"]);
                CollectionAssert.AreEquivalent(new List <object> {
                    "test2", "test3"
                }, GetReturnedValues <string>("TestMVString", e));

                // Remove all the values with an 'attribute delete'

                cs = CSEntryChange.Create();
                cs.ObjectModificationType = ObjectModificationType.Update;
                cs.DN         = u.PrimaryEmail;
                cs.ObjectType = SchemaConstants.User;
                cs.AnchorAttributes.Add(AnchorAttribute.Create("id", u.Id));

                cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete($"{TestSchemaName}_TestSVString"));
                cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete($"{TestSchemaName}_TestMVString"));

                result = ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.User], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                Thread.Sleep(UnitTestControl.PostGoogleOperationSleepInterval);

                e = UnitTestControl.TestParameters.UsersService.Get(u.Id);
                Assert.AreEqual(cs.DN, e.PrimaryEmail);

                if (e.CustomSchemas != null && e.CustomSchemas.ContainsKey(TestSchemaName))
                {
                    Assert.IsFalse(e.CustomSchemas[TestSchemaName].ContainsKey("TestSVString"));
                    Assert.IsFalse(e.CustomSchemas[TestSchemaName].ContainsKey("TestMVString"));
                }
            }
            finally
            {
                if (u?.Id != null)
                {
                    UnitTestControl.TestParameters.UsersService.Delete(u.Id);
                }
            }
        }
Exemplo n.º 9
0
        //TODO: Remember to return identity from SQL if possible
        public PutExportEntriesResults PutExportEntriesDetached(IList <CSEntryChange> csentries)
        {
            Tracer.Enter(nameof(PutExportEntriesDetached));
            PutExportEntriesResults results = new PutExportEntriesResults();

            try
            {
                bool handleSoftDeletion = Configuration.HasDeletedColumn;
                bool handleMultivalues  = Configuration.HasMultivalueTable;

                foreach (CSEntryChange exportChange in csentries)
                {
                    List <string>          exportSqlCommands = new List <string>();
                    List <AttributeChange> attrchanges       = new List <AttributeChange>();

                    string anchor = null;
                    if (exportChange.AnchorAttributes.Count == 0)
                    {
                        Tracer.TraceInformation("no-anchor-present");
                    }
                    else
                    {
                        anchor = CSValueAsString(exportChange.AnchorAttributes[0].Value, exportChange.AnchorAttributes[0].DataType);
                    }
                    string objectClass = exportChange.ObjectType;

                    if (Configuration.RunBeforeObjectExport)
                    {
                        List <SqlParameter> parameters = new List <SqlParameter>();
                        parameters.Add(new SqlParameter("anchor", anchor));
                        parameters.Add(new SqlParameter("action", exportChange.ObjectModificationType.ToString()));
                        methods.RunStoredProcedure(Configuration.ExportObjectCommandBefore, parameters);
                    }

                    Tracer.TraceInformation("export-object {0}, cs-id: {1}, anchor: {2}, dn: {3} [{4}]", objectClass, exportChange.Identifier, anchor, exportChange.DN, exportChange.ObjectModificationType);
                    try
                    {
                        // first try to handle a delete
                        if (exportChange.ObjectModificationType == ObjectModificationType.Delete)
                        {
                            if (anchor == null)
                            {
                                throw new InvalidOperationException("cannot-delete-without-anchor");
                            }

                            Tracer.TraceInformation("deleting-record type: {1}, anchor: {0}", objectClass, anchor);
                            methods.DeleteRecord(anchor, Configuration.HasMultivalueTable, handleSoftDeletion);
                            results.CSEntryChangeResults.Add(CSEntryChangeResult.Create(exportChange.Identifier, attrchanges, MAExportError.Success));
                            continue;
                        }

                        // if we get here its either an update or and add
                        if (exportChange.ObjectModificationType == ObjectModificationType.Add)
                        {
                            Tracer.TraceInformation("adding-record type: {1}, anchor: {0}", objectClass, anchor);
                            object newAnchor = anchor;                             // set it to incoming anchor
                            if (anchor != null && methods.ExistRecord(anchor))
                            {
                                methods.Undelete(anchor);
                            }
                            else
                            {
                                methods.AddRecord(anchor, out newAnchor, objectClass);
                            }
                            attrchanges.Add(AttributeChange.CreateAttributeAdd(anchor, newAnchor));
                        }

                        // updating attributes is common for add and update
                        foreach (string attributeChange in exportChange.ChangedAttributeNames)
                        {
                            AttributeChange ac = exportChange.AttributeChanges[attributeChange];
                            Tracer.TraceInformation("attribute-change {0}, {1}", ac.Name, ac.ModificationType);
                            if (ac.IsMultiValued)
                            {
                                if (ac.ModificationType == AttributeModificationType.Delete)
                                {
                                    methods.RemoveAllMultiValues(anchor, attributeChange, handleSoftDeletion);
                                    continue;
                                }
                                foreach (ValueChange vc in ac.ValueChanges)
                                {
                                    switch (vc.ModificationType)
                                    {
                                    case ValueModificationType.Add:
                                        methods.AddMultiValue(anchor, attributeChange, vc.Value);
                                        break;

                                    case ValueModificationType.Delete:
                                        methods.DeleteMultiValue(anchor, attributeChange, vc.Value, handleSoftDeletion);
                                        break;
                                    }
                                }
                                continue;
                            }
                            if (ac.ModificationType == AttributeModificationType.Delete)
                            {
                                methods.DeleteSingleValue(anchor, attributeChange);
                                continue;
                            }
                            foreach (ValueChange vc in ac.ValueChanges.Where(x => x.ModificationType == ValueModificationType.Add))
                            {
                                Tracer.TraceInformation("singlevalue-change {0}, {1}", vc.ModificationType, vc.Value);
                                methods.AddSingleValue(anchor, attributeChange, vc.Value);
                            }
                        }
                        results.CSEntryChangeResults.Add(CSEntryChangeResult.Create(exportChange.Identifier, attrchanges, MAExportError.Success));

                        if (Configuration.RunAfterObjectExport)
                        {
                            List <SqlParameter> parameters = new List <SqlParameter>();
                            parameters.Add(new SqlParameter("anchor", anchor));
                            parameters.Add(new SqlParameter("action", exportChange.ObjectModificationType.ToString()));
                            methods.RunStoredProcedure(Configuration.ExportObjectCommandAfter, parameters);
                        }
                    }
                    catch (Exception exportEx)
                    {
                        Tracer.TraceError(nameof(PutExportEntriesDetached), exportEx);
                        results.CSEntryChangeResults.Add(CSEntryChangeResult.Create(exportChange.Identifier, attrchanges, MAExportError.ExportErrorCustomContinueRun, "export-exception", exportEx.Message));
                        throw;
                    }
                }
            }
            catch (Exception ex)
            {
                Tracer.TraceError(nameof(PutExportEntriesDetached), ex);
                throw;
            }
            finally
            {
                Tracer.Exit(nameof(PutExportEntriesDetached));
            }
            return(results);
        }
        public void ReplaceAliases()
        {
            string id = null;
            string dn = $"{Guid.NewGuid()}@{UnitTestControl.TestParameters.Domain}";
            User   e  = new User
            {
                PrimaryEmail = dn,
                Password     = Guid.NewGuid().ToString(),
                Name         = new UserName
                {
                    GivenName  = "gn",
                    FamilyName = "sn"
                }
            };

            e  = UnitTestControl.TestParameters.UsersService.Add(e);
            id = e.Id;

            string alias1 = $"{Guid.NewGuid()}@{UnitTestControl.TestParameters.Domain}";
            string alias2 = $"{Guid.NewGuid()}@{UnitTestControl.TestParameters.Domain}";
            string alias3 = $"{Guid.NewGuid()}@{UnitTestControl.TestParameters.Domain}";
            string alias4 = $"{Guid.NewGuid()}@{UnitTestControl.TestParameters.Domain}";

            UnitTestControl.TestParameters.UsersService.AddAlias(id, alias1);
            UnitTestControl.TestParameters.UsersService.AddAlias(id, alias2);

            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Update;
            cs.DN         = dn;
            cs.ObjectType = SchemaConstants.User;
            cs.AnchorAttributes.Add(AnchorAttribute.Create("id", id));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeReplace("aliases", new List <object>
            {
                alias3, alias4
            }));

            try
            {
                CSEntryChangeResult result =
                    ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.User], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                System.Threading.Thread.Sleep(UnitTestControl.PostGoogleOperationSleepInterval);

                e = UnitTestControl.TestParameters.UsersService.Get(id);

                CollectionAssert.AreEquivalent(new string[] { alias3, alias4 }, e.Aliases);
            }
            finally
            {
                if (id != null)
                {
                    UnitTestControl.TestParameters.UsersService.Delete(id);
                }
            }
        }
        public void PartialUpdate()
        {
            string id = null;
            string dn = $"{Guid.NewGuid()}@{UnitTestControl.TestParameters.Domain}";
            User   e  = new User
            {
                PrimaryEmail = dn,
                Password     = Guid.NewGuid().ToString(),
                Name         = new UserName
                {
                    GivenName  = "gn",
                    FamilyName = "sn"
                }
            };

            e.ExternalIds = new List <ExternalID>();
            e.ExternalIds.Add(new ExternalID()
            {
                Type = "work", Value = "test1"
            });
            e.ExternalIds.Add(new ExternalID()
            {
                Type = "home", Value = "test2"
            });

            e  = UnitTestControl.TestParameters.UsersService.Add(e);
            id = e.Id;

            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Update;
            cs.DN         = dn;
            cs.ObjectType = SchemaConstants.User;
            cs.AnchorAttributes.Add(AnchorAttribute.Create("id", id));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("externalIds_work", "eidwork"));

            try
            {
                CSEntryChangeResult result =
                    ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.User], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                System.Threading.Thread.Sleep(5000);

                e = UnitTestControl.TestParameters.UsersService.Get(id);

                Assert.AreEqual(2, e.ExternalIds.Count);
                Assert.AreEqual("eidwork", e.ExternalIds[0].Value);
                Assert.AreEqual("test2", e.ExternalIds[1].Value);
            }
            finally
            {
                if (id != null)
                {
                    UnitTestControl.TestParameters.UsersService.Delete(id);
                }
            }
        }
        public void UpdateRemoveLastOrgValue()
        {
            string id = null;
            string dn = $"{Guid.NewGuid()}@{UnitTestControl.TestParameters.Domain}";
            User   e  = new User
            {
                PrimaryEmail = dn,
                Password     = Guid.NewGuid().ToString(),
                Name         = new UserName
                {
                    GivenName  = "gn",
                    FamilyName = "sn"
                }
            };

            e.ExternalIds = new List <ExternalID>();
            e.ExternalIds.Add(new ExternalID()
            {
                Type = "work", Value = "test"
            });
            e.Organizations = new List <Organization>();
            e.Organizations.Add(new Organization()
            {
                Location = "test",
                Type     = "work"
            });

            e.Phones = new List <Phone>();
            e.Phones.Add(new Phone()
            {
                Type = "work", Value = "phwork"
            });
            e.Phones.Add(new Phone()
            {
                Type = "home", Value = "phhome"
            });

            e  = UnitTestControl.TestParameters.UsersService.Add(e);
            id = e.Id;

            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Update;
            cs.DN         = dn;
            cs.ObjectType = SchemaConstants.User;
            cs.AnchorAttributes.Add(AnchorAttribute.Create("id", id));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete("organizations_work_location"));

            try
            {
                CSEntryChangeResult result =
                    ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.User], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                System.Threading.Thread.Sleep(5000);

                e = UnitTestControl.TestParameters.UsersService.Get(id);
                Assert.AreEqual(cs.DN, e.PrimaryEmail);
                Assert.IsNull(e.Organizations);
            }
            finally
            {
                if (id != null)
                {
                    UnitTestControl.TestParameters.UsersService.Delete(id);
                }
            }
        }
        public void Add()
        {
            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Add;
            cs.DN         = $"{Guid.NewGuid()}@{UnitTestControl.TestParameters.Domain}";
            cs.ObjectType = SchemaConstants.User;

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("orgUnitPath", "/"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("name_givenName", "gn"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("name_familyName", "sn"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("initials", "initials"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("location", "location"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("maidenName", "maidenName"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("mileage", "mileage"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("nickname", "nickname"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("occupation", "occupation"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("sensitivity", "private"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("shortName", "shortName"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("subject", "subject"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("externalIds_work", "eidwork"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("externalIds_home", "eidhome"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_name", "name"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_title", "title"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_department", "department"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_symbol", "symbol"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_costCenter", "costCenter"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_location", "location"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_description", "description"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_domain", "domain"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("phones_work", "phwork"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("phones_home", "phhome"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("ims_work_address", "*****@*****.**"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("ims_work_protocol", "proto"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("isAdmin", true));

            string alias1 = $"{Guid.NewGuid()}@{UnitTestControl.TestParameters.Domain}";
            string alias2 = $"{Guid.NewGuid()}@{UnitTestControl.TestParameters.Domain}";

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("aliases", new List <object>()
            {
                alias1, alias2
            }));

            string id = null;

            try
            {
                CSEntryChangeResult result = ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.User], UnitTestControl.TestParameters);
                id = result.AnchorAttributes["id"].GetValueAdd <string>();

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                System.Threading.Thread.Sleep(UnitTestControl.PostGoogleOperationSleepInterval);

                User e = UnitTestControl.TestParameters.UsersService.Get(id);
                Assert.AreEqual(cs.DN, e.PrimaryEmail);
                Assert.AreEqual("/", e.OrgUnitPath);
                Assert.AreEqual("gn", e.Name.GivenName);
                Assert.AreEqual("sn", e.Name.FamilyName);

                Assert.AreEqual(true, e.IsAdmin);

                Assert.AreEqual(2, e.ExternalIds.Count);
                Assert.AreEqual("eidwork", e.ExternalIds[0].Value);
                Assert.AreEqual("eidhome", e.ExternalIds[1].Value);

                Assert.AreEqual(1, e.Organizations.Count);
                Assert.AreEqual("name", e.Organizations[0].Name);
                Assert.AreEqual("title", e.Organizations[0].Title);
                Assert.AreEqual("department", e.Organizations[0].Department);
                Assert.AreEqual("symbol", e.Organizations[0].Symbol);
                Assert.AreEqual("costCenter", e.Organizations[0].CostCenter);
                Assert.AreEqual("location", e.Organizations[0].Location);
                Assert.AreEqual("description", e.Organizations[0].Description);
                Assert.AreEqual("domain", e.Organizations[0].Domain);

                Assert.AreEqual(2, e.Phones.Count);
                Assert.AreEqual("phwork", e.Phones[0].Value);
                Assert.AreEqual("phhome", e.Phones[1].Value);

                Assert.AreEqual(1, e.Ims.Count);
                Assert.AreEqual("*****@*****.**", e.Ims[0].IMAddress);
                Assert.AreEqual("proto", e.Ims[0].Protocol);

                CollectionAssert.AreEquivalent(new string[] { alias1, alias2 }, e.Aliases);
            }
            finally
            {
                if (id != null)
                {
                    UnitTestControl.TestParameters.UsersService.Delete(id);
                }
            }
        }
Exemplo n.º 14
0
        public void ContactDeleteExternalID()
        {
            string       id = null;
            string       dn = Guid.NewGuid().ToString();
            ContactEntry e  = new ContactEntry
            {
                BillingInformation = "test",
                Birthday           = "2001-01-01",
                DirectoryServer    = "test",
                Initials           = "test",
                Location           = "test",
                MaidenName         = "test",
                Mileage            = "test",
                Nickname           = "test",
                Occupation         = "test",
                Sensitivity        = "normal",
                ShortName          = "test",
                Subject            = "test",
            };

            e.ExternalIds.Add(new ExternalId()
            {
                Label = "work", Value = "test"
            });
            e.Organizations.Add(new Organization()
            {
                Rel            = "http://schemas.google.com/g/2005#work",
                Name           = "test",
                Title          = "test",
                Department     = "test",
                Symbol         = "test",
                JobDescription = "test",
                Location       = "test",
            });

            e.Phonenumbers.Add(new PhoneNumber()
            {
                Primary = true, Rel = "http://schemas.google.com/g/2005#home", Value = "test"
            });

            e.ExtendedProperties.Add(new ExtendedProperty(dn, ApiInterfaceContact.DNAttributeName));

            e  = UnitTestControl.TestParameters.ContactsService.Add(e, UnitTestControl.TestParameters.Domain);
            id = e.SelfUri.Content;

            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Update;
            cs.DN         = Guid.NewGuid().ToString();
            cs.ObjectType = SchemaConstants.Contact;
            cs.AnchorAttributes.Add(AnchorAttribute.Create("id", id));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete("externalIds_work"));

            try
            {
                CSEntryChangeResult result = ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Contact], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                System.Threading.Thread.Sleep(5000);

                e = UnitTestControl.TestParameters.ContactsService.GetContact(id);

                Assert.AreEqual(0, e.ExternalIds.Count);
            }
            finally
            {
                if (id != null)
                {
                    UnitTestControl.TestParameters.ContactsService.Delete(id);
                }
            }
        }
Exemplo n.º 15
0
        public void ContactUpdate()
        {
            string       id = null;
            string       dn = Guid.NewGuid().ToString();
            ContactEntry e  = new ContactEntry
            {
                BillingInformation = "test",
                Birthday           = "2001-01-01",
                DirectoryServer    = "test",
                Initials           = "test",
                Location           = "test",
                MaidenName         = "test",
                Mileage            = "test",
                Nickname           = "test",
                Occupation         = "test",
                Sensitivity        = "normal",
                ShortName          = "test",
                Subject            = "test",
            };

            e.ExternalIds.Add(new ExternalId()
            {
                Label = "work", Value = "test"
            });
            e.Organizations.Add(new  Organization()
            {
                Rel            = "http://schemas.google.com/g/2005#work",
                Name           = "test",
                Title          = "test",
                Department     = "test",
                Symbol         = "test",
                JobDescription = "test",
                Location       = "test",
            });

            e.Phonenumbers.Add(new PhoneNumber()
            {
                Primary = true, Rel = "http://schemas.google.com/g/2005#home", Value = "test"
            });

            e.ExtendedProperties.Add(new ExtendedProperty(dn, ApiInterfaceContact.DNAttributeName));

            e  = UnitTestControl.TestParameters.ContactsService.Add(e, UnitTestControl.TestParameters.Domain);
            id = e.SelfUri.Content;

            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Update;
            cs.DN         = Guid.NewGuid().ToString();
            cs.ObjectType = SchemaConstants.Contact;
            cs.AnchorAttributes.Add(AnchorAttribute.Create("id", id));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("billingInformation", "billingInformation"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("birthday", "2000-01-01"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("directoryServer", "directoryServer"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("initials", "initials"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("location", "location"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("maidenName", "maidenName"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("mileage", "mileage"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("nickname", "nickname"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("occupation", "occupation"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("sensitivity", "private"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("shortName", "shortName"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("subject", "subject"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("externalIds_work", "eidwork"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("externalIds_home", "eidhome"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_name", "name"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_title", "title"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_department", "department"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_symbol", "symbol"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_jobDescription", "jobDescription"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("organizations_work_location", "location"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("phones_work", "phwork"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("phones_home", "phhome"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("email_work", "*****@*****.**"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("email_home", "*****@*****.**"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("ims_work_address", "*****@*****.**"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("ims_work_protocol", "proto"));

            try
            {
                CSEntryChangeResult result = ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Contact], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                System.Threading.Thread.Sleep(5000);

                e = UnitTestControl.TestParameters.ContactsService.GetContact(id);
                Assert.AreEqual("billingInformation", e.BillingInformation);
                Assert.AreEqual("2000-01-01", e.Birthday);
                Assert.AreEqual("directoryServer", e.DirectoryServer);
                Assert.AreEqual("initials", e.Initials);
                Assert.AreEqual("location", e.Location);
                Assert.AreEqual("maidenName", e.MaidenName);
                Assert.AreEqual("mileage", e.Mileage);
                Assert.AreEqual("nickname", e.Nickname);
                Assert.AreEqual("occupation", e.Occupation);
                Assert.AreEqual("private", e.Sensitivity);
                Assert.AreEqual("shortName", e.ShortName);
                Assert.AreEqual("subject", e.Subject);

                Assert.AreEqual(2, e.ExternalIds.Count);
                Assert.AreEqual("eidwork", e.ExternalIds[0].Value);
                Assert.AreEqual("eidhome", e.ExternalIds[1].Value);

                Assert.AreEqual(1, e.Organizations.Count);
                Assert.AreEqual("name", e.Organizations[0].Name);
                Assert.AreEqual("title", e.Organizations[0].Title);
                Assert.AreEqual("department", e.Organizations[0].Department);
                Assert.AreEqual("symbol", e.Organizations[0].Symbol);
                Assert.AreEqual("jobDescription", e.Organizations[0].JobDescription);
                Assert.AreEqual("location", e.Organizations[0].Location);

                Assert.AreEqual(2, e.Phonenumbers.Count);
                Assert.AreEqual("phwork", e.Phonenumbers.First(t => t.Rel == "http://schemas.google.com/g/2005#work").Value);
                Assert.AreEqual(true, e.Phonenumbers.First(t => t.Rel == "http://schemas.google.com/g/2005#work").Primary);
                Assert.AreEqual("phhome", e.Phonenumbers.First(t => t.Rel == "http://schemas.google.com/g/2005#home").Value);

                Assert.AreEqual(2, e.Emails.Count);
                Assert.AreEqual("*****@*****.**", e.Emails[0].Address);
                Assert.AreEqual("*****@*****.**", e.Emails[1].Address);
                Assert.AreEqual("*****@*****.**", e.PrimaryEmail.Address);

                Assert.AreEqual(1, e.IMs.Count);
                Assert.AreEqual("*****@*****.**", e.IMs[0].Address);
                Assert.AreEqual("proto", e.IMs[0].Protocol);
            }
            finally
            {
                if (id != null)
                {
                    UnitTestControl.TestParameters.ContactsService.Delete(id);
                }
            }
        }
Exemplo n.º 16
0
        public void ChangeRoleForLargeNumberOfMembers()
        {
            return;

            Group e = null;

            try
            {
                e = UnitTestControl.CreateGroup();

                Thread.Sleep(1000);

                CSEntryChange cs = CSEntryChange.Create();
                cs.ObjectModificationType = ObjectModificationType.Update;
                cs.DN         = e.Email;
                cs.ObjectType = SchemaConstants.Group;
                cs.AnchorAttributes.Add(AnchorAttribute.Create("id", e.Id));

                List <object> addresses = new List <object>();

                for (int i = 0; i < 100; i++)
                {
                    string address = $"user{i}@lithnet.io";
                    addresses.Add(address);
                }

                //addresses.Add("notanaddress");

                cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("externalMember", addresses));

                CSEntryChangeResult result =
                    ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Group], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                Thread.Sleep(1000);

                CollectionAssert.AreEquivalent(addresses.ToArray(), UnitTestControl.TestParameters.GroupsService.MemberFactory.GetMembership(cs.DN).ExternalMembers.ToArray());

                cs = CSEntryChange.Create();
                cs.ObjectModificationType = ObjectModificationType.Update;
                cs.DN         = e.Email;
                cs.ObjectType = SchemaConstants.Group;
                cs.AnchorAttributes.Add(AnchorAttribute.Create("id", e.Id));
                cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("externalManager", addresses));

                result =
                    ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Group], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                Thread.Sleep(1000);

                CollectionAssert.AreEquivalent(addresses.ToArray(), UnitTestControl.TestParameters.GroupsService.MemberFactory.GetMembership(cs.DN).ExternalManagers.ToArray());
            }
            finally
            {
                UnitTestControl.Cleanup(e);
            }
        }
        public void AddValuesOnObjectUpdate()
        {
            User u = UserTests.CreateUser();

            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Update;
            cs.DN         = u.PrimaryEmail;
            cs.ObjectType = SchemaConstants.User;
            cs.AnchorAttributes.Add(AnchorAttribute.Create("id", u.Id));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestSVString", "string1"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestSVBool", true));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestSVDate", "2018-01-03"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestSVDouble", "1.9999"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestSVEmail", "*****@*****.**"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestSVInt", 899L));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestSVPhone", "555-1234"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestMVString", new List <object> {
                "test2", "test3"
            }));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestMVDouble", new List <object> {
                "2.99999", "3.99999"
            }));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestMVDate", new List <object> {
                "2018-02-02", "2018-03-03"
            }));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestMVEmail", new List <object> {
                "*****@*****.**", "*****@*****.**"
            }));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestMVPhone", new List <object> {
                "555-6789", "555-9512"
            }));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd($"{TestSchemaName}_TestMVInt", new List <object> {
                555L, 444L
            }));

            try
            {
                CSEntryChangeResult result = ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.User], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                Thread.Sleep(UnitTestControl.PostGoogleOperationSleepInterval);

                User e = UnitTestControl.TestParameters.UsersService.Get(u.Id);
                Assert.AreEqual(cs.DN, e.PrimaryEmail);

                Assert.AreEqual("string1", (string)e.CustomSchemas[TestSchemaName]["TestSVString"]);
                Assert.AreEqual(true, (bool)e.CustomSchemas[TestSchemaName]["TestSVBool"]);
                Assert.AreEqual("2018-01-03", (string)e.CustomSchemas[TestSchemaName]["TestSVDate"]);
                Assert.AreEqual(1.9999D, (double)e.CustomSchemas[TestSchemaName]["TestSVDouble"]);
                Assert.AreEqual("*****@*****.**", (string)e.CustomSchemas[TestSchemaName]["TestSVEmail"]);
                Assert.AreEqual("899", e.CustomSchemas[TestSchemaName]["TestSVInt"]);
                Assert.AreEqual("555-1234", (string)e.CustomSchemas[TestSchemaName]["TestSVPhone"]);

                CollectionAssert.AreEquivalent(new List <object> {
                    "test2", "test3"
                }, GetReturnedValues <string>("TestMVString", e));
                CollectionAssert.AreEquivalent(new List <object> {
                    "2018-02-02", "2018-03-03"
                }, GetReturnedValues <string>("TestMVDate", e));
                CollectionAssert.AreEquivalent(new List <object> {
                    "*****@*****.**", "*****@*****.**"
                }, GetReturnedValues <string>("TestMVEmail", e));
                CollectionAssert.AreEquivalent(new List <object> {
                    "555-6789", "555-9512"
                }, GetReturnedValues <string>("TestMVPhone", e));
                CollectionAssert.AreEquivalent(new List <object> {
                    "555", "444"
                }, GetReturnedValues <string>("TestMVInt", e));
                CollectionAssert.AreEquivalent(new List <object> {
                    "2.99999", "3.99999"
                }, GetReturnedValues <string>("TestMVDouble", e));
            }
            finally
            {
                if (u?.Id != null)
                {
                    UnitTestControl.TestParameters.UsersService.Delete(u.Id);
                }
            }
        }
Exemplo n.º 18
0
 internal CSEntryChangeResultSerializable(CSEntryChangeResult change)
 {
     this.SetObject(change);
 }
        public PutExportEntriesResults PutExportEntries(IList <CSEntryChange> csentries)
        {
            ParallelOptions po = new ParallelOptions
            {
                MaxDegreeOfParallelism = MAConfigurationSection.Configuration.ExportThreads,
                CancellationToken      = this.cancellationToken.Token
            };

            PutExportEntriesResults results = new PutExportEntriesResults();

            try
            {
                Parallel.ForEach(csentries, po, (csentry) =>
                {
                    try
                    {
                        Interlocked.Increment(ref this.opCount);
                        Logger.StartThreadLog();
                        Logger.WriteSeparatorLine('-');
                        Logger.WriteLine("Starting export {0} for {1} with {2} attribute changes", csentry.ObjectModificationType, csentry.DN, csentry.AttributeChanges.Count);
                        SchemaType type = this.operationSchemaTypes.Types[csentry.ObjectType];

                        CSEntryChangeResult result = ExportProcessor.PutCSEntryChange(csentry, type, this.Configuration);
                        lock (results)
                        {
                            results.CSEntryChangeResults.Add(result);
                        }
                    }
                    catch (AggregateException ex)
                    {
                        Logger.WriteLine("An unexpected error occurred while processing {0}", csentry.DN);
                        Logger.WriteException(ex);
                        CSEntryChangeResult result = CSEntryChangeResult.Create(csentry.Identifier, null, MAExportError.ExportErrorCustomContinueRun, ex.InnerException?.Message ?? ex.Message, ex.InnerException?.StackTrace ?? ex.StackTrace);
                        lock (results)
                        {
                            results.CSEntryChangeResults.Add(result);
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.WriteLine("An unexpected error occurred while processing {0}", csentry.DN);
                        Logger.WriteException(ex);
                        CSEntryChangeResult result = CSEntryChangeResult.Create(csentry.Identifier, null, MAExportError.ExportErrorCustomContinueRun, ex.Message, ex.StackTrace);
                        lock (results)
                        {
                            results.CSEntryChangeResults.Add(result);
                        }
                    }
                    finally
                    {
                        Logger.WriteSeparatorLine('-');
                        Logger.EndThreadLog();
                    }
                });
            }
            catch (OperationCanceledException)
            {
            }

            return(results);
        }
Exemplo n.º 20
0
 internal CSEntryChangeResult GetObject()
 {
     return(CSEntryChangeResult.Create(this.Identifier, this.AnchorChanges, this.ErrorCode, this.ErrorName, this.ErrorDetail));
 }
Exemplo n.º 21
0
        PutExportEntriesResults IMAExtensible2CallExport.PutExportEntries(IList <CSEntryChange> csentries)
        {
            Tracer.Enter("putexportentries");
            Tracer.Indent();
            PutExportEntriesResults     exportEntries  = new PutExportEntriesResults();
            PSDataCollection <PSObject> exportPipeline = new PSDataCollection <PSObject>();

            try
            {
                Command cmd = new Command(Path.GetFullPath(ExportScript));
                cmd.Parameters.Add(new CommandParameter("User", Username));
                cmd.Parameters.Add(new CommandParameter("Password", Password));
                cmd.Parameters.Add(new CommandParameter("Credentials", GetSecureCredentials()));
                cmd.Parameters.Add(new CommandParameter("ExportType", exportType));

                foreach (CSEntryChange csentryChange in csentries)
                {
                    Tracer.TraceInformation("adding-object id: {0}, dn: '{1}' [{2}]", csentryChange.Identifier, csentryChange.DN, csentryChange.ObjectModificationType);
                    if (ExportSimpleObjects)
                    {
                        // http://karlprosser.com/coder/2008/06/12/generating-a-propertybag-aka-pscustomobject-in-c/
                        // creating a PSobject without any parameters in the constructor creates a PSCustomObject
                        PSObject obj = new PSObject();
                        // PSNoteProperties are not strongly typed but do contain an explicit type.
                        obj.Properties.Add(new PSNoteProperty(Constants.ControlValues.Identifier, csentryChange.Identifier.ToString()));
                        obj.Properties.Add(new PSNoteProperty(Constants.ControlValues.Anchor, csentryChange.AnchorAttributes.Count > 0 ? csentryChange.AnchorAttributes.FirstOrDefault().Value : ""));
                        obj.Properties.Add(new PSAliasProperty(Constants.ControlValues.IdentifierAsGuid, csentryChange.Identifier.ToString(), typeof(Guid)));
                        obj.Properties.Add(new PSNoteProperty(Constants.ControlValues.ObjectModificationType, csentryChange.ObjectModificationType.ToString()));
                        obj.Properties.Add(new PSNoteProperty(Constants.ControlValues.ObjectType, csentryChange.ObjectType));

                        List <string> attrs = schema.Types[csentryChange.ObjectType].Attributes.Select(a => a.Name).ToList <string>();
                        obj.Properties.Add(new PSNoteProperty(Constants.ControlValues.AttributeNames, attrs));

                        obj.Properties.Add(new PSNoteProperty(Constants.ControlValues.ChangedAttributeNames, csentryChange.ChangedAttributeNames == null ? new List <string>() : csentryChange.ChangedAttributeNames));
                        obj.Properties.Add(new PSNoteProperty(Constants.ControlValues.DN, csentryChange.DN));
                        obj.Properties.Add(new PSNoteProperty(Constants.ControlValues.RDN, csentryChange.RDN));
                        foreach (AttributeChange ac in csentryChange.AttributeChanges)
                        {
                            if (!ac.IsMultiValued)
                            {
                                foreach (ValueChange vc in ac.ValueChanges)
                                {
                                    obj.Properties.Add(new PSNoteProperty(string.Format("{0}", ac.Name), vc.Value));
                                }
                            }
                            else
                            {
                                List <object> values = new List <object>();
                                foreach (ValueChange vc in ac.ValueChanges)
                                {
                                    values.Add(vc.Value);
                                }
                                obj.Properties.Add(new PSNoteProperty(string.Format("{0}", ac.Name), values.ToArray()));
                            }
                        }
                        exportPipeline.Add(obj);
                    }
                    else
                    {
                        exportPipeline.Add(new PSObject(csentryChange));
                    }
                }

                exportResults = InvokePowerShellScript(cmd, exportPipeline);

                if (exportResults != null)
                {
                    foreach (PSObject result in exportResults)
                    {
                        if (result.BaseObject.GetType() != typeof(System.Collections.Hashtable))
                        {
                            continue;
                        }
                        Hashtable hashTable   = (Hashtable)result.BaseObject;
                        string    ErrorName   = "unspecified-error";
                        string    ErrorDetail = "No details specified";
                        Guid      identifier  = new Guid();

                        // get anchor attribute changes
                        List <AttributeChange> attrchanges = new List <AttributeChange>();
                        foreach (string key in hashTable.Keys)
                        {
                            if (key.Equals(Constants.ControlValues.Identifier, StringComparison.OrdinalIgnoreCase))
                            {
                                try
                                {
                                    identifier = new Guid(hashTable[key].ToString());
                                    Tracer.TraceInformation("got-identifier {0}, {1}", identifier, key);
                                }
                                catch (FormatException fex)
                                {
                                    Tracer.TraceError("identifier-format-error '{0}'", fex.ToString());
                                }
                                continue;
                            }
                            if (key.Equals(Constants.ControlValues.ErrorName, StringComparison.OrdinalIgnoreCase))
                            {
                                ErrorName = hashTable[key].ToString();
                                Tracer.TraceInformation("got-errorname {0}, {1}", ErrorName, key);
                                continue;
                            }
                            if (key.Equals(Constants.ControlValues.ErrorDetail, StringComparison.OrdinalIgnoreCase))
                            {
                                ErrorDetail = hashTable[key].ToString();
                                Tracer.TraceInformation("got-errordetail {0}, {1}", ErrorDetail, key);
                                continue;
                            }
                            if (!(Regex.IsMatch(key, @"^\[.+\]$", RegexOptions.IgnoreCase)))
                            {
                                Tracer.TraceInformation("got-attribute-change {0}: '{1}'", key, hashTable[key]);
                                attrchanges.Add(AttributeChange.CreateAttributeAdd(key, hashTable[key]));
                                continue;
                            }
                        }

                        if (string.IsNullOrEmpty(ErrorName) || ErrorName.Equals("success", StringComparison.OrdinalIgnoreCase))
                        {
                            Tracer.TraceInformation("returning-success id: {0}", identifier);
                            CSEntryChangeResult cschangeresult = CSEntryChangeResult.Create(identifier, attrchanges, MAExportError.Success);
                            exportEntries.CSEntryChangeResults.Add(cschangeresult);
                        }
                        else
                        {
                            Tracer.TraceInformation("returning-error id: {0}, name: {1}, details: {2}", identifier, ErrorName, ErrorDetail);
                            CSEntryChangeResult cschangeresult = CSEntryChangeResult.Create(identifier, attrchanges, MAExportError.ExportErrorCustomContinueRun, ErrorName, ErrorDetail);
                            exportEntries.CSEntryChangeResults.Add(cschangeresult);
                        }
                    }
                }
                exportPipeline.Clear();
                exportResults.Clear();
                exportResults = null;
                return(exportEntries);
            }
            catch (Exception ex)
            {
                Tracer.TraceError("putexportentries", ex);
                throw;
            }
            finally
            {
                Tracer.Unindent();
                Tracer.Exit("putexportentries");
            }
        }
Exemplo n.º 22
0
        public void UpdateBuilding()
        {
            Building building = new Building();

            building.BuildingId   = "test-building";
            building.BuildingName = "My building";
            building.Description  = "some description";
            building.FloorNames   = new List <string>()
            {
                "B1", "B2", "G"
            };
            building.Coordinates = new BuildingCoordinates()
            {
                Latitude = -66, Longitude = 44
            };

            UnitTestControl.TestParameters.ResourcesService.AddBuilding(UnitTestControl.TestParameters.CustomerID, building);

            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Update;
            cs.DN         = $"{building.BuildingId}{ApiInterfaceBuilding.DNSuffix}";
            cs.ObjectType = SchemaConstants.Building;
            cs.AnchorAttributes.Add(AnchorAttribute.Create("id", building.BuildingId));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeReplace("buildingName", "new name"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeReplace("description", "new description"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeReplace("floorNames", "G,1,2"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeReplace("coordinates_latitude", "11"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeReplace("coordinates_longitude", "-22"));

            string id = building.BuildingId;

            try
            {
                CSEntryChangeResult result = ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Building], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                Thread.Sleep(UnitTestControl.PostGoogleOperationSleepInterval);

                Building c = UnitTestControl.TestParameters.ResourcesService.GetBuilding(UnitTestControl.TestParameters.CustomerID, id);
                Assert.AreEqual("test-building", c.BuildingId);
                Assert.AreEqual("new name", c.BuildingName);
                Assert.AreEqual("new description", c.Description);

                CollectionAssert.AreEqual(new string[] { "G", "1", "2" }, c.FloorNames.ToArray());
                Assert.AreEqual(11D, c.Coordinates?.Latitude);
                Assert.AreEqual(-22D, c.Coordinates?.Longitude);
            }
            finally
            {
                if (id != null)
                {
                    UnitTestControl.TestParameters.ResourcesService.DeleteBuilding(UnitTestControl.TestParameters.CustomerID, id);
                }
            }
        }
Exemplo n.º 23
0
        private async Task <CSEntryChangeResult> PutCSEntryChangeUpdate(CSEntryChange csentry)
        {
            string teamid = csentry.GetAnchorValueOrDefault <string>("id");

            bool archive   = false;
            bool unarchive = false;

            if (csentry.HasAttributeChange("isArchived"))
            {
                logger.Trace("Archive state is changing");

                if (csentry.AttributeChanges["isArchived"].ModificationType == AttributeModificationType.Delete)
                {
                    throw new UnsupportedBooleanAttributeDeleteException("isArchived");
                }

                var team = await GraphHelperTeams.GetTeam(this.betaClient, teamid, this.token);

                bool currentState = false;

                if (team.IsArchived == null)
                {
                    logger.Trace("Current archive state value was null");
                }
                else
                {
                    currentState = team.IsArchived.Value;
                }

                logger.Trace($"Teams current archive state is {currentState}");

                bool futureState = csentry.GetValueAdd <bool>("isArchived");

                logger.Trace($"Requested archive state is {futureState}");

                if (futureState != currentState)
                {
                    if (futureState)
                    {
                        archive = true;
                        logger.Trace("Flagging team for archiving");
                    }
                    else
                    {
                        unarchive = true;
                        logger.Trace("Flagging team for unarchiving");
                    }
                }
                else
                {
                    logger.Trace("Current archive state matches target archive state");
                }
            }
            else
            {
                logger.Trace("Archive state has not changed");
            }

            if (unarchive)
            {
                await this.PutCSEntryChangeUpdateUnarchive(csentry);
            }

            await this.PutCSEntryChangeUpdateTeam(csentry);

            if (archive)
            {
                await this.PutCSEntryChangeUpdateArchive(csentry);
            }

            await this.PutCSEntryChangeUpdateGroup(csentry);

            return(CSEntryChangeResult.Create(csentry.Identifier, null, MAExportError.Success));
        }
        private async Task <CSEntryChangeResult> PutCSEntryChangeUpdate(CSEntryChange csentry)
        {
            await this.PutCSEntryChangeUpdateChannel(csentry);

            return(CSEntryChangeResult.Create(csentry.Identifier, null, MAExportError.Success));
        }
Exemplo n.º 25
0
        public void UpdateCalendarClearAcls()
        {
            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Add;
            cs.DN         = Guid.NewGuid().ToString();
            cs.ObjectType = SchemaConstants.Calendar;

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("name", "test-name"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("buildingId", "testbuilding1"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("capacity", 33L));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("owner", new List <object> {
                this.CreateAddress("owner1"), this.CreateAddress("owner2")
            }));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("reader", new List <object> {
                this.CreateAddress("reader1"), this.CreateAddress("reader2")
            }));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("writer", new List <object> {
                this.CreateAddress("writer1"), this.CreateAddress("writer2")
            }));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("freeBusyReader", this.CreateAddress("freebusyreader")));

            string id = null;

            try
            {
                CSEntryChangeResult result = ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Calendar], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                id = result.AnchorAttributes["id"].GetValueAdd <string>();

                Thread.Sleep(UnitTestControl.PostGoogleOperationSleepInterval);

                CalendarResource c = UnitTestControl.TestParameters.ResourcesService.GetCalendar(UnitTestControl.TestParameters.CustomerID, id);

                List <AclRule> acls = UnitTestControl.TestParameters.ResourcesService.GetCalendarAclRules(UnitTestControl.TestParameters.CustomerID, c.ResourceEmail).ToList();

                Assert.IsNotNull(acls.FirstOrDefault(t => t.Role == "owner" && t.Scope.Value == this.CreateAddress("owner1")));
                Assert.IsNotNull(acls.FirstOrDefault(t => t.Role == "owner" && t.Scope.Value == this.CreateAddress("owner2")));
                Assert.IsNotNull(acls.FirstOrDefault(t => t.Role == "reader" && t.Scope.Value == this.CreateAddress("reader1")));
                Assert.IsNotNull(acls.FirstOrDefault(t => t.Role == "reader" && t.Scope.Value == this.CreateAddress("reader2")));
                Assert.IsNotNull(acls.FirstOrDefault(t => t.Role == "writer" && t.Scope.Value == this.CreateAddress("writer1")));
                Assert.IsNotNull(acls.FirstOrDefault(t => t.Role == "writer" && t.Scope.Value == this.CreateAddress("writer2")));
                Assert.IsNotNull(acls.FirstOrDefault(t => t.Role == "freeBusyReader" && t.Scope.Value == this.CreateAddress("freebusyreader")));

                cs = CSEntryChange.Create();
                cs.ObjectModificationType = ObjectModificationType.Update;
                cs.ObjectType             = SchemaConstants.Calendar;

                cs.AnchorAttributes.Add(AnchorAttribute.Create("id", id));
                cs.AnchorAttributes.Add(AnchorAttribute.Create("resourceEmail", result.AnchorAttributes["resourceEmail"].GetValueAdd <string>()));

                cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete("owner"));
                cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete("reader"));
                cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete("writer"));
                cs.AttributeChanges.Add(AttributeChange.CreateAttributeDelete("freeBusyReader"));

                result = ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Calendar], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                Thread.Sleep(UnitTestControl.PostGoogleOperationSleepInterval);

                acls = UnitTestControl.TestParameters.ResourcesService.GetCalendarAclRules(UnitTestControl.TestParameters.CustomerID, c.ResourceEmail).ToList();

                Assert.IsNull(acls.FirstOrDefault(t => t.Role == "owner" && t.Scope.Value != c.ResourceEmail));
                Assert.IsNull(acls.FirstOrDefault(t => t.Role == "freeBusyReader" && t.Scope.Type != "domain"));
                Assert.IsNull(acls.FirstOrDefault(t => t.Role == "reader"));
                Assert.IsNull(acls.FirstOrDefault(t => t.Role == "writer"));
            }
            finally
            {
                if (id != null)
                {
                    UnitTestControl.TestParameters.ResourcesService.DeleteCalendar(UnitTestControl.TestParameters.CustomerID, id);
                }
            }
        }
Exemplo n.º 26
0
        public void Add()
        {
            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Add;
            cs.DN         = $"{Guid.NewGuid()}";
            cs.ObjectType = SchemaConstants.Course;

            User t1 = UserTests.CreateUser();
            User t2 = UserTests.CreateUser();
            User s1 = UserTests.CreateUser();
            User s2 = UserTests.CreateUser();

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("name", "name"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("ownerId", new List <object>()
            {
                t1.PrimaryEmail
            }));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("teachers", new List <object>()
            {
                t1.PrimaryEmail, t2.PrimaryEmail
            }));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("students", new List <object>()
            {
                s1.PrimaryEmail, s2.PrimaryEmail
            }));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("courseState", "ACTIVE"));

            string id = null;

            try
            {
                CSEntryChangeResult result = ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Course], UnitTestControl.TestParameters);
                id = result.AnchorAttributes["id"].GetValueAdd <string>();

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail(result.ErrorName);
                }

                System.Threading.Thread.Sleep(UnitTestControl.PostGoogleOperationSleepInterval);

                Course e = UnitTestControl.TestParameters.ClassroomService.GetCourse(id);
                Assert.AreEqual("name", e.Name);
                Assert.AreEqual("ACTIVE", e.CourseState);

                CollectionAssert.AreEquivalent(new string[] { s1.Id, s2.Id },
                                               UnitTestControl.TestParameters.ClassroomService.StudentFactory.GetCourseStudents(id).GetAllStudents().ToArray());

                CollectionAssert.AreEquivalent(new string[] { t1.Id, t2.Id },
                                               UnitTestControl.TestParameters.ClassroomService.TeacherFactory.GetCourseTeachers(id).GetAllTeachers().ToArray());
            }
            finally
            {
                UnitTestControl.Cleanup(t1, t2, s1, s2);

                if (id != null)
                {
                    UnitTestControl.TestParameters.ClassroomService.Delete(id);
                }
            }
        }
Exemplo n.º 27
0
        public PutExportEntriesResults PutExportEntries(IList <CSEntryChange> csentries)
        {
            PutExportEntriesResults exportEntriesResults = new PutExportEntriesResults();

            //int i = 0;

            foreach (CSEntryChange csentryChange in csentries)
            {
                userID = csentryChange.DN.ToString();

                if (csentryChange.ObjectType == "Person")
                {
                    // Code to Create RSA account
                    if (csentryChange.ObjectModificationType == ObjectModificationType.Add)
                    {
                        foreach (string attrib in csentryChange.ChangedAttributeNames)
                        {
                            switch (attrib)
                            {
                            case "First Name":
                                firstName = csentryChange.AttributeChanges["First Name"].ValueChanges[0].Value.ToString();
                                break;

                            case "Last Name":
                                lastName = csentryChange.AttributeChanges["Last Name"].ValueChanges[0].Value.ToString();
                                break;

                            case "Manager Email Address":
                                managerEmailAddress = csentryChange.AttributeChanges["Manager Email Address"].ValueChanges[0].Value.ToString();
                                break;

                            case "Middle Name":
                                middleName = csentryChange.AttributeChanges["Middle Name"].ValueChanges[0].Value.ToString();
                                break;
                            }
                        }


                        try
                        {
                            AssignNewTokenToExistingUser(userID, managerEmailAddress, firstName, lastName);
                        }
                        catch (UserNotFoundException)
                        {
                            CSEntryChangeResult error = CSEntryChangeResult.Create(csentryChange.Identifier, null, MAExportError.ExportErrorInvalidDN);
                            exportEntriesResults.CSEntryChangeResults.Add(error);

                            EmailError(new Exception("Unable to assign a token for user '" + userID + "'. User not found. The synchronization engine will try to assign a token on the next export."));
                        }
                    }


                    // Code to Delete from RSA store
                    if (csentryChange.ObjectModificationType == ObjectModificationType.Replace)
                    {
                        //this.DeleteUser(userID);
                    }
                } // End of type Person
            }     // End of ForEach

            // i++;



            return(exportEntriesResults);
        }
        public void Add()
        {
            CSEntryChange cs = CSEntryChange.Create();

            cs.ObjectModificationType = ObjectModificationType.Add;
            cs.DN         = $"{Guid.NewGuid()}@{UnitTestControl.TestParameters.Domain}";
            cs.ObjectType = SchemaConstants.Group;

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("description", "description"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("name", "name"));

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("allowExternalMembers", true));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("allowGoogleCommunication", true));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("allowWebPosting", true));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("archiveOnly", false));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("customReplyTo", "*****@*****.**"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("customFooterText", "custom footer"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("defaultMessageDenyNotificationText", "occupation"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("includeInGlobalAddressList", true));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("isArchived", false));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("includeCustomFooter", true));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("maxMessageBytes", 5000000L));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("membersCanPostAsTheGroup", true));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("messageDisplayFont", "DEFAULT_FONT"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("messageModerationLevel", "MODERATE_NEW_MEMBERS"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("primaryLanguage", "en-GB"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("sendMessageDenyNotification", true));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("showInGroupDirectory", true));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("spamModerationLevel", "SILENTLY_MODERATE"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("whoCanAdd", "ALL_MANAGERS_CAN_ADD"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("whoCanModerateMembers", "OWNERS_ONLY"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("whoCanContactOwner", "ANYONE_CAN_CONTACT"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("whoCanInvite", "NONE_CAN_INVITE"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("whoCanJoin", "CAN_REQUEST_TO_JOIN"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("replyTo", "REPLY_TO_CUSTOM"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("whoCanPostMessage", "ALL_MANAGERS_CAN_POST"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("whoCanViewGroup", "ALL_MANAGERS_CAN_VIEW"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("whoCanViewMembership", "ALL_MEMBERS_CAN_VIEW"));
            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("whoCanLeaveGroup", "ALL_MANAGERS_CAN_LEAVE"));

            string alias1 = $"{Guid.NewGuid()}@{UnitTestControl.TestParameters.Domain}";
            string alias2 = $"{Guid.NewGuid()}@{UnitTestControl.TestParameters.Domain}";

            cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("aliases", new List <object>()
            {
                alias1, alias2
            }));

            string id = null;

            try
            {
                CSEntryChangeResult result =
                    ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Group], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail($"{result.ErrorName}\n{result.ErrorDetail}");
                }

                id = result.AnchorAttributes["id"].GetValueAdd <string>();

                Group e = UnitTestControl.TestParameters.GroupsService.Get(id);
                Assert.AreEqual(cs.DN, e.Email);

                Assert.AreEqual(true, e.AdminCreated);
                Assert.AreEqual("description", e.Description);
                Assert.AreEqual("name", e.Name);

                GroupSettings s = UnitTestControl.TestParameters.GroupsService.SettingsFactory.Get(cs.DN);
                Assert.AreEqual(true, s.AllowExternalMembers);
                Assert.AreEqual(true, s.AllowGoogleCommunication);
                Assert.AreEqual(true, s.AllowWebPosting);
                Assert.AreEqual(false, s.ArchiveOnly);
                Assert.AreEqual("*****@*****.**", s.CustomReplyTo);
                Assert.AreEqual("custom footer", s.CustomFooterText);
                Assert.AreEqual("occupation", s.DefaultMessageDenyNotificationText);
                Assert.AreEqual(true, s.IncludeInGlobalAddressList);
                Assert.AreEqual(true, s.IncludeCustomFooter);
                Assert.AreEqual(false, s.IsArchived);
                Assert.AreEqual(5000000, s.MaxMessageBytes);
                Assert.AreEqual(true, s.MembersCanPostAsTheGroup);
                Assert.AreEqual("DEFAULT_FONT", s.MessageDisplayFont);
                Assert.AreEqual("MODERATE_NEW_MEMBERS", s.MessageModerationLevel);
                Assert.AreEqual("en-GB", s.PrimaryLanguage);
                Assert.AreEqual(true, s.SendMessageDenyNotification);
                Assert.AreEqual(true, s.ShowInGroupDirectory);
                Assert.AreEqual("SILENTLY_MODERATE", s.SpamModerationLevel);
                Assert.AreEqual(true, s.ShowInGroupDirectory);
                Assert.AreEqual("ALL_MANAGERS_CAN_ADD", s.WhoCanAdd);
                Assert.AreEqual("OWNERS_ONLY", s.WhoCanModerateMembers);
                Assert.AreEqual("ANYONE_CAN_CONTACT", s.WhoCanContactOwner);
                Assert.AreEqual("NONE_CAN_INVITE", s.WhoCanInvite);
                Assert.AreEqual("CAN_REQUEST_TO_JOIN", s.WhoCanJoin);
                Assert.AreEqual("ALL_MANAGERS_CAN_LEAVE", s.WhoCanLeaveGroup);
                Assert.AreEqual("REPLY_TO_CUSTOM", s.ReplyTo);
                Assert.AreEqual("ALL_MANAGERS_CAN_POST", s.WhoCanPostMessage);
                Assert.AreEqual("ALL_MANAGERS_CAN_VIEW", s.WhoCanViewGroup);
                Assert.AreEqual("ALL_MEMBERS_CAN_VIEW", s.WhoCanViewMembership);

                CollectionAssert.AreEquivalent(new string[] { alias1, alias2 }, e.Aliases.ToArray());
            }
            finally
            {
                if (id != null)
                {
                    UnitTestControl.TestParameters.GroupsService.Delete(id);
                }
            }
        }
Exemplo n.º 29
0
        private CSEntryChangeResult PutCSEntryChangeAdd(CSEntryChange csentry, ExportContext context)
        {
            AuthenticationProvider provider = new AuthenticationProvider();

            provider.Type = AuthenticationProviderType.Okta;

            UserProfile profile     = new UserProfile();
            bool        suspend     = false;
            string      newPassword = null;

            foreach (AttributeChange change in csentry.AttributeChanges)
            {
                if (change.Name == "provider.type")
                {
                    provider.Type = new AuthenticationProviderType(change.GetValueAdd <string>());
                    logger.Info($"Set {change.Name} to {provider.Type ?? "<null>"}");
                }
                else if (change.Name == "provider.name")
                {
                    provider.Name = change.GetValueAdd <string>();
                    logger.Info($"Set {change.Name} to {provider.Name ?? "<null>"}");
                }
                else if (change.Name == "suspended")
                {
                    suspend = change.GetValueAdd <bool>();
                }
                else if (change.Name == "export_password")
                {
                    newPassword = change.GetValueAdd <string>();
                }
                else
                {
                    if (change.IsMultiValued)
                    {
                        profile[change.Name] = change.GetValueAdds <object>();
                    }
                    else
                    {
                        profile[change.Name] = change.GetValueAdd <object>();
                        logger.Info($"Set {change.Name} to {profile[change.Name] ?? "<null>"}");
                    }
                }
            }

            IOktaClient client = ((OktaConnectionContext)context.ConnectionContext).Client;
            IUser       result;

            if (newPassword != null)
            {
                CreateUserWithPasswordOptions options = new CreateUserWithPasswordOptions()
                {
                    Password = newPassword,
                    Activate = false,
                    Profile  = profile
                };

                result = AsyncHelper.RunSync(client.Users.CreateUserAsync(options, context.CancellationTokenSource.Token), context.CancellationTokenSource.Token);
            }
            else
            {
                CreateUserWithProviderOptions options = new CreateUserWithProviderOptions()
                {
                    Profile      = profile,
                    ProviderName = provider.Name,
                    ProviderType = provider.Type,
                    Activate     = false
                };

                result = AsyncHelper.RunSync(client.Users.CreateUserAsync(options, context.CancellationTokenSource.Token), context.CancellationTokenSource.Token);
            }

            if (context.ConfigParameters[ConfigParameterNames.ActivateNewUsers].Value == "1")
            {
                bool sendEmail = context.ConfigParameters[ConfigParameterNames.SendActivationEmailToNewUsers].Value == "1";
                AsyncHelper.RunSync(client.Users.ActivateUserAsync(result.Id, sendEmail, context.CancellationTokenSource.Token), context.CancellationTokenSource.Token);
            }

            if (suspend)
            {
                AsyncHelper.RunSync(result.SuspendAsync(context.CancellationTokenSource.Token), context.CancellationTokenSource.Token);
            }

            List <AttributeChange> anchorChanges = new List <AttributeChange>();

            anchorChanges.Add(AttributeChange.CreateAttributeAdd("id", result.Id));

            return(CSEntryChangeResult.Create(csentry.Identifier, anchorChanges, MAExportError.Success));
        }
        public void UpdateNoneCanPostOn()
        {
            Group e = null;

            try
            {
                e = UnitTestControl.CreateGroup();

                CSEntryChange cs = CSEntryChange.Create();
                cs.ObjectModificationType = ObjectModificationType.Update;
                cs.DN         = e.Email;
                cs.ObjectType = SchemaConstants.Group;
                cs.AnchorAttributes.Add(AnchorAttribute.Create("id", e.Id));

                cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("whoCanPostMessage", "NONE_CAN_POST"));
                cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("primaryLanguage", "en-GB"));

                CSEntryChangeResult result =
                    ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Group], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail($"{result.ErrorName}\n{result.ErrorDetail}");
                }

                e = UnitTestControl.TestParameters.GroupsService.Get(e.Id);
                Assert.AreEqual(cs.DN, e.Email);

                GroupSettings s = UnitTestControl.TestParameters.GroupsService.SettingsFactory.Get(cs.DN);

                Assert.AreEqual(true, s.ArchiveOnly);

                Assert.AreEqual("NONE_CAN_POST", s.WhoCanPostMessage);

                cs = CSEntryChange.Create();
                cs.ObjectModificationType = ObjectModificationType.Update;
                cs.DN         = e.Email;
                cs.ObjectType = SchemaConstants.Group;
                cs.AnchorAttributes.Add(AnchorAttribute.Create("id", e.Id));

                cs.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("whoCanPostMessage", "ALL_IN_DOMAIN_CAN_POST"));

                result =
                    ExportProcessor.PutCSEntryChange(cs, UnitTestControl.Schema.GetSchema().Types[SchemaConstants.Group], UnitTestControl.TestParameters);

                if (result.ErrorCode != MAExportError.Success)
                {
                    Assert.Fail($"{result.ErrorName}\n{result.ErrorDetail}");
                }

                e = UnitTestControl.TestParameters.GroupsService.Get(e.Id);
                Assert.AreEqual(cs.DN, e.Email);

                s = UnitTestControl.TestParameters.GroupsService.SettingsFactory.Get(cs.DN);

                Assert.AreEqual(false, s.ArchiveOnly);

                Assert.AreEqual("ALL_IN_DOMAIN_CAN_POST", s.WhoCanPostMessage);
            }
            finally
            {
                UnitTestControl.Cleanup(e);
            }
        }