From c34e903fe3b4d63a18200ac443bea945cc8ceb5c Mon Sep 17 00:00:00 2001 From: michaelb Date: Thu, 13 Sep 2018 18:06:03 +0100 Subject: [PATCH] SDK-590: Standardise Image functionality --- README.md | 12 +++++-- .../com/yoti/api/client/ActivityDetails.java | 6 ++-- .../main/java/com/yoti/api/client/Image.java | 9 ++++++ .../spi/remote/ImageAttributeValue.java | 11 ++++--- .../client/spi/remote/JpegAttributeValue.java | 5 +-- .../client/spi/remote/PngAttributeValue.java | 5 +-- .../spi/remote/SimpleActivityDetails.java | 1 + .../spi/remote/JpegAttributeValueTest.java | 31 +++++++++++++++++++ .../spi/remote/PngAttributeValueTest.java | 31 +++++++++++++++++++ .../spi/remote/SimpleActivityDetailsTest.java | 5 ++- .../springboot/YotiLoginController.java | 5 ++- 11 files changed, 105 insertions(+), 16 deletions(-) create mode 100644 yoti-sdk-impl/src/test/java/com/yoti/api/client/spi/remote/JpegAttributeValueTest.java create mode 100644 yoti-sdk-impl/src/test/java/com/yoti/api/client/spi/remote/PngAttributeValueTest.java diff --git a/README.md b/README.md index 5508df15e..6afd8503b 100644 --- a/README.md +++ b/README.md @@ -188,15 +188,21 @@ try { Optional user = yourUserSearchMethod(activityDetails.getRememberMeId()); if (user.isPresent()) { String rememberMeId = activityDetails.getRememberMeId(); - String base64Selfie = activityDetails.getBase64Selfie(); + Attribute selfie = profile.getSelfie(); - Image selfieValue = selfie.getValue(); + if (selfie != null) { + Image selfieValue = selfie.getValue(); + String base64Selfie = selfieValue.getBase64Content(); + } Attribute fullName = profile.getFullName(); Attribute givenNames = profile.getGivenNames(); Attribute familyName = profile.getFamilyName(); Attribute phoneNumber = profile.getPhoneNumber(); Attribute emailAddress = profile.getEmailAddress(); - Boolean isAgeVerified = profile.isAgeVerified(); + AgeVerification over18Verification = profile.findAgeOverVerification(18); + if (over18Verification != null) { + boolean isAgedOver18 = over18Verification.getResult(); + } Attribute dateOfBirth = profile.getDateOfBirth(); Attribute gender = profile.getGender(); Attribute postalAddress = profile.getPostalAddress(); diff --git a/yoti-sdk-api/src/main/java/com/yoti/api/client/ActivityDetails.java b/yoti-sdk-api/src/main/java/com/yoti/api/client/ActivityDetails.java index c00abb7d8..d93066278 100644 --- a/yoti-sdk-api/src/main/java/com/yoti/api/client/ActivityDetails.java +++ b/yoti-sdk-api/src/main/java/com/yoti/api/client/ActivityDetails.java @@ -55,10 +55,12 @@ public interface ActivityDetails { String getReceiptId(); /** - * JPEG selfie in Base64 string - * + * @deprecated From v2.1 onwards you should use getUserProfile().getSelfie() + * JPEG selfie in Base64 string. + * * @return JPEG selfie image in Base64 string format */ + @Deprecated String getBase64Selfie(); } diff --git a/yoti-sdk-api/src/main/java/com/yoti/api/client/Image.java b/yoti-sdk-api/src/main/java/com/yoti/api/client/Image.java index 9f486333d..38d26e63f 100644 --- a/yoti-sdk-api/src/main/java/com/yoti/api/client/Image.java +++ b/yoti-sdk-api/src/main/java/com/yoti/api/client/Image.java @@ -5,6 +5,7 @@ * */ public interface Image { + /** * Get mime type of the content. * @@ -18,4 +19,12 @@ public interface Image { * @return image as byte[] */ byte[] getContent(); + + /** + * Base64 encoded image + * + * @return image as Base64 encoded String + */ + String getBase64Content(); + } diff --git a/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/ImageAttributeValue.java b/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/ImageAttributeValue.java index 11ff3e81a..228b9a018 100644 --- a/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/ImageAttributeValue.java +++ b/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/ImageAttributeValue.java @@ -1,10 +1,11 @@ package com.yoti.api.client.spi.remote; +import static org.bouncycastle.util.encoders.Base64.toBase64String; + import com.yoti.api.client.Image; /** * Image attribute values. - * */ abstract class ImageAttributeValue implements Image { @@ -24,9 +25,9 @@ abstract class ImageAttributeValue implements Image { @Override public abstract byte[] getContent(); - protected byte[] newArray(byte[] source) { - byte[] result = new byte[source.length]; - System.arraycopy(source, 0, result, 0, source.length); - return result; + @Override + public String getBase64Content() { + return String.format("data:%s;base64,%s", getMimeType(), toBase64String(getContent())); } + } diff --git a/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/JpegAttributeValue.java b/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/JpegAttributeValue.java index aa55510a3..c8e1d3cb8 100644 --- a/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/JpegAttributeValue.java +++ b/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/JpegAttributeValue.java @@ -11,7 +11,7 @@ final class JpegAttributeValue extends ImageAttributeValue { private final byte[] content; public JpegAttributeValue(byte[] content) { - this.content = newArray(content); + this.content = content; } @Override @@ -21,6 +21,7 @@ public String getMimeType() { @Override public byte[] getContent() { - return newArray(content); + return content.clone(); } + } diff --git a/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/PngAttributeValue.java b/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/PngAttributeValue.java index 79058e63a..86e6e235c 100644 --- a/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/PngAttributeValue.java +++ b/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/PngAttributeValue.java @@ -11,7 +11,7 @@ final class PngAttributeValue extends ImageAttributeValue { private final byte[] content; public PngAttributeValue(byte[] content) { - this.content = newArray(content); + this.content = content; } @Override @@ -21,6 +21,7 @@ public String getMimeType() { @Override public byte[] getContent() { - return newArray(content); + return content.clone(); } + } diff --git a/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/SimpleActivityDetails.java b/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/SimpleActivityDetails.java index 653076e6e..d55fe8516 100644 --- a/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/SimpleActivityDetails.java +++ b/yoti-sdk-impl/src/main/java/com/yoti/api/client/spi/remote/SimpleActivityDetails.java @@ -64,6 +64,7 @@ public String getReceiptId() { } @Override + @Deprecated public String getBase64Selfie() { return base64Selfie; } diff --git a/yoti-sdk-impl/src/test/java/com/yoti/api/client/spi/remote/JpegAttributeValueTest.java b/yoti-sdk-impl/src/test/java/com/yoti/api/client/spi/remote/JpegAttributeValueTest.java new file mode 100644 index 000000000..54a50f8a8 --- /dev/null +++ b/yoti-sdk-impl/src/test/java/com/yoti/api/client/spi/remote/JpegAttributeValueTest.java @@ -0,0 +1,31 @@ +package com.yoti.api.client.spi.remote; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; + +import org.junit.Test; + +public class JpegAttributeValueTest { + + private static final byte[] IMAGE_DATA = new byte[] { 0, 1, 2, 3 }; + + JpegAttributeValue testObj = new JpegAttributeValue(IMAGE_DATA); + + @Test + public void shouldReturnCopyOfTheData() { + byte[] result = testObj.getContent(); + + assertArrayEquals(IMAGE_DATA, result); + assertNotSame(IMAGE_DATA, result); + } + + @Test + public void shouldReturnBase64Selfie() { + String result = testObj.getBase64Content(); + + String base64Data = Base64.getEncoder().encodeToString(IMAGE_DATA); + assertEquals("data:image/jpeg;base64," + base64Data, result); + } + +} diff --git a/yoti-sdk-impl/src/test/java/com/yoti/api/client/spi/remote/PngAttributeValueTest.java b/yoti-sdk-impl/src/test/java/com/yoti/api/client/spi/remote/PngAttributeValueTest.java new file mode 100644 index 000000000..7ca259135 --- /dev/null +++ b/yoti-sdk-impl/src/test/java/com/yoti/api/client/spi/remote/PngAttributeValueTest.java @@ -0,0 +1,31 @@ +package com.yoti.api.client.spi.remote; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; + +import org.junit.Test; + +public class PngAttributeValueTest { + + private static final byte[] IMAGE_DATA = new byte[] { 0, 1, 2, 3 }; + + PngAttributeValue testObj = new PngAttributeValue(IMAGE_DATA); + + @Test + public void shouldReturnCopyOfTheData() { + byte[] result = testObj.getContent(); + + assertArrayEquals(IMAGE_DATA, result); + assertNotSame(IMAGE_DATA, result); + } + + @Test + public void shouldReturnBase64Selfie() { + String result = testObj.getBase64Content(); + + String base64Data = Base64.getEncoder().encodeToString(IMAGE_DATA); + assertEquals("data:image/png;base64," + base64Data, result); + } + +} diff --git a/yoti-sdk-impl/src/test/java/com/yoti/api/client/spi/remote/SimpleActivityDetailsTest.java b/yoti-sdk-impl/src/test/java/com/yoti/api/client/spi/remote/SimpleActivityDetailsTest.java index 416ba82e0..b2b0642bf 100644 --- a/yoti-sdk-impl/src/test/java/com/yoti/api/client/spi/remote/SimpleActivityDetailsTest.java +++ b/yoti-sdk-impl/src/test/java/com/yoti/api/client/spi/remote/SimpleActivityDetailsTest.java @@ -6,6 +6,7 @@ import java.util.Date; import com.yoti.api.client.Attribute; +import com.yoti.api.client.Image; import com.yoti.api.client.Profile; import org.bouncycastle.util.encoders.Base64; @@ -81,13 +82,14 @@ public void shouldReturnReceiptId() { @Test public void shouldReturnBase64SelfieIfSelfieSet() { - Attribute selfie = new SimpleAttribute("selfie", new JpegAttributeValue(SOME_SELFIE_BYTES)); + Attribute selfie = new SimpleAttribute("selfie", new JpegAttributeValue(SOME_SELFIE_BYTES)); SimpleProfile profile = new SimpleProfile(Collections.>singletonList(selfie)); SimpleActivityDetails result = new SimpleActivityDetails(REMEMBER_ME_ID, profile, APP_PROFILE, TIMESTAMP, RECEIPT_ID); String expected = "data:image/jpeg;base64," + Base64.toBase64String(SOME_SELFIE_BYTES); assertEquals(expected, result.getBase64Selfie()); + assertEquals(selfie.getValue().getBase64Content(), result.getBase64Selfie()); } @Test @@ -99,4 +101,5 @@ public void shouldReturnBlankBase64SelfieIfSelfieNotSet() { assertEquals("", result.getBase64Selfie()); } + } diff --git a/yoti-sdk-spring-boot-example/src/main/java/com/yoti/api/examples/springboot/YotiLoginController.java b/yoti-sdk-spring-boot-example/src/main/java/com/yoti/api/examples/springboot/YotiLoginController.java index ba1a7e7a9..7f5444a68 100644 --- a/yoti-sdk-spring-boot-example/src/main/java/com/yoti/api/examples/springboot/YotiLoginController.java +++ b/yoti-sdk-spring-boot-example/src/main/java/com/yoti/api/examples/springboot/YotiLoginController.java @@ -7,6 +7,7 @@ import com.yoti.api.client.Attribute; import com.yoti.api.client.DateTime; import com.yoti.api.client.HumanProfile; +import com.yoti.api.client.Image; import com.yoti.api.client.ProfileException; import com.yoti.api.client.YotiClient; import com.yoti.api.spring.YotiClientProperties; @@ -66,9 +67,11 @@ public String doLogin(@RequestParam("token") final String token, final Model mod // load activityDetails into ui model model.addAttribute("rememberMeId", activityDetails.getRememberMeId()); - model.addAttribute("base64Selfie", activityDetails.getBase64Selfie()); // load humanProfile data into ui model + Attribute selfie = humanProfile.getSelfie(); + model.addAttribute("base64Selfie", selfie == null ? "" : selfie.getValue().getBase64Content()); + addAttributeToModel(model, humanProfile.getFamilyName()); addAttributeToModel(model, humanProfile.getGivenNames()); addAttributeToModel(model, humanProfile.getFullName());