commit 2ab255173599990e3389b17c5a4eaed0a36e3c24 Author: Guo XIn <371864209@qq.com> Date: Sun Jan 7 15:41:54 2024 +0800 sonarqube插件基础框架 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e715f25 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "sonar-dependencies/sonar-cxx"] + path = sonar-dependencies/sonar-cxx + url = https://github.com/SonarOpenCommunity/sonar-cxx.git +[submodule "sonar-dependencies/sonar-java"] + path = sonar-dependencies/sonar-java + url = https://github.com/SonarSource/sonar-java.git diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..486f2ba --- /dev/null +++ b/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + org.sonarsource.java + java + 7.30.1.34514 + + + com.keyware.sonar + sonar-keyware + 1.0-SNAPSHOT + pom + + + 11 + 11 + UTF-8 + + + + sonar-dependencies + sonar-keyware-plugins + + + + + + + + + + \ No newline at end of file diff --git a/sonar-dependencies/pom.xml b/sonar-dependencies/pom.xml new file mode 100644 index 0000000..e0a8c1c --- /dev/null +++ b/sonar-dependencies/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + + com.keyware.sonar + sonar-keyware + 1.0-SNAPSHOT + + + sonar-dependencies + 1.0-SNAPSHOT + pom + + + + sonar-java + + + + + + + + + + + \ No newline at end of file diff --git a/sonar-dependencies/sonar-cxx b/sonar-dependencies/sonar-cxx new file mode 160000 index 0000000..dd3c88c --- /dev/null +++ b/sonar-dependencies/sonar-cxx @@ -0,0 +1 @@ +Subproject commit dd3c88c7343f3a44c5172dc4499b361dda028d85 diff --git a/sonar-dependencies/sonar-java b/sonar-dependencies/sonar-java new file mode 160000 index 0000000..0d3165c --- /dev/null +++ b/sonar-dependencies/sonar-java @@ -0,0 +1 @@ +Subproject commit 0d3165c6aebe18052b1d97893a2e3da85e6d9b41 diff --git a/sonar-keyware-plugins/pom.xml b/sonar-keyware-plugins/pom.xml new file mode 100644 index 0000000..edb04b9 --- /dev/null +++ b/sonar-keyware-plugins/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + + com.keyware.sonar + sonar-keyware + 1.0-SNAPSHOT + + + sonar-keyware-plugins + 1.0-SNAPSHOT + pom + + + sonar-keyware-plugins-java + sonar-keyware-plugins-cxx + + + \ No newline at end of file diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-cxx/libs/cxx-sslr-toolkit-2.1.1.488.jar b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/libs/cxx-sslr-toolkit-2.1.1.488.jar new file mode 100644 index 0000000..85c50bf Binary files /dev/null and b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/libs/cxx-sslr-toolkit-2.1.1.488.jar differ diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-cxx/libs/sonar-cxx-plugin-2.1.1.488.jar b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/libs/sonar-cxx-plugin-2.1.1.488.jar new file mode 100644 index 0000000..f30b775 Binary files /dev/null and b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/libs/sonar-cxx-plugin-2.1.1.488.jar differ diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-cxx/pom.xml b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/pom.xml new file mode 100644 index 0000000..82e7304 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/pom.xml @@ -0,0 +1,155 @@ + + + 4.0.0 + + + com.keyware.sonar + sonar-keyware-plugins + 1.0-SNAPSHOT + + + C++ 信息安全性设计准则 + sonar-keyware-plugins-cxx + 1.0-SNAPSHOT + 用于检查C++源代码的安全性设计准则的Sonarqube插件 + + + 11 + 2.15.1 + 2.6 + + 9.9.0.65466 + 9.14.0.375 + 8.9 + 2.10.1 + 33.0.0-jre + 3.0.2 + 1.10.19 + 5.8.0 + 3.24.2 + 5.10.1 + + + + + org.sonarsource.sonarqube-plugins.cxx + cxx-sslr-toolkit + ${project.basedir}/libs/cxx-sslr-toolkit-2.1.1.488.jar + 2.1.1.488 + system + + + org.sonarsource.sonarqube-plugins.cxx + sonar-cxx-plugin + ${project.basedir}/libs/sonar-cxx-plugin-2.1.1.488.jar + 2.1.1.488 + system + + + + org.sonarsource.api.plugin + sonar-plugin-api + ${sonar.plugin.api.version} + + + + org.sonarsource.sonarqube + sonar-plugin-api-impl + ${sonar.version} + compile + + + + commons-io + commons-io + ${commons-io.version} + test + + + commons-lang + commons-lang + ${commons-lang.version} + + + com.google.code.findbugs + jsr305 + ${jsr305.version} + + + com.google.guava + guava + ${guava.version} + + + com.google.code.gson + gson + ${gson.version} + + + org.mockito + mockito-core + ${mockito-core.version} + test + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + + + + org.sonarsource.sonar-packaging-maven-plugin + sonar-packaging-maven-plugin + + ${sonarQubeMinVersion} + + + + + com.mycila + license-maven-plugin + +
${project.basedir}/src/main/resources/license-header.txt
+ + + **/*.properties + *.sh + *.yml + .editorconfig + .gitignore + **/*.md + **/*.xml + +
+
+
+ + + src/main/resources + + com/sonar/sqale/cxx-model-project* + external/* + + + +
+
\ No newline at end of file diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-cxx/src/main/java/com/keyware/sonar/cxx/CxxSecurityDesignRulesPlugin.java b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/src/main/java/com/keyware/sonar/cxx/CxxSecurityDesignRulesPlugin.java new file mode 100644 index 0000000..6184a52 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/src/main/java/com/keyware/sonar/cxx/CxxSecurityDesignRulesPlugin.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. + * 项目名称:C++ 信息安全性设计准则 + * 项目描述:用于检查C++源代码的安全性设计准则的Sonarqube插件 + * 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 + */ +package com.keyware.sonar.cxx; + +import com.keyware.sonar.cxx.rules.CxxSecurityDesignRulesRepository; +import org.sonar.api.Plugin; +import org.sonar.plugins.cxx.CxxLanguage; + +/** + * TODO CxxSecurityDesignRulesPlugin + * + * @author GuoXin + * @date 2024/1/6 + */ +public class CxxSecurityDesignRulesPlugin implements Plugin { + @Override + public void define(Context context) { + context.addExtension(CxxLanguage.class); + context.addExtension(CxxSecurityDesignRulesRepository.class); + } +} diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-cxx/src/main/java/com/keyware/sonar/cxx/rules/CxxSecurityDesignRulesRepository.java b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/src/main/java/com/keyware/sonar/cxx/rules/CxxSecurityDesignRulesRepository.java new file mode 100644 index 0000000..e2884e5 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/src/main/java/com/keyware/sonar/cxx/rules/CxxSecurityDesignRulesRepository.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. + * 项目名称:C++ 信息安全性设计准则 + * 项目描述:用于检查C++源代码的安全性设计准则的Sonarqube插件 + * 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 + */ +package com.keyware.sonar.cxx.rules; + +import org.sonar.api.SonarEdition; +import org.sonar.api.SonarProduct; +import org.sonar.api.SonarQubeSide; +import org.sonar.api.SonarRuntime; +import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.resources.Language; +import org.sonar.api.server.rule.RulesDefinition; +import org.sonar.api.utils.Version; +import org.sonar.plugins.cxx.CustomCxxRulesDefinition; +import org.sonar.plugins.cxx.CxxLanguage; + +import java.util.Collections; +import java.util.Objects; +import java.util.Set; + +/** + * TODO CxxSecurityDesignRulesRepository + * + * @author GuoXin + * @date 2024/1/6 + */ +public class CxxSecurityDesignRulesRepository extends CustomCxxRulesDefinition { + // 不要修改这个值,因为路径在 CheckVerifier 中是硬编码的 + private static final String RESOURCE_BASE_PATH = "org/sonar/l10n/java/rules/java"; + + public static final String REPOSITORY_KEY = "keyware-cxx-security-design"; + public static final String REPOSITORY_NAME = "C++ 安全性设计准则"; + + + // 添加需要视为模板规则的规则的规则键 + private static final Set RULE_TEMPLATES_KEY = Collections.emptySet(); + + private final SonarRuntime runtime; + + public CxxSecurityDesignRulesRepository(SonarRuntime runtime) { + this.runtime = runtime; + } + + @Override + public void define(RulesDefinition.Context context) { + RulesDefinition.NewRepository repository = context.createRepository(REPOSITORY_KEY, "cxx").setName(REPOSITORY_NAME); + + + + setTemplates(repository); + + repository.done(); + } + + @Override + public Language getLanguage() { + return new CxxLanguage(new MapSettings().asConfig()); + } + + @Override + public String repositoryName() { + return REPOSITORY_NAME; + } + + @Override + public String repositoryKey() { + return REPOSITORY_KEY; + } + + @Override + public Class[] checkClasses() { + return new Class[0]; + } + + private static void setTemplates(RulesDefinition.NewRepository repository) { + RULE_TEMPLATES_KEY.stream() + .map(repository::rule) + .filter(Objects::nonNull) + .forEach(rule -> rule.setTemplate(true)); + } + + + public static class MockedSonarRuntime implements SonarRuntime { + + @Override + public Version getApiVersion() { + return Version.create(9, 9); + } + + @Override + public SonarProduct getProduct() { + return SonarProduct.SONARQUBE; + } + + @Override + public SonarQubeSide getSonarQubeSide() { + return SonarQubeSide.SCANNER; + } + + @Override + public SonarEdition getEdition() { + return SonarEdition.COMMUNITY; + } + } +} diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-cxx/src/main/java/com/keyware/sonar/cxx/rules/checkers/DemoChecker.java b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/src/main/java/com/keyware/sonar/cxx/rules/checkers/DemoChecker.java new file mode 100644 index 0000000..cd61fd2 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/src/main/java/com/keyware/sonar/cxx/rules/checkers/DemoChecker.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. + * 项目名称:C++ 信息安全性设计准则 + * 项目描述:用于检查C++源代码的安全性设计准则的Sonarqube插件 + * 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 + */ +package com.keyware.sonar.cxx.rules.checkers; + +import com.sonar.cxx.sslr.api.AstNode; +import com.sonar.cxx.sslr.api.Grammar; +import org.sonar.check.Priority; +import org.sonar.check.Rule; +import org.sonar.cxx.parser.CxxGrammarImpl; +import org.sonar.cxx.squidbridge.SquidAstVisitor; +import org.sonar.cxx.squidbridge.annotations.ActivatedByDefault; +import org.sonar.cxx.squidbridge.annotations.SqaleConstantRemediation; + +/** + * TODO DemoChecker + * + * @author GuoXin + * @date 2024/1/6 + */ +@Rule(key = "DemoChecker", name = "DemoChecker", description = "DemoChecker", priority = Priority.INFO, tags = {"28Suo"}) +@ActivatedByDefault +@SqaleConstantRemediation("5min") +public class DemoChecker extends SquidAstVisitor { + @Override + public void init() { + this.subscribeTo( + CxxGrammarImpl.functionDefinition + ); + } + + @Override + public void visitNode(AstNode astNode) { + super.visitNode(astNode); + } +} diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-cxx/src/main/resources/license-header.txt b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/src/main/resources/license-header.txt new file mode 100644 index 0000000..6f93a28 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-cxx/src/main/resources/license-header.txt @@ -0,0 +1,4 @@ +Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. +项目名称:${project.name} +项目描述:${project.description} +版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 \ No newline at end of file diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/pom.xml b/sonar-keyware-plugins/sonar-keyware-plugins-java/pom.xml new file mode 100644 index 0000000..25b5dce --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/pom.xml @@ -0,0 +1,244 @@ + + + 4.0.0 + + + com.keyware.sonar + sonar-keyware-plugins + 1.0-SNAPSHOT + + + Java 信息安全性设计准则 + sonar-keyware-plugins-java + sonar-plugin + 1.0-SNAPSHOT + 用于检查Java源代码的安全性设计准则的Sonarqube插件 + + + 0.8.10 + UTF-8 + + + + + org.sonarsource.java + sonar-java-plugin + 7.30.1.34514 + sonar-plugin + compile + + + + org.sonarsource.api.plugin + sonar-plugin-api + provided + + + + org.sonarsource.analyzer-commons + sonar-analyzer-commons + + + + org.slf4j + slf4j-api + provided + + + + + org.sonarsource.api.plugin + sonar-plugin-api-test-fixtures + test + + + org.sonarsource.sonarqube + sonar-plugin-api-impl + test + + + org.sonarsource.java + test-classpath-reader + 7.30.1.34514 + test + + + org.sonarsource.java + java-checks-testkit + 7.30.1.34514 + test + + + org.junit.jupiter + junit-jupiter + test + + + org.junit.jupiter + junit-jupiter-migrationsupport + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core + test + + + com.google.guava + guava + test + + + + + + + org.sonarsource.sonar-packaging-maven-plugin + sonar-packaging-maven-plugin + true + + keyware-java-plugin + Java 安全性设计准则 + com.keyware.sonar.java.JavaSecurityDesignRulesPlugin + true + true + 9.14.0.375 + java:${project.version} + + + + org.apache.maven.plugins + maven-jar-plugin + + + org.apache.maven.plugins + maven-shade-plugin + + + + + package + + shade + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 11 + 11 + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + prepare-agent + + prepare-agent + + + + report + + report + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy + test-compile + + copy + + + + + org.slf4j + slf4j-api + 1.7.30 + jar + + + org.apache.commons + commons-collections4 + 4.0 + jar + + + javax + javaee-api + 6.0 + jar + + + org.springframework + spring-webmvc + 4.3.3.RELEASE + jar + + + org.springframework + spring-web + 4.3.3.RELEASE + jar + + + org.springframework + spring-context + 4.3.3.RELEASE + jar + + + junit + junit + 4.13.2 + jar + + + ${project.build.directory}/test-jars + + + + + + com.mycila + license-maven-plugin + +
${project.basedir}/src/main/resources/license-header.txt
+ + + **/*.properties + *.sh + *.yml + .editorconfig + .gitignore + **/*.md + **/*.xml + +
+
+
+
+
\ No newline at end of file diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/JavaSecurityDesignRulesPlugin.java b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/JavaSecurityDesignRulesPlugin.java new file mode 100644 index 0000000..0e273ad --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/JavaSecurityDesignRulesPlugin.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. + * 项目名称:Java 信息安全性设计准则 + * 项目描述:用于检查Java源代码的安全性设计准则的Sonarqube插件 + * 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 + */ +package com.keyware.sonar.java; + +import com.keyware.sonar.java.rules.JavaFileCheckRegistrar; +import com.keyware.sonar.java.rules.JavaSecurityDesignRulesRepository; +import org.sonar.api.Plugin; + +/** + * Java 安全性设计准则插件 + * + * @author GuoXin + * @date 2024/1/6 + */ +public class JavaSecurityDesignRulesPlugin implements Plugin { + @Override + public void define(Context context) { + // 服务器扩展 - >对象在服务器启动期间实例化 + context.addExtension(JavaSecurityDesignRulesRepository.class); + + // 批处理扩展 - >对象在代码分析期间实例化 + context.addExtension(JavaFileCheckRegistrar.class); + + } +} diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/rules/JavaFileCheckRegistrar.java b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/rules/JavaFileCheckRegistrar.java new file mode 100644 index 0000000..20eaf0b --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/rules/JavaFileCheckRegistrar.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. + * 项目名称:Java 信息安全性设计准则 + * 项目描述:用于检查Java源代码的安全性设计准则的Sonarqube插件 + * 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 + */ +package com.keyware.sonar.java.rules; + +import org.sonar.plugins.java.api.CheckRegistrar; +import org.sonar.plugins.java.api.JavaCheck; +import org.sonarsource.api.sonarlint.SonarLintSide; + +import java.util.List; + +/** + * 负责将java规则检查器注册到SonarQube中 + * + * @author GuoXin + * @date 2024/1/6 + */ +@SonarLintSide +public class JavaFileCheckRegistrar implements CheckRegistrar { + /** + * 注册将用于在分析期间实例化检查的类。 + */ + @Override + public void register(RegistrarContext registrarContext) { + // 调用 registerClassesForRepository 以将类与正确的存储库密钥相关联 + registrarContext.registerClassesForRepository(JavaSecurityDesignRulesRepository.REPOSITORY_KEY, checkClasses(), testCheckClasses()); + } + + /** + * 列出插件提供的所有主检查器 + */ + public static List> checkClasses() { + return RulesList.getJavaChecks(); + } + + /** + * 列出插件提供的所有测试检查器 + */ + public static List> testCheckClasses() { + return RulesList.getJavaTestChecks(); + } +} diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/rules/JavaSecurityDesignRulesRepository.java b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/rules/JavaSecurityDesignRulesRepository.java new file mode 100644 index 0000000..b440253 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/rules/JavaSecurityDesignRulesRepository.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. + * 项目名称:Java 信息安全性设计准则 + * 项目描述:用于检查Java源代码的安全性设计准则的Sonarqube插件 + * 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 + */ +package com.keyware.sonar.java.rules; + +import org.sonar.api.SonarEdition; +import org.sonar.api.SonarProduct; +import org.sonar.api.SonarQubeSide; +import org.sonar.api.SonarRuntime; +import org.sonar.api.server.rule.RulesDefinition; +import org.sonar.api.utils.Version; +import org.sonarsource.analyzer.commons.RuleMetadataLoader; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Objects; +import java.util.Set; + +/** + * 用于定义出现在规则页面中规则的元数据 + * + * @author GuoXin + * @date 2024/1/6 + */ +public class JavaSecurityDesignRulesRepository implements RulesDefinition { + // 不要修改这个值,因为路径在 CheckVerifier 中是硬编码的 + private static final String RESOURCE_BASE_PATH = "org/sonar/l10n/java/rules/java"; + + public static final String REPOSITORY_KEY = "keyware-java-security-design"; + public static final String REPOSITORY_NAME = "Java安全性设计准则"; + + // 添加需要视为模板规则的规则的规则键 + private static final Set RULE_TEMPLATES_KEY = Collections.emptySet(); + + private final SonarRuntime runtime; + + public JavaSecurityDesignRulesRepository(SonarRuntime runtime) { + this.runtime = runtime; + } + + @Override + public void define(RulesDefinition.Context context) { + RulesDefinition.NewRepository repository = context.createRepository(REPOSITORY_KEY, "java").setName(REPOSITORY_NAME); + + RuleMetadataLoader ruleMetadataLoader = new RuleMetadataLoader(RESOURCE_BASE_PATH, runtime); + + ruleMetadataLoader.addRulesByAnnotatedClass(repository, new ArrayList<>(RulesList.getChecks())); + + setTemplates(repository); + + repository.done(); + } + + private static void setTemplates(RulesDefinition.NewRepository repository) { + RULE_TEMPLATES_KEY.stream() + .map(repository::rule) + .filter(Objects::nonNull) + .forEach(rule -> rule.setTemplate(true)); + } + + + public static class MockedSonarRuntime implements SonarRuntime { + + @Override + public Version getApiVersion() { + return Version.create(9, 9); + } + + @Override + public SonarProduct getProduct() { + return SonarProduct.SONARQUBE; + } + + @Override + public SonarQubeSide getSonarQubeSide() { + return SonarQubeSide.SCANNER; + } + + @Override + public SonarEdition getEdition() { + return SonarEdition.COMMUNITY; + } + } +} diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/rules/RulesList.java b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/rules/RulesList.java new file mode 100644 index 0000000..57bec67 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/rules/RulesList.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. + * 项目名称:Java 信息安全性设计准则 + * 项目描述:用于检查Java源代码的安全性设计准则的Sonarqube插件 + * 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 + */ +package com.keyware.sonar.java.rules; + +import com.keyware.sonar.java.rules.checkers.ABCVarNameChecker; +import org.sonar.plugins.java.api.JavaCheck; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public final class RulesList { + + private RulesList() { + } + + public static List> getChecks() { + List> checks = new ArrayList<>(); + checks.addAll(getJavaChecks()); + checks.addAll(getJavaTestChecks()); + return Collections.unmodifiableList(checks); + } + + /** + * These rules are going to target MAIN code only + */ + public static List> getJavaChecks() { + return Collections.unmodifiableList(Arrays.asList( + ABCVarNameChecker.class + /*SpringControllerRequestMappingEntityRule.class, + AvoidAnnotationRule.class, + AvoidBrandInMethodNamesRule.class, + AvoidMethodDeclarationRule.class, + AvoidSuperClassRule.class, + AvoidTreeListRule.class, + MyCustomSubscriptionRule.class, + SecurityAnnotationMandatoryRule.class*/ + )); + } + + /** + * These rules are going to target TEST code only + */ + public static List> getJavaTestChecks() { + return Collections.unmodifiableList(Arrays.asList( + /*NoIfStatementInTestsRule.class*/ + )); + } +} diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/rules/checkers/ABCVarNameChecker.java b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/rules/checkers/ABCVarNameChecker.java new file mode 100644 index 0000000..08a5f12 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/java/com/keyware/sonar/java/rules/checkers/ABCVarNameChecker.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. + * 项目名称:Java 信息安全性设计准则 + * 项目描述:用于检查Java源代码的安全性设计准则的Sonarqube插件 + * 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 + */ +package com.keyware.sonar.java.rules.checkers; + +import org.sonar.check.Rule; +import org.sonar.java.ast.visitors.SubscriptionVisitor; +import org.sonar.plugins.java.api.tree.Tree; +import org.sonar.plugins.java.api.tree.VariableTree; + +import java.util.Collections; +import java.util.List; + +/** + * TODO ABCVarNameChecker + * + * @author GuoXin + * @date 2024/1/6 + */ +@Rule(key = "ABCVarNameChecker") +public class ABCVarNameChecker extends SubscriptionVisitor { + + @Override + public List nodesToVisit() { + return Collections.singletonList( + Tree.Kind.VARIABLE + ); + } + + @Override + public void visitNode(Tree tree) { + VariableTree node = (VariableTree) tree; + if (node.simpleName().name().matches("ABC")) { + context.reportIssue(this, node.simpleName(), "不能使用ABC作为变量名"); + } + } +} diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/resources/license-header.txt b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/resources/license-header.txt new file mode 100644 index 0000000..6f93a28 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/resources/license-header.txt @@ -0,0 +1,4 @@ +Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. +项目名称:${project.name} +项目描述:${project.description} +版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 \ No newline at end of file diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/resources/org/sonar/l10n/java/rules/java/ABCVarNameChecker.html b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/resources/org/sonar/l10n/java/rules/java/ABCVarNameChecker.html new file mode 100644 index 0000000..c181a22 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/resources/org/sonar/l10n/java/rules/java/ABCVarNameChecker.html @@ -0,0 +1,9 @@ +

不能使用ABC作为变量名

+

不能使用ABC作为变量名

+
+
+
+

合规解决方案

+
+
+
diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/resources/org/sonar/l10n/java/rules/java/ABCVarNameChecker.json b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/resources/org/sonar/l10n/java/rules/java/ABCVarNameChecker.json new file mode 100644 index 0000000..94fa3e8 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/main/resources/org/sonar/l10n/java/rules/java/ABCVarNameChecker.json @@ -0,0 +1,13 @@ +{ + "title": "不能使用ABC作为变量名", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "28suo" + ], + "defaultSeverity": "Minor" +} \ No newline at end of file diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/files/ABCVarNameRule.java b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/files/ABCVarNameRule.java new file mode 100644 index 0000000..cd344bc --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/files/ABCVarNameRule.java @@ -0,0 +1,11 @@ +class VarNameRule{ + private static String ABC = "abc"; // Noncompliant {{不能使用ABC作为变量名}} + private static String edf = "edf"; + + public String getABC(){ + return ABC; + } + public void test(){ + System.out.println(ABC); + } +} diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/JavaSecurityDesignRulesPluginTest.java b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/JavaSecurityDesignRulesPluginTest.java new file mode 100644 index 0000000..377d157 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/JavaSecurityDesignRulesPluginTest.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. + * 项目名称:Java 信息安全性设计准则 + * 项目描述:用于检查Java源代码的安全性设计准则的Sonarqube插件 + * 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 + */ +package com.keyware.sonar.java; + +import org.junit.jupiter.api.Test; +import org.sonar.api.*; +import org.sonar.api.utils.Version; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * TODO JavaSecurityDesignRulesPluginTest + * + * @author GuoXin + * @date 2024/1/6 + */ +public class JavaSecurityDesignRulesPluginTest { + @Test + void testName() { + Plugin.Context context = new Plugin.Context(new MockedSonarRuntime()); + + new JavaSecurityDesignRulesPlugin().define(context); + + assertThat(context.getExtensions()) + .extracting(ext -> ((Class) ext).getSimpleName()) + .containsExactlyInAnyOrder("JavaSecurityDesignRulesRepository", "JavaFileCheckRegistrar"); + } + + public static class MockedSonarRuntime implements SonarRuntime { + + @Override + public Version getApiVersion() { + return Version.create(9, 9); + } + + @Override + public SonarProduct getProduct() { + return SonarProduct.SONARQUBE; + } + + @Override + public SonarQubeSide getSonarQubeSide() { + return SonarQubeSide.SCANNER; + } + + @Override + public SonarEdition getEdition() { + return SonarEdition.COMMUNITY; + } + } +} diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/rules/JavaFileCheckRegistrarTest.java b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/rules/JavaFileCheckRegistrarTest.java new file mode 100644 index 0000000..fed6430 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/rules/JavaFileCheckRegistrarTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. + * 项目名称:Java 信息安全性设计准则 + * 项目描述:用于检查Java源代码的安全性设计准则的Sonarqube插件 + * 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 + */ +package com.keyware.sonar.java.rules; + +import org.junit.jupiter.api.Test; +import org.sonar.api.rule.RuleKey; +import org.sonar.java.checks.verifier.TestCheckRegistrarContext; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * TODO JavaFileCheckRegistrarTest + * + * @author GuoXin + * @date 2024/1/6 + */ +public class JavaFileCheckRegistrarTest { + + @Test + void checkRegisteredRulesKeysAndClasses() { + TestCheckRegistrarContext context = new TestCheckRegistrarContext(); + + JavaFileCheckRegistrar registrar = new JavaFileCheckRegistrar(); + registrar.register(context); + + assertThat(context.mainRuleKeys).extracting(RuleKey::toString).containsExactly( + /*"mycompany-java:SpringControllerRequestMappingEntity", + "mycompany-java:AvoidAnnotation", + "mycompany-java:AvoidBrandInMethodNames", + "mycompany-java:AvoidMethodDeclaration", + "mycompany-java:AvoidSuperClass", + "mycompany-java:AvoidTreeList", + "mycompany-java:AvoidMethodWithSameTypeInArgument", + "mycompany-java:SecurityAnnotationMandatory"*/ + "keyware-java-security-design:ABCVarNameChecker" + ); + + assertThat(context.mainCheckClasses).extracting(Class::getSimpleName).containsExactly( + /*"SpringControllerRequestMappingEntityRule", + "AvoidAnnotationRule", + "AvoidBrandInMethodNamesRule", + "AvoidMethodDeclarationRule", + "AvoidSuperClassRule", + "AvoidTreeListRule", + "MyCustomSubscriptionRule", + "SecurityAnnotationMandatoryRule"*/ + "ABCVarNameChecker" + ); + + assertThat(context.testRuleKeys).extracting(RuleKey::toString).containsExactly( + /*"mycompany-java:NoIfStatementInTests"*/ + ); + + assertThat(context.testCheckClasses).extracting(Class::getSimpleName).containsExactly( + /*"NoIfStatementInTestsRule"*/ + ); + } + +} diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/rules/JavaSecurityDesignRulesRepositoryTest.java b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/rules/JavaSecurityDesignRulesRepositoryTest.java new file mode 100644 index 0000000..b8fb520 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/rules/JavaSecurityDesignRulesRepositoryTest.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. + * 项目名称:Java 信息安全性设计准则 + * 项目描述:用于检查Java源代码的安全性设计准则的Sonarqube插件 + * 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 + */ +package com.keyware.sonar.java.rules; + +import org.junit.jupiter.api.Test; +import org.sonar.api.rules.RuleType; +import org.sonar.api.server.debt.DebtRemediationFunction; +import org.sonar.api.server.rule.RuleParamType; +import org.sonar.api.server.rule.RulesDefinition; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * TODO JavaSecurityDesignRulesRepositoryTest + * + * @author GuoXin + * @date 2024/1/6 + */ +public class JavaSecurityDesignRulesRepositoryTest { + + @Test + void test() { + JavaSecurityDesignRulesRepository rulesDefinition = new JavaSecurityDesignRulesRepository(new JavaSecurityDesignRulesRepository.MockedSonarRuntime()); + RulesDefinition.Context context = new RulesDefinition.Context(); + rulesDefinition.define(context); + RulesDefinition.Repository repository = context.repository(JavaSecurityDesignRulesRepository.REPOSITORY_KEY); + + assertThat(repository.name()).isEqualTo(JavaSecurityDesignRulesRepository.REPOSITORY_NAME); + assertThat(repository.language()).isEqualTo("java"); + assertThat(repository.rules()).hasSize(RulesList.getChecks().size()); + assertThat(repository.rules().stream().filter(RulesDefinition.Rule::template)).isEmpty(); + + //assertRuleProperties(repository); + // assertParameterProperties(repository); + // assertAllRuleParametersHaveDescription(repository); + } + + private static void assertParameterProperties(RulesDefinition.Repository repository) { + RulesDefinition.Param max = repository.rule("AvoidAnnotation").param("name"); + assertThat(max).isNotNull(); + assertThat(max.defaultValue()).isEqualTo("Inject"); + assertThat(max.description()).isEqualTo("Name of the annotation to avoid, without the prefix @, for instance 'Override'"); + assertThat(max.type()).isEqualTo(RuleParamType.STRING); + } + + private static void assertRuleProperties(RulesDefinition.Repository repository) { + RulesDefinition.Rule rule = repository.rule("AvoidAnnotation"); + assertThat(rule).isNotNull(); + assertThat(rule.name()).isEqualTo("Title of AvoidAnnotation"); + assertThat(rule.debtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.CONSTANT_ISSUE); + assertThat(rule.type()).isEqualTo(RuleType.CODE_SMELL); + } + + private static void assertAllRuleParametersHaveDescription(RulesDefinition.Repository repository) { + for (RulesDefinition.Rule rule : repository.rules()) { + for (RulesDefinition.Param param : rule.params()) { + assertThat(param.description()).as("description for " + param.key()).isNotEmpty(); + } + } + } +} diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/rules/checkers/ABCVarNameCheckerTest.java b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/rules/checkers/ABCVarNameCheckerTest.java new file mode 100644 index 0000000..6a83980 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/rules/checkers/ABCVarNameCheckerTest.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. + * 项目名称:Java 信息安全性设计准则 + * 项目描述:用于检查Java源代码的安全性设计准则的Sonarqube插件 + * 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 + */ +package com.keyware.sonar.java.rules.checkers; + +import com.keyware.sonar.java.utils.FilesUtils; +import org.junit.jupiter.api.Test; +import org.sonar.java.checks.verifier.CheckVerifier; + +/** + * TODO ABCVarNameCheckerTest + * + * @author GuoXin + * @date 2024/1/6 + */ +public class ABCVarNameCheckerTest { + @Test + void detected() { + + + ABCVarNameChecker rule = new ABCVarNameChecker(); + + + // Verifies that the check will raise the adequate issues with the expected message. + // In the test file, lines which should raise an issue have been commented out + // by using the following syntax: "// Noncompliant {{EXPECTED_MESSAGE}}" + CheckVerifier.newVerifier() + .onFile("src/test/files/ABCVarNameRule.java") + .withCheck(rule) + .withClassPath(FilesUtils.getClassPath("target/test-jars")) + .verifyIssues(); + } +} diff --git a/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/utils/FilesUtils.java b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/utils/FilesUtils.java new file mode 100644 index 0000000..23edf71 --- /dev/null +++ b/sonar-keyware-plugins/sonar-keyware-plugins-java/src/test/java/com/keyware/sonar/java/utils/FilesUtils.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. + * 项目名称:Java 信息安全性设计准则 + * 项目描述:用于检查Java源代码的安全性设计准则的Sonarqube插件 + * 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 + */ +package com.keyware.sonar.java.utils; + +import java.io.File; +import java.io.IOException; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * Duplicates org.sonar.java.checks.verifier.FilesUtils to locate test jars within the custom-rules plugin + */ +public class FilesUtils { + + private FilesUtils() { + } + + /** + * Default location of the jars/zips to be taken into account when performing the analysis. + */ + private static final String DEFAULT_TEST_JARS_DIRECTORY = "target/test-jars"; + + public static List getClassPath(String jarsDirectory) { + List classpath = new LinkedList<>(); + Path testJars = Paths.get(jarsDirectory); + if (testJars.toFile().exists()) { + classpath = getFilesRecursively(testJars, "jar", "zip"); + } else if (!DEFAULT_TEST_JARS_DIRECTORY.equals(jarsDirectory)) { + throw new AssertionError("The directory to be used to extend class path does not exists (" + + testJars.toAbsolutePath() + + ")."); + } + classpath.add(new File("target/test-classes")); + return classpath; + } + + private static List getFilesRecursively(Path root, String... extensions) { + final List files = new ArrayList<>(); + + FileVisitor visitor = new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path filePath, BasicFileAttributes attrs) { + for (String extension : extensions) { + if (filePath.toString().endsWith("." + + extension)) { + files.add(filePath.toFile()); + break; + } + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) { + return FileVisitResult.CONTINUE; + } + }; + + try { + Files.walkFileTree(root, visitor); + } catch (IOException e) { + // we already ignore errors in the visitor + } + + return files; + } + +}