Skip to content
This repository was archived by the owner on Dec 14, 2018. It is now read-only.

Commit 159e4b0

Browse files
committed
Do not use FormattedModelValue in password editor template
- #7418 - add quirk switch to reverse this if necessary
1 parent 8d1c85a commit 159e4b0

File tree

2 files changed

+120
-1
lines changed

2 files changed

+120
-1
lines changed

src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/DefaultEditorTemplates.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
2020
public static class DefaultEditorTemplates
2121
{
2222
private const string HtmlAttributeKey = "htmlAttributes";
23+
private const string UsePasswordValue = "Switch.Microsoft.AspNetCore.Mvc.UsePasswordValue";
2324

2425
public static IHtmlContent BooleanTemplate(IHtmlHelper htmlHelper)
2526
{
@@ -312,9 +313,15 @@ public static IHtmlContent ObjectTemplate(IHtmlHelper htmlHelper)
312313

313314
public static IHtmlContent PasswordTemplate(IHtmlHelper htmlHelper)
314315
{
316+
object value = null;
317+
if (AppContext.TryGetSwitch(UsePasswordValue, out var usePasswordValue) && usePasswordValue)
318+
{
319+
value = htmlHelper.ViewData.TemplateInfo.FormattedModelValue;
320+
}
321+
315322
return htmlHelper.Password(
316323
expression: null,
317-
value: htmlHelper.ViewData.TemplateInfo.FormattedModelValue,
324+
value: value,
318325
htmlAttributes: CreateHtmlAttributes(htmlHelper, "text-box single-line password"));
319326
}
320327

test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/Internal/DefaultEditorTemplatesTest.cs

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
2424
{
2525
public class DefaultEditorTemplatesTest
2626
{
27+
static DefaultEditorTemplatesTest()
28+
{
29+
AppContext.SetSwitch("Switch.Microsoft.AspNetCore.Mvc.UsePasswordValue", true);
30+
}
31+
2732
// Mappings from templateName to expected result when using StubbyHtmlHelper.
2833
public static TheoryData<string, string> TemplateNameData
2934
{
@@ -521,6 +526,113 @@ public void MultilineTextTemplate_ReturnsTextArea()
521526
Assert.Equal(expected, HtmlContentUtilities.HtmlContentToString(result));
522527
}
523528

529+
[Fact]
530+
public void PasswordTemplate_ReturnsInputElement_IgnoresExpressionValue()
531+
{
532+
// Arrange
533+
var expected = "<input class=\"HtmlEncode[[text-box single-line password]]\" " +
534+
"id=\"HtmlEncode[[FieldPrefix]]\" name=\"HtmlEncode[[FieldPrefix]]\" " +
535+
"type=\"HtmlEncode[[password]]\" />";
536+
537+
var model = "Model string";
538+
539+
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
540+
var viewData = helper.ViewData;
541+
var templateInfo = viewData.TemplateInfo;
542+
templateInfo.HtmlFieldPrefix = "FieldPrefix";
543+
544+
// Act
545+
var result = DefaultEditorTemplates.PasswordTemplate(helper);
546+
547+
// Assert
548+
Assert.Equal(expected, HtmlContentUtilities.HtmlContentToString(result));
549+
}
550+
551+
[Fact]
552+
public void PasswordTemplate_ReturnsInputElement_IgnoresFormattedModelValue()
553+
{
554+
// Arrange
555+
var expected = "<input class=\"HtmlEncode[[text-box single-line password]]\" " +
556+
"id=\"HtmlEncode[[FieldPrefix]]\" name=\"HtmlEncode[[FieldPrefix]]\" " +
557+
"type=\"HtmlEncode[[password]]\" />";
558+
var helper = DefaultTemplatesUtilities.GetHtmlHelper<string>(model: null);
559+
var viewData = helper.ViewData;
560+
var templateInfo = viewData.TemplateInfo;
561+
templateInfo.HtmlFieldPrefix = "FieldPrefix";
562+
563+
templateInfo.FormattedModelValue = "Formatted string";
564+
565+
// Act
566+
var result = DefaultEditorTemplates.PasswordTemplate(helper);
567+
568+
// Assert
569+
Assert.Equal(expected, HtmlContentUtilities.HtmlContentToString(result));
570+
}
571+
572+
[Fact]
573+
public void PasswordTemplate_ReturnsInputElement_IgnoresModelState()
574+
{
575+
// Arrange
576+
var expected = "<input class=\"HtmlEncode[[text-box single-line password]]\" " +
577+
"id=\"HtmlEncode[[FieldPrefix]]\" name=\"HtmlEncode[[FieldPrefix]]\" " +
578+
"type=\"HtmlEncode[[password]]\" />";
579+
var helper = DefaultTemplatesUtilities.GetHtmlHelper<string>(model: null);
580+
var viewData = helper.ViewData;
581+
var templateInfo = viewData.TemplateInfo;
582+
templateInfo.HtmlFieldPrefix = "FieldPrefix";
583+
584+
var modelState = viewData.ModelState;
585+
modelState.SetModelValue("FieldPRefix", "Raw model string", "Attempted model string");
586+
587+
// Act
588+
var result = DefaultEditorTemplates.PasswordTemplate(helper);
589+
590+
// Assert
591+
Assert.Equal(expected, HtmlContentUtilities.HtmlContentToString(result));
592+
}
593+
594+
[Fact]
595+
public void PasswordTemplate_ReturnsInputElement_IgnoresViewData()
596+
{
597+
// Arrange
598+
var expected = "<input class=\"HtmlEncode[[text-box single-line password]]\" " +
599+
"id=\"HtmlEncode[[FieldPrefix]]\" name=\"HtmlEncode[[FieldPrefix]]\" " +
600+
"type=\"HtmlEncode[[password]]\" />";
601+
var helper = DefaultTemplatesUtilities.GetHtmlHelper<string>(model: null);
602+
var viewData = helper.ViewData;
603+
var templateInfo = viewData.TemplateInfo;
604+
templateInfo.HtmlFieldPrefix = "FieldPrefix";
605+
606+
viewData["FieldPrefix"] = "ViewData string";
607+
608+
// Act
609+
var result = DefaultEditorTemplates.PasswordTemplate(helper);
610+
611+
// Assert
612+
Assert.Equal(expected, HtmlContentUtilities.HtmlContentToString(result));
613+
}
614+
615+
[Fact]
616+
public void PasswordTemplate_ReturnsInputElement_UsesHtmlAttributes()
617+
{
618+
// Arrange
619+
var expected = "<input class=\"HtmlEncode[[super text-box single-line password]]\" " +
620+
"id=\"HtmlEncode[[FieldPrefix]]\" name=\"HtmlEncode[[FieldPrefix]]\" " +
621+
"type=\"HtmlEncode[[password]]\" value=\"HtmlEncode[[Html attributes string]]\" />";
622+
var helper = DefaultTemplatesUtilities.GetHtmlHelper<string>(model: null);
623+
var viewData = helper.ViewData;
624+
var templateInfo = viewData.TemplateInfo;
625+
templateInfo.HtmlFieldPrefix = "FieldPrefix";
626+
627+
viewData["htmlAttributes"] = new { @class = "super", value = "Html attributes string" };
628+
629+
// Act
630+
var result = DefaultEditorTemplates.PasswordTemplate(helper);
631+
632+
// Assert
633+
Assert.Equal(expected, HtmlContentUtilities.HtmlContentToString(result));
634+
}
635+
524636
[Theory]
525637
[MemberData(nameof(TemplateNameData))]
526638
public void Editor_CallsExpectedHtmlHelper(string templateName, string expectedResult)

0 commit comments

Comments
 (0)