Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 9 additions & 12 deletions splitio/example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 6 additions & 3 deletions splitio/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion splitio_android/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,18 @@
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;
import io.split.android.client.SplitClientConfig;
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;

Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -219,6 +224,24 @@ static SplitClientConfig fromMap(@NonNull Map<String, Object> configurationMap,
builder.ready((int) TimeUnit.SECONDS.toMillis(readyTimeout)); // Android SDK uses this parameter in millis
}

Map<String, Object> certificatePinningConfig = getObjectMap(configurationMap, CERTIFICATE_PINNING_CONFIGURATION);
if (certificatePinningConfig != null) {
Map<String, List<String>> pins = getListMap(certificatePinningConfig, CERTIFICATE_PINNING_CONFIGURATION_PINS);
if (pins != null && !pins.isEmpty()) {
Set<String> hosts = pins.keySet();
CertificatePinningConfiguration.Builder certPinningConfigBuilder = CertificatePinningConfiguration.builder();
for (String host : hosts) {
Set<String> 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();
}

Expand Down Expand Up @@ -274,4 +297,16 @@ private static Map<String, List<String>> getListMap(Map<String, Object> map, Str

return null;
}

@Nullable
private static Map<String, Object> getObjectMap(Map<String, Object> map, String key) {
if (map.containsKey(key)) {
Object value = map.get(key);
if (value != null && value.getClass().isAssignableFrom(HashMap.class)) {
return (HashMap<String, Object>) value;
}
}

return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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<String, Object> configValues = new HashMap<>();
Map<String, Object> pinningConfigValues = new HashMap<>();
Map<String, Set<String>> pins = new HashMap<>();

Set<String> 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<CertificatePin> host1Pins = actualConfig.getPins().get("host1");
Iterator<CertificatePin> iterator = host1Pins.iterator();
assertEquals("sha256", iterator.next().getAlgorithm());
assertEquals("sha1", iterator.next().getAlgorithm());

Set<CertificatePin> host2Pins = actualConfig.getPins().get("host2");
assertEquals("sha256", host2Pins.iterator().next().getAlgorithm());
}
}
3 changes: 2 additions & 1 deletion splitio_android/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
3 changes: 2 additions & 1 deletion splitio_ios/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down