Skip to content

Commit

Permalink
Fix getByName. Add passwordHash field to UserCredential. Cleanup typi…
Browse files Browse the repository at this point in the history
…ng in unit tests.
  • Loading branch information
scottfrederick committed Dec 11, 2017
1 parent 572453a commit 0980e37
Show file tree
Hide file tree
Showing 26 changed files with 101 additions and 69 deletions.
Expand Up @@ -189,18 +189,18 @@ public <T> CredentialDetails<T> getByName(final CredentialName name, Class<T> cr
Assert.notNull(name, "credential name must not be null");
Assert.notNull(credentialType, "credential type must not be null");

final ParameterizedTypeReference<CredentialDetails<T>> ref =
new ParameterizedTypeReference<CredentialDetails<T>>() {};
final ParameterizedTypeReference<CredentialDetailsData<T>> ref =
new ParameterizedTypeReference<CredentialDetailsData<T>>() {};

return doWithRest(new RestOperationsCallback<CredentialDetails<T>>() {
@Override
public CredentialDetails<T> doWithRestOperations(RestOperations restOperations) {
ResponseEntity<CredentialDetails<T>> response =
ResponseEntity<CredentialDetailsData<T>> response =
restOperations.exchange(NAME_URL_QUERY_CURRENT, GET, null, ref, name.getName());

throwExceptionOnError(response);

return response.getBody();
return response.getBody().getData().get(0);
}
});
}
Expand Down
Expand Up @@ -44,6 +44,7 @@ public CredentialDetailsData() {
*
* @param data a collection of {@link CredentialDetails}
*/
@SafeVarargs
public CredentialDetailsData(CredentialDetails<T>... data) {
this.data = Arrays.asList(data);
}
Expand Down
Expand Up @@ -19,20 +19,23 @@
import org.springframework.util.Assert;

/**
* A user credential consists of an optional username and a password.
* A user credential consists of an optional username and a password. When retrieved, a user credential
* will contain a hash of the password.
*
* @author Scott Frederick
*/
public class UserCredential {
private final String username;
private final String password;
private final String passwordHash;

/**
* Create an empty {@link UserCredential}. Intended to be used internally for deserialization of responses.
*/
private UserCredential() {
username = null;
password = null;
passwordHash = null;
}

/**
Expand All @@ -46,6 +49,7 @@ public UserCredential(String username, String password) {
Assert.notNull(password, "password must not be null");
this.username = username;
this.password = password;
this.passwordHash = null;
}

/**
Expand All @@ -57,6 +61,7 @@ public UserCredential(String password) {
Assert.notNull(password, "password must not be null");
this.username = null;
this.password = password;
this.passwordHash = null;
}

/**
Expand All @@ -76,4 +81,13 @@ public String getUsername() {
public String getPassword() {
return password;
}

/**
* Get the SHA-512 hash of the user password.
*
* @return the hash of the user password
*/
public String getPasswordHash() {
return passwordHash;
}
}
Expand Up @@ -101,8 +101,8 @@ public void getById(@FromDataPoints("detail-responses")
}

@Theory
public void getByName(@FromDataPoints("detail-responses")
ResponseEntity<CredentialDetails<CertificateCredential>> expectedResponse) {
public void getByName(@FromDataPoints("data-responses")
ResponseEntity<CredentialDetailsData<CertificateCredential>> expectedResponse) {
verifyGetByName(expectedResponse);
}

Expand Down
Expand Up @@ -78,8 +78,8 @@ public void getById(@FromDataPoints("detail-responses")
}

@Theory
public void getByName(@FromDataPoints("detail-responses")
ResponseEntity<CredentialDetails<JsonCredential>> expectedResponse) {
public void getByName(@FromDataPoints("data-responses")
ResponseEntity<CredentialDetailsData<JsonCredential>> expectedResponse) {
verifyGetByName(expectedResponse);
}

Expand Down
Expand Up @@ -97,8 +97,8 @@ public void getById(@FromDataPoints("detail-responses")
}

@Theory
public void getByName(@FromDataPoints("detail-responses")
ResponseEntity<CredentialDetails<PasswordCredential>> expectedResponse) {
public void getByName(@FromDataPoints("data-responses")
ResponseEntity<CredentialDetailsData<PasswordCredential>> expectedResponse) {
verifyGetByName(expectedResponse);
}

Expand Down
Expand Up @@ -98,8 +98,8 @@ public void getById(@FromDataPoints("detail-responses")
}

@Theory
public void getByName(@FromDataPoints("detail-responses")
ResponseEntity<CredentialDetails<RsaCredential>> expectedResponse) {
public void getByName(@FromDataPoints("data-responses")
ResponseEntity<CredentialDetailsData<RsaCredential>> expectedResponse) {
verifyGetByName(expectedResponse);
}

Expand Down
Expand Up @@ -98,8 +98,8 @@ public void getById(@FromDataPoints("detail-responses")
}

@Theory
public void getByName(@FromDataPoints("detail-responses")
ResponseEntity<CredentialDetails<SshCredential>> expectedResponse) {
public void getByName(@FromDataPoints("data-responses")
ResponseEntity<CredentialDetailsData<SshCredential>> expectedResponse) {
verifyGetByName(expectedResponse);
}

Expand Down
Expand Up @@ -64,21 +64,21 @@ protected ParametersRequest<P> getGenerateRequest() {

static <T> List<ResponseEntity<CredentialDetails<T>>> buildDetailResponses(CredentialType type, T credential) {
return Arrays.asList(
new ResponseEntity<CredentialDetails<T>>(
new CredentialDetails<T>(CREDENTIAL_ID, NAME, type, credential),
new ResponseEntity<>(
new CredentialDetails<>(CREDENTIAL_ID, NAME, type, credential),
OK),
new ResponseEntity<CredentialDetails<T>>(new CredentialDetails<T>(), UNAUTHORIZED)
new ResponseEntity<>(new CredentialDetails<T>(), UNAUTHORIZED)
);
}

static <T> List<ResponseEntity<CredentialDetailsData<T>>> buildDataResponses(CredentialType type, T credential) {
return Arrays.asList(
new ResponseEntity<CredentialDetailsData<T>>(
new CredentialDetailsData<T>(
new CredentialDetails<T>(CREDENTIAL_ID, NAME,
new ResponseEntity<>(
new CredentialDetailsData<>(
new CredentialDetails<>(CREDENTIAL_ID, NAME,
type, credential)),
OK),
new ResponseEntity<CredentialDetailsData<T>>(
new ResponseEntity<>(
new CredentialDetailsData<T>(), UNAUTHORIZED)
);
}
Expand All @@ -87,7 +87,7 @@ void verifyWrite(ResponseEntity<CredentialDetails<T>> expectedResponse) {
CredentialRequest<T> request = getWriteRequest();

when(restTemplate.exchange(eq(BASE_URL_PATH), eq(PUT),
eq(new HttpEntity<CredentialRequest<T>>(request)), isA(ParameterizedTypeReference.class)))
eq(new HttpEntity<>(request)), isA(ParameterizedTypeReference.class)))
.thenReturn(expectedResponse);

if (!expectedResponse.getStatusCode().equals(HttpStatus.OK)) {
Expand All @@ -102,15 +102,15 @@ void verifyWrite(ResponseEntity<CredentialDetails<T>> expectedResponse) {
else {
CredentialDetails<T> response = credHubTemplate.write(request);

assertResponseContainsExpectedCredentials(expectedResponse, response);
assertDetailsResponseContainsExpectedCredential(expectedResponse, response);
}
}

void verifyGenerate(ResponseEntity<CredentialDetails<T>> expectedResponse) {
ParametersRequest<P> request = getGenerateRequest();

when(restTemplate.exchange(eq(BASE_URL_PATH), eq(POST),
eq(new HttpEntity<ParametersRequest<P>>(request)), isA(ParameterizedTypeReference.class)))
eq(new HttpEntity<>(request)), isA(ParameterizedTypeReference.class)))
.thenReturn(expectedResponse);

if (!expectedResponse.getStatusCode().equals(HttpStatus.OK)) {
Expand All @@ -125,7 +125,7 @@ void verifyGenerate(ResponseEntity<CredentialDetails<T>> expectedResponse) {
else {
CredentialDetails<T> response = credHubTemplate.generate(request);

assertResponseContainsExpectedCredentials(expectedResponse, response);
assertDetailsResponseContainsExpectedCredential(expectedResponse, response);
}
}

Expand All @@ -135,7 +135,7 @@ void verifyRegenerate(ResponseEntity<CredentialDetails<T>> expectedResponse) {
}};

when(restTemplate.exchange(eq(REGENERATE_URL_PATH), eq(POST),
eq(new HttpEntity<Map<String, Object>>(request)), isA(ParameterizedTypeReference.class)))
eq(new HttpEntity<>(request)), isA(ParameterizedTypeReference.class)))
.thenReturn(expectedResponse);

if (!expectedResponse.getStatusCode().equals(HttpStatus.OK)) {
Expand All @@ -150,7 +150,7 @@ void verifyRegenerate(ResponseEntity<CredentialDetails<T>> expectedResponse) {
else {
CredentialDetails<T> response = credHubTemplate.regenerate(NAME);

assertResponseContainsExpectedCredentials(expectedResponse, response);
assertDetailsResponseContainsExpectedCredential(expectedResponse, response);
}
}

Expand All @@ -173,12 +173,12 @@ void verifyGetById(ResponseEntity<CredentialDetails<T>> expectedResponse) {
CredentialDetails<T> response =
credHubTemplate.getById(CREDENTIAL_ID, getType());

assertResponseContainsExpectedCredentials(expectedResponse, response);
assertDetailsResponseContainsExpectedCredential(expectedResponse, response);
}
}

@SuppressWarnings("deprecation")
void verifyGetByName(ResponseEntity<CredentialDetails<T>> expectedResponse) {
void verifyGetByName(ResponseEntity<CredentialDetailsData<T>> expectedResponse) {
when(restTemplate.exchange(eq(NAME_URL_QUERY_CURRENT), eq(GET), isNull(HttpEntity.class),
isA(ParameterizedTypeReference.class), eq(NAME.getName())))
.thenReturn(expectedResponse);
Expand All @@ -196,7 +196,7 @@ void verifyGetByName(ResponseEntity<CredentialDetails<T>> expectedResponse) {
else {
CredentialDetails<T> response = credHubTemplate.getByName(NAME, getType());

assertResponseContainsExpectedCredentials(expectedResponse, response);
assertDataResponseContainsExpectedCredential(expectedResponse, response);
}
}

Expand All @@ -219,19 +219,27 @@ void verifyGetByNameWithHistory(ResponseEntity<CredentialDetailsData<T>> expecte
else {
List<CredentialDetails<T>> response = credHubTemplate.getByNameWithHistory(NAME, getType());

assertResponseContainsExpectedCredentials(expectedResponse, response);
assertDataResponseContainsExpectedCredentials(expectedResponse, response);
}
}

private void assertResponseContainsExpectedCredentials(
private void assertDataResponseContainsExpectedCredentials(
ResponseEntity<CredentialDetailsData<T>> expectedResponse,
List<CredentialDetails<T>> response) {
assertThat(response, notNullValue());
assertThat(response.size(), equalTo(expectedResponse.getBody().getData().size()));
assertThat(response.get(0), equalTo(expectedResponse.getBody().getData().get(0)));
}

private void assertResponseContainsExpectedCredentials(
private void assertDataResponseContainsExpectedCredential(
ResponseEntity<CredentialDetailsData<T>> expectedResponse,
CredentialDetails<T> response) {
assertThat(response, notNullValue());
assertThat(1, equalTo(expectedResponse.getBody().getData().size()));
assertThat(response, equalTo(expectedResponse.getBody().getData().get(0)));
}

private void assertDetailsResponseContainsExpectedCredential(
ResponseEntity<CredentialDetails<T>> expectedResponse,
CredentialDetails<T> response) {
assertThat(response, notNullValue());
Expand Down
Expand Up @@ -73,8 +73,8 @@ public void getById(@FromDataPoints("detail-responses")
}

@Theory
public void getByName(@FromDataPoints("detail-responses")
ResponseEntity<CredentialDetails<UserCredential>> expectedResponse) {
public void getByName(@FromDataPoints("data-responses")
ResponseEntity<CredentialDetailsData<UserCredential>> expectedResponse) {
verifyGetByName(expectedResponse);
}

Expand Down
Expand Up @@ -74,8 +74,8 @@ public void getById(@FromDataPoints("detail-responses")
}

@Theory
public void getByName(@FromDataPoints("detail-responses")
ResponseEntity<CredentialDetails<ValueCredential>> expectedResponse) {
public void getByName(@FromDataPoints("data-responses")
ResponseEntity<CredentialDetailsData<ValueCredential>> expectedResponse) {
verifyGetByName(expectedResponse);
}

Expand Down
Expand Up @@ -43,11 +43,11 @@
public class CredHubTemplateSummaryResponseUnitTests extends CredHubTemplateUnitTestsBase {
@DataPoint("responses")
public static ResponseEntity<CredentialSummaryData> successfulResponse =
new ResponseEntity<CredentialSummaryData>(new CredentialSummaryData(new CredentialSummary(NAME)), OK);
new ResponseEntity<>(new CredentialSummaryData(new CredentialSummary(NAME)), OK);

@DataPoint("responses")
public static ResponseEntity<CredentialSummaryData> httpErrorResponse =
new ResponseEntity<CredentialSummaryData>(new CredentialSummaryData(), UNAUTHORIZED);
new ResponseEntity<>(new CredentialSummaryData(), UNAUTHORIZED);

@Theory
public void findByName(@FromDataPoints("responses")
Expand Down
Expand Up @@ -64,6 +64,7 @@ public void serializationWithOnePermission() throws Exception {
}

@Test
@SuppressWarnings("unchecked")
public void serializationWithThreePermissions() throws Exception {
requestBuilder
.permission(CredentialPermission.builder()
Expand Down
Expand Up @@ -54,13 +54,13 @@ public void setUpJsonParsing() throws Exception {


@SuppressWarnings("unchecked")
protected <T> CredentialDetails<T> parseDetails(String credentials, Class<T> type) throws java.io.IOException {
protected <T> CredentialDetails<T> parseDetails(String credentials) throws java.io.IOException {
String json = buildDetails(credentials);
return (CredentialDetails<T>) objectMapper.readValue(json, CredentialDetails.class);
}

@SuppressWarnings("unchecked")
protected <T> CredentialDetailsData<T> parseDetailsData(String credentials, Class<T> type) throws java.io.IOException {
protected <T> CredentialDetailsData<T> parseDetailsData(String credentials) throws java.io.IOException {
String json = buildDetailsData(credentials);
return (CredentialDetailsData<T>) objectMapper.readValue(json, CredentialDetailsData.class);
}
Expand Down
Expand Up @@ -37,7 +37,7 @@ public class CertificateCredentialDetailsUnitTests extends JsonParsingUnitTestsB

@Test
public void deserializeDetailsWithAllValues() throws Exception {
CredentialDetails<CertificateCredential> data = parseDetails(CERT_CREDENTIALS, CertificateCredential.class);
CredentialDetails<CertificateCredential> data = parseDetails(CERT_CREDENTIALS);

assertDetails(data, "cert", "authority", "private-key");
}
Expand All @@ -49,7 +49,7 @@ public void deserializeDetailsCertOnly() throws Exception {
" \"value\": {" +
" \"certificate\": \"cert\"" +
" }";
CredentialDetails<CertificateCredential> data = parseDetails(credentials, CertificateCredential.class);
CredentialDetails<CertificateCredential> data = parseDetails(credentials);

assertDetails(data, "cert", null, null);
}
Expand All @@ -62,14 +62,14 @@ public void deserializeDetailsWithNoCert() throws Exception {
" \"ca\": \"authority\"," +
" \"private_key\": \"private-key\"" +
" }";
CredentialDetails<CertificateCredential> data = parseDetails(credentials, CertificateCredential.class);
CredentialDetails<CertificateCredential> data = parseDetails(credentials);

assertDetails(data, null, "authority", "private-key");
}

@Test
public void deserializeDetailsData() throws Exception {
CredentialDetailsData<CertificateCredential> response = parseDetailsData(CERT_CREDENTIALS, CertificateCredential.class);
CredentialDetailsData<CertificateCredential> response = parseDetailsData(CERT_CREDENTIALS);

assertThat(response.getData().size(), equalTo(1));

Expand Down
Expand Up @@ -36,6 +36,7 @@ public void setUp() {
}

@Test
@SuppressWarnings("unchecked")
public void serializeWithParameters() throws Exception {
requestBuilder = CertificateParametersRequest.builder()
.name(new SimpleCredentialName("example", "credential"))
Expand Down Expand Up @@ -75,6 +76,7 @@ public void serializeWithParameters() throws Exception {
}

@Test
@SuppressWarnings("unchecked")
public void serializeWithMinimalParameters() throws Exception {
requestBuilder = CertificateParametersRequest.builder()
.name(new SimpleCredentialName("example", "credential"))
Expand Down

0 comments on commit 0980e37

Please sign in to comment.