@oxy.so/services 10.0.0 → 11.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +1 -1
- package/android/src/main/AndroidManifest.xml +6 -6
- package/android/src/main/java/so/oxy/devicesession/OxyDeviceSessionModule.kt +106 -41
- package/android/src/main/java/so/oxy/devicesession/OxyDeviceSessionProvider.kt +45 -32
- package/android/src/main/java/so/oxy/devicesession/OxyDeviceSessionStore.kt +22 -27
- package/android/src/main/java/so/oxy/identity/OxyIdentityModule.kt +89 -43
- package/android/src/main/java/so/oxy/security/OxyCallerPolicy.kt +97 -0
- package/android/src/main/java/so/oxy/session/OxyBackgroundSessionStore.kt +4 -10
- package/android/src/main/java/so/oxy/storage/OxyEncryptedPrefs.kt +17 -18
- package/ios/OxyIdentityModule.swift +13 -14
- package/lib/commonjs/ui/boot/runProviderColdBoot.js +16 -3
- package/lib/commonjs/ui/boot/runProviderColdBoot.js.map +1 -1
- package/lib/commonjs/ui/components/OxySignInButton.js +25 -7
- package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +198 -41
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/context/commitSessionFlow.js +5 -0
- package/lib/commonjs/ui/context/commitSessionFlow.js.map +1 -1
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js +56 -9
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/commonjs/ui/context/isolatedOAuthSession.js +52 -0
- package/lib/commonjs/ui/context/isolatedOAuthSession.js.map +1 -0
- package/lib/commonjs/ui/context/useOxyAccountGraph.js +7 -5
- package/lib/commonjs/ui/context/useOxyAccountGraph.js.map +1 -1
- package/lib/commonjs/ui/hooks/useAuth.js +7 -3
- package/lib/commonjs/ui/hooks/useAuth.js.map +1 -1
- package/lib/commonjs/ui/oauth/applicationSessionLane.js +32 -0
- package/lib/commonjs/ui/oauth/applicationSessionLane.js.map +1 -0
- package/lib/commonjs/ui/oauth/completeOAuthCode.js +4 -2
- package/lib/commonjs/ui/oauth/completeOAuthCode.js.map +1 -1
- package/lib/commonjs/ui/oauth/nativeAuthTransport.js +119 -0
- package/lib/commonjs/ui/oauth/nativeAuthTransport.js.map +1 -0
- package/lib/commonjs/ui/session/createSessionClient.js +14 -2
- package/lib/commonjs/ui/session/createSessionClient.js.map +1 -1
- package/lib/commonjs/ui/session/deviceCredentialTracker.js +8 -0
- package/lib/commonjs/ui/session/deviceCredentialTracker.js.map +1 -1
- package/lib/commonjs/ui/session/tokenLossRecovery.js +1 -1
- package/lib/module/ui/boot/runProviderColdBoot.js +16 -3
- package/lib/module/ui/boot/runProviderColdBoot.js.map +1 -1
- package/lib/module/ui/components/OxySignInButton.js +25 -7
- package/lib/module/ui/components/OxySignInButton.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +200 -43
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/context/commitSessionFlow.js +5 -0
- package/lib/module/ui/context/commitSessionFlow.js.map +1 -1
- package/lib/module/ui/context/hooks/useAuthOperations.js +56 -9
- package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/module/ui/context/isolatedOAuthSession.js +44 -0
- package/lib/module/ui/context/isolatedOAuthSession.js.map +1 -0
- package/lib/module/ui/context/useOxyAccountGraph.js +7 -5
- package/lib/module/ui/context/useOxyAccountGraph.js.map +1 -1
- package/lib/module/ui/hooks/useAuth.js +7 -3
- package/lib/module/ui/hooks/useAuth.js.map +1 -1
- package/lib/module/ui/oauth/applicationSessionLane.js +26 -0
- package/lib/module/ui/oauth/applicationSessionLane.js.map +1 -0
- package/lib/module/ui/oauth/completeOAuthCode.js +4 -2
- package/lib/module/ui/oauth/completeOAuthCode.js.map +1 -1
- package/lib/module/ui/oauth/nativeAuthTransport.js +115 -0
- package/lib/module/ui/oauth/nativeAuthTransport.js.map +1 -0
- package/lib/module/ui/session/createSessionClient.js +14 -2
- package/lib/module/ui/session/createSessionClient.js.map +1 -1
- package/lib/module/ui/session/deviceCredentialTracker.js +8 -0
- package/lib/module/ui/session/deviceCredentialTracker.js.map +1 -1
- package/lib/module/ui/session/tokenLossRecovery.js +1 -1
- package/lib/typescript/commonjs/index.d.ts +1 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts +9 -2
- package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts +2 -0
- package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +3 -1
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts +2 -0
- package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts +3 -2
- package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/isolatedOAuthSession.d.ts +19 -0
- package/lib/typescript/commonjs/ui/context/isolatedOAuthSession.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts +3 -0
- package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts +2 -1
- package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/oauth/applicationSessionLane.d.ts +6 -0
- package/lib/typescript/commonjs/ui/oauth/applicationSessionLane.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/oauth/completeOAuthCode.d.ts +2 -2
- package/lib/typescript/commonjs/ui/oauth/nativeAuthTransport.d.ts +28 -0
- package/lib/typescript/commonjs/ui/oauth/nativeAuthTransport.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/session/createSessionClient.d.ts +1 -1
- package/lib/typescript/commonjs/ui/session/createSessionClient.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/session/deviceCredentialTracker.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +1 -0
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts +9 -2
- package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/OxySignInButton.d.ts +2 -0
- package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/OxyContext.d.ts +3 -1
- package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/commitSessionFlow.d.ts +2 -0
- package/lib/typescript/module/ui/context/commitSessionFlow.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts +3 -2
- package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/isolatedOAuthSession.d.ts +19 -0
- package/lib/typescript/module/ui/context/isolatedOAuthSession.d.ts.map +1 -0
- package/lib/typescript/module/ui/context/oxyContextTypes.d.ts +3 -0
- package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts +2 -1
- package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useAuth.d.ts.map +1 -1
- package/lib/typescript/module/ui/oauth/applicationSessionLane.d.ts +6 -0
- package/lib/typescript/module/ui/oauth/applicationSessionLane.d.ts.map +1 -0
- package/lib/typescript/module/ui/oauth/completeOAuthCode.d.ts +2 -2
- package/lib/typescript/module/ui/oauth/nativeAuthTransport.d.ts +28 -0
- package/lib/typescript/module/ui/oauth/nativeAuthTransport.d.ts.map +1 -0
- package/lib/typescript/module/ui/session/createSessionClient.d.ts +1 -1
- package/lib/typescript/module/ui/session/createSessionClient.d.ts.map +1 -1
- package/lib/typescript/module/ui/session/deviceCredentialTracker.d.ts.map +1 -1
- package/package.json +30 -30
- package/plugins/withOxySharedPermissions.js +89 -0
- package/plugins/withSharedDeviceSessionProvider.js +26 -71
- package/src/index.ts +2 -0
- package/src/ui/boot/__tests__/coldBootNoIdpRedirect.test.ts +56 -2
- package/src/ui/boot/runProviderColdBoot.ts +24 -4
- package/src/ui/components/OxySignInButton.tsx +20 -4
- package/src/ui/context/OxyContext.tsx +171 -40
- package/src/ui/context/__tests__/commitSessionFlow.test.ts +13 -0
- package/src/ui/context/__tests__/isolatedOAuthSession.test.ts +35 -0
- package/src/ui/context/commitSessionFlow.ts +8 -0
- package/src/ui/context/hooks/useAuthOperations.ts +55 -9
- package/src/ui/context/isolatedOAuthSession.ts +48 -0
- package/src/ui/context/oxyContextTypes.ts +4 -0
- package/src/ui/context/useOxyAccountGraph.ts +8 -5
- package/src/ui/hooks/useAuth.ts +6 -2
- package/src/ui/oauth/__tests__/completeOAuthCode.test.ts +1 -1
- package/src/ui/oauth/__tests__/nativeAuthTransport.test.ts +57 -0
- package/src/ui/oauth/__tests__/oauthBearerCommit.http.test.ts +131 -0
- package/src/ui/oauth/applicationSessionLane.ts +26 -0
- package/src/ui/oauth/completeOAuthCode.ts +3 -3
- package/src/ui/oauth/nativeAuthTransport.ts +67 -0
- package/src/ui/session/__tests__/tokenLossRecovery.test.ts +2 -2
- package/src/ui/session/createSessionClient.ts +13 -1
- package/src/ui/session/deviceCredentialTracker.ts +7 -1
- package/src/ui/session/tokenLossRecovery.ts +1 -1
- package/android/src/main/java/so/oxy/identity/OxyIdentityProvider.kt +0 -77
- package/android/src/main/java/so/oxy/identity/OxyIdentityStore.kt +0 -66
- package/plugins/withSharedDeviceSessionReader.js +0 -57
- package/plugins/withSharedIdentityProvider.js +0 -83
- package/plugins/withSharedIdentityReader.js +0 -46
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
package so.oxy.security
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.content.pm.PackageManager
|
|
5
|
+
import android.os.Binder
|
|
6
|
+
import android.os.Build
|
|
7
|
+
import android.util.Log
|
|
8
|
+
import java.security.MessageDigest
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Which app is calling one of this package's ContentProviders, and whether it
|
|
12
|
+
* is an Oxy app.
|
|
13
|
+
*
|
|
14
|
+
* Oxy Android apps do not share a UID, so every cross-app call crosses a real
|
|
15
|
+
* process and permission boundary. The manifest already demands a
|
|
16
|
+
* `signature`-level permission (`so.oxy.permission.DEVICE_SESSION`); inside
|
|
17
|
+
* `call()` this checks again, because a permission is necessary but not
|
|
18
|
+
* sufficient:
|
|
19
|
+
*
|
|
20
|
+
* 1. **The package is an Oxy app** listed in [OXY_PACKAGES]. The caller is taken
|
|
21
|
+
* from `Binder.getCallingUid()`, never from anything the caller sends.
|
|
22
|
+
* 2. **It is signed with this app's certificate**: `hasSigningCertificate`
|
|
23
|
+
* (SHA-256, API 28+), `checkSignatures` below that.
|
|
24
|
+
*
|
|
25
|
+
* Keep [OXY_PACKAGES] identical to the identity host's list in Commons
|
|
26
|
+
* (`modules/oxy-identity-host`, `OxyCallerPolicy.kt`); a test compares them.
|
|
27
|
+
*/
|
|
28
|
+
internal object OxyCallerPolicy {
|
|
29
|
+
private const val TAG = "OxyCallerPolicy"
|
|
30
|
+
|
|
31
|
+
val OXY_PACKAGES: Set<String> = setOf(
|
|
32
|
+
"earth.mention.app",
|
|
33
|
+
"earth.mention.app.dev",
|
|
34
|
+
"onl.alia.app",
|
|
35
|
+
"onl.alia.app.dev",
|
|
36
|
+
"com.allo.app",
|
|
37
|
+
"com.allo.app.dev",
|
|
38
|
+
"com.homiio.android",
|
|
39
|
+
"com.homiio.android.dev",
|
|
40
|
+
"so.oxy.crowdsource",
|
|
41
|
+
"so.oxy.crowdsource.dev",
|
|
42
|
+
"to.peable.app",
|
|
43
|
+
"to.peable.app.dev",
|
|
44
|
+
"so.oxy.atlas",
|
|
45
|
+
"so.oxy.atlas.dev",
|
|
46
|
+
"to.goway.app",
|
|
47
|
+
"to.goway.app.dev",
|
|
48
|
+
"so.oxy.move",
|
|
49
|
+
"so.oxy.move.dev",
|
|
50
|
+
"sh.willo.app",
|
|
51
|
+
"sh.willo.app.dev",
|
|
52
|
+
"now.moovo.app",
|
|
53
|
+
"now.moovo.app.dev",
|
|
54
|
+
"now.moovo.go",
|
|
55
|
+
"now.moovo.go.dev",
|
|
56
|
+
"now.moovo.tracker",
|
|
57
|
+
"now.moovo.tracker.dev",
|
|
58
|
+
"now.moovo.hub",
|
|
59
|
+
"now.moovo.hub.dev",
|
|
60
|
+
"so.oxy.noted",
|
|
61
|
+
"so.oxy.noted.dev",
|
|
62
|
+
"so.oxy.accounts",
|
|
63
|
+
"so.oxy.accounts.dev",
|
|
64
|
+
"so.oxy.commons",
|
|
65
|
+
"so.oxy.commons.dev",
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The calling package when it is allow-listed and signed like this app, or
|
|
70
|
+
* null (logged with the package names and the method only, never a value).
|
|
71
|
+
*/
|
|
72
|
+
fun resolveCaller(context: Context, method: String): String? {
|
|
73
|
+
val pm = context.packageManager
|
|
74
|
+
val uid = Binder.getCallingUid()
|
|
75
|
+
val packages = runCatching { pm.getPackagesForUid(uid) }.getOrNull().orEmpty()
|
|
76
|
+
val caller = packages.firstOrNull { it in OXY_PACKAGES && signedLikeSelf(context, it) }
|
|
77
|
+
if (caller == null) {
|
|
78
|
+
Log.w(TAG, "refused $method for ${packages.joinToString().ifEmpty { "uid $uid" }}")
|
|
79
|
+
}
|
|
80
|
+
return caller
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
private fun signedLikeSelf(context: Context, pkg: String): Boolean = runCatching {
|
|
84
|
+
val pm = context.packageManager
|
|
85
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
|
86
|
+
val info = pm.getPackageInfo(context.packageName, PackageManager.GET_SIGNING_CERTIFICATES)
|
|
87
|
+
val signers = info.signingInfo?.apkContentsSigners.orEmpty()
|
|
88
|
+
signers.isNotEmpty() && signers.any { signer ->
|
|
89
|
+
val digest = MessageDigest.getInstance("SHA-256").digest(signer.toByteArray())
|
|
90
|
+
pm.hasSigningCertificate(pkg, digest, PackageManager.CERT_INPUT_SHA256)
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
@Suppress("DEPRECATION")
|
|
94
|
+
pm.checkSignatures(pkg, context.packageName) == PackageManager.SIGNATURE_MATCH
|
|
95
|
+
}
|
|
96
|
+
}.getOrDefault(false)
|
|
97
|
+
}
|
|
@@ -22,13 +22,7 @@ import so.oxy.storage.RecoveryPolicy
|
|
|
22
22
|
* Neither ever rotates the credential — the server does not rotate it either.
|
|
23
23
|
*/
|
|
24
24
|
internal object OxyBackgroundSessionStore {
|
|
25
|
-
/**
|
|
26
|
-
* Suffix is the hosting app's package name. Oxy apps share the `so.oxy.shared`
|
|
27
|
-
* Android UID (and therefore one data directory), so a single global prefs name
|
|
28
|
-
* would let one app that leaves `backgroundSession` off wipe another app's
|
|
29
|
-
* live credential on launch. Scoping by package keeps each app's widget/sync
|
|
30
|
-
* store independent.
|
|
31
|
-
*/
|
|
25
|
+
/** Suffix is the hosting app's package name, so the file says whose credential it holds. */
|
|
32
26
|
private const val PREFS_NAME_PREFIX = "oxy_background_session_"
|
|
33
27
|
|
|
34
28
|
private fun prefsName(context: Context): String = PREFS_NAME_PREFIX + context.packageName
|
|
@@ -61,13 +55,13 @@ internal object OxyBackgroundSessionStore {
|
|
|
61
55
|
|
|
62
56
|
/**
|
|
63
57
|
* [RecoveryPolicy.RebuildFileOnly] — this store must NEVER escalate to a
|
|
64
|
-
*
|
|
58
|
+
* master-key reset.
|
|
65
59
|
*
|
|
66
60
|
* What it holds is disposable: the app re-provisions the credential on its next
|
|
67
61
|
* foreground, so "no credential" is a complete recovery that costs the user
|
|
68
62
|
* nothing (background refreshes render signed out until then). A master-key reset
|
|
69
|
-
* would wipe every other
|
|
70
|
-
*
|
|
63
|
+
* would wipe every other encrypted store of this app sharing the alias — in
|
|
64
|
+
* Commons, including the identity signer store. Trading someone else's unrecoverable
|
|
71
65
|
* data to save data we can simply ask for again is never the right trade, so the
|
|
72
66
|
* escalation is not merely discouraged here, it is unreachable.
|
|
73
67
|
*/
|
|
@@ -18,11 +18,11 @@ import java.security.GeneralSecurityException
|
|
|
18
18
|
*
|
|
19
19
|
* It used to have a second value, `RegenerateSharedMasterKey`, which deleted the
|
|
20
20
|
* androidx master key (`_androidx_security_master_key_`) when a rebuild failed.
|
|
21
|
-
* That key is ONE Keystore entry for the whole
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* OxyHQ/oxy#1388 and must not come back: no store
|
|
25
|
-
*
|
|
21
|
+
* That key is ONE Keystore entry for the whole app and wraps the keyset of every
|
|
22
|
+
* encrypted prefs file in it, so deleting it to heal one file made every other
|
|
23
|
+
* file unreadable (when Oxy apps still shared a UID, every OTHER app's files
|
|
24
|
+
* too). It was removed for OxyHQ/oxy#1388 and must not come back: no store
|
|
25
|
+
* deletes a Keystore entry.
|
|
26
26
|
*/
|
|
27
27
|
internal enum class RecoveryPolicy {
|
|
28
28
|
/**
|
|
@@ -37,9 +37,9 @@ internal enum class RecoveryPolicy {
|
|
|
37
37
|
* The ONE way this package opens a hardware-backed [EncryptedSharedPreferences]
|
|
38
38
|
* file.
|
|
39
39
|
*
|
|
40
|
-
*
|
|
41
|
-
* (`so.oxy.
|
|
42
|
-
* (`so.oxy.session.OxyBackgroundSessionStore`) —
|
|
40
|
+
* The stores built on it — the device session credential
|
|
41
|
+
* (`so.oxy.devicesession.OxyDeviceSessionStore`) and the background session
|
|
42
|
+
* credential (`so.oxy.session.OxyBackgroundSessionStore`) — all need the same two
|
|
43
43
|
* non-obvious properties below. They are implemented once here rather than per
|
|
44
44
|
* store: a second copy would be a copy of exactly the reasoning that is easiest
|
|
45
45
|
* to get wrong, and the failure mode of getting it wrong is silent (every read
|
|
@@ -67,9 +67,9 @@ internal enum class RecoveryPolicy {
|
|
|
67
67
|
* ## Keyset self-heal (CRITICAL)
|
|
68
68
|
*
|
|
69
69
|
* The androidx master key that wraps each file's Tink keyset lives under the
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
70
|
+
* default alias [MasterKey.DEFAULT_MASTER_KEY_ALIAS] — ONE entry for the whole
|
|
71
|
+
* app. When that master key is regenerated (a Keystore invalidation, a restore
|
|
72
|
+
* from a device-to-device transfer), keysets already written on disk stay
|
|
73
73
|
* wrapped under the OLD key. `create()` then fails GCM verification
|
|
74
74
|
* (`AEADBadTag` -> `GeneralSecurityException`, or an unreadable keyset ->
|
|
75
75
|
* `IOException`) on EVERY read/write, and `EncryptedSharedPreferences` never
|
|
@@ -81,14 +81,13 @@ internal enum class RecoveryPolicy {
|
|
|
81
81
|
* keysets. If a fresh keyset still cannot be built, the failure propagates and
|
|
82
82
|
* the `runCatching {}` at every call site degrades to "absent".
|
|
83
83
|
*
|
|
84
|
-
* The master key itself is NEVER deleted here. It is shared by
|
|
85
|
-
* deleting it would make every other
|
|
86
|
-
*
|
|
87
|
-
* Keystore
|
|
88
|
-
* androidx creates a new one on the next `MasterKey.Builder.build()` and each
|
|
84
|
+
* The master key itself is NEVER deleted here. It is shared by every file of the
|
|
85
|
+
* app, so deleting it would make every other one unreadable (and each would then
|
|
86
|
+
* wipe itself on its next open). When the master key is gone — the app's
|
|
87
|
+
* Keystore was wiped with its storage — androidx creates a new one on the next `MasterKey.Builder.build()` and each
|
|
89
88
|
* file heals itself through the file-only rebuild above. What was IN those
|
|
90
89
|
* files is lost with the Keystore either way; for the self-custody identity,
|
|
91
|
-
*
|
|
90
|
+
* Commons' keystore-independent device backup brings it back (docs/identity/device-backup.md).
|
|
92
91
|
*
|
|
93
92
|
* None of this touches the app's device session, which lives in expo-secure-store
|
|
94
93
|
* under a DISTINCT prefs file ("SecureStore") and DISTINCT keystore aliases
|
|
@@ -164,7 +163,7 @@ internal object OxyEncryptedPrefs {
|
|
|
164
163
|
Log.w(
|
|
165
164
|
TAG,
|
|
166
165
|
"'$prefsName' is still unreadable after a file reset ($recovery). Giving up " +
|
|
167
|
-
"without touching the
|
|
166
|
+
"without touching the app-wide master key; its owner re-creates it.",
|
|
168
167
|
cause
|
|
169
168
|
)
|
|
170
169
|
throw cause
|
|
@@ -1,33 +1,32 @@
|
|
|
1
1
|
import ExpoModulesCore
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* iOS
|
|
4
|
+
* iOS stub of the Commons identity bridge.
|
|
5
5
|
*
|
|
6
|
-
* On Apple platforms the
|
|
7
|
-
* `@oxy.so/core`'s `KeyManager`
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* `
|
|
11
|
-
* branches keep using `expo-secure-store` with the keychain group untouched.
|
|
6
|
+
* On Apple platforms the Oxy identity is shared through the Keychain Access
|
|
7
|
+
* Group `group.so.oxy.shared`, which `@oxy.so/core`'s `KeyManager` reads
|
|
8
|
+
* directly; there is no Commons provider to call. Every function resolves `nil`,
|
|
9
|
+
* so `loadCommonsIdentityBridge()` answers "Commons could not help" and
|
|
10
|
+
* `KeyManager`'s iOS branches keep using the keychain group.
|
|
12
11
|
*/
|
|
13
12
|
public class OxyIdentityModule: Module {
|
|
14
13
|
public func definition() -> ModuleDefinition {
|
|
15
14
|
Name("OxyIdentity")
|
|
16
15
|
|
|
17
|
-
AsyncFunction("
|
|
16
|
+
AsyncFunction("describe") { () -> [String: String]? in
|
|
18
17
|
return nil
|
|
19
18
|
}
|
|
20
19
|
|
|
21
|
-
AsyncFunction("
|
|
22
|
-
|
|
20
|
+
AsyncFunction("proveIdentity") { (_ challenge: String) -> [String: String]? in
|
|
21
|
+
return nil
|
|
23
22
|
}
|
|
24
23
|
|
|
25
|
-
AsyncFunction("
|
|
26
|
-
return
|
|
24
|
+
AsyncFunction("deriveScopedSeed") { (_ info: String) -> String? in
|
|
25
|
+
return nil
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
AsyncFunction("
|
|
30
|
-
|
|
28
|
+
AsyncFunction("signSocialReceive") { (_ index: Int, _ digest: String) -> [String: String]? in
|
|
29
|
+
return nil
|
|
31
30
|
}
|
|
32
31
|
}
|
|
33
32
|
}
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.SESSION_HANDOFF_DEADLINE_MS = exports.COLD_BOOT_OVERALL_DEADLINE_MS = void 0;
|
|
7
7
|
exports.runProviderColdBoot = runProviderColdBoot;
|
|
8
|
+
var _applicationSessionLane = require("../oauth/applicationSessionLane.js");
|
|
8
9
|
var _core = require("@oxy.so/core");
|
|
9
10
|
var _session = require("@oxy.so/core/session");
|
|
10
11
|
var _deviceCredential = require("../utils/deviceCredential.js");
|
|
@@ -70,8 +71,8 @@ async function detectOfflineHint() {
|
|
|
70
71
|
*
|
|
71
72
|
* Ordered pipeline:
|
|
72
73
|
* 1. Complete an OAuth authorization-code return already on the URL (web)
|
|
73
|
-
* 2. `runSessionColdBoot` — device-secret mint (+ native
|
|
74
|
-
* primary-identity-key lane in `sessionMode: 'identity'`)
|
|
74
|
+
* 2. `runSessionColdBoot` — device-secret mint (+ the native Commons-proof lane,
|
|
75
|
+
* or the primary-identity-key lane in `sessionMode: 'identity'`)
|
|
75
76
|
*
|
|
76
77
|
* Step 1 is ACCOUNT-MODE ONLY: it commits whichever account the IdP resolves,
|
|
77
78
|
* which for an identity-bound client is somebody else's account by construction.
|
|
@@ -100,6 +101,11 @@ async function runProviderColdBoot(opts) {
|
|
|
100
101
|
const identityBound = sessionMode === 'identity';
|
|
101
102
|
setTokenReady(false);
|
|
102
103
|
try {
|
|
104
|
+
// Classification precedes every local-secret, shared-credential and identity
|
|
105
|
+
// probe. Unavailable registry metadata fails closed, including offline boot.
|
|
106
|
+
const lane = await (opts.resolveSessionLane?.() ?? (0, _applicationSessionLane.resolveApplicationSessionLane)(oxyServices, clientId));
|
|
107
|
+
await opts.onClassified?.(lane);
|
|
108
|
+
if (identityBound && lane !== 'device') return;
|
|
103
109
|
// The redirect transport's RETURN leg. An app reaches it whenever the browser
|
|
104
110
|
// BLOCKED the sign-in popup and `startWebOAuthSignIn` fell back to a
|
|
105
111
|
// full-page redirect (`popup-blocked` / `popup-navigation-failed`), so it is
|
|
@@ -111,7 +117,8 @@ async function runProviderColdBoot(opts) {
|
|
|
111
117
|
clientId,
|
|
112
118
|
authRedirectUri,
|
|
113
119
|
commitSession: input => commitSession(input, {
|
|
114
|
-
activate: true
|
|
120
|
+
activate: true,
|
|
121
|
+
oauth: true
|
|
115
122
|
})
|
|
116
123
|
});
|
|
117
124
|
if (oauthCompleted) {
|
|
@@ -119,6 +126,11 @@ async function runProviderColdBoot(opts) {
|
|
|
119
126
|
markAuthResolved();
|
|
120
127
|
return;
|
|
121
128
|
}
|
|
129
|
+
if (lane === 'oauth') {
|
|
130
|
+
setTokenReady(true);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
await opts.beforeDeviceBoot?.();
|
|
122
134
|
|
|
123
135
|
// Best-effort connectivity probe up front: an EXPLICIT offline verdict skips
|
|
124
136
|
// the two doomed network steps so routing settles immediately instead of
|
|
@@ -194,6 +206,7 @@ async function runProviderColdBoot(opts) {
|
|
|
194
206
|
}
|
|
195
207
|
}
|
|
196
208
|
});
|
|
209
|
+
await opts.afterDeviceBoot?.();
|
|
197
210
|
} catch (error) {
|
|
198
211
|
if (__DEV__) {
|
|
199
212
|
_core.logger.error('Cold boot error', error instanceof Error ? error : new Error(String(error)), {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["_applicationSessionLane","require","_core","_session","_deviceCredential","_sharedDeviceCredentialStore","_oauthReturn","_isWebBrowser","_netConnectivity","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","SESSION_HANDOFF_DEADLINE_MS","exports","COLD_BOOT_OVERALL_DEADLINE_MS","OFFLINE_PROBE_TIMEOUT_MS","detectOfflineHint","isWebBrowser","online","globalThis","navigator","onLine","NetInfo","Promise","resolve","then","state","race","fetch","setTimeout","isNetConnectivityExplicitlyOffline","runProviderColdBoot","opts","oxyServices","authStore","clientId","authRedirectUri","sessionMode","identity","sessionClient","syncDeviceCredentialToHost","commitSession","markAuthResolved","setTokenReady","identityBound","lane","resolveSessionLane","resolveApplicationSessionLane","onClassified","oauthCompleted","tryCompleteOAuthReturn","input","activate","oauth","beforeDeviceBoot","offline","runSessionColdBoot","oxy","store","platform","isWeb","isNative","sharedDeviceCredential","createPlatformSharedDeviceCredentialStore","undefined","overallDeadlineMs","isOffline","onStepDeadline","stepId","loggerUtil","warn","component","method","onSession","session","handoff","sessionId","accessToken","userId","deviceState","handoffDeadlineId","finally","clearTimeout","onSignedOut","cred","loadPersistedDeviceCredential","start","socketError","__DEV__","debug","onStepError","id","error","afterDeviceBoot","Error","String"],"sourceRoot":"../../../../src","sources":["ui/boot/runProviderColdBoot.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.OxySignInButton = void 0;
|
|
7
|
+
var _applicationSessionLane = require("../oauth/applicationSessionLane.js");
|
|
7
8
|
var _react = require("react");
|
|
8
9
|
var _reactNative = require("react-native");
|
|
9
10
|
var _core = require("@oxy.so/core");
|
|
@@ -69,7 +70,8 @@ const OxySignInButton = ({
|
|
|
69
70
|
disabled = false,
|
|
70
71
|
showWhenAuthenticated = false,
|
|
71
72
|
oauthRedirectUri,
|
|
72
|
-
onOAuthResult
|
|
73
|
+
onOAuthResult,
|
|
74
|
+
nativeOAuthCompletion
|
|
73
75
|
}) => {
|
|
74
76
|
const {
|
|
75
77
|
t
|
|
@@ -79,7 +81,8 @@ const OxySignInButton = ({
|
|
|
79
81
|
oxyServices,
|
|
80
82
|
clientId,
|
|
81
83
|
webAuthMode,
|
|
82
|
-
startWebOAuthSignIn
|
|
84
|
+
startWebOAuthSignIn,
|
|
85
|
+
startNativeOAuthSignIn
|
|
83
86
|
} = (0, _OxyContext.useOxy)();
|
|
84
87
|
const {
|
|
85
88
|
isAuthenticated,
|
|
@@ -115,7 +118,9 @@ const OxySignInButton = ({
|
|
|
115
118
|
if (cached && cached.clientId === clientId && cached.oxyServices === oxyServices) {
|
|
116
119
|
return cached.promise;
|
|
117
120
|
}
|
|
118
|
-
const promise = oxyServices.apps.getPublic(clientId
|
|
121
|
+
const promise = oxyServices.apps.getPublic(clientId, {
|
|
122
|
+
cache: false
|
|
123
|
+
}).catch(error => {
|
|
119
124
|
// Only clear if this is still the live entry (a later resolve may have
|
|
120
125
|
// replaced it after a clientId/oxyServices change).
|
|
121
126
|
if (appResolutionRef.current?.promise === promise) {
|
|
@@ -196,6 +201,18 @@ const OxySignInButton = ({
|
|
|
196
201
|
}
|
|
197
202
|
return;
|
|
198
203
|
}
|
|
204
|
+
if (nativeOAuthCompletion === 'sdk') {
|
|
205
|
+
if (onOAuthResult) {
|
|
206
|
+
notifyNotConfigured(app.name);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const result = await startNativeOAuthSignIn({
|
|
210
|
+
redirectUri: oauthRedirectUri
|
|
211
|
+
});
|
|
212
|
+
if (result.status === 'failed') notifyFailed();
|
|
213
|
+
if (result.status === 'unsupported') notifyNotConfigured(app.name);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
199
216
|
|
|
200
217
|
// Native: open the in-app auth session, then hand the handshake to the
|
|
201
218
|
// RP so it can complete the token exchange from its deep-link callback.
|
|
@@ -222,7 +239,7 @@ const OxySignInButton = ({
|
|
|
222
239
|
application: app.name
|
|
223
240
|
});
|
|
224
241
|
notifyNotConfigured(app.name);
|
|
225
|
-
}, [clientId, oauthRedirectUri, onOAuthResult, startOfficialSignIn, startWebOAuthSignIn, shouldPreOpenPopup, notifyNotConfigured, notifyFailed]);
|
|
242
|
+
}, [clientId, oauthRedirectUri, onOAuthResult, nativeOAuthCompletion, startNativeOAuthSignIn, startOfficialSignIn, startWebOAuthSignIn, shouldPreOpenPopup, notifyNotConfigured, notifyFailed]);
|
|
226
243
|
|
|
227
244
|
// Resolve the Application once, then route: third-party → OAuth; first-party
|
|
228
245
|
// / official → the in-app dialog. An unresolved client must fail closed:
|
|
@@ -240,7 +257,7 @@ const OxySignInButton = ({
|
|
|
240
257
|
const resolving = resolvePublicApplication();
|
|
241
258
|
if (!resolving) {
|
|
242
259
|
(0, _oauthPopup.closeOAuthPopup)(popup);
|
|
243
|
-
|
|
260
|
+
notifyNotConfigured('this app');
|
|
244
261
|
return;
|
|
245
262
|
}
|
|
246
263
|
let app;
|
|
@@ -255,7 +272,7 @@ const OxySignInButton = ({
|
|
|
255
272
|
notifyFailed();
|
|
256
273
|
return;
|
|
257
274
|
}
|
|
258
|
-
if (app
|
|
275
|
+
if ((0, _applicationSessionLane.classifyApplicationSessionLane)(app) === 'oauth') {
|
|
259
276
|
await startThirdPartyOAuth(app, popup);
|
|
260
277
|
return;
|
|
261
278
|
}
|
|
@@ -273,9 +290,10 @@ const OxySignInButton = ({
|
|
|
273
290
|
});
|
|
274
291
|
notifyFailed();
|
|
275
292
|
} finally {
|
|
293
|
+
appResolutionRef.current = null;
|
|
276
294
|
routingRef.current = false;
|
|
277
295
|
}
|
|
278
|
-
}, [resolvePublicApplication, startOfficialSignIn, startThirdPartyOAuth, clientId, notifyFailed]);
|
|
296
|
+
}, [resolvePublicApplication, startOfficialSignIn, startThirdPartyOAuth, clientId, notifyNotConfigured, notifyFailed]);
|
|
279
297
|
|
|
280
298
|
// Defer to a caller-supplied handler, otherwise route by application type.
|
|
281
299
|
//
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["_applicationSessionLane","require","_react","_reactNative","_core","_authStore","_shallow","_socialButton","_toast","_OxyContext","_useI18n","_accountDialogManager","_oauthNavigation","_oauthPopup","_jsxRuntime","ACTION_KEYS","signIn","continue","signUp","OxySignInButton","variant","appearance","action","size","fullWidth","iconOnly","onPress","style","textStyle","text","disabled","showWhenAuthenticated","oauthRedirectUri","onOAuthResult","nativeOAuthCompletion","t","useI18n","openAccountDialog","oxyServices","clientId","webAuthMode","startWebOAuthSignIn","startNativeOAuthSignIn","useOxy","isAuthenticated","isLoading","useAuthStore","useShallow","state","isModalOpen","setIsModalOpen","useState","useEffect","subscribeToAccountDialog","appResolutionRef","useRef","routingRef","shouldPreOpenPopup","Platform","OS","Boolean","resolvePublicApplication","useCallback","cached","current","promise","apps","getPublic","cache","catch","error","notifyNotConfigured","appName","toast","description","app","notifyFailed","startOfficialSignIn","startThirdPartyOAuth","popup","closeOAuthPopup","logger","undefined","component","application","name","result","redirectUri","status","warn","reason","pkce","Promise","all","generatePkcePair","generateOAuthState","authorizeUrl","buildOAuthAuthorizeUrl","codeChallenge","redirectUrl","openAuthorizeUrlNative","codeVerifier","routeSignIn","resolving","classifyApplicationSessionLane","Error","String","handlePress","openOAuthPopup","isButtonDisabled","resolvedAppearance","actionKey","translated","label","socialButtonLabel","jsx","SocialButton","brand","accessibilityLabel","children","exports","_default","default"],"sourceRoot":"../../../../src","sources":["ui/components/OxySignInButton.tsx"],"mappings":"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","ignoreList":[]}
|