You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Port forcedotcom#4092: iOS Refresh-Token-Rotation (RTR) feature flag (upstream ab84f31, unit 37/49)
Add the 'RT' app-feature marker. During a successful session refresh,
SFOAuthSessionRefresher now compares the server-returned refresh token
against the pre-refresh token; if it rotated, the RT flag is registered
per-user for the owning account so the User-Agent advertises RTR.
New global constant kSFAppFeatureRTR = "RT" in SFSDKAppFeatureMarkers.
Ported into the compiled Swift twins (SFSDKAppFeatureMarkers.swift +
SFOAuthSessionRefresher.swift, using UserAccountManager.userAccount(for:));
de-ref .h/.m ref-synced to the upstream post-image.
Tests: both .m twins ref-synced; the new tests also ported into the
compiled .swift twins. SFOAuthSessionRefresherTests gains an in-test
SFSDKOAuthProtocol stub swapped in via the authClient factory var and
2 RTR tests (rotated vs unchanged token); SFSDKAppFeatureMarkersTests
gains 1 per-user RTR test. Sample BaseAuthFlowTester (UITest) ref-synced.
SDKCore builds green (0 new warnings); 22 tests pass.
Escalation: feature-flag + OAuth token-refresh path -> PR-flag.
Advances upstream-sync marker 9de77c7 -> ab84f31.
| 34 |#4090 fix iOS18/macOS15 runner | 6a8a47717 | F | ⚠ build-system/CI | ✅ done (commit 6ed7ed5f24e1722316111a0a035942d68e9838d4) | CI-only, no compile gate. Pins the iOS18/Xcode16 matrix leg to the `macos-15` runner (iOS18 sim unavailable on macos-latest/26). 3 files byte-match upstream post-image: `nightly.yaml`, `pr.yaml`, `ui-test-nightly.yaml` — each adds `macos: macos-15` to the `ios:^18/xcode:^16` matrix include + threads `macos: ${{ matrix.macos }}` into the reusable-workflow `with:` calls (test/build/ui-test jobs). The 3 reusable workflows already declared the `macos` input (verified) → no change needed there. Escalation pre-approved in Phase-0 batch; digest entry added. |
68
68
| 35 | #4086 feature flags per user | 99a173b58 | B | ⚠⚠ feature-flags + login/OAuth + multi-lib | ✅ done (commit 85e7a1c5a6161fa85ad9479fcc331a7afa4113ca) | Per-user feature flags across Core/MobileSync/SmartStore. Ported into compiled Swift twins: **SFSDKAppFeatureMarkers.swift** (+`registerAppFeature(_:forUser:)`/`unregisterAppFeature(_:forUser:)`/`appFeatures(forUser:)`/`loadPersistedFeatures(_:forUser:)` + per-user `[String:Set<String>]` map keyed by `SFKeyForUserAndScope(user,.user)`; persist via `UserAccountManager.shared.upsert(_:)` — migration's manager-level save, NOT the persister-only `saveAccount(forUser:)`); **SalesforceSDKManager.swift** (new public `userAgent(qualifier:for:)` =`@objc(userAgentString:forUser:)`; `defaultUserAgentString` delegates to it; new `hydratePerUserFeatureFlags()` called in `sharedInstance` lazy init); **SFUserAccount.swift** (`persistedFeatureFlags: Set<String>?` + NSCoding encode/decode w/ `kUser_FEATURE_FLAGS`); **SFUserAccountManager.swift** (bio-auth/screen-lock register `forUser:` + `finalizeAuthCompletion` BW/WD/QR per-user promotion block); **SFSmartStore.swift** + **SFMobileSyncSyncManager.swift** (per-user register one-liners). De-ref .m ref-synced: SFUserAccount.m + SFMobileSyncSyncManager.m (matched pre-image→post-image verbatim); SFSmartStore.m (1-line hunk); SFSDKAppFeatureMarkers.h/.m + SalesforceSDKManager.h/+Internal.h + SFUserAccountManager.m = migration stubs, NO matching region (upstream changes live in Swift twins). **`SalesforceSDKCore.podspec` NOT modified** — upstream's change was pure auto-gen `public_header_files` REORDERING (header set byte-identical pre/post; file is generated by update_podspec_headers.sh) → no material change to port, podspec left untouched (CLAUDE.md podspec rule respected). Tests: NEW SFSDKAppFeatureMarkersTests.m ref-synced (216 lines) + 13 new tests ADDED to compiled .swift twin (per-user + auth-promotion); +1 roundtrip test each to SFUserAccountManagerTests + 3 per-user-UA tests to SalesforceSDKManagerTests (.m ref-synced + .swift twin extended, adapted `upsert`/`delete` for save/delete). Sample AuthFlowTester: 9 files ref-synced to post-image (UserCredentialsView.swift kept migration's `idData?.username` optional-chaining). **3 schemes TEST BUILD SUCCEEDED (SDKCore+SmartStore+MobileSync, 0 err, 0 new warnings); 17 AppFeatureMarkers + 4 manager/UA tests PASS (fixture-based, not live-gated).** ⚠⚠ escalation: feature-flags + login/OAuth (finalizeAuthCompletion) + new public API `userAgent(qualifier:for:)` → digest + PR-flag. |
69
69
| 36 | #4091 notification-types thread safety | 9de77c7e2 | B | ⚠ thread-safety | ✅ done (commit 0faf8dfb9c54a0cbd4445cedaca8045ed40fbf70) | Thread-safety fix for `SFUserAccount.notificationTypes` (the last unguarded accessor). Ported into the compiled twin **SFUserAccount.swift**: `notificationTypes` getter now reads `_notificationTypes` under `syncQueue.sync`, setter writes under `syncQueue.async(flags: .barrier)` with `newValue?.map { $0 }` snapshot copy — matches the existing `accessScopes`/`credentials` idiom in the same file (upstream used `dispatch_sync`/`dispatch_barrier_async` on `_syncQueue`). De-ref **SFUserAccount.m** ref-synced: matched pre-image → overwrote with post-image verbatim (`dispatch_sync`/`dispatch_barrier_async` guards). NEW test **SFUserAccountThreadSafetyTests.swift** (upstream is already `.swift`; class `UserAccountThreadSafetyTests`, 4 tests) added byte-faithful, wired additively into pbxproj (build-file `42996EA8…`, file-ref `0DB02650…`, group + Sources phase; plutil OK). **1 test-only migration adaptation:** setUp line 36 `OAuthCredentials(identifier:clientId:encrypted:true)!` → `OAuthCredentials.credentials(identifier:…)!` — the migrated base `OAuthCredentials` convenience init returns nil for `.keychain` (class-cluster replaced by the factory method that builds `OAuthKeychainCredentials`); same class-cluster→factory adaptation used in unit 35's test twin. SDKCore TEST BUILD SUCCEEDED (0 err, 0 new warnings; the `oldKey` warning at SFUserAccount.swift:482 is pre-existing, outside my diff). All 4 UserAccountThreadSafetyTests PASS (fixture-based, not live-gated). ⚠ thread-safety → digest + PR-flag. |
0 commit comments