Skip to content

Commit e1c8882

Browse files
committed
Added import dependencies from conf to code
1 parent 77d5da2 commit e1c8882

File tree

5 files changed

+51
-36
lines changed

5 files changed

+51
-36
lines changed

cpg-concepts/src/integrationTest/kotlin/de/fraunhofer/aisec/cpg/concepts/ConfigurationPassTest.kt

+5
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,12 @@ import de.fraunhofer.aisec.cpg.graph.concepts.config.ReadConfigurationOption
3939
import de.fraunhofer.aisec.cpg.graph.concepts.config.RegisterConfigurationGroup
4040
import de.fraunhofer.aisec.cpg.graph.concepts.config.RegisterConfigurationOption
4141
import de.fraunhofer.aisec.cpg.graph.statements.expressions.SubscriptExpression
42+
import de.fraunhofer.aisec.cpg.passes.ImportResolver
4243
import de.fraunhofer.aisec.cpg.passes.PassConfiguration
4344
import de.fraunhofer.aisec.cpg.passes.concepts.ConceptPass
4445
import de.fraunhofer.aisec.cpg.passes.concepts.config.ProvideConfigTask
4546
import de.fraunhofer.aisec.cpg.passes.concepts.config.ini.IniFileConfigurationSourceTask
47+
import de.fraunhofer.aisec.cpg.passes.concepts.config.ini.IniFileImportTask
4648
import de.fraunhofer.aisec.cpg.passes.concepts.config.python.PythonStdLibConfigurationTask
4749
import de.fraunhofer.aisec.cpg.test.analyze
4850
import java.io.File
@@ -66,6 +68,9 @@ class ConfigurationPassTest {
6668
.registerTask<PythonStdLibConfigurationTask>()
6769
.registerTask<ProvideConfigTask>()
6870
)
71+
it.configurePass<ImportResolver>(
72+
PassConfiguration().registerTask<IniFileImportTask>()
73+
)
6974
it.softwareComponents(
7075
mutableMapOf(
7176
"conf" to listOf(topLevel.resolve("conf")),

cpg-concepts/src/main/kotlin/de/fraunhofer/aisec/cpg/passes/concepts/config/ProvideConfigTask.kt

+16-19
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import de.fraunhofer.aisec.cpg.passes.concepts.config.python.stringValues
5555
class ProvideConfigTask(target: Component, pass: ConceptPass, ctx: TranslationContext) :
5656
ConceptTask(target, pass, ctx) {
5757
override fun handleNode(node: Node) {
58+
val loadsConfigs = node.overlays.filterIsInstance<LoadConfiguration>()
5859
when (node) {
5960
is TranslationUnitDeclaration -> handleTranslationUnit(node)
6061
}
@@ -63,25 +64,21 @@ class ProvideConfigTask(target: Component, pass: ConceptPass, ctx: TranslationCo
6364
private fun handleTranslationUnit(
6465
tu: TranslationUnitDeclaration
6566
): List<ConfigurationOperation>? {
66-
return tu.translationResult
67-
?.operationNodes
68-
?.filterIsInstance<LoadConfiguration>()
69-
?.flatMap { loadConfig ->
70-
// Loop through all configuration sources
71-
val sources =
72-
tu.translationResult
73-
?.conceptNodes
74-
?.filterIsInstance<ConfigurationSource>()
75-
?.filter { source ->
76-
loadConfig.fileExpression.stringValues?.contains(
77-
source.name.toString()
78-
) == true
79-
}
80-
81-
// And create a ProvideConfiguration node for each source
82-
sources?.flatMap { handleConfiguration(it, loadConfig.conf, tu, loadConfig) }
83-
?: listOf()
84-
}
67+
return tu?.operationNodes?.filterIsInstance<LoadConfiguration>()?.flatMap { loadConfig ->
68+
// Loop through all configuration sources
69+
val sources =
70+
tu.translationResult
71+
?.conceptNodes
72+
?.filterIsInstance<ConfigurationSource>()
73+
?.filter { source ->
74+
loadConfig.fileExpression.stringValues?.contains(source.name.toString()) ==
75+
true
76+
}
77+
78+
// And create a ProvideConfiguration node for each source
79+
sources?.flatMap { handleConfiguration(it, loadConfig.conf, tu, loadConfig) }
80+
?: listOf()
81+
}
8582
}
8683

8784
private fun handleConfiguration(

cpg-concepts/src/main/kotlin/de/fraunhofer/aisec/cpg/passes/concepts/config/ini/IniFileConfigurationSourceTask.kt

+23
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
package de.fraunhofer.aisec.cpg.passes.concepts.config.ini
2727

2828
import de.fraunhofer.aisec.cpg.TranslationContext
29+
import de.fraunhofer.aisec.cpg.TranslationResult
2930
import de.fraunhofer.aisec.cpg.graph.Component
3031
import de.fraunhofer.aisec.cpg.graph.Node
3132
import de.fraunhofer.aisec.cpg.graph.conceptNodes
@@ -37,6 +38,8 @@ import de.fraunhofer.aisec.cpg.graph.declarations.RecordDeclaration
3738
import de.fraunhofer.aisec.cpg.graph.declarations.TranslationUnitDeclaration
3839
import de.fraunhofer.aisec.cpg.graph.translationUnit
3940
import de.fraunhofer.aisec.cpg.helpers.Util.warnWithFileLocation
41+
import de.fraunhofer.aisec.cpg.passes.ImportResolver
42+
import de.fraunhofer.aisec.cpg.passes.ImportResolverTask
4043
import de.fraunhofer.aisec.cpg.passes.concepts.ConceptPass
4144
import de.fraunhofer.aisec.cpg.passes.concepts.ConceptTask
4245
import de.fraunhofer.aisec.cpg.passes.concepts.config.ProvideConfigTask
@@ -131,3 +134,23 @@ class IniFileConfigurationSourceTask(
131134
return option
132135
}
133136
}
137+
138+
class IniFileImportTask(target: TranslationResult, pass: ImportResolver, ctx: TranslationContext) :
139+
ImportResolverTask(target, pass, ctx) {
140+
override fun handleNode(node: Node) {
141+
// Check, if we have components with INI files
142+
val iniComponents =
143+
target.components.filter { it.language.name.localName == "IniFileLanguage" }
144+
145+
// Add them to as a dependency to all other components. At this point, we cannot know yet
146+
// which component does import which INI file, but we need to make sure that the
147+
// configuration is processed first
148+
iniComponents.forEach { iniComponent ->
149+
target.components.forEach { component ->
150+
if (component != iniComponent) {
151+
target.componentDependencies?.add(component, iniComponent)
152+
}
153+
}
154+
}
155+
}
156+
}

cpg-concepts/src/main/kotlin/de/fraunhofer/aisec/cpg/passes/concepts/memory/cxx/CXXDynamicLoadingTask.kt

+1-4
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,7 @@ class CXXDynamicLoadingImportTask(
218218
val libraryComponent = call.extractComponentFromLoadLibrary()
219219
if (libraryComponent != null) {
220220
ctx.currentComponent?.let {
221-
val added = target.componentDependencies?.add(it, libraryComponent) == true
222-
if (added) {
223-
log.debug("Added {} as an dependency of {}", libraryComponent.name, it.name)
224-
}
221+
target.componentDependencies?.add(it, libraryComponent) == true
225222
}
226223
}
227224
}

cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/passes/ImportResolver.kt

+6-13
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ class ImportDependencies<T : Node>(modules: MutableList<T>) : IdentityHashMap<T,
8383
var list = this.computeIfAbsent(importer) { identitySetOf<T>() }
8484
var added = list.add(imported)
8585

86+
if (added) {
87+
log.debug("Added {} as an dependency of {}", imported.name, importer.name)
88+
}
89+
8690
return added
8791
}
8892

@@ -324,21 +328,10 @@ class ImportResolver(ctx: TranslationContext) : TranslationResultPass(ctx) {
324328

325329
// Lastly, store the namespace module as an import dependency of the module where
326330
// the import was
327-
var added =
328-
currentComponent.translationUnitDependencies?.add(importTu, namespaceTu) == true
329-
if (added) {
330-
log.debug("Added {} as an dependency of {}", namespaceTu.name, importTu.name)
331-
}
331+
currentComponent.translationUnitDependencies?.add(importTu, namespaceTu) == true
332332

333333
// Add it on translation result level as well
334-
added = tr.componentDependencies?.add(currentComponent, namespaceComponent) == true
335-
if (added) {
336-
log.debug(
337-
"Added {} as an dependency of {}",
338-
namespaceComponent.name,
339-
currentComponent.name,
340-
)
341-
}
334+
tr.componentDependencies?.add(currentComponent, namespaceComponent) == true
342335
}
343336

344337
// If we had any imported namespaces, we break here

0 commit comments

Comments
 (0)