Skip to content

Commit

Permalink
+ Adding support for RequireHttpsAttribute (closes #65)
Browse files Browse the repository at this point in the history
  • Loading branch information
artiomchi committed Mar 20, 2018
1 parent 8a95b33 commit 97dbfa9
Show file tree
Hide file tree
Showing 10 changed files with 110 additions and 39 deletions.
4 changes: 2 additions & 2 deletions src/R4Mvc.Tools/CodeGen/BodyBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,15 +89,15 @@ private VariableDeclarationSyntax NewVariableDeclaration(string name, Expression
EqualsValueClause(value))));
}

public BodyBuilder VariableFromMethodCall(string variableName, string entityName, string methodName, params string[] arguments)
public BodyBuilder VariableFromMethodCall(string variableName, string entityName, string methodName, params object[] arguments)
{
var methodCallExpression = MethodCallExpression(entityName, methodName, arguments);
var variableExpression = NewVariableDeclaration(variableName, methodCallExpression);
_expressions.Add(LocalDeclarationStatement(variableExpression));
return this;
}

public BodyBuilder VariableFromNewObject(string variableName, string entityType, params string[] arguments)
public BodyBuilder VariableFromNewObject(string variableName, string entityType, params object[] arguments)
{
var newExpression = NewObjectExpression(entityType, arguments);
var variableExpression = NewVariableDeclaration(variableName, newExpression);
Expand Down
1 change: 1 addition & 0 deletions src/R4Mvc.Tools/ControllerDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public class ControllerDefinition
public string Namespace { get; set; }
public string Name { get; set; }
public string Area { get; set; }
public bool IsSecure { get; set; }
public INamedTypeSymbol Symbol { get; set; }

public string AreaKey { get; set; }
Expand Down
2 changes: 1 addition & 1 deletion src/R4Mvc.Tools/Extensions/SyntaxNodeHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public static SyntaxToken[] CreateModifiers(params SyntaxKind[] kinds)

public static bool IsNotR4MVCGenerated(this ISymbol method)
{
return !method.GetAttributes().Any(a => a.AttributeClass.ToDisplayString() == typeof(GeneratedCodeAttribute).FullName);
return !method.GetAttributes().Any(a => a.AttributeClass.InheritsFrom<GeneratedCodeAttribute>());
}

private static string[] _controllerClassMethodNames = null;
Expand Down
20 changes: 14 additions & 6 deletions src/R4Mvc.Tools/Services/ControllerGeneratorService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public ClassDeclarationSyntax GeneratePartialController(ControllerDefinition con
.WithParameter("d", Constants.DummyClass));

AddRedirectMethods(genControllerClass);
AddParameterlessMethods(genControllerClass, controller.Symbol);
AddParameterlessMethods(genControllerClass, controller.Symbol, controller.IsSecure);

var actionsExpression = controller.AreaKey != null
? _settings.HelpersPrefix + "." + controller.AreaKey + "." + controller.Name
Expand Down Expand Up @@ -144,7 +144,7 @@ public ClassDeclarationSyntax GenerateR4Controller(ControllerDefinition controll
.WithConstructor(c => c
.WithBaseConstructorCall(IdentifierName(Constants.DummyClass + "." + Constants.DummyClassInstance))
.WithModifiers(SyntaxKind.PublicKeyword));
AddMethodOverrides(r4ControllerClass, controller.Symbol);
AddMethodOverrides(r4ControllerClass, controller.Symbol, controller.IsSecure);
return r4ControllerClass.Build();
}

Expand Down Expand Up @@ -208,7 +208,7 @@ private void AddRedirectMethods(ClassBuilder genControllerClass)
.ReturnMethodCall(null, "RedirectToActionPermanent", "taskResult.Result")));
}

private void AddParameterlessMethods(ClassBuilder genControllerClass, ITypeSymbol mvcSymbol)
private void AddParameterlessMethods(ClassBuilder genControllerClass, ITypeSymbol mvcSymbol, bool isControllerSecure)
{
var methods = mvcSymbol.GetPublicNonGeneratedMethods()
.GroupBy(m => m.Name)
Expand All @@ -226,10 +226,14 @@ private void AddParameterlessMethods(ClassBuilder genControllerClass, ITypeSymbo
.WithNonActionAttribute()
.WithGeneratedNonUserCodeAttributes()
.WithBody(b => b
.ReturnNewObject(Constants.ActionResultClass, "Area", "Name", "ActionNames." + method.Key)));
.ReturnNewObject(Constants.ActionResultClass,
isControllerSecure || method.Any(mg => mg.GetAttributes().Any(a => a.AttributeClass.InheritsFrom<RequireHttpsAttribute>()))
? new object[] { "Area", "Name", "ActionNames." + method.Key, SimpleLiteral.String("https") }
: new object[] { "Area", "Name", "ActionNames." + method.Key }
)));
}

private void AddMethodOverrides(ClassBuilder classBuilder, ITypeSymbol mvcSymbol)
private void AddMethodOverrides(ClassBuilder classBuilder, ITypeSymbol mvcSymbol, bool isControllerSecure)
{
const string overrideMethodSuffix = "Override";
foreach (var method in mvcSymbol.GetPublicNonGeneratedMethods())
Expand Down Expand Up @@ -292,7 +296,11 @@ private void AddMethodOverrides(ClassBuilder classBuilder, ITypeSymbol mvcSymbol
.ForEach(method.Parameters, (m2, p) => m2
.WithParameter(p.Name, p.Type.ToString()))
.WithBody(b => b
.VariableFromNewObject("callInfo", callInfoType, "Area", "Name", "ActionNames." + method.Name)
.VariableFromNewObject("callInfo", callInfoType,
isControllerSecure || method.GetAttributes().Any(a => a.AttributeClass.InheritsFrom<RequireHttpsAttribute>())
? new object[] { "Area", "Name", "ActionNames." + method.Name, SimpleLiteral.String("https") }
: new object[] { "Area", "Name", "ActionNames." + method.Name }
)
.ForEach(method.Parameters, (cb, p) => cb
.MethodCall("ModelUnbinderHelpers", "AddRouteValues", "callInfo.RouteValueDictionary", SimpleLiteral.String(p.Name), p.Name))
.MethodCall(null, method.Name + overrideMethodSuffix, new[] { "callInfo" }.Concat(method.Parameters.Select(p => p.Name)).ToArray())
Expand Down
3 changes: 3 additions & 0 deletions src/R4Mvc.Tools/Services/ControllerRewriterService.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
Expand Down Expand Up @@ -52,13 +53,15 @@ public IList<ControllerDefinition> RewriteControllers(CSharpCompilation compiler
controllers[cFullName].FilePaths.Add(tree.FilePath);
continue;
}
var isSecure = cSymbol.GetAttributes().Any(a => a.AttributeClass.InheritsFrom<RequireHttpsAttribute>());

var cAreaName = _controllerGenerator.GetControllerArea(cSymbol);
controllers[cFullName] = new ControllerDefinition
{
Namespace = cNamespace,
Name = cSymbol.Name.TrimEnd("Controller"),
Area = cAreaName,
IsSecure = isSecure,
Symbol = cSymbol,
FilePaths = new List<string> { tree.FilePath },
};
Expand Down
2 changes: 1 addition & 1 deletion src/R4MvcHostApp/Controllers/AccountController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

namespace R4MvcHostApp.Controllers
{
[Authorize]
[Authorize, RequireHttps]
public partial class AccountController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
Expand Down
Loading

0 comments on commit 97dbfa9

Please sign in to comment.