diff --git a/ERFormatConstants.py b/ERFormatConstants.py new file mode 100644 index 0000000000000000000000000000000000000000..697f7b063cfc48b1b56593e6169d529e6c37c65c --- /dev/null +++ b/ERFormatConstants.py @@ -0,0 +1,39 @@ +#File contains constants from the CSV export format of the entity relationship tool + +#Generic fields for all entities +componentID = "Id" # LucidChart ID +Id = "Id" # The id of the entity +Description = "Description" # The description of the entity + + +textArea1 = "Text Area 1" +textArea2 = "Text Area 2" +textArea3 = "Text Area 3" +textArea4 = "Text Area 4" +textArea5 = "Text Area 5" +textArea6 = "Text Area 6" +textArea7 = "Text Area 7" +textArea8 = "Text Area 8" +textArea9 = "Text Area 9" +textArea10 = "Text Area 10" +textArea11 = "Text Area 11" +textArea12 = "Text Area 12" +textArea13 = "Text Area 13" +textArea14 = "Text Area 14" +textArea15 = "Text Area 15" +textArea16 = "Text Area 16" + +#Threats +Threat = "Threat" # The threat -> Text area 1 +ThreatSource = "Threat source" # The threat source -> Text area 4 +Likelihood = "Likelihood" # The likelihood of the threat -> Text area 6 +Vulnerability = "Vulnerability" # The vulnerability -> Text area 7 + +#Attack +Type = "Type" # The type of the consequence -> Text area 2 +Component = "Component" # The component related to the attack -> Text area 4 + +#Consequence +Consequence = "Consequence" # The consequence score of the area -> Text area 6 +AffectedComponents = "Affected components" # The affected components -> Text area 7 + diff --git a/components.py b/components.py index 251757140932fbce8b98044e34acd44510ce4eb7..8338d536a038f66bea5d3dfa4b30b4b58e948568 100644 --- a/components.py +++ b/components.py @@ -1,17 +1,92 @@ class Threat: - def __init__(self, id, description, threatSource, likelihood, vulnerability) -> None: - self.id = id - self.description = description - self.threatSource = threatSource - self.likelihood = likelihood - self.vulnerability = vulnerability + """_summary_ + The class threat is used to classify a threat in the ER model. + Fields are parsed from the exported CSV file + Threats have associated consequences, dynamic metrics and a related attack + """ + def __init__(self, id, componentID, threatSource, description, likelihood, vulnerability) -> None: + + self.id = id # The id field in the ER model + self.componentID = componentID # The component ID field provided by LucidChart + + self.description = description # The description of the component + + self.threatSource = threatSource # The threat source, source of the threat ... + self.likelihood = likelihood # The likelihood of the threat to occur + self.vulnerability = vulnerability # The vulnerability associated with the threat + + self.linkedDynamics = [] # List of linked dynamics components + self.linkedConsequences = [] # List of linked consequences def __str__(self) -> str: return f"Threat: {self.id}, {self.description}, {self.threatSource}, {self.likelihood}, {self.vulnerability}" #Function link dynamics will link a threat to a dynamics component when parsing the XML file - def linkDynamics(): + def linkDynamic(): + # Function should link the threat to a dynamics component + pass + + def linkConsequence(): + # Function should link the threat to a consequence + pass + +class Consequence: + """_summary_ + The class consequence should contain information about a consequence + Consequences are linked to threats and attacks and also contain their own dynamic metrics + """ + + def __init__(self, id, componentID, description, consequence, affectedComponents) -> None: + self.id = id # The id field in the ER model + self.componentID = componentID # The component ID field provided by LucidChart + + self.description = description # The description of the component + self.consequence = consequence # The consequence of the component + self.affectedComponents = affectedComponents # List of affected components + + def __str__(self) -> str: + return f"Consequence: {self.id}, {self.description}, {self.consequence}, {self.affectedComponents}" + + #Function link dynamics will link a threat to a dynamics component when parsing the XML file + def linkDynamic(): # Function should link the threat to a dynamics component pass + + def linkThreat(): + # Function should link the consequence to a threat + pass + +class Attack: + """_summary_ + The class attack should contain information about an attack at the center of the bow tie model + Attacks are linked to consequences and threats and contain their own dynamic metrics + """ + + def __init__(self, id, componentID, type, component, description) -> None: + self.id = id # The id field in the ER model + self.componentID = componentID # The component ID field provided by LucidChart + + self.type = type # The type of the attack + self.component = component # The component related to the attack (linked by ID) + self.description = description # The description of the component -class \ No newline at end of file + self.associatedThreats = [] # List of associated threats linked by componentID + self.associatedConsequences = [] # List of associated consequences linked by componentID + self.linkedDynamics = [] # List of linked dynamics components + + + def __str__(self) -> str: + return f"Attack: {self.id}, {self.description}, {self.attackType}" + + #Function link dynamics will link a threat to a dynamics component when parsing the XML file + def linkDynamic(): + # Function should link the threat to a dynamics component + pass + + def linkConsequence(): + # Function should link the consequence to a threat + pass + + def linkThreats(): + # Function should link the attack to a threat + pass \ No newline at end of file diff --git a/diagramParser.py b/diagramParser.py index 31c6b4b5a565646b1720cf03854e4be45e7157c9..3610a72310072415031b68e780cc453b7e7e6071 100644 --- a/diagramParser.py +++ b/diagramParser.py @@ -1,4 +1,5 @@ import pandas as pd +import ERFormatConstants as const # Function will parse a csv file and extract the necessary information, this is step 1 of the parse def parseDiagramFile(csvFile): @@ -22,7 +23,8 @@ def parseDiagramFile(csvFile): def parseThreats(df): for i in range(len(df)): - if df["Shape Type"][i] == "Threat": + if df[const.textArea1][i] == const.Threat: + threats.append(df["Name"][i]) print(threats) diff --git a/SchemaCSVtoComponent.txt b/documentation/SchemaCSVtoComponent.txt similarity index 92% rename from SchemaCSVtoComponent.txt rename to documentation/SchemaCSVtoComponent.txt index ec9f603c0817496b72a88f52102bdb0d409433cf..43c52864eb4dad4c1903ff7fdc48728a96a127f1 100644 --- a/SchemaCSVtoComponent.txt +++ b/documentation/SchemaCSVtoComponent.txt @@ -81,8 +81,3 @@ Necessary info from each component: Text area 5 -> Metric description ... - - - ID -> Necesary for links and identification - Text area 1 -> Main description of the component Basically ID - Text area 2 -> Secondary description of the component diff --git a/requirements.txt b/documentation/requirements.txt similarity index 100% rename from requirements.txt rename to documentation/requirements.txt