diff --git a/pom.xml b/pom.xml index f8d66cf..7992271 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ io.digitalstate.stix stix - v0.5.3 + v0.5.4 jar STIX 2 diff --git a/src/main/java/io/digitalstate/stix/bundle/BundleObject.java b/src/main/java/io/digitalstate/stix/bundle/BundleObject.java index 9214e17..f1e9234 100644 --- a/src/main/java/io/digitalstate/stix/bundle/BundleObject.java +++ b/src/main/java/io/digitalstate/stix/bundle/BundleObject.java @@ -28,8 +28,7 @@ @DefaultTypeValue(value = "bundle", groups = {DefaultValuesProcessor.class}) @JsonTypeName("bundle") @Value.Style(typeImmutable = "Bundle", validationMethod = Value.Style.ValidationMethod.NONE, additionalJsonAnnotations = {JsonTypeName.class}) -@JsonSerialize(as = Bundle.class) -@JsonDeserialize(builder = Bundle.Builder.class) +@JsonSerialize(as = Bundle.class) @JsonDeserialize(builder = Bundle.Builder.class) @JsonPropertyOrder({"type", "id", "spec_version", "objects"}) public interface BundleObject extends GenericValidation, Serializable { diff --git a/src/main/java/io/digitalstate/stix/common/StixCommonProperties.java b/src/main/java/io/digitalstate/stix/common/StixCommonProperties.java index aaf5f12..4093955 100644 --- a/src/main/java/io/digitalstate/stix/common/StixCommonProperties.java +++ b/src/main/java/io/digitalstate/stix/common/StixCommonProperties.java @@ -72,7 +72,6 @@ default boolean getHydrated(){ Optional getCreatedByRef(); @NotNull - @JsonSerialize(using = InstantSerializer.class) @JsonFormat(shape=JsonFormat.Shape.STRING, pattern = StixDataFormats.TIMESTAMP_PATTERN, timezone = "UTC") @JsonProperty("created") @Value.Default diff --git a/src/main/java/io/digitalstate/stix/common/StixModified.java b/src/main/java/io/digitalstate/stix/common/StixModified.java index 7c8da0b..d925d8b 100644 --- a/src/main/java/io/digitalstate/stix/common/StixModified.java +++ b/src/main/java/io/digitalstate/stix/common/StixModified.java @@ -19,7 +19,6 @@ public interface StixModified { @NotNull @JsonProperty("modified") - @JsonSerialize(using = InstantSerializer.class) @JsonFormat(pattern = StixDataFormats.TIMESTAMP_PATTERN, timezone = "UTC") @Value.Default @Redactable diff --git a/src/main/java/io/digitalstate/stix/sdo/objects/CampaignSdo.java b/src/main/java/io/digitalstate/stix/sdo/objects/CampaignSdo.java index dd40ebe..3b09b37 100644 --- a/src/main/java/io/digitalstate/stix/sdo/objects/CampaignSdo.java +++ b/src/main/java/io/digitalstate/stix/sdo/objects/CampaignSdo.java @@ -46,13 +46,11 @@ public interface CampaignSdo extends DomainObject { @Redactable Set getAliases(); - @JsonSerialize(using = InstantSerializer.class) @JsonFormat(pattern = StixDataFormats.TIMESTAMP_PATTERN, timezone = "UTC") @JsonProperty("first_seen") @JsonInclude(value = NON_EMPTY, content= NON_EMPTY) @Redactable Optional getFirstSeen(); - @JsonSerialize(using = InstantSerializer.class) @JsonFormat(pattern = StixDataFormats.TIMESTAMP_PATTERN, timezone = "UTC") @JsonProperty("last_seen") @JsonInclude(value = NON_EMPTY, content= NON_EMPTY) @Redactable diff --git a/src/main/java/io/digitalstate/stix/sdo/objects/IndicatorSdo.java b/src/main/java/io/digitalstate/stix/sdo/objects/IndicatorSdo.java index e3daacb..bd28d2c 100644 --- a/src/main/java/io/digitalstate/stix/sdo/objects/IndicatorSdo.java +++ b/src/main/java/io/digitalstate/stix/sdo/objects/IndicatorSdo.java @@ -65,7 +65,6 @@ public interface IndicatorSdo extends DomainObject { Instant getValidFrom(); @JsonProperty("valid_until") @JsonInclude(value = NON_EMPTY, content= NON_EMPTY) - @JsonSerialize(using = InstantSerializer.class) @JsonFormat(pattern = StixDataFormats.TIMESTAMP_PATTERN, timezone = "UTC") @Redactable Optional getValidUntil(); diff --git a/src/main/java/io/digitalstate/stix/sdo/objects/IntrusionSetSdo.java b/src/main/java/io/digitalstate/stix/sdo/objects/IntrusionSetSdo.java index 80fd907..724bc9c 100644 --- a/src/main/java/io/digitalstate/stix/sdo/objects/IntrusionSetSdo.java +++ b/src/main/java/io/digitalstate/stix/sdo/objects/IntrusionSetSdo.java @@ -51,13 +51,11 @@ public interface IntrusionSetSdo extends DomainObject { Set getAliases(); @JsonProperty("first_seen") @JsonInclude(value = NON_EMPTY, content= NON_EMPTY) - @JsonSerialize(using = InstantSerializer.class) @JsonFormat(pattern = StixDataFormats.TIMESTAMP_PATTERN, timezone = "UTC") @Redactable Optional getFirstSeen(); @JsonProperty("last_seen") @JsonInclude(value = NON_EMPTY, content= NON_EMPTY) - @JsonSerialize(using = InstantSerializer.class) @JsonFormat(pattern = StixDataFormats.TIMESTAMP_PATTERN, timezone = "UTC") @Redactable Optional getLastSeen(); diff --git a/src/main/java/io/digitalstate/stix/sdo/objects/ObservedDataSdo.java b/src/main/java/io/digitalstate/stix/sdo/objects/ObservedDataSdo.java index bd0be43..c7d6dcc 100644 --- a/src/main/java/io/digitalstate/stix/sdo/objects/ObservedDataSdo.java +++ b/src/main/java/io/digitalstate/stix/sdo/objects/ObservedDataSdo.java @@ -32,14 +32,12 @@ public interface ObservedDataSdo extends DomainObject { @NotNull @JsonProperty("first_observed") - @JsonSerialize(using = InstantSerializer.class) @JsonFormat(pattern = StixDataFormats.TIMESTAMP_PATTERN, timezone = "UTC") @Redactable(useMask = true) Instant getFirstObserved(); @NotNull @JsonProperty("last_observed") - @JsonSerialize(using = InstantSerializer.class) @JsonFormat(pattern = StixDataFormats.TIMESTAMP_PATTERN, timezone = "UTC") @Redactable(useMask = true) Instant getLastObserved(); diff --git a/src/main/java/io/digitalstate/stix/sdo/objects/ReportSdo.java b/src/main/java/io/digitalstate/stix/sdo/objects/ReportSdo.java index f479a2e..a82b21b 100644 --- a/src/main/java/io/digitalstate/stix/sdo/objects/ReportSdo.java +++ b/src/main/java/io/digitalstate/stix/sdo/objects/ReportSdo.java @@ -55,7 +55,6 @@ public interface ReportSdo extends DomainObject { @NotNull @JsonProperty("published") - @JsonSerialize(using = InstantSerializer.class) @JsonFormat(pattern = StixDataFormats.TIMESTAMP_PATTERN, timezone = "UTC") @Redactable(useMask = true) Instant getPublished(); diff --git a/src/main/java/io/digitalstate/stix/sro/objects/SightingSro.java b/src/main/java/io/digitalstate/stix/sro/objects/SightingSro.java index 9a5d9ba..21e4a23 100644 --- a/src/main/java/io/digitalstate/stix/sro/objects/SightingSro.java +++ b/src/main/java/io/digitalstate/stix/sro/objects/SightingSro.java @@ -35,13 +35,11 @@ @Redactable public interface SightingSro extends RelationshipObject { - @JsonSerialize(using = InstantSerializer.class) @JsonFormat(pattern = StixDataFormats.TIMESTAMP_PATTERN, timezone = "UTC") @JsonProperty("first_seen") @JsonInclude(value = NON_EMPTY, content= NON_EMPTY) @Redactable Optional getFirstSeen(); - @JsonSerialize(using = InstantSerializer.class) @JsonFormat(pattern = StixDataFormats.TIMESTAMP_PATTERN, timezone = "UTC") @JsonProperty("last_seen") @JsonInclude(value = NON_EMPTY, content= NON_EMPTY) @Redactable diff --git a/src/test/groovy/stix/end2end/IndicatorSdoSpec.groovy b/src/test/groovy/stix/end2end/IndicatorSdoSpec.groovy new file mode 100644 index 0000000..4312686 --- /dev/null +++ b/src/test/groovy/stix/end2end/IndicatorSdoSpec.groovy @@ -0,0 +1,47 @@ +package stix.end2end + +import com.fasterxml.jackson.databind.ObjectMapper +import io.digitalstate.stix.bundle.Bundle +import io.digitalstate.stix.json.StixParsers +import io.digitalstate.stix.sdo.objects.AttackPattern +import io.digitalstate.stix.sdo.objects.Indicator +import io.digitalstate.stix.sdo.objects.IndicatorSdo +import io.digitalstate.stix.sdo.objects.Report +import spock.lang.Shared +import spock.lang.Specification + +import java.time.Instant + +class IndicatorSdoSpec extends Specification { + + @Shared ObjectMapper mapper = new ObjectMapper() + + def "Create Indicator SDO and cycle from object to Json back to object"() { + + when: "a objects are created," + IndicatorSdo indicator1 = Indicator.builder() + .addLabels("malicious-activity") + .name("some name") + .validFrom(Instant.now()) + .pattern("some pattern") + .build() + + then: "Create a Report and Add Attack Patterns as Report Objects" + + println indicator1.toJsonString() + String indicator1Json = indicator1.toJsonString() + + println StixParsers.parseObject(indicator1Json).inspect() + + and: "Create a bundle with the indicator" + Bundle bundle = Bundle.builder() + .addObjects(indicator1) + .build() + + println bundle.toJsonString() + + println StixParsers.parseBundle(bundle.toJsonString()).inspect() + + } + +} \ No newline at end of file