diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java index 7f15848..1d108f1 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java @@ -51,11 +51,11 @@ private static String generateUrl( } String newUrl=null; if (null!=src){ - newUrl=buildFullUrl(src,queryParameters,transformation,transformationPosition,signed,expireSeconds); + newUrl=buildFullUrl(src,queryParameters,transformation,transformationPosition,signed,expireSeconds, config.getPrivateKey(), urlEndpoint); } else { if ("query".equalsIgnoreCase(transformationPosition)){ - newUrl=buildFullUrl(urlEndpoint+(path.charAt(0)=='/'?path.substring(1,path.length()):path),queryParameters,transformation,transformationPosition,signed,expireSeconds); + newUrl=buildFullUrl(urlEndpoint+(path.charAt(0)=='/'?path.substring(1,path.length()):path),queryParameters,transformation,transformationPosition,signed,expireSeconds, config.getPrivateKey(), urlEndpoint); } else { newUrl = buildPathUrl(path.charAt(0)=='/'?path:"/"+path, urlEndpoint, queryParameters, transformation, transformationPosition, signed, expireSeconds, config.getPrivateKey()); @@ -110,13 +110,7 @@ private static String buildPathUrl(String path, String urlEndpoint, Map 0){ - expiryTimestamp = ((Calendar.getInstance().getTimeInMillis()/1000)+expireSeconds); - String signature = signUrl(privateKey,tmpUri.toString(),urlEndpoint,expiryTimestamp); - queryMaker.put("ik-s=" + signature); - queryMaker.put("ik-t=" + expiryTimestamp); - } + sign(urlEndpoint, expireSeconds, privateKey, queryMaker, tmpUri); } newUri = new URI(baseUrl.getScheme(),baseUrl.getUserInfo(),baseUrl.getHost(),baseUrl.getPort(), @@ -129,7 +123,7 @@ private static String buildPathUrl(String path, String urlEndpoint, Map queryParameters, List> transformation, String transformationPosition, boolean signed, long expireSeconds) { + private static String buildFullUrl(String src, Map queryParameters, List> transformation, String transformationPosition, boolean signed, long expireSeconds, String privateKey, String urlEndpoint) { StringBuilder tr= new StringBuilder(""); if (transformation.size()>0) { tr.append("tr="); @@ -178,6 +172,15 @@ private static String buildFullUrl(String src, Map queryParamete URI newUri= null; try { String newPath=baseUrl.getPath(); + URI tmpUri = new URI(baseUrl.getScheme(),baseUrl.getUserInfo(),baseUrl.getHost(),baseUrl.getPort(), + newPath, + queryMaker.get(),null); + + + if (signed){ + sign(urlEndpoint, expireSeconds, privateKey, queryMaker, tmpUri); + } + newUri = new URI(baseUrl.getScheme(),baseUrl.getUserInfo(),baseUrl.getHost(),baseUrl.getPort(), newPath, queryMaker.get(),null); @@ -187,6 +190,16 @@ private static String buildFullUrl(String src, Map queryParamete return newUri.toString(); } + private static void sign(String urlEndpoint, long expireSeconds, String privateKey, QueryMaker queryMaker, URI tmpUri) { + long expiryTimestamp = DEFAULT_TIMESTAMP; + if (expireSeconds > 0){ + expiryTimestamp = ((Calendar.getInstance().getTimeInMillis()/1000)+ expireSeconds); + String signature = signUrl(privateKey, tmpUri.toString(), urlEndpoint,expiryTimestamp); + queryMaker.put("ik-s=" + signature); + queryMaker.put("ik-t=" + expiryTimestamp); + } + } + public static String signUrl(String privateKey, String url, String urlEndpoint, long expiryTimestamp){ if (expiryTimestamp < 1){ expiryTimestamp = DEFAULT_TIMESTAMP; diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index f42bc88..00ce54b 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -16,6 +16,7 @@ import org.mockito.Matchers; import java.util.*; +import java.util.regex.Pattern; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.*; @@ -23,6 +24,8 @@ import static org.mockito.Mockito.*; public class ImageKitTest { + private static final Pattern IMAGEKIT_SIGNED_URL_PATTERN = Pattern.compile("(https://.*)\\?ik-sdk-version=(.*)&ik-s=(.*)&ik-t=(.*)"); + private ImageKit SUT; RestClient restClient; @Before @@ -367,18 +370,33 @@ public void getUrl_src_with_query_params_but_transformationPosition_is_path() { @Test public void getUrl_with_signature() { - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("width","100"); + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("width", "100"); transformation.add(scale); - Map options=new HashMap<>(); - options.put("path","/test-signed-url.png"); - options.put("transformation",transformation); - options.put("signed",true); + Map options = new HashMap<>(); + options.put("path", "/test-signed-url.png"); + options.put("transformation", transformation); + options.put("signed", true); + options.put("expireSeconds", 1000); - String url=SUT.getUrl(options); - assertTrue(url.contains("ik-s")); + String url = SUT.getUrl(options); + + assertSignedUrl("https://test-domain.com/test-endpoint/tr:w-100/test-signed-url.png", url); + } + + @Test + public void getUrl_with_signature_src_noTransform() { + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); + options.put("transformation", Collections.emptyList()); + options.put("signed", true); + options.put("expireSeconds", 1000); + + String url = SUT.getUrl(options); + + assertSignedUrl("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg", url); } @Test @@ -601,4 +619,12 @@ public void differentLength_getHammingDistance_throwException() { int hammingDistance = SUT.pHashDistance("a4a65595ac94518b3", "7838873e791f8400"); } + private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { + java.util.regex.Matcher matcher = IMAGEKIT_SIGNED_URL_PATTERN.matcher(actualUrl); + assertTrue(actualUrl + " does not look like a signed url", matcher.matches()); + assertEquals(expectedBaseUrl, matcher.group(1)); + assertEquals(Version.VERSION_CODE, matcher.group(2)); + assertFalse(matcher.group(3).trim().isEmpty()); + assertFalse(matcher.group(4).trim().isEmpty()); + } } \ No newline at end of file