Skip to content

Commit c27bc89

Browse files
committed
Minimal change to fix issue-4 and get signed urls when using the src parameter
1 parent fa04655 commit c27bc89

File tree

2 files changed

+58
-19
lines changed

2 files changed

+58
-19
lines changed

imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ private static String generateUrl(
5151
}
5252
String newUrl=null;
5353
if (null!=src){
54-
newUrl=buildFullUrl(src,queryParameters,transformation,transformationPosition,signed,expireSeconds);
54+
newUrl=buildFullUrl(src,queryParameters,transformation,transformationPosition,signed,expireSeconds, config.getPrivateKey(), urlEndpoint);
5555
}
5656
else {
5757
if ("query".equalsIgnoreCase(transformationPosition)){
58-
newUrl=buildFullUrl(urlEndpoint+(path.charAt(0)=='/'?path.substring(1,path.length()):path),queryParameters,transformation,transformationPosition,signed,expireSeconds);
58+
newUrl=buildFullUrl(urlEndpoint+(path.charAt(0)=='/'?path.substring(1,path.length()):path),queryParameters,transformation,transformationPosition,signed,expireSeconds, config.getPrivateKey(), urlEndpoint);
5959
}
6060
else {
6161
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<String,
110110
queryMaker.get(),null);
111111

112112
if (signed){
113-
long expiryTimestamp = DEFAULT_TIMESTAMP;
114-
if (expireSeconds > 0){
115-
expiryTimestamp = ((Calendar.getInstance().getTimeInMillis()/1000)+expireSeconds);
116-
String signature = signUrl(privateKey,tmpUri.toString(),urlEndpoint,expiryTimestamp);
117-
queryMaker.put("ik-s=" + signature);
118-
queryMaker.put("ik-t=" + expiryTimestamp);
119-
}
113+
sign(urlEndpoint, expireSeconds, privateKey, queryMaker, tmpUri);
120114
}
121115

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

132-
private static String buildFullUrl(String src, Map<String, String> queryParameters, List<Map<String, String>> transformation, String transformationPosition, boolean signed, long expireSeconds) {
126+
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) {
133127
StringBuilder tr= new StringBuilder("");
134128
if (transformation.size()>0) {
135129
tr.append("tr=");
@@ -178,6 +172,15 @@ private static String buildFullUrl(String src, Map<String, String> queryParamete
178172
URI newUri= null;
179173
try {
180174
String newPath=baseUrl.getPath();
175+
URI tmpUri = new URI(baseUrl.getScheme(),baseUrl.getUserInfo(),baseUrl.getHost(),baseUrl.getPort(),
176+
newPath,
177+
queryMaker.get(),null);
178+
179+
180+
if (signed){
181+
sign(urlEndpoint, expireSeconds, privateKey, queryMaker, tmpUri);
182+
}
183+
181184
newUri = new URI(baseUrl.getScheme(),baseUrl.getUserInfo(),baseUrl.getHost(),baseUrl.getPort(),
182185
newPath,
183186
queryMaker.get(),null);
@@ -187,6 +190,16 @@ private static String buildFullUrl(String src, Map<String, String> queryParamete
187190
return newUri.toString();
188191
}
189192

193+
private static void sign(String urlEndpoint, long expireSeconds, String privateKey, QueryMaker queryMaker, URI tmpUri) {
194+
long expiryTimestamp = DEFAULT_TIMESTAMP;
195+
if (expireSeconds > 0){
196+
expiryTimestamp = ((Calendar.getInstance().getTimeInMillis()/1000)+ expireSeconds);
197+
String signature = signUrl(privateKey, tmpUri.toString(), urlEndpoint,expiryTimestamp);
198+
queryMaker.put("ik-s=" + signature);
199+
queryMaker.put("ik-t=" + expiryTimestamp);
200+
}
201+
}
202+
190203
public static String signUrl(String privateKey, String url, String urlEndpoint, long expiryTimestamp){
191204
if (expiryTimestamp < 1){
192205
expiryTimestamp = DEFAULT_TIMESTAMP;

imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@
1616
import org.mockito.Matchers;
1717

1818
import java.util.*;
19+
import java.util.regex.Pattern;
1920

2021
import static org.hamcrest.CoreMatchers.is;
2122
import static org.junit.Assert.*;
2223
import static org.mockito.Matchers.*;
2324
import static org.mockito.Mockito.*;
2425

2526
public class ImageKitTest {
27+
private static final Pattern IMAGEKIT_SIGNED_URL_PATTERN = Pattern.compile("(https://.*)\\?ik-sdk-version=(.*)&ik-s=(.*)&ik-t=(.*)");
28+
2629
private ImageKit SUT;
2730
RestClient restClient;
2831
@Before
@@ -367,18 +370,33 @@ public void getUrl_src_with_query_params_but_transformationPosition_is_path() {
367370

368371
@Test
369372
public void getUrl_with_signature() {
370-
List<Map<String, String>> transformation=new ArrayList<Map<String, String>>();
371-
Map<String, String> scale=new HashMap<>();
372-
scale.put("width","100");
373+
List<Map<String, String>> transformation = new ArrayList<Map<String, String>>();
374+
Map<String, String> scale = new HashMap<>();
375+
scale.put("width", "100");
373376
transformation.add(scale);
374377

375-
Map<String, Object> options=new HashMap<>();
376-
options.put("path","/test-signed-url.png");
377-
options.put("transformation",transformation);
378-
options.put("signed",true);
378+
Map<String, Object> options = new HashMap<>();
379+
options.put("path", "/test-signed-url.png");
380+
options.put("transformation", transformation);
381+
options.put("signed", true);
382+
options.put("expireSeconds", 1000);
379383

380-
String url=SUT.getUrl(options);
381-
assertTrue(url.contains("ik-s"));
384+
String url = SUT.getUrl(options);
385+
386+
assertSignedUrl("https://test-domain.com/test-endpoint/tr:w-100/test-signed-url.png", url);
387+
}
388+
389+
@Test
390+
public void getUrl_with_signature_src_noTransform() {
391+
Map<String, Object> options = new HashMap<>();
392+
options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg");
393+
options.put("transformation", Collections.emptyList());
394+
options.put("signed", true);
395+
options.put("expireSeconds", 1000);
396+
397+
String url = SUT.getUrl(options);
398+
399+
assertSignedUrl("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg", url);
382400
}
383401

384402
@Test
@@ -601,4 +619,12 @@ public void differentLength_getHammingDistance_throwException() {
601619
int hammingDistance = SUT.pHashDistance("a4a65595ac94518b3", "7838873e791f8400");
602620
}
603621

622+
private void assertSignedUrl(String expectedBaseUrl, String actualUrl) {
623+
java.util.regex.Matcher matcher = IMAGEKIT_SIGNED_URL_PATTERN.matcher(actualUrl);
624+
assertTrue(actualUrl + " does not look like a signed url", matcher.matches());
625+
assertEquals(expectedBaseUrl, matcher.group(1));
626+
assertEquals(Version.VERSION_CODE, matcher.group(2));
627+
assertFalse(matcher.group(3).trim().isEmpty());
628+
assertFalse(matcher.group(4).trim().isEmpty());
629+
}
604630
}

0 commit comments

Comments
 (0)