Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 23 additions & 10 deletions imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down Expand Up @@ -110,13 +110,7 @@ private static String buildPathUrl(String path, String urlEndpoint, Map<String,
queryMaker.get(),null);

if (signed){
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);
}
sign(urlEndpoint, expireSeconds, privateKey, queryMaker, tmpUri);
}

newUri = new URI(baseUrl.getScheme(),baseUrl.getUserInfo(),baseUrl.getHost(),baseUrl.getPort(),
Expand All @@ -129,7 +123,7 @@ private static String buildPathUrl(String path, String urlEndpoint, Map<String,
return newUri.toString();
}

private static String buildFullUrl(String src, Map<String, String> queryParameters, List<Map<String, String>> transformation, String transformationPosition, boolean signed, long expireSeconds) {
private static String buildFullUrl(String src, Map<String, String> queryParameters, List<Map<String, String>> transformation, String transformationPosition, boolean signed, long expireSeconds, String privateKey, String urlEndpoint) {
StringBuilder tr= new StringBuilder("");
if (transformation.size()>0) {
tr.append("tr=");
Expand Down Expand Up @@ -178,6 +172,15 @@ private static String buildFullUrl(String src, Map<String, String> 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);
Expand All @@ -187,6 +190,16 @@ private static String buildFullUrl(String src, Map<String, String> 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;
Expand Down
44 changes: 35 additions & 9 deletions imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,16 @@
import org.mockito.Matchers;

import java.util.*;
import java.util.regex.Pattern;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
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
Expand Down Expand Up @@ -367,18 +370,33 @@ public void getUrl_src_with_query_params_but_transformationPosition_is_path() {

@Test
public void getUrl_with_signature() {
List<Map<String, String>> transformation=new ArrayList<Map<String, String>>();
Map<String, String> scale=new HashMap<>();
scale.put("width","100");
List<Map<String, String>> transformation = new ArrayList<Map<String, String>>();
Map<String, String> scale = new HashMap<>();
scale.put("width", "100");
transformation.add(scale);

Map<String, Object> options=new HashMap<>();
options.put("path","/test-signed-url.png");
options.put("transformation",transformation);
options.put("signed",true);
Map<String, Object> 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<String, Object> 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
Expand Down Expand Up @@ -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());
}
}