@@ -2,55 +2,174 @@ package checks
2
2
3
3
import android.webkit.WebSettings
4
4
5
- private const val MY_TRUE = true
5
+ private val topLevelTrueVal = true
6
+ private var topLevelTrueVar = true
6
7
7
8
class WebViewsFileAccessCheckSample {
8
- fun foo (settings : WebSettings , value : Boolean ) {
9
+
10
+ private val classLevelTrueVal = true
11
+ private var classLevelTrueVar = true
12
+
13
+ // region non compliant scenarios
14
+
15
+ fun setPropertiesToTrue (settings : WebSettings ) {
9
16
settings.allowFileAccess = true // Noncompliant {{Make sure that enabling file access is safe here.}}
10
- // ^^^^
11
- settings.setAllowFileAccess(MY_TRUE ) // Noncompliant {{Make sure that enabling file access is safe here.}}
12
- // ^^^^^^^
17
+ // ^^^^
18
+ settings.allowFileAccessFromFileURLs = true // Noncompliant
19
+ settings.allowUniversalAccessFromFileURLs = true // Noncompliant
20
+ settings.allowContentAccess = true // Noncompliant
21
+ }
13
22
14
- settings.allowFileAccess = false // Compliant
15
- settings.setAllowFileAccess(false ) // Compliant
16
- settings.allowFileAccess = value // Compliant
17
- settings.setAllowFileAccess(value) // Compliant
23
+ fun setPropertiesToTrueVal (settings : WebSettings ) {
24
+ val trueVal = true
25
+ settings.allowFileAccess = trueVal // Noncompliant
26
+ settings.allowFileAccessFromFileURLs = trueVal // Noncompliant
27
+ settings.allowUniversalAccessFromFileURLs = trueVal // Noncompliant
28
+ settings.allowContentAccess = trueVal // Noncompliant
18
29
19
- settings.allowContentAccess = true // Noncompliant {{Make sure that enabling file access is safe here.}}
20
- // ^^^^
21
- settings.setAllowContentAccess(true ) // Noncompliant {{Make sure that enabling file access is safe here.}}
22
- // ^^^^
30
+ settings.allowFileAccess = topLevelTrueVal // Noncompliant
31
+ settings.allowFileAccess = classLevelTrueVal // Noncompliant
32
+ }
23
33
24
- settings.allowContentAccess = false // Compliant
25
- settings.setAllowContentAccess(false ) // Compliant
26
- settings.allowContentAccess = value // Compliant
27
- settings.setAllowContentAccess(value) // Compliant
34
+ fun setPropertiesToTrueVar (settings : WebSettings ) {
35
+ var trueVar = true
36
+ settings.allowFileAccess = trueVar // FN, trueVar may have been changed since previous assignment
37
+ settings.allowFileAccessFromFileURLs = trueVar // FN, trueVar may have been changed since previous assignment
38
+ settings.allowUniversalAccessFromFileURLs = trueVar // FN, trueVar may have been changed since previous assignment
39
+ settings.allowContentAccess = trueVar // FN, trueVar may have been changed since previous assignment
28
40
29
- settings.allowFileAccessFromFileURLs = true // Noncompliant {{Make sure that enabling file access is safe here.}}
30
- // ^^^^
31
- settings.setAllowFileAccessFromFileURLs(true ) // Noncompliant {{Make sure that enabling file access is safe here.}}
32
- // ^^^^
41
+ settings.allowFileAccess = topLevelTrueVar // FN, topLevelTrueVar may have been changed since top-level assignment
42
+ settings.allowFileAccess = classLevelTrueVar // FN, classLevelTrueVar may have been changed since instance init
43
+ }
33
44
34
- settings.allowFileAccessFromFileURLs = false // Compliant
35
- settings.setAllowFileAccessFromFileURLs(false ) // Compliant
36
- settings.allowFileAccessFromFileURLs = value // Compliant
37
- settings.setAllowFileAccessFromFileURLs(value) // Compliant
45
+ fun usingSettersWithTrue (settings : WebSettings ) {
46
+ settings.setAllowFileAccess(true ) // Noncompliant
47
+ // ^^^^
48
+ settings.setAllowFileAccessFromFileURLs(true ) // Noncompliant
49
+ settings.setAllowUniversalAccessFromFileURLs(true ) // Noncompliant
50
+ settings.setAllowContentAccess(true ) // Noncompliant
51
+ }
38
52
39
- settings.allowUniversalAccessFromFileURLs = true // Noncompliant {{Make sure that enabling file access is safe here.}}
40
- // ^^^^
41
- settings.setAllowUniversalAccessFromFileURLs(true ) // Noncompliant {{Make sure that enabling file access is safe here.}}
42
- // ^^^^
53
+ fun usingApplyWithTrue (settings : WebSettings ) {
54
+ settings.apply {
55
+ allowFileAccess = true // Noncompliant
56
+ // ^^^^
57
+ allowFileAccessFromFileURLs = true // Noncompliant
58
+ allowUniversalAccessFromFileURLs = true // Noncompliant
59
+ allowContentAccess = true // Noncompliant
60
+ }
61
+ }
43
62
44
- settings.allowUniversalAccessFromFileURLs = false // Compliant
45
- settings.setAllowUniversalAccessFromFileURLs(false ) // Compliant
46
- settings.allowUniversalAccessFromFileURLs = value // Compliant
47
- settings.setAllowUniversalAccessFromFileURLs(value) // Compliant
63
+ fun usingSettersWithTrueViaApply (settings : WebSettings ) {
64
+ settings.apply {
65
+ setAllowFileAccess(true ) // Noncompliant
66
+ // ^^^^
67
+ setAllowFileAccessFromFileURLs(true ) // Noncompliant
68
+ setAllowUniversalAccessFromFileURLs(true ) // Noncompliant
69
+ setAllowContentAccess(true ) // Noncompliant
70
+ }
71
+ }
72
+
73
+ fun usingWithWithTrue (settings : WebSettings ) {
74
+ with (settings) {
75
+ allowFileAccess = true // Noncompliant
76
+ // ^^^^
77
+ allowFileAccessFromFileURLs = true // Noncompliant
78
+ allowUniversalAccessFromFileURLs = true // Noncompliant
79
+ allowContentAccess = true // Noncompliant
80
+ }
81
+ }
82
+
83
+ fun usingLetWithTrue (settings : WebSettings ) {
84
+ settings.let {
85
+ it.allowFileAccess = true // Noncompliant
86
+ // ^^^^
87
+ it.allowFileAccessFromFileURLs = true // Noncompliant
88
+ it.allowUniversalAccessFromFileURLs = true // Noncompliant
89
+ it.allowContentAccess = true // Noncompliant
90
+ }
48
91
}
49
92
50
- fun coverage (a : Boolean ) {
51
- var x = false
52
- if (a != true ) {
53
- x = true
93
+ fun usingSafeCallToLetWithTrue (settings : WebSettings ? ) {
94
+ settings?.let { namedIt ->
95
+ namedIt.allowFileAccess = true // Noncompliant
96
+ namedIt.allowFileAccessFromFileURLs = true // Noncompliant
97
+ namedIt.allowUniversalAccessFromFileURLs = true // Noncompliant
98
+ namedIt.allowContentAccess = true // Noncompliant
54
99
}
55
100
}
101
+
102
+ fun assigningFunToAnotherFun (settings : WebSettings ) {
103
+ val fun1 = settings::setAllowFileAccess
104
+ fun1(true ) // FN, requires data flow analysis
105
+ }
106
+
107
+ fun assigningConstantBooleanExpression (settings : WebSettings ) {
108
+ settings.allowFileAccess = true || false // FN, requires resolving complex constant expressions
109
+ }
110
+
111
+ // endregion
112
+
113
+ // region compliant scenarios
114
+
115
+ fun getProperties (settings : WebSettings ) {
116
+ val allowFileAccess = settings.allowFileAccess // Compliant
117
+ val allowFileAccessFromFileURLs = settings.allowFileAccessFromFileURLs // Compliant
118
+ val allowUniversalAccessFromFileURLs = settings.allowUniversalAccessFromFileURLs // Compliant
119
+ val allowContentAccess = settings.allowContentAccess // Compliant
120
+ }
121
+
122
+ fun toggleProperties (settings : WebSettings ) {
123
+ settings.allowFileAccess = ! settings.allowFileAccess // Compliant
124
+ settings.allowFileAccessFromFileURLs = ! settings.allowFileAccessFromFileURLs // Compliant
125
+ settings.allowUniversalAccessFromFileURLs = ! settings.allowUniversalAccessFromFileURLs // Compliant
126
+ settings.allowContentAccess = ! settings.allowContentAccess // Compliant
127
+ }
128
+
129
+ fun setPropertiesToFalse (settings : WebSettings ) {
130
+ settings.allowFileAccess = false // Compliant
131
+ settings.allowFileAccessFromFileURLs = false // Compliant
132
+ settings.allowUniversalAccessFromFileURLs = false // Compliant
133
+ settings.allowContentAccess = false // Compliant
134
+ }
135
+
136
+ fun setPropertiesToFalseVal (settings : WebSettings ) {
137
+ val falseVal = false
138
+ settings.allowFileAccess = falseVal // Compliant, guaranteed to be false
139
+ settings.allowFileAccessFromFileURLs = falseVal // Compliant, guaranteed to be false
140
+ settings.allowUniversalAccessFromFileURLs = falseVal // Compliant, guaranteed to be false
141
+ settings.allowContentAccess = falseVal // Compliant, guaranteed to be false
142
+ }
143
+
144
+ fun setPropertiesToFalseVar (settings : WebSettings ) {
145
+ var falseVar = false
146
+ settings.allowFileAccess = falseVar // Compliant, value may still be false
147
+ settings.allowFileAccessFromFileURLs = falseVar // Compliant, value may still be false
148
+ settings.allowUniversalAccessFromFileURLs = falseVar // Compliant, value may still be false
149
+ settings.allowContentAccess = falseVar // Compliant, value may still be false
150
+ }
151
+
152
+ fun setPropertiesToBooleanParam (settings : WebSettings , value : Boolean ) {
153
+ settings.allowFileAccess = value // Compliant, value may be false
154
+ settings.allowFileAccessFromFileURLs = value // Compliant, value may be false
155
+ settings.allowUniversalAccessFromFileURLs = value // Compliant, value may be false
156
+ settings.allowContentAccess = value // Compliant, value may be false
157
+ }
158
+
159
+ fun usingSettersWithFalse (settings : WebSettings ) {
160
+ settings.setAllowFileAccess(false ) // Compliant, value is false
161
+ settings.setAllowFileAccessFromFileURLs(false ) // Compliant, value is false
162
+ settings.setAllowUniversalAccessFromFileURLs(false ) // Compliant, value is false
163
+ settings.setAllowContentAccess(false ) // Compliant, value is false
164
+ }
165
+
166
+ fun notAWebSettingsObject (settings : NotAWebSettings ) {
167
+ settings.allowFileAccess = true // Compliant, not a WebSettings object from android.webkit
168
+ }
169
+
170
+ class NotAWebSettings {
171
+ var allowFileAccess: Boolean = false
172
+ }
173
+
174
+ // endregion
56
175
}
0 commit comments