diff --git a/pom.xml b/pom.xml
index bd6a5a5..6c4167f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
4.0.0
com.contentstack.sdk
java
- 2.0.3
+ 2.0.4
jar
contentstack-java
Java SDK for Contentstack Content Delivery API
@@ -20,12 +20,12 @@
3.3.1
3.4.1
3.0.0
- 3.1.9
+ 3.1.10
2.11.0
5.0.0-alpha.11
0.8.5
- 1.18.34
- 5.10.1
+ 1.18.36
+ 5.11.4
5.8.0-M1
2.8.8
1.1.1
@@ -33,10 +33,10 @@
1.5
3.8.1
1.6.13
- 20240303
+ 20250107
0.8.7
2.5.3
- 1.2.7
+ 1.2.15
@@ -187,7 +187,7 @@
com.fasterxml.jackson.core
jackson-databind
- 2.18.0
+ 2.18.2
diff --git a/src/main/java/com/contentstack/sdk/AssetLibrary.java b/src/main/java/com/contentstack/sdk/AssetLibrary.java
index 0751266..dd16872 100644
--- a/src/main/java/com/contentstack/sdk/AssetLibrary.java
+++ b/src/main/java/com/contentstack/sdk/AssetLibrary.java
@@ -31,6 +31,31 @@ protected void setStackInstance(@NotNull Stack stack) {
this.headers = stack.headers;
}
+ //Sanitization of keys
+ private boolean isValidKey(String key) {
+ return key.matches("^[a-zA-Z0-9_.]+$");
+ }
+
+ //Sanitization of values
+ private boolean isValidValue(Object value) {
+ if(value instanceof String){
+ return ((String) value).matches("^[a-zA-Z0-9_.\\-\\s]+$");
+ }
+ return true;
+ }
+
+ //Sanitization of values list
+ private boolean isValidValueList(Object[] values) {
+ for (Object value : values) {
+ if (value instanceof String) {
+ if (!((String) value).matches("^[a-zA-Z0-9_.\\-\\s]+$")) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
/**
* Sets header.
*
@@ -151,7 +176,11 @@ public int getCount() {
*
*/
public AssetLibrary addParam(@NotNull String paramKey, @NotNull Object paramValue) {
- urlQueries.put(paramKey, paramValue);
+ if (isValidKey(paramKey) && isValidValue(paramValue)) {
+ urlQueries.put(paramKey, paramValue);
+ } else {
+ logger.warning("Invalid key or value");
+ }
return this;
}
@@ -172,8 +201,12 @@ public AssetLibrary addParam(@NotNull String paramKey, @NotNull Object paramValu
*
*/
public AssetLibrary removeParam(@NotNull String paramKey){
- if(urlQueries.has(paramKey)){
- urlQueries.remove(paramKey);
+ if(isValidKey(paramKey)) {
+ if(urlQueries.has(paramKey)){
+ urlQueries.remove(paramKey);
+ }
+ } else {
+ logger.warning("Invalid key");
}
return this;
}
@@ -255,7 +288,9 @@ private HashMap getUrlParams(JSONObject urlQueriesJSON) {
while (iter.hasNext()) {
String key = iter.next();
Object value = urlQueriesJSON.opt(key);
- hashMap.put(key, value);
+ if(isValidKey(key) && isValidValue(value)) {
+ hashMap.put(key, value);
+ }
}
}
return hashMap;
@@ -311,9 +346,13 @@ public enum ORDERBY {
}
public AssetLibrary where(String key, String value) {
- JSONObject queryParams= new JSONObject();
- queryParams.put(key,value);
- urlQueries.put("query", queryParams);
+ if(isValidKey(key) && isValidValue(value)){
+ JSONObject queryParams = new JSONObject();
+ queryParams.put(key,value);
+ urlQueries.put("query", queryParams);
+ } else {
+ throw new IllegalArgumentException("Invalid key or value");
+ }
return this;
}
diff --git a/src/main/java/com/contentstack/sdk/AssetsModel.java b/src/main/java/com/contentstack/sdk/AssetsModel.java
index 1303001..7102bc7 100644
--- a/src/main/java/com/contentstack/sdk/AssetsModel.java
+++ b/src/main/java/com/contentstack/sdk/AssetsModel.java
@@ -20,10 +20,12 @@ class AssetsModel {
*/
public AssetsModel(JSONObject response) {
JSONArray listResponse = null;
- Object rawAssets = response.get("assets"); // Get assets
+ Object rawAssets = response.opt("assets"); // Get assets
if (rawAssets instanceof List) { // Check if it's an ArrayList
List> assetsList = (List>) rawAssets;
listResponse = new JSONArray(assetsList); // Convert to JSONArray
+ } else if (rawAssets != null) {
+ throw new IllegalArgumentException("Invalid type for 'assets' key: " + rawAssets.getClass().getName());
}
if (listResponse != null) {
listResponse.forEach(model -> {
diff --git a/src/main/java/com/contentstack/sdk/CSConnectionRequest.java b/src/main/java/com/contentstack/sdk/CSConnectionRequest.java
index 592b224..64daeb4 100644
--- a/src/main/java/com/contentstack/sdk/CSConnectionRequest.java
+++ b/src/main/java/com/contentstack/sdk/CSConnectionRequest.java
@@ -83,7 +83,7 @@ public void setParams(Object... objects) {
}
@Override
- public void sendRequest() {
+ public synchronized void sendRequest() {
CSHttpConnection connection = new CSHttpConnection(urlToCall, this);
connection.setController(controller);
connection.setHeaders(header);
@@ -99,7 +99,7 @@ public void sendRequest() {
}
@Override
- public void onRequestFailed(JSONObject error, int statusCode, ResultCallBack callBackObject) {
+ public synchronized void onRequestFailed(JSONObject error, int statusCode, ResultCallBack callBackObject) {
Error errResp = new Error();
if (error.has(ERROR_MESSAGE)) {
String errMsg = error.optString(ERROR_MESSAGE);
@@ -119,7 +119,7 @@ public void onRequestFailed(JSONObject error, int statusCode, ResultCallBack cal
}
@Override
- public void onRequestFinished(CSHttpConnection request) {
+ public synchronized void onRequestFinished(CSHttpConnection request) {
JSONObject jsonResponse = request.getResponse();
if (request.getController().equalsIgnoreCase(Constants.QUERYOBJECT)) {
EntriesModel model = new EntriesModel(jsonResponse);
diff --git a/src/main/java/com/contentstack/sdk/Config.java b/src/main/java/com/contentstack/sdk/Config.java
index 54011b9..d9fee7e 100644
--- a/src/main/java/com/contentstack/sdk/Config.java
+++ b/src/main/java/com/contentstack/sdk/Config.java
@@ -31,6 +31,9 @@ public class Config {
protected Proxy proxy = null;
protected String[] earlyAccess = null;
protected ConnectionPool connectionPool = new ConnectionPool();
+ public String releaseId;
+ public String previewTimestamp;
+
protected List plugins = null;
diff --git a/src/main/java/com/contentstack/sdk/ContentTypesModel.java b/src/main/java/com/contentstack/sdk/ContentTypesModel.java
index 10daf7a..2fadcde 100644
--- a/src/main/java/com/contentstack/sdk/ContentTypesModel.java
+++ b/src/main/java/com/contentstack/sdk/ContentTypesModel.java
@@ -20,10 +20,15 @@ public void setJSON(JSONObject responseJSON) {
if (responseJSON != null) {
String ctKey = "content_type";
if (responseJSON.has(ctKey) && responseJSON.opt(ctKey) instanceof LinkedHashMap) {
- this.response = new JSONObject((LinkedHashMap, ?>) responseJSON.get(ctKey));
+ try {
+ this.response = new JSONObject((LinkedHashMap, ?>) responseJSON.get(ctKey));
+ } catch (Exception e) {
+ System.err.println("Error processing 'content_type': " + e.getMessage());
+ }
}
String ctListKey = "content_types";
if (responseJSON.has(ctListKey) && responseJSON.opt(ctListKey) instanceof ArrayList) {
+ try {
ArrayList> contentTypes = (ArrayList) responseJSON.get(ctListKey);
List