【问题标题】:SonarQube: Custom Java Rules Not Visible in UISonarQube:自定义 Java 规则在 UI 中不可见
【发布时间】:2016-03-15 04:09:31
【问题描述】:

我已经尝试在 SonarQube 上实现我自己的自定义 Java 规则已经有一段时间了。但是,似乎无论我尝试什么,我都无法让新规则显示在 SonarQube UI 上。

目前我只有一个规则,即检查文本输出是否经过净化的安全规则。该规则扩展了 BaseTreeVisitor 并实现了 JavaFileScanner。它覆盖 visitMethodInvocation 以对相关方法的 String 参数进行一些检查。这是规则定义注释:

@Rule(key = "Sanitize_HTML",
    name = "HTML Responses Should be Sanitized",
    tags = {"security", "owasp-a3"},
    priority = Priority.CRITICAL)
@ActivatedByDefault
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.SECURITY_FEATURES)
@SqaleConstantRemediation("10min")
public class SanitizeHTMLCheck extends BaseTreeVisitor implements JavaFileScanner{...}

编写规则后,我想对其进行测试,但很快意识到我必须将其包装在插件中才能这样做。我为此编写了三个额外的类,完全基于provided example plugin。这是基类:

    public class SecurityPlugin extends SonarPlugin{

    public List getExtensions(){
        return Arrays.asList(
                JavaClasspath.class,
                JavaTestClasspath.class,
                Java.class,
                SecurityRulesDefinition.class,
                SonarComponents.class,
                DefaultJavaResourceLocator.class);
    }
}

除了 SecurityRulesDefinition 之外,列表中的类都是不相关的(在绝望中添加)。它反映了示例中 MyJavaRulesDefinition 类的结构:

public class SecurityRulesDefinition implements RulesDefinition{

    public void define(Context context){
        NewRepository repository = context
                .createRepository(RulesList.REPOSITORY_KEY, Java.KEY)
                .setName("Security Rules");

        AnnotationBasedRulesDefinition.load(repository, Java.KEY, RulesList.getChecks());

        for(NewRule rule : repository.rules()){
            rule.setInternalKey(rule.key());
        }

        repository.done();
    }
}

最后,就像示例一样,这里是 RulesList,我的所有规则类都应该放在这里:

public class RulesList {

    public static final String REPOSITORY_KEY = "security_java";

    private RulesList(){}

    public static List<Class> getChecks(){
        return ImmutableList.<Class>builder().addAll(getJavaChecks()).addAll(getJavaTestChecks()).build();
    }

    //Add all checks to here...
    public static List<Class<? extends JavaCheck>> getJavaChecks(){
        return ImmutableList.<Class<? extends JavaCheck>>builder()
                .add(SanitizeHTMLCheck.class)
                .build();
    }

    //Put all test checks here
    public static List<Class<? extends JavaCheck>> getJavaTestChecks(){
        return ImmutableList.<Class<? extends JavaCheck>>builder()
                .build();
    }

}

就像我说的,这些几乎都是从示例插件中删除的,所以我不知道它们可能有什么问题。

我正在使用带有 M2E 的 Eclipse 来尝试构建插件。正如文档的Coding A Plugin 页面所建议的那样,我在我的 POM.xml 中添加了以下插件标记:

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.sonar</groupId>
        <artifactId>sonar-packaging-maven-plugin</artifactId>
        <version>1.13</version>
        <extensions>true</extensions>
          <configuration>
            <pluginKey>securityrules</pluginKey>
            <pluginClass>org.myOrg.sonar_analysis.security_rules_java.SecurityPlugin</pluginClass>
            <pluginName>Sonar Java Custom Security Rules</pluginName>
            <pluginDescription>Implements several checks against OWASP-Top-10 vulnerabilities.</pluginDescription>
          </configuration>
      </plugin>
    </plugins>
  </build>

现在,根据我读过的所有内容,我应该能够构建项目(右键单击项目 > 运行方式 > Maven 构建(目标为“包”)并将生成的 .jar 放入 SONAR_HOME/扩展/插件,当我重新启动服务器时,规则(和存储库)应该在那里。但是,无论我尝试什么,它都不存在。我花了几个小时梳理互联网并尝试我找到的任何东西,但规则永远不会出现在 UI 中。

我错过了什么吗?我做错了什么吗?我的代码是否不正确或遗漏了什么?

感谢您阅读这篇怪物帖子。您的任何建议都很有价值,因为我没有想法。

【问题讨论】:

  • 我是 java 插件的主要维护者。我们对您在 OWASP 方面所做的工作非常感兴趣,因为我们还希望针对 Owasp 前 10 条规则(您可能已经注意到)。您介意与 sonarqube@googlegroups.com 联系,以便我们讨论您想要实现的目标吗?
  • 关于您的问题:您是否尝试从示例项目开始并使其工作?您介意分享您的资源吗?

标签: java eclipse maven sonarqube


【解决方案1】:

代码的结构似乎适合我(或多或少)。 在 SecurityPlugin 类中,您返回许多类(JavaClasspath.class、JavaTestClasspath.class 等等)......它们是干什么用的?他们实施/扩展什么? 根据我的经验,您需要返回那里: - “RulesDefinition”(查看 SonarQube 中的规则)和 - CheckRegistrar(让检查被使用)。 也许我的小规则项目会给你一些想法(https://github.com/arxes-tolina/sonar-plugins;一条规则有两个检查)。 如果您仍在为规则而苦恼,请尝试将 sonar.log.level-property (./conf/sonar.properties) 设置为 DEBUG 并观察 SonarQube 的启动情况。

【讨论】:

    猜你喜欢
    • 2014-04-22
    • 2016-12-22
    • 2014-07-19
    • 2015-08-28
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多