Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ void oneTimeTokenWhenConfiguredThenRendersRequestTokenForm() throws Exception {

<p>
<label for="ott-username" class="screenreader">Username</label>
<input type="text" id="ott-username" name="username" placeholder="Username" required>
<input type="text" id="ott-username" name="username" placeholder="Username" required autofocus>
</p>
<input name="_csrf" type="hidden" value="%s" />
<button class="primary" type="submit" form="ott-form">Send Token</button>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -366,13 +366,15 @@ private String renderOneTimeTokenLogin(HttpServletRequest request, boolean login
String usernameInput = (username != null)
? HtmlTemplates.fromTemplate(ONE_TIME_READONLY_USERNAME_INPUT).withValue("username", username).render()
: ONE_TIME_USERNAME_INPUT;
String buttonAutofocus = (username != null) ? " autofocus" : "";

return HtmlTemplates.fromTemplate(ONE_TIME_TEMPLATE)
.withValue("generateOneTimeTokenUrl", contextPath + this.generateOneTimeTokenUrl)
.withRawHtml("errorMessage", renderError(loginError, errorMsg))
.withRawHtml("logoutMessage", renderSuccess(logoutSuccess))
.withRawHtml("hiddenInputs", hiddenInputs)
.withRawHtml("usernameInput", usernameInput)
.withRawHtml("buttonAutofocus", buttonAutofocus)
.render();
}

Expand Down Expand Up @@ -604,7 +606,7 @@ private boolean matches(HttpServletRequest request, @Nullable String url) {
{{usernameInput}}
</p>
{{hiddenInputs}}
<button class="primary" type="submit" form="ott-form">Send Token</button>
<button class="primary" type="submit" form="ott-form"{{buttonAutofocus}}>Send Token</button>
</form>
""";

Expand All @@ -613,7 +615,7 @@ private boolean matches(HttpServletRequest request, @Nullable String url) {
""";

private static final String ONE_TIME_USERNAME_INPUT = """
<input type="text" id="ott-username" name="username" placeholder="Username" required>
<input type="text" id="ott-username" name="username" placeholder="Username" required autofocus>
""";

}
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ private static String createLogoutSuccess(boolean isLogoutSuccess) {
{{errorMessage}}{{logoutMessage}}
<p>
<label for="ott-username" class="screenreader">Username</label>
<input type="text" id="ott-username" name="username" placeholder="Username" required>
<input type="text" id="ott-username" name="username" placeholder="Username" required autofocus>
</p>
{{csrf}}
<button class="primary" type="submit" form="ott-form">Send Token</button>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,18 +190,19 @@ public void generateWhenOneTimeTokenLoginThenOttForm() throws Exception {
MockHttpServletResponse response = new MockHttpServletResponse();
filter.doFilter(new MockHttpServletRequest("GET", "/login"), response, this.chain);
assertThat(response.getContentAsString()).contains("Request a One-Time Token");
assertThat(response.getContentAsString()).contains("""
<form id="ott-form" class="login-form" method="post" action="/ott/authenticate">
<h2>Request a One-Time Token</h2>
assertThat(response.getContentAsString()).contains(
"""
<form id="ott-form" class="login-form" method="post" action="/ott/authenticate">
<h2>Request a One-Time Token</h2>

<p>
<label for="ott-username" class="screenreader">Username</label>
<input type="text" id="ott-username" name="username" placeholder="Username" required>
</p>
<p>
<label for="ott-username" class="screenreader">Username</label>
<input type="text" id="ott-username" name="username" placeholder="Username" required autofocus>
</p>

<button class="primary" type="submit" form="ott-form">Send Token</button>
</form>
""");
<button class="primary" type="submit" form="ott-form">Send Token</button>
</form>
""");
}

@Test
Expand All @@ -216,18 +217,19 @@ public void generateWhenOneTimeTokenRequestedThenOttForm() throws Exception {
FactorGrantedAuthority.OTT_AUTHORITY);
filter.doFilter(loginRequest, response, this.chain);
assertThat(response.getContentAsString()).contains("Request a One-Time Token");
assertThat(response.getContentAsString()).contains("""
<form id="ott-form" class="login-form" method="post" action="/ott/authenticate">
<h2>Request a One-Time Token</h2>
assertThat(response.getContentAsString()).contains(
"""
<form id="ott-form" class="login-form" method="post" action="/ott/authenticate">
<h2>Request a One-Time Token</h2>

<p>
<label for="ott-username" class="screenreader">Username</label>
<input type="text" id="ott-username" name="username" placeholder="Username" required>
</p>
<p>
<label for="ott-username" class="screenreader">Username</label>
<input type="text" id="ott-username" name="username" placeholder="Username" required autofocus>
</p>

<button class="primary" type="submit" form="ott-form">Send Token</button>
</form>
""");
<button class="primary" type="submit" form="ott-form">Send Token</button>
</form>
""");
assertThat(response.getContentAsString()).doesNotContain("Password");
}

Expand All @@ -245,18 +247,19 @@ public void generateWhenTwoAuthoritiesRequestedThenBothForms() throws Exception
.get("/login?factor.type=ott&factor.type=password&factor.reason=missing&factor.reason=missing")
.build(), response, this.chain);
assertThat(response.getContentAsString()).contains("Request a One-Time Token");
assertThat(response.getContentAsString()).contains("""
<form id="ott-form" class="login-form" method="post" action="/ott/authenticate">
<h2>Request a One-Time Token</h2>
assertThat(response.getContentAsString()).contains(
"""
<form id="ott-form" class="login-form" method="post" action="/ott/authenticate">
<h2>Request a One-Time Token</h2>

<p>
<label for="ott-username" class="screenreader">Username</label>
<input type="text" id="ott-username" name="username" placeholder="Username" required>
</p>
<p>
<label for="ott-username" class="screenreader">Username</label>
<input type="text" id="ott-username" name="username" placeholder="Username" required autofocus>
</p>

<button class="primary" type="submit" form="ott-form">Send Token</button>
</form>
""");
<button class="primary" type="submit" form="ott-form">Send Token</button>
</form>
""");
assertThat(response.getContentAsString()).contains("Password");
}

Expand Down Expand Up @@ -297,6 +300,8 @@ public void generateWhenAuthenticatedThenReadOnlyUsername() throws Exception {
"""
<input type="text" id="ott-username" name="username" value="user" placeholder="Username" required readonly>
""");
assertThat(response.getContentAsString()).contains("""
<button class="primary" type="submit" form="ott-form" autofocus>Send Token</button>""");
assertThat(response.getContentAsString()).contains("""
<input type="text" id="username" name="username" value="user" placeholder="Username" required readonly>
""");
Expand Down
Loading