SonarQube:自定义Java规则在UI中不可见



我已经尝试在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{...}

写完规则后,我想测试它,但很快意识到我必须将它封装在一个插件中才能做到这一点。我为此写了三个额外的类,完全基于提供的示例插件。这是基类:

    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();
    }
}

就像我说的,这些都是从示例插件中撕下来的,所以我不知道它们可能出了什么问题。

我正在使用Eclipse和M2E来尝试构建插件。根据文档的"编码插件"页面的建议,我在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>

现在,根据我所读到的内容,我应该能够构建项目(右键单击项目>Run As>Maven build(目标为"package"),并将生成的.jar放入SONAR_HOME/extensions/plugins中,当我重新启动服务器时,规则(和存储库)应该在那里。然而,无论我尝试什么,它都不存在。我花了几个小时在互联网上搜索,尝试我找到的任何东西,但这个规则从未出现在UI中。

我是不是错过了什么?我做错什么了吗?我的代码是错误的还是遗漏了什么?

感谢您阅读这篇怪兽帖。你的任何建议都很有价值,因为我没有主意。

代码的结构似乎对我来说(或多或少)是正确的。在SecurityPlugin类中,您可以返回许多类(JavaClasspath.class、JavaTestClasspath.cclass等)。。。它们是干什么的?他们实施/扩展了什么?在我看来,你需要回到那里:-a"规则定义"(参见SonarQube中的规则)和-CheckRegister(允许使用支票)。也许我的小规则项目会给你一些想法(https://github.com/arxes-tolina/sonar-plugins;一个规则带有两个检查)。如果您仍在与规则作斗争,请尝试将sonar.log.level-property(./conf/sonar.properties)设置为DEBUG,并观看SonarQube的启动。

最新更新