From bef6ee36cd15d0ef55158f180041a1f3eb72b4fc Mon Sep 17 00:00:00 2001 From: Ryan Doherty Date: Sun, 11 Apr 2021 14:24:54 -0400 Subject: [PATCH] Add new limit to user preference value size --- .../wdk/model/user/UserPreferenceFactory.java | 5 +++++ .../request/user/UserPreferencesRequest.java | 19 ++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Model/src/main/java/org/gusdb/wdk/model/user/UserPreferenceFactory.java b/Model/src/main/java/org/gusdb/wdk/model/user/UserPreferenceFactory.java index a2324edcfe..e5a75ba7f8 100644 --- a/Model/src/main/java/org/gusdb/wdk/model/user/UserPreferenceFactory.java +++ b/Model/src/main/java/org/gusdb/wdk/model/user/UserPreferenceFactory.java @@ -24,6 +24,11 @@ public class UserPreferenceFactory { private static final String GLOBAL_PREFERENCE_KEY = "[Global]"; + // even though we store value as a CLOB, the entire value is stored in memory + // at once (no streaming), so we must still be conscious of size + public static final long MAX_PREFERENCE_VALUE_SIZE = 200000; + public static final long MAX_PREFERENCE_KEY_SIZE = 4000; + private final WdkModel _wdkModel; private final DatabaseInstance _userDb; private final String _userSchema; diff --git a/Service/src/main/java/org/gusdb/wdk/service/request/user/UserPreferencesRequest.java b/Service/src/main/java/org/gusdb/wdk/service/request/user/UserPreferencesRequest.java index 2279a315f5..d95724c863 100644 --- a/Service/src/main/java/org/gusdb/wdk/service/request/user/UserPreferencesRequest.java +++ b/Service/src/main/java/org/gusdb/wdk/service/request/user/UserPreferencesRequest.java @@ -1,11 +1,16 @@ package org.gusdb.wdk.service.request.user; +import static org.gusdb.wdk.model.user.UserPreferenceFactory.MAX_PREFERENCE_KEY_SIZE; +import static org.gusdb.wdk.model.user.UserPreferenceFactory.MAX_PREFERENCE_VALUE_SIZE; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.gusdb.fgputil.FormatUtil; import org.gusdb.fgputil.json.JsonUtil; +import org.gusdb.wdk.service.request.exception.DataValidationException; import org.gusdb.wdk.service.request.exception.RequestMisformatException; import org.json.JSONException; import org.json.JSONObject; @@ -26,8 +31,9 @@ public class UserPreferencesRequest { * @param json * @return * @throws RequestMisformatException + * @throws DataValidationException */ - public static UserPreferencesRequest createFromJson(JSONObject json) throws RequestMisformatException { + public static UserPreferencesRequest createFromJson(JSONObject json) throws RequestMisformatException, DataValidationException { try { UserPreferencesRequest request = new UserPreferencesRequest(); loadPreferenceChanges(json, request._updates, request._deletes); @@ -40,14 +46,21 @@ public static UserPreferencesRequest createFromJson(JSONObject json) throws Requ } private static void loadPreferenceChanges(JSONObject json, - Map updates, List deletes) { + Map updates, List deletes) throws DataValidationException { for (String key : JsonUtil.getKeys(json)) { if (json.isNull(key)) { deletes.add(key); } else { - updates.put(key, json.getString(key)); + if (FormatUtil.getUtf8EncodedBytes(key).length > MAX_PREFERENCE_KEY_SIZE) { + throw new DataValidationException("User preference key size cannot be greater than " + MAX_PREFERENCE_KEY_SIZE + " bytes."); + } + String pref = json.getString(key); + if (FormatUtil.getUtf8EncodedBytes(pref).length > MAX_PREFERENCE_VALUE_SIZE) { + throw new DataValidationException("User preference value size cannot be greater than " + MAX_PREFERENCE_VALUE_SIZE + " bytes."); + } + updates.put(key, pref); } }