@burnt-labs/expo-satya-attest 1.3.0 → 1.4.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/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.4.0 - 2026-07-10
4
+
5
+ - Added per-provider WebView geolocation. A provider config can set `requiresLocation: true`
6
+ to grant its managed WebView location access (e.g. jurisdiction / eligibility checks). It
7
+ defaults to `false`, so providers that don't declare it never enable geolocation or trigger
8
+ a location prompt.
9
+ - Added the config plugin option `enableWebViewGeolocation` (with an optional
10
+ `locationUsageDescription`) to declare the platform location permission the feature needs:
11
+ iOS `NSLocationWhenInUseUsageDescription` and Android `ACCESS_FINE_LOCATION` /
12
+ `ACCESS_COARSE_LOCATION`. Off by default.
13
+ - Fixed the managed WebView's chrome clients (`SatyaPopupChromeClient` /
14
+ `SatyaNestedPopupChromeClient`) silently denying geolocation. They previously replaced
15
+ react-native-webview's chrome client for popup handling and let geolocation fall through to
16
+ the base client, which denied it; they now grant it (persistently, so pages that gate on
17
+ `navigator.permissions` detect it) when the provider opts in. Request capture, native
18
+ replay, and OAuth popup handling are unchanged.
19
+
3
20
  ## 1.3.0 - 2026-07-07
4
21
 
5
22
  - The provider WebView now opens as an in-app sheet (`presentation="sheet"`, the new
@@ -99,6 +99,7 @@ field table (`Req?` = required `yes` / optional `no`).
99
99
  | `iconUrl` | `string` | HTTPS image for provider selectors. |
100
100
  | `description` | `string` | Selector/help text. |
101
101
  | `version` | `string` | Version string. If omitted, inferred from the trailing `.vN` of `providerId`. |
102
+ | `requiresLocation` | `boolean` | When `true`, the managed WebView is granted geolocation (e.g. jurisdiction / eligibility checks). Defaults to `false`. The host app must also declare the OS location permission via the config plugin's `enableWebViewGeolocation` option. |
102
103
  | `userAgent` | `{ ios, android }` | Per-platform UA (each `string` or `null`) for the WebView when no `webViewUserAgent` prop is set. Use when the provider serves different pages to mobile vs desktop and replay must match. |
103
104
  | `injection` | `string` / `string[]` / `null` | Trusted WebView JavaScript run on every page. See §9. |
104
105
  | `auth` | `object` | Provider-auth metadata. Preserved but not interpreted by the managed flow. |
@@ -4,13 +4,13 @@ plugins {
4
4
  }
5
5
 
6
6
  group = 'expo.modules.satyaattest'
7
- version = '1.3.0'
7
+ version = '1.4.0'
8
8
 
9
9
  android {
10
10
  namespace "expo.modules.satyaattest"
11
11
  defaultConfig {
12
12
  versionCode 1
13
- versionName "1.3.0"
13
+ versionName "1.4.0"
14
14
  // StrongBox key attestation needs API 28+; basic Keystore attestation API 24+.
15
15
  minSdkVersion 24
16
16
  }
@@ -10,6 +10,7 @@ import android.os.Message
10
10
  import android.view.Gravity
11
11
  import android.view.View
12
12
  import android.view.ViewGroup
13
+ import android.webkit.GeolocationPermissions
13
14
  import android.webkit.WebChromeClient
14
15
  import android.webkit.WebSettings
15
16
  import android.webkit.WebView
@@ -232,6 +233,15 @@ class SatyaAttestModule : Module() {
232
233
  override fun onCloseWindow(window: WebView) {
233
234
  closePopupOverlayFor(window)
234
235
  }
236
+
237
+ override fun onGeolocationPermissionsShowPrompt(
238
+ origin: String?,
239
+ callback: GeolocationPermissions.Callback?,
240
+ ) {
241
+ // Our chrome client replaces RN-WebView's, so re-grant geolocation; retain=true persists it
242
+ // so navigator.permissions reports "granted" (providers gate on that, not a per-call grant).
243
+ callback?.invoke(origin, true, true)
244
+ }
235
245
  }
236
246
 
237
247
  private inner class SatyaNestedPopupChromeClient : WebChromeClient() {
@@ -265,6 +275,13 @@ class SatyaAttestModule : Module() {
265
275
  override fun onCloseWindow(window: WebView) {
266
276
  closePopupOverlayFor(window)
267
277
  }
278
+
279
+ override fun onGeolocationPermissionsShowPrompt(
280
+ origin: String?,
281
+ callback: GeolocationPermissions.Callback?,
282
+ ) {
283
+ callback?.invoke(origin, true, true)
284
+ }
268
285
  }
269
286
 
270
287
  private fun createPopupWebView(opener: WebView): WebView {
package/app.plugin.js CHANGED
@@ -10,7 +10,12 @@ const {
10
10
  } = require('@expo/config-plugins');
11
11
 
12
12
  /** @typedef {{ host: string, spkiSha256B64Pins: string[], includeSubdomains?: boolean, expiration?: string }} PinnedProvider */
13
- /** @typedef {{ appAttestEnvironment?: 'development' | 'production', pinnedProviders?: PinnedProvider[], cleartextHosts?: string[] }} SatyaAttestPluginProps */
13
+ /** @typedef {{ appAttestEnvironment?: 'development' | 'production', pinnedProviders?: PinnedProvider[], cleartextHosts?: string[], enableWebViewGeolocation?: boolean, locationUsageDescription?: string }} SatyaAttestPluginProps */
14
+
15
+ // Opt in with `enableWebViewGeolocation: true` to declare the OS location permission that
16
+ // location-gated providers (`requiresLocation`) need. Off by default.
17
+ const DEFAULT_LOCATION_USAGE_DESCRIPTION =
18
+ 'Location is used to verify eligibility for supported providers inside the in-app browser.';
14
19
 
15
20
  /** @type {import('@expo/config-plugins').ConfigPlugin<SatyaAttestPluginProps>} */
16
21
  const withSatyaAttest = (config, props = {}) => {
@@ -29,9 +34,41 @@ const withSatyaAttest = (config, props = {}) => {
29
34
  config = withPinnedInfoPlist(config, pinnedProviders);
30
35
  config = withPinnedAndroidManifest(config, pinnedProviders, cleartextHosts);
31
36
  config = withPinnedAndroidNetworkSecurityConfig(config, pinnedProviders, cleartextHosts);
37
+ if (props.enableWebViewGeolocation) {
38
+ const usageDescription = props.locationUsageDescription ?? DEFAULT_LOCATION_USAGE_DESCRIPTION;
39
+ config = withWebViewGeolocationInfoPlist(config, usageDescription);
40
+ config = withWebViewGeolocationAndroidManifest(config);
41
+ }
32
42
  return config;
33
43
  };
34
44
 
45
+ // iOS: WKWebView serves navigator.geolocation via Core Location only if this usage key is set.
46
+ function withWebViewGeolocationInfoPlist(config, usageDescription) {
47
+ return withInfoPlist(config, (cfg) => {
48
+ if (!cfg.modResults.NSLocationWhenInUseUsageDescription) {
49
+ cfg.modResults.NSLocationWhenInUseUsageDescription = usageDescription;
50
+ }
51
+ return cfg;
52
+ });
53
+ }
54
+
55
+ // Android: the app must hold ACCESS_FINE/COARSE_LOCATION for the WebView to obtain a fix.
56
+ function withWebViewGeolocationAndroidManifest(config) {
57
+ return withAndroidManifest(config, (cfg) => {
58
+ const manifest = cfg.modResults.manifest;
59
+ manifest['uses-permission'] = manifest['uses-permission'] ?? [];
60
+ const permissions = [
61
+ 'android.permission.ACCESS_FINE_LOCATION',
62
+ 'android.permission.ACCESS_COARSE_LOCATION',
63
+ ];
64
+ for (const name of permissions) {
65
+ const exists = manifest['uses-permission'].some((entry) => entry.$?.['android:name'] === name);
66
+ if (!exists) manifest['uses-permission'].push({ $: { 'android:name': name } });
67
+ }
68
+ return cfg;
69
+ });
70
+ }
71
+
35
72
  function normalizePinnedProviders(providers) {
36
73
  return providers
37
74
  .map((provider) => ({
@@ -203,7 +203,7 @@ function ProviderSheetContent({ flow, insets }) {
203
203
  ]}/>
204
204
  </View>
205
205
  <View ref={webHostRef} style={[styles.webViewHost, { backgroundColor: theme.surfaceColor }]}>
206
- {ResolvedWebView && resolved ? (<ResolvedWebView {...(webViewProps ?? {})} ref={webRef} source={{
206
+ {ResolvedWebView && resolved ? (<ResolvedWebView {...(webViewProps ?? {})} geolocationEnabled={!!resolved.template.requiresLocation} ref={webRef} source={{
207
207
  uri: mainDocumentScriptReady
208
208
  ? (webViewUrl ?? providerLoginUrl(resolved.template))
209
209
  : WEBVIEW_BOOTSTRAP_URL,
@@ -252,7 +252,7 @@ function ProviderSheetContent({ flow, insets }) {
252
252
  <View style={styles.headerSide}/>
253
253
  </View>
254
254
  <View style={styles.webViewHost}>
255
- <ResolvedWebView {...(webViewProps ?? {})} ref={popupRef} key={managedPopupKey(managedPopup)} source={popupDocumentScriptReady
255
+ <ResolvedWebView {...(webViewProps ?? {})} geolocationEnabled={!!resolved.template.requiresLocation} ref={popupRef} key={managedPopupKey(managedPopup)} source={popupDocumentScriptReady
256
256
  ? managedPopupSource(managedPopup)
257
257
  : { uri: WEBVIEW_BOOTSTRAP_URL }} style={[styles.webView, webViewProps?.style]} javaScriptEnabled javaScriptCanOpenWindowsAutomatically domStorageEnabled sharedCookiesEnabled thirdPartyCookiesEnabled userAgent={effectiveUserAgent ?? defaultMobileBrowserUserAgent()} incognito={false} cacheEnabled setSupportMultipleWindows={false} injectedJavaScriptBeforeContentLoaded={popupInjectedScript} injectedJavaScript={popupInjectedScript} injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false} injectedJavaScriptForMainFrameOnly={false} onMessage={handleMessage} onOpenWindow={handlePopupOpenWindow} onShouldStartLoadWithRequest={handlePopupShouldStartLoadWithRequest} onNavigationStateChange={handlePopupNavigationStateChange} onLoadStart={(event) => {
258
258
  const nextChrome = readBrowserChromeState(event);
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderAttestModal.js","sourceRoot":"","sources":["../../../src/components/providerAttest/ProviderAttestModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n Animated,\n Easing,\n Modal,\n Platform,\n Pressable,\n StatusBar,\n StyleSheet,\n Text,\n useWindowDimensions,\n View,\n} from 'react-native';\nimport {\n initialWindowMetrics,\n SafeAreaInsetsContext,\n SafeAreaProvider,\n type EdgeInsets,\n} from 'react-native-safe-area-context';\n\nimport { WEBVIEW_BOOTSTRAP_URL } from './constants';\nimport { friendlyError, preparingCopy, processingCopy } from './copy';\nimport { managedPopupKey, managedPopupSource } from './popupRelay';\nimport { defaultMobileBrowserUserAgent, providerLoginUrl } from './providerResolution';\nimport { styles } from './styles';\nimport { insetPadding } from './theme';\nimport type { ProviderAttestFlow } from './useProviderAttestFlow';\nimport { invokeWebViewCallback, readBrowserChromeState } from './webviewRuntime';\n\ninterface ProviderAttestModalProps {\n flow: ProviderAttestFlow;\n}\n\nexport function ProviderAttestModal({ flow }: ProviderAttestModalProps) {\n // Android has no native sheet, so drive an in-app animated one; iOS uses pageSheet.\n if (Platform.OS === 'android' && flow.presentation === 'sheet') {\n return <AndroidSheetHost flow={flow} />;\n }\n return <SharedModalHost flow={flow} />;\n}\n\nfunction SharedModalHost({ flow }: ProviderAttestModalProps) {\n const { handleHardwareBack, handleModalRequestClose, modalVisible, presentation, theme } = flow;\n const useSheet = presentation === 'sheet';\n return (\n <Modal\n visible={modalVisible}\n animationType=\"slide\"\n presentationStyle={Platform.OS === 'ios' && useSheet ? 'pageSheet' : 'fullScreen'}\n statusBarTranslucent={!useSheet}\n navigationBarTranslucent\n onRequestClose={Platform.OS === 'ios' ? handleModalRequestClose : handleHardwareBack}>\n <StatusBar barStyle={theme.statusBarStyle} backgroundColor=\"transparent\" translucent />\n <SafeAreaProvider initialMetrics={initialWindowMetrics}>\n <SafeAreaInsetsContext.Consumer>\n {(insets) => <ProviderSheetContent flow={flow} insets={insets} />}\n </SafeAreaInsetsContext.Consumer>\n </SafeAreaProvider>\n </Modal>\n );\n}\n\nfunction AndroidSheetHost({ flow }: ProviderAttestModalProps) {\n const { closeFlow, handleHardwareBack, modalVisible, theme } = flow;\n const { height } = useWindowDimensions();\n const [translateY] = useState(() => new Animated.Value(height));\n const [backdropOpacity] = useState(() => new Animated.Value(0));\n // Keeps the Modal rendered through the slide-out animation.\n const [mounted, setMounted] = useState(false);\n // Height via ref so a resize while open doesn't re-run the entrance animation.\n const heightRef = useRef(height);\n useEffect(() => {\n heightRef.current = height;\n }, [height]);\n\n useEffect(() => {\n if (modalVisible) {\n // Mount for the whole open→close lifecycle so an early dismiss still slides out.\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setMounted(true);\n translateY.setValue(heightRef.current);\n Animated.parallel([\n Animated.spring(translateY, {\n toValue: 0,\n useNativeDriver: true,\n damping: 24,\n stiffness: 260,\n mass: 0.9,\n }),\n Animated.timing(backdropOpacity, {\n toValue: 1,\n duration: 180,\n useNativeDriver: true,\n }),\n ]).start();\n return;\n }\n Animated.parallel([\n Animated.timing(translateY, {\n toValue: heightRef.current,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.timing(backdropOpacity, { toValue: 0, duration: 160, useNativeDriver: true }),\n ]).start(({ finished }) => {\n if (finished) setMounted(false);\n });\n }, [modalVisible, translateY, backdropOpacity]);\n\n if (!modalVisible && !mounted) return null;\n\n return (\n <Modal\n visible\n transparent\n animationType=\"none\"\n statusBarTranslucent\n navigationBarTranslucent\n onRequestClose={handleHardwareBack}>\n <StatusBar barStyle={theme.statusBarStyle} backgroundColor=\"transparent\" translucent />\n <View style={styles.androidRoot}>\n <Animated.View\n style={[\n styles.backdrop,\n { opacity: backdropOpacity, backgroundColor: theme.backdropColor },\n ]}>\n <Pressable\n style={StyleSheet.absoluteFill}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Dismiss\"\n onPress={() => closeFlow(true)}\n />\n </Animated.View>\n <Animated.View\n style={[\n styles.androidSheet,\n {\n transform: [{ translateY }],\n backgroundColor: theme.surfaceColor,\n borderTopLeftRadius: theme.sheetCornerRadius,\n borderTopRightRadius: theme.sheetCornerRadius,\n },\n ]}>\n <SafeAreaProvider initialMetrics={initialWindowMetrics}>\n <SafeAreaInsetsContext.Consumer>\n {(insets) => <ProviderSheetContent flow={flow} insets={insets} />}\n </SafeAreaInsetsContext.Consumer>\n </SafeAreaProvider>\n </Animated.View>\n </View>\n </Modal>\n );\n}\n\ninterface ProviderSheetContentProps {\n flow: ProviderAttestFlow;\n insets: EdgeInsets | null;\n}\n\nfunction ProviderSheetContent({ flow, insets }: ProviderSheetContentProps) {\n const {\n closeFlow,\n closeManagedPopup,\n contentReady,\n effectiveUserAgent,\n error,\n handleHardwareBack,\n handleMessage,\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n handleReload,\n mainDocumentScriptReady,\n mainInjectedScript,\n managedPopup,\n markContentReady,\n markLoadEnd,\n markLoadStart,\n markPopupContentReady,\n maybeTriggerHtmlCapture,\n openFlow,\n phase,\n popupContentReady,\n popupDocumentScriptReady,\n popupHostRef,\n popupInjectedScript,\n popupRef,\n preparing,\n presentation,\n resolved,\n ResolvedWebView,\n secureConnection,\n secureHost,\n setBrowserChrome,\n setPopupChrome,\n theme,\n title,\n useNativePopups,\n webHostRef,\n webRef,\n webViewLoading,\n webViewProps,\n webViewUrl,\n } = flow;\n\n const useSheet = presentation === 'sheet';\n const [coverOpacity] = useState(() => new Animated.Value(1));\n const [popupCoverOpacity] = useState(() => new Animated.Value(1));\n // Browser-style loading line: trickle while loading, snap to 100% and fade on done.\n const [barProgress] = useState(() => new Animated.Value(0));\n const [barOpacity] = useState(() => new Animated.Value(0));\n\n useEffect(() => {\n Animated.timing(coverOpacity, {\n toValue: contentReady ? 0 : 1,\n duration: contentReady ? 220 : 0,\n useNativeDriver: true,\n }).start();\n }, [contentReady, coverOpacity]);\n\n useEffect(() => {\n Animated.timing(popupCoverOpacity, {\n toValue: popupContentReady ? 0 : 1,\n duration: popupContentReady ? 220 : 0,\n useNativeDriver: true,\n }).start();\n }, [popupContentReady, popupCoverOpacity]);\n\n useEffect(() => {\n if (webViewLoading) {\n barProgress.setValue(0.03);\n Animated.parallel([\n Animated.timing(barOpacity, { toValue: 1, duration: 120, useNativeDriver: false }),\n Animated.timing(barProgress, {\n toValue: 0.9,\n duration: 9000,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: false,\n }),\n ]).start();\n return;\n }\n Animated.sequence([\n Animated.timing(barProgress, {\n toValue: 1,\n duration: 160,\n easing: Easing.out(Easing.quad),\n useNativeDriver: false,\n }),\n Animated.timing(barOpacity, { toValue: 0, duration: 220, useNativeDriver: false }),\n ]).start(({ finished }) => {\n if (finished) barProgress.setValue(0);\n });\n }, [webViewLoading, barProgress, barOpacity]);\n\n const preparingName = title === 'Provider Attestation' ? undefined : title;\n const showRefresh = !!resolved && !error;\n\n return (\n <View\n style={[\n styles.modalRoot,\n { backgroundColor: theme.surfaceColor },\n useSheet && {\n borderTopLeftRadius: theme.sheetCornerRadius,\n borderTopRightRadius: theme.sheetCornerRadius,\n overflow: 'hidden',\n },\n insetPadding(insets, presentation),\n ]}>\n {useSheet && theme.showGrabber ? (\n <View style={styles.grabberWrap}>\n <View style={styles.grabber} />\n </View>\n ) : null}\n <View style={[styles.header, { backgroundColor: theme.surfaceColor }]}>\n {showRefresh ? (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Reload page\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={handleReload}>\n <Text style={[styles.headerRefreshGlyph, { color: theme.onSurfaceColor }]}>⟲</Text>\n </Pressable>\n ) : (\n <View style={styles.headerSide} />\n )}\n <View style={styles.headerCenter}>\n <Text style={[styles.headerTitle, { color: theme.onSurfaceColor }]} numberOfLines={1}>\n {title}\n </Text>\n {secureHost ? (\n <View style={styles.domainPill}>\n <Text style={[styles.domainLockGlyph, { color: theme.mutedColor }]}>\n {secureConnection ? '🔒' : '⚠'}\n </Text>\n <Text style={[styles.domainText, { color: theme.mutedColor }]} numberOfLines={1}>\n {secureHost}\n </Text>\n </View>\n ) : null}\n </View>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close browser\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={handleHardwareBack}>\n <View style={styles.headerCloseButton}>\n <Text style={[styles.headerCloseGlyph, { color: theme.onSurfaceColor }]}>✕</Text>\n </View>\n </Pressable>\n </View>\n <View style={styles.progressTrack}>\n <Animated.View\n style={[\n styles.progressFill,\n {\n backgroundColor: theme.accentColor,\n opacity: barOpacity,\n width: barProgress.interpolate({\n inputRange: [0, 1],\n outputRange: ['0%', '100%'],\n }),\n },\n ]}\n />\n </View>\n <View ref={webHostRef} style={[styles.webViewHost, { backgroundColor: theme.surfaceColor }]}>\n {ResolvedWebView && resolved ? (\n <ResolvedWebView\n {...(webViewProps ?? {})}\n ref={webRef}\n source={{\n uri: mainDocumentScriptReady\n ? (webViewUrl ?? providerLoginUrl(resolved.template))\n : WEBVIEW_BOOTSTRAP_URL,\n }}\n style={[styles.webView, webViewProps?.style]}\n javaScriptEnabled\n javaScriptCanOpenWindowsAutomatically\n domStorageEnabled\n sharedCookiesEnabled\n thirdPartyCookiesEnabled\n userAgent={effectiveUserAgent ?? defaultMobileBrowserUserAgent()}\n incognito={false}\n cacheEnabled\n setSupportMultipleWindows={useNativePopups}\n injectedJavaScriptBeforeContentLoaded={mainInjectedScript}\n injectedJavaScript={mainInjectedScript}\n injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false}\n injectedJavaScriptForMainFrameOnly={false}\n onMessage={handleMessage}\n onOpenWindow={handleOpenWindow}\n onShouldStartLoadWithRequest={handleShouldStartLoadWithRequest}\n onNavigationStateChange={handleNavigationStateChange}\n onLoadStart={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadStart, event);\n if (!mainDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n markLoadStart();\n setBrowserChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: true,\n }));\n }}\n onLoadEnd={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadEnd, event);\n if (!mainDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n markContentReady();\n markLoadEnd();\n setBrowserChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: false,\n }));\n webRef.current?.injectJavaScript?.(mainInjectedScript);\n maybeTriggerHtmlCapture(nextChrome.url);\n }}\n originWhitelist={['http://*', 'https://*', 'about:*']}\n />\n ) : (\n <View style={styles.webViewFallback}>\n <Text style={styles.errorText}>react-native-webview is not available.</Text>\n </View>\n )}\n {ResolvedWebView && resolved ? (\n <Animated.View\n pointerEvents={contentReady ? 'none' : 'auto'}\n style={[\n styles.fadeCover,\n { backgroundColor: theme.surfaceColor, opacity: coverOpacity },\n ]}>\n {!contentReady ? <ActivityIndicator color={theme.accentColor} size=\"large\" /> : null}\n </Animated.View>\n ) : null}\n {ResolvedWebView && resolved && managedPopup ? (\n <View\n ref={popupHostRef}\n style={[styles.popupOverlay, { backgroundColor: theme.surfaceColor }]}>\n <View style={[styles.popupHeader, { backgroundColor: theme.surfaceColor }]}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Back\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={() => closeManagedPopup()}>\n <Text style={[styles.headerBackGlyph, { color: theme.onSurfaceColor }]}>{'<'}</Text>\n </Pressable>\n <Text style={[styles.headerTitle, { color: theme.onSurfaceColor }]} numberOfLines={1}>\n Sign in\n </Text>\n <View style={styles.headerSide} />\n </View>\n <View style={styles.webViewHost}>\n <ResolvedWebView\n {...(webViewProps ?? {})}\n ref={popupRef}\n key={managedPopupKey(managedPopup)}\n source={\n popupDocumentScriptReady\n ? managedPopupSource(managedPopup)\n : { uri: WEBVIEW_BOOTSTRAP_URL }\n }\n style={[styles.webView, webViewProps?.style]}\n javaScriptEnabled\n javaScriptCanOpenWindowsAutomatically\n domStorageEnabled\n sharedCookiesEnabled\n thirdPartyCookiesEnabled\n userAgent={effectiveUserAgent ?? defaultMobileBrowserUserAgent()}\n incognito={false}\n cacheEnabled\n setSupportMultipleWindows={false}\n injectedJavaScriptBeforeContentLoaded={popupInjectedScript}\n injectedJavaScript={popupInjectedScript}\n injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false}\n injectedJavaScriptForMainFrameOnly={false}\n onMessage={handleMessage}\n onOpenWindow={handlePopupOpenWindow}\n onShouldStartLoadWithRequest={handlePopupShouldStartLoadWithRequest}\n onNavigationStateChange={handlePopupNavigationStateChange}\n onLoadStart={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadStart, event);\n if (!popupDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) {\n return;\n }\n setPopupChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: true,\n }));\n }}\n onLoadEnd={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadEnd, event);\n if (!popupDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) {\n return;\n }\n markPopupContentReady();\n setPopupChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: false,\n }));\n popupRef.current?.injectJavaScript?.(popupInjectedScript);\n }}\n originWhitelist={['http://*', 'https://*', 'about:*']}\n />\n <Animated.View\n pointerEvents={popupContentReady ? 'none' : 'auto'}\n style={[\n styles.fadeCover,\n { backgroundColor: theme.surfaceColor, opacity: popupCoverOpacity },\n ]}>\n {!popupContentReady ? (\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n ) : null}\n </Animated.View>\n </View>\n </View>\n ) : null}\n {flow.isProcessing ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {processingCopy(phase)}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n Keep this screen open - it only takes a moment.\n </Text>\n </View>\n ) : null}\n {error ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <View style={styles.errorIconWrap}>\n <Text style={styles.errorIconGlyph}>!</Text>\n </View>\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n Could not verify your account\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n {friendlyError(error)}\n </Text>\n <Pressable\n style={[styles.primaryAction, { backgroundColor: theme.accentColor }]}\n onPress={openFlow}>\n <Text style={styles.primaryActionText}>Try again</Text>\n </Pressable>\n <Pressable style={styles.secondaryAction} onPress={() => closeFlow(true)}>\n <Text style={[styles.secondaryActionText, { color: theme.mutedColor }]}>Close</Text>\n </Pressable>\n </View>\n ) : null}\n {preparing ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {preparingCopy(preparingName)}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n Setting up a secure connection.\n </Text>\n </View>\n ) : null}\n {Platform.OS === 'ios' ? (\n <View\n style={styles.edgeSwipeZone}\n accessibilityElementsHidden\n {...flow.edgeSwipeHandlers}\n />\n ) : null}\n </View>\n </View>\n );\n}\n"]}
1
+ {"version":3,"file":"ProviderAttestModal.js","sourceRoot":"","sources":["../../../src/components/providerAttest/ProviderAttestModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n Animated,\n Easing,\n Modal,\n Platform,\n Pressable,\n StatusBar,\n StyleSheet,\n Text,\n useWindowDimensions,\n View,\n} from 'react-native';\nimport {\n initialWindowMetrics,\n SafeAreaInsetsContext,\n SafeAreaProvider,\n type EdgeInsets,\n} from 'react-native-safe-area-context';\n\nimport { WEBVIEW_BOOTSTRAP_URL } from './constants';\nimport { friendlyError, preparingCopy, processingCopy } from './copy';\nimport { managedPopupKey, managedPopupSource } from './popupRelay';\nimport { defaultMobileBrowserUserAgent, providerLoginUrl } from './providerResolution';\nimport { styles } from './styles';\nimport { insetPadding } from './theme';\nimport type { ProviderAttestFlow } from './useProviderAttestFlow';\nimport { invokeWebViewCallback, readBrowserChromeState } from './webviewRuntime';\n\ninterface ProviderAttestModalProps {\n flow: ProviderAttestFlow;\n}\n\nexport function ProviderAttestModal({ flow }: ProviderAttestModalProps) {\n // Android has no native sheet, so drive an in-app animated one; iOS uses pageSheet.\n if (Platform.OS === 'android' && flow.presentation === 'sheet') {\n return <AndroidSheetHost flow={flow} />;\n }\n return <SharedModalHost flow={flow} />;\n}\n\nfunction SharedModalHost({ flow }: ProviderAttestModalProps) {\n const { handleHardwareBack, handleModalRequestClose, modalVisible, presentation, theme } = flow;\n const useSheet = presentation === 'sheet';\n return (\n <Modal\n visible={modalVisible}\n animationType=\"slide\"\n presentationStyle={Platform.OS === 'ios' && useSheet ? 'pageSheet' : 'fullScreen'}\n statusBarTranslucent={!useSheet}\n navigationBarTranslucent\n onRequestClose={Platform.OS === 'ios' ? handleModalRequestClose : handleHardwareBack}>\n <StatusBar barStyle={theme.statusBarStyle} backgroundColor=\"transparent\" translucent />\n <SafeAreaProvider initialMetrics={initialWindowMetrics}>\n <SafeAreaInsetsContext.Consumer>\n {(insets) => <ProviderSheetContent flow={flow} insets={insets} />}\n </SafeAreaInsetsContext.Consumer>\n </SafeAreaProvider>\n </Modal>\n );\n}\n\nfunction AndroidSheetHost({ flow }: ProviderAttestModalProps) {\n const { closeFlow, handleHardwareBack, modalVisible, theme } = flow;\n const { height } = useWindowDimensions();\n const [translateY] = useState(() => new Animated.Value(height));\n const [backdropOpacity] = useState(() => new Animated.Value(0));\n // Keeps the Modal rendered through the slide-out animation.\n const [mounted, setMounted] = useState(false);\n // Height via ref so a resize while open doesn't re-run the entrance animation.\n const heightRef = useRef(height);\n useEffect(() => {\n heightRef.current = height;\n }, [height]);\n\n useEffect(() => {\n if (modalVisible) {\n // Mount for the whole open→close lifecycle so an early dismiss still slides out.\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setMounted(true);\n translateY.setValue(heightRef.current);\n Animated.parallel([\n Animated.spring(translateY, {\n toValue: 0,\n useNativeDriver: true,\n damping: 24,\n stiffness: 260,\n mass: 0.9,\n }),\n Animated.timing(backdropOpacity, {\n toValue: 1,\n duration: 180,\n useNativeDriver: true,\n }),\n ]).start();\n return;\n }\n Animated.parallel([\n Animated.timing(translateY, {\n toValue: heightRef.current,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.timing(backdropOpacity, { toValue: 0, duration: 160, useNativeDriver: true }),\n ]).start(({ finished }) => {\n if (finished) setMounted(false);\n });\n }, [modalVisible, translateY, backdropOpacity]);\n\n if (!modalVisible && !mounted) return null;\n\n return (\n <Modal\n visible\n transparent\n animationType=\"none\"\n statusBarTranslucent\n navigationBarTranslucent\n onRequestClose={handleHardwareBack}>\n <StatusBar barStyle={theme.statusBarStyle} backgroundColor=\"transparent\" translucent />\n <View style={styles.androidRoot}>\n <Animated.View\n style={[\n styles.backdrop,\n { opacity: backdropOpacity, backgroundColor: theme.backdropColor },\n ]}>\n <Pressable\n style={StyleSheet.absoluteFill}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Dismiss\"\n onPress={() => closeFlow(true)}\n />\n </Animated.View>\n <Animated.View\n style={[\n styles.androidSheet,\n {\n transform: [{ translateY }],\n backgroundColor: theme.surfaceColor,\n borderTopLeftRadius: theme.sheetCornerRadius,\n borderTopRightRadius: theme.sheetCornerRadius,\n },\n ]}>\n <SafeAreaProvider initialMetrics={initialWindowMetrics}>\n <SafeAreaInsetsContext.Consumer>\n {(insets) => <ProviderSheetContent flow={flow} insets={insets} />}\n </SafeAreaInsetsContext.Consumer>\n </SafeAreaProvider>\n </Animated.View>\n </View>\n </Modal>\n );\n}\n\ninterface ProviderSheetContentProps {\n flow: ProviderAttestFlow;\n insets: EdgeInsets | null;\n}\n\nfunction ProviderSheetContent({ flow, insets }: ProviderSheetContentProps) {\n const {\n closeFlow,\n closeManagedPopup,\n contentReady,\n effectiveUserAgent,\n error,\n handleHardwareBack,\n handleMessage,\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n handleReload,\n mainDocumentScriptReady,\n mainInjectedScript,\n managedPopup,\n markContentReady,\n markLoadEnd,\n markLoadStart,\n markPopupContentReady,\n maybeTriggerHtmlCapture,\n openFlow,\n phase,\n popupContentReady,\n popupDocumentScriptReady,\n popupHostRef,\n popupInjectedScript,\n popupRef,\n preparing,\n presentation,\n resolved,\n ResolvedWebView,\n secureConnection,\n secureHost,\n setBrowserChrome,\n setPopupChrome,\n theme,\n title,\n useNativePopups,\n webHostRef,\n webRef,\n webViewLoading,\n webViewProps,\n webViewUrl,\n } = flow;\n\n const useSheet = presentation === 'sheet';\n const [coverOpacity] = useState(() => new Animated.Value(1));\n const [popupCoverOpacity] = useState(() => new Animated.Value(1));\n // Browser-style loading line: trickle while loading, snap to 100% and fade on done.\n const [barProgress] = useState(() => new Animated.Value(0));\n const [barOpacity] = useState(() => new Animated.Value(0));\n\n useEffect(() => {\n Animated.timing(coverOpacity, {\n toValue: contentReady ? 0 : 1,\n duration: contentReady ? 220 : 0,\n useNativeDriver: true,\n }).start();\n }, [contentReady, coverOpacity]);\n\n useEffect(() => {\n Animated.timing(popupCoverOpacity, {\n toValue: popupContentReady ? 0 : 1,\n duration: popupContentReady ? 220 : 0,\n useNativeDriver: true,\n }).start();\n }, [popupContentReady, popupCoverOpacity]);\n\n useEffect(() => {\n if (webViewLoading) {\n barProgress.setValue(0.03);\n Animated.parallel([\n Animated.timing(barOpacity, { toValue: 1, duration: 120, useNativeDriver: false }),\n Animated.timing(barProgress, {\n toValue: 0.9,\n duration: 9000,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: false,\n }),\n ]).start();\n return;\n }\n Animated.sequence([\n Animated.timing(barProgress, {\n toValue: 1,\n duration: 160,\n easing: Easing.out(Easing.quad),\n useNativeDriver: false,\n }),\n Animated.timing(barOpacity, { toValue: 0, duration: 220, useNativeDriver: false }),\n ]).start(({ finished }) => {\n if (finished) barProgress.setValue(0);\n });\n }, [webViewLoading, barProgress, barOpacity]);\n\n const preparingName = title === 'Provider Attestation' ? undefined : title;\n const showRefresh = !!resolved && !error;\n\n return (\n <View\n style={[\n styles.modalRoot,\n { backgroundColor: theme.surfaceColor },\n useSheet && {\n borderTopLeftRadius: theme.sheetCornerRadius,\n borderTopRightRadius: theme.sheetCornerRadius,\n overflow: 'hidden',\n },\n insetPadding(insets, presentation),\n ]}>\n {useSheet && theme.showGrabber ? (\n <View style={styles.grabberWrap}>\n <View style={styles.grabber} />\n </View>\n ) : null}\n <View style={[styles.header, { backgroundColor: theme.surfaceColor }]}>\n {showRefresh ? (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Reload page\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={handleReload}>\n <Text style={[styles.headerRefreshGlyph, { color: theme.onSurfaceColor }]}>⟲</Text>\n </Pressable>\n ) : (\n <View style={styles.headerSide} />\n )}\n <View style={styles.headerCenter}>\n <Text style={[styles.headerTitle, { color: theme.onSurfaceColor }]} numberOfLines={1}>\n {title}\n </Text>\n {secureHost ? (\n <View style={styles.domainPill}>\n <Text style={[styles.domainLockGlyph, { color: theme.mutedColor }]}>\n {secureConnection ? '🔒' : '⚠'}\n </Text>\n <Text style={[styles.domainText, { color: theme.mutedColor }]} numberOfLines={1}>\n {secureHost}\n </Text>\n </View>\n ) : null}\n </View>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close browser\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={handleHardwareBack}>\n <View style={styles.headerCloseButton}>\n <Text style={[styles.headerCloseGlyph, { color: theme.onSurfaceColor }]}>✕</Text>\n </View>\n </Pressable>\n </View>\n <View style={styles.progressTrack}>\n <Animated.View\n style={[\n styles.progressFill,\n {\n backgroundColor: theme.accentColor,\n opacity: barOpacity,\n width: barProgress.interpolate({\n inputRange: [0, 1],\n outputRange: ['0%', '100%'],\n }),\n },\n ]}\n />\n </View>\n <View ref={webHostRef} style={[styles.webViewHost, { backgroundColor: theme.surfaceColor }]}>\n {ResolvedWebView && resolved ? (\n <ResolvedWebView\n {...(webViewProps ?? {})}\n geolocationEnabled={!!resolved.template.requiresLocation}\n ref={webRef}\n source={{\n uri: mainDocumentScriptReady\n ? (webViewUrl ?? providerLoginUrl(resolved.template))\n : WEBVIEW_BOOTSTRAP_URL,\n }}\n style={[styles.webView, webViewProps?.style]}\n javaScriptEnabled\n javaScriptCanOpenWindowsAutomatically\n domStorageEnabled\n sharedCookiesEnabled\n thirdPartyCookiesEnabled\n userAgent={effectiveUserAgent ?? defaultMobileBrowserUserAgent()}\n incognito={false}\n cacheEnabled\n setSupportMultipleWindows={useNativePopups}\n injectedJavaScriptBeforeContentLoaded={mainInjectedScript}\n injectedJavaScript={mainInjectedScript}\n injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false}\n injectedJavaScriptForMainFrameOnly={false}\n onMessage={handleMessage}\n onOpenWindow={handleOpenWindow}\n onShouldStartLoadWithRequest={handleShouldStartLoadWithRequest}\n onNavigationStateChange={handleNavigationStateChange}\n onLoadStart={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadStart, event);\n if (!mainDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n markLoadStart();\n setBrowserChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: true,\n }));\n }}\n onLoadEnd={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadEnd, event);\n if (!mainDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n markContentReady();\n markLoadEnd();\n setBrowserChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: false,\n }));\n webRef.current?.injectJavaScript?.(mainInjectedScript);\n maybeTriggerHtmlCapture(nextChrome.url);\n }}\n originWhitelist={['http://*', 'https://*', 'about:*']}\n />\n ) : (\n <View style={styles.webViewFallback}>\n <Text style={styles.errorText}>react-native-webview is not available.</Text>\n </View>\n )}\n {ResolvedWebView && resolved ? (\n <Animated.View\n pointerEvents={contentReady ? 'none' : 'auto'}\n style={[\n styles.fadeCover,\n { backgroundColor: theme.surfaceColor, opacity: coverOpacity },\n ]}>\n {!contentReady ? <ActivityIndicator color={theme.accentColor} size=\"large\" /> : null}\n </Animated.View>\n ) : null}\n {ResolvedWebView && resolved && managedPopup ? (\n <View\n ref={popupHostRef}\n style={[styles.popupOverlay, { backgroundColor: theme.surfaceColor }]}>\n <View style={[styles.popupHeader, { backgroundColor: theme.surfaceColor }]}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Back\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={() => closeManagedPopup()}>\n <Text style={[styles.headerBackGlyph, { color: theme.onSurfaceColor }]}>{'<'}</Text>\n </Pressable>\n <Text style={[styles.headerTitle, { color: theme.onSurfaceColor }]} numberOfLines={1}>\n Sign in\n </Text>\n <View style={styles.headerSide} />\n </View>\n <View style={styles.webViewHost}>\n <ResolvedWebView\n {...(webViewProps ?? {})}\n geolocationEnabled={!!resolved.template.requiresLocation}\n ref={popupRef}\n key={managedPopupKey(managedPopup)}\n source={\n popupDocumentScriptReady\n ? managedPopupSource(managedPopup)\n : { uri: WEBVIEW_BOOTSTRAP_URL }\n }\n style={[styles.webView, webViewProps?.style]}\n javaScriptEnabled\n javaScriptCanOpenWindowsAutomatically\n domStorageEnabled\n sharedCookiesEnabled\n thirdPartyCookiesEnabled\n userAgent={effectiveUserAgent ?? defaultMobileBrowserUserAgent()}\n incognito={false}\n cacheEnabled\n setSupportMultipleWindows={false}\n injectedJavaScriptBeforeContentLoaded={popupInjectedScript}\n injectedJavaScript={popupInjectedScript}\n injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false}\n injectedJavaScriptForMainFrameOnly={false}\n onMessage={handleMessage}\n onOpenWindow={handlePopupOpenWindow}\n onShouldStartLoadWithRequest={handlePopupShouldStartLoadWithRequest}\n onNavigationStateChange={handlePopupNavigationStateChange}\n onLoadStart={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadStart, event);\n if (!popupDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) {\n return;\n }\n setPopupChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: true,\n }));\n }}\n onLoadEnd={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadEnd, event);\n if (!popupDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) {\n return;\n }\n markPopupContentReady();\n setPopupChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: false,\n }));\n popupRef.current?.injectJavaScript?.(popupInjectedScript);\n }}\n originWhitelist={['http://*', 'https://*', 'about:*']}\n />\n <Animated.View\n pointerEvents={popupContentReady ? 'none' : 'auto'}\n style={[\n styles.fadeCover,\n { backgroundColor: theme.surfaceColor, opacity: popupCoverOpacity },\n ]}>\n {!popupContentReady ? (\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n ) : null}\n </Animated.View>\n </View>\n </View>\n ) : null}\n {flow.isProcessing ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {processingCopy(phase)}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n Keep this screen open - it only takes a moment.\n </Text>\n </View>\n ) : null}\n {error ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <View style={styles.errorIconWrap}>\n <Text style={styles.errorIconGlyph}>!</Text>\n </View>\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n Could not verify your account\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n {friendlyError(error)}\n </Text>\n <Pressable\n style={[styles.primaryAction, { backgroundColor: theme.accentColor }]}\n onPress={openFlow}>\n <Text style={styles.primaryActionText}>Try again</Text>\n </Pressable>\n <Pressable style={styles.secondaryAction} onPress={() => closeFlow(true)}>\n <Text style={[styles.secondaryActionText, { color: theme.mutedColor }]}>Close</Text>\n </Pressable>\n </View>\n ) : null}\n {preparing ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {preparingCopy(preparingName)}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n Setting up a secure connection.\n </Text>\n </View>\n ) : null}\n {Platform.OS === 'ios' ? (\n <View\n style={styles.edgeSwipeZone}\n accessibilityElementsHidden\n {...flow.edgeSwipeHandlers}\n />\n ) : null}\n </View>\n </View>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/providerRegistry/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA0B,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAiB9E,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,qBAAqB,CA2HvB;AAED,wBAAgB,oBAAoB,CAClC,gBAAgB,EAAE,qBAAqB,EACvC,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,qBAAqB,CAQvB"}
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/providerRegistry/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA0B,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAiB9E,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,qBAAqB,CA4HvB;AAED,wBAAgB,oBAAoB,CAClC,gBAAgB,EAAE,qBAAqB,EACvC,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,qBAAqB,CAQvB"}
@@ -60,6 +60,7 @@ export function validateProviderTemplate(value, options = {}) {
60
60
  template.label = name;
61
61
  template.displayName = name;
62
62
  template.version = version;
63
+ template.requiresLocation = value.requiresLocation === true;
63
64
  if (iconUrl)
64
65
  template.iconUrl = iconUrl;
65
66
  template.login = {
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/providerRegistry/template.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SatyaProviderInjection, SatyaProviderTemplate } from '../types';\nimport { selectProviderEndpoint, validateProviderEndpoints } from './endpoints';\nimport {\n cloneJson,\n inferProviderVersion,\n isRecord,\n readObject,\n readOptionalString,\n readOptionalStringArray,\n readRequiredString,\n} from './readers';\nimport { deriveResponseReveals, jsonPathsFromReveals } from './rules';\nimport { normalizeHost, validateHttpsUrl } from './url';\nimport { SatyaErrorCode, satyaError } from '../types/error.types';\n\nconst SPKI_SHA256_B64_RE = /^[A-Za-z0-9+/]{43}=$/;\n\nexport function validateProviderTemplate(\n value: unknown,\n options: { source?: string; endpointId?: string } = {}\n): SatyaProviderTemplate {\n const source = options.source ?? 'provider template';\n if (!isRecord(value))\n throw satyaError(SatyaErrorCode.PROVIDER_TEMPLATE_INVALID, `${source} must be a JSON object`);\n\n const providerId = readRequiredString(value, 'providerId', source);\n const schemaVersion = readRequiredString(value, 'schemaVersion', source);\n const name = readRequiredString(value, 'name', source);\n const version = readOptionalString(value, 'version', source) ?? inferProviderVersion(providerId);\n const iconUrl = readOptionalString(value, 'iconUrl', source);\n if (iconUrl) validateHttpsUrl(iconUrl, { source: `${providerId}.iconUrl` });\n\n const login = readProviderLogin(value, source);\n const startUrl = readRequiredString(login, 'url', `${source}.login`);\n const parsedStartUrl = validateHttpsUrl(startUrl, {\n source: `${providerId}.login.url`,\n });\n const injection = validateProviderInjection(value, source);\n\n const tlsIdentityPolicy = readObject(value, 'tlsIdentityPolicy', source);\n const expectedSni = normalizeHost(\n readRequiredString(tlsIdentityPolicy, 'expectedSni', `${source}.tlsIdentityPolicy`)\n );\n const endpoints = validateProviderEndpoints(value, {\n expectedSni,\n providerId,\n source,\n });\n const selectedEndpoint = selectProviderEndpoint(providerId, endpoints, options.endpointId);\n const selectedResponseType = (selectedEndpoint.responseType ?? 'json').toLowerCase();\n const allowedResponseReveals = deriveResponseReveals(\n providerId,\n selectedEndpoint.id,\n selectedEndpoint.revealRules,\n selectedResponseType\n );\n const allowedResponseBodyJsonPaths = jsonPathsFromReveals(allowedResponseReveals);\n\n const trustPolicy =\n readOptionalString(tlsIdentityPolicy, 'tlsTrustStorePolicy', `${source}.tlsIdentityPolicy`) ??\n 'web-pki-os-roots-no-user-roots';\n if (trustPolicy !== 'web-pki-os-roots-no-user-roots') {\n throw satyaError(\n SatyaErrorCode.PROVIDER_TEMPLATE_INVALID,\n `${providerId}.tlsIdentityPolicy.tlsTrustStorePolicy must be web-pki-os-roots-no-user-roots`\n );\n }\n if (\n tlsIdentityPolicy.userRootsAllowed !== undefined &&\n tlsIdentityPolicy.userRootsAllowed !== false\n ) {\n throw satyaError(\n SatyaErrorCode.PROVIDER_TEMPLATE_INVALID,\n `${providerId}.tlsIdentityPolicy.userRootsAllowed must be false`\n );\n }\n const pins = readOptionalStringArray(\n tlsIdentityPolicy,\n 'spkiSha256B64Pins',\n `${source}.tlsIdentityPolicy`\n );\n for (const pin of pins) {\n if (!SPKI_SHA256_B64_RE.test(pin)) {\n throw satyaError(\n SatyaErrorCode.PROVIDER_TEMPLATE_INVALID,\n `${providerId}.tlsIdentityPolicy.spkiSha256B64Pins contains an invalid pin`\n );\n }\n }\n\n const governance = readObject(value, 'templateGovernance', source);\n const policyHash = readRequiredString(governance, 'policyHash', `${source}.templateGovernance`);\n const fixtureSetHash =\n readOptionalString(governance, 'fixtureSetHash', `${source}.templateGovernance`) ??\n 'unversioned-fixtures';\n const governancePolicyVersion =\n readOptionalString(governance, 'governancePolicyVersion', `${source}.templateGovernance`) ??\n 'embedded-registry';\n const template = cloneJson(value as SatyaProviderTemplate);\n template.schemaVersion = schemaVersion;\n template.providerId = providerId;\n template.name = name;\n template.label = name;\n template.displayName = name;\n template.version = version;\n if (iconUrl) template.iconUrl = iconUrl;\n template.login = {\n ...cloneJson(login),\n url: parsedStartUrl.toString(),\n };\n delete template.login.injection;\n template.injection = injection;\n if (isRecord(value.auth)) template.auth = cloneJson(value.auth);\n template.endpoints = endpoints;\n template.selectedEndpointId = selectedEndpoint.id;\n template.target = { scheme: 'https', host: expectedSni, port: 443 };\n template.webLogin = {\n startUrl: parsedStartUrl.toString(),\n callbackUrl: parsedStartUrl.toString(),\n oauthHosts: [normalizeHost(parsedStartUrl.hostname)],\n };\n template.proofTarget = {\n ...cloneJson(selectedEndpoint),\n method: selectedEndpoint.method,\n url: selectedEndpoint.url,\n requestMatchRules: selectedEndpoint.requestMatchRules,\n revealRules: selectedEndpoint.revealRules,\n };\n template.privacyPolicy = {\n allowedRequestHeaders: selectedEndpoint.headers,\n allowedResponseBodyJsonPaths,\n allowedResponseReveals: allowedResponseReveals.map((reveal) => ({ ...reveal })),\n };\n template.tlsIdentityPolicy.expectedSni = expectedSni;\n template.tlsIdentityPolicy.tlsTrustStorePolicy = 'web-pki-os-roots-no-user-roots';\n template.tlsIdentityPolicy.userRootsAllowed = false;\n template.tlsIdentityPolicy.spkiSha256B64Pins = pins;\n template.templateGovernance = {\n policyHash,\n fixtureSetHash,\n governancePolicyVersion,\n };\n return template;\n}\n\nexport function withProviderSpkiPins(\n providerTemplate: SatyaProviderTemplate,\n pins: readonly string[]\n): SatyaProviderTemplate {\n return {\n ...cloneJson(providerTemplate),\n tlsIdentityPolicy: {\n ...providerTemplate.tlsIdentityPolicy,\n spkiSha256B64Pins: pins.map((pin) => pin.trim()).filter(Boolean),\n },\n };\n}\n\nfunction readProviderLogin(\n value: Record<string, unknown>,\n source: string\n): Record<string, unknown> {\n if (isRecord(value.login)) return value.login;\n throw satyaError(SatyaErrorCode.PROVIDER_TEMPLATE_INVALID, `${source}.login must be an object`);\n}\n\nfunction validateProviderInjection(\n value: Record<string, unknown>,\n source: string\n): SatyaProviderInjection | null | undefined {\n const raw = value.injection;\n if (raw === undefined) return undefined;\n if (raw === null) return null;\n\n const scripts = Array.isArray(raw) ? raw : [raw];\n if (scripts.length === 0) {\n throw satyaError(\n SatyaErrorCode.PROVIDER_TEMPLATE_INVALID,\n `${source}.injection must not be an empty array`\n );\n }\n const normalized = scripts.map((script, index) => {\n if (typeof script !== 'string' || !script.trim()) {\n throw satyaError(\n SatyaErrorCode.PROVIDER_TEMPLATE_INVALID,\n `${source}.injection[${index}] must be a non-empty string`\n );\n }\n const trimmed = script.trim();\n return trimmed;\n });\n return Array.isArray(raw) ? normalized : normalized[0];\n}\n"]}
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/providerRegistry/template.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SatyaProviderInjection, SatyaProviderTemplate } from '../types';\nimport { selectProviderEndpoint, validateProviderEndpoints } from './endpoints';\nimport {\n cloneJson,\n inferProviderVersion,\n isRecord,\n readObject,\n readOptionalString,\n readOptionalStringArray,\n readRequiredString,\n} from './readers';\nimport { deriveResponseReveals, jsonPathsFromReveals } from './rules';\nimport { normalizeHost, validateHttpsUrl } from './url';\nimport { SatyaErrorCode, satyaError } from '../types/error.types';\n\nconst SPKI_SHA256_B64_RE = /^[A-Za-z0-9+/]{43}=$/;\n\nexport function validateProviderTemplate(\n value: unknown,\n options: { source?: string; endpointId?: string } = {}\n): SatyaProviderTemplate {\n const source = options.source ?? 'provider template';\n if (!isRecord(value))\n throw satyaError(SatyaErrorCode.PROVIDER_TEMPLATE_INVALID, `${source} must be a JSON object`);\n\n const providerId = readRequiredString(value, 'providerId', source);\n const schemaVersion = readRequiredString(value, 'schemaVersion', source);\n const name = readRequiredString(value, 'name', source);\n const version = readOptionalString(value, 'version', source) ?? inferProviderVersion(providerId);\n const iconUrl = readOptionalString(value, 'iconUrl', source);\n if (iconUrl) validateHttpsUrl(iconUrl, { source: `${providerId}.iconUrl` });\n\n const login = readProviderLogin(value, source);\n const startUrl = readRequiredString(login, 'url', `${source}.login`);\n const parsedStartUrl = validateHttpsUrl(startUrl, {\n source: `${providerId}.login.url`,\n });\n const injection = validateProviderInjection(value, source);\n\n const tlsIdentityPolicy = readObject(value, 'tlsIdentityPolicy', source);\n const expectedSni = normalizeHost(\n readRequiredString(tlsIdentityPolicy, 'expectedSni', `${source}.tlsIdentityPolicy`)\n );\n const endpoints = validateProviderEndpoints(value, {\n expectedSni,\n providerId,\n source,\n });\n const selectedEndpoint = selectProviderEndpoint(providerId, endpoints, options.endpointId);\n const selectedResponseType = (selectedEndpoint.responseType ?? 'json').toLowerCase();\n const allowedResponseReveals = deriveResponseReveals(\n providerId,\n selectedEndpoint.id,\n selectedEndpoint.revealRules,\n selectedResponseType\n );\n const allowedResponseBodyJsonPaths = jsonPathsFromReveals(allowedResponseReveals);\n\n const trustPolicy =\n readOptionalString(tlsIdentityPolicy, 'tlsTrustStorePolicy', `${source}.tlsIdentityPolicy`) ??\n 'web-pki-os-roots-no-user-roots';\n if (trustPolicy !== 'web-pki-os-roots-no-user-roots') {\n throw satyaError(\n SatyaErrorCode.PROVIDER_TEMPLATE_INVALID,\n `${providerId}.tlsIdentityPolicy.tlsTrustStorePolicy must be web-pki-os-roots-no-user-roots`\n );\n }\n if (\n tlsIdentityPolicy.userRootsAllowed !== undefined &&\n tlsIdentityPolicy.userRootsAllowed !== false\n ) {\n throw satyaError(\n SatyaErrorCode.PROVIDER_TEMPLATE_INVALID,\n `${providerId}.tlsIdentityPolicy.userRootsAllowed must be false`\n );\n }\n const pins = readOptionalStringArray(\n tlsIdentityPolicy,\n 'spkiSha256B64Pins',\n `${source}.tlsIdentityPolicy`\n );\n for (const pin of pins) {\n if (!SPKI_SHA256_B64_RE.test(pin)) {\n throw satyaError(\n SatyaErrorCode.PROVIDER_TEMPLATE_INVALID,\n `${providerId}.tlsIdentityPolicy.spkiSha256B64Pins contains an invalid pin`\n );\n }\n }\n\n const governance = readObject(value, 'templateGovernance', source);\n const policyHash = readRequiredString(governance, 'policyHash', `${source}.templateGovernance`);\n const fixtureSetHash =\n readOptionalString(governance, 'fixtureSetHash', `${source}.templateGovernance`) ??\n 'unversioned-fixtures';\n const governancePolicyVersion =\n readOptionalString(governance, 'governancePolicyVersion', `${source}.templateGovernance`) ??\n 'embedded-registry';\n const template = cloneJson(value as SatyaProviderTemplate);\n template.schemaVersion = schemaVersion;\n template.providerId = providerId;\n template.name = name;\n template.label = name;\n template.displayName = name;\n template.version = version;\n template.requiresLocation = value.requiresLocation === true;\n if (iconUrl) template.iconUrl = iconUrl;\n template.login = {\n ...cloneJson(login),\n url: parsedStartUrl.toString(),\n };\n delete template.login.injection;\n template.injection = injection;\n if (isRecord(value.auth)) template.auth = cloneJson(value.auth);\n template.endpoints = endpoints;\n template.selectedEndpointId = selectedEndpoint.id;\n template.target = { scheme: 'https', host: expectedSni, port: 443 };\n template.webLogin = {\n startUrl: parsedStartUrl.toString(),\n callbackUrl: parsedStartUrl.toString(),\n oauthHosts: [normalizeHost(parsedStartUrl.hostname)],\n };\n template.proofTarget = {\n ...cloneJson(selectedEndpoint),\n method: selectedEndpoint.method,\n url: selectedEndpoint.url,\n requestMatchRules: selectedEndpoint.requestMatchRules,\n revealRules: selectedEndpoint.revealRules,\n };\n template.privacyPolicy = {\n allowedRequestHeaders: selectedEndpoint.headers,\n allowedResponseBodyJsonPaths,\n allowedResponseReveals: allowedResponseReveals.map((reveal) => ({ ...reveal })),\n };\n template.tlsIdentityPolicy.expectedSni = expectedSni;\n template.tlsIdentityPolicy.tlsTrustStorePolicy = 'web-pki-os-roots-no-user-roots';\n template.tlsIdentityPolicy.userRootsAllowed = false;\n template.tlsIdentityPolicy.spkiSha256B64Pins = pins;\n template.templateGovernance = {\n policyHash,\n fixtureSetHash,\n governancePolicyVersion,\n };\n return template;\n}\n\nexport function withProviderSpkiPins(\n providerTemplate: SatyaProviderTemplate,\n pins: readonly string[]\n): SatyaProviderTemplate {\n return {\n ...cloneJson(providerTemplate),\n tlsIdentityPolicy: {\n ...providerTemplate.tlsIdentityPolicy,\n spkiSha256B64Pins: pins.map((pin) => pin.trim()).filter(Boolean),\n },\n };\n}\n\nfunction readProviderLogin(\n value: Record<string, unknown>,\n source: string\n): Record<string, unknown> {\n if (isRecord(value.login)) return value.login;\n throw satyaError(SatyaErrorCode.PROVIDER_TEMPLATE_INVALID, `${source}.login must be an object`);\n}\n\nfunction validateProviderInjection(\n value: Record<string, unknown>,\n source: string\n): SatyaProviderInjection | null | undefined {\n const raw = value.injection;\n if (raw === undefined) return undefined;\n if (raw === null) return null;\n\n const scripts = Array.isArray(raw) ? raw : [raw];\n if (scripts.length === 0) {\n throw satyaError(\n SatyaErrorCode.PROVIDER_TEMPLATE_INVALID,\n `${source}.injection must not be an empty array`\n );\n }\n const normalized = scripts.map((script, index) => {\n if (typeof script !== 'string' || !script.trim()) {\n throw satyaError(\n SatyaErrorCode.PROVIDER_TEMPLATE_INVALID,\n `${source}.injection[${index}] must be a non-empty string`\n );\n }\n const trimmed = script.trim();\n return trimmed;\n });\n return Array.isArray(raw) ? normalized : normalized[0];\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  export declare const EXPO_SATYA_ATTEST_SDK_NAME: "@burnt-labs/expo-satya-attest";
2
- export declare const EXPO_SATYA_ATTEST_SDK_VERSION: "1.3.0";
2
+ export declare const EXPO_SATYA_ATTEST_SDK_VERSION: "1.4.0";
3
3
  //# sourceMappingURL=sdkMetadata.generated.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // Generated by internal/module_scripts/sync-sdk-metadata.js.
2
2
  export const EXPO_SATYA_ATTEST_SDK_NAME = '@burnt-labs/expo-satya-attest';
3
- export const EXPO_SATYA_ATTEST_SDK_VERSION = '1.3.0';
3
+ export const EXPO_SATYA_ATTEST_SDK_VERSION = '1.4.0';
4
4
  //# sourceMappingURL=sdkMetadata.generated.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdkMetadata.generated.js","sourceRoot":"","sources":["../src/sdkMetadata.generated.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,+BAAwC,CAAC;AACnF,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAgB,CAAC","sourcesContent":["// Generated by internal/module_scripts/sync-sdk-metadata.js.\nexport const EXPO_SATYA_ATTEST_SDK_NAME = '@burnt-labs/expo-satya-attest' as const;\nexport const EXPO_SATYA_ATTEST_SDK_VERSION = '1.3.0' as const;\n"]}
1
+ {"version":3,"file":"sdkMetadata.generated.js","sourceRoot":"","sources":["../src/sdkMetadata.generated.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,+BAAwC,CAAC;AACnF,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAgB,CAAC","sourcesContent":["// Generated by internal/module_scripts/sync-sdk-metadata.js.\nexport const EXPO_SATYA_ATTEST_SDK_NAME = '@burnt-labs/expo-satya-attest' as const;\nexport const EXPO_SATYA_ATTEST_SDK_VERSION = '1.4.0' as const;\n"]}
@@ -60,6 +60,7 @@ export interface SatyaProviderTemplate {
60
60
  description?: string;
61
61
  displayName?: string;
62
62
  version?: string;
63
+ requiresLocation?: boolean;
63
64
  target?: {
64
65
  scheme: 'https';
65
66
  host: string;
@@ -1 +1 @@
1
- {"version":3,"file":"provider.types.d.ts","sourceRoot":"","sources":["../../src/types/provider.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.types.d.ts","sourceRoot":"","sources":["../../src/types/provider.types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.types.js","sourceRoot":"","sources":["../../src/types/provider.types.ts"],"names":[],"mappings":"","sourcesContent":["export interface SatyaProviderEndpointRef {\n id: string;\n method: string;\n url: string;\n responseType?: string;\n}\n\nexport interface SatyaProviderRef {\n label: string;\n description: string;\n providerId: string;\n iconUrl?: string;\n endpoints?: SatyaProviderEndpointRef[];\n}\n\nexport type SatyaProviderInjection = string | string[];\n\nexport interface ResponseRevealRule {\n alias: string;\n type: 'json' | 'regex' | 'jsonRegex';\n path?: string;\n pattern?: string;\n group?: number | string;\n}\n\nexport interface SatyaProviderLogin {\n url: string;\n [key: string]: unknown;\n}\n\nexport interface SatyaProviderEndpointCapture {\n trigger?: boolean;\n headers?: Record<string, string>;\n nativeReplayHeaders?: Record<string, string>;\n requestBody?: string;\n landingUrl?: string;\n pollMs?: number;\n maxAttempts?: number;\n requireLoginSignal?: boolean;\n [key: string]: unknown;\n}\n\nexport interface SatyaProviderEndpoint {\n id: string;\n url: string;\n method: string;\n headers: string[];\n responseType: string;\n requestMatchRules: Record<string, unknown>[];\n revealRules: Record<string, unknown>[];\n capture?: SatyaProviderEndpointCapture;\n replayCapturedUrl?: boolean;\n htmlCaptureBodyPattern?: string;\n [key: string]: unknown;\n}\n\nexport interface SatyaProviderTemplate {\n schemaVersion: string;\n providerId: string;\n name: string;\n iconUrl?: string;\n login: SatyaProviderLogin;\n auth?: Record<string, unknown>;\n endpoints: SatyaProviderEndpoint[];\n selectedEndpointId?: string;\n label?: string;\n description?: string;\n displayName?: string;\n version?: string;\n target?: {\n scheme: 'https';\n host: string;\n port: number;\n };\n webLogin?: {\n startUrl: string;\n callbackUrl?: string;\n oauthHosts?: string[];\n };\n userAgent?: {\n ios?: string | null;\n android?: string | null;\n } | null;\n injection?: SatyaProviderInjection | null;\n proofTarget?: {\n method: string;\n url: string;\n requestMatchRules: Record<string, unknown>[];\n revealRules: Record<string, unknown>[];\n [key: string]: unknown;\n };\n privacyPolicy?: {\n allowedRequestHeaders: string[];\n allowedResponseBodyJsonPaths: string[];\n allowedResponseReveals?: ResponseRevealRule[];\n };\n tlsPolicy?: {\n requireTls13: boolean;\n allowZeroRtt: boolean;\n allowResumption: boolean;\n allowKeyUpdate: boolean;\n preferredCipher: string;\n maxSentBytes: number;\n maxRecvBytes: number;\n };\n tlsIdentityPolicy: {\n expectedSni: string;\n allowedAlpn?: string[];\n spkiSha256Hex?: string | null;\n spkiSha256B64Pins?: string[];\n tlsTrustStorePolicy?: 'web-pki-os-roots-no-user-roots';\n userRootsAllowed?: false;\n redirectPolicyId?: string;\n };\n templateGovernance: {\n policyHash: string;\n fixtureSetHash?: string;\n governancePolicyVersion?: string;\n };\n [key: string]: unknown;\n}\n\nexport interface SatyaProviderPolicy {\n providerId: string;\n host: string;\n policyHash: string;\n spkiSha256B64Pins: string[];\n}\n\nexport interface CapturedProviderRequest {\n url: string;\n method: string;\n headers: Record<string, string>;\n body?: string | null;\n}\n\nexport interface CapturedProviderResponse {\n url: string;\n status: number;\n headers: Record<string, string>;\n body?: string | null;\n}\n\nexport interface NativeReplayTlsEvidence {\n serverCertChainSha256Hex: string;\n sni: string;\n alpn: string;\n tlsVersion: string;\n tlsTrustStorePolicy: 'web-pki-os-roots-no-user-roots';\n userRootsAllowed: false;\n matchedSpkiSha256B64?: string | null;\n expectedSpkiPinsB64: string[];\n}\n\nexport interface NativeReplayClaim {\n name: string;\n sourcePath: string;\n value: unknown;\n}\n\nexport interface NativeReplayObservation {\n providerId: string;\n policyHash: string;\n host: string;\n method: string;\n pathAndQuery: string;\n statusCode: number;\n finalUrl: string;\n contentType?: string | null;\n contentEncoding?: string | null;\n responseSha256Hex: string;\n claims: NativeReplayClaim[];\n tlsEvidence: NativeReplayTlsEvidence;\n}\n"]}
1
+ {"version":3,"file":"provider.types.js","sourceRoot":"","sources":["../../src/types/provider.types.ts"],"names":[],"mappings":"","sourcesContent":["export interface SatyaProviderEndpointRef {\n id: string;\n method: string;\n url: string;\n responseType?: string;\n}\n\nexport interface SatyaProviderRef {\n label: string;\n description: string;\n providerId: string;\n iconUrl?: string;\n endpoints?: SatyaProviderEndpointRef[];\n}\n\nexport type SatyaProviderInjection = string | string[];\n\nexport interface ResponseRevealRule {\n alias: string;\n type: 'json' | 'regex' | 'jsonRegex';\n path?: string;\n pattern?: string;\n group?: number | string;\n}\n\nexport interface SatyaProviderLogin {\n url: string;\n [key: string]: unknown;\n}\n\nexport interface SatyaProviderEndpointCapture {\n trigger?: boolean;\n headers?: Record<string, string>;\n nativeReplayHeaders?: Record<string, string>;\n requestBody?: string;\n landingUrl?: string;\n pollMs?: number;\n maxAttempts?: number;\n requireLoginSignal?: boolean;\n [key: string]: unknown;\n}\n\nexport interface SatyaProviderEndpoint {\n id: string;\n url: string;\n method: string;\n headers: string[];\n responseType: string;\n requestMatchRules: Record<string, unknown>[];\n revealRules: Record<string, unknown>[];\n capture?: SatyaProviderEndpointCapture;\n replayCapturedUrl?: boolean;\n htmlCaptureBodyPattern?: string;\n [key: string]: unknown;\n}\n\nexport interface SatyaProviderTemplate {\n schemaVersion: string;\n providerId: string;\n name: string;\n iconUrl?: string;\n login: SatyaProviderLogin;\n auth?: Record<string, unknown>;\n endpoints: SatyaProviderEndpoint[];\n selectedEndpointId?: string;\n label?: string;\n description?: string;\n displayName?: string;\n version?: string;\n requiresLocation?: boolean;\n target?: {\n scheme: 'https';\n host: string;\n port: number;\n };\n webLogin?: {\n startUrl: string;\n callbackUrl?: string;\n oauthHosts?: string[];\n };\n userAgent?: {\n ios?: string | null;\n android?: string | null;\n } | null;\n injection?: SatyaProviderInjection | null;\n proofTarget?: {\n method: string;\n url: string;\n requestMatchRules: Record<string, unknown>[];\n revealRules: Record<string, unknown>[];\n [key: string]: unknown;\n };\n privacyPolicy?: {\n allowedRequestHeaders: string[];\n allowedResponseBodyJsonPaths: string[];\n allowedResponseReveals?: ResponseRevealRule[];\n };\n tlsPolicy?: {\n requireTls13: boolean;\n allowZeroRtt: boolean;\n allowResumption: boolean;\n allowKeyUpdate: boolean;\n preferredCipher: string;\n maxSentBytes: number;\n maxRecvBytes: number;\n };\n tlsIdentityPolicy: {\n expectedSni: string;\n allowedAlpn?: string[];\n spkiSha256Hex?: string | null;\n spkiSha256B64Pins?: string[];\n tlsTrustStorePolicy?: 'web-pki-os-roots-no-user-roots';\n userRootsAllowed?: false;\n redirectPolicyId?: string;\n };\n templateGovernance: {\n policyHash: string;\n fixtureSetHash?: string;\n governancePolicyVersion?: string;\n };\n [key: string]: unknown;\n}\n\nexport interface SatyaProviderPolicy {\n providerId: string;\n host: string;\n policyHash: string;\n spkiSha256B64Pins: string[];\n}\n\nexport interface CapturedProviderRequest {\n url: string;\n method: string;\n headers: Record<string, string>;\n body?: string | null;\n}\n\nexport interface CapturedProviderResponse {\n url: string;\n status: number;\n headers: Record<string, string>;\n body?: string | null;\n}\n\nexport interface NativeReplayTlsEvidence {\n serverCertChainSha256Hex: string;\n sni: string;\n alpn: string;\n tlsVersion: string;\n tlsTrustStorePolicy: 'web-pki-os-roots-no-user-roots';\n userRootsAllowed: false;\n matchedSpkiSha256B64?: string | null;\n expectedSpkiPinsB64: string[];\n}\n\nexport interface NativeReplayClaim {\n name: string;\n sourcePath: string;\n value: unknown;\n}\n\nexport interface NativeReplayObservation {\n providerId: string;\n policyHash: string;\n host: string;\n method: string;\n pathAndQuery: string;\n statusCode: number;\n finalUrl: string;\n contentType?: string | null;\n contentEncoding?: string | null;\n responseSha256Hex: string;\n claims: NativeReplayClaim[];\n tlsEvidence: NativeReplayTlsEvidence;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  Pod::Spec.new do |s|
2
2
  s.name = 'SatyaAttest'
3
- s.version = '1.3.0'
3
+ s.version = '1.4.0'
4
4
  s.summary = 'SATYA-W mobile TLS app-attestation (App Attest + Secure Enclave) backed by the Rust satya-sdk core'
5
5
  s.description = 'Expo native module wrapping the Rust satya-ffi XCFramework and layering iOS App Attest + Secure Enclave platform attestation.'
6
6
  s.author = 'Justin'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burnt-labs/expo-satya-attest",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "SATYA-W mobile TLS app-attestation (App Attest + Secure Enclave / Play Integrity) backed by the Rust satya-sdk core",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -335,6 +335,7 @@ function ProviderSheetContent({ flow, insets }: ProviderSheetContentProps) {
335
335
  {ResolvedWebView && resolved ? (
336
336
  <ResolvedWebView
337
337
  {...(webViewProps ?? {})}
338
+ geolocationEnabled={!!resolved.template.requiresLocation}
338
339
  ref={webRef}
339
340
  source={{
340
341
  uri: mainDocumentScriptReady
@@ -422,6 +423,7 @@ function ProviderSheetContent({ flow, insets }: ProviderSheetContentProps) {
422
423
  <View style={styles.webViewHost}>
423
424
  <ResolvedWebView
424
425
  {...(webViewProps ?? {})}
426
+ geolocationEnabled={!!resolved.template.requiresLocation}
425
427
  ref={popupRef}
426
428
  key={managedPopupKey(managedPopup)}
427
429
  source={
@@ -103,6 +103,7 @@ export function validateProviderTemplate(
103
103
  template.label = name;
104
104
  template.displayName = name;
105
105
  template.version = version;
106
+ template.requiresLocation = value.requiresLocation === true;
106
107
  if (iconUrl) template.iconUrl = iconUrl;
107
108
  template.login = {
108
109
  ...cloneJson(login),
@@ -1,3 +1,3 @@
1
1
  // Generated by internal/module_scripts/sync-sdk-metadata.js.
2
2
  export const EXPO_SATYA_ATTEST_SDK_NAME = '@burnt-labs/expo-satya-attest' as const;
3
- export const EXPO_SATYA_ATTEST_SDK_VERSION = '1.3.0' as const;
3
+ export const EXPO_SATYA_ATTEST_SDK_VERSION = '1.4.0' as const;
@@ -67,6 +67,7 @@ export interface SatyaProviderTemplate {
67
67
  description?: string;
68
68
  displayName?: string;
69
69
  version?: string;
70
+ requiresLocation?: boolean;
70
71
  target?: {
71
72
  scheme: 'https';
72
73
  host: string;