From a085733e033b6c68fa7d72ede0a31209f69302e8 Mon Sep 17 00:00:00 2001 From: Omer Levy Date: Mon, 9 Oct 2017 03:42:57 +0300 Subject: [PATCH] move invalid parameters validation to javascript and remove validation from android --- .../firebase/links/RNFirebaseLinks.java | 38 ------------------ lib/modules/links/index.js | 39 +++++++++++++++++++ lib/utils/index.js | 37 ++++++++++++++++++ tests/src/tests/links/linksTests.js | 15 ++++--- 4 files changed, 83 insertions(+), 46 deletions(-) diff --git a/android/src/main/java/io/invertase/firebase/links/RNFirebaseLinks.java b/android/src/main/java/io/invertase/firebase/links/RNFirebaseLinks.java index 56181d27..5f6fec9e 100644 --- a/android/src/main/java/io/invertase/firebase/links/RNFirebaseLinks.java +++ b/android/src/main/java/io/invertase/firebase/links/RNFirebaseLinks.java @@ -196,23 +196,10 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ if (dynamicLinkInfo != null) { try { parametersBuilder.setLink(Uri.parse((String) dynamicLinkInfo.get("link"))); - dynamicLinkInfo.remove("link"); - parametersBuilder.setDynamicLinkDomain((String) dynamicLinkInfo.get("dynamicLinkDomain")); - dynamicLinkInfo.remove("dynamicLinkDomain"); - setAndroidParameters(dynamicLinkInfo, parametersBuilder); - dynamicLinkInfo.remove("androidInfo"); - setIosParameters(dynamicLinkInfo, parametersBuilder); - dynamicLinkInfo.remove("iosInfo"); - setSocialMetaTagParameters(dynamicLinkInfo, parametersBuilder); - dynamicLinkInfo.remove("socialMetaTagInfo"); - - if (dynamicLinkInfo.size() > 0) { - throw new IllegalArgumentException("Invalid arguments: " + dynamicLinkInfo.keySet().toString()); - } } catch (Exception e) { Log.e(TAG, "error while building parameters " + e.getMessage()); throw e; @@ -244,19 +231,12 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ DynamicLink.AndroidParameters.Builder androidParametersBuilder = new DynamicLink.AndroidParameters.Builder((String) androidParameters.get("androidPackageName")); - androidParameters.remove("androidPackageName"); if (androidParameters.containsKey("androidFallbackLink")) { androidParametersBuilder.setFallbackUrl(Uri.parse((String) androidParameters.get("androidFallbackLink"))); - androidParameters.remove("androidFallbackLink"); } if (androidParameters.containsKey("androidMinPackageVersionCode")) { androidParametersBuilder.setMinimumVersion(Integer.parseInt((String) androidParameters.get("androidMinPackageVersionCode"))); - androidParameters.remove("androidMinPackageVersionCode"); - } - - if (androidParameters.size() > 0) { - throw new IllegalArgumentException("Invalid arguments: " + androidParameters.keySet().toString()); } parametersBuilder.setAndroidParameters(androidParametersBuilder.build()); } @@ -270,35 +250,24 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ } DynamicLink.IosParameters.Builder iosParametersBuilder = new DynamicLink.IosParameters.Builder((String) iosParameters.get("iosBundleId")); - iosParameters.remove("iosBundleId"); if (iosParameters.containsKey("iosAppStoreId")) { iosParametersBuilder.setAppStoreId((String) iosParameters.get("iosAppStoreId")); - iosParameters.remove("iosAppStoreId"); } if (iosParameters.containsKey("iosCustomScheme")) { iosParametersBuilder.setCustomScheme((String) iosParameters.get("iosCustomScheme")); - iosParameters.remove("iosCustomScheme"); } if (iosParameters.containsKey("iosFallbackLink")) { iosParametersBuilder.setFallbackUrl(Uri.parse((String) iosParameters.get("iosFallbackLink"))); - iosParameters.remove("iosFallbackLink"); } if (iosParameters.containsKey("iosIpadBundleId")) { iosParametersBuilder.setIpadBundleId((String) iosParameters.get("iosIpadBundleId")); - iosParameters.remove("iosIpadBundleId"); } if (iosParameters.containsKey("iosIpadFallbackLink")) { iosParametersBuilder.setIpadFallbackUrl(Uri.parse((String) iosParameters.get("iosIpadFallbackLink"))); - iosParameters.remove("iosIpadFallbackLink"); } if (iosParameters.containsKey("iosMinPackageVersionCode")) { iosParametersBuilder.setMinimumVersion((String) iosParameters.get("iosMinPackageVersionCode")); - iosParameters.remove("iosMinPackageVersionCode"); - } - - if (iosParameters.size() > 0) { - throw new IllegalArgumentException("Invalid arguments: " + iosParameters.keySet().toString()); } parametersBuilder.setIosParameters(iosParametersBuilder.build()); } @@ -312,19 +281,12 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ if (socialMetaTagParameters.containsKey("socialDescription")) { socialMetaTagParametersBuilder.setDescription((String) socialMetaTagParameters.get("socialDescription")); - socialMetaTagParameters.remove("socialDescription"); } if (socialMetaTagParameters.containsKey("socialImageLink")) { socialMetaTagParametersBuilder.setImageUrl(Uri.parse((String) socialMetaTagParameters.get("socialImageLink"))); - socialMetaTagParameters.remove("socialImageLink"); } if (socialMetaTagParameters.containsKey("socialTitle")) { socialMetaTagParametersBuilder.setTitle((String) socialMetaTagParameters.get("socialTitle")); - socialMetaTagParameters.remove("socialTitle"); - } - - if (socialMetaTagParameters.size() > 0) { - throw new IllegalArgumentException("Invalid arguments: " + socialMetaTagParameters.keySet().toString()); } parametersBuilder.setSocialMetaTagParameters(socialMetaTagParametersBuilder.build()); } diff --git a/lib/modules/links/index.js b/lib/modules/links/index.js index c4c94440..8c76c3e9 100644 --- a/lib/modules/links/index.js +++ b/lib/modules/links/index.js @@ -1,4 +1,5 @@ import ModuleBase from './../../utils/ModuleBase'; +import { areObjectKeysContainedInOther } from './../../utils'; const EVENT_TYPE = { Link: 'dynamic_link_received', @@ -43,6 +44,9 @@ export default class Links extends ModuleBase { * @returns {Promise.} */ createDynamicLink(parameters: Object = {}): Promise { + if (!this._validateParameters(parameters)) { + return Promise.reject(new Error('Invalid Parameters.')); + } return this._native.createDynamicLink(parameters); } @@ -52,8 +56,43 @@ export default class Links extends ModuleBase { * @returns {Promise.} */ createShortDynamicLink(parameters: Object = {}): Promise { + if (!this._validateParameters(parameters)) { + return Promise.reject(new Error('Invalid Parameters.')); + } return this._native.createShortDynamicLink(parameters); } + + _validateParameters(parameters: Object): boolean { + const suportedParametersObject = { + dynamicLinkInfo: { + dynamicLinkDomain: 'string', + link: 'string', + androidInfo: { + androidPackageName: 'string', + androidFallbackLink: 'string', + androidMinPackageVersionCode: 'string', + androidLink: 'string', + }, + iosInfo: { + iosBundleId: 'string', + iosFallbackLink: 'string', + iosCustomScheme: 'string', + iosIpadFallbackLink: 'string', + iosIpadBundleId: 'string', + iosAppStoreId: 'string', + }, + socialMetaTagInfo: { + socialTitle: 'string', + socialDescription: 'string', + socialImageLink: 'string', + }, + }, + suffix: { + option: 'string', + }, + }; + return areObjectKeysContainedInOther(parameters, suportedParametersObject); + } } export const statics = { diff --git a/lib/utils/index.js b/lib/utils/index.js index 891eb804..137a093a 100644 --- a/lib/utils/index.js +++ b/lib/utils/index.js @@ -70,6 +70,43 @@ export function deepExists(object: Object, return tmp !== undefined; } +/** + * Deep Check if obj1 keys are contained in obj2 + * @param obj1 + * @param obj2 + * @returns {boolean} + */ +export function areObjectKeysContainedInOther(obj1 : Object, obj2: Object): boolean { + if (!isObject(obj1) || !isObject(obj2)) { + return false; + } + const keys1 = Object.keys(obj1); + const keys2 = Object.keys(obj2); + if (isArrayContainedInOther(keys1, keys2)) { + return keys1.filter((key) => { + return isObject(obj1[key]); + }).reduce((acc, cur) => { + return acc && areObjectKeysContainedInOther(obj1[cur], obj2[cur]); + }, true); + } + return false; +} + +/** + * Check if arr1 is contained in arr2 + * @param arr1 + * @param arr2 + * @returns {boolean} + */ +export function isArrayContainedInOther(arr1: Array, arr2: Array): boolean { + if (!Array.isArray(arr1) || !Array.isArray(arr2)) { + return false; + } + return arr1.reduce((acc, cur) => { + return acc && arr2.includes(cur); + }, true); +} + /** * Simple is object check. * @param item diff --git a/tests/src/tests/links/linksTests.js b/tests/src/tests/links/linksTests.js index 9b37c16e..d52f80e8 100644 --- a/tests/src/tests/links/linksTests.js +++ b/tests/src/tests/links/linksTests.js @@ -101,9 +101,8 @@ function linksTests({ describe, it, firebase, tryCatch }) { reject(new Error('createDynamicLink did not fail.')); }, reject); - const failure = tryCatch((error) => { + const failure = tryCatch(() => { // Assertion - error.code.includes('links/failure').should.be.true(); resolve(); }, reject); @@ -126,7 +125,7 @@ function linksTests({ describe, it, firebase, tryCatch }) { const failure = tryCatch((error) => { // Assertion - error.code.includes('links/failure').should.be.true(); + error.message.should.equal('no iosBundleId was specified.'); resolve(); }, reject); @@ -172,7 +171,7 @@ function linksTests({ describe, it, firebase, tryCatch }) { const failure = tryCatch((error) => { // Assertion - error.code.includes('links/failure').should.be.true(); + error.message.should.equal('no androidPackageName was specified.'); resolve(); }, reject); @@ -218,7 +217,7 @@ function linksTests({ describe, it, firebase, tryCatch }) { const failure = tryCatch((error) => { // Assertion - error.code.includes('links/failure').should.be.true(); + error.message.should.equal('Invalid Parameters.'); resolve(); }, reject); @@ -247,7 +246,7 @@ function linksTests({ describe, it, firebase, tryCatch }) { const failure = tryCatch((error) => { // Assertion - error.code.includes('links/failure').should.be.true(); + error.message.should.equal('Invalid Parameters.'); resolve(); }, reject); @@ -283,7 +282,7 @@ function linksTests({ describe, it, firebase, tryCatch }) { const failure = tryCatch((error) => { // Assertion - error.code.includes('links/failure').should.be.true(); + error.message.should.equal('Invalid Parameters.'); resolve(); }, reject); @@ -319,7 +318,7 @@ function linksTests({ describe, it, firebase, tryCatch }) { const failure = tryCatch((error) => { // Assertion - error.code.includes('links/failure').should.be.true(); + error.message.should.equal('Invalid Parameters.'); resolve(); }, reject);