@@ -215,3 +215,53 @@ private class RelativeViewCallFilepath extends NormalizableFilepath {
215
215
/** Holds if this string is the `idx`th path that will be searched for the `vc` call. */
216
216
predicate hasViewCallWithIndex ( ViewCall vc , int idx ) { vc = vc_ and idx = idx_ }
217
217
}
218
+
219
+ /** A subclass of `Microsoft.AspNetCore.Mvc.RazorPages.PageModel` */
220
+ class PageModelClass extends Class {
221
+ PageModelClass ( ) {
222
+ this .getABaseType + ( ) .hasFullyQualifiedName ( "Microsoft.AspNetCore.Mvc.RazorPages" , "PageModel" )
223
+ }
224
+
225
+ /** A handler method such as `OnGetAsync` */
226
+ Method getAHandlerMethod ( ) {
227
+ result = this .getAMethod ( ) and
228
+ result .getName ( ) .matches ( "On%" ) and
229
+ not exists ( Attribute attr |
230
+ attr = result .getAnAttribute ( ) and
231
+ attr .getType ( )
232
+ .hasFullyQualifiedName ( "Microsoft.AspNetCore.Mvc.RazorPages" , "NonHandlerAttribute" )
233
+ )
234
+ }
235
+
236
+ /** Gets the Razor Page that this PageModel refers to. */
237
+ RazorViewClass getPage ( ) {
238
+ exists ( Field modelField |
239
+ modelField .hasName ( "Model" ) and
240
+ modelField .getType ( ) = this and
241
+ modelField .getDeclaringType ( ) = result
242
+ )
243
+ }
244
+ }
245
+
246
+ private MethodCall getAPageCall ( PageModelClass pm ) {
247
+ result .getEnclosingCallable ( ) = pm .getAHandlerMethod ( ) and
248
+ result
249
+ .getTarget ( )
250
+ .hasFullyQualifiedName ( "Microsoft.AspNetCore.Mvc.RazorPages" , "PageModel" ,
251
+ [ "Page" , "RedirectToPage" ] )
252
+ }
253
+
254
+ private class PageModelJumpNode extends DataFlow:: NonLocalJumpNode {
255
+ PageModelClass pm ;
256
+
257
+ PageModelJumpNode ( ) { this .asExpr ( ) = getAPageCall ( pm ) .getQualifier ( ) }
258
+
259
+ override DataFlow:: Node getAJumpSuccessor ( boolean preservesValue ) {
260
+ preservesValue = true and
261
+ exists ( PropertyAccess modelProp |
262
+ result .asExpr ( ) = modelProp and
263
+ modelProp .getTarget ( ) .hasName ( "Model" ) and
264
+ modelProp .getEnclosingCallable ( ) .getDeclaringType ( ) = pm .getPage ( )
265
+ )
266
+ }
267
+ }
0 commit comments