Skip to content

Release 0.1.10 #133

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Oct 18, 2024
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
6 changes: 6 additions & 0 deletions splitio/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# 0.1.10 (Oct 18, 2024)
* Added certificate pinning functionality. This feature allows you to pin a certificate to the SDK, ensuring that the SDK only communicates with servers that present this certificate. Read more in our documentation.
* Updated iOS SDK to `2.26.1` & Android SDK to `4.2.2`

# 0.1.10-rc.1 (Oct 17, 2024)

# 0.1.9+1 (Jun 7, 2024)
* Updated Android SDK to `4.1.1`

Expand Down
10 changes: 5 additions & 5 deletions splitio/example/ios/Podfile.lock
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
PODS:
- Flutter (1.0.0)
- Split (2.25.0)
- splitio_ios (0.5.0):
- Split (2.26.1)
- splitio_ios (0.6.0):
- Flutter
- Split (~> 2.25.0)
- Split (~> 2.26.1)

DEPENDENCIES:
- Flutter (from `Flutter`)
Expand All @@ -21,8 +21,8 @@ EXTERNAL SOURCES:

SPEC CHECKSUMS:
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
Split: 268875814285de6ab6cd25744e170b407651a080
splitio_ios: f6af0613ceedf0c037673afe256479bb0f6fc6ec
Split: 15cab642eb8b8bb4f289a2190f7b26e655f99756
splitio_ios: 931b5df7148d0dca9acb31a65505bd619f198fcf

PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048

Expand Down
14 changes: 7 additions & 7 deletions splitio/example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -166,31 +166,31 @@ packages:
path: ".."
relative: true
source: path
version: "0.1.9+1"
version: "0.1.10"
splitio_android:
dependency: transitive
description:
name: splitio_android
sha256: b7ddd9f8a694ed610dd3ecd770f16d4ce016c3211d2f56fc5a094ef58bc543fb
sha256: b2ebb1ef9c9f1399b5dca7b008dd90f1cdf3c05da4da74154ff0a5489bafd114
url: "https://pub.dev"
source: hosted
version: "0.1.9+1"
version: "0.1.10"
splitio_ios:
dependency: transitive
description:
name: splitio_ios
sha256: e9b5427a7c8efa67846a5ccbe70d13d3286f50f382b369416bff7c509478b50f
sha256: bf59562ef13c55b528886f3f9383ec4a5608d9de42e910256ba7fb025b310fa0
url: "https://pub.dev"
source: hosted
version: "0.1.9"
version: "0.1.10"
splitio_platform_interface:
dependency: transitive
description:
name: splitio_platform_interface
sha256: eb0ec278e782bb403856f0921d2023ed8ed1a9e97eafb0f3de5cc4a107d1e04f
sha256: "2f0457991d18d654486264a66dacf54c7cf23cd88bbb73ed299d69dbbc2fd49b"
url: "https://pub.dev"
source: hosted
version: "1.4.0"
version: "1.5.0"
stack_trace:
dependency: transitive
description:
Expand Down
1 change: 1 addition & 0 deletions splitio/lib/splitio.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export 'package:splitio_platform_interface/split_impression.dart';
export 'package:splitio_platform_interface/split_result.dart';
export 'package:splitio_platform_interface/split_sync_config.dart';
export 'package:splitio_platform_interface/split_view.dart';
export 'package:splitio_platform_interface/split_certificate_pinning_configuration.dart';

typedef ClientReadinessCallback = void Function(SplitClient splitClient);

Expand Down
8 changes: 4 additions & 4 deletions splitio/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: splitio
description: Official plugin for split.io, the platform for controlled rollouts, which serves features to your users via feature flags to manage your complete customer experience.
version: 0.1.9+1
version: 0.1.10
homepage: https://split.io/
repository: https://github.com/splitio/flutter-sdk-plugin/tree/main/splitio/

Expand All @@ -19,9 +19,9 @@ 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.10
splitio_ios: ^0.1.10
splitio_platform_interface: ^1.5.0

dev_dependencies:
flutter_test:
Expand Down
7 changes: 7 additions & 0 deletions splitio_android/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# 0.1.10 (Oct 18, 2024)
* Updated Android SDK to `4.2.2`

# 0.1.10-rc.2 (Oct 17, 2024)

# 0.1.10-rc.1 (Oct 17, 2024)

# 0.1.9+1 (Jun 7, 2024)
* Updated Android SDK to `4.1.1`

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());
}
}
4 changes: 2 additions & 2 deletions splitio_android/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: splitio_android
description: The official Android implementation of splitio Flutter plugin.
repository: https://github.com/splitio/flutter-sdk-plugin/tree/main/splitio_android
version: 0.1.9+1
version: 0.1.10

environment:
sdk: ">=2.16.2 <4.0.0"
Expand All @@ -19,7 +19,7 @@ flutter:
dependencies:
flutter:
sdk: flutter
splitio_platform_interface: ^1.4.0
splitio_platform_interface: ^1.5.0

dev_dependencies:
flutter_test:
Expand Down
7 changes: 7 additions & 0 deletions splitio_ios/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# 0.1.10 (Oct 18, 2024)
* Updated iOS SDK to `2.26.1`

# 0.1.10-rc.2 (Oct 17, 2024)

# 0.1.10-rc.1 (Oct 17, 2024)

# 0.1.9 (May 22, 2024)
* Updated iOS SDK to `2.25.0`

Expand Down
10 changes: 5 additions & 5 deletions splitio_ios/example/ios/Podfile.lock
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
PODS:
- Flutter (1.0.0)
- Split (2.25.0)
- splitio_ios (0.5.0):
- Split (2.26.1)
- splitio_ios (0.6.0):
- Flutter
- Split (~> 2.25.0)
- Split (~> 2.26.1)

DEPENDENCIES:
- Flutter (from `Flutter`)
Expand All @@ -21,8 +21,8 @@ EXTERNAL SOURCES:

SPEC CHECKSUMS:
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
Split: 268875814285de6ab6cd25744e170b407651a080
splitio_ios: f6af0613ceedf0c037673afe256479bb0f6fc6ec
Split: 15cab642eb8b8bb4f289a2190f7b26e655f99756
splitio_ios: 931b5df7148d0dca9acb31a65505bd619f198fcf

PODFILE CHECKSUM: aed42fc5c94ade572556b7ed357c5c57f1bd83a2

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ class SplitClientConfigHelperTests: XCTestCase {
XCTAssertTrue(splitClientConfig.encryptionEnabled)
XCTAssertEqual(.verbose, splitClientConfig.logLevel)
XCTAssertEqual(10000, splitClientConfig.sdkReadyTimeOut)
XCTAssertNil(splitClientConfig.certificatePinningConfig)
}

func testEnableDebugLogLevelIsMappedCorrectly() {
Expand Down Expand Up @@ -114,4 +115,24 @@ class SplitClientConfigHelperTests: XCTestCase {
XCTAssertEqual(.bySet, splitClientConfig.sync.filters[0].type)
XCTAssertEqual(["set_1", "set_2"], splitClientConfig.sync.filters[0].values)
}

func testCertificatePinningConfigurationValuesAreMappedCorrectly() {
let configValues = [
"certificatePinningConfiguration": [
"pins": [
"host1": [ "sha256/pin1", "sha1/pin2" ],
"host2": [ "sha256/pin2" ]
]
]
]

let splitClientConfig: SplitClientConfig = SplitClientConfigHelper.fromMap(configurationMap: configValues, impressionListener: nil)
let actualConfig = splitClientConfig.certificatePinningConfig?.pins

let containsPins = actualConfig?.contains { pin in
(pin.host == "host1" && pin.algo == KeyHashAlgo.sha256) &&
(pin.host == "host1" && pin.algo == KeyHashAlgo.sha1) &&
(pin.host == "host2" && pin.algo == KeyHashAlgo.sha256 )
}
}
}
7 changes: 3 additions & 4 deletions splitio_ios/example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -170,10 +170,9 @@ packages:
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
Loading