如何在 Sonarqube 自定义规则上使用 Android 类

伊戈尔·阮·加西亚

我正在尝试为 SonarQube Java 插件开发自定义规则,它将在其中分析 Android 代码。我已经创建了一些规​​则来识别 Java 的基本功能,如下例所示:

@Override
public void visitNode(Tree tree){
  MethodInvocationTree method = (MethodInvocationTree) tree;
  Symbol symbol = method.symbol();

  if (symbol.name() != null && symbol.name().equalsIgnoreCase("createTempFile")){
      reportIssue(method.firstToken(), "Criação de arquivo temporário identificada. Analisar!");
  }

}

根据另一个规则,我试图获取使用 SharedPreferences 的代码的所有情况,并且我正在使用以下逻辑:

@Override
public List<Kind> nodesToVisit() {
  return ImmutableList.of(Kind.METHOD_INVOCATION);
}

@Override
public void visitNode(Tree tree){
    MethodInvocationTree kindTree = (MethodInvocationTree) tree;
    Symbol symbol = (Symbol) kindTree.symbol();

    TypeSymbol classe = symbol.owner().enclosingClass();

    if (classe != null && classe.equals("SharedPreferences")){
        reportIssue(kindTree.firstToken(), "SharedPreferences sendo utilizado no código. Analisar!!");
    }

}

当我在 JUnit 上运行测试时,它不起作用。当找到指定的 Kind 时,我已经打印了符号的名称(应该是方法调用的名称)和封闭类。结果是:

====================== Kind Finded ======================
Name >>>>>>>>>>>>>null
Class >>>>>>>>>>>>> !unknownSymbol!

这是另一个文件的示例,它可以毫无问题地打印其他类和方法:

====================== Kind Finded ======================
Name >>>>>>>>>>>>>createTempFile
Class >>>>>>>>>>>>> File
====================== Kind Finded ======================
Name >>>>>>>>>>>>>setReadable
Class >>>>>>>>>>>>> File
====================== Kind Finded ======================
Name >>>>>>>>>>>>>setWritable
Class >>>>>>>>>>>>> File
====================== Kind Finded ======================
Name >>>>>>>>>>>>>write
Class >>>>>>>>>>>>> Writer

似乎在我运行测试时,JUnit 或 Maven 无法从代码中识别 Android 类。我已经尝试将 Android lib 和 Sonarqube Android 插件的 jar 导入到我的项目中,但没有成功。

这是我正在测试的目标文件(是的,我也尝试在目标中导入我的规则代码包,但没有成功。我认为值得尝试):

package jakhar.aseem.diva;

import org.sonar.template.java.checks.SharedPreferencesCheck;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;


public class InsecureDataStorage1Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insecure_data_storage1);
    }

    public void saveCredentials(View view) {
        SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this); 
        SharedPreferences.Editor spedit = spref.edit(); // Noncompliant
        EditText usr = (EditText) findViewById(R.id.ids1Usr);
        EditText pwd = (EditText) findViewById(R.id.ids1Pwd);

        spedit.putString("user", usr.getText().toString());
        spedit.putString("password", pwd.getText().toString());
        spedit.commit();

        Toast.makeText(this,"3rd party credentials saved successfully!", Toast.LENGTH_SHORT).show();
    }
}

所以问题是:如何让测试识别 Android 类并验证我的规则?

我正在使用 SonarQube 文档中的以下模板来制定规则:https ://docs.sonarqube.org/display/PLUG/Writing+Custom+Java+Rules+101

任何帮助,我将不胜感激。

从现在开始,感谢您的关注。

- - - - - - - - - - 编辑 - - - - - - - - - -

我已经向 Maven 添加了一些 android 依赖项,但仍然无法正常工作。按照我的项目的 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.sonar.samples</groupId>
<artifactId>java-custom-rules-template</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>sonar-plugin</packaging>

<properties>
    <sonar.version>5.6.3</sonar.version>
    <java.plugin.version>4.2.1.6971</java.plugin.version>
    <sslr.version>1.21</sslr.version>
</properties>

<name>Berghem Custom Rules</name>
<description>Criação de Rules Customizadas para avaliação de códigos Java</description>

<dependencies>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->

    <dependency>
        <groupId>org.sonarsource.sonarqube</groupId>
        <artifactId>sonar-plugin-api</artifactId>
        <version>${sonar.version}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.sonarsource.java</groupId>
        <artifactId>sonar-java-plugin</artifactId>
        <type>sonar-plugin</type>
        <version>${java.plugin.version}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.sonarsource.java</groupId>
        <artifactId>java-frontend</artifactId>
        <version>${java.plugin.version}</version>
    </dependency>

    <dependency>
        <groupId>org.sonarsource.sslr-squid-bridge</groupId>
        <artifactId>sslr-squid-bridge</artifactId>
        <version>2.6.1</version>
        <exclusions>
            <exclusion>
                <groupId>org.codehaus.sonar.sslr</groupId>
                <artifactId>sslr-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.codehaus.sonar</groupId>
                <artifactId>sonar-plugin-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.codehaus.sonar.sslr</groupId>
                <artifactId>sslr-xpath</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>jcl-over-slf4j</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.sonarsource.java</groupId>
        <artifactId>java-checks-testkit</artifactId>
        <version>${java.plugin.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.sonarsource.sslr</groupId>
        <artifactId>sslr-testing-harness</artifactId>
        <version>${sslr.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.6.2</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.easytesting</groupId>
        <artifactId>fest-assert</artifactId>
        <version>1.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>0.9.30</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.android.tools</groupId>
        <artifactId>common</artifactId>
        <version>22.4.2</version>
    </dependency>
    <dependency>
        <groupId>com.android.tools</groupId>
        <artifactId>dvlib</artifactId>
        <version>22.4.2</version>
    </dependency>
    <dependency>
        <groupId>com.android.tools</groupId>
        <artifactId>sdk-common</artifactId>
        <version>22.4.2</version>
    </dependency>
    <dependency>
        <groupId>com.android.tools</groupId>
        <artifactId>sdklib</artifactId>
        <version>22.4.2</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.sonar</groupId>
        <artifactId>sonar-check-api</artifactId>
        <version>4.5.1</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.sonar-plugins.java</groupId>
        <artifactId>java-checks</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>org.sonarsource.java</groupId>
        <artifactId>java-checks</artifactId>
        <version>4.2.1.6971</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.sonar.sslr-squid-bridge</groupId>
        <artifactId>sslr-squid-bridge</artifactId>
        <version>2.6</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.sonar</groupId>
        <artifactId>sonar-plugin-api</artifactId>
        <version>4.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.android.tools.lint</groupId>
        <artifactId>lint-checks</artifactId>
        <version>22.4.2</version>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>19.0</version>
    </dependency>
    <dependency>
        <groupId>com.android.tools.lint</groupId>
        <artifactId>lint-api</artifactId>
        <version>22.4.2</version>
    </dependency>
    <dependency>
        <groupId>com.android.tools.lint</groupId>
        <artifactId>lint</artifactId>
        <version>22.4.2</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.sonarsource.sonar-packaging-maven-plugin</groupId>
            <artifactId>sonar-packaging-maven-plugin</artifactId>
            <version>1.17</version>
            <extensions>true</extensions>
            <configuration>
                <pluginKey>java-template-custom</pluginKey>
                <pluginName>Java Template Custom Rules</pluginName>
                <pluginClass>org.sonar.template.java.JavaCustomRulesPlugin</pluginClass>
                <sonarLintSupported>true</sonarLintSupported>
                <sonarQubeMinVersion>5.6</sonarQubeMinVersion> <!-- allow to depend on API 6.x but run on LTS -->
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

伊戈尔·阮·加西亚

知道了!

问题在于 SonarQube 的依赖项的导入。我在 pom.xml 上添加了很多 Android 依赖项,并在更改后进行测试。在此之后,仍然无法正常工作。在一些搜索中,我发现负责解释类的是 android-maven-plugin。当我通过 Eclipse 的 pom 接口导入时,总是收到一些错误消息,说缺少某些 arctifacts。出现这个问题是因为远程依赖损坏或不存在,所以我从依赖下载了jar文件并创建了一个文件target/test-jars有了这个,maven 识别外部依赖项并通过 JUnit 继续测试。

为了验证信息,我在规则检查文件中打印了类的属性:

package org.sonar.template.java.checks;

import com.google.common.collect.ImmutableList;

import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.plugins.java.api.semantic.Symbol;
import org.sonar.plugins.java.api.semantic.Symbol.TypeSymbol;
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
import org.sonar.plugins.java.api.tree.*;
import org.sonar.plugins.java.api.tree.Tree.Kind;

import java.util.List;

@Rule(
    key = "SharedPreferencesRule",
    name = "Utilização de SharedPreferences no código",
    description = "Para cada utilização de SharedPreferences, é feito um alerta para revisar o que está sendo armazenado.",
    priority = Priority.CRITICAL,
    tags = {"attention point", "security"})
public class SharedPreferencesCheck extends IssuableSubscriptionVisitor {

    @Override
  public List<Kind> nodesToVisit() {
    return ImmutableList.of(Kind.METHOD_INVOCATION);
  }

  @Override
  public void visitNode(Tree tree){
      System.out.println("====================== Kind Finded ======================");

      MethodInvocationTree kindTree = (MethodInvocationTree) tree;

      Symbol symbol = (Symbol) kindTree.symbol();

      TypeSymbol classe = symbol.owner().enclosingClass();

      System.out.println("Name >>>>>>>>>>>>> " + symbol.name());
      System.out.println("Enclosing >>>>>>>>>>>>> " + classe);

      if (classe != null && classe.equals("SharedPreferences")){
          reportIssue(kindTree.firstToken(), "SharedPreferences sendo utilizado no código. Analisar!!");
      }

  }
}

我希望它可以帮助正在经历相同或类似问题的人。

如果有人可以给出更好的解释,那将非常有帮助。

非常感谢!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Android的多个屏幕上使用一个自定义适配器类?

来自分类Dev

如何在Android的多个屏幕上使用一个自定义适配器类?

来自分类Dev

如何访问 SonarQube 自定义规则中的后代节点?

来自分类Dev

如何在Nestjs中使用自定义类文件维护Nestjs的规则

来自分类Dev

如何在SonarQube 5.1.1中定义自定义编码规则?

来自分类Dev

如何在Android中的自定义dapter类中使用或实例化Sqlite Database Helper类实例?

来自分类Dev

如何在SonarQube 4.5的插件中注册自定义规则?

来自分类Dev

如何在SonarQube 4.5的插件中注册自定义规则?

来自分类Dev

如何使用自定义的规则严重性设置从SonarQube下载Visual Studio的最新SonarLint规则集?

来自分类Dev

如何在活动类中使用自定义类(扩展了View类)以绘制路径而不更改android中主布局的其他部分

来自分类Dev

如何在视觉上自定义SonarQube?

来自分类Dev

如何在自定义类上使用ActiveModel的验证和回调?

来自分类Dev

Android:如何在自定义类中从strings.xml访问字符串数组?

来自分类Dev

如何在自定义Android键盘中更改KeyboardView类中键的颜色?

来自分类Dev

Android:如何在自定义类中从strings.xml访问字符串数组?

来自分类Dev

如何在Android Studio中将ImageView添加到自定义视图类中?

来自分类Dev

如何在TinyMCE 4中的自定义按钮上添加自定义类addButton()

来自分类Dev

如何在动态编译中使用自定义类

来自分类Dev

如何在自定义类中使用Dask

来自分类Dev

如何在Silex的自定义类中使用$ app?

来自分类Dev

如何替换/自定义Android API类?

来自分类Dev

Android:如何从自定义视图的超类获取属性

来自分类Dev

如何替换/自定义Android API类?

来自分类Dev

使用AIDL编写Android服务时如何为客户端分配自定义类

来自分类Dev

如何在Android上显示自定义地图

来自分类Dev

SonarQube Java插件自定义规则

来自分类Dev

SonarQube Java插件自定义规则

来自分类Dev

Sonarqube:鱿鱼规则自定义/抑制

来自分类Dev

SonarQube 中的自定义 TypeScript 规则

Related 相关文章

  1. 1

    如何在Android的多个屏幕上使用一个自定义适配器类?

  2. 2

    如何在Android的多个屏幕上使用一个自定义适配器类?

  3. 3

    如何访问 SonarQube 自定义规则中的后代节点?

  4. 4

    如何在Nestjs中使用自定义类文件维护Nestjs的规则

  5. 5

    如何在SonarQube 5.1.1中定义自定义编码规则?

  6. 6

    如何在Android中的自定义dapter类中使用或实例化Sqlite Database Helper类实例?

  7. 7

    如何在SonarQube 4.5的插件中注册自定义规则?

  8. 8

    如何在SonarQube 4.5的插件中注册自定义规则?

  9. 9

    如何使用自定义的规则严重性设置从SonarQube下载Visual Studio的最新SonarLint规则集?

  10. 10

    如何在活动类中使用自定义类(扩展了View类)以绘制路径而不更改android中主布局的其他部分

  11. 11

    如何在视觉上自定义SonarQube?

  12. 12

    如何在自定义类上使用ActiveModel的验证和回调?

  13. 13

    Android:如何在自定义类中从strings.xml访问字符串数组?

  14. 14

    如何在自定义Android键盘中更改KeyboardView类中键的颜色?

  15. 15

    Android:如何在自定义类中从strings.xml访问字符串数组?

  16. 16

    如何在Android Studio中将ImageView添加到自定义视图类中?

  17. 17

    如何在TinyMCE 4中的自定义按钮上添加自定义类addButton()

  18. 18

    如何在动态编译中使用自定义类

  19. 19

    如何在自定义类中使用Dask

  20. 20

    如何在Silex的自定义类中使用$ app?

  21. 21

    如何替换/自定义Android API类?

  22. 22

    Android:如何从自定义视图的超类获取属性

  23. 23

    如何替换/自定义Android API类?

  24. 24

    使用AIDL编写Android服务时如何为客户端分配自定义类

  25. 25

    如何在Android上显示自定义地图

  26. 26

    SonarQube Java插件自定义规则

  27. 27

    SonarQube Java插件自定义规则

  28. 28

    Sonarqube:鱿鱼规则自定义/抑制

  29. 29

    SonarQube 中的自定义 TypeScript 规则

热门标签

归档