2015-12-09 3 views
3

Я уже довольно давно пытаюсь реализовать собственные собственные правила Java на SonarQube. Однако, похоже, что бы я ни старался, я не могу заставить новое правило отображаться в пользовательском интерфейсе SonarQube.SonarQube: пользовательские правила Java, не видимые в пользовательском интерфейсе

У меня только одно правило в настоящий момент, правило безопасности, которое проверяет, очищается ли текст. Правило расширяет 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(); 
    } 

} 

Как я уже сказал , все они довольно сильно вырваны из примерного плагина, поэтому я понятия не имею, что с ними может быть ошибкой.

Я использую Eclipse с M2E, чтобы попытаться построить плагин. По предложению 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 Build (с целью «пакет») и оставьте полученный .jar в SONAR_HOME/расширения/плагины, и когда я перезапущу сервер, должно быть правило (и репозиторий). что я пытаюсь, это никогда не бывает. Я потратил часы, расчесывая Интернет и пытаясь найти что-либо, но правило никогда не появляется в пользовательском интерфейсе.

Я что-то упустил? Я что-то не так сделал? код неправильный или отсутствует что-нибудь?

Спасибо, что прочитали этот пост монстра. Любой совет, который у вас есть, ценен, поскольку у меня нет идей.

+0

Я ведущий поддерживающий Java-плагин. Мы действительно заинтересованы в том, что вы делаете в отношении OWASP, так как мы также хотим настроить правила Owasp top 10 (как вы могли заметить). Не могли бы вы связаться с [email protected], чтобы мы могли обсудить, чего вы пытаетесь достичь? – benzonico

+0

относительно вашего вопроса: Вы пытались только начать с примера проекта и заставить его работать? Не могли бы вы поделиться своими источниками? – benzonico

ответ

1

Структура кода кажется мне подходящей (более или менее). В классе SecurityPlugin вы возвращаете много классов (JavaClasspath.class, JavaTestClasspath.class и т. Д.) ... Для чего они нужны? Что они реализуют/расширяют? В моем опыте вам нужно вернуться туда: - «Правила определения» (чтобы увидеть правило в SonarQube) и - CheckRegistrar (чтобы использовать чеки). Возможно, мой небольшой проект правил даст вам несколько идей (https://github.com/arxes-tolina/sonar-plugins; одно правило с двумя чеками). Если вы все еще боретесь с правилами, попробуйте установить sonar.log.level-property (./conf/sonar.properties) в DEBUG и посмотреть запуск SonarQube.

Смежные вопросы