Ejemplo n.º 1
0
        internal static object ConvertToDbValue(object value, IXrmDb db)
        {
            if (value is OptionSetValue osv)
            {
                return(osv.Value);
            }
            if (value is Money money)
            {
                return(money.Value);
            }
            if (value is EntityReference reference && db.IsValidEntity(reference.LogicalName))
            {
                //return db.GetEntity(reference);
                return(value);
            }
            if (value is IEnumerable <Entity> entities)
            {
                return(entities
                       .Where(e => db.IsValidEntity(e.LogicalName))
                       .Select(e => db.GetEntity(e.ToEntityReference()))
                       .ToArray());
            }

            return(value);
        }
Ejemplo n.º 2
0
 internal RequestHandler(Core core, IXrmDb db, MetadataSkeleton metadata, Security security, string RequestName)
 {
     this.security    = security;
     this.core        = core;
     this.db          = db;
     this.metadata    = metadata;
     this.RequestName = RequestName.ToLower();
 }
Ejemplo n.º 3
0
 internal void InitializeSecurityRoles(IXrmDb db)
 {
     AddRolesForBusinessUnit(db, Core.RootBusinessUnitRef);
     SetSecurityRole(Core.AdminUserRef,
                     SecurityRoles
                     .Where(s => s.Value.RoleTemplateId == SYSTEMADMIN_ROLE_TEMPLATE)
                     .Select(s => s.Value.RoleId)
                     .ToArray());
 }
Ejemplo n.º 4
0
        internal Security(Core core, MetadataSkeleton metadata, List <SecurityRole> SecurityRoles, IXrmDb db)
        {
            this.Core          = core;
            this.Metadata      = metadata;
            this.db            = db;
            this.SecurityRoles = SecurityRoles.ToDictionary(s => s.RoleId, s => s);
            this.addedRoles    = new List <Guid>();

            Initialize();
        }
Ejemplo n.º 5
0
        internal static DbRow FromEntity(Entity xrmEntity, IXrmDb db, bool withReferenceChecks = true)
        {
            IEnumerable <KeyValuePair <string, object> > columns = xrmEntity.Attributes;

            if (withReferenceChecks == true)   // Convert EntityReferences to actual references if db is given
            {
                columns = columns.Select(a => ConvertToDbKeyValue(a, db));
            }

            return(new DbRow(db[xrmEntity.LogicalName], xrmEntity.Id, columns));
        }
Ejemplo n.º 6
0
 internal void ResetEnvironment(IXrmDb db)
 {
     Initialize();
     //remove any roles added on the fly
     foreach (var role in addedRoles)
     {
         SecurityRoles.Remove(role);
     }
     addedRoles = new List <Guid>();
     this.db    = db;
     InitializeSecurityRoles(db);
 }
Ejemplo n.º 7
0
        internal static void SetOwner(IXrmDb db, Security dataMethods, MetadataSkeleton metadata, Entity entity, EntityReference owner)
        {
            var ownershipType = metadata.EntityMetadata.GetMetadata(entity.LogicalName).OwnershipType;

            if (!ownershipType.HasValue)
            {
                throw new MockupException($"No ownership type set for '{entity.LogicalName}'");
            }

            if (ownershipType.Value.HasFlag(OwnershipTypes.UserOwned) || ownershipType.Value.HasFlag(OwnershipTypes.TeamOwned))
            {
                if (db.GetEntityOrNull(owner) == null)
                {
                    throw new FaultException($"Owner referenced with id '{owner.Id}' does not exist");
                }

                var prevOwner = entity.Attributes.ContainsKey("ownerid") ? entity["ownerid"] : null;
                entity["ownerid"] = owner;

                if (!dataMethods.HasPermission(entity, AccessRights.ReadAccess, owner))
                {
                    entity["ownerid"] = prevOwner;
                    throw new FaultException($"Trying to assign '{entity.LogicalName}' with id '{entity.Id}'" +
                                             $" to '{owner.LogicalName}' with id '{owner.Id}', but owner does not have read access for that entity");
                }

                entity["owningbusinessunit"] = null;
                entity["owninguser"]         = null;
                entity["owningteam"]         = null;


                if (entity.LogicalName != LogicalNames.SystemUser && entity.LogicalName != LogicalNames.Team)
                {
                    if (owner.LogicalName == LogicalNames.SystemUser && ownershipType.Value.HasFlag(OwnershipTypes.UserOwned))
                    {
                        entity["owninguser"] = owner;
                    }
                    else if (owner.LogicalName == "team")
                    {
                        entity["owningteam"] = owner;
                    }
                    else
                    {
                        throw new MockupException($"Trying to give owner to {owner.LogicalName} but ownershiptype is {ownershipType.ToString()}");
                    }
                    entity["owningbusinessunit"] = GetBusinessUnit(db, owner);
                }
            }
        }
Ejemplo n.º 8
0
        internal void RestoreToSnapshot(string snapshotName)
        {
            if (!snapshots.ContainsKey(snapshotName))
            {
                throw new KeyNotFoundException("A Snapshot with that name does not exist");
            }
            var snapshot = snapshots[snapshotName];

            this.db                  = snapshot.db.Clone();
            this.security            = snapshot.security.Clone();
            this.AdminUserRef        = snapshot.AdminUserRef;
            this.RootBusinessUnitRef = snapshot.RootBusinessUnitRef;
            this.TimeOffset          = snapshot.TimeOffset;
            this.OrganizationId      = snapshot.OrganizationId;
            this.RequestHandlers     = GetRequestHandlers(this.db);
        }
Ejemplo n.º 9
0
        internal void ResetEnvironment()
        {
            this.TimeOffset = new TimeSpan();
            if (settings.IncludeAllWorkflows == false)
            {
                workflowManager.ResetWorkflows();
            }
            pluginManager.ResetPlugins();

            ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("xrmmockup.redis.cache.windows.net:6380,password=TqJAAIXDJn0Mna8dtHgrO94d2DSSlNYvxo5LJ6jMi5w=,ssl=True,abortConnect=False");
            var redisDB = redis.GetDatabase();

            redisDB.StringSet("test", "hello");
            redisDB.HashSet("cams_year", new HashEntry[] { new HashEntry("id", this.db.GetEntities("cams_year").First().Id.ToString()) });
            var sw = new Stopwatch();

            sw.Start();
            var years = db.GetEntities("cams_year");

            foreach (var year in years)
            {
                var entries = new List <HashEntry>();
                foreach (var attr in year.Attributes.Where(x => x.Value != null))
                {
                    if (attr.Value is EntityReference)
                    {
                        entries.Add(new HashEntry(attr.Key, $"{(attr.Value as EntityReference).LogicalName.ToString()}:{(attr.Value as EntityReference).Id.ToString()}"));
                    }
                    else if (attr.Value is OptionSetValue)
                    {
                        entries.Add(new HashEntry(attr.Key, (attr.Value as OptionSetValue).Value.ToString()));
                    }
                    else
                    {
                        entries.Add(new HashEntry(attr.Key, attr.Value.ToString()));
                    }
                }
                redisDB.HashSet($"cams_year:{year.Id.ToString()}", entries.ToArray());
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds.ToString());
            this.db = new XrmDb(metadata.EntityMetadata, GetOnlineProxy());

            this.RequestHandlers = GetRequestHandlers(db);
            InitializeDB();
            security.ResetEnvironment(db);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Creates a new instance of Core
        /// </summary>
        /// <param name="Settings"></param>
        /// <param name="metadata"></param>
        /// <param name="SecurityRoles"></param>
        /// <param name="Workflows"></param>
        public Core(XrmMockupSettings Settings, MetadataSkeleton metadata, List <Entity> Workflows, List <SecurityRole> SecurityRoles)
        {
            this.TimeOffset       = new TimeSpan();
            this.settings         = Settings;
            this.metadata         = metadata;
            baseCurrency          = metadata.BaseOrganization.GetAttributeValue <EntityReference>("basecurrencyid");
            baseCurrencyPrecision = metadata.BaseOrganization.GetAttributeValue <int>("pricingdecimalprecision");

            this.db             = new XrmDb(metadata.EntityMetadata, GetOnlineProxy());
            this.snapshots      = new Dictionary <string, Snapshot>();
            this.security       = new Security(this, metadata, SecurityRoles, this.db);
            this.ServiceFactory = new MockupServiceProviderAndFactory(this);

            //add the additional plugin settings to the meta data
            if (settings.IPluginMetadata != null)
            {
                metadata.Plugins.AddRange(Settings.IPluginMetadata);
            }

            this.pluginManager   = new PluginManager(Settings.BasePluginTypes, metadata.EntityMetadata, metadata.Plugins);
            this.workflowManager = new WorkflowManager(Settings.CodeActivityInstanceTypes, Settings.IncludeAllWorkflows, Workflows, metadata.EntityMetadata);

            this.systemAttributeNames = new List <string>()
            {
                "createdon", "createdby", "modifiedon", "modifiedby"
            };

            this.RequestHandlers = GetRequestHandlers(db);
            InitializeDB();
            this.security.InitializeSecurityRoles(db);

            //persist the access team templates as they livein the db as records.
            if (metadata.AccessTeamTemplates != null)
            {
                foreach (var att in metadata.AccessTeamTemplates)
                {
                    if (!db.HasRow(att.ToEntityReference()))
                    {
                        var create = new CreateRequest();
                        create.Target = att;
                        this.Execute(create, AdminUserRef);
                    }
                }
            }
        }
Ejemplo n.º 11
0
        internal static EntityReference GetBusinessUnit(IXrmDb db, EntityReference owner)
        {
            var user = db.GetEntityOrNull(owner);

            if (user == null)
            {
                return(null);
            }
            var buRef = user.GetAttributeValue <EntityReference>("businessunitid");
            var bu    = db.GetEntityOrNull(buRef);

            if (bu == null)
            {
                return(null);
            }
            buRef.Name = bu.GetAttributeValue <string>("name");
            return(buRef);
        }
Ejemplo n.º 12
0
        internal void AddRoleTemplatesForBusinessUnit(IXrmDb db, EntityReference businessUnit)
        {
            var allRoleTemplates = db.GetEntities("roletemplate");

            foreach (var sr in SecurityRoles.Values.Where(x => x.RoleTemplateId != Guid.Empty).GroupBy(x => x.RoleTemplateId).Select(x => x.Key))
            {
                if (!allRoleTemplates.Any(x => x.Id == sr))

                {
                    var roleTemplate = new Entity("roletemplate")
                    {
                        Id = sr
                    };

                    db.Add(roleTemplate);
                }
            }
        }
Ejemplo n.º 13
0
        private List <RequestHandler> GetRequestHandlers(IXrmDb db) => new List <RequestHandler>
        {
            new CreateRequestHandler(this, db, metadata, security),
            new UpdateRequestHandler(this, db, metadata, security),
            new RetrieveMultipleRequestHandler(this, db, metadata, security),
            new RetrieveRequestHandler(this, db, metadata, security),
            new DeleteRequestHandler(this, db, metadata, security),
            new SetStateRequestHandler(this, db, metadata, security),
            new AssignRequestHandler(this, db, metadata, security),
            new AssociateRequestHandler(this, db, metadata, security),
            new DisassociateRequestHandler(this, db, metadata, security),
            new MergeRequestHandler(this, db, metadata, security),
            new RetrieveVersionRequestHandler(this, db, metadata, security),
            new FetchXmlToQueryExpressionRequestHandler(this, db, metadata, security),
            new ExecuteMultipleRequestHandler(this, db, metadata, security),
            new RetrieveEntityRequestHandler(this, db, metadata, security),
            new RetrieveRelationshipRequestHandler(this, db, metadata, security),
            new GrantAccessRequestHandler(this, db, metadata, security),
            new ModifyAccessRequestHandler(this, db, metadata, security),
            new RevokeAccessRequestHandler(this, db, metadata, security),
            new WinOpportunityRequestHandler(this, db, metadata, security),
            new LoseOpportunityRequestHandler(this, db, metadata, security),
            new RetrieveAllOptionSetsRequestHandler(this, db, metadata, security),
            new RetrieveOptionSetRequestHandler(this, db, metadata, security),
            new RetrieveExchangeRateRequestHandler(this, db, metadata, security),
            new RetrieveMetadataChangesRequestHandler(this, db, metadata, security),
            new CloseIncidentRequestHandler(this, db, metadata, security),
            new AddMembersTeamRequestHandler(this, db, metadata, security),
            new RemoveMembersTeamRequestHandler(this, db, metadata, security),
#if !(XRM_MOCKUP_2011)
            new AddUserToRecordTeamRequestHandler(this, db, metadata, security),
            new RemoveUserFromRecordTeamRequestHandler(this, db, metadata, security),
#endif
#if !(XRM_MOCKUP_2011 || XRM_MOCKUP_2013)
            new IsValidStateTransitionRequestHandler(this, db, metadata, security),
            new CalculateRollupFieldRequestHandler(this, db, metadata, security),
#endif
#if !(XRM_MOCKUP_2011 || XRM_MOCKUP_2013 || XRM_MOCKUP_2015)
            new UpsertRequestHandler(this, db, metadata, security),
#endif
            new RetrieveAttributeRequestHandler(this, db, metadata, security),
            new WhoAmIRequestHandler(this, db, metadata, security),
            new RetrievePrincipalAccessRequestHandler(this, db, metadata, security),
        };
Ejemplo n.º 14
0
        internal void AddRoleToDb(IXrmDb db, SecurityRole newRole, EntityReference businessUnit)
        {
            var roleMeta = Metadata.EntityMetadata.GetMetadata("role");
            var role     = new Entity("role")
            {
                Id = newRole.RoleId
            };

            role[roleMeta.PrimaryIdAttribute] = role.Id;
            role["businessunitid"]            = businessUnit;
            role["name"]           = newRole.Name;
            role["roletemplateid"] = newRole.RoleTemplateId;
            role["createdby"]      = Core.AdminUserRef;
            role["createdon"]      = DateTime.UtcNow.Add(Core.TimeOffset);
            role["modifiedby"]     = Core.AdminUserRef;
            role["modifiedon"]     = DateTime.UtcNow.Add(Core.TimeOffset);
            db.Add(role);
            SecurityRoleMapping.Add(role.Id, newRole.RoleId);
        }
Ejemplo n.º 15
0
        private static void HandleBaseCurrencies(MetadataSkeleton metadata, IXrmDb db, Entity entity)
        {
            if (entity.LogicalName == LogicalNames.TransactionCurrency)
            {
                return;
            }
            var transAttr = "transactioncurrencyid";

            if (!entity.Attributes.ContainsKey(transAttr))
            {
                return;
            }
            var currency           = db.GetEntity(LogicalNames.TransactionCurrency, entity.GetAttributeValue <EntityReference>(transAttr).Id);
            var attributesMetadata = metadata.EntityMetadata.GetMetadata(entity.LogicalName).Attributes.Where(a => a is MoneyAttributeMetadata);

            if (!currency.GetAttributeValue <decimal?>("exchangerate").HasValue)
            {
                throw new FaultException($"No exchangerate specified for transactioncurrency '{entity.GetAttributeValue<EntityReference>(transAttr)}'");
            }

            var baseCurrency = GetBaseCurrency(metadata);

            foreach (var attr in entity.Attributes.ToList())
            {
                if (attributesMetadata.Any(a => a.LogicalName == attr.Key) && !attr.Key.EndsWith("_base"))
                {
                    if (entity.GetAttributeValue <EntityReference>(transAttr) == baseCurrency)
                    {
                        entity[attr.Key + "_base"] = attr.Value;
                    }
                    else
                    {
                        if (attr.Value is Money money)
                        {
                            var value = money.Value / currency.GetAttributeValue <decimal?>("exchangerate").Value;
                            entity[attr.Key + "_base"] = new Money(value);
                        }
                    }
                }
            }
        }
Ejemplo n.º 16
0
        internal static void PopulateEntityReferenceNames(Entity entity, IXrmDb db, EntityMetadata metaData, Dictionary <string, IEnumerable <Entity> > lookups = null)
        {
            foreach (var attr in entity.Attributes)
            {
                if (attr.Value is EntityReference eRef)
                {
                    Entity row;
                    if (lookups == null)
                    {
                        row = db.GetEntity(eRef);
                    }
                    else
                    {
                        row = lookups[eRef.LogicalName].SingleOrDefault(x => x.Id == eRef.Id);
                    }

                    if (row != null)
                    {
                        var nameAttr = metaData.PrimaryNameAttribute;
                        eRef.Name = row.GetAttributeValue <string>(nameAttr);
                    }
                }
            }
        }
Ejemplo n.º 17
0
        internal void AddRolesForBusinessUnit(IXrmDb db, EntityReference businessUnit)
        {
            AddRoleTemplatesForBusinessUnit(db, businessUnit);

            var allRoles = db.GetUnformattedEntities("role");

            foreach (var sr in SecurityRoles.Values)
            {
                if (!allRoles.Any(x => x.GetAttributeValue <string>("name") == sr.Name && x.GetAttributeValue <EntityReference>("businessunitid").Id == businessUnit.Id))

                {
                    var roleMeta = Metadata.EntityMetadata.GetMetadata("role");
                    var role     = new Entity("role")
                    {
                        Id = Guid.NewGuid()
                    };
                    role[roleMeta.PrimaryIdAttribute] = role.Id;
                    role["businessunitid"]            = businessUnit;
                    role["name"] = sr.Name;
                    if (sr.RoleTemplateId != Guid.Empty)
                    {
                        role["roletemplateid"] = new EntityReference("roletemplate", sr.RoleTemplateId);
                    }
                    role["createdby"]  = Core.AdminUserRef;
                    role["createdon"]  = DateTime.UtcNow.Add(Core.TimeOffset);
                    role["modifiedby"] = Core.AdminUserRef;
                    role["modifiedon"] = DateTime.UtcNow.Add(Core.TimeOffset);
                    db.Add(role);
                    SecurityRoleMapping.Add(role.Id, sr.RoleId);
                }
                else
                {
                    SecurityRoleMapping.Add(allRoles.Single(x => x.GetAttributeValue <string>("name") == sr.Name && x.GetAttributeValue <EntityReference>("businessunitid").Id == businessUnit.Id).Id, sr.RoleId);
                }
            }
        }
Ejemplo n.º 18
0
 internal DeleteRequestHandler(Core core, IXrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "Delete")
 {
 }
Ejemplo n.º 19
0
 internal static KeyValuePair <string, object> ConvertToDbKeyValue(KeyValuePair <string, object> xrmAttribute, IXrmDb db)
 {
     return(new KeyValuePair <string, object>(xrmAttribute.Key, ConvertToDbValue(xrmAttribute.Value, db)));
 }
 internal AddUserToRecordTeamRequestHandler(Core core, IXrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "AddUserToRecordTeam")
 {
 }
Ejemplo n.º 21
0
 internal AssignRequestHandler(Core core, IXrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "Assign")
 {
 }
 internal RetrievePrincipalAccessRequestHandler(Core core, IXrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "RetrievePrincipalAccess")
 {
 }
Ejemplo n.º 23
0
        private List <Entity> GetAliasedValuesFromLinkentity(LinkEntity linkEntity, Entity parent, Entity toAdd, IXrmDb db)
        {
            var collection = new List <Entity>();

            foreach (var linkedRow in db.GetEntities(linkEntity.LinkToEntityName))
            {
                var linkedEntity = linkedRow;

                if (linkedEntity.Attributes.ContainsKey(linkEntity.LinkToAttributeName) &&
                    parent.Attributes.ContainsKey(linkEntity.LinkFromAttributeName))
                {
                    var linkedAttr = Utility.ConvertToComparableObject(linkedEntity.Attributes[linkEntity.LinkToAttributeName]);
                    var entAttr    = Utility.ConvertToComparableObject(parent.Attributes[linkEntity.LinkFromAttributeName]);

                    if (linkedAttr.Equals(entAttr))
                    {
                        var aliasedEntity = GetEntityWithAliasAttributes(linkEntity.EntityAlias, toAdd, metadata.EntityMetadata.GetMetadata(toAdd.LogicalName), linkedEntity.Attributes);

                        if (linkEntity.LinkEntities.Count > 0)
                        {
                            var subEntities = new List <Entity>();

                            foreach (var nestedLinkEntity in linkEntity.LinkEntities)
                            {
                                nestedLinkEntity.LinkFromEntityName = linkEntity.LinkToEntityName;

                                var alliasedLinkValues = GetAliasedValuesFromLinkentity(nestedLinkEntity, linkedEntity, aliasedEntity, db);
                                subEntities.AddRange(alliasedLinkValues.Where(e => Utility.MatchesCriteria(e, linkEntity.LinkCriteria)));
                            }

                            collection.AddRange(subEntities);
                        }
                        else if (Utility.MatchesCriteria(aliasedEntity, linkEntity.LinkCriteria))
                        {
                            collection.Add(aliasedEntity);
                        }
                    }
                }
            }
            if (linkEntity.JoinOperator == JoinOperator.LeftOuter && collection.Count == 0)
            {
                collection.Add(toAdd);
            }
            return(collection);
        }
Ejemplo n.º 24
0
 internal RetrieveRelationshipRequestHandler(Core core, IXrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "RetrieveRelationship")
 {
 }
Ejemplo n.º 25
0
 internal RemoveUserFromRecordTeamRequestHandler(Core core, IXrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "RemoveUserFromRecordTeam")
 {
 }
Ejemplo n.º 26
0
 internal UpsertRequestHandler(Core core, IXrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "Upsert")
 {
 }
Ejemplo n.º 27
0
 internal WhoAmIRequestHandler(Core core, IXrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "WhoAmI")
 {
 }
Ejemplo n.º 28
0
 internal static DbRow MakeDBRowRef(EntityReference reference, IXrmDb db)
 {
     return(new DbRow(db[reference.LogicalName], reference.Id, new List <KeyValuePair <string, object> >()));
 }
 internal GrantAccessRequestHandler(Core core, IXrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "GrantAccess")
 {
 }
 internal LoseOpportunityRequestHandler(Core core, IXrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "LoseOpportunity")
 {
 }