Skip to content

Commit

Permalink
SONAR-8423 Properly fail on invalid basic header
Browse files Browse the repository at this point in the history
  • Loading branch information
julienlancelot committed Nov 28, 2016
1 parent aa13239 commit 3383b0f
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 9 deletions.
Expand Up @@ -65,7 +65,7 @@ public Optional<UserDto> authenticate(HttpServletRequest request) {

private static String[] getCredentials(String authorizationHeader) {
String basicAuthEncoded = authorizationHeader.substring(6);
String basicAuthDecoded = new String(BASE64_DECODER.decode(basicAuthEncoded.getBytes(Charsets.UTF_8)), Charsets.UTF_8);
String basicAuthDecoded = getDecodedBasicAuth(basicAuthEncoded);

int semiColonPos = basicAuthDecoded.indexOf(':');
if (semiColonPos <= 0) {
Expand All @@ -76,6 +76,14 @@ private static String[] getCredentials(String authorizationHeader) {
return new String[] {login, password};
}

private static String getDecodedBasicAuth(String basicAuthEncoded) {
try {
return new String(BASE64_DECODER.decode(basicAuthEncoded.getBytes(Charsets.UTF_8)), Charsets.UTF_8);
} catch (Exception e) {
throw new UnauthorizedException("Invalid basic header");
}
}

private UserDto authenticate(String login, String password, HttpServletRequest request) {
if (isEmpty(password)) {
return authenticateFromUserToken(login);
Expand Down
Expand Up @@ -20,14 +20,6 @@

package org.sonar.server.authentication;

import static com.google.common.base.Charsets.UTF_8;
import static org.assertj.core.api.Java6Assertions.assertThat;
import static org.junit.rules.ExpectedException.none;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;

import java.util.Base64;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest;
Expand All @@ -44,6 +36,14 @@
import org.sonar.server.exceptions.UnauthorizedException;
import org.sonar.server.usertoken.UserTokenAuthenticator;

import static com.google.common.base.Charsets.UTF_8;
import static org.assertj.core.api.Java6Assertions.assertThat;
import static org.junit.rules.ExpectedException.none;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;

public class BasicAuthenticatorTest {

private static final Base64.Encoder BASE64_ENCODER = Base64.getEncoder();
Expand Down Expand Up @@ -117,6 +117,15 @@ public void fail_to_authenticate_when_no_login() throws Exception {
underTest.authenticate(request);
}

@Test
public void fail_to_authenticate_when_invalid_header() throws Exception {
when(request.getHeader("Authorization")).thenReturn("Basic Invàlid");

expectedException.expect(UnauthorizedException.class);
expectedException.expectMessage("Invalid basic header");
underTest.authenticate(request);
}

@Test
public void authenticate_from_user_token() throws Exception {
insertUser(UserTesting.newUserDto().setLogin(LOGIN));
Expand Down

0 comments on commit 3383b0f

Please sign in to comment.