diff --git a/splitio/example/pubspec.lock b/splitio/example/pubspec.lock index a22e0ac..df08e5d 100644 --- a/splitio/example/pubspec.lock +++ b/splitio/example/pubspec.lock @@ -170,26 +170,23 @@ packages: splitio_android: dependency: transitive description: - name: splitio_android - sha256: b7ddd9f8a694ed610dd3ecd770f16d4ce016c3211d2f56fc5a094ef58bc543fb - url: "https://pub.dev" - source: hosted + path: "../../splitio_android" + relative: true + source: path version: "0.1.9+1" splitio_ios: dependency: transitive description: - name: splitio_ios - sha256: e9b5427a7c8efa67846a5ccbe70d13d3286f50f382b369416bff7c509478b50f - url: "https://pub.dev" - source: hosted + path: "../../splitio_ios" + relative: true + source: path version: "0.1.9" splitio_platform_interface: dependency: transitive description: - name: splitio_platform_interface - sha256: eb0ec278e782bb403856f0921d2023ed8ed1a9e97eafb0f3de5cc4a107d1e04f - url: "https://pub.dev" - source: hosted + path: "../../splitio_platform_interface" + relative: true + source: path version: "1.4.0" stack_trace: dependency: transitive diff --git a/splitio/pubspec.yaml b/splitio/pubspec.yaml index 4acfba3..f02f0e4 100644 --- a/splitio/pubspec.yaml +++ b/splitio/pubspec.yaml @@ -19,9 +19,12 @@ flutter: dependencies: flutter: sdk: flutter - splitio_android: ^0.1.9+1 - splitio_ios: ^0.1.9 - splitio_platform_interface: ^1.4.0 + splitio_android: # ^0.1.9+1 + path: ../splitio_android + splitio_ios: # ^0.1.9 + path: ../splitio_ios + splitio_platform_interface: # ^1.4.0 + path: ../splitio_platform_interface dev_dependencies: flutter_test: diff --git a/splitio_android/android/build.gradle b/splitio_android/android/build.gradle index 98c41c1..cf5924c 100644 --- a/splitio_android/android/build.gradle +++ b/splitio_android/android/build.gradle @@ -36,7 +36,7 @@ android { } dependencies { - implementation 'io.split.client:android-client:4.1.1' + implementation 'io.split.client:android-client:4.2.2' testImplementation 'junit:junit:4.13.2' testImplementation 'org.mockito:mockito-core:3.12.4' diff --git a/splitio_android/android/src/main/java/io/split/splitio/SplitClientConfigHelper.java b/splitio_android/android/src/main/java/io/split/splitio/SplitClientConfigHelper.java index 8aa0e78..ce83e03 100644 --- a/splitio_android/android/src/main/java/io/split/splitio/SplitClientConfigHelper.java +++ b/splitio_android/android/src/main/java/io/split/splitio/SplitClientConfigHelper.java @@ -4,8 +4,10 @@ import androidx.annotation.Nullable; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.TimeUnit; import io.split.android.client.ServiceEndpoints; @@ -13,6 +15,7 @@ import io.split.android.client.SplitFilter; import io.split.android.client.SyncConfig; import io.split.android.client.impressions.ImpressionListener; +import io.split.android.client.network.CertificatePinningConfiguration; import io.split.android.client.shared.UserConsent; import io.split.android.client.utils.logger.SplitLogLevel; @@ -46,6 +49,8 @@ class SplitClientConfigHelper { private static final String ENCRYPTION_ENABLED = "encryptionEnabled"; private static final String LOG_LEVEL = "logLevel"; private static final String READY_TIMEOUT = "readyTimeout"; + private static final String CERTIFICATE_PINNING_CONFIGURATION = "certificatePinningConfiguration"; + private static final String CERTIFICATE_PINNING_CONFIGURATION_PINS = "pins"; /** * Creates a {@link SplitClientConfig} object from a map. @@ -219,6 +224,24 @@ static SplitClientConfig fromMap(@NonNull Map configurationMap, builder.ready((int) TimeUnit.SECONDS.toMillis(readyTimeout)); // Android SDK uses this parameter in millis } + Map certificatePinningConfig = getObjectMap(configurationMap, CERTIFICATE_PINNING_CONFIGURATION); + if (certificatePinningConfig != null) { + Map> pins = getListMap(certificatePinningConfig, CERTIFICATE_PINNING_CONFIGURATION_PINS); + if (pins != null && !pins.isEmpty()) { + Set hosts = pins.keySet(); + CertificatePinningConfiguration.Builder certPinningConfigBuilder = CertificatePinningConfiguration.builder(); + for (String host : hosts) { + Set hostPins = new HashSet<>(pins.get(host)); + if (!hostPins.isEmpty()) { + for (String pin : hostPins) { + certPinningConfigBuilder.addPin(host, pin); + } + } + } + builder.certificatePinningConfiguration(certPinningConfigBuilder.build()); + } + } + return builder.serviceEndpoints(serviceEndpointsBuilder.build()).build(); } @@ -274,4 +297,16 @@ private static Map> getListMap(Map map, Str return null; } + + @Nullable + private static Map getObjectMap(Map map, String key) { + if (map.containsKey(key)) { + Object value = map.get(key); + if (value != null && value.getClass().isAssignableFrom(HashMap.class)) { + return (HashMap) value; + } + } + + return null; + } } diff --git a/splitio_android/android/src/test/java/io/split/splitio/SplitClientConfigHelperTest.java b/splitio_android/android/src/test/java/io/split/splitio/SplitClientConfigHelperTest.java index 6c16b8f..18691f0 100644 --- a/splitio_android/android/src/test/java/io/split/splitio/SplitClientConfigHelperTest.java +++ b/splitio_android/android/src/test/java/io/split/splitio/SplitClientConfigHelperTest.java @@ -11,14 +11,21 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import io.split.android.client.SplitClientConfig; import io.split.android.client.SplitFilter; import io.split.android.client.impressions.ImpressionListener; +import io.split.android.client.network.CertificatePin; +import io.split.android.client.network.CertificatePinningConfiguration; import io.split.android.client.service.impressions.ImpressionsMode; import io.split.android.client.shared.UserConsent; +import io.split.android.client.utils.logger.LogPrinter; +import io.split.android.client.utils.logger.Logger; import io.split.android.client.utils.logger.SplitLogLevel; public class SplitClientConfigHelperTest { @@ -178,4 +185,38 @@ public void syncConfigWithFlagSetsIsMappedCorrectly() { assertEquals(Arrays.asList("set_1", "set_2"), splitClientConfig.syncConfig().getFilters().get(0).getValues()); assertEquals(SplitFilter.Type.BY_SET, splitClientConfig.syncConfig().getFilters().get(0).getType()); } + + @Test + public void certificatePinningConfigurationValuesAreMappedCorrectly() { + Logger.instance().setPrinter(mock(LogPrinter.class)); + + Map configValues = new HashMap<>(); + Map pinningConfigValues = new HashMap<>(); + Map> pins = new HashMap<>(); + + Set hostOnePins = new HashSet<>(); + hostOnePins.add("sha256/pin1"); + hostOnePins.add("sha1/pin2"); + pins.put("host1", hostOnePins); + pins.put("host2", Collections.singleton("sha256/pin2")); + pinningConfigValues.put("pins", pins); + configValues.put("certificatePinningConfiguration", pinningConfigValues); + + SplitClientConfig splitClientConfig = SplitClientConfigHelper + .fromMap(configValues, mock(ImpressionListener.class)); + + CertificatePinningConfiguration actualConfig = splitClientConfig.certificatePinningConfiguration(); + assertNotNull(actualConfig); + assertEquals(2, actualConfig.getPins().size()); + assertEquals(2, actualConfig.getPins().get("host1").size()); + assertEquals(1, actualConfig.getPins().get("host2").size()); + + Set host1Pins = actualConfig.getPins().get("host1"); + Iterator iterator = host1Pins.iterator(); + assertEquals("sha256", iterator.next().getAlgorithm()); + assertEquals("sha1", iterator.next().getAlgorithm()); + + Set host2Pins = actualConfig.getPins().get("host2"); + assertEquals("sha256", host2Pins.iterator().next().getAlgorithm()); + } } diff --git a/splitio_android/pubspec.yaml b/splitio_android/pubspec.yaml index e6e36c8..488f82e 100644 --- a/splitio_android/pubspec.yaml +++ b/splitio_android/pubspec.yaml @@ -19,7 +19,8 @@ flutter: dependencies: flutter: sdk: flutter - splitio_platform_interface: ^1.4.0 + splitio_platform_interface: #^1.4.0 + path: ../splitio_platform_interface dev_dependencies: flutter_test: diff --git a/splitio_ios/pubspec.yaml b/splitio_ios/pubspec.yaml index 151c673..ccd78f9 100644 --- a/splitio_ios/pubspec.yaml +++ b/splitio_ios/pubspec.yaml @@ -18,7 +18,8 @@ flutter: dependencies: flutter: sdk: flutter - splitio_platform_interface: ^1.4.0 + splitio_platform_interface: #^1.4.0 + path: ../splitio_platform_interface dev_dependencies: flutter_test: