16
16
*/
17
17
package org.sonarsource.kotlin.checks
18
18
19
- import org.jetbrains.kotlin.descriptors.PropertyDescriptor
19
+ import org.jetbrains.kotlin.analysis.api.symbols.KaEnumEntrySymbol
20
+ import org.jetbrains.kotlin.idea.references.mainReference
20
21
import org.jetbrains.kotlin.psi.KtCallExpression
21
22
import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
22
23
import org.jetbrains.kotlin.psi.KtExpression
23
24
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
24
25
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
25
- import org.jetbrains.kotlin.resolve.BindingContext
26
- import org.jetbrains.kotlin.resolve.BindingContext.REFERENCE_TARGET
27
- import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull
28
26
import org.sonar.check.Rule
29
27
import org.sonarsource.kotlin.api.checks.AbstractCheck
30
28
import org.sonarsource.kotlin.api.checks.FunMatcher
31
- import org.sonarsource.kotlin.api.reporting.SecondaryLocation
32
- import org.sonarsource.kotlin.api.reporting.KotlinTextRanges.textRange
29
+ import org.sonarsource.kotlin.api.checks.predictRuntimeStringValue
33
30
import org.sonarsource.kotlin.api.frontend.KotlinFileContext
31
+ import org.sonarsource.kotlin.api.reporting.KotlinTextRanges.textRange
32
+ import org.sonarsource.kotlin.api.reporting.SecondaryLocation
33
+ import org.sonarsource.kotlin.api.visiting.withKaSession
34
34
35
- @org.sonarsource.kotlin.api.frontend.K1only
36
35
@Rule(key = " S4423" )
37
36
class WeakSSLContextCheck : AbstractCheck () {
38
37
private val WEAK_FOR_OK_HTTP = setOf (
@@ -66,38 +65,35 @@ class WeakSSLContextCheck : AbstractCheck() {
66
65
}
67
66
68
67
override fun visitCallExpression (node : KtCallExpression , kotlinFileContext : KotlinFileContext ) {
69
- val bindingContext = kotlinFileContext.bindingContext
70
68
when {
71
- SSL_CONTEXT_MATCHER .matches(node, bindingContext ) ->
72
- handleSSL(node, bindingContext, kotlinFileContext)
73
- OKHTTP_MATCHER .matches(node, bindingContext ) ->
74
- handleOkHttp(node, bindingContext, kotlinFileContext)
69
+ SSL_CONTEXT_MATCHER .matches(node) ->
70
+ handleSSL(node, kotlinFileContext)
71
+ OKHTTP_MATCHER .matches(node) ->
72
+ handleOkHttp(node, kotlinFileContext)
75
73
}
76
74
}
77
75
78
76
private fun handleSSL (
79
77
node : KtCallExpression ,
80
- bindingContext : BindingContext ,
81
78
kotlinFileContext : KotlinFileContext ,
82
79
) {
83
80
node.valueArguments
84
81
.firstOrNull()
85
82
?.getArgumentExpression()
86
83
?.let {
87
- if (WEAK_FOR_SSL .contains(it.value(bindingContext )))
84
+ if (WEAK_FOR_SSL .contains(it.value()))
88
85
reportUnsecureSSLContext(listOf (it), kotlinFileContext)
89
86
}
90
87
}
91
88
92
89
private fun handleOkHttp (
93
90
node : KtCallExpression ,
94
- bindingContext : BindingContext ,
95
91
kotlinFileContext : KotlinFileContext ,
96
92
) {
97
93
val unsecureVersions = node.valueArguments
98
94
.mapNotNull { it.getArgumentExpression() }
99
95
.filter {
100
- WEAK_FOR_OK_HTTP .contains(it.value(bindingContext ))
96
+ WEAK_FOR_OK_HTTP .contains(it.value())
101
97
}
102
98
103
99
reportUnsecureSSLContext(unsecureVersions, kotlinFileContext)
@@ -119,21 +115,15 @@ class WeakSSLContextCheck : AbstractCheck() {
119
115
}
120
116
}
121
117
122
- private fun KtExpression.value (
123
- bindingContext : BindingContext ,
124
- ): String? = when (this ) {
125
- is KtStringTemplateExpression -> asConstant()
126
- is KtNameReferenceExpression -> {
127
- val descriptor = bindingContext[REFERENCE_TARGET , this ]
128
- if (descriptor is PropertyDescriptor ) descriptor.compileTimeInitializer?.boxedValue().toString()
129
- else null
130
- }
131
- is KtDotQualifiedExpression -> {
132
- val selectorExpression = selectorExpression
133
- if (selectorExpression is KtNameReferenceExpression )
134
- bindingContext[REFERENCE_TARGET , selectorExpression]?.fqNameOrNull()?.asString()
135
- else null
118
+ private fun KtExpression.value (): String? = withKaSession {
119
+ when (this @value) {
120
+ is KtStringTemplateExpression -> asConstant()
121
+ is KtNameReferenceExpression -> predictRuntimeStringValue()
122
+ is KtDotQualifiedExpression -> {
123
+ (selectorExpression?.mainReference?.resolveToSymbol() as ? KaEnumEntrySymbol )
124
+ ?.callableId?.asSingleFqName()?.asString()
125
+ }
126
+ else -> null
136
127
}
137
- else -> null
138
128
}
139
129
}
0 commit comments