public void ValidateAttemptToAddDeleteOperationalAttribute() { // list of all the operational attributes.. ICollection <ConnectorAttribute> list = new List <ConnectorAttribute>(); list.Add(ConnectorAttributeBuilder.BuildEnabled(false)); list.Add(ConnectorAttributeBuilder.BuildLockOut(true)); list.Add(ConnectorAttributeBuilder.BuildCurrentPassword(newSecureString("fadsf"))); list.Add(ConnectorAttributeBuilder.BuildPasswordExpirationDate(DateTime.Now)); list.Add(ConnectorAttributeBuilder.BuildPassword(newSecureString("fadsf"))); foreach (ConnectorAttribute attr in list) { ICollection <ConnectorAttribute> attrs = new HashSet <ConnectorAttribute>(); attrs.Add(attr); try { UpdateImpl.ValidateInput(ObjectClass.ACCOUNT, new Uid("1"), attrs, true); Assert.Fail("Failed: " + attr.Name); } catch (ArgumentException) { // this is a good thing.. } } }
private List <ConnectorAttribute> GetTestUpdateConnectorObject(String name) { var attrs = new List <ConnectorAttribute> { ConnectorAttributeBuilder.Build("mail", name + "@example2.com"), ConnectorAttributeBuilder.BuildPassword(new GuardedString(GetSecure(Password + "2"))), ConnectorAttributeBuilder.BuildEnabled(false) }; return(attrs); }
private List <ConnectorAttribute> GetTestCreateConnectorObject(String name) { var attrs = new List <ConnectorAttribute> { ConnectorAttributeBuilder.Build(Name.NAME, name), ConnectorAttributeBuilder.Build("userName", name), ConnectorAttributeBuilder.Build("email", name + "@example.com"), ConnectorAttributeBuilder.BuildEnabled(true), ConnectorAttributeBuilder.Build("firstName", "John"), ConnectorAttributeBuilder.Build("surName", name.ToUpper()), ConnectorAttributeBuilder.BuildPassword(new GuardedString(GetSecure(Password))), ConnectorAttributeBuilder.Build(PredefinedAttributes.DESCRIPTION, "Description"), ConnectorAttributeBuilder.Build("groups", "group1", "group2"), }; return(attrs); }
public virtual void Sync(ObjectClass objectClass, SyncToken token, SyncResultsHandler handler, OperationOptions options) { if (ObjectClass.ALL.Equals(objectClass)) { // } else if (ObjectClass.ACCOUNT.Equals(objectClass)) { var builder = new ConnectorObjectBuilder(); builder.SetUid("3f50eca0-f5e9-11e3-a3ac-0800200c9a66"); builder.SetName("Foo"); builder.AddAttribute(ConnectorAttributeBuilder.BuildEnabled(true)); var deltaBuilder = new SyncDeltaBuilder { Object = builder.Build(), DeltaType = SyncDeltaType.CREATE, Token = new SyncToken(10) }; foreach (SyncDelta connectorObject in CollectionUtil.NewSet(deltaBuilder.Build())) { if (!handler.Handle(connectorObject)) { // Stop iterating because the handler stopped processing break; } } } else { Trace.TraceWarning("Sync of type {0} is not supported", _configuration.ConnectorMessages.Format(objectClass.GetDisplayNameKey(), objectClass.GetObjectClassValue())); throw new NotSupportedException("Sync of type" + objectClass.GetObjectClassValue() + " is not supported"); } ((SyncTokenResultsHandler)handler).HandleResult(new SyncToken(10)); }
static TstAbstractConnector() { bool enabled = true; for (int i = 0; i < 100; i++) { ConnectorObjectBuilder builder = new ConnectorObjectBuilder(); builder.SetUid(Convert.ToString(i)); builder.SetName(string.Format("user{0:D3}", i)); builder.AddAttribute(ConnectorAttributeBuilder.BuildEnabled(enabled)); IDictionary <string, object> mapAttribute = new Dictionary <string, object>(); mapAttribute["email"] = "*****@*****.**"; mapAttribute["primary"] = true; mapAttribute["usage"] = new List <String>() { "home", "work" }; builder.AddAttribute("emails", mapAttribute); ConnectorObject co = builder.Build(); collection[co.Name.GetNameValue()] = co; enabled = !enabled; } }
public virtual void ExecuteQuery(ObjectClass objectClass, string query, ResultsHandler handler, OperationOptions options) { var builder = new ConnectorObjectBuilder(); builder.SetUid("3f50eca0-f5e9-11e3-a3ac-0800200c9a66"); builder.SetName("Foo"); builder.AddAttribute(ConnectorAttributeBuilder.BuildEnabled(true)); foreach (ConnectorObject connectorObject in CollectionUtil.NewSet(builder.Build())) { if (!handler.Handle(connectorObject)) { // Stop iterating because the handler stopped processing break; } } if (options.PageSize != null && 0 < options.PageSize) { Trace.TraceInformation("Paged Search was requested"); ((SearchResultsHandler)handler).HandleResult(new SearchResult("0", 0)); } }
public void TestPagedSearch() { ConnectorPoolManager.Dispose(); ConnectorInfoManager manager = GetConnectorInfoManager(); ConnectorInfo info1 = FindConnectorInfo(manager, "1.0.0.0", "org.identityconnectors.testconnector.TstStatefulPoolableConnector"); Assert.IsNotNull(info1); APIConfiguration config = info1.CreateDefaultAPIConfiguration(); config.ProducerBufferSize = 0; config.ConnectorPoolConfiguration.MinIdle = 1; config.ConnectorPoolConfiguration.MaxIdle = 2; config.ResultsHandlerConfiguration.FilteredResultsHandlerInValidationMode = true; // for paged searches, the filtered results handler should be either disabled or put into validation mode ConnectorFacade facade1 = ConnectorFacadeFactory.GetInstance().NewInstance(config); OperationOptionsBuilder builder = new OperationOptionsBuilder(); builder.PageSize = 10; builder.SetSortKeys(new ICF.SortKey(Name.NAME, true)); SearchResult searchResult = null; ISet <Uid> UIDs = new HashSet <Uid>(); int iteration = 0; do { if (null != searchResult) { builder.PagedResultsCookie = searchResult.PagedResultsCookie; } int size = 0; searchResult = facade1.Search(ObjectClass.ACCOUNT, null, new ResultsHandler() { Handle = obj => { if (size >= 10) { Assert.Fail("More then 10 objects was handled!"); } size++; if (UIDs.Contains(obj.Uid)) { Assert.Fail("Duplicate Entry in results"); } return(UIDs.Add(obj.Uid)); } }, builder.Build()); iteration++; Assert.IsNotNull(searchResult); Assert.AreEqual(searchResult.RemainingPagedResults, 100 - (iteration * 10)); } while (searchResult.PagedResultsCookie != null); // Search with paged results offset builder = new OperationOptionsBuilder(); builder.PageSize = 10; builder.PagedResultsOffset = 5; builder.SetSortKeys(new ICF.SortKey(Name.NAME, true)); searchResult = null; UIDs.Clear(); Filter filter = FilterBuilder.EqualTo(ConnectorAttributeBuilder.BuildEnabled(true)); iteration = 0; do { if (null != searchResult) { builder.PagedResultsCookie = searchResult.PagedResultsCookie; } int size = 0; searchResult = facade1.Search(ObjectClass.ACCOUNT, filter, new ResultsHandler() { Handle = obj => { if (size >= 10) { Assert.Fail("More then 10 objects was handled!"); } size++; if (UIDs.Contains(obj.Uid)) { Assert.Fail("Duplicate Entry in results"); } return(UIDs.Add(obj.Uid)); } }, builder.Build()); iteration++; Assert.IsNotNull(searchResult); Assert.AreEqual(searchResult.RemainingPagedResults, Math.Max(50 - (iteration * 15), 0)); } while (searchResult.PagedResultsCookie != null); }
/// <summary> /// Process the Hashtable result and convert it to a SyncDelta object /// ready to be processed by the sync handler /// </summary> /// <remarks> /// The result Hashtable must follow a specific format and contain the following key/value: /// /// "Token": (Object) token object (could be Integer, Date, String), [!! could be null] /// "DeltaType": (String) ("CREATE|UPDATE|CREATE_OR_UPDATE"|"DELETE"), /// "Uid": (String) uid (uid of the entry), /// "PreviousUid": (String) previous uid (This is for rename ops), /// "Object": Hashtable(String,List) of attributes name/values describing the object /// "ObjectClass": (String) must be set if Operation = DELETE and Object = null /// </remarks> /// <param name="result"></param> /// <returns></returns> public Object Process(Hashtable result) { var syncbld = new SyncDeltaBuilder(); var cobld = new ConnectorObjectBuilder(); Uid uid; // SyncToken // Mandatory here if (result.ContainsKey(SyncTokenKeyName)) { syncbld.Token = result[SyncTokenKeyName] == null ? new SyncToken(0L) : new SyncToken(result[SyncTokenKeyName]); } else { throw new ArgumentException("SyncToken is missing in Sync result"); } // SyncDelta // Mandatory here if (isValidKeyAndValue(result, DeltaTypeKeyName)) { var op = result[DeltaTypeKeyName]; if (SyncDeltaType.CREATE.ToString().Equals(op as String, StringComparison.OrdinalIgnoreCase)) { syncbld.DeltaType = SyncDeltaType.CREATE; } else if (SyncDeltaType.UPDATE.ToString().Equals(op as String, StringComparison.OrdinalIgnoreCase)) { syncbld.DeltaType = SyncDeltaType.UPDATE; } else if (SyncDeltaType.DELETE.ToString().Equals(op as String, StringComparison.OrdinalIgnoreCase)) { syncbld.DeltaType = SyncDeltaType.DELETE; } else if (SyncDeltaType.CREATE_OR_UPDATE.ToString().Equals(op as String, StringComparison.OrdinalIgnoreCase)) { syncbld.DeltaType = SyncDeltaType.CREATE_OR_UPDATE; } else { throw new ArgumentException("Unrecognized DeltaType in Sync result"); } } else { throw new ArgumentException("DeltaType is missing in Sync result"); } // Uid // Mandatory if (isValidKeyAndValue(result, UidKeyName)) { var value = result[UidKeyName]; if (value is String) { uid = new Uid(value as String); } else if (value is Uid) { uid = value as Uid; } else { throw new ArgumentException("Unrecognized Uid in Sync result"); } syncbld.Uid = uid; cobld.SetUid(uid); } else { throw new ArgumentException("Uid is missing in Sync result"); } // PreviousUid // Not valid if DELETE if (isValidKeyAndValue(result, PreviousUidKeyName)) { var value = result[PreviousUidKeyName]; Uid previousUid; if (value is String) { previousUid = new Uid(value as String); } else if (value is Uid) { previousUid = value as Uid; } else { throw new ArgumentException("Unrecognized PreviousUid in Sync result"); } syncbld.PreviousUid = previousUid; } if (syncbld.PreviousUid != null && syncbld.DeltaType == SyncDeltaType.DELETE) { throw new ArgumentException("PreviousUid can only be specified for Create or Update."); } // Connector object // Mandatory unless DELETE if (result.ContainsKey(ConnectorObjectKeyName) && result[ConnectorObjectKeyName] is Hashtable) { var attrs = result[ConnectorObjectKeyName] as Hashtable; if (!attrs.ContainsKey(Name.NAME)) { throw new ArgumentException("The Object must contain a Name"); } foreach (DictionaryEntry attr in attrs) { var attrName = attr.Key as String; var attrValue = attr.Value; if (Name.NAME.Equals(attrName)) { cobld.SetName(attrValue as String); } else if (Uid.NAME.Equals((attrName))) { if (!uid.GetUidValue().Equals(attrValue)) { throw new ArgumentException("Uid from Object is different than Uid from Sync result"); } } else if (OperationalAttributes.ENABLE_NAME.Equals((attrName))) { cobld.AddAttribute(ConnectorAttributeBuilder.BuildEnabled(attr.Value is bool && (bool)attr.Value)); } else { if (attrValue == null) { cobld.AddAttribute(ConnectorAttributeBuilder.Build(attrName)); } else if (attrValue.GetType() == typeof(Object[]) || attrValue.GetType() == typeof(System.Collections.ICollection)) { var list = new Collection <object>(); foreach (var val in (ICollection)attrValue) { list.Add(FrameworkUtil.IsSupportedAttributeType(val.GetType()) ? val : val.ToString()); } cobld.AddAttribute(ConnectorAttributeBuilder.Build(attrName, list)); } else { cobld.AddAttribute(ConnectorAttributeBuilder.Build(attrName, attrValue)); } } } cobld.ObjectClass = _objectClass; syncbld.Object = cobld.Build(); } // If operation is DELETE and the ConnectorObject is null, // we need to set the ObjectClass at the SyncDelta level else if ((SyncDeltaType.DELETE == syncbld.DeltaType) && isValidKeyAndValue(result, ObjectClassKeyName)) { var objclass = result[ObjectClassKeyName]; if (objclass is ObjectClass) { syncbld.ObjectClass = objclass as ObjectClass; } else if (objclass is String) { syncbld.ObjectClass = new ObjectClass(objclass as String); } else { throw new ArgumentException("Unrecognized ObjectClass in Sync result"); } } else { throw new ArgumentException("Object is missing in Sync result"); } return(_handler.Handle(syncbld.Build())); }