Loading tools/lint/framework/checks/src/main/java/com/google/android/lint/AndroidFrameworkIssueRegistry.kt +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ class AndroidFrameworkIssueRegistry : IssueRegistry() { EnforcePermissionDetector.ISSUE_MISSING_ENFORCE_PERMISSION, EnforcePermissionDetector.ISSUE_MISMATCHING_ENFORCE_PERMISSION, EnforcePermissionHelperDetector.ISSUE_ENFORCE_PERMISSION_HELPER, SimpleManualPermissionEnforcementDetector.ISSUE_USE_ENFORCE_PERMISSION_ANNOTATION, SimpleManualPermissionEnforcementDetector.ISSUE_SIMPLE_MANUAL_PERMISSION_ENFORCEMENT, SaferParcelChecker.ISSUE_UNSAFE_API_USAGE, PackageVisibilityDetector.ISSUE_PACKAGE_NAME_NO_PACKAGE_VISIBILITY_FILTERS, RegisterReceiverFlagDetector.ISSUE_RECEIVER_EXPORTED_FLAG, Loading tools/lint/global/checks/src/main/java/com/google/android/lint/AndroidGlobalIssueRegistry.kt +1 −1 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ class AndroidGlobalIssueRegistry : IssueRegistry() { EnforcePermissionDetector.ISSUE_MISSING_ENFORCE_PERMISSION, EnforcePermissionDetector.ISSUE_MISMATCHING_ENFORCE_PERMISSION, EnforcePermissionHelperDetector.ISSUE_ENFORCE_PERMISSION_HELPER, SimpleManualPermissionEnforcementDetector.ISSUE_USE_ENFORCE_PERMISSION_ANNOTATION, SimpleManualPermissionEnforcementDetector.ISSUE_SIMPLE_MANUAL_PERMISSION_ENFORCEMENT, ) override val api: Int Loading tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/EnforcePermissionFix.kt +26 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.google.android.lint.aidl import com.android.tools.lint.detector.api.JavaContext import com.android.tools.lint.detector.api.LintFix import com.android.tools.lint.detector.api.Location import com.android.tools.lint.detector.api.getUMethod import com.google.android.lint.hasPermissionNameAnnotation Loading @@ -38,11 +39,34 @@ data class EnforcePermissionFix( val locations: List<Location>, val permissionNames: List<String> ) { val annotation: String fun toLintFix(annotationLocation: Location): LintFix { val removeFixes = this.locations.map { LintFix.create() .replace() .reformat(true) .range(it) .with("") .autoFix() .build() } val annotateFix = LintFix.create() .annotate(this.annotation) .range(annotationLocation) .autoFix() .build() return LintFix.create().composite(annotateFix, *removeFixes.toTypedArray()) } private val annotation: String get() { val quotedPermissions = permissionNames.joinToString(", ") { """"$it"""" } val annotationParameter = if (permissionNames.size > 1) "allOf={$quotedPermissions}" else quotedPermissions if (permissionNames.size > 1) "allOf={$quotedPermissions}" else quotedPermissions return "@$ANNOTATION_ENFORCE_PERMISSION($annotationParameter)" } Loading tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/SimpleManualPermissionEnforcementDetector.kt +12 −23 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import org.jetbrains.uast.UElement import org.jetbrains.uast.UIfExpression import org.jetbrains.uast.UMethod import org.jetbrains.uast.UQualifiedReferenceExpression import org.jetbrains.uast.skipParenthesizedExprDown /** * Looks for methods implementing generated AIDL interface stubs Loading @@ -44,29 +45,16 @@ class SimpleManualPermissionEnforcementDetector : AidlImplementationDetector() { interfaceName: String, body: UBlockExpression ) { val fix = accumulateSimplePermissionCheckFixes(body, context) ?: return val javaRemoveFixes = fix.locations.map { fix() .replace() .reformat(true) .range(it) .with("") .autoFix() .build() } val javaAnnotateFix = fix() .annotate(fix.annotation) .range(context.getLocation(node)) .autoFix() .build() val enforcePermissionFix = accumulateSimplePermissionCheckFixes(body, context) ?: return val lintFix = enforcePermissionFix.toLintFix(context.getLocation(node)) val message = "$interfaceName permission check can be converted to @EnforcePermission annotation" context.report( ISSUE_USE_ENFORCE_PERMISSION_ANNOTATION, fix.locations.last(), "$interfaceName permission check can be converted to @EnforcePermission annotation", fix().composite(*javaRemoveFixes.toTypedArray(), javaAnnotateFix) ISSUE_SIMPLE_MANUAL_PERMISSION_ENFORCEMENT, enforcePermissionFix.locations.last(), message, lintFix ) } Loading @@ -89,7 +77,8 @@ class SimpleManualPermissionEnforcementDetector : AidlImplementationDetector() { EnforcePermissionFix? { val singleFixes = mutableListOf<EnforcePermissionFix>() for (expression in methodBody.expressions) { singleFixes.add(getPermissionCheckFix(expression, context) ?: break) singleFixes.add(getPermissionCheckFix(expression.skipParenthesizedExprDown(), context) ?: break) } return when (singleFixes.size) { 0 -> null Loading Loading @@ -133,7 +122,7 @@ class SimpleManualPermissionEnforcementDetector : AidlImplementationDetector() { """.trimIndent() @JvmField val ISSUE_USE_ENFORCE_PERMISSION_ANNOTATION = Issue.create( val ISSUE_SIMPLE_MANUAL_PERMISSION_ENFORCEMENT = Issue.create( id = "SimpleManualPermissionEnforcement", briefDescription = "Manual permission check can be @EnforcePermission annotation", explanation = EXPLANATION, Loading tools/lint/global/checks/src/test/java/com/google/android/lint/aidl/SimpleManualPermissionEnforcementDetectorTest.kt +67 −68 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package com.google.android.lint.aidl import com.android.tools.lint.checks.infrastructure.LintDetectorTest import com.android.tools.lint.checks.infrastructure.TestLintTask import com.android.tools.lint.checks.infrastructure.TestMode import com.android.tools.lint.detector.api.Detector import com.android.tools.lint.detector.api.Issue Loading @@ -27,7 +26,7 @@ class SimpleManualPermissionEnforcementDetectorTest : LintDetectorTest() { override fun getDetector(): Detector = SimpleManualPermissionEnforcementDetector() override fun getIssues(): List<Issue> = listOf( SimpleManualPermissionEnforcementDetector .ISSUE_USE_ENFORCE_PERMISSION_ANNOTATION .ISSUE_SIMPLE_MANUAL_PERMISSION_ENFORCEMENT ) override fun lint(): TestLintTask = super.lint().allowMissingSdk() Loading Loading @@ -217,7 +216,7 @@ class SimpleManualPermissionEnforcementDetectorTest : LintDetectorTest() { } fun testPermissionHelper() { lint().skipTestModes(TestMode.PARENTHESIZED).files( lint().files( java( """ import android.content.Context; Loading Loading @@ -261,7 +260,7 @@ class SimpleManualPermissionEnforcementDetectorTest : LintDetectorTest() { } fun testPermissionHelperAllOf() { lint().skipTestModes(TestMode.PARENTHESIZED).files( lint().files( java( """ import android.content.Context; Loading Loading @@ -309,7 +308,7 @@ class SimpleManualPermissionEnforcementDetectorTest : LintDetectorTest() { fun testPermissionHelperNested() { lint().skipTestModes(TestMode.PARENTHESIZED).files( lint().files( java( """ import android.content.Context; Loading Loading
tools/lint/framework/checks/src/main/java/com/google/android/lint/AndroidFrameworkIssueRegistry.kt +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ class AndroidFrameworkIssueRegistry : IssueRegistry() { EnforcePermissionDetector.ISSUE_MISSING_ENFORCE_PERMISSION, EnforcePermissionDetector.ISSUE_MISMATCHING_ENFORCE_PERMISSION, EnforcePermissionHelperDetector.ISSUE_ENFORCE_PERMISSION_HELPER, SimpleManualPermissionEnforcementDetector.ISSUE_USE_ENFORCE_PERMISSION_ANNOTATION, SimpleManualPermissionEnforcementDetector.ISSUE_SIMPLE_MANUAL_PERMISSION_ENFORCEMENT, SaferParcelChecker.ISSUE_UNSAFE_API_USAGE, PackageVisibilityDetector.ISSUE_PACKAGE_NAME_NO_PACKAGE_VISIBILITY_FILTERS, RegisterReceiverFlagDetector.ISSUE_RECEIVER_EXPORTED_FLAG, Loading
tools/lint/global/checks/src/main/java/com/google/android/lint/AndroidGlobalIssueRegistry.kt +1 −1 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ class AndroidGlobalIssueRegistry : IssueRegistry() { EnforcePermissionDetector.ISSUE_MISSING_ENFORCE_PERMISSION, EnforcePermissionDetector.ISSUE_MISMATCHING_ENFORCE_PERMISSION, EnforcePermissionHelperDetector.ISSUE_ENFORCE_PERMISSION_HELPER, SimpleManualPermissionEnforcementDetector.ISSUE_USE_ENFORCE_PERMISSION_ANNOTATION, SimpleManualPermissionEnforcementDetector.ISSUE_SIMPLE_MANUAL_PERMISSION_ENFORCEMENT, ) override val api: Int Loading
tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/EnforcePermissionFix.kt +26 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.google.android.lint.aidl import com.android.tools.lint.detector.api.JavaContext import com.android.tools.lint.detector.api.LintFix import com.android.tools.lint.detector.api.Location import com.android.tools.lint.detector.api.getUMethod import com.google.android.lint.hasPermissionNameAnnotation Loading @@ -38,11 +39,34 @@ data class EnforcePermissionFix( val locations: List<Location>, val permissionNames: List<String> ) { val annotation: String fun toLintFix(annotationLocation: Location): LintFix { val removeFixes = this.locations.map { LintFix.create() .replace() .reformat(true) .range(it) .with("") .autoFix() .build() } val annotateFix = LintFix.create() .annotate(this.annotation) .range(annotationLocation) .autoFix() .build() return LintFix.create().composite(annotateFix, *removeFixes.toTypedArray()) } private val annotation: String get() { val quotedPermissions = permissionNames.joinToString(", ") { """"$it"""" } val annotationParameter = if (permissionNames.size > 1) "allOf={$quotedPermissions}" else quotedPermissions if (permissionNames.size > 1) "allOf={$quotedPermissions}" else quotedPermissions return "@$ANNOTATION_ENFORCE_PERMISSION($annotationParameter)" } Loading
tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/SimpleManualPermissionEnforcementDetector.kt +12 −23 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import org.jetbrains.uast.UElement import org.jetbrains.uast.UIfExpression import org.jetbrains.uast.UMethod import org.jetbrains.uast.UQualifiedReferenceExpression import org.jetbrains.uast.skipParenthesizedExprDown /** * Looks for methods implementing generated AIDL interface stubs Loading @@ -44,29 +45,16 @@ class SimpleManualPermissionEnforcementDetector : AidlImplementationDetector() { interfaceName: String, body: UBlockExpression ) { val fix = accumulateSimplePermissionCheckFixes(body, context) ?: return val javaRemoveFixes = fix.locations.map { fix() .replace() .reformat(true) .range(it) .with("") .autoFix() .build() } val javaAnnotateFix = fix() .annotate(fix.annotation) .range(context.getLocation(node)) .autoFix() .build() val enforcePermissionFix = accumulateSimplePermissionCheckFixes(body, context) ?: return val lintFix = enforcePermissionFix.toLintFix(context.getLocation(node)) val message = "$interfaceName permission check can be converted to @EnforcePermission annotation" context.report( ISSUE_USE_ENFORCE_PERMISSION_ANNOTATION, fix.locations.last(), "$interfaceName permission check can be converted to @EnforcePermission annotation", fix().composite(*javaRemoveFixes.toTypedArray(), javaAnnotateFix) ISSUE_SIMPLE_MANUAL_PERMISSION_ENFORCEMENT, enforcePermissionFix.locations.last(), message, lintFix ) } Loading @@ -89,7 +77,8 @@ class SimpleManualPermissionEnforcementDetector : AidlImplementationDetector() { EnforcePermissionFix? { val singleFixes = mutableListOf<EnforcePermissionFix>() for (expression in methodBody.expressions) { singleFixes.add(getPermissionCheckFix(expression, context) ?: break) singleFixes.add(getPermissionCheckFix(expression.skipParenthesizedExprDown(), context) ?: break) } return when (singleFixes.size) { 0 -> null Loading Loading @@ -133,7 +122,7 @@ class SimpleManualPermissionEnforcementDetector : AidlImplementationDetector() { """.trimIndent() @JvmField val ISSUE_USE_ENFORCE_PERMISSION_ANNOTATION = Issue.create( val ISSUE_SIMPLE_MANUAL_PERMISSION_ENFORCEMENT = Issue.create( id = "SimpleManualPermissionEnforcement", briefDescription = "Manual permission check can be @EnforcePermission annotation", explanation = EXPLANATION, Loading
tools/lint/global/checks/src/test/java/com/google/android/lint/aidl/SimpleManualPermissionEnforcementDetectorTest.kt +67 −68 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package com.google.android.lint.aidl import com.android.tools.lint.checks.infrastructure.LintDetectorTest import com.android.tools.lint.checks.infrastructure.TestLintTask import com.android.tools.lint.checks.infrastructure.TestMode import com.android.tools.lint.detector.api.Detector import com.android.tools.lint.detector.api.Issue Loading @@ -27,7 +26,7 @@ class SimpleManualPermissionEnforcementDetectorTest : LintDetectorTest() { override fun getDetector(): Detector = SimpleManualPermissionEnforcementDetector() override fun getIssues(): List<Issue> = listOf( SimpleManualPermissionEnforcementDetector .ISSUE_USE_ENFORCE_PERMISSION_ANNOTATION .ISSUE_SIMPLE_MANUAL_PERMISSION_ENFORCEMENT ) override fun lint(): TestLintTask = super.lint().allowMissingSdk() Loading Loading @@ -217,7 +216,7 @@ class SimpleManualPermissionEnforcementDetectorTest : LintDetectorTest() { } fun testPermissionHelper() { lint().skipTestModes(TestMode.PARENTHESIZED).files( lint().files( java( """ import android.content.Context; Loading Loading @@ -261,7 +260,7 @@ class SimpleManualPermissionEnforcementDetectorTest : LintDetectorTest() { } fun testPermissionHelperAllOf() { lint().skipTestModes(TestMode.PARENTHESIZED).files( lint().files( java( """ import android.content.Context; Loading Loading @@ -309,7 +308,7 @@ class SimpleManualPermissionEnforcementDetectorTest : LintDetectorTest() { fun testPermissionHelperNested() { lint().skipTestModes(TestMode.PARENTHESIZED).files( lint().files( java( """ import android.content.Context; Loading