@@ -70,9 +70,30 @@ private module TextFieldTrackingConfig implements DataFlow::ConfigSig {
70
70
predicate isBarrierIn ( DataFlow:: Node node ) { isSource ( node ) }
71
71
}
72
72
73
- /** Holds if the given may be masked. */
73
+ /** A local flow step that also flows through access to fields containing `View`s */
74
+ private predicate localViewFieldFlowStep ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
75
+ DataFlow:: localFlowStep ( node1 , node2 )
76
+ or
77
+ exists ( Field f |
78
+ f .getType ( ) .( Class ) .getASupertype * ( ) .hasQualifiedName ( "android.view" , "View" ) and
79
+ node1 .asExpr ( ) = f .getAnAccess ( ) .( FieldWrite ) .getASource ( ) and
80
+ node2 .asExpr ( ) = f .getAnAccess ( ) .( FieldRead )
81
+ )
82
+ }
83
+
84
+ /** Holds if data can flow from `node1` to `node2` with local flow steps as well as flow through fields containing `View`s */
85
+ private predicate localViewFieldFlow ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
86
+ localViewFieldFlowStep * ( node1 , node2 )
87
+ }
88
+
89
+ /** Holds if data can flow from `e1` to `e2` with local flow steps as well as flow through fields containing `View`s */
90
+ private predicate localViewFieldExprFlow ( Expr e1 , Expr e2 ) {
91
+ localViewFieldFlow ( DataFlow:: exprNode ( e1 ) , DataFlow:: exprNode ( e2 ) )
92
+ }
93
+
94
+ /** Holds if the given view may be properly masked. */
74
95
private predicate viewIsMasked ( AndroidLayoutXmlElement view ) {
75
- DataFlow :: localExprFlow ( getAUseOfViewWithId ( view .getId ( ) ) , any ( MaskCall mcall ) .getQualifier ( ) )
96
+ localViewFieldExprFlow ( getAUseOfViewWithId ( view .getId ( ) ) , any ( MaskCall mcall ) .getQualifier ( ) )
76
97
or
77
98
view .getAttribute ( "inputType" )
78
99
.( AndroidXmlAttribute )
@@ -83,10 +104,10 @@ private predicate viewIsMasked(AndroidLayoutXmlElement view) {
83
104
[ "invisible" , "gone" ]
84
105
}
85
106
86
- /** Holds if the qualifier of `call` is also called with a method that may mask the information displayed . */
107
+ /** Holds if the qualifier of `call` may be properly masked . */
87
108
private predicate setTextCallIsMasked ( SetTextCall call ) {
88
109
exists ( AndroidLayoutXmlElement view |
89
- DataFlow :: localExprFlow ( getAUseOfViewWithId ( view .getId ( ) ) , call .getQualifier ( ) ) and
110
+ localViewFieldExprFlow ( getAUseOfViewWithId ( view .getId ( ) ) , call .getQualifier ( ) ) and
90
111
viewIsMasked ( view .getParent * ( ) )
91
112
)
92
113
}
0 commit comments