@@ -63,6 +63,80 @@ class SQLiteSwiftSqlSink extends SqlSink {
63
63
}
64
64
}
65
65
66
+ /** A sink for the GRDB library. */
67
+ class GrdbSqlSink extends SqlSink {
68
+ GrdbSqlSink ( ) {
69
+ exists ( CallExpr call , MethodDecl method |
70
+ call .getStaticTarget ( ) = method and
71
+ call .getArgument ( 0 ) .getExpr ( ) = this .asExpr ( )
72
+ |
73
+ method
74
+ .hasQualifiedName ( "Database" ,
75
+ [
76
+ "allStatements(sql:arguments:)" , "cachedStatement(sql:)" ,
77
+ "internalCachedStatement(sql:)" , "execute(sql:arguments:)" , "makeStatement(sql:)" ,
78
+ "makeStatement(sql:prepFlags:)"
79
+ ] )
80
+ or
81
+ method
82
+ .hasQualifiedName ( "SQLRequest" ,
83
+ [
84
+ "init(stringLiteral:)" , "init(unicodeScalarLiteral:)" ,
85
+ "init(extendedGraphemeClusterLiteral:)" , "init(stringInterpolation:)" ,
86
+ "init(sql:arguments:adapter:cached:)"
87
+ ] )
88
+ or
89
+ method
90
+ .hasQualifiedName ( "SQL" ,
91
+ [
92
+ "init(stringLiteral:)" , "init(unicodeScalarLiteral:)" ,
93
+ "init(extendedGraphemeClusterLiteral:)" , "init(stringInterpolation:)" ,
94
+ "init(sql:arguments:)" , "append(sql:arguments:)"
95
+ ] )
96
+ or
97
+ method
98
+ .hasQualifiedName ( "TableDefinition" , [ "column(sql:)" , "check(sql:)" , "constraint(sql:)" ] )
99
+ or
100
+ method .hasQualifiedName ( "TableAlteration" , "addColumn(sql:)" )
101
+ or
102
+ method
103
+ .hasQualifiedName ( "ColumnDefinition" ,
104
+ [ "check(sql:)" , "defaults(sql:)" , "generatedAs(sql:_:)" ] )
105
+ or
106
+ method
107
+ .hasQualifiedName ( "TableRecord" ,
108
+ [
109
+ "select(sql:arguments:)" , "select(sql:arguments:as:)" , "filter(sql:arguments:)" ,
110
+ "order(sql:arguments:)"
111
+ ] )
112
+ or
113
+ method .hasQualifiedName ( "StatementCache" , "statement(_:)" )
114
+ )
115
+ or
116
+ exists ( CallExpr call , MethodDecl method |
117
+ call .getStaticTarget ( ) = method and
118
+ call .getArgument ( 1 ) .getExpr ( ) = this .asExpr ( )
119
+ |
120
+ method
121
+ .hasQualifiedName ( [ "Row" , "DatabaseValueConvertible" ] ,
122
+ [
123
+ "fetchCursor(_:sql:arguments:adapter:)" , "fetchAll(_:sql:arguments:adapter:)" ,
124
+ "fetchSet(_:sql:arguments:adapter:)" , "fetchOne(_:sql:arguments:adapter:)"
125
+ ] )
126
+ or
127
+ method .hasQualifiedName ( "SQLStatementCursor" , "init(database:sql:arguments:prepFlags:)" )
128
+ )
129
+ or
130
+ exists ( CallExpr call , MethodDecl method |
131
+ call .getStaticTarget ( ) = method and
132
+ call .getArgument ( 3 ) .getExpr ( ) = this .asExpr ( )
133
+ |
134
+ method
135
+ .hasQualifiedName ( "CommonTableExpression" , "init(recursive:named:columns:sql:arguments:)" )
136
+ )
137
+ }
138
+ }
139
+
66
140
/**
67
141
* A taint configuration for tainted data that reaches a SQL sink.
68
142
*/
0 commit comments