Skip to content

Commit 731af15

Browse files
committed
C#: Model MVC fallback controller mappings
1 parent dac7892 commit 731af15

6 files changed

Lines changed: 54 additions & 6 deletions

File tree

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
| AttributePocoController.cs | AttributePocoController |
2-
| GeneratedController.cs | GeneratedController |
3-
| IncludedController.cs | IncludedController |
4-
| StructuralController.cs | StructuralController |
5-
| WebPocoController.cs | WebPocoController |
1+
| AdminAreaFallbackController.cs | AreaFallbackController |
2+
| AttributePocoController.cs | AttributePocoController |
3+
| FallbackOnlyController.cs | FallbackOnlyController |
4+
| GeneratedController.cs | GeneratedController |
5+
| IncludedController.cs | IncludedController |
6+
| StructuralController.cs | StructuralController |
7+
| WebPocoController.cs | WebPocoController |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Microsoft.AspNetCore.Mvc;
2+
3+
namespace AdminArea;
4+
5+
[Area("Admin")]
6+
public class AreaFallbackController
7+
{
8+
public void Index(string input) => _ = GetType().Name + input;
9+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
public class FallbackOnlyController
2+
{
3+
public void Index(string input) => _ = GetType().Name + input;
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Microsoft.AspNetCore.Mvc;
2+
3+
namespace OtherArea;
4+
5+
[Area("Other")]
6+
public class AreaFallbackController
7+
{
8+
public void Index(string input) => _ = GetType().Name + input;
9+
}

csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@
55
builder.Services.AddControllers();
66

77
var app = builder.Build();
8-
app.Run();
8+
app.MapFallbackToController("Index", "FallbackOnly");
9+
app.MapFallbackToAreaController("admin/{*path:nonfile}", "Index", "AreaFallback", "Admin");
10+
app.Run();

csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,26 @@ private predicate isMicrosoftAspNetCoreMvcAttributeEndpointMapping(MethodCall ca
327327
not exists(call.getArgumentForName("configureRoutes"))
328328
}
329329

330+
private predicate isMicrosoftAspNetCoreMvcFallbackEndpointMapping(MethodCall call, Class controller) {
331+
call.getTarget()
332+
.hasFullyQualifiedName("Microsoft.AspNetCore.Builder",
333+
"ControllerEndpointRouteBuilderExtensions",
334+
["MapFallbackToAreaController", "MapFallbackToController"]) and
335+
call.getArgumentForName("controller").getValue().toLowerCase() + "controller" =
336+
controller.getName().toLowerCase() and
337+
(
338+
call.getTarget().hasName("MapFallbackToController")
339+
or
340+
call.getTarget().hasName("MapFallbackToAreaController") and
341+
exists(Attribute area |
342+
area = controller.getABaseType*().getAnAttribute() and
343+
area.getType().hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "AreaAttribute") and
344+
area.getArgument(0).getValue().toLowerCase() =
345+
call.getArgumentForName("area").getValue().toLowerCase()
346+
)
347+
)
348+
}
349+
330350
private predicate hasMicrosoftAspNetCoreMvcEndpointMapping(Compilation application, Class controller) {
331351
isInMicrosoftAspNetCoreMvcApplication(controller, application) and
332352
exists(MethodCall mapping |
@@ -336,6 +356,8 @@ private predicate hasMicrosoftAspNetCoreMvcEndpointMapping(Compilation applicati
336356
or
337357
isMicrosoftAspNetCoreMvcAttributeEndpointMapping(mapping) and
338358
hasMicrosoftAspNetCoreMvcAttributeRoute(controller)
359+
or
360+
isMicrosoftAspNetCoreMvcFallbackEndpointMapping(mapping, controller)
339361
)
340362
)
341363
}

0 commit comments

Comments
 (0)