diff --git a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/Main.scala b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/Main.scala index ee4d146447df..cd4bbb53cf84 100644 --- a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/Main.scala +++ b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/Main.scala @@ -10,6 +10,7 @@ import scopt.OParser final case class Config( phpIni: Option[String] = None, phpParserBin: Option[String] = None, + phpExtensions: Set[String] = Set(), downloadDependencies: Boolean = false ) extends X2CpgConfig[Config] with TypeRecoveryParserConfig[Config] @@ -24,6 +25,10 @@ final case class Config( copy(phpParserBin = Some(phpParserBin)).withInheritedFields(this) } + def withExtensions(phpExtensions: Set[String]): Config = { + copy(phpExtensions = phpExtensions).withInheritedFields(this) + } + override def withDownloadDependencies(downloadDependencies: Boolean): Config = { copy(downloadDependencies = downloadDependencies).withInheritedFields(this) } diff --git a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/AstCreationPass.scala b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/AstCreationPass.scala index bf6c564ab2b2..a353310fe512 100644 --- a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/AstCreationPass.scala +++ b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/AstCreationPass.scala @@ -16,7 +16,7 @@ class AstCreationPass(config: Config, cpg: Cpg, parser: PhpParser)(implicit with private val logger = LoggerFactory.getLogger(this.getClass) - val PhpSourceFileExtensions: Set[String] = Set(".php") + var PhpSourceFileExtensions: Set[String] = if config.phpExtensions.nonEmpty then config.phpExtensions else Set(".php") override def generateParts(): Array[String] = SourceFiles .determine( diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/passes/PhpFileExtensionsTest.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/passes/PhpFileExtensionsTest.scala new file mode 100644 index 000000000000..0b68cf942235 --- /dev/null +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/passes/PhpFileExtensionsTest.scala @@ -0,0 +1,92 @@ +package io.joern.php2cpg.passes + +import io.joern.php2cpg.Config +import io.joern.php2cpg.parser.Domain.PhpOperators +import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture +import io.shiftleft.semanticcpg.language.* + +class PhpFileExtensionsTest extends PhpCode2CpgFixture() { + + "two files with two new extensions associated with PHP" should { + + val cpg = code( + """ + |require 'vendor/autoload.php'; + | + |$s3 = new S3Client([ + | 'version' => 'latest', + | 'region' => 'us-east-1', + | 'credentials' => [ + | 'key' => 'YOUR_AWS_ACCESS_KEY_ID', + | 'secret' => 'YOUR_AWS_SECRET_ACCESS_KEY', + | ] + |]); + |""".stripMargin, + "sample.php" + ) + .moreCode( + """ 'latest', + | 'region' => 'us-east-1', + | 'credentials' => [ + | 'key' => 'YOUR_AWS_ACCESS_KEY_ID', + | 'secret' => 'YOUR_AWS_SECRET_ACCESS_KEY', + | ] + |]); + | + |""".stripMargin, + "something.cls" + ) + .withConfig(Config().withExtensions(Set(".php", ".cls"))) + + "be scanned and present in cpg" in { + cpg.file.name.l shouldBe List("sample.php", "something.cls", "") + cpg.file.name.l.size shouldBe 3 + } + + } + + "two files with only default (.php) extension associated with PHP" should { + + val cpg = code( + """ + |require 'vendor/autoload.php'; + | + |$s3 = new S3Client([ + | 'version' => 'latest', + | 'region' => 'us-east-1', + | 'credentials' => [ + | 'key' => 'YOUR_AWS_ACCESS_KEY_ID', + | 'secret' => 'YOUR_AWS_SECRET_ACCESS_KEY', + | ] + |]); + |""".stripMargin, + "sample.php" + ) + .moreCode( + """ 'latest', + | 'region' => 'us-east-1', + | 'credentials' => [ + | 'key' => 'YOUR_AWS_ACCESS_KEY_ID', + | 'secret' => 'YOUR_AWS_SECRET_ACCESS_KEY', + | ] + |]); + | + |""".stripMargin, + "something.cls" + ) + + "be scanned and one default extension present in cpg" in { + cpg.file.name.l shouldBe List("sample.php", "") + cpg.file.name.l.size shouldBe 2 + } + } + +}