Making acquisition of latest signatures easier through convenience function for use in provisioner.
diff --git a/api/src/main/java/io/mifos/anubis/api/v1/client/Anubis.java b/api/src/main/java/io/mifos/anubis/api/v1/client/Anubis.java
index 6f7ce43..078c3f0 100644
--- a/api/src/main/java/io/mifos/anubis/api/v1/client/Anubis.java
+++ b/api/src/main/java/io/mifos/anubis/api/v1/client/Anubis.java
@@ -55,6 +55,11 @@
produces = {MediaType.ALL_VALUE})
ApplicationSignatureSet getSignatureSet(@PathVariable("timestamp") String timestamp);
+ @RequestMapping(value = "/signatures/_latest", method = RequestMethod.GET,
+ consumes = {MediaType.APPLICATION_JSON_VALUE},
+ produces = {MediaType.ALL_VALUE})
+ ApplicationSignatureSet getLatestSignatureSet();
+
@RequestMapping(value = "/signatures/{timestamp}", method = RequestMethod.DELETE,
consumes = {MediaType.APPLICATION_JSON_VALUE},
produces = {MediaType.ALL_VALUE})
@@ -65,6 +70,11 @@
produces = {MediaType.ALL_VALUE})
Signature getApplicationSignature(@PathVariable("timestamp") String timestamp);
+ @RequestMapping(value = "/signatures/_latest/application", method = RequestMethod.GET,
+ consumes = {MediaType.APPLICATION_JSON_VALUE},
+ produces = {MediaType.ALL_VALUE})
+ Signature getLatestApplicationSignature();
+
@RequestMapping(value = "/initialize", method = RequestMethod.POST,
consumes = {MediaType.APPLICATION_JSON_VALUE},
produces = {MediaType.ALL_VALUE})
diff --git a/component-test/src/main/java/TestAnubisKeyRotation.java b/component-test/src/main/java/TestAnubisKeyRotation.java
index ef47af1..ce61cf9 100644
--- a/component-test/src/main/java/TestAnubisKeyRotation.java
+++ b/component-test/src/main/java/TestAnubisKeyRotation.java
@@ -122,6 +122,11 @@
Assert.assertTrue(signatureSets.contains(identityManagerKeyPair.getTimestamp()));
Assert.assertTrue(signatureSets.contains(identityManagerKeyPair2.getTimestamp()));
}
+ final ApplicationSignatureSet latestSignatureSet = anubis.getLatestSignatureSet();
+ Assert.assertEquals(identityManagerKeyPair2.getTimestamp(), latestSignatureSet.getTimestamp());
+
+ final Signature latestApplicationSignature = anubis.getLatestApplicationSignature();
+ Assert.assertEquals(latestSignatureSet.getApplicationSignature(), latestApplicationSignature);
//Get the newly created signature set, and test that it's contents are correct.
final ApplicationSignatureSet signatureSet2 = anubis.getSignatureSet(identityManagerKeyPair2.getTimestamp());
diff --git a/library/src/main/java/io/mifos/anubis/controller/SignatureRestController.java b/library/src/main/java/io/mifos/anubis/controller/SignatureRestController.java
index af81fe2..33f1248 100644
--- a/library/src/main/java/io/mifos/anubis/controller/SignatureRestController.java
+++ b/library/src/main/java/io/mifos/anubis/controller/SignatureRestController.java
@@ -27,6 +27,7 @@
import org.springframework.web.bind.annotation.*;
import java.util.List;
+import java.util.Optional;
/**
* @author Myrle Krantz
@@ -65,6 +66,19 @@
}
@Permittable(AcceptedTokenType.SYSTEM)
+ @RequestMapping(value = "/signatures/_latest", method = RequestMethod.GET,
+ consumes = {MediaType.ALL_VALUE},
+ produces = {MediaType.APPLICATION_JSON_VALUE})
+ public
+ @ResponseBody ResponseEntity<ApplicationSignatureSet> getLatestSignatureSet()
+ {
+ final Optional<String> timestamp = getMostRecentTimestamp();
+ return timestamp.flatMap(tenantSignatureRepository::getSignatureSet)
+ .map(ResponseEntity::ok)
+ .orElseThrow(() -> ServiceException.notFound("No valid signature found."));
+ }
+
+ @Permittable(AcceptedTokenType.SYSTEM)
@RequestMapping(value = "/signatures/{timestamp}", method = RequestMethod.DELETE,
consumes = {MediaType.ALL_VALUE},
produces = {MediaType.APPLICATION_JSON_VALUE})
@@ -86,4 +100,22 @@
.map(ResponseEntity::ok)
.orElseThrow(() -> ServiceException.notFound("Signature for timestamp '" + timestamp + "' not found."));
}
+
+ @Permittable(AcceptedTokenType.SYSTEM)
+ @RequestMapping(value = "/signatures/_latest/application", method = RequestMethod.GET,
+ consumes = {MediaType.ALL_VALUE},
+ produces = {MediaType.APPLICATION_JSON_VALUE})
+ public
+ @ResponseBody ResponseEntity<Signature> getLatestApplicationSignature()
+ {
+ final Optional<String> timestamp = getMostRecentTimestamp();
+ return timestamp.flatMap(tenantSignatureRepository::getApplicationSignature)
+ .map(ResponseEntity::ok)
+ .orElseThrow(() -> ServiceException.notFound("No valid signature found."));
+ }
+
+ private Optional<String> getMostRecentTimestamp() {
+ return tenantSignatureRepository.getAllSignatureSetKeyTimestamps().stream()
+ .max(String::compareTo);
+ }
}
\ No newline at end of file