示例#1
0
        private int ImportFlowTemplates([NotNull] ThreatModel source, [NotNull] IThreatModel target)
        {
            int result     = 0;
            var connectors = source.FlowTypes?
                             .Where(x => !x.IsGeneric)
                             .ToArray();

            if (connectors?.Any() ?? false)
            {
                var schemaManager = new ObjectPropertySchemaManager(target);
                var baseSchema    = new BaseFlowPropertySchemaManager(target).GetSchema();

                foreach (var connector in connectors)
                {
                    var template = target.AddFlowTemplate(connector.Name, connector.Description);
                    if (template != null)
                    {
                        result++;

                        InitializeBaseSchema(template, baseSchema);
                        schemaManager.SetObjectId(template, connector.TypeId);
                        var properties = connector.Properties?.ToArray();

                        AddProperties(target, connector.Name, Scope.DataFlow, baseSchema, template, properties);
                    }
                }
            }

            return(result);
        }
示例#2
0
        private ITrustBoundaryTemplate GetTrustBoundaryTemplate(string id)
        {
            var schemaManager = new ObjectPropertySchemaManager(_target);

            return(_target.TrustBoundaryTemplates?.FirstOrDefault(x =>
                                                                  string.CompareOrdinal(id, schemaManager.GetObjectId(x)) == 0));
        }
示例#3
0
        private int ImportDataFlows([NotNull] ThreatModel source, [NotNull] IThreatModel target)
        {
            int result = 0;

            var flows = source.Flows?.ToArray();

            if (flows?.Any() ?? false)
            {
                var schemaManager = new ObjectPropertySchemaManager(target);
                var baseSchema    = new BaseFlowPropertySchemaManager(target).GetSchema();

                foreach (var flow in flows)
                {
                    var sourceEntity = GetEntity(flow.SourceGuid.ToString(), target, schemaManager);
                    var targetEntity = GetEntity(flow.TargetGuid.ToString(), target, schemaManager);
                    if (sourceEntity != null && targetEntity != null)
                    {
                        var flowTemplate = target.FlowTemplates?.FirstOrDefault(x =>
                                                                                string.CompareOrdinal(schemaManager.GetObjectId(x), flow.TypeId) == 0);
                        var secondarySchema = flowTemplate != null?
                                              target.GetSchema(flowTemplate.Name, Resources.DefaultNamespace) : null;

                        var dataFlow = flowTemplate != null?flowTemplate.CreateFlow(flow.Name, sourceEntity.Id, targetEntity.Id) :
                                           target.AddDataFlow(flow.Name, sourceEntity.Id, targetEntity.Id);

                        if (dataFlow != null)
                        {
                            schemaManager.SetObjectId(dataFlow, flow.TypeId);
                            schemaManager.SetInstanceId(dataFlow, flow.FlowId.ToString());

                            var properties = flow.Properties?.ToArray();
                            AddProperties(target, baseSchema, secondarySchema, dataFlow, properties);
                        }

                        IDiagram diagram = target.Diagrams?.FirstOrDefault(x =>
                                                                           string.CompareOrdinal(x.Name, flow.PageName) == 0);
                        diagram?.AddLink(dataFlow);
                        result++;
                    }
                }
            }

            return(result);
        }
示例#4
0
        private IDataFlow GetDataFlow([Required] string msDataFlowId, [NotNull] IThreatModel model,
                                      [NotNull] ObjectPropertySchemaManager schemaManager)
        {
            IDataFlow result = null;

            var dataFlows = model.DataFlows?.ToArray();

            if (dataFlows != null)
            {
                foreach (var dataFlow in dataFlows)
                {
                    var id = schemaManager.GetInstanceId(dataFlow);
                    if (string.CompareOrdinal(id, msDataFlowId) == 0)
                    {
                        result = dataFlow;
                        break;
                    }
                }
            }

            return(result);
        }
示例#5
0
        private IEntity GetEntity([Required] string msEntityId, [NotNull] IThreatModel model,
                                  [NotNull] ObjectPropertySchemaManager schemaManager)
        {
            IEntity result = null;

            var entities = model.Entities?.ToArray();

            if (entities != null)
            {
                foreach (var entity in entities)
                {
                    var id = schemaManager.GetInstanceId(entity);
                    if (string.CompareOrdinal(id, msEntityId) == 0)
                    {
                        result = entity;
                        break;
                    }
                }
            }

            return(result);
        }
示例#6
0
        private void ImportThreats([NotNull] ThreatModel source, [NotNull] IThreatModel target,
                                   Func <IThreatModel, Threat, IThreatType, IPropertySchema, bool> unassignedThreatHandler,
                                   out int threatTypes, out int customThreatTypes, out int threats, out int missingThreats)
        {
            threatTypes       = 0;
            customThreatTypes = 0;
            threats           = 0;
            missingThreats    = 0;

            var threatsPerType = source.ThreatsPerType;

            if (threatsPerType?.Any() ?? false)
            {
                var schema = new ThreatsPropertySchemaManager(target).GetSchema();
                InitializeThreatsPropertySchema(schema, source.Properties);
                var schemaManager = new ObjectPropertySchemaManager(target);

                var defaultSeverity = target.GetMappedSeverity(0);

                foreach (var threatPerType in threatsPerType)
                {
                    var         tt         = source.GetThreatType(threatPerType.Key);
                    IThreatType threatType = null;
                    if (!string.IsNullOrWhiteSpace(tt.Name))
                    {
                        ISeverity severity;
                        if (Enum.TryParse <DefaultSeverity>(tt.Priority, out var severityId))
                        {
                            severity = target.GetMappedSeverity((int)severityId);
                        }
                        else
                        {
                            severity = target.GetMappedSeverity((int)DefaultSeverity.High);
                        }

                        threatType = target.AddThreatType(tt.Name, severity);
                        if (threatType != null)
                        {
                            threatType.Description = tt.Description;
                            var threatTypeProperties = tt.Properties?.ToArray();
                            if (threatTypeProperties?.Any() ?? false)
                            {
                                foreach (var property in threatTypeProperties)
                                {
                                    switch (property.Name)
                                    {
                                    case "Title":
                                        break;

                                    case "UserThreatDescription":
                                        break;

                                    case "Priority":
                                        break;

                                    default:
                                        var propertyType = schema.GetPropertyType(property.Label);
                                        if (propertyType != null)
                                        {
                                            threatType.AddProperty(propertyType, property.Values.FirstOrDefault());
                                        }

                                        break;
                                    }
                                }
                            }

                            threatTypes++;
                        }
                        else
                        {
                            threatType = target.ThreatTypes?
                                         .FirstOrDefault(x => string.CompareOrdinal(x.Name, tt.Name) == 0);
                        }
                    }
                    else
                    {
                        var internalThreats = threatPerType.Value;
                        if (internalThreats.Any())
                        {
                            foreach (var internalThreat in internalThreats)
                            {
                                threatType = target.AddThreatType(internalThreat.ToString(), defaultSeverity);
                                if (threatType != null)
                                {
                                    threatType.Description = internalThreat.GetValueFromLabel("Description");
                                    customThreatTypes++;
                                }
                                else
                                {
                                    threatType = target.ThreatTypes?.FirstOrDefault(x =>
                                                                                    string.CompareOrdinal(x.Name, internalThreat.ToString()) == 0);
                                }

                                break;
                            }
                        }
                    }

                    if (threatType != null)
                    {
                        CreateGenerationRule(source, tt, threatType);

                        foreach (var threat in threatPerType.Value)
                        {
                            var flow = GetDataFlow(threat.FlowGuid.ToString(), target, schemaManager);
                            if (flow != null)
                            {
                                var threatEvent = flow.AddThreatEvent(threatType);

                                if (threatEvent != null)
                                {
                                    AddProperties(threatEvent, threat, schema);
                                    threats++;
                                }
                                else
                                {
                                    missingThreats++;
                                }
                            }
                            else
                            {
                                if (unassignedThreatHandler != null)
                                {
                                    if (unassignedThreatHandler(target, threat, threatType, schema))
                                    {
                                        threats++;
                                    }
                                    else
                                    {
                                        missingThreats++;
                                    }
                                }
                                else
                                {
                                    var threatEvent = target.AddThreatEvent(threatType);

                                    if (threatEvent != null)
                                    {
                                        AddProperties(threatEvent, threat, schema);
                                        threats++;
                                    }
                                    else
                                    {
                                        missingThreats++;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
示例#7
0
        private void ImportElements([NotNull] ThreatModel source, [NotNull] IThreatModel target, float dpiFactor,
                                    out int diagrams, out int externalInteractors, out int processes, out int dataStores, out int trustBoundaries)
        {
            diagrams            = 0;
            externalInteractors = 0;
            processes           = 0;
            dataStores          = 0;
            trustBoundaries     = 0;

            var elements = source.Elements?
                           .OrderBy(x => (int)x.Value.ElementType)
                           .ToArray();

            if (elements?.Any() ?? false)
            {
                var schemaManager = new ObjectPropertySchemaManager(target);

                IEntity                entity;
                ITrustBoundary         boundary;
                IEntityTemplate        entityTemplate;
                ITrustBoundaryTemplate trustBoundaryTemplate;
                IPropertySchema        schema;
                IPropertySchema        secondarySchema;
                var baseEISchema = new BaseExternalInteractorPropertySchemaManager(target).GetSchema();
                var basePSchema  = new BaseProcessPropertySchemaManager(target).GetSchema();
                var baseDSSchema = new BaseDataStorePropertySchemaManager(target).GetSchema();
                var baseTBSchema = new BaseTrustBoundaryPropertySchemaManager(target).GetSchema();

                foreach (var element in elements)
                {
                    switch (element.Value.ElementType)
                    {
                    case ElementType.StencilRectangle:
                        entityTemplate = target.EntityTemplates?.FirstOrDefault(x =>
                                                                                string.CompareOrdinal(schemaManager.GetObjectId(x), element.Value.TypeId) == 0);
                        entity = entityTemplate != null?entityTemplate.CreateEntity(element.Value.Name) :
                                     target.AddEntity <IExternalInteractor>(element.Value.Name);

                        boundary        = null;
                        schema          = baseEISchema;
                        secondarySchema = entityTemplate != null?
                                          target.GetSchema(entityTemplate.Name, Resources.DefaultNamespace) : null;

                        externalInteractors++;
                        break;

                    case ElementType.StencilEllipse:
                        entityTemplate = target.EntityTemplates?.FirstOrDefault(x =>
                                                                                string.CompareOrdinal(schemaManager.GetObjectId(x), element.Value.TypeId) == 0);
                        entity = entityTemplate != null?entityTemplate.CreateEntity(element.Value.Name) :
                                     target.AddEntity <IProcess>(element.Value.Name);

                        boundary        = null;
                        schema          = basePSchema;
                        secondarySchema = entityTemplate != null?
                                          target.GetSchema(entityTemplate.Name, Resources.DefaultNamespace) : null;

                        processes++;
                        break;

                    case ElementType.StencilParallelLines:
                        entityTemplate = target.EntityTemplates?.FirstOrDefault(x =>
                                                                                string.CompareOrdinal(schemaManager.GetObjectId(x), element.Value.TypeId) == 0);
                        entity = entityTemplate != null?entityTemplate.CreateEntity(element.Value.Name) :
                                     target.AddEntity <IDataStore>(element.Value.Name);

                        boundary        = null;
                        schema          = baseDSSchema;
                        secondarySchema = entityTemplate != null?
                                          target.GetSchema(entityTemplate.Name, Resources.DefaultNamespace) : null;

                        dataStores++;
                        break;

                    case ElementType.BorderBoundary:
                    case ElementType.LineBoundary:
                        trustBoundaryTemplate = target.TrustBoundaryTemplates?.FirstOrDefault(x =>
                                                                                              string.CompareOrdinal(schemaManager.GetObjectId(x), element.Value.TypeId) == 0);
                        entity   = null;
                        boundary = trustBoundaryTemplate != null?trustBoundaryTemplate.CreateTrustBoundary(element.Value.Name) :
                                       target.AddGroup <ITrustBoundary>(element.Value.Name);

                        schema          = baseTBSchema;
                        secondarySchema = trustBoundaryTemplate != null?
                                          target.GetSchema(trustBoundaryTemplate.Name, Resources.DefaultNamespace) : null;

                        trustBoundaries++;
                        break;

                    default:
                        entity          = null;
                        boundary        = null;
                        schema          = null;
                        secondarySchema = null;
                        break;
                    }

                    if (entity != null)
                    {
                        schemaManager.SetObjectId(entity, element.Value.TypeId);
                        schemaManager.SetInstanceId(entity, element.Key.ToString());
                        var properties = element.Value.Properties?.ToArray();
                        AddProperties(target, schema, secondarySchema, entity, properties);

                        var diagram = target.Diagrams?.FirstOrDefault(x =>
                                                                      string.CompareOrdinal(x.Name, element.Value.Page) == 0);
                        if (diagram == null)
                        {
                            diagram = target.AddDiagram(element.Value.Page);
                            diagrams++;
                        }

                        diagram.AddEntityShape(entity.Id,
                                               new PointF((element.Value.Position.X + element.Value.Size.Width / 2f) * dpiFactor, (element.Value.Position.Y + element.Value.Size.Height / 2f) * dpiFactor));
                    }
                    else if (boundary != null)
                    {
                        schemaManager.SetObjectId(boundary, element.Value.TypeId);
                        schemaManager.SetInstanceId(boundary, element.Key.ToString());
                        var properties = element.Value.Properties?.ToArray();
                        AddProperties(target, schema, secondarySchema, entity, properties);

                        if (element.Value.ElementType == ElementType.BorderBoundary)
                        {
                            var diagram = target.Diagrams?.FirstOrDefault(x =>
                                                                          string.CompareOrdinal(x.Name, element.Value.Page) == 0);
                            if (diagram == null)
                            {
                                diagram = target.AddDiagram(element.Value.Page);
                                diagrams++;
                            }

                            diagram.AddGroupShape(boundary.Id,
                                                  new PointF((element.Value.Position.X + element.Value.Size.Width / 2f) * dpiFactor, (element.Value.Position.Y + element.Value.Size.Height / 2f) * dpiFactor),
                                                  new SizeF(element.Value.Size.Width * dpiFactor, element.Value.Size.Height * dpiFactor));
                        }
                    }
                }
            }
        }
示例#8
0
        private int ImportEntityTemplates([NotNull] ThreatModel source, [NotNull] IThreatModel target)
        {
            int result   = 0;
            var elements = source.ElementTypes?
                           .Where(x => !x.IsGeneric)
                           .ToArray();

            if (elements?.Any() ?? false)
            {
                var schemaManager = new ObjectPropertySchemaManager(target);

                IEntityTemplate        entityTemplate;
                ITrustBoundaryTemplate trustBoundaryTemplate;
                Interfaces.Scope       scope;
                IPropertySchema        baseSchema;
                var baseEISchema = new BaseExternalInteractorPropertySchemaManager(target).GetSchema();
                var basePSchema  = new BaseProcessPropertySchemaManager(target).GetSchema();
                var baseDSSchema = new BaseDataStorePropertySchemaManager(target).GetSchema();
                var baseTBSchema = new BaseTrustBoundaryPropertySchemaManager(target).GetSchema();

                foreach (var element in elements)
                {
                    switch (element.ElementType)
                    {
                    case ElementType.StencilRectangle:
                        entityTemplate = target.AddEntityTemplate(element.Name, element.Description,
                                                                  element.Image, element.Image, element.Image,
                                                                  EntityType.ExternalInteractor);
                        trustBoundaryTemplate = null;
                        scope      = Scope.ExternalInteractor;
                        baseSchema = baseEISchema;
                        result++;
                        break;

                    case ElementType.StencilEllipse:
                        entityTemplate = target.AddEntityTemplate(element.Name, element.Description,
                                                                  element.Image, element.Image, element.Image,
                                                                  EntityType.Process);
                        trustBoundaryTemplate = null;
                        scope      = Scope.Process;
                        baseSchema = basePSchema;
                        result++;
                        break;

                    case ElementType.StencilParallelLines:
                        entityTemplate = target.AddEntityTemplate(element.Name, element.Description,
                                                                  element.Image, element.Image, element.Image,
                                                                  EntityType.DataStore);
                        trustBoundaryTemplate = null;
                        scope      = Scope.DataStore;
                        baseSchema = baseDSSchema;
                        result++;
                        break;

                    case ElementType.LineBoundary:
                    case ElementType.BorderBoundary:
                        entityTemplate        = null;
                        trustBoundaryTemplate = target.AddTrustBoundaryTemplate(element.Name, element.Description);
                        scope      = Scope.TrustBoundary;
                        baseSchema = baseTBSchema;
                        result++;
                        break;

                    default:
                        entityTemplate        = null;
                        trustBoundaryTemplate = null;
                        scope      = Scope.Undefined;
                        baseSchema = null;
                        break;
                    }

                    if (entityTemplate != null)
                    {
                        InitializeBaseSchema(entityTemplate, baseSchema);
                        schemaManager.SetObjectId(entityTemplate, element.TypeId);
                        var properties = element.Properties?.ToArray();

                        AddProperties(target, element.Name, scope, baseSchema, entityTemplate, properties);
                    }
                    else if (trustBoundaryTemplate != null)
                    {
                        InitializeBaseSchema(trustBoundaryTemplate, baseSchema);
                        schemaManager.SetObjectId(trustBoundaryTemplate, element.TypeId);
                        var properties = element.Properties?.ToArray();

                        AddProperties(target, element.Name, scope, baseSchema, trustBoundaryTemplate, properties);
                    }
                }
            }

            return(result);
        }