Skip to content
Open
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
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ This project adheres to [Semantic Versioning](http://semver.org/).
### Deprecated
- `IterableConfig.Builder.setExpiringAuthTokenRefreshPeriod(Long)` β€” use the `double` overload instead, which accepts fractional seconds. The `Long` overload delegates to it and remains fully supported.

### Removed
- Removed the `encryptionEnforced` field from `IterableConfig`. **No action required.** 3.5.5 announced this option as removed and deleted its public setter, but a merge reinstated the field β€” without the setter β€” in 3.6.0, where it has sat unsettable and unread ever since. There has been no way to set it and no effect on SDK behaviour since 3.5.5, so no app can be affected. Storage behaviour is unchanged: use `setKeychainEncryption(boolean)` to control whether stored user data is encrypted, and `setDecryptionFailureHandler(...)` to be notified when the SDK cannot decrypt it.

## [3.10.1]
### Fixed
- Fixed a race in JWT auth refresh scheduling that could leave overlapping timers active and repeatedly call `IterableAuthHandler.onAuthTokenRequested()`. Refresh scheduling now has a single task owner, rejects stale or duplicate tasks, and logs each schedule, skip, fire, cancellation, and error with its refresh reason.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,6 @@ public class IterableConfig {
*/
final boolean useInMemoryStorageForInApps;

final boolean encryptionEnforced;

/**
* Enables unknown user activation
*/
Expand Down Expand Up @@ -199,7 +197,6 @@ private IterableConfig(Builder builder) {
allowedProtocols = builder.allowedProtocols;
dataRegion = builder.dataRegion;
useInMemoryStorageForInApps = builder.useInMemoryStorageForInApps;
encryptionEnforced = builder.encryptionEnforced;
enableUnknownUserActivation = builder.enableUnknownUserActivation;
enableForegroundCriteriaFetch = builder.enableForegroundCriteriaFetch;
enableEmbeddedMessaging = builder.enableEmbeddedMessaging;
Expand Down Expand Up @@ -233,7 +230,6 @@ public static class Builder {
private boolean keychainEncryption = true;
private IterableAPIMobileFrameworkInfo mobileFrameworkInfo;
private IterableDecryptionFailureHandler decryptionFailureHandler;
private boolean encryptionEnforced = false;
private boolean enableUnknownUserActivation = false;
private boolean enableForegroundCriteriaFetch = true;
private boolean enableEmbeddedMessaging = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,4 +174,20 @@ class IterableConfigTest {
setter.invoke(builder, null)
assertEquals(60_000L, builder.build().expiringAuthTokenRefreshPeriodMillis)
}

/**
* `encryptionEnforced` was removed in 3.5.5 and then silently reinstated by a merge in 3.6.0,
* where it sat unread for four minor versions. Nothing in the build detects a re-added member,
* so this asserts its absence directly.
*/
@Test
fun encryptionEnforcedIsNotPartOfTheConfiguration() {
val members = listOf(IterableConfig::class.java, IterableConfig.Builder::class.java)
.flatMap { type ->
type.declaredFields.map { it.name } + type.declaredMethods.map { it.name }
}
.filter { it.contains("encryptionEnforced", ignoreCase = true) }

assertTrue("encryptionEnforced was reintroduced: $members", members.isEmpty())
}
}
Loading