@oxyhq/services 22.13.1 → 23.0.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/README.md +1 -1
- package/lib/commonjs/ui/boot/runProviderColdBoot.js +20 -64
- package/lib/commonjs/ui/boot/runProviderColdBoot.js.map +1 -1
- package/lib/commonjs/ui/components/AvatarCameraBadge.js +3 -2
- package/lib/commonjs/ui/components/AvatarCameraBadge.js.map +1 -1
- package/lib/commonjs/ui/components/OxyProvider.js +5 -6
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/ProfileButton.js +4 -3
- package/lib/commonjs/ui/components/ProfileButton.js.map +1 -1
- package/lib/commonjs/ui/components/SettingsIcon.js +3 -2
- package/lib/commonjs/ui/components/SettingsIcon.js.map +1 -1
- package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js +7 -7
- package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js.map +1 -1
- package/lib/commonjs/ui/components/authChooser/primitives.js +5 -4
- package/lib/commonjs/ui/components/authChooser/primitives.js.map +1 -1
- package/lib/commonjs/ui/components/authChooser/requestSurfaces.js +2 -2
- package/lib/commonjs/ui/components/authChooser/requestSurfaces.js.map +1 -1
- package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js +3 -2
- package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js.map +1 -1
- package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js +3 -2
- package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
- package/lib/commonjs/ui/components/fileManagement/FileViewer.js +15 -14
- package/lib/commonjs/ui/components/fileManagement/FileViewer.js.map +1 -1
- package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +6 -5
- package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
- package/lib/commonjs/ui/components/modals/DeleteAccountModal.js +3 -2
- package/lib/commonjs/ui/components/modals/DeleteAccountModal.js.map +1 -1
- package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +6 -6
- package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -1
- package/lib/commonjs/ui/components/payment/PaymentMethodStep.js +5 -5
- package/lib/commonjs/ui/components/payment/PaymentMethodStep.js.map +1 -1
- package/lib/commonjs/ui/components/payment/PaymentReviewStep.js +10 -9
- package/lib/commonjs/ui/components/payment/PaymentReviewStep.js.map +1 -1
- package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js +4 -3
- package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js.map +1 -1
- package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js +6 -5
- package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js.map +1 -1
- package/lib/commonjs/ui/components/styles/shadow.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +14 -45
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/context/commitSessionFlow.js +0 -43
- package/lib/commonjs/ui/context/commitSessionFlow.js.map +1 -1
- package/lib/commonjs/ui/context/useOxyAccountGraph.js +3 -4
- package/lib/commonjs/ui/context/useOxyAccountGraph.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/userCache.js +17 -17
- package/lib/commonjs/ui/hooks/queries/userCache.js.map +1 -1
- package/lib/commonjs/ui/hooks/useAssets.js.map +1 -1
- package/lib/commonjs/ui/hooks/useAuth.js +4 -2
- package/lib/commonjs/ui/hooks/useAuth.js.map +1 -1
- package/lib/commonjs/ui/hooks/useOnlineStatus.js +3 -2
- package/lib/commonjs/ui/hooks/useOnlineStatus.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSessionManagement.js +0 -2
- package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountMembersScreen.js +4 -3
- package/lib/commonjs/ui/screens/AccountMembersScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/ConnectedAppsScreen.js +1 -1
- package/lib/commonjs/ui/screens/ConnectedAppsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/CreateAccountScreen.js +7 -6
- package/lib/commonjs/ui/screens/CreateAccountScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +4 -3
- package/lib/commonjs/ui/screens/EditProfileFieldScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FAQScreen.js +3 -2
- package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FeedbackScreen.js +96 -96
- package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FileManagementScreen.js +19 -18
- package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/HistoryViewScreen.js +4 -29
- package/lib/commonjs/ui/screens/HistoryViewScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +4 -3
- package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/ManageAccountScreen.js +2 -2
- package/lib/commonjs/ui/screens/ManageAccountScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +3 -3
- package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +10 -9
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +1 -0
- package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/ProfileScreen.js +12 -13
- package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/UserListScreen.js +4 -4
- package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +6 -6
- package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/fileManagement/FileLibraryError.js +4 -3
- package/lib/commonjs/ui/screens/fileManagement/FileLibraryError.js.map +1 -1
- package/lib/commonjs/ui/screens/fileManagement/FileListSection.js +4 -3
- package/lib/commonjs/ui/screens/fileManagement/FileListSection.js.map +1 -1
- package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js +5 -7
- package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
- package/lib/commonjs/ui/screens/fileManagement/UploadBar.js +3 -2
- package/lib/commonjs/ui/screens/fileManagement/UploadBar.js.map +1 -1
- package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js +3 -2
- package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js +5 -4
- package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js +4 -3
- package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
- package/lib/commonjs/ui/utils/fileManagement.js +24 -24
- package/lib/commonjs/ui/utils/fileManagement.js.map +1 -1
- package/lib/commonjs/ui/utils/netConnectivity.js +28 -0
- package/lib/commonjs/ui/utils/netConnectivity.js.map +1 -0
- package/lib/commonjs/ui/utils/oauthReturn.js +15 -28
- package/lib/commonjs/ui/utils/oauthReturn.js.map +1 -1
- package/lib/module/ui/boot/runProviderColdBoot.js +21 -65
- package/lib/module/ui/boot/runProviderColdBoot.js.map +1 -1
- package/lib/module/ui/components/AvatarCameraBadge.js +1 -1
- package/lib/module/ui/components/AvatarCameraBadge.js.map +1 -1
- package/lib/module/ui/components/OxyProvider.js +5 -6
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/ProfileButton.js +1 -1
- package/lib/module/ui/components/ProfileButton.js.map +1 -1
- package/lib/module/ui/components/SettingsIcon.js +1 -1
- package/lib/module/ui/components/SettingsIcon.js.map +1 -1
- package/lib/module/ui/components/authChooser/AccountsMenuView.js +1 -1
- package/lib/module/ui/components/authChooser/AccountsMenuView.js.map +1 -1
- package/lib/module/ui/components/authChooser/primitives.js +1 -1
- package/lib/module/ui/components/authChooser/primitives.js.map +1 -1
- package/lib/module/ui/components/authChooser/requestSurfaces.js +1 -1
- package/lib/module/ui/components/authChooser/requestSurfaces.js.map +1 -1
- package/lib/module/ui/components/fileManagement/AnimatedButton.js +1 -1
- package/lib/module/ui/components/fileManagement/AnimatedButton.js.map +1 -1
- package/lib/module/ui/components/fileManagement/FileDetailsModal.js +1 -1
- package/lib/module/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
- package/lib/module/ui/components/fileManagement/FileViewer.js +1 -1
- package/lib/module/ui/components/fileManagement/FileViewer.js.map +1 -1
- package/lib/module/ui/components/fileManagement/UploadPreview.js +1 -1
- package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
- package/lib/module/ui/components/modals/DeleteAccountModal.js +1 -1
- package/lib/module/ui/components/modals/DeleteAccountModal.js.map +1 -1
- package/lib/module/ui/components/payment/PaymentDetailsStep.js +1 -1
- package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -1
- package/lib/module/ui/components/payment/PaymentMethodStep.js +1 -1
- package/lib/module/ui/components/payment/PaymentMethodStep.js.map +1 -1
- package/lib/module/ui/components/payment/PaymentReviewStep.js +1 -1
- package/lib/module/ui/components/payment/PaymentReviewStep.js.map +1 -1
- package/lib/module/ui/components/payment/PaymentSuccessStep.js +1 -1
- package/lib/module/ui/components/payment/PaymentSuccessStep.js.map +1 -1
- package/lib/module/ui/components/payment/PaymentSummaryStep.js +1 -1
- package/lib/module/ui/components/payment/PaymentSummaryStep.js.map +1 -1
- package/lib/module/ui/components/styles/shadow.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +16 -47
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/context/commitSessionFlow.js +0 -42
- package/lib/module/ui/context/commitSessionFlow.js.map +1 -1
- package/lib/module/ui/context/useOxyAccountGraph.js +3 -4
- package/lib/module/ui/context/useOxyAccountGraph.js.map +1 -1
- package/lib/module/ui/hooks/queries/userCache.js +17 -17
- package/lib/module/ui/hooks/queries/userCache.js.map +1 -1
- package/lib/module/ui/hooks/useAssets.js.map +1 -1
- package/lib/module/ui/hooks/useAuth.js +4 -2
- package/lib/module/ui/hooks/useAuth.js.map +1 -1
- package/lib/module/ui/hooks/useOnlineStatus.js +3 -2
- package/lib/module/ui/hooks/useOnlineStatus.js.map +1 -1
- package/lib/module/ui/hooks/useSessionManagement.js +0 -2
- package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/module/ui/screens/AccountMembersScreen.js +1 -1
- package/lib/module/ui/screens/AccountMembersScreen.js.map +1 -1
- package/lib/module/ui/screens/ConnectedAppsScreen.js +1 -1
- package/lib/module/ui/screens/ConnectedAppsScreen.js.map +1 -1
- package/lib/module/ui/screens/CreateAccountScreen.js +1 -1
- package/lib/module/ui/screens/CreateAccountScreen.js.map +1 -1
- package/lib/module/ui/screens/EditProfileFieldScreen.js +1 -1
- package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
- package/lib/module/ui/screens/FAQScreen.js +1 -1
- package/lib/module/ui/screens/FAQScreen.js.map +1 -1
- package/lib/module/ui/screens/FeedbackScreen.js +91 -90
- package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/module/ui/screens/FileManagementScreen.js +2 -1
- package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/module/ui/screens/HistoryViewScreen.js +4 -29
- package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
- package/lib/module/ui/screens/LanguageSelectorScreen.js +1 -1
- package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
- package/lib/module/ui/screens/ManageAccountScreen.js +1 -1
- package/lib/module/ui/screens/ManageAccountScreen.js.map +1 -1
- package/lib/module/ui/screens/PaymentGatewayScreen.js +1 -1
- package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js +2 -2
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
- package/lib/module/ui/screens/PrivacySettingsScreen.js +1 -0
- package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/ProfileScreen.js +4 -5
- package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/module/ui/screens/UserListScreen.js +3 -3
- package/lib/module/ui/screens/UserListScreen.js.map +1 -1
- package/lib/module/ui/screens/WelcomeNewUserScreen.js +5 -6
- package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
- package/lib/module/ui/screens/fileManagement/FileLibraryError.js +1 -1
- package/lib/module/ui/screens/fileManagement/FileLibraryError.js.map +1 -1
- package/lib/module/ui/screens/fileManagement/FileListSection.js +1 -1
- package/lib/module/ui/screens/fileManagement/FileListSection.js.map +1 -1
- package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js +3 -5
- package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
- package/lib/module/ui/screens/fileManagement/UploadBar.js +1 -1
- package/lib/module/ui/screens/fileManagement/UploadBar.js.map +1 -1
- package/lib/module/ui/screens/trust/TrustCenterScreen.js +1 -1
- package/lib/module/ui/screens/trust/TrustCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js +3 -3
- package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
- package/lib/module/ui/screens/trust/TrustRewardsScreen.js +1 -1
- package/lib/module/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
- package/lib/module/ui/utils/fileManagement.js +25 -25
- package/lib/module/ui/utils/fileManagement.js.map +1 -1
- package/lib/module/ui/utils/netConnectivity.js +23 -0
- package/lib/module/ui/utils/netConnectivity.js.map +1 -0
- package/lib/module/ui/utils/oauthReturn.js +15 -27
- package/lib/module/ui/utils/oauthReturn.js.map +1 -1
- package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts +11 -30
- package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/SettingsIcon.d.ts +1 -1
- package/lib/typescript/commonjs/ui/components/SettingsIcon.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/authChooser/requestSurfaces.d.ts +1 -1
- package/lib/typescript/commonjs/ui/components/authChooser/requestSurfaces.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/payment/types.d.ts +6 -6
- package/lib/typescript/commonjs/ui/components/payment/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts +0 -40
- package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts +4 -7
- package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts +0 -1
- package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/queries/userCache.d.ts +2 -2
- package/lib/typescript/commonjs/ui/hooks/queries/userCache.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useAssets.d.ts +1 -1
- package/lib/typescript/commonjs/ui/hooks/useAssets.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useAsyncAction.d.ts +2 -2
- package/lib/typescript/commonjs/ui/hooks/useAsyncAction.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts +4 -2
- package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useOnlineStatus.d.ts +3 -2
- package/lib/typescript/commonjs/ui/hooks/useOnlineStatus.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts +2 -2
- package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/FileManagementScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/HistoryViewScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/ProfileScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/types/navigation.d.ts +20 -19
- package/lib/typescript/commonjs/ui/types/navigation.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts +5 -5
- package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/netConnectivity.d.ts +17 -0
- package/lib/typescript/commonjs/ui/utils/netConnectivity.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts +15 -12
- package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts.map +1 -1
- package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts +11 -30
- package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/SettingsIcon.d.ts +1 -1
- package/lib/typescript/module/ui/components/SettingsIcon.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/authChooser/requestSurfaces.d.ts +1 -1
- package/lib/typescript/module/ui/components/authChooser/requestSurfaces.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/payment/types.d.ts +6 -6
- package/lib/typescript/module/ui/components/payment/types.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/commitSessionFlow.d.ts +0 -40
- package/lib/typescript/module/ui/context/commitSessionFlow.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/oxyContextTypes.d.ts +4 -7
- package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts +0 -1
- package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/queries/userCache.d.ts +2 -2
- package/lib/typescript/module/ui/hooks/queries/userCache.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useAssets.d.ts +1 -1
- package/lib/typescript/module/ui/hooks/useAssets.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useAsyncAction.d.ts +2 -2
- package/lib/typescript/module/ui/hooks/useAsyncAction.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useAuth.d.ts +4 -2
- package/lib/typescript/module/ui/hooks/useAuth.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useOnlineStatus.d.ts +3 -2
- package/lib/typescript/module/ui/hooks/useOnlineStatus.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts +2 -2
- package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/FileManagementScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/HistoryViewScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/ProfileScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/types/navigation.d.ts +20 -19
- package/lib/typescript/module/ui/types/navigation.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/fileManagement.d.ts +5 -5
- package/lib/typescript/module/ui/utils/fileManagement.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/netConnectivity.d.ts +17 -0
- package/lib/typescript/module/ui/utils/netConnectivity.d.ts.map +1 -0
- package/lib/typescript/module/ui/utils/oauthReturn.d.ts +15 -12
- package/lib/typescript/module/ui/utils/oauthReturn.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/ui/boot/__tests__/coldBootNoIdpRedirect.test.ts +215 -0
- package/src/ui/boot/runProviderColdBoot.ts +24 -101
- package/src/ui/components/AvatarCameraBadge.tsx +1 -1
- package/src/ui/components/OxyProvider.tsx +5 -6
- package/src/ui/components/ProfileButton.tsx +1 -1
- package/src/ui/components/SettingsIcon.tsx +1 -1
- package/src/ui/components/authChooser/AccountsMenuView.tsx +1 -1
- package/src/ui/components/authChooser/primitives.tsx +1 -1
- package/src/ui/components/authChooser/requestSurfaces.tsx +1 -1
- package/src/ui/components/fileManagement/AnimatedButton.tsx +1 -1
- package/src/ui/components/fileManagement/FileDetailsModal.tsx +1 -1
- package/src/ui/components/fileManagement/FileViewer.tsx +1 -1
- package/src/ui/components/fileManagement/UploadPreview.tsx +1 -1
- package/src/ui/components/modals/DeleteAccountModal.tsx +1 -1
- package/src/ui/components/payment/PaymentDetailsStep.tsx +1 -1
- package/src/ui/components/payment/PaymentMethodStep.tsx +1 -1
- package/src/ui/components/payment/PaymentReviewStep.tsx +1 -1
- package/src/ui/components/payment/PaymentSuccessStep.tsx +1 -1
- package/src/ui/components/payment/PaymentSummaryStep.tsx +1 -1
- package/src/ui/components/payment/types.ts +24 -24
- package/src/ui/components/styles/shadow.tsx +2 -2
- package/src/ui/context/OxyContext.tsx +15 -46
- package/src/ui/context/__tests__/commitSessionFlow.test.ts +0 -89
- package/src/ui/context/commitSessionFlow.ts +0 -61
- package/src/ui/context/oxyContextTypes.ts +4 -7
- package/src/ui/context/useOxyAccountGraph.ts +4 -4
- package/src/ui/hooks/queries/userCache.ts +169 -148
- package/src/ui/hooks/useAssets.ts +1 -1
- package/src/ui/hooks/useAsyncAction.ts +2 -2
- package/src/ui/hooks/useAuth.ts +4 -2
- package/src/ui/hooks/useOnlineStatus.ts +3 -2
- package/src/ui/hooks/useSessionManagement.ts +0 -2
- package/src/ui/screens/AccountMembersScreen.tsx +1 -1
- package/src/ui/screens/ConnectedAppsScreen.tsx +1 -1
- package/src/ui/screens/CreateAccountScreen.tsx +1 -1
- package/src/ui/screens/EditProfileFieldScreen.tsx +1 -1
- package/src/ui/screens/FAQScreen.tsx +1 -1
- package/src/ui/screens/FeedbackScreen.tsx +740 -574
- package/src/ui/screens/FileManagementScreen.tsx +2 -1
- package/src/ui/screens/HistoryViewScreen.tsx +4 -19
- package/src/ui/screens/LanguageSelectorScreen.tsx +1 -1
- package/src/ui/screens/ManageAccountScreen.tsx +1 -1
- package/src/ui/screens/PaymentGatewayScreen.tsx +1 -1
- package/src/ui/screens/PremiumSubscriptionScreen.tsx +2 -2
- package/src/ui/screens/PrivacySettingsScreen.tsx +1 -0
- package/src/ui/screens/ProfileScreen.tsx +6 -4
- package/src/ui/screens/UserListScreen.tsx +3 -3
- package/src/ui/screens/WelcomeNewUserScreen.tsx +6 -6
- package/src/ui/screens/fileManagement/FileLibraryError.tsx +1 -1
- package/src/ui/screens/fileManagement/FileListSection.tsx +1 -1
- package/src/ui/screens/fileManagement/PhotoPickerSection.tsx +3 -2
- package/src/ui/screens/fileManagement/UploadBar.tsx +1 -1
- package/src/ui/screens/trust/TrustCenterScreen.tsx +1 -1
- package/src/ui/screens/trust/TrustLeaderboardScreen.tsx +4 -3
- package/src/ui/screens/trust/TrustRewardsScreen.tsx +1 -1
- package/src/ui/types/navigation.ts +20 -19
- package/src/ui/utils/fileManagement.ts +108 -92
- package/src/ui/utils/netConnectivity.ts +27 -0
- package/src/ui/utils/oauthReturn.ts +15 -30
- package/lib/commonjs/ui/oauth/legacyRedirectLanes.js +0 -48
- package/lib/commonjs/ui/oauth/legacyRedirectLanes.js.map +0 -1
- package/lib/commonjs/ui/utils/crossOriginRestore.js +0 -140
- package/lib/commonjs/ui/utils/crossOriginRestore.js.map +0 -1
- package/lib/module/ui/oauth/legacyRedirectLanes.js +0 -44
- package/lib/module/ui/oauth/legacyRedirectLanes.js.map +0 -1
- package/lib/module/ui/utils/crossOriginRestore.js +0 -131
- package/lib/module/ui/utils/crossOriginRestore.js.map +0 -1
- package/lib/typescript/commonjs/ui/oauth/legacyRedirectLanes.d.ts +0 -40
- package/lib/typescript/commonjs/ui/oauth/legacyRedirectLanes.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/utils/crossOriginRestore.d.ts +0 -43
- package/lib/typescript/commonjs/ui/utils/crossOriginRestore.d.ts.map +0 -1
- package/lib/typescript/module/ui/oauth/legacyRedirectLanes.d.ts +0 -40
- package/lib/typescript/module/ui/oauth/legacyRedirectLanes.d.ts.map +0 -1
- package/lib/typescript/module/ui/utils/crossOriginRestore.d.ts +0 -43
- package/lib/typescript/module/ui/utils/crossOriginRestore.d.ts.map +0 -1
- package/src/ui/boot/__tests__/coldBootWebAuthMode.test.ts +0 -281
- package/src/ui/oauth/legacyRedirectLanes.ts +0 -43
- package/src/ui/utils/__tests__/crossOriginRestore.test.ts +0 -160
- package/src/ui/utils/crossOriginRestore.ts +0 -168
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import { buildOAuthAuthorizeUrl, generateOAuthState, generatePkcePair, isIdpHubOrigin, isLoopbackOrigin, isOfficialWebOrigin, OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY, OXY_SILENT_OAUTH_ATTEMPTED_KEY, clearOAuthHandshake, persistOAuthHandshake, canonicalizeOAuthRedirectUri, logger } from '@oxyhq/core';
|
|
4
|
-
import { isWebBrowser } from "./isWebBrowser.js";
|
|
5
|
-
import { replaceUrlAfterOAuthReturn } from "./oauthReturn.js";
|
|
6
|
-
import { redirectToAuthorize } from "../components/oauthNavigation.js";
|
|
7
|
-
function sessionStore() {
|
|
8
|
-
return globalThis.sessionStorage;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/** True when this tab already attempted cross-origin silent OAuth restore. */
|
|
12
|
-
export function isCrossOriginRestoreBlocked() {
|
|
13
|
-
const store = sessionStore();
|
|
14
|
-
if (!store) return false;
|
|
15
|
-
return Boolean(store.getItem(OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY) || store.getItem(OXY_SILENT_OAUTH_ATTEMPTED_KEY));
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/** Mark restore as attempted — never auto-retry until sign-out clears guards. */
|
|
19
|
-
export function markCrossOriginRestoreAttempted() {
|
|
20
|
-
const store = sessionStore();
|
|
21
|
-
if (!store) return;
|
|
22
|
-
store.setItem(OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY, '1');
|
|
23
|
-
store.setItem(OXY_SILENT_OAUTH_ATTEMPTED_KEY, '1');
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** Clear all cross-origin restore loop guards (call on sign-out). */
|
|
27
|
-
export function clearCrossOriginRestoreGuards() {
|
|
28
|
-
const store = sessionStore();
|
|
29
|
-
if (!store) return;
|
|
30
|
-
for (const key of [OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY, OXY_SILENT_OAUTH_ATTEMPTED_KEY]) {
|
|
31
|
-
store.removeItem(key);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Whether cold boot should attempt silent cross-origin OAuth restore for the
|
|
37
|
-
* given web origin.
|
|
38
|
-
*
|
|
39
|
-
* Mirrors the hub-sync WRITE gate (`syncHubAfterSignIn`): only OFFICIAL Oxy web
|
|
40
|
-
* origins participate in cross-app SSO — a random third-party / preview origin
|
|
41
|
-
* must never have its tab bounced to the IdP. Additionally, loopback / local-dev
|
|
42
|
-
* origins are EXCLUDED here even though {@link isOfficialWebOrigin} treats them
|
|
43
|
-
* as official: a developer's local app must never be redirected to a hosted IdP
|
|
44
|
-
* on cold boot (it signs in through the in-app dialog instead). The central IdP
|
|
45
|
-
* hub's own origin is excluded to avoid a wasteful self-hop.
|
|
46
|
-
*/
|
|
47
|
-
export function isSilentRestoreEligibleOrigin(origin) {
|
|
48
|
-
if (isLoopbackOrigin(origin)) return false;
|
|
49
|
-
if (isIdpHubOrigin()) return false;
|
|
50
|
-
return isOfficialWebOrigin(origin);
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Top-level redirect to auth.oxy.so/authorize with `prompt=none` for silent
|
|
54
|
-
* cross-origin session restore on all web apps (official + third-party).
|
|
55
|
-
*/
|
|
56
|
-
export async function maybeStartSilentOAuthRestore(opts) {
|
|
57
|
-
if (!isWebBrowser()) return false;
|
|
58
|
-
const location = globalThis.location;
|
|
59
|
-
if (!location) return false;
|
|
60
|
-
|
|
61
|
-
// Defense-in-depth: never bounce a loopback / non-official / IdP-hub origin to
|
|
62
|
-
// a hosted authorize endpoint (the caller gates on this too).
|
|
63
|
-
if (!isSilentRestoreEligibleOrigin(location.origin)) {
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
if (isCrossOriginRestoreBlocked()) {
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
const params = new URLSearchParams(location.search);
|
|
70
|
-
if (params.has('code') || params.has('error')) {
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
try {
|
|
74
|
-
const {
|
|
75
|
-
codeVerifier,
|
|
76
|
-
codeChallenge
|
|
77
|
-
} = await generatePkcePair();
|
|
78
|
-
const state = await generateOAuthState();
|
|
79
|
-
const redirectUri = canonicalizeOAuthRedirectUri(opts.redirectUri ?? location.origin);
|
|
80
|
-
if (!persistOAuthHandshake(state, codeVerifier, redirectUri)) {
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
const authorizeUrl = buildOAuthAuthorizeUrl({
|
|
84
|
-
authorizeBaseUrl: opts.authorizeBaseUrl,
|
|
85
|
-
clientId: opts.clientId,
|
|
86
|
-
redirectUri,
|
|
87
|
-
state,
|
|
88
|
-
codeChallenge,
|
|
89
|
-
scope: opts.scope,
|
|
90
|
-
prompt: 'none'
|
|
91
|
-
});
|
|
92
|
-
markCrossOriginRestoreAttempted();
|
|
93
|
-
redirectToAuthorize(authorizeUrl);
|
|
94
|
-
return true;
|
|
95
|
-
} catch (error) {
|
|
96
|
-
logger.warn('Silent OAuth restore skipped', {
|
|
97
|
-
component: 'crossOriginRestore'
|
|
98
|
-
}, error);
|
|
99
|
-
return false;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* When the RP lands with OAuth error params from a silent authorize attempt,
|
|
105
|
-
* strip them and return whether the error was terminal for silent restore.
|
|
106
|
-
*/
|
|
107
|
-
export function consumeSilentOAuthError() {
|
|
108
|
-
if (!isWebBrowser()) return null;
|
|
109
|
-
const location = globalThis.location;
|
|
110
|
-
const history = globalThis.history;
|
|
111
|
-
if (!location) return null;
|
|
112
|
-
const params = new URLSearchParams(location.search);
|
|
113
|
-
const error = params.get('error');
|
|
114
|
-
if (error !== 'login_required' && error !== 'consent_required') {
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
markCrossOriginRestoreAttempted();
|
|
118
|
-
if (history?.replaceState) {
|
|
119
|
-
const url = new URL(location.href);
|
|
120
|
-
url.searchParams.delete('error');
|
|
121
|
-
url.searchParams.delete('error_description');
|
|
122
|
-
url.searchParams.delete('state');
|
|
123
|
-
// Silent restore failed, but the visitor still asked for a specific page.
|
|
124
|
-
// Put them back on it rather than leaving them on the bare origin the IdP
|
|
125
|
-
// redirected to.
|
|
126
|
-
replaceUrlAfterOAuthReturn(`${url.pathname}${url.search}${url.hash}`);
|
|
127
|
-
}
|
|
128
|
-
clearOAuthHandshake();
|
|
129
|
-
return error;
|
|
130
|
-
}
|
|
131
|
-
//# sourceMappingURL=crossOriginRestore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["buildOAuthAuthorizeUrl","generateOAuthState","generatePkcePair","isIdpHubOrigin","isLoopbackOrigin","isOfficialWebOrigin","OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY","OXY_SILENT_OAUTH_ATTEMPTED_KEY","clearOAuthHandshake","persistOAuthHandshake","canonicalizeOAuthRedirectUri","logger","isWebBrowser","replaceUrlAfterOAuthReturn","redirectToAuthorize","sessionStore","globalThis","sessionStorage","isCrossOriginRestoreBlocked","store","Boolean","getItem","markCrossOriginRestoreAttempted","setItem","clearCrossOriginRestoreGuards","key","removeItem","isSilentRestoreEligibleOrigin","origin","maybeStartSilentOAuthRestore","opts","location","params","URLSearchParams","search","has","codeVerifier","codeChallenge","state","redirectUri","authorizeUrl","authorizeBaseUrl","clientId","scope","prompt","error","warn","component","consumeSilentOAuthError","history","get","replaceState","url","URL","href","searchParams","delete","pathname","hash"],"sourceRoot":"../../../../src","sources":["ui/utils/crossOriginRestore.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The legacy, redirect-mode-only lanes that navigate the RP's TOP-LEVEL window
|
|
3
|
-
* to the IdP without a user gesture.
|
|
4
|
-
*
|
|
5
|
-
* `webAuthMode: 'popup'` exists to guarantee exactly one thing: the relying
|
|
6
|
-
* party never leaves its route. Two mechanics in this SDK break that guarantee,
|
|
7
|
-
* because each replaces the whole document on its own initiative:
|
|
8
|
-
*
|
|
9
|
-
* 1. **Cold-boot silent restore** — a full-page `prompt=none` authorize bounce
|
|
10
|
-
* to `auth.oxy.so` when the device-secret mint finds no local session
|
|
11
|
-
* (`maybeStartSilentOAuthRestore`, called from `runProviderColdBoot`).
|
|
12
|
-
* 2. **Post-sign-in hub sync** — a full-page hop to `auth.oxy.so/sync` that
|
|
13
|
-
* plants this device's credential on the IdP hub so OTHER origins can later
|
|
14
|
-
* run lane 1 (`syncHubAfterSignIn`, called from the `commitSession` funnel).
|
|
15
|
-
*
|
|
16
|
-
* Both belong to the redirect transport and are kept only for the migration
|
|
17
|
-
* window (issue #691, "Cold boot and cross-domain behavior"). In popup mode a
|
|
18
|
-
* domain with no local credential simply resolves SIGNED OUT, and the user's
|
|
19
|
-
* next explicit "Continue with Oxy" opens the popup — from a real user gesture,
|
|
20
|
-
* never automatically.
|
|
21
|
-
*
|
|
22
|
-
* NOT covered here, and correctly enabled in BOTH modes: navigations the user
|
|
23
|
-
* asked for. When the browser blocks the popup, `startWebOAuthSignIn` still
|
|
24
|
-
* falls back to a full-page redirect rather than dead-ending the sign-in, and
|
|
25
|
-
* `tryCompleteOAuthReturn` still consumes a `?code=` that is already on the URL.
|
|
26
|
-
*
|
|
27
|
-
* PHASE 7b: once the pilot flips the default transport to `'popup'`, this
|
|
28
|
-
* predicate and BOTH lanes above are deleted outright. Grepping this symbol
|
|
29
|
-
* finds every site that has to go.
|
|
30
|
-
*/
|
|
31
|
-
import type { WebAuthMode } from './types';
|
|
32
|
-
/**
|
|
33
|
-
* Whether a provider running `webAuthMode` may perform an SDK-initiated,
|
|
34
|
-
* non-gesture, full-page navigation to the IdP.
|
|
35
|
-
*
|
|
36
|
-
* `true` only for `'redirect'` — still the default and the compatibility path,
|
|
37
|
-
* whose behaviour must stay byte-for-byte unchanged.
|
|
38
|
-
*/
|
|
39
|
-
export declare function allowsAutomaticIdpRedirect(webAuthMode: WebAuthMode): boolean;
|
|
40
|
-
//# sourceMappingURL=legacyRedirectLanes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"legacyRedirectLanes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/oauth/legacyRedirectLanes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAE5E"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { OxyServices } from '@oxyhq/core';
|
|
2
|
-
/** True when this tab already attempted cross-origin silent OAuth restore. */
|
|
3
|
-
export declare function isCrossOriginRestoreBlocked(): boolean;
|
|
4
|
-
/** Mark restore as attempted — never auto-retry until sign-out clears guards. */
|
|
5
|
-
export declare function markCrossOriginRestoreAttempted(): void;
|
|
6
|
-
/** Clear all cross-origin restore loop guards (call on sign-out). */
|
|
7
|
-
export declare function clearCrossOriginRestoreGuards(): void;
|
|
8
|
-
/**
|
|
9
|
-
* Whether cold boot should attempt silent cross-origin OAuth restore for the
|
|
10
|
-
* given web origin.
|
|
11
|
-
*
|
|
12
|
-
* Mirrors the hub-sync WRITE gate (`syncHubAfterSignIn`): only OFFICIAL Oxy web
|
|
13
|
-
* origins participate in cross-app SSO — a random third-party / preview origin
|
|
14
|
-
* must never have its tab bounced to the IdP. Additionally, loopback / local-dev
|
|
15
|
-
* origins are EXCLUDED here even though {@link isOfficialWebOrigin} treats them
|
|
16
|
-
* as official: a developer's local app must never be redirected to a hosted IdP
|
|
17
|
-
* on cold boot (it signs in through the in-app dialog instead). The central IdP
|
|
18
|
-
* hub's own origin is excluded to avoid a wasteful self-hop.
|
|
19
|
-
*/
|
|
20
|
-
export declare function isSilentRestoreEligibleOrigin(origin: string): boolean;
|
|
21
|
-
export interface SilentOAuthRestoreOptions {
|
|
22
|
-
oxyServices: OxyServices;
|
|
23
|
-
clientId: string;
|
|
24
|
-
redirectUri?: string;
|
|
25
|
-
scope?: string;
|
|
26
|
-
/**
|
|
27
|
-
* Authorize endpoint override (env-configurable per deployment). Defaults to
|
|
28
|
-
* the production Oxy IdP when unset, so a local/staging app points silent
|
|
29
|
-
* restore at its OWN IdP instead of production `auth.oxy.so`.
|
|
30
|
-
*/
|
|
31
|
-
authorizeBaseUrl?: string;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Top-level redirect to auth.oxy.so/authorize with `prompt=none` for silent
|
|
35
|
-
* cross-origin session restore on all web apps (official + third-party).
|
|
36
|
-
*/
|
|
37
|
-
export declare function maybeStartSilentOAuthRestore(opts: SilentOAuthRestoreOptions): Promise<boolean>;
|
|
38
|
-
/**
|
|
39
|
-
* When the RP lands with OAuth error params from a silent authorize attempt,
|
|
40
|
-
* strip them and return whether the error was terminal for silent restore.
|
|
41
|
-
*/
|
|
42
|
-
export declare function consumeSilentOAuthError(): 'login_required' | 'consent_required' | null;
|
|
43
|
-
//# sourceMappingURL=crossOriginRestore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crossOriginRestore.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/crossOriginRestore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAuB/C,8EAA8E;AAC9E,wBAAgB,2BAA2B,IAAI,OAAO,CAOrD;AAED,iFAAiF;AACjF,wBAAgB,+BAA+B,IAAI,IAAI,CAKtD;AAED,qEAAqE;AACrE,wBAAgB,6BAA6B,IAAI,IAAI,CAMpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAIrE;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAgDlB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,GAAG,kBAAkB,GAAG,IAAI,CA0BtF"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The legacy, redirect-mode-only lanes that navigate the RP's TOP-LEVEL window
|
|
3
|
-
* to the IdP without a user gesture.
|
|
4
|
-
*
|
|
5
|
-
* `webAuthMode: 'popup'` exists to guarantee exactly one thing: the relying
|
|
6
|
-
* party never leaves its route. Two mechanics in this SDK break that guarantee,
|
|
7
|
-
* because each replaces the whole document on its own initiative:
|
|
8
|
-
*
|
|
9
|
-
* 1. **Cold-boot silent restore** — a full-page `prompt=none` authorize bounce
|
|
10
|
-
* to `auth.oxy.so` when the device-secret mint finds no local session
|
|
11
|
-
* (`maybeStartSilentOAuthRestore`, called from `runProviderColdBoot`).
|
|
12
|
-
* 2. **Post-sign-in hub sync** — a full-page hop to `auth.oxy.so/sync` that
|
|
13
|
-
* plants this device's credential on the IdP hub so OTHER origins can later
|
|
14
|
-
* run lane 1 (`syncHubAfterSignIn`, called from the `commitSession` funnel).
|
|
15
|
-
*
|
|
16
|
-
* Both belong to the redirect transport and are kept only for the migration
|
|
17
|
-
* window (issue #691, "Cold boot and cross-domain behavior"). In popup mode a
|
|
18
|
-
* domain with no local credential simply resolves SIGNED OUT, and the user's
|
|
19
|
-
* next explicit "Continue with Oxy" opens the popup — from a real user gesture,
|
|
20
|
-
* never automatically.
|
|
21
|
-
*
|
|
22
|
-
* NOT covered here, and correctly enabled in BOTH modes: navigations the user
|
|
23
|
-
* asked for. When the browser blocks the popup, `startWebOAuthSignIn` still
|
|
24
|
-
* falls back to a full-page redirect rather than dead-ending the sign-in, and
|
|
25
|
-
* `tryCompleteOAuthReturn` still consumes a `?code=` that is already on the URL.
|
|
26
|
-
*
|
|
27
|
-
* PHASE 7b: once the pilot flips the default transport to `'popup'`, this
|
|
28
|
-
* predicate and BOTH lanes above are deleted outright. Grepping this symbol
|
|
29
|
-
* finds every site that has to go.
|
|
30
|
-
*/
|
|
31
|
-
import type { WebAuthMode } from './types.js';
|
|
32
|
-
/**
|
|
33
|
-
* Whether a provider running `webAuthMode` may perform an SDK-initiated,
|
|
34
|
-
* non-gesture, full-page navigation to the IdP.
|
|
35
|
-
*
|
|
36
|
-
* `true` only for `'redirect'` — still the default and the compatibility path,
|
|
37
|
-
* whose behaviour must stay byte-for-byte unchanged.
|
|
38
|
-
*/
|
|
39
|
-
export declare function allowsAutomaticIdpRedirect(webAuthMode: WebAuthMode): boolean;
|
|
40
|
-
//# sourceMappingURL=legacyRedirectLanes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"legacyRedirectLanes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/oauth/legacyRedirectLanes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAS,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAE5E"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { OxyServices } from '@oxyhq/core';
|
|
2
|
-
/** True when this tab already attempted cross-origin silent OAuth restore. */
|
|
3
|
-
export declare function isCrossOriginRestoreBlocked(): boolean;
|
|
4
|
-
/** Mark restore as attempted — never auto-retry until sign-out clears guards. */
|
|
5
|
-
export declare function markCrossOriginRestoreAttempted(): void;
|
|
6
|
-
/** Clear all cross-origin restore loop guards (call on sign-out). */
|
|
7
|
-
export declare function clearCrossOriginRestoreGuards(): void;
|
|
8
|
-
/**
|
|
9
|
-
* Whether cold boot should attempt silent cross-origin OAuth restore for the
|
|
10
|
-
* given web origin.
|
|
11
|
-
*
|
|
12
|
-
* Mirrors the hub-sync WRITE gate (`syncHubAfterSignIn`): only OFFICIAL Oxy web
|
|
13
|
-
* origins participate in cross-app SSO — a random third-party / preview origin
|
|
14
|
-
* must never have its tab bounced to the IdP. Additionally, loopback / local-dev
|
|
15
|
-
* origins are EXCLUDED here even though {@link isOfficialWebOrigin} treats them
|
|
16
|
-
* as official: a developer's local app must never be redirected to a hosted IdP
|
|
17
|
-
* on cold boot (it signs in through the in-app dialog instead). The central IdP
|
|
18
|
-
* hub's own origin is excluded to avoid a wasteful self-hop.
|
|
19
|
-
*/
|
|
20
|
-
export declare function isSilentRestoreEligibleOrigin(origin: string): boolean;
|
|
21
|
-
export interface SilentOAuthRestoreOptions {
|
|
22
|
-
oxyServices: OxyServices;
|
|
23
|
-
clientId: string;
|
|
24
|
-
redirectUri?: string;
|
|
25
|
-
scope?: string;
|
|
26
|
-
/**
|
|
27
|
-
* Authorize endpoint override (env-configurable per deployment). Defaults to
|
|
28
|
-
* the production Oxy IdP when unset, so a local/staging app points silent
|
|
29
|
-
* restore at its OWN IdP instead of production `auth.oxy.so`.
|
|
30
|
-
*/
|
|
31
|
-
authorizeBaseUrl?: string;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Top-level redirect to auth.oxy.so/authorize with `prompt=none` for silent
|
|
35
|
-
* cross-origin session restore on all web apps (official + third-party).
|
|
36
|
-
*/
|
|
37
|
-
export declare function maybeStartSilentOAuthRestore(opts: SilentOAuthRestoreOptions): Promise<boolean>;
|
|
38
|
-
/**
|
|
39
|
-
* When the RP lands with OAuth error params from a silent authorize attempt,
|
|
40
|
-
* strip them and return whether the error was terminal for silent restore.
|
|
41
|
-
*/
|
|
42
|
-
export declare function consumeSilentOAuthError(): 'login_required' | 'consent_required' | null;
|
|
43
|
-
//# sourceMappingURL=crossOriginRestore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crossOriginRestore.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/crossOriginRestore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAuB/C,8EAA8E;AAC9E,wBAAgB,2BAA2B,IAAI,OAAO,CAOrD;AAED,iFAAiF;AACjF,wBAAgB,+BAA+B,IAAI,IAAI,CAKtD;AAED,qEAAqE;AACrE,wBAAgB,6BAA6B,IAAI,IAAI,CAMpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAIrE;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAgDlB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,GAAG,kBAAkB,GAAG,IAAI,CA0BtF"}
|
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `runProviderColdBoot` — the `webAuthMode` transport gate (#691 phase 7).
|
|
3
|
-
*
|
|
4
|
-
* `webAuthMode: 'popup'` must never let the boot navigate the RP's top-level
|
|
5
|
-
* window: no silent `prompt=none` restore, no authorize redirect, a signed-out
|
|
6
|
-
* domain simply resolves signed out. `'redirect'` — still the default and the
|
|
7
|
-
* compatibility path — must behave exactly as before.
|
|
8
|
-
*
|
|
9
|
-
* Unlike `__tests__/boot/runProviderColdBoot.test.ts` (deadline + connectivity
|
|
10
|
-
* wiring, with `crossOriginRestore` stubbed out), this suite keeps the restore
|
|
11
|
-
* lane REAL so the redirect-mode assertions reach the actual navigation
|
|
12
|
-
* primitive — the thing popup mode has to suppress.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import type { AuthStateStore, PersistedAuthState, SessionClient } from '@oxyhq/core';
|
|
16
|
-
|
|
17
|
-
// Only `runSessionColdBoot` and the origin-CLASSIFICATION predicates are faked.
|
|
18
|
-
// jsdom's `location` is non-configurable, so origin eligibility has to be driven
|
|
19
|
-
// through the predicates (their real behaviour is covered by core's own tests);
|
|
20
|
-
// everything else in core (PKCE, authorize-URL builder, handshake store) stays
|
|
21
|
-
// real so the redirect-mode lane is exercised end to end.
|
|
22
|
-
jest.mock('@oxyhq/core', () => {
|
|
23
|
-
const actual = jest.requireActual('@oxyhq/core');
|
|
24
|
-
return {
|
|
25
|
-
__esModule: true,
|
|
26
|
-
...actual,
|
|
27
|
-
runSessionColdBoot: jest.fn(),
|
|
28
|
-
isLoopbackOrigin: jest.fn(() => false),
|
|
29
|
-
isOfficialWebOrigin: jest.fn(() => true),
|
|
30
|
-
isIdpHubOrigin: jest.fn(() => false),
|
|
31
|
-
};
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
// The ONLY top-level-window navigation primitive either lane can reach.
|
|
35
|
-
jest.mock('../../components/oauthNavigation', () => ({
|
|
36
|
-
redirectToAuthorize: jest.fn(),
|
|
37
|
-
}));
|
|
38
|
-
|
|
39
|
-
// Spied but REAL: redirect mode must still perform the actual restore.
|
|
40
|
-
jest.mock('../../utils/crossOriginRestore', () => {
|
|
41
|
-
const actual = jest.requireActual('../../utils/crossOriginRestore');
|
|
42
|
-
return {
|
|
43
|
-
__esModule: true,
|
|
44
|
-
...actual,
|
|
45
|
-
maybeStartSilentOAuthRestore: jest.fn(actual.maybeStartSilentOAuthRestore),
|
|
46
|
-
consumeSilentOAuthError: jest.fn(actual.consumeSilentOAuthError),
|
|
47
|
-
};
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
jest.mock('../../utils/oauthReturn', () => {
|
|
51
|
-
const actual = jest.requireActual('../../utils/oauthReturn');
|
|
52
|
-
return {
|
|
53
|
-
__esModule: true,
|
|
54
|
-
...actual,
|
|
55
|
-
tryCompleteOAuthReturn: jest.fn(async () => false),
|
|
56
|
-
consumeHubSyncFailure: jest.fn(actual.consumeHubSyncFailure),
|
|
57
|
-
};
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
import { runSessionColdBoot } from '@oxyhq/core';
|
|
61
|
-
import { redirectToAuthorize } from '../../components/oauthNavigation';
|
|
62
|
-
import {
|
|
63
|
-
clearCrossOriginRestoreGuards,
|
|
64
|
-
consumeSilentOAuthError,
|
|
65
|
-
maybeStartSilentOAuthRestore,
|
|
66
|
-
} from '../../utils/crossOriginRestore';
|
|
67
|
-
import { consumeHubSyncFailure, tryCompleteOAuthReturn } from '../../utils/oauthReturn';
|
|
68
|
-
import { runProviderColdBoot, type RunProviderColdBootOptions } from '../runProviderColdBoot';
|
|
69
|
-
|
|
70
|
-
const mockRunSessionColdBoot = runSessionColdBoot as jest.Mock;
|
|
71
|
-
const mockRedirectToAuthorize = redirectToAuthorize as jest.Mock;
|
|
72
|
-
const mockSilentRestore = maybeStartSilentOAuthRestore as jest.Mock;
|
|
73
|
-
const mockConsumeSilentOAuthError = consumeSilentOAuthError as jest.Mock;
|
|
74
|
-
const mockConsumeHubSyncFailure = consumeHubSyncFailure as jest.Mock;
|
|
75
|
-
const mockTryCompleteOAuthReturn = tryCompleteOAuthReturn as jest.Mock;
|
|
76
|
-
|
|
77
|
-
const CLIENT_ID = 'oxy_dk_test';
|
|
78
|
-
|
|
79
|
-
/** An auth store holding no device credential — the signed-out domain case. */
|
|
80
|
-
function makeEmptyAuthStore(): AuthStateStore {
|
|
81
|
-
return {
|
|
82
|
-
load: jest.fn(async (): Promise<PersistedAuthState | null> => null),
|
|
83
|
-
save: jest.fn(async () => undefined),
|
|
84
|
-
clear: jest.fn(async () => undefined),
|
|
85
|
-
} as unknown as AuthStateStore;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
interface Harness {
|
|
89
|
-
options: RunProviderColdBootOptions;
|
|
90
|
-
commitSession: jest.Mock;
|
|
91
|
-
markAuthResolved: jest.Mock;
|
|
92
|
-
setTokenReady: jest.Mock;
|
|
93
|
-
sessionClientStart: jest.Mock;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function makeHarness(overrides: Partial<RunProviderColdBootOptions> = {}): Harness {
|
|
97
|
-
const commitSession = jest.fn(async () => undefined);
|
|
98
|
-
const markAuthResolved = jest.fn();
|
|
99
|
-
const setTokenReady = jest.fn();
|
|
100
|
-
const sessionClientStart = jest.fn(async () => undefined);
|
|
101
|
-
|
|
102
|
-
const options: RunProviderColdBootOptions = {
|
|
103
|
-
oxyServices: {} as RunProviderColdBootOptions['oxyServices'],
|
|
104
|
-
authStore: makeEmptyAuthStore(),
|
|
105
|
-
clientId: CLIENT_ID,
|
|
106
|
-
sessionClient: { start: sessionClientStart } as unknown as SessionClient,
|
|
107
|
-
syncDeviceCredentialToHost: jest.fn(async () => undefined),
|
|
108
|
-
commitSession,
|
|
109
|
-
markAuthResolved,
|
|
110
|
-
setTokenReady,
|
|
111
|
-
...overrides,
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
return { options, commitSession, markAuthResolved, setTokenReady, sessionClientStart };
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/** `runSessionColdBoot` finding no session at all — the signed-out domain. */
|
|
118
|
-
function stubSignedOutBoot(): void {
|
|
119
|
-
mockRunSessionColdBoot.mockImplementation(async (opts: Parameters<typeof runSessionColdBoot>[0]) => {
|
|
120
|
-
await opts.onSignedOut?.('no_session');
|
|
121
|
-
return { kind: 'unauthenticated' } as const;
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
describe('runProviderColdBoot — webAuthMode transport gate (#691 phase 7)', () => {
|
|
126
|
-
beforeEach(() => {
|
|
127
|
-
mockRunSessionColdBoot.mockReset();
|
|
128
|
-
mockRedirectToAuthorize.mockClear();
|
|
129
|
-
mockSilentRestore.mockClear();
|
|
130
|
-
mockConsumeSilentOAuthError.mockClear();
|
|
131
|
-
mockConsumeHubSyncFailure.mockClear();
|
|
132
|
-
mockTryCompleteOAuthReturn.mockClear();
|
|
133
|
-
mockTryCompleteOAuthReturn.mockImplementation(async () => false);
|
|
134
|
-
globalThis.sessionStorage?.clear();
|
|
135
|
-
clearCrossOriginRestoreGuards();
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
describe("webAuthMode: 'popup'", () => {
|
|
139
|
-
it('never starts the silent restore and never navigates the top-level window', async () => {
|
|
140
|
-
stubSignedOutBoot();
|
|
141
|
-
const { options } = makeHarness({ webAuthMode: 'popup' });
|
|
142
|
-
|
|
143
|
-
await runProviderColdBoot(options);
|
|
144
|
-
|
|
145
|
-
expect(mockSilentRestore).not.toHaveBeenCalled();
|
|
146
|
-
expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it('resolves a domain with no local credential SIGNED OUT instead of bouncing', async () => {
|
|
150
|
-
stubSignedOutBoot();
|
|
151
|
-
const { options, markAuthResolved, commitSession, sessionClientStart } = makeHarness({
|
|
152
|
-
webAuthMode: 'popup',
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
await runProviderColdBoot(options);
|
|
156
|
-
|
|
157
|
-
// Auth resolution concluded (routing can settle), nothing was committed,
|
|
158
|
-
// and with no persisted credential the device socket is not started.
|
|
159
|
-
expect(markAuthResolved).toHaveBeenCalled();
|
|
160
|
-
expect(commitSession).not.toHaveBeenCalled();
|
|
161
|
-
expect(sessionClientStart).not.toHaveBeenCalled();
|
|
162
|
-
expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it('still completes an authorization code already on the URL (blocked-popup fallback)', async () => {
|
|
166
|
-
// A popup-mode app lands here whenever the browser blocked the popup and
|
|
167
|
-
// `startWebOAuthSignIn` fell back to a full-page redirect.
|
|
168
|
-
mockTryCompleteOAuthReturn.mockImplementation(async () => true);
|
|
169
|
-
const { options, markAuthResolved, setTokenReady } = makeHarness({ webAuthMode: 'popup' });
|
|
170
|
-
|
|
171
|
-
await runProviderColdBoot(options);
|
|
172
|
-
|
|
173
|
-
expect(mockTryCompleteOAuthReturn).toHaveBeenCalledTimes(1);
|
|
174
|
-
expect(setTokenReady).toHaveBeenLastCalledWith(true);
|
|
175
|
-
expect(markAuthResolved).toHaveBeenCalled();
|
|
176
|
-
// The device mint is short-circuited by the completed return leg.
|
|
177
|
-
expect(mockRunSessionColdBoot).not.toHaveBeenCalled();
|
|
178
|
-
expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
it('commits the OAuth return WITHOUT hub sync', async () => {
|
|
182
|
-
mockTryCompleteOAuthReturn.mockImplementation(async () => true);
|
|
183
|
-
const { options } = makeHarness({ webAuthMode: 'popup' });
|
|
184
|
-
|
|
185
|
-
await runProviderColdBoot(options);
|
|
186
|
-
|
|
187
|
-
const commit = mockTryCompleteOAuthReturn.mock.calls[0][0] as {
|
|
188
|
-
commitSession: (input: unknown) => Promise<void>;
|
|
189
|
-
};
|
|
190
|
-
await commit.commitSession({ sessionId: 's1', userId: 'u1' });
|
|
191
|
-
expect(options.commitSession).toHaveBeenCalledWith(
|
|
192
|
-
{ sessionId: 's1', userId: 'u1' },
|
|
193
|
-
{ activate: true, hubSync: false },
|
|
194
|
-
);
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
describe("webAuthMode: 'redirect' (unchanged compatibility path)", () => {
|
|
199
|
-
it('starts the silent restore and navigates to the IdP with prompt=none', async () => {
|
|
200
|
-
stubSignedOutBoot();
|
|
201
|
-
const { options } = makeHarness({ webAuthMode: 'redirect' });
|
|
202
|
-
|
|
203
|
-
await runProviderColdBoot(options);
|
|
204
|
-
|
|
205
|
-
expect(mockSilentRestore).toHaveBeenCalledTimes(1);
|
|
206
|
-
expect(mockRedirectToAuthorize).toHaveBeenCalledTimes(1);
|
|
207
|
-
const url = new URL(mockRedirectToAuthorize.mock.calls[0][0] as string);
|
|
208
|
-
expect(url.origin + url.pathname).toBe('https://auth.oxy.so/authorize');
|
|
209
|
-
expect(url.searchParams.get('client_id')).toBe(CLIENT_ID);
|
|
210
|
-
expect(url.searchParams.get('prompt')).toBe('none');
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
it('is the DEFAULT when no webAuthMode is supplied', async () => {
|
|
214
|
-
stubSignedOutBoot();
|
|
215
|
-
const { options } = makeHarness();
|
|
216
|
-
|
|
217
|
-
await runProviderColdBoot(options);
|
|
218
|
-
|
|
219
|
-
expect(mockSilentRestore).toHaveBeenCalledTimes(1);
|
|
220
|
-
expect(mockRedirectToAuthorize).toHaveBeenCalledTimes(1);
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
it('does NOT restore when the mint already resolved a session', async () => {
|
|
224
|
-
mockRunSessionColdBoot.mockImplementation(async (opts: Parameters<typeof runSessionColdBoot>[0]) => {
|
|
225
|
-
const session = { sessionId: 's1', userId: 'u1', accessToken: 'at', via: 'device-secret-mint' };
|
|
226
|
-
await opts.onSession?.(session);
|
|
227
|
-
return { kind: 'session', via: session.via, session } as const;
|
|
228
|
-
});
|
|
229
|
-
const { options, commitSession } = makeHarness({ webAuthMode: 'redirect' });
|
|
230
|
-
|
|
231
|
-
await runProviderColdBoot(options);
|
|
232
|
-
|
|
233
|
-
expect(commitSession).toHaveBeenCalledWith(
|
|
234
|
-
{ sessionId: 's1', accessToken: 'at', userId: 'u1' },
|
|
235
|
-
{ activate: false },
|
|
236
|
-
);
|
|
237
|
-
expect(mockSilentRestore).not.toHaveBeenCalled();
|
|
238
|
-
expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
|
|
239
|
-
});
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
describe('URL-cleanup consumers run in BOTH modes', () => {
|
|
243
|
-
it.each(['popup', 'redirect'] as const)(
|
|
244
|
-
'consumes the silent-OAuth error and hub-sync failure params (%s)',
|
|
245
|
-
async (webAuthMode) => {
|
|
246
|
-
stubSignedOutBoot();
|
|
247
|
-
const { options } = makeHarness({ webAuthMode });
|
|
248
|
-
|
|
249
|
-
await runProviderColdBoot(options);
|
|
250
|
-
|
|
251
|
-
expect(mockConsumeSilentOAuthError).toHaveBeenCalledTimes(1);
|
|
252
|
-
expect(mockConsumeHubSyncFailure).toHaveBeenCalledTimes(1);
|
|
253
|
-
},
|
|
254
|
-
);
|
|
255
|
-
|
|
256
|
-
it.each(['popup', 'redirect'] as const)(
|
|
257
|
-
'consumes an authorization code left on the URL (%s)',
|
|
258
|
-
async (webAuthMode) => {
|
|
259
|
-
stubSignedOutBoot();
|
|
260
|
-
const { options } = makeHarness({ webAuthMode });
|
|
261
|
-
|
|
262
|
-
await runProviderColdBoot(options);
|
|
263
|
-
|
|
264
|
-
expect(mockTryCompleteOAuthReturn).toHaveBeenCalledTimes(1);
|
|
265
|
-
},
|
|
266
|
-
);
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
describe('identity mode still skips both web OAuth lanes in either transport', () => {
|
|
270
|
-
it.each(['popup', 'redirect'] as const)('skips the return leg and the restore (%s)', async (webAuthMode) => {
|
|
271
|
-
stubSignedOutBoot();
|
|
272
|
-
const { options } = makeHarness({ webAuthMode, sessionMode: 'identity' });
|
|
273
|
-
|
|
274
|
-
await runProviderColdBoot(options);
|
|
275
|
-
|
|
276
|
-
expect(mockTryCompleteOAuthReturn).not.toHaveBeenCalled();
|
|
277
|
-
expect(mockSilentRestore).not.toHaveBeenCalled();
|
|
278
|
-
expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
|
|
279
|
-
});
|
|
280
|
-
});
|
|
281
|
-
});
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The legacy, redirect-mode-only lanes that navigate the RP's TOP-LEVEL window
|
|
3
|
-
* to the IdP without a user gesture.
|
|
4
|
-
*
|
|
5
|
-
* `webAuthMode: 'popup'` exists to guarantee exactly one thing: the relying
|
|
6
|
-
* party never leaves its route. Two mechanics in this SDK break that guarantee,
|
|
7
|
-
* because each replaces the whole document on its own initiative:
|
|
8
|
-
*
|
|
9
|
-
* 1. **Cold-boot silent restore** — a full-page `prompt=none` authorize bounce
|
|
10
|
-
* to `auth.oxy.so` when the device-secret mint finds no local session
|
|
11
|
-
* (`maybeStartSilentOAuthRestore`, called from `runProviderColdBoot`).
|
|
12
|
-
* 2. **Post-sign-in hub sync** — a full-page hop to `auth.oxy.so/sync` that
|
|
13
|
-
* plants this device's credential on the IdP hub so OTHER origins can later
|
|
14
|
-
* run lane 1 (`syncHubAfterSignIn`, called from the `commitSession` funnel).
|
|
15
|
-
*
|
|
16
|
-
* Both belong to the redirect transport and are kept only for the migration
|
|
17
|
-
* window (issue #691, "Cold boot and cross-domain behavior"). In popup mode a
|
|
18
|
-
* domain with no local credential simply resolves SIGNED OUT, and the user's
|
|
19
|
-
* next explicit "Continue with Oxy" opens the popup — from a real user gesture,
|
|
20
|
-
* never automatically.
|
|
21
|
-
*
|
|
22
|
-
* NOT covered here, and correctly enabled in BOTH modes: navigations the user
|
|
23
|
-
* asked for. When the browser blocks the popup, `startWebOAuthSignIn` still
|
|
24
|
-
* falls back to a full-page redirect rather than dead-ending the sign-in, and
|
|
25
|
-
* `tryCompleteOAuthReturn` still consumes a `?code=` that is already on the URL.
|
|
26
|
-
*
|
|
27
|
-
* PHASE 7b: once the pilot flips the default transport to `'popup'`, this
|
|
28
|
-
* predicate and BOTH lanes above are deleted outright. Grepping this symbol
|
|
29
|
-
* finds every site that has to go.
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
import type { WebAuthMode } from './types';
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Whether a provider running `webAuthMode` may perform an SDK-initiated,
|
|
36
|
-
* non-gesture, full-page navigation to the IdP.
|
|
37
|
-
*
|
|
38
|
-
* `true` only for `'redirect'` — still the default and the compatibility path,
|
|
39
|
-
* whose behaviour must stay byte-for-byte unchanged.
|
|
40
|
-
*/
|
|
41
|
-
export function allowsAutomaticIdpRedirect(webAuthMode: WebAuthMode): boolean {
|
|
42
|
-
return webAuthMode === 'redirect';
|
|
43
|
-
}
|