diff --git a/api/src/main/java/keywhiz/api/ApiDate.java b/api/src/main/java/keywhiz/api/ApiDate.java new file mode 100644 index 000000000..3b09042db --- /dev/null +++ b/api/src/main/java/keywhiz/api/ApiDate.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2015 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package keywhiz.api; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.io.IOException; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; + +/** + * This is a wrapper for the date class used in API responses so we can have a custom JSON serializer and deserializer + */ +@JsonSerialize(using=ApiDate.ApiDateSerializer.class) +@JsonDeserialize(using=ApiDate.ApiDateDeserializer.class) +public class ApiDate { + + static class ApiDateSerializer extends JsonSerializer { + private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + @Override + public void serialize(ApiDate value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeString(formatter.format(value.offsetDateTime)); + } + } + + static class ApiDateDeserializer extends JsonDeserializer { + @Override + public ApiDate deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException { + return new ApiDate(parser.readValueAs(OffsetDateTime.class)); + } + } + + public static ApiDate parse(String s) { + return new ApiDate(OffsetDateTime.parse(s)); + } + + public static ApiDate now() { + return new ApiDate(OffsetDateTime.now()); + } + + public long toEpochSecond() { + return this.offsetDateTime.toEpochSecond(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ApiDate) { + ApiDate that = (ApiDate) obj; + return this.offsetDateTime.equals(that.offsetDateTime); + } + return false; + } + + @Override + public int hashCode() { + return this.offsetDateTime.hashCode(); + } + + public ApiDate(OffsetDateTime odt) { + this.offsetDateTime = odt; + } + + public OffsetDateTime offsetDateTime; +} + diff --git a/api/src/main/java/keywhiz/api/AutomationSecretResponse.java b/api/src/main/java/keywhiz/api/AutomationSecretResponse.java index 590d446de..b9686b651 100644 --- a/api/src/main/java/keywhiz/api/AutomationSecretResponse.java +++ b/api/src/main/java/keywhiz/api/AutomationSecretResponse.java @@ -38,7 +38,7 @@ public abstract class AutomationSecretResponse { public static AutomationSecretResponse create(long id, String name, String secret, - OffsetDateTime creationDate, boolean isVersioned, + ApiDate creationDate, boolean isVersioned, ImmutableMap metadata, ImmutableList groups) { return new AutoValue_AutomationSecretResponse(id, name, secret, decodedLength(secret), creationDate, isVersioned, groups, metadata); @@ -60,7 +60,7 @@ public static AutomationSecretResponse fromSecret(Secret secret, ImmutableList groups(); @JsonAnyGetter @JsonProperty("metadata") public abstract Map metadata(); diff --git a/api/src/main/java/keywhiz/api/ClientDetailResponse.java b/api/src/main/java/keywhiz/api/ClientDetailResponse.java index 88cba9a5e..6d327af55 100644 --- a/api/src/main/java/keywhiz/api/ClientDetailResponse.java +++ b/api/src/main/java/keywhiz/api/ClientDetailResponse.java @@ -34,10 +34,10 @@ public class ClientDetailResponse { public final String description; @JsonProperty - public final OffsetDateTime creationDate; + public final ApiDate creationDate; @JsonProperty - public final OffsetDateTime updateDate; + public final ApiDate updateDate; @JsonProperty public final String createdBy; @@ -55,8 +55,8 @@ public class ClientDetailResponse { public ClientDetailResponse(@JsonProperty("id") long id, @JsonProperty("name") String name, @JsonProperty("description") String description, - @JsonProperty("creationDate") OffsetDateTime creationDate, - @JsonProperty("updateDate") OffsetDateTime updateDate, + @JsonProperty("creationDate") ApiDate creationDate, + @JsonProperty("updateDate") ApiDate updateDate, @JsonProperty("createdBy") String createdBy, @JsonProperty("updatedBy") String updatedBy, @JsonProperty("groups") ImmutableList groups, diff --git a/api/src/main/java/keywhiz/api/GroupDetailResponse.java b/api/src/main/java/keywhiz/api/GroupDetailResponse.java index be61dc908..7204f7180 100644 --- a/api/src/main/java/keywhiz/api/GroupDetailResponse.java +++ b/api/src/main/java/keywhiz/api/GroupDetailResponse.java @@ -36,10 +36,10 @@ public class GroupDetailResponse { private final String description; @JsonProperty - private final OffsetDateTime creationDate; + private final ApiDate creationDate; @JsonProperty - private final OffsetDateTime updateDate; + private final ApiDate updateDate; @JsonProperty private final String createdBy; @@ -56,8 +56,8 @@ public class GroupDetailResponse { public GroupDetailResponse(@JsonProperty("id") long id, @JsonProperty("name") String name, @JsonProperty("description") String description, - @JsonProperty("creationDate") OffsetDateTime creationDate, - @JsonProperty("updateDate") OffsetDateTime updateDate, + @JsonProperty("creationDate") ApiDate creationDate, + @JsonProperty("updateDate") ApiDate updateDate, @JsonProperty("createdBy") String createdBy, @JsonProperty("updatedBy") String updatedBy, @JsonProperty("secrets") ImmutableList secrets, @@ -98,11 +98,11 @@ public String getDescription() { return description; } - public OffsetDateTime getCreationDate() { + public ApiDate getCreationDate() { return creationDate; } - public OffsetDateTime getUpdateDate() { + public ApiDate getUpdateDate() { return updateDate; } diff --git a/api/src/main/java/keywhiz/api/SecretDeliveryResponse.java b/api/src/main/java/keywhiz/api/SecretDeliveryResponse.java index 70e29a284..7f81e1eba 100644 --- a/api/src/main/java/keywhiz/api/SecretDeliveryResponse.java +++ b/api/src/main/java/keywhiz/api/SecretDeliveryResponse.java @@ -34,7 +34,7 @@ public class SecretDeliveryResponse { private final String name; private final String secret; private final int secretLength; - private final OffsetDateTime creationDate; + private final ApiDate creationDate; private final boolean isVersioned; private final ImmutableMap metadata; @@ -42,7 +42,7 @@ public SecretDeliveryResponse( @JsonProperty("name") String name, @JsonProperty("secret") String secret, @JsonProperty("secretLength") int secretLength, - @JsonProperty("creationDate") OffsetDateTime creationDate, + @JsonProperty("creationDate") ApiDate creationDate, @JsonProperty("isVersioned") boolean isVersioned, @JsonProperty("metadata") ImmutableMap metadata) { this.name = name; @@ -89,7 +89,7 @@ public int getSecretLength() { } /** @return ISO-8601 datetime the secret was created. */ - public OffsetDateTime getCreationDate() { + public ApiDate getCreationDate() { return creationDate; } diff --git a/api/src/main/java/keywhiz/api/SecretDetailResponse.java b/api/src/main/java/keywhiz/api/SecretDetailResponse.java index ecfa2ad10..e2ce6aee0 100644 --- a/api/src/main/java/keywhiz/api/SecretDetailResponse.java +++ b/api/src/main/java/keywhiz/api/SecretDetailResponse.java @@ -37,7 +37,7 @@ public class SecretDetailResponse { public final String description; @JsonProperty - public final OffsetDateTime createdAt; + public final ApiDate createdAt; /** User who created the record. */ @JsonProperty @@ -45,7 +45,7 @@ public class SecretDetailResponse { /** Should equal createdAt, but added for consistency in the API. */ @JsonProperty - public final OffsetDateTime updatedAt; + public final ApiDate updatedAt; /** User who updated the record. */ @JsonProperty @@ -67,9 +67,9 @@ public class SecretDetailResponse { public SecretDetailResponse(@JsonProperty("id") long id, @JsonProperty("name") String name, @JsonProperty("description") String description, - @JsonProperty("createdAt") OffsetDateTime createdAt, + @JsonProperty("createdAt") ApiDate createdAt, @JsonProperty("createdBy") String createdBy, - @JsonProperty("updatedAt") OffsetDateTime updatedAt, + @JsonProperty("updatedAt") ApiDate updatedAt, @JsonProperty("updatedBy") String updatedBy, @JsonProperty("isVersioned") boolean versioned, @JsonProperty("metadata") ImmutableMap metadata, diff --git a/api/src/main/java/keywhiz/api/automation/v2/SecretDetailResponseV2.java b/api/src/main/java/keywhiz/api/automation/v2/SecretDetailResponseV2.java index 12ffc397a..b0d4fbc8f 100644 --- a/api/src/main/java/keywhiz/api/automation/v2/SecretDetailResponseV2.java +++ b/api/src/main/java/keywhiz/api/automation/v2/SecretDetailResponseV2.java @@ -11,6 +11,7 @@ import java.util.List; import java.util.Map; import javax.annotation.Nullable; + import keywhiz.api.model.Secret; import keywhiz.api.model.SecretSeries; diff --git a/api/src/main/java/keywhiz/api/model/Client.java b/api/src/main/java/keywhiz/api/model/Client.java index 751b13a46..c56b739ca 100644 --- a/api/src/main/java/keywhiz/api/model/Client.java +++ b/api/src/main/java/keywhiz/api/model/Client.java @@ -19,6 +19,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.MoreObjects; import com.google.common.base.Objects; +import keywhiz.api.ApiDate; + import java.time.OffsetDateTime; import javax.annotation.Nullable; @@ -37,13 +39,13 @@ public class Client { private final String description; @JsonProperty - private final OffsetDateTime createdAt; + private final ApiDate createdAt; @JsonProperty private final String createdBy; @JsonProperty - private final OffsetDateTime updatedAt; + private final ApiDate updatedAt; @JsonProperty private final String updatedBy; @@ -59,9 +61,9 @@ public class Client { public Client(@JsonProperty("id") long id, @JsonProperty("name") String name, @JsonProperty("description") @Nullable String description, - @JsonProperty("createdAt") OffsetDateTime createdAt, + @JsonProperty("createdAt") ApiDate createdAt, @JsonProperty("createdBy") @Nullable String createdBy, - @JsonProperty("updatedAt") OffsetDateTime updatedAt, + @JsonProperty("updatedAt") ApiDate updatedAt, @JsonProperty("updatedBy") @Nullable String updatedBy, @JsonProperty("enabled") boolean enabled, @JsonProperty("automationAllowed") boolean automationAllowed) { @@ -88,7 +90,7 @@ public String getDescription() { return description; } - public OffsetDateTime getCreatedAt() { + public ApiDate getCreatedAt() { return createdAt; } @@ -96,7 +98,7 @@ public String getCreatedBy() { return createdBy; } - public OffsetDateTime getUpdatedAt() { + public ApiDate getUpdatedAt() { return updatedAt; } diff --git a/api/src/main/java/keywhiz/api/model/Group.java b/api/src/main/java/keywhiz/api/model/Group.java index 619d10fc8..a2e6fd51d 100644 --- a/api/src/main/java/keywhiz/api/model/Group.java +++ b/api/src/main/java/keywhiz/api/model/Group.java @@ -18,6 +18,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.MoreObjects; import com.google.common.base.Objects; +import keywhiz.api.ApiDate; + import java.time.OffsetDateTime; import javax.annotation.Nullable; @@ -39,13 +41,13 @@ public class Group { private final String description; @JsonProperty - private final OffsetDateTime createdAt; + private final ApiDate createdAt; @JsonProperty private final String createdBy; @JsonProperty - private final OffsetDateTime updatedAt; + private final ApiDate updatedAt; @JsonProperty private final String updatedBy; @@ -53,9 +55,9 @@ public class Group { public Group(@JsonProperty("id") long id, @JsonProperty("name") String name, @JsonProperty("description") @Nullable String description, - @JsonProperty("createdAt") OffsetDateTime createdAt, + @JsonProperty("createdAt") ApiDate createdAt, @JsonProperty("createdBy") @Nullable String createdBy, - @JsonProperty("updatedAt") OffsetDateTime updatedAt, + @JsonProperty("updatedAt") ApiDate updatedAt, @JsonProperty("updatedBy") @Nullable String updatedBy) { this.id = id; this.name = checkNotNull(name); @@ -78,15 +80,13 @@ public String getDescription() { return description; } - public OffsetDateTime getCreatedAt() { - return createdAt; - } + public ApiDate getCreatedAt() { return createdAt; } public String getCreatedBy() { return createdBy; } - public OffsetDateTime getUpdatedAt() { + public ApiDate getUpdatedAt() { return updatedAt; } diff --git a/api/src/main/java/keywhiz/api/model/SanitizedSecret.java b/api/src/main/java/keywhiz/api/model/SanitizedSecret.java index 77c820abb..fff47b20a 100644 --- a/api/src/main/java/keywhiz/api/model/SanitizedSecret.java +++ b/api/src/main/java/keywhiz/api/model/SanitizedSecret.java @@ -21,6 +21,8 @@ import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import keywhiz.api.ApiDate; + import java.time.OffsetDateTime; import java.util.List; import java.util.Map; @@ -40,9 +42,9 @@ public abstract class SanitizedSecret { @JsonProperty("name") String name, @JsonProperty("version") String version, @JsonProperty("description") @Nullable String description, - @JsonProperty("createdAt") OffsetDateTime createdAt, + @JsonProperty("createdAt") ApiDate createdAt, @JsonProperty("createdBy") @Nullable String createdBy, - @JsonProperty("updatedAt") OffsetDateTime updatedAt, + @JsonProperty("updatedAt") ApiDate updatedAt, @JsonProperty("updatedBy") @Nullable String updatedBy, @JsonProperty("metadata") @Nullable Map metadata, @JsonProperty("type") @Nullable String type, @@ -111,9 +113,9 @@ public static List fromSecrets(List secrets) { @JsonProperty public abstract String name(); @JsonProperty public abstract String version(); @JsonProperty public abstract String description(); - @JsonProperty public abstract OffsetDateTime createdAt(); + @JsonProperty public abstract ApiDate createdAt(); @JsonProperty public abstract String createdBy(); - @JsonProperty public abstract OffsetDateTime updatedAt(); + @JsonProperty public abstract ApiDate updatedAt(); @JsonProperty public abstract String updatedBy(); @JsonProperty public abstract ImmutableMap metadata(); @JsonProperty public abstract Optional type(); diff --git a/api/src/main/java/keywhiz/api/model/Secret.java b/api/src/main/java/keywhiz/api/model/Secret.java index 3efe1eaf2..c1f84bd97 100644 --- a/api/src/main/java/keywhiz/api/model/Secret.java +++ b/api/src/main/java/keywhiz/api/model/Secret.java @@ -18,6 +18,8 @@ import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.ImmutableMap; +import keywhiz.api.ApiDate; + import java.text.ParseException; import java.time.OffsetDateTime; import java.util.Map; @@ -54,9 +56,9 @@ public class Secret { /** Base64-encoded content of this version of the secret. */ private final String secret; - private final OffsetDateTime createdAt; + private final ApiDate createdAt; private final String createdBy; - private final OffsetDateTime updatedAt; + private final ApiDate updatedAt; private final String updatedBy; /** Key-value metadata of the secret. */ @@ -70,9 +72,9 @@ public Secret(long id, @Nullable String version, @Nullable String description, String secret, - OffsetDateTime createdAt, + ApiDate createdAt, @Nullable String createdBy, - OffsetDateTime updatedAt, + ApiDate updatedAt, @Nullable String updatedBy, @Nullable Map metadata, @Nullable String type, @@ -124,7 +126,7 @@ public String getSecret() { return secret; } - public OffsetDateTime getCreatedAt() { + public ApiDate getCreatedAt() { return createdAt; } @@ -132,7 +134,7 @@ public String getCreatedBy() { return createdBy; } - public OffsetDateTime getUpdatedAt() { + public ApiDate getUpdatedAt() { return updatedAt; } diff --git a/api/src/main/java/keywhiz/api/model/SecretContent.java b/api/src/main/java/keywhiz/api/model/SecretContent.java index ed4ce8704..0a4539f02 100644 --- a/api/src/main/java/keywhiz/api/model/SecretContent.java +++ b/api/src/main/java/keywhiz/api/model/SecretContent.java @@ -20,6 +20,8 @@ import com.google.auto.value.AutoValue; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableMap; +import keywhiz.api.ApiDate; + import java.time.OffsetDateTime; import java.util.Optional; import javax.annotation.Nullable; @@ -33,8 +35,8 @@ @AutoValue public abstract class SecretContent { public static SecretContent of(long id, long secretSeriesId, String encryptedContent, - @Nullable String version, OffsetDateTime createdAt, @Nullable String createdBy, - OffsetDateTime updatedAt, @Nullable String updatedBy, ImmutableMap metadata) { + @Nullable String version, ApiDate createdAt, @Nullable String createdBy, + ApiDate updatedAt, @Nullable String updatedBy, ImmutableMap metadata) { return new AutoValue_SecretContent(id, secretSeriesId, encryptedContent, Optional.ofNullable(version), createdAt, nullToEmpty(createdBy), updatedAt, nullToEmpty(updatedBy), metadata); @@ -44,9 +46,9 @@ public static SecretContent of(long id, long secretSeriesId, String encryptedCon public abstract long secretSeriesId(); public abstract String encryptedContent(); public abstract Optional version(); - public abstract OffsetDateTime createdAt(); + public abstract ApiDate createdAt(); public abstract String createdBy(); - public abstract OffsetDateTime updatedAt(); + public abstract ApiDate updatedAt(); public abstract String updatedBy(); @JsonAnyGetter public abstract ImmutableMap metadata(); diff --git a/api/src/main/java/keywhiz/api/model/SecretSeries.java b/api/src/main/java/keywhiz/api/model/SecretSeries.java index fb6138bbf..61b5ff121 100644 --- a/api/src/main/java/keywhiz/api/model/SecretSeries.java +++ b/api/src/main/java/keywhiz/api/model/SecretSeries.java @@ -18,6 +18,8 @@ import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableMap; +import keywhiz.api.ApiDate; + import java.time.OffsetDateTime; import java.util.Map; import java.util.Optional; @@ -38,9 +40,9 @@ public static SecretSeries of( long id, String name, @Nullable String description, - OffsetDateTime createdAt, + ApiDate createdAt, @Nullable String createdBy, - OffsetDateTime updatedAt, + ApiDate updatedAt, @Nullable String updatedBy, @Nullable String type, @Nullable Map generationOptions) { @@ -52,9 +54,9 @@ public static SecretSeries of( public abstract long id(); public abstract String name(); public abstract String description(); - public abstract OffsetDateTime createdAt(); + public abstract ApiDate createdAt(); public abstract String createdBy(); - public abstract OffsetDateTime updatedAt(); + public abstract ApiDate updatedAt(); public abstract String updatedBy(); public abstract Optional type(); public abstract ImmutableMap generationOptions(); diff --git a/api/src/test/java/keywhiz/api/AutomationSecretResponseTest.java b/api/src/test/java/keywhiz/api/AutomationSecretResponseTest.java index 10f7e7ffd..0b78bc985 100644 --- a/api/src/test/java/keywhiz/api/AutomationSecretResponseTest.java +++ b/api/src/test/java/keywhiz/api/AutomationSecretResponseTest.java @@ -34,7 +34,7 @@ public class AutomationSecretResponseTest { private static final ImmutableMap metadata = ImmutableMap.of("key1", "value1", "key2", "value2"); - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); private static final Secret secret = new Secret(0, "name", VersionGenerator.now().toHex(), null, "YWJj", NOW, null, NOW, null, metadata, "upload", null); @@ -68,7 +68,7 @@ public void serializesCorrectly() throws Exception { 0, "Database_Password", secret, - OffsetDateTime.parse("2011-09-29T15:46:00.232Z"), + ApiDate.parse("2011-09-29T15:46:00.232Z"), false, ImmutableMap.of(), ImmutableList.of()); @@ -79,7 +79,7 @@ public void serializesCorrectly() throws Exception { 33, "General_Password..0be68f903f8b7d86", secret, - OffsetDateTime.parse("2011-09-29T15:46:00.312Z"), + ApiDate.parse("2011-09-29T15:46:00.312Z"), true, ImmutableMap.of(), ImmutableList.of()); @@ -90,7 +90,7 @@ public void serializesCorrectly() throws Exception { 66, "Nobody_PgPass", secret, - OffsetDateTime.parse("2011-09-29T15:46:00.232Z"), + ApiDate.parse("2011-09-29T15:46:00.232Z"), false, ImmutableMap.of("mode", "0400", "owner", "nobody"), ImmutableList.of()); diff --git a/api/src/test/java/keywhiz/api/ClientDetailResponseTest.java b/api/src/test/java/keywhiz/api/ClientDetailResponseTest.java index c44a94da7..f59d3b7d1 100644 --- a/api/src/test/java/keywhiz/api/ClientDetailResponseTest.java +++ b/api/src/test/java/keywhiz/api/ClientDetailResponseTest.java @@ -30,8 +30,8 @@ public class ClientDetailResponseTest { 9875, "Client Name", "Client Description", - OffsetDateTime.parse("2012-08-01T13:15:30.001Z"), - OffsetDateTime.parse("2012-09-10T03:15:30.001Z"), + ApiDate.parse("2012-08-01T13:15:30.001Z"), + ApiDate.parse("2012-09-10T03:15:30.001Z"), "creator-user", "updater-user", ImmutableList.of(), diff --git a/api/src/test/java/keywhiz/api/GroupDetailResponseTest.java b/api/src/test/java/keywhiz/api/GroupDetailResponseTest.java index 1e0984160..32030b5fd 100644 --- a/api/src/test/java/keywhiz/api/GroupDetailResponseTest.java +++ b/api/src/test/java/keywhiz/api/GroupDetailResponseTest.java @@ -30,8 +30,8 @@ public class GroupDetailResponseTest { 234, "group-name", "", - OffsetDateTime.parse("2012-08-01T13:15:30.001Z"), - OffsetDateTime.parse("2012-09-10T03:15:30.001Z"), + ApiDate.parse("2012-08-01T13:15:30.001Z"), + ApiDate.parse("2012-09-10T03:15:30.001Z"), "creator-user", "updater-user", ImmutableList.of(), diff --git a/api/src/test/java/keywhiz/api/SecretDeliveryResponseTest.java b/api/src/test/java/keywhiz/api/SecretDeliveryResponseTest.java index 22feb98c8..06f13ebfd 100644 --- a/api/src/test/java/keywhiz/api/SecretDeliveryResponseTest.java +++ b/api/src/test/java/keywhiz/api/SecretDeliveryResponseTest.java @@ -31,7 +31,7 @@ public class SecretDeliveryResponseTest { private static final ImmutableMap metadata = ImmutableMap.of("key1", "value1", "key2", "value2"); - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); private static final Secret secret = new Secret(0, "name", VersionGenerator.now().toHex(), null, "YWJj", NOW, null, NOW, null, metadata, "upload", null); @@ -61,7 +61,7 @@ public void serializesCorrectly() throws Exception { "Database_Password", secret, decodedLength(secret), - OffsetDateTime.parse("2011-09-29T15:46:00.232Z"), + ApiDate.parse("2011-09-29T15:46:00.232Z"), false, ImmutableMap.of()); assertThat(asJson(secretDeliveryResponse)) @@ -71,7 +71,7 @@ public void serializesCorrectly() throws Exception { "General_Password..0be68f903f8b7d86", secret, decodedLength(secret), - OffsetDateTime.parse("2011-09-29T15:46:00.312Z"), + ApiDate.parse("2011-09-29T15:46:00.312Z"), true, ImmutableMap.of()); assertThat(asJson(secretDeliveryResponseWithVersion)) @@ -81,7 +81,7 @@ public void serializesCorrectly() throws Exception { "Nobody_PgPass", secret, decodedLength(secret), - OffsetDateTime.parse("2011-09-29T15:46:00.232Z"), + ApiDate.parse("2011-09-29T15:46:00.232Z"), false, ImmutableMap.of("mode", "0400", "owner", "nobody")); assertThat(asJson(secretDeliveryResponseWithMetadata)) diff --git a/api/src/test/java/keywhiz/api/SecretDetailResponseTest.java b/api/src/test/java/keywhiz/api/SecretDetailResponseTest.java index 9a7be78be..4649078e2 100644 --- a/api/src/test/java/keywhiz/api/SecretDetailResponseTest.java +++ b/api/src/test/java/keywhiz/api/SecretDetailResponseTest.java @@ -32,9 +32,9 @@ public class SecretDetailResponseTest { 1000, "secretName", "desc", - OffsetDateTime.parse("2013-03-28T21:23:04.159Z"), + ApiDate.parse("2013-03-28T21:23:00.000Z"), "keywhizAdmin", - OffsetDateTime.parse("2013-03-28T21:23:04.159Z"), + ApiDate.parse("2013-03-28T21:23:04.159Z"), "keywhizAdmin", true, ImmutableMap.of("mode", "0660"), @@ -42,13 +42,14 @@ public class SecretDetailResponseTest { new Group(2000, "someGroup", "groupDesc", - OffsetDateTime.parse("2013-03-28T21:29:27.465Z"), + ApiDate.parse("2013-03-28T21:29:27.465Z"), "keywhizAdmin", - OffsetDateTime.parse("2013-03-28T21:29:27.465Z"), + ApiDate.parse("2013-03-28T21:29:27.465Z"), "keywhizAdmin") ), ImmutableList.of()); + assertThat(asJson(secretDetailResponse)) .isEqualTo(jsonFixture("fixtures/secretDetailResponse.json")); } diff --git a/api/src/test/java/keywhiz/api/SecretsResponseTest.java b/api/src/test/java/keywhiz/api/SecretsResponseTest.java index 58723493c..d466b984a 100644 --- a/api/src/test/java/keywhiz/api/SecretsResponseTest.java +++ b/api/src/test/java/keywhiz/api/SecretsResponseTest.java @@ -34,9 +34,9 @@ public class SecretsResponseTest { "trapdoor", "0be6a2fc049ee349", "v1", - OffsetDateTime.parse("2013-03-28T21:42:42.573Z"), + ApiDate.parse("2013-03-28T21:42:42.573Z"), "keywhizAdmin", - OffsetDateTime.parse("2013-03-28T21:42:42.573Z"), + ApiDate.parse("2013-03-28T21:42:42.573Z"), "keywhizAdmin", ImmutableMap.of("owner", "the king"), "password", @@ -46,9 +46,9 @@ public class SecretsResponseTest { "anotherSecret", "", "", - OffsetDateTime.parse("2013-04-28T21:42:42.573Z"), + ApiDate.parse("2013-04-28T21:42:42.573Z"), "keywhizAdmin", - OffsetDateTime.parse("2013-04-28T21:42:42.573Z"), + ApiDate.parse("2013-04-28T21:42:42.573Z"), "keywhizAdmin", null, "upload", diff --git a/api/src/test/java/keywhiz/api/model/ClientTest.java b/api/src/test/java/keywhiz/api/model/ClientTest.java index 3237db872..4da916fac 100644 --- a/api/src/test/java/keywhiz/api/model/ClientTest.java +++ b/api/src/test/java/keywhiz/api/model/ClientTest.java @@ -17,6 +17,8 @@ package keywhiz.api.model; import java.time.OffsetDateTime; + +import keywhiz.api.ApiDate; import org.junit.Test; import static keywhiz.testing.JsonHelpers.asJson; @@ -28,9 +30,9 @@ public class ClientTest { Client client = new Client(200, "someClient", "clientDesc", - OffsetDateTime.parse("2013-03-28T21:29:27.465Z"), + ApiDate.parse("2013-03-28T21:29:27.465Z"), "keywhizAdmin", - OffsetDateTime.parse("2013-03-28T21:29:27.465Z"), + ApiDate.parse("2013-03-28T21:29:27.465Z"), "keywhizAdmin", true, false); diff --git a/api/src/test/java/keywhiz/api/model/GroupTest.java b/api/src/test/java/keywhiz/api/model/GroupTest.java index 3ce1be4e0..072d35038 100644 --- a/api/src/test/java/keywhiz/api/model/GroupTest.java +++ b/api/src/test/java/keywhiz/api/model/GroupTest.java @@ -17,6 +17,8 @@ package keywhiz.api.model; import java.time.OffsetDateTime; + +import keywhiz.api.ApiDate; import org.junit.Test; import static keywhiz.testing.JsonHelpers.asJson; @@ -28,9 +30,9 @@ public class GroupTest { Group group = new Group(330, "someGroup", "groupDesc", - OffsetDateTime.parse("2013-03-28T21:29:27.465Z"), + ApiDate.parse("2013-03-28T21:29:27.465Z"), "keywhizAdmin", - OffsetDateTime.parse("2013-03-28T21:29:27.465Z"), + ApiDate.parse("2013-03-28T21:29:27.465Z"), "keywhizAdmin"); assertThat(asJson(group)).isEqualTo(jsonFixture("fixtures/group.json")); diff --git a/api/src/test/java/keywhiz/api/model/SanitizedSecretTest.java b/api/src/test/java/keywhiz/api/model/SanitizedSecretTest.java index 4a4e823de..adbe0b38d 100644 --- a/api/src/test/java/keywhiz/api/model/SanitizedSecretTest.java +++ b/api/src/test/java/keywhiz/api/model/SanitizedSecretTest.java @@ -18,6 +18,8 @@ import com.google.common.collect.ImmutableMap; import java.time.OffsetDateTime; + +import keywhiz.api.ApiDate; import org.junit.Test; import static keywhiz.testing.JsonHelpers.asJson; @@ -27,17 +29,17 @@ public class SanitizedSecretTest { @Test public void serializesCorrectly() throws Exception { SanitizedSecret sanitizedSecret = SanitizedSecret.of( - 767, - "trapdoor", - "0be6a2fc049ee349", - "v1", - OffsetDateTime.parse("2013-03-28T21:42:42.573Z"), - "keywhizAdmin", - OffsetDateTime.parse("2013-03-28T21:42:42.573Z"), - "keywhizAdmin", - ImmutableMap.of("owner", "the king"), - "password", - ImmutableMap.of("favoriteFood", "PB&J sandwich")); + 767, + "trapdoor", + "0be6a2fc049ee349", + "v1", + ApiDate.parse("2013-03-28T21:42:42.573Z"), + "keywhizAdmin", + ApiDate.parse("2013-03-28T21:42:42.573Z"), + "keywhizAdmin", + ImmutableMap.of("owner", "the king"), + "password", + ImmutableMap.of("favoriteFood", "PB&J sandwich")); assertThat(asJson(sanitizedSecret)) .isEqualTo(jsonFixture("fixtures/sanitizedSecret.json")); diff --git a/api/src/test/resources/fixtures/secretDetailResponse.json b/api/src/test/resources/fixtures/secretDetailResponse.json index 10862941e..7bcd22df0 100644 --- a/api/src/test/resources/fixtures/secretDetailResponse.json +++ b/api/src/test/resources/fixtures/secretDetailResponse.json @@ -2,7 +2,7 @@ "id" : 1000, "name" : "secretName", "description" : "desc", - "createdAt" : "2013-03-28T21:23:04.159Z", + "createdAt" : "2013-03-28T21:23:00.000Z", "createdBy" : "keywhizAdmin", "updatedAt" : "2013-03-28T21:23:04.159Z", "updatedBy" : "keywhizAdmin", diff --git a/cli/src/main/java/keywhiz/cli/CliModule.java b/cli/src/main/java/keywhiz/cli/CliModule.java index 4dacfeee3..a6afc9509 100644 --- a/cli/src/main/java/keywhiz/cli/CliModule.java +++ b/cli/src/main/java/keywhiz/cli/CliModule.java @@ -18,18 +18,13 @@ import com.beust.jcommander.JCommander; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.util.StdDateFormat; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JSR310Module; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.name.Names; import com.google.inject.util.Providers; import io.dropwizard.jackson.Jackson; -import java.util.Locale; import java.util.Map; -import java.util.TimeZone; import keywhiz.cli.configs.CliConfiguration; public class CliModule extends AbstractModule { @@ -76,9 +71,6 @@ public CliModule(CliConfiguration config, JCommander parentCommander, JCommander */ ObjectMapper objectMapper = Jackson.newObjectMapper(); objectMapper.registerModule(new Jdk8Module()); - objectMapper.registerModule(new JSR310Module()); - objectMapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - objectMapper.setDateFormat(StdDateFormat.getISO8601Format(TimeZone.getTimeZone("UTC"), Locale.ENGLISH)); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); return objectMapper; } diff --git a/cli/src/test/java/keywhiz/cli/commands/AddActionTest.java b/cli/src/test/java/keywhiz/cli/commands/AddActionTest.java index c6752ba54..df17f2b41 100644 --- a/cli/src/test/java/keywhiz/cli/commands/AddActionTest.java +++ b/cli/src/test/java/keywhiz/cli/commands/AddActionTest.java @@ -22,6 +22,8 @@ import java.time.OffsetDateTime; import java.util.Arrays; import java.util.Base64; + +import keywhiz.api.ApiDate; import keywhiz.api.SecretDetailResponse; import keywhiz.api.model.Client; import keywhiz.api.model.Group; @@ -44,7 +46,7 @@ import static org.mockito.Mockito.when; public class AddActionTest { - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); private static final Base64.Decoder base64Decoder = Base64.getDecoder(); @Rule public MockitoRule mockito = MockitoJUnit.rule(); diff --git a/cli/src/test/java/keywhiz/cli/commands/AssignActionTest.java b/cli/src/test/java/keywhiz/cli/commands/AssignActionTest.java index ed48e5067..46f0712f8 100644 --- a/cli/src/test/java/keywhiz/cli/commands/AssignActionTest.java +++ b/cli/src/test/java/keywhiz/cli/commands/AssignActionTest.java @@ -20,6 +20,8 @@ import com.google.common.collect.ImmutableMap; import java.time.OffsetDateTime; import java.util.Arrays; + +import keywhiz.api.ApiDate; import keywhiz.api.GroupDetailResponse; import keywhiz.api.model.Client; import keywhiz.api.model.Group; @@ -42,7 +44,7 @@ import static org.mockito.Mockito.when; public class AssignActionTest { - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); @Rule public MockitoRule mockito = MockitoJUnit.rule(); diff --git a/cli/src/test/java/keywhiz/cli/commands/DeleteActionTest.java b/cli/src/test/java/keywhiz/cli/commands/DeleteActionTest.java index c9e808021..8c91c3ff4 100644 --- a/cli/src/test/java/keywhiz/cli/commands/DeleteActionTest.java +++ b/cli/src/test/java/keywhiz/cli/commands/DeleteActionTest.java @@ -20,6 +20,8 @@ import java.io.ByteArrayInputStream; import java.time.OffsetDateTime; import java.util.Arrays; + +import keywhiz.api.ApiDate; import keywhiz.api.model.Client; import keywhiz.api.model.Group; import keywhiz.api.model.SanitizedSecret; @@ -42,7 +44,7 @@ import static org.mockito.Mockito.when; public class DeleteActionTest { - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); @Rule public MockitoRule mockito = MockitoJUnit.rule(); diff --git a/cli/src/test/java/keywhiz/cli/commands/DescribeActionTest.java b/cli/src/test/java/keywhiz/cli/commands/DescribeActionTest.java index f8e2ce6d1..bd7978738 100644 --- a/cli/src/test/java/keywhiz/cli/commands/DescribeActionTest.java +++ b/cli/src/test/java/keywhiz/cli/commands/DescribeActionTest.java @@ -19,6 +19,8 @@ import com.google.common.collect.ImmutableMap; import java.time.OffsetDateTime; import java.util.Arrays; + +import keywhiz.api.ApiDate; import keywhiz.api.model.Client; import keywhiz.api.model.Group; import keywhiz.api.model.SanitizedSecret; @@ -40,7 +42,7 @@ import static org.mockito.Mockito.when; public class DescribeActionTest { - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); @Rule public MockitoRule mockito = MockitoJUnit.rule(); diff --git a/cli/src/test/java/keywhiz/cli/commands/UnassignActionTest.java b/cli/src/test/java/keywhiz/cli/commands/UnassignActionTest.java index e1926cc76..6914d4971 100644 --- a/cli/src/test/java/keywhiz/cli/commands/UnassignActionTest.java +++ b/cli/src/test/java/keywhiz/cli/commands/UnassignActionTest.java @@ -20,6 +20,8 @@ import com.google.common.collect.ImmutableMap; import java.time.OffsetDateTime; import java.util.Arrays; + +import keywhiz.api.ApiDate; import keywhiz.api.GroupDetailResponse; import keywhiz.api.model.Client; import keywhiz.api.model.Group; @@ -39,7 +41,7 @@ import static org.mockito.Mockito.when; public class UnassignActionTest { - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); @Rule public MockitoRule mockito = MockitoJUnit.rule(); diff --git a/pom.xml b/pom.xml index e1fdc7158..68f15d831 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ 0.8.1 4.0 - 2.5.3 + 2.6.1 3.6.2 1.6.2 1.7.12 diff --git a/server/src/main/java/keywhiz/KeywhizService.java b/server/src/main/java/keywhiz/KeywhizService.java index 4f7b266da..878962241 100644 --- a/server/src/main/java/keywhiz/KeywhizService.java +++ b/server/src/main/java/keywhiz/KeywhizService.java @@ -17,10 +17,8 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.util.StdDateFormat; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JSR310Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.google.common.collect.Maps; import com.google.inject.Guice; import com.google.inject.Injector; @@ -29,9 +27,7 @@ import io.dropwizard.jersey.setup.JerseyEnvironment; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; -import java.util.Locale; import java.util.Map; -import java.util.TimeZone; import keywhiz.auth.mutualssl.ClientCertificateFilter; import keywhiz.auth.xsrf.XsrfServletFilter; import keywhiz.commands.DbSeedCommand; @@ -201,7 +197,6 @@ public void addSecretGenerator(String name, SecretGenerator secretGenerator) jersey.register(injector.getInstance(AutomationSecretGeneratorsResource.class)); logger.debug("Keywhiz configuration complete"); } - /** * Customizes ObjectMapper for common settings. * @@ -210,9 +205,7 @@ public void addSecretGenerator(String name, SecretGenerator secretGenerator) */ public static ObjectMapper customizeObjectMapper(ObjectMapper objectMapper) { objectMapper.registerModules(new Jdk8Module()); - objectMapper.registerModules(new JSR310Module()); - objectMapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - objectMapper.setDateFormat(StdDateFormat.getISO8601Format(TimeZone.getTimeZone("UTC"), Locale.ENGLISH)); + objectMapper.registerModules(new JavaTimeModule()); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); return objectMapper; } diff --git a/server/src/main/java/keywhiz/service/daos/ClientMapper.java b/server/src/main/java/keywhiz/service/daos/ClientMapper.java index 00c734ccb..1cc67943f 100644 --- a/server/src/main/java/keywhiz/service/daos/ClientMapper.java +++ b/server/src/main/java/keywhiz/service/daos/ClientMapper.java @@ -16,6 +16,7 @@ package keywhiz.service.daos; +import keywhiz.api.ApiDate; import keywhiz.api.model.Client; import keywhiz.jooq.tables.records.ClientsRecord; import org.jooq.RecordMapper; @@ -32,9 +33,9 @@ public Client map(ClientsRecord r) { r.getId(), r.getName(), r.getDescription(), - r.getCreatedat(), + new ApiDate(r.getCreatedat()), r.getCreatedby(), - r.getUpdatedat(), + new ApiDate(r.getUpdatedat()), r.getUpdatedby(), r.getEnabled(), r.getAutomationallowed()); diff --git a/server/src/main/java/keywhiz/service/daos/GroupMapper.java b/server/src/main/java/keywhiz/service/daos/GroupMapper.java index e04dd65f8..04afdd15e 100644 --- a/server/src/main/java/keywhiz/service/daos/GroupMapper.java +++ b/server/src/main/java/keywhiz/service/daos/GroupMapper.java @@ -16,6 +16,7 @@ package keywhiz.service.daos; +import keywhiz.api.ApiDate; import keywhiz.api.model.Group; import keywhiz.jooq.tables.records.GroupsRecord; import org.jooq.RecordMapper; @@ -26,9 +27,9 @@ public Group map(GroupsRecord r) { r.getId(), r.getName(), r.getDescription(), - r.getCreatedat(), + new ApiDate(r.getCreatedat()), r.getCreatedby(), - r.getUpdatedat(), + new ApiDate(r.getUpdatedat()), r.getUpdatedby()); } } diff --git a/server/src/main/java/keywhiz/service/daos/SecretContentMapper.java b/server/src/main/java/keywhiz/service/daos/SecretContentMapper.java index b4213d42b..5314ecb3f 100644 --- a/server/src/main/java/keywhiz/service/daos/SecretContentMapper.java +++ b/server/src/main/java/keywhiz/service/daos/SecretContentMapper.java @@ -22,6 +22,8 @@ import java.io.IOException; import java.util.Map; import javax.inject.Inject; + +import keywhiz.api.ApiDate; import keywhiz.api.model.SecretContent; import keywhiz.jooq.tables.records.SecretsContentRecord; import org.jooq.RecordMapper; @@ -41,9 +43,9 @@ public SecretContent map(SecretsContentRecord r) { r.getSecretid(), r.getEncryptedContent(), r.getVersion(), - r.getCreatedat(), + new ApiDate(r.getCreatedat()), r.getCreatedby(), - r.getUpdatedat(), + new ApiDate(r.getUpdatedat()), r.getUpdatedby(), tryToReadMapFromMetadata(r)); } diff --git a/server/src/main/java/keywhiz/service/daos/SecretSeriesMapper.java b/server/src/main/java/keywhiz/service/daos/SecretSeriesMapper.java index e261fb6bd..e35c2f0db 100644 --- a/server/src/main/java/keywhiz/service/daos/SecretSeriesMapper.java +++ b/server/src/main/java/keywhiz/service/daos/SecretSeriesMapper.java @@ -21,6 +21,8 @@ import java.io.IOException; import java.util.Map; import javax.inject.Inject; + +import keywhiz.api.ApiDate; import keywhiz.api.model.SecretSeries; import keywhiz.jooq.tables.records.SecretsRecord; import org.jooq.RecordMapper; @@ -39,9 +41,9 @@ public SecretSeries map(SecretsRecord r) { r.getId(), r.getName(), r.getDescription(), - r.getCreatedat(), + new ApiDate(r.getCreatedat()), r.getCreatedby(), - r.getUpdatedat(), + new ApiDate(r.getUpdatedat()), r.getUpdatedby(), r.getType(), tryToReadMapValue(r)); diff --git a/server/src/test/java/keywhiz/service/daos/SecretContentDAOTest.java b/server/src/test/java/keywhiz/service/daos/SecretContentDAOTest.java index ef37b7ba7..64ce5fd2c 100644 --- a/server/src/test/java/keywhiz/service/daos/SecretContentDAOTest.java +++ b/server/src/test/java/keywhiz/service/daos/SecretContentDAOTest.java @@ -27,6 +27,7 @@ import java.util.List; import javax.inject.Inject; import keywhiz.TestDBRule; +import keywhiz.api.ApiDate; import keywhiz.api.model.SecretContent; import keywhiz.service.config.Readonly; import keywhiz.service.daos.SecretContentDAO.SecretContentDAOFactory; @@ -50,7 +51,7 @@ public class SecretContentDAOTest { @Inject SecretContentDAOFactory secretContentDAOFactory; - final static OffsetDateTime date = OffsetDateTime.now(ZoneId.of("UTC")); + final static ApiDate date = ApiDate.now(); ImmutableMap metadata = ImmutableMap.of("foo", "bar"); SecretContent secretContent1 = SecretContent.of(11, 22, "[crypted]", "", date, "creator", date, @@ -74,9 +75,9 @@ public void setUp() throws Exception { .set(SECRETS_CONTENT.SECRETID, (int) secretContent1.secretSeriesId()) .set(SECRETS_CONTENT.ENCRYPTED_CONTENT, secretContent1.encryptedContent()) .set(SECRETS_CONTENT.VERSION, secretContent1.version().orElse(null)) - .set(SECRETS_CONTENT.CREATEDAT, secretContent1.createdAt()) + .set(SECRETS_CONTENT.CREATEDAT, secretContent1.createdAt().offsetDateTime) .set(SECRETS_CONTENT.CREATEDBY, secretContent1.createdBy()) - .set(SECRETS_CONTENT.UPDATEDAT, secretContent1.updatedAt()) + .set(SECRETS_CONTENT.UPDATEDAT, secretContent1.updatedAt().offsetDateTime) .set(SECRETS_CONTENT.UPDATEDBY, secretContent1.updatedBy()) .set(SECRETS_CONTENT.METADATA, JSONObject.toJSONString(secretContent1.metadata())) .execute(); diff --git a/server/src/test/java/keywhiz/service/daos/SecretDAOTest.java b/server/src/test/java/keywhiz/service/daos/SecretDAOTest.java index aeb8a255e..d8df10f76 100644 --- a/server/src/test/java/keywhiz/service/daos/SecretDAOTest.java +++ b/server/src/test/java/keywhiz/service/daos/SecretDAOTest.java @@ -25,6 +25,7 @@ import java.util.List; import javax.inject.Inject; import keywhiz.TestDBRule; +import keywhiz.api.ApiDate; import keywhiz.api.model.SecretContent; import keywhiz.api.model.SecretSeries; import keywhiz.api.model.SecretSeriesAndContent; @@ -54,7 +55,7 @@ public class SecretDAOTest { @Inject SecretDAOFactory secretDAOFactory; final static ContentCryptographer cryptographer = CryptoFixtures.contentCryptographer(); - final static OffsetDateTime date = OffsetDateTime.now(); + final static ApiDate date = ApiDate.now(); final static String version = VersionGenerator.now().toHex(); ImmutableMap emptyMetadata = ImmutableMap.of(); @@ -81,7 +82,7 @@ public void setUp() throws Exception { .set(SECRETS.ID, Math.toIntExact(secret1.series().id())) .set(SECRETS.NAME, secret1.series().name()) .set(SECRETS.DESCRIPTION, secret1.series().description()) - .set(SECRETS.CREATEDAT, secret1.series().createdAt()) + .set(SECRETS.CREATEDAT, secret1.series().createdAt().offsetDateTime) .set(SECRETS.CREATEDBY, secret1.series().createdBy()) .set(SECRETS.UPDATEDBY, secret1.series().updatedBy()) .execute(); @@ -90,7 +91,7 @@ public void setUp() throws Exception { .set(SECRETS_CONTENT.SECRETID, Math.toIntExact(secret1.series().id())) .set(SECRETS_CONTENT.VERSION, secret1.content().version().orElse(null)) .set(SECRETS_CONTENT.ENCRYPTED_CONTENT, secret1.content().encryptedContent()) - .set(SECRETS_CONTENT.CREATEDAT, secret1.content().createdAt()) + .set(SECRETS_CONTENT.CREATEDAT, secret1.content().createdAt().offsetDateTime) .set(SECRETS_CONTENT.CREATEDBY, secret1.content().createdBy()) .set(SECRETS_CONTENT.UPDATEDBY, secret1.content().updatedBy()) .set(SECRETS_CONTENT.METADATA, objectMapper.writeValueAsString(secret1.content().metadata())) @@ -100,7 +101,7 @@ public void setUp() throws Exception { .set(SECRETS.ID, Math.toIntExact(secret2.series().id())) .set(SECRETS.NAME, secret2.series().name()) .set(SECRETS.DESCRIPTION, secret2.series().description()) - .set(SECRETS.CREATEDAT, secret2.series().createdAt()) + .set(SECRETS.CREATEDAT, secret2.series().createdAt().offsetDateTime) .set(SECRETS.CREATEDBY, secret2.series().createdBy()) .set(SECRETS.UPDATEDBY, secret2.series().updatedBy()) .execute(); @@ -109,7 +110,7 @@ public void setUp() throws Exception { .set(SECRETS_CONTENT.SECRETID, Math.toIntExact(secret2.series().id())) .set(SECRETS_CONTENT.VERSION, secret2.content().version().orElse(null)) .set(SECRETS_CONTENT.ENCRYPTED_CONTENT, secret2.content().encryptedContent()) - .set(SECRETS_CONTENT.CREATEDAT, secret2.content().createdAt()) + .set(SECRETS_CONTENT.CREATEDAT, secret2.content().createdAt().offsetDateTime) .set(SECRETS_CONTENT.CREATEDBY, secret2.content().createdBy()) .set(SECRETS_CONTENT.UPDATEDBY, secret2.content().updatedBy()) .set(SECRETS_CONTENT.METADATA, objectMapper.writeValueAsString(secret2.content().metadata())) diff --git a/server/src/test/java/keywhiz/service/daos/SecretSeriesDAOTest.java b/server/src/test/java/keywhiz/service/daos/SecretSeriesDAOTest.java index f583c0ee0..29c3bec9d 100644 --- a/server/src/test/java/keywhiz/service/daos/SecretSeriesDAOTest.java +++ b/server/src/test/java/keywhiz/service/daos/SecretSeriesDAOTest.java @@ -24,6 +24,7 @@ import java.time.OffsetDateTime; import javax.inject.Inject; import keywhiz.TestDBRule; +import keywhiz.api.ApiDate; import keywhiz.api.model.SecretSeries; import keywhiz.service.config.Readonly; import keywhiz.service.daos.SecretSeriesDAO.SecretSeriesDAOFactory; @@ -55,7 +56,7 @@ public class SecretSeriesDAOTest { @Test public void createAndLookupSecretSeries() { int before = tableSize(); - OffsetDateTime now = OffsetDateTime.now(); + ApiDate now = ApiDate.now(); long id = secretSeriesDAO.createSecretSeries("newSecretSeries", "creator", "desc", null, ImmutableMap.of("foo", "bar")); diff --git a/server/src/test/java/keywhiz/service/providers/ClientAuthFactoryTest.java b/server/src/test/java/keywhiz/service/providers/ClientAuthFactoryTest.java index 4d646476e..ad6df3e05 100644 --- a/server/src/test/java/keywhiz/service/providers/ClientAuthFactoryTest.java +++ b/server/src/test/java/keywhiz/service/providers/ClientAuthFactoryTest.java @@ -21,6 +21,8 @@ import java.util.Optional; import javax.ws.rs.NotAuthorizedException; import javax.ws.rs.core.SecurityContext; + +import keywhiz.api.ApiDate; import keywhiz.api.model.Client; import keywhiz.auth.mutualssl.SimplePrincipal; import keywhiz.service.daos.ClientDAO; @@ -82,7 +84,7 @@ public void rejectsDisabledClients() { } @Test public void createsDbRecordForNewClient() throws Exception { - OffsetDateTime now = OffsetDateTime.now(); + ApiDate now = ApiDate.now(); Client newClient = new Client(2345L, "new-client", "desc", now, "automatic", now, "automatic", true, false); diff --git a/server/src/test/java/keywhiz/service/resources/SecretDeliveryResourceIntegrationTest.java b/server/src/test/java/keywhiz/service/resources/SecretDeliveryResourceIntegrationTest.java index 8d5c053bf..88da72059 100644 --- a/server/src/test/java/keywhiz/service/resources/SecretDeliveryResourceIntegrationTest.java +++ b/server/src/test/java/keywhiz/service/resources/SecretDeliveryResourceIntegrationTest.java @@ -24,6 +24,7 @@ import keywhiz.IntegrationTestRule; import keywhiz.KeywhizService; import keywhiz.TestClients; +import keywhiz.api.ApiDate; import keywhiz.api.SecretDeliveryResponse; import keywhiz.api.model.Secret; import org.junit.Before; @@ -44,8 +45,8 @@ public class SecretDeliveryResourceIntegrationTest { @Before public void setUp() throws Exception { client = TestClients.mutualSslClient(); generalPassword = new Secret(0, "General_Password", null, null, "YXNkZGFz", - OffsetDateTime.parse("2011-09-29T15:46:00Z"), null, - OffsetDateTime.parse("2011-09-29T15:46:00Z"), null, null, "upload", null); + ApiDate.parse("2011-09-29T15:46:00Z"), null, + ApiDate.parse("2011-09-29T15:46:00Z"), null, null, "upload", null); } @Test public void returnsSecretWhenAllowed() throws Exception { diff --git a/server/src/test/java/keywhiz/service/resources/SecretDeliveryResourceTest.java b/server/src/test/java/keywhiz/service/resources/SecretDeliveryResourceTest.java index 4ad357efc..df1c20aed 100644 --- a/server/src/test/java/keywhiz/service/resources/SecretDeliveryResourceTest.java +++ b/server/src/test/java/keywhiz/service/resources/SecretDeliveryResourceTest.java @@ -19,6 +19,8 @@ import java.util.Optional; import javax.ws.rs.ForbiddenException; import javax.ws.rs.NotFoundException; + +import keywhiz.api.ApiDate; import keywhiz.api.SecretDeliveryResponse; import keywhiz.api.model.Client; import keywhiz.api.model.SanitizedSecret; @@ -38,7 +40,7 @@ import static org.mockito.Mockito.when; public class SecretDeliveryResourceTest { - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); @Rule public MockitoRule mockito = MockitoJUnit.rule(); diff --git a/server/src/test/java/keywhiz/service/resources/SecretsDeliveryResourceIntegrationTest.java b/server/src/test/java/keywhiz/service/resources/SecretsDeliveryResourceIntegrationTest.java index fa0fdbdc2..6529951da 100644 --- a/server/src/test/java/keywhiz/service/resources/SecretsDeliveryResourceIntegrationTest.java +++ b/server/src/test/java/keywhiz/service/resources/SecretsDeliveryResourceIntegrationTest.java @@ -22,6 +22,7 @@ import java.time.OffsetDateTime; import keywhiz.IntegrationTestRule; import keywhiz.TestClients; +import keywhiz.api.ApiDate; import keywhiz.api.SecretDeliveryResponse; import keywhiz.api.model.SanitizedSecret; import keywhiz.api.model.Secret; @@ -54,25 +55,25 @@ public void setUp() throws Exception { generalPassword = SecretDeliveryResponse.fromSanitizedSecret( SanitizedSecret.fromSecret( new Secret(0, "General_Password", null, null, "YXNkZGFz", - OffsetDateTime.parse("2011-09-29T15:46:00.312Z"), null, - OffsetDateTime.parse("2011-09-29T15:46:00.312Z"), null, null, null, null))); + ApiDate.parse("2011-09-29T15:46:00.312Z"), null, + ApiDate.parse("2011-09-29T15:46:00.312Z"), null, null, null, null))); databasePassword = SecretDeliveryResponse.fromSanitizedSecret( SanitizedSecret.fromSecret( new Secret(1, "Database_Password", null, null, "MTIzNDU=", - OffsetDateTime.parse("2011-09-29T15:46:00.232Z"), null, - OffsetDateTime.parse("2011-09-29T15:46:00.232Z"), null, null, null, null))); + ApiDate.parse("2011-09-29T15:46:00.232Z"), null, + ApiDate.parse("2011-09-29T15:46:00.232Z"), null, null, null, null))); nobodyPgPassPassword = SecretDeliveryResponse.fromSanitizedSecret( SanitizedSecret.fromSecret( new Secret(2, "Nobody_PgPass", null, null, "c29tZWhvc3Quc29tZXBsYWNlLmNvbTo1NDMyOnNvbWVkYXRhYmFzZTptaXN0ZXJhd2Vzb21lOmhlbGwwTWNGbHkK", - OffsetDateTime.parse("2011-09-29T15:46:00.232Z"), null, - OffsetDateTime.parse("2011-09-29T15:46:00.232Z"), null, + ApiDate.parse("2011-09-29T15:46:00.232Z"), null, + ApiDate.parse("2011-09-29T15:46:00.232Z"), null, ImmutableMap.of("owner", "nobody", "mode", "0400"), null, null))); nonExistentOwnerPass = SecretDeliveryResponse.fromSanitizedSecret( SanitizedSecret.fromSecret( new Secret(3, "NonexistentOwner_Pass", null, null, "MTIzNDU=", - OffsetDateTime.parse("2011-09-29T15:46:00.232Z"), null, - OffsetDateTime.parse("2011-09-29T15:46:00.232Z"), null, + ApiDate.parse("2011-09-29T15:46:00.232Z"), null, + ApiDate.parse("2011-09-29T15:46:00.232Z"), null, ImmutableMap.of("owner", "NonExistent", "mode", "0400"), null, null))); } diff --git a/server/src/test/java/keywhiz/service/resources/SecretsDeliveryResourceTest.java b/server/src/test/java/keywhiz/service/resources/SecretsDeliveryResourceTest.java index b0b008b9c..add25d5fb 100644 --- a/server/src/test/java/keywhiz/service/resources/SecretsDeliveryResourceTest.java +++ b/server/src/test/java/keywhiz/service/resources/SecretsDeliveryResourceTest.java @@ -19,6 +19,8 @@ import java.time.OffsetDateTime; import java.util.Base64; import java.util.List; + +import keywhiz.api.ApiDate; import keywhiz.api.SecretDeliveryResponse; import keywhiz.api.model.Client; import keywhiz.api.model.SanitizedSecret; @@ -36,7 +38,7 @@ import static org.mockito.Mockito.when; public class SecretsDeliveryResourceTest { - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); @Rule public MockitoRule mockito = MockitoJUnit.rule(); diff --git a/server/src/test/java/keywhiz/service/resources/admin/ClientsResourceTest.java b/server/src/test/java/keywhiz/service/resources/admin/ClientsResourceTest.java index 3e4be941e..2c5f577b3 100644 --- a/server/src/test/java/keywhiz/service/resources/admin/ClientsResourceTest.java +++ b/server/src/test/java/keywhiz/service/resources/admin/ClientsResourceTest.java @@ -25,6 +25,8 @@ import java.util.Optional; import javax.ws.rs.NotFoundException; import javax.ws.rs.core.Response; + +import keywhiz.api.ApiDate; import keywhiz.api.ClientDetailResponse; import keywhiz.api.CreateClientRequest; import keywhiz.api.model.Client; @@ -53,7 +55,7 @@ public class ClientsResourceTest { @Mock ClientDAO clientDAO; User user = User.named("user"); - OffsetDateTime now = OffsetDateTime.now(); + ApiDate now = ApiDate.now(); Client client = new Client(1, "client", "1st client", now, "test", now, "test", true, false); ClientsResource resource; diff --git a/server/src/test/java/keywhiz/service/resources/admin/GroupsResourceTest.java b/server/src/test/java/keywhiz/service/resources/admin/GroupsResourceTest.java index dc18dc8ef..8ced6fbcd 100644 --- a/server/src/test/java/keywhiz/service/resources/admin/GroupsResourceTest.java +++ b/server/src/test/java/keywhiz/service/resources/admin/GroupsResourceTest.java @@ -23,6 +23,8 @@ import javax.ws.rs.BadRequestException; import javax.ws.rs.NotFoundException; import javax.ws.rs.core.Response; + +import keywhiz.api.ApiDate; import keywhiz.api.CreateGroupRequest; import keywhiz.api.GroupDetailResponse; import keywhiz.api.model.Client; @@ -50,7 +52,7 @@ public class GroupsResourceTest { @Mock GroupDAO groupDAO; User user = User.named("user"); - OffsetDateTime now = OffsetDateTime.now(); + ApiDate now = ApiDate.now(); Group group = new Group(1, "group", "desc", now, "creator", now, "creator"); GroupsResource resource; diff --git a/server/src/test/java/keywhiz/service/resources/admin/MembershipResourceTest.java b/server/src/test/java/keywhiz/service/resources/admin/MembershipResourceTest.java index 879bc2194..1905184a3 100644 --- a/server/src/test/java/keywhiz/service/resources/admin/MembershipResourceTest.java +++ b/server/src/test/java/keywhiz/service/resources/admin/MembershipResourceTest.java @@ -19,6 +19,8 @@ import java.time.OffsetDateTime; import javax.ws.rs.NotFoundException; import javax.ws.rs.core.Response; + +import keywhiz.api.ApiDate; import keywhiz.api.model.Client; import keywhiz.api.model.Group; import keywhiz.api.model.Secret; @@ -37,7 +39,7 @@ import static org.mockito.Mockito.verify; public class MembershipResourceTest { - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); @Rule public MockitoRule mockito = MockitoJUnit.rule(); diff --git a/server/src/test/java/keywhiz/service/resources/admin/SecretGeneratorsResourceTest.java b/server/src/test/java/keywhiz/service/resources/admin/SecretGeneratorsResourceTest.java index 27b27c2ee..ff2a020b2 100644 --- a/server/src/test/java/keywhiz/service/resources/admin/SecretGeneratorsResourceTest.java +++ b/server/src/test/java/keywhiz/service/resources/admin/SecretGeneratorsResourceTest.java @@ -21,6 +21,8 @@ import com.google.common.collect.ImmutableMap; import java.time.OffsetDateTime; import java.util.List; + +import keywhiz.api.ApiDate; import keywhiz.api.model.SanitizedSecret; import keywhiz.api.model.Secret; import keywhiz.auth.User; @@ -37,7 +39,7 @@ import static org.mockito.Mockito.when; public class SecretGeneratorsResourceTest { - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); private static final User user = User.named("creator"); private static final ImmutableMap emptyMap = ImmutableMap.of(); diff --git a/server/src/test/java/keywhiz/service/resources/admin/SecretsResourceTest.java b/server/src/test/java/keywhiz/service/resources/admin/SecretsResourceTest.java index 7db836549..4e861c187 100644 --- a/server/src/test/java/keywhiz/service/resources/admin/SecretsResourceTest.java +++ b/server/src/test/java/keywhiz/service/resources/admin/SecretsResourceTest.java @@ -28,6 +28,8 @@ import javax.ws.rs.NotFoundException; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; + +import keywhiz.api.ApiDate; import keywhiz.api.CreateSecretRequest; import keywhiz.api.SecretDetailResponse; import keywhiz.api.model.Client; @@ -55,7 +57,7 @@ import static org.mockito.Mockito.when; public class SecretsResourceTest { - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); @Rule public MockitoRule mockito = MockitoJUnit.rule(); diff --git a/server/src/test/java/keywhiz/service/resources/admin/TemplatedSecretGeneratorTest.java b/server/src/test/java/keywhiz/service/resources/admin/TemplatedSecretGeneratorTest.java index 107e6c4c7..506817baf 100644 --- a/server/src/test/java/keywhiz/service/resources/admin/TemplatedSecretGeneratorTest.java +++ b/server/src/test/java/keywhiz/service/resources/admin/TemplatedSecretGeneratorTest.java @@ -23,6 +23,7 @@ import java.util.Optional; import javax.ws.rs.BadRequestException; import keywhiz.FakeRandom; +import keywhiz.api.ApiDate; import keywhiz.api.TemplatedSecretsGeneratorRequest; import keywhiz.api.model.Secret; import keywhiz.auth.User; @@ -71,7 +72,7 @@ public void setUp() { @Test public void createsSecret() throws Exception { - OffsetDateTime now = OffsetDateTime.now(); + ApiDate now = ApiDate.now(); Secret secret = new Secret(5, "test-database.yaml", "versionStamp", "desc", "content", now, "creator", now, "creator", null, null, null); when(secretBuilder.build()).thenReturn(secret); diff --git a/server/src/test/java/keywhiz/service/resources/automation/AutomationClientResourceTest.java b/server/src/test/java/keywhiz/service/resources/automation/AutomationClientResourceTest.java index 687c8b87e..15fdb9758 100644 --- a/server/src/test/java/keywhiz/service/resources/automation/AutomationClientResourceTest.java +++ b/server/src/test/java/keywhiz/service/resources/automation/AutomationClientResourceTest.java @@ -21,6 +21,8 @@ import java.util.Optional; import javax.ws.rs.NotFoundException; import javax.ws.rs.core.Response; + +import keywhiz.api.ApiDate; import keywhiz.api.ClientDetailResponse; import keywhiz.api.CreateClientRequest; import keywhiz.api.model.AutomationClient; @@ -44,7 +46,7 @@ public class AutomationClientResourceTest { @Mock ClientDAO clientDAO; @Mock AclDAO aclDAO; - OffsetDateTime now = OffsetDateTime.now(); + ApiDate now = ApiDate.now(); AutomationClient automation = AutomationClient.of( new Client(1, "automation", "Automation client", now, "test", now, "test", true, true)); diff --git a/server/src/test/java/keywhiz/service/resources/automation/AutomationGroupResourceTest.java b/server/src/test/java/keywhiz/service/resources/automation/AutomationGroupResourceTest.java index 4fd940eb7..95cbdeded 100644 --- a/server/src/test/java/keywhiz/service/resources/automation/AutomationGroupResourceTest.java +++ b/server/src/test/java/keywhiz/service/resources/automation/AutomationGroupResourceTest.java @@ -22,6 +22,8 @@ import java.time.OffsetDateTime; import java.util.Optional; import javax.ws.rs.core.Response; + +import keywhiz.api.ApiDate; import keywhiz.api.CreateGroupRequest; import keywhiz.api.GroupDetailResponse; import keywhiz.api.model.AutomationClient; @@ -46,7 +48,7 @@ public class AutomationGroupResourceTest { @Mock GroupDAO groupDAO; @Mock AclDAO aclDAO; - OffsetDateTime now = OffsetDateTime.now(); + ApiDate now = ApiDate.now(); AutomationClient automation = AutomationClient.of( new Client(1, "automation", "Automation client", now, "test", now, "test", true, true)); diff --git a/server/src/test/java/keywhiz/service/resources/automation/AutomationSecretGeneratorsResourceTest.java b/server/src/test/java/keywhiz/service/resources/automation/AutomationSecretGeneratorsResourceTest.java index c48fbd525..48757fd22 100644 --- a/server/src/test/java/keywhiz/service/resources/automation/AutomationSecretGeneratorsResourceTest.java +++ b/server/src/test/java/keywhiz/service/resources/automation/AutomationSecretGeneratorsResourceTest.java @@ -21,6 +21,8 @@ import com.google.common.collect.ImmutableMap; import java.time.OffsetDateTime; import java.util.List; + +import keywhiz.api.ApiDate; import keywhiz.api.model.AutomationClient; import keywhiz.api.model.Client; import keywhiz.api.model.SanitizedSecret; @@ -39,7 +41,7 @@ import static org.mockito.Mockito.when; public class AutomationSecretGeneratorsResourceTest { - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); private static final AutomationClient automationClient = AutomationClient.of( new Client(1, "automation", "Automation client", NOW, "test", NOW, "test", true, true)); diff --git a/server/src/test/java/keywhiz/service/resources/automation/AutomationSecretResourceTest.java b/server/src/test/java/keywhiz/service/resources/automation/AutomationSecretResourceTest.java index 0d6864910..684e8d69b 100644 --- a/server/src/test/java/keywhiz/service/resources/automation/AutomationSecretResourceTest.java +++ b/server/src/test/java/keywhiz/service/resources/automation/AutomationSecretResourceTest.java @@ -19,6 +19,8 @@ import java.time.OffsetDateTime; import java.util.Base64; import java.util.Optional; + +import keywhiz.api.ApiDate; import keywhiz.api.AutomationSecretResponse; import keywhiz.api.CreateSecretRequest; import keywhiz.api.model.AutomationClient; @@ -48,7 +50,7 @@ import static org.mockito.Mockito.when; public class AutomationSecretResourceTest { - private static final OffsetDateTime NOW = OffsetDateTime.now(); + private static final ApiDate NOW = ApiDate.now(); AutomationSecretResource resource; diff --git a/testing/src/main/java/keywhiz/testing/JsonHelpers.java b/testing/src/main/java/keywhiz/testing/JsonHelpers.java index 5d516c60d..c98be2461 100644 --- a/testing/src/main/java/keywhiz/testing/JsonHelpers.java +++ b/testing/src/main/java/keywhiz/testing/JsonHelpers.java @@ -20,19 +20,14 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.util.StdDateFormat; import com.fasterxml.jackson.datatype.guava.GuavaModule; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JSR310Module; import io.dropwizard.jackson.AnnotationSensitivePropertyNamingStrategy; import io.dropwizard.jackson.DiscoverableSubtypeResolver; import io.dropwizard.jackson.FuzzyEnumModule; import io.dropwizard.jackson.GuavaExtrasModule; import io.dropwizard.jackson.LogbackModule; import java.io.IOException; -import java.util.Locale; -import java.util.TimeZone; import static io.dropwizard.testing.FixtureHelpers.fixture; @@ -98,16 +93,12 @@ public static String jsonFixture(String filename) throws IOException { private static ObjectMapper customizeObjectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new Jdk8Module()); - mapper.registerModule(new JSR310Module()); mapper.registerModule(new GuavaModule()); mapper.registerModule(new LogbackModule()); mapper.registerModule(new GuavaExtrasModule()); mapper.registerModule(new FuzzyEnumModule()); mapper.setPropertyNamingStrategy(new AnnotationSensitivePropertyNamingStrategy()); mapper.setSubtypeResolver(new DiscoverableSubtypeResolver()); - - mapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - mapper.setDateFormat(StdDateFormat.getISO8601Format(TimeZone.getTimeZone("UTC"), Locale.ENGLISH)); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); return mapper; }