@bifold/core 2.4.6 → 2.5.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/lib/commonjs/contexts/reducers/store.js +3 -2
- package/lib/commonjs/contexts/reducers/store.js.map +1 -1
- package/lib/commonjs/index.js +119 -104
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/screens/AttemptLockout.js +27 -35
- package/lib/commonjs/screens/AttemptLockout.js.map +1 -1
- package/lib/commonjs/screens/MobileVerifierLoading.js +4 -3
- package/lib/commonjs/screens/MobileVerifierLoading.js.map +1 -1
- package/lib/commonjs/screens/PINCreate.js +3 -10
- package/lib/commonjs/screens/PINCreate.js.map +1 -1
- package/lib/commonjs/screens/WhatAreContacts.js +3 -2
- package/lib/commonjs/screens/WhatAreContacts.js.map +1 -1
- package/lib/module/contexts/reducers/store.js +3 -2
- package/lib/module/contexts/reducers/store.js.map +1 -1
- package/lib/module/index.js +42 -45
- package/lib/module/index.js.map +1 -1
- package/lib/module/screens/AttemptLockout.js +28 -36
- package/lib/module/screens/AttemptLockout.js.map +1 -1
- package/lib/module/screens/MobileVerifierLoading.js +4 -3
- package/lib/module/screens/MobileVerifierLoading.js.map +1 -1
- package/lib/module/screens/PINCreate.js +3 -10
- package/lib/module/screens/PINCreate.js.map +1 -1
- package/lib/module/screens/WhatAreContacts.js +3 -2
- package/lib/module/screens/WhatAreContacts.js.map +1 -1
- package/lib/typescript/src/contexts/reducers/store.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +57 -61
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/screens/AttemptLockout.d.ts.map +1 -1
- package/lib/typescript/src/screens/MobileVerifierLoading.d.ts.map +1 -1
- package/lib/typescript/src/screens/PINCreate.d.ts.map +1 -1
- package/lib/typescript/src/screens/WhatAreContacts.d.ts.map +1 -1
- package/package.json +3 -4
- package/src/App.tsx +0 -79
- package/src/animated-components.ts +0 -30
- package/src/assets/fonts/MaterialIcons.ttf +0 -0
- package/src/assets/icons/code.svg +0 -4
- package/src/assets/icons/large-arrow.svg +0 -5
- package/src/assets/icons/pencil.svg +0 -15
- package/src/assets/icons/trash.svg +0 -31
- package/src/assets/img/Artwork_1024x1024.png +0 -0
- package/src/assets/img/HistoryCardAcceptedIcon.svg +0 -4
- package/src/assets/img/HistoryCardExpiredIcon.svg +0 -4
- package/src/assets/img/HistoryCardRevokedIcon.svg +0 -4
- package/src/assets/img/HistoryInformationSentIcon.svg +0 -4
- package/src/assets/img/HistoryPinUpdatedIcon.svg +0 -4
- package/src/assets/img/IconChevronRight.svg +0 -5
- package/src/assets/img/activity-indicator-circle.svg +0 -90
- package/src/assets/img/app-lockout.svg +0 -1
- package/src/assets/img/biometrics.svg +0 -74
- package/src/assets/img/chat-loading.svg +0 -1
- package/src/assets/img/check-in-circle.svg +0 -18
- package/src/assets/img/connection-pending.svg +0 -112
- package/src/assets/img/contact-book.svg +0 -21
- package/src/assets/img/credential-card.svg +0 -18
- package/src/assets/img/credential-declined.svg +0 -28
- package/src/assets/img/credential-in-hand.svg +0 -48
- package/src/assets/img/credential-list.svg +0 -60
- package/src/assets/img/credential-pending.svg +0 -96
- package/src/assets/img/credential-success.svg +0 -48
- package/src/assets/img/delete-notification.svg +0 -1
- package/src/assets/img/empty-wallet.svg +0 -23
- package/src/assets/img/error-filled.svg +0 -12
- package/src/assets/img/exclamation-mark.svg +0 -17
- package/src/assets/img/home-center-img.svg +0 -71
- package/src/assets/img/icon-credential-offer-dark.svg +0 -7
- package/src/assets/img/icon-credential-offer-light.svg +0 -7
- package/src/assets/img/icon-info-recieved-dark.svg +0 -8
- package/src/assets/img/icon-info-recieved-light.svg +0 -8
- package/src/assets/img/icon-info-sent-dark.svg +0 -8
- package/src/assets/img/icon-info-sent-light.svg +0 -8
- package/src/assets/img/icon-proof-request-dark.svg +0 -11
- package/src/assets/img/icon-proof-request-light.svg +0 -11
- package/src/assets/img/information-received.svg +0 -1
- package/src/assets/img/logo-large.png +0 -0
- package/src/assets/img/logo-large@2x.png +0 -0
- package/src/assets/img/logo-large@3x.png +0 -0
- package/src/assets/img/logo.svg +0 -15
- package/src/assets/img/message-text-icon-outline.svg +0 -1
- package/src/assets/img/message-text-icon.svg +0 -1
- package/src/assets/img/no_information_shared.svg +0 -36
- package/src/assets/img/preface.svg +0 -15
- package/src/assets/img/proof-declined.svg +0 -66
- package/src/assets/img/proof-pending.svg +0 -61
- package/src/assets/img/proof-success.svg +0 -72
- package/src/assets/img/push-notifications.svg +0 -1
- package/src/assets/img/qrcode-scan-icon.svg +0 -1
- package/src/assets/img/scan-share.svg +0 -102
- package/src/assets/img/secure-check.svg +0 -4
- package/src/assets/img/secure-image.svg +0 -64
- package/src/assets/img/update-available.svg +0 -26
- package/src/assets/img/verifier-request-declined.svg +0 -34
- package/src/assets/img/wallet-back.svg +0 -20
- package/src/assets/img/wallet-front.svg +0 -32
- package/src/assets/img/wallet-icon-outline.svg +0 -1
- package/src/assets/img/wallet-icon.svg +0 -1
- package/src/assets/img/wallet.svg +0 -43
- package/src/assets/oca-bundles.json +0 -174
- package/src/components/animated/ButtonLoading.tsx +0 -32
- package/src/components/animated/ConnectionLoading.tsx +0 -53
- package/src/components/animated/CredentialAdded.tsx +0 -72
- package/src/components/animated/CredentialPending.tsx +0 -63
- package/src/components/animated/LoadingIndicator.tsx +0 -49
- package/src/components/animated/PresentationLoading.tsx +0 -52
- package/src/components/animated/RecordLoading.tsx +0 -75
- package/src/components/animated/SendingProof.tsx +0 -53
- package/src/components/animated/SentProof.tsx +0 -72
- package/src/components/buttons/Button-api.tsx +0 -46
- package/src/components/buttons/Button.tsx +0 -125
- package/src/components/buttons/HeaderHome.tsx +0 -25
- package/src/components/buttons/IconButton.tsx +0 -93
- package/src/components/buttons/InfoIcon.tsx +0 -35
- package/src/components/buttons/SettingsMenu.tsx +0 -26
- package/src/components/buttons/ToggleButton.tsx +0 -93
- package/src/components/buttons/index.ts +0 -4
- package/src/components/chat/ActionSlider.tsx +0 -104
- package/src/components/chat/ChatActions.tsx +0 -33
- package/src/components/chat/ChatBubble.tsx +0 -20
- package/src/components/chat/ChatEvent.tsx +0 -31
- package/src/components/chat/ChatMessage.tsx +0 -142
- package/src/components/chat/MessageInput.tsx +0 -46
- package/src/components/chat/index.ts +0 -4
- package/src/components/forms/WalletNameForm.tsx +0 -148
- package/src/components/index.ts +0 -4
- package/src/components/inputs/BiometryControl.tsx +0 -190
- package/src/components/inputs/BulletPoint.tsx +0 -32
- package/src/components/inputs/CheckBoxRow.tsx +0 -67
- package/src/components/inputs/InlineErrorText.tsx +0 -60
- package/src/components/inputs/LimitedTextInput.tsx +0 -71
- package/src/components/inputs/PINInput.tsx +0 -175
- package/src/components/inputs/SingleSelectBlock.tsx +0 -53
- package/src/components/listItems/ContactCredentialListItem.tsx +0 -79
- package/src/components/listItems/ContactListItem.tsx +0 -121
- package/src/components/listItems/NotificationListItem.tsx +0 -514
- package/src/components/misc/AvatarView.tsx +0 -33
- package/src/components/misc/CardWatermark.tsx +0 -52
- package/src/components/misc/ConnectionAlert.tsx +0 -123
- package/src/components/misc/ConnectionImage.tsx +0 -45
- package/src/components/misc/ContentGradient.tsx +0 -40
- package/src/components/misc/CredentialCard.tsx +0 -161
- package/src/components/misc/CredentialCard10.tsx +0 -329
- package/src/components/misc/CredentialCard11.tsx +0 -701
- package/src/components/misc/CredentialCard11ActionFooter.tsx +0 -55
- package/src/components/misc/CredentialCard11Issuer.tsx +0 -74
- package/src/components/misc/CredentialCard11Logo.tsx +0 -61
- package/src/components/misc/EmptyList.tsx +0 -27
- package/src/components/misc/EmptyListContacts.tsx +0 -55
- package/src/components/misc/ErrorBoundary.tsx +0 -200
- package/src/components/misc/FauxHeader.tsx +0 -75
- package/src/components/misc/InfoBox.tsx +0 -283
- package/src/components/misc/NoNewUpdates.tsx +0 -38
- package/src/components/misc/PINHeader.tsx +0 -25
- package/src/components/misc/PINValidationHelper.tsx +0 -48
- package/src/components/misc/Pagination.tsx +0 -114
- package/src/components/misc/QRRenderer.tsx +0 -53
- package/src/components/misc/QRScanner.tsx +0 -395
- package/src/components/misc/QRScannerTorch.tsx +0 -74
- package/src/components/misc/ScanCamera.tsx +0 -86
- package/src/components/misc/ScanTab.tsx +0 -45
- package/src/components/misc/SharedProofData.tsx +0 -98
- package/src/components/misc/UnorderedList.tsx +0 -28
- package/src/components/misc/VerifierCredentialCard.tsx +0 -378
- package/src/components/misc/index.ts +0 -2
- package/src/components/modals/AlertModal.tsx +0 -42
- package/src/components/modals/AppGuideModal.tsx +0 -142
- package/src/components/modals/CameraDisclosureModal.tsx +0 -126
- package/src/components/modals/CommonRemoveModal.tsx +0 -337
- package/src/components/modals/DeveloperModal.tsx +0 -32
- package/src/components/modals/DismissiblePopupModal.tsx +0 -169
- package/src/components/modals/ErrorModal.tsx +0 -107
- package/src/components/modals/ImageModal.tsx +0 -80
- package/src/components/modals/NetInfoModal.tsx +0 -35
- package/src/components/modals/PopupModal.tsx +0 -56
- package/src/components/modals/ProofCancelModal.tsx +0 -79
- package/src/components/modals/SafeAreaModal.tsx +0 -17
- package/src/components/record/Record.tsx +0 -100
- package/src/components/record/RecordBinaryField.tsx +0 -55
- package/src/components/record/RecordDateIntField.tsx +0 -63
- package/src/components/record/RecordField.tsx +0 -154
- package/src/components/record/RecordFooter.tsx +0 -17
- package/src/components/record/RecordHeader.tsx +0 -17
- package/src/components/record/RecordRemove.tsx +0 -66
- package/src/components/texts/HeaderTitle.tsx +0 -25
- package/src/components/texts/HighlightTextBox.tsx +0 -41
- package/src/components/texts/InfoTextBox.tsx +0 -129
- package/src/components/texts/Link.tsx +0 -41
- package/src/components/texts/Text.tsx +0 -21
- package/src/components/texts/ThemedText.tsx +0 -24
- package/src/components/toast/BaseToast.tsx +0 -128
- package/src/components/toast/ToastConfig.tsx +0 -21
- package/src/components/tour/AttachTourStep.tsx +0 -73
- package/src/components/tour/CredentialOfferTourSteps.tsx +0 -41
- package/src/components/tour/CredentialsTourSteps.tsx +0 -41
- package/src/components/tour/HomeTourSteps.tsx +0 -104
- package/src/components/tour/ProofRequestTourSteps.tsx +0 -41
- package/src/components/tour/SpotCutout.tsx +0 -65
- package/src/components/tour/TourBox.tsx +0 -255
- package/src/components/tour/TourOverlay.tsx +0 -134
- package/src/components/views/Banner.tsx +0 -181
- package/src/components/views/CredentialCardLogo.tsx +0 -77
- package/src/components/views/CredentialDetailPrimaryHeader.tsx +0 -107
- package/src/components/views/CredentialDetailSecondaryHeader.tsx +0 -60
- package/src/components/views/HeaderWithBanner.tsx +0 -17
- package/src/components/views/HomeFooterView.tsx +0 -110
- package/src/components/views/HomeHeaderView.tsx +0 -12
- package/src/components/views/KeyboardView.tsx +0 -41
- package/src/components/views/LoadingPlaceholder.tsx +0 -168
- package/src/components/views/LoadingView.tsx +0 -29
- package/src/components/views/ProgressBar.tsx +0 -53
- package/src/components/views/PushNotificationsContent.tsx +0 -51
- package/src/components/views/PushNotificationsDisabledContent.tsx +0 -47
- package/src/configs/ledgers/indy/index.ts +0 -8
- package/src/configs/ledgers/indy/ledgers.json +0 -51
- package/src/constants.ts +0 -107
- package/src/container-api.ts +0 -247
- package/src/container-impl.ts +0 -243
- package/src/contexts/activity.tsx +0 -145
- package/src/contexts/animated-components.ts +0 -9
- package/src/contexts/auth.tsx +0 -240
- package/src/contexts/index.ts +0 -3
- package/src/contexts/navigation.tsx +0 -19
- package/src/contexts/network.tsx +0 -125
- package/src/contexts/reducers/index.ts +0 -3
- package/src/contexts/reducers/store.ts +0 -754
- package/src/contexts/store.tsx +0 -103
- package/src/contexts/theme.tsx +0 -51
- package/src/contexts/tour/tour-context.tsx +0 -160
- package/src/contexts/tour/tour-provider.tsx +0 -160
- package/src/hooks/bundle-resolver.ts +0 -95
- package/src/hooks/chat-messages.tsx +0 -263
- package/src/hooks/connections.ts +0 -37
- package/src/hooks/credential-card-styles.ts +0 -144
- package/src/hooks/credentials.ts +0 -11
- package/src/hooks/deep-links.ts +0 -49
- package/src/hooks/developer-mode.ts +0 -25
- package/src/hooks/lockout.ts +0 -77
- package/src/hooks/notifications.ts +0 -108
- package/src/hooks/oob.ts +0 -17
- package/src/hooks/proof-request-templates.ts +0 -40
- package/src/hooks/proofs.ts +0 -32
- package/src/hooks/screen-capture.ts +0 -52
- package/src/hooks/useBifoldAgentSetup.ts +0 -169
- package/src/hooks/useOnboardingState.ts +0 -53
- package/src/hooks/usePINValidation.ts +0 -98
- package/src/index.ts +0 -239
- package/src/layout/ScreenLayout.tsx +0 -53
- package/src/localization/en/en.json +0 -951
- package/src/localization/en/index.ts +0 -3
- package/src/localization/fr/fr.json +0 -933
- package/src/localization/fr/index.ts +0 -3
- package/src/localization/index.ts +0 -66
- package/src/localization/pt-br/index.ts +0 -3
- package/src/localization/pt-br/pt-br.json +0 -911
- package/src/modules/history/context/historyManager.tsx +0 -247
- package/src/modules/history/index.ts +0 -2
- package/src/modules/history/navigation/HistoryStack.tsx +0 -29
- package/src/modules/history/services/queue.service.tsx +0 -31
- package/src/modules/history/types/index.ts +0 -92
- package/src/modules/history/ui/HistoryPage.tsx +0 -133
- package/src/modules/history/ui/HistorySettings.tsx +0 -183
- package/src/modules/history/ui/assets/img/HistoryCardAcceptedIcon.svg +0 -4
- package/src/modules/history/ui/assets/img/HistoryCardExpiredIcon.svg +0 -4
- package/src/modules/history/ui/assets/img/HistoryCardRevokedIcon.svg +0 -4
- package/src/modules/history/ui/assets/img/HistoryInformationSentIcon.svg +0 -4
- package/src/modules/history/ui/assets/img/HistoryPinUpdatedIcon.svg +0 -4
- package/src/modules/history/ui/assets/img/IconChevronRight.svg +0 -3
- package/src/modules/history/ui/components/BulletPoint.tsx +0 -49
- package/src/modules/history/ui/components/HistoryListItem.tsx +0 -251
- package/src/modules/history/ui/components/HistoryMenu.tsx +0 -25
- package/src/modules/history/ui/components/SingleSelectBlock.tsx +0 -72
- package/src/modules/openid/components/CredentialRowCard.tsx +0 -64
- package/src/modules/openid/components/OpenIDCredentialCard.tsx +0 -276
- package/src/modules/openid/context/OpenIDCredentialRecordProvider.tsx +0 -296
- package/src/modules/openid/display.tsx +0 -467
- package/src/modules/openid/displayProof.tsx +0 -86
- package/src/modules/openid/hooks/openid.tsx +0 -111
- package/src/modules/openid/metadata.tsx +0 -59
- package/src/modules/openid/offerResolve.tsx +0 -281
- package/src/modules/openid/resolverProof.tsx +0 -286
- package/src/modules/openid/screens/OpenIDCredentialDetails.tsx +0 -214
- package/src/modules/openid/screens/OpenIDCredentialOffer.tsx +0 -192
- package/src/modules/openid/screens/OpenIDProofChangeCredential.tsx +0 -133
- package/src/modules/openid/screens/OpenIDProofPresentation.tsx +0 -423
- package/src/modules/openid/types.tsx +0 -111
- package/src/modules/openid/utils/utils.tsx +0 -119
- package/src/navigators/ConnectStack.tsx +0 -68
- package/src/navigators/ContactStack.tsx +0 -91
- package/src/navigators/CredentialStack.tsx +0 -48
- package/src/navigators/DeliveryStack.tsx +0 -76
- package/src/navigators/HomeStack.tsx +0 -37
- package/src/navigators/MainStack.tsx +0 -146
- package/src/navigators/NotificationStack.tsx +0 -56
- package/src/navigators/OnboardingScreens.ts +0 -142
- package/src/navigators/OnboardingStack.tsx +0 -205
- package/src/navigators/ProofRequestStack.tsx +0 -113
- package/src/navigators/RootStack.tsx +0 -71
- package/src/navigators/SettingStack.tsx +0 -174
- package/src/navigators/TabStack.tsx +0 -304
- package/src/navigators/defaultLayoutOptions.tsx +0 -17
- package/src/navigators/defaultStackOptions.tsx +0 -102
- package/src/navigators/index.ts +0 -27
- package/src/onboarding.ts +0 -90
- package/src/screens/AttemptLockout.tsx +0 -153
- package/src/screens/AutoLock.tsx +0 -140
- package/src/screens/Biometry.tsx +0 -54
- package/src/screens/Chat.tsx +0 -141
- package/src/screens/ConfigureMediator.tsx +0 -160
- package/src/screens/Connection.tsx +0 -394
- package/src/screens/ContactDetails.tsx +0 -350
- package/src/screens/CredentialDetails.tsx +0 -473
- package/src/screens/CredentialOffer.tsx +0 -334
- package/src/screens/CredentialOfferAccept.tsx +0 -189
- package/src/screens/DataRetention.tsx +0 -91
- package/src/screens/Developer.tsx +0 -289
- package/src/screens/Home.tsx +0 -173
- package/src/screens/JSONDetails.tsx +0 -104
- package/src/screens/Language.tsx +0 -97
- package/src/screens/ListContacts.tsx +0 -112
- package/src/screens/ListCredentials.tsx +0 -135
- package/src/screens/ListProofRequests.tsx +0 -148
- package/src/screens/MobileVerifierLoading.tsx +0 -106
- package/src/screens/NameWallet.tsx +0 -9
- package/src/screens/Onboarding.tsx +0 -162
- package/src/screens/OnboardingPages.tsx +0 -160
- package/src/screens/PINChange.tsx +0 -249
- package/src/screens/PINCreate.tsx +0 -185
- package/src/screens/PINEnter.tsx +0 -432
- package/src/screens/PINExplainer.tsx +0 -85
- package/src/screens/PINVerify.tsx +0 -195
- package/src/screens/PasteUrl.tsx +0 -140
- package/src/screens/Preface.tsx +0 -78
- package/src/screens/ProofChangeCredential.tsx +0 -179
- package/src/screens/ProofDetails.tsx +0 -348
- package/src/screens/ProofRequest.tsx +0 -999
- package/src/screens/ProofRequestAccept.tsx +0 -133
- package/src/screens/ProofRequestDetails.tsx +0 -270
- package/src/screens/ProofRequestUsageHistory.tsx +0 -152
- package/src/screens/ProofRequesting.tsx +0 -245
- package/src/screens/PushNotifications.tsx +0 -59
- package/src/screens/RenameContact.tsx +0 -155
- package/src/screens/RenameWallet.tsx +0 -26
- package/src/screens/Scan.tsx +0 -145
- package/src/screens/ScanHelp.tsx +0 -48
- package/src/screens/Settings.tsx +0 -415
- package/src/screens/Splash.tsx +0 -80
- package/src/screens/Terms.tsx +0 -127
- package/src/screens/ToggleBiometry.tsx +0 -153
- package/src/screens/TogglePushNotifications.tsx +0 -118
- package/src/screens/Tours.tsx +0 -93
- package/src/screens/UpdateAvailable.tsx +0 -119
- package/src/screens/WhatAreContacts.tsx +0 -71
- package/src/services/bifoldLogger.ts +0 -3
- package/src/services/keychain.ts +0 -184
- package/src/services/logger.ts +0 -89
- package/src/services/storage.ts +0 -136
- package/src/theme-builder.ts +0 -157
- package/src/theme.interface.ts +0 -580
- package/src/theme.ts +0 -1346
- package/src/types/attempt-lockout-config.ts +0 -8
- package/src/types/attestation.ts +0 -17
- package/src/types/chat.ts +0 -4
- package/src/types/config.ts +0 -64
- package/src/types/contact-details.ts +0 -5
- package/src/types/credential-list-footer.ts +0 -3
- package/src/types/credential-status.ts +0 -3
- package/src/types/credentials.ts +0 -7
- package/src/types/decline.ts +0 -5
- package/src/types/error.ts +0 -40
- package/src/types/fn.ts +0 -2
- package/src/types/genesis.ts +0 -35
- package/src/types/index.ts +0 -2
- package/src/types/metadata.ts +0 -16
- package/src/types/navigators.ts +0 -239
- package/src/types/notification.ts +0 -24
- package/src/types/permissions.ts +0 -2
- package/src/types/proof-items.ts +0 -32
- package/src/types/react-i18next.d.ts +0 -10
- package/src/types/remove.ts +0 -8
- package/src/types/security.ts +0 -32
- package/src/types/settings.ts +0 -28
- package/src/types/state.ts +0 -97
- package/src/types/tour.ts +0 -20
- package/src/types/version-check.ts +0 -18
- package/src/utils/PINValidation.ts +0 -98
- package/src/utils/agent.ts +0 -128
- package/src/utils/anonCredsProofRequestMapper.ts +0 -205
- package/src/utils/contacts.ts +0 -59
- package/src/utils/cred-def.ts +0 -33
- package/src/utils/credential.ts +0 -37
- package/src/utils/crypto.ts +0 -12
- package/src/utils/fileCache.ts +0 -152
- package/src/utils/helpers.ts +0 -1292
- package/src/utils/ledger.ts +0 -212
- package/src/utils/luminance.ts +0 -40
- package/src/utils/mediatorhelpers.ts +0 -71
- package/src/utils/migration.ts +0 -40
- package/src/utils/network.tsx +0 -55
- package/src/utils/oca.ts +0 -173
- package/src/utils/parsers.tsx +0 -111
- package/src/utils/proofBundle.ts +0 -220
- package/src/utils/schema.ts +0 -28
- package/src/utils/testable.ts +0 -17
|
@@ -1,467 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
CredentialDisplay,
|
|
3
|
-
CredentialIssuerDisplay,
|
|
4
|
-
JffW3cCredentialJson,
|
|
5
|
-
OpenId4VcCredentialMetadata,
|
|
6
|
-
W3cCredentialDisplay,
|
|
7
|
-
W3cCredentialJson,
|
|
8
|
-
} from './types'
|
|
9
|
-
import { JwkJson, Mdoc, MdocRecord, TypedArrayEncoder, W3cCredentialRecord } from '@credo-ts/core'
|
|
10
|
-
|
|
11
|
-
import { Hasher, SdJwtVcRecord, ClaimFormat, JsonTransformer } from '@credo-ts/core'
|
|
12
|
-
import { decodeSdJwtSync, getClaimsSync } from '@sd-jwt/decode'
|
|
13
|
-
import { CredentialForDisplayId } from './types'
|
|
14
|
-
import { detectImageMimeType, formatDate, getHostNameFromUrl, isDateString, sanitizeString } from './utils/utils'
|
|
15
|
-
import { getOpenId4VcCredentialMetadata } from './metadata'
|
|
16
|
-
|
|
17
|
-
function findDisplay<Display extends { locale?: string }>(display?: Display[]): Display | undefined {
|
|
18
|
-
if (!display) return undefined
|
|
19
|
-
|
|
20
|
-
let item = display.find((d) => d.locale?.startsWith('en-'))
|
|
21
|
-
if (!item) item = display.find((d) => !d.locale)
|
|
22
|
-
if (!item) item = display[0]
|
|
23
|
-
|
|
24
|
-
return item
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function getOpenId4VcIssuerDisplay(openId4VcMetadata?: OpenId4VcCredentialMetadata | null): CredentialIssuerDisplay {
|
|
28
|
-
const issuerDisplay: Partial<CredentialIssuerDisplay> = {}
|
|
29
|
-
|
|
30
|
-
// Try to extract from openid metadata first
|
|
31
|
-
if (openId4VcMetadata) {
|
|
32
|
-
const openidIssuerDisplay = findDisplay(openId4VcMetadata.issuer.display)
|
|
33
|
-
|
|
34
|
-
if (openidIssuerDisplay) {
|
|
35
|
-
issuerDisplay.name = openidIssuerDisplay.name
|
|
36
|
-
|
|
37
|
-
if (openidIssuerDisplay.logo) {
|
|
38
|
-
issuerDisplay.logo = {
|
|
39
|
-
url: openidIssuerDisplay.logo?.url,
|
|
40
|
-
altText: openidIssuerDisplay.logo?.alt_text,
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// If the credentialDisplay contains a logo, and the issuerDisplay does not, use the logo from the credentialDisplay
|
|
46
|
-
const openidCredentialDisplay = findDisplay(openId4VcMetadata.credential.display)
|
|
47
|
-
if (openidCredentialDisplay && !issuerDisplay.logo && openidCredentialDisplay.logo) {
|
|
48
|
-
issuerDisplay.logo = {
|
|
49
|
-
url: openidCredentialDisplay.logo?.url,
|
|
50
|
-
altText: openidCredentialDisplay.logo?.alt_text,
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// Last fallback: use issuer id from openid4vc
|
|
56
|
-
if (!issuerDisplay.name && openId4VcMetadata?.issuer.id) {
|
|
57
|
-
issuerDisplay.name = getHostNameFromUrl(openId4VcMetadata.issuer.id)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (openId4VcMetadata?.issuer.id) {
|
|
61
|
-
issuerDisplay.domain = getHostNameFromUrl(openId4VcMetadata.issuer.id)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return {
|
|
65
|
-
...issuerDisplay,
|
|
66
|
-
name: issuerDisplay.name ?? 'Unknown',
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function getIssuerDisplay(metadata: OpenId4VcCredentialMetadata | null | undefined): Partial<CredentialIssuerDisplay> {
|
|
71
|
-
const issuerDisplay: Partial<CredentialIssuerDisplay> = {}
|
|
72
|
-
// Try to extract from openid metadata first
|
|
73
|
-
const openidIssuerDisplay = findDisplay(metadata?.issuer.display)
|
|
74
|
-
issuerDisplay.name = openidIssuerDisplay?.name
|
|
75
|
-
issuerDisplay.logo = openidIssuerDisplay?.logo
|
|
76
|
-
? {
|
|
77
|
-
url: openidIssuerDisplay.logo?.url,
|
|
78
|
-
altText: openidIssuerDisplay.logo?.alt_text,
|
|
79
|
-
}
|
|
80
|
-
: undefined
|
|
81
|
-
|
|
82
|
-
// If the credentialDisplay contains a logo, and the issuerDisplay does not, use the logo from the credentialDisplay
|
|
83
|
-
const openidCredentialDisplay = findDisplay(metadata?.credential.display)
|
|
84
|
-
if (openidCredentialDisplay && !issuerDisplay.logo && openidCredentialDisplay.logo) {
|
|
85
|
-
issuerDisplay.logo = {
|
|
86
|
-
url: openidCredentialDisplay.logo?.url,
|
|
87
|
-
altText: openidCredentialDisplay.logo?.alt_text,
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
return issuerDisplay
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function processIssuerDisplay(
|
|
95
|
-
metadata: OpenId4VcCredentialMetadata | null | undefined,
|
|
96
|
-
issuerDisplay: Partial<CredentialIssuerDisplay>
|
|
97
|
-
): CredentialIssuerDisplay {
|
|
98
|
-
// Last fallback: use issuer id from openid4vc
|
|
99
|
-
if (!issuerDisplay.name && metadata?.issuer.id) {
|
|
100
|
-
issuerDisplay.name = getHostNameFromUrl(metadata.issuer.id)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return {
|
|
104
|
-
...issuerDisplay,
|
|
105
|
-
name: issuerDisplay.name ?? 'Unknown',
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function getW3cIssuerDisplay(
|
|
110
|
-
credential: W3cCredentialJson,
|
|
111
|
-
openId4VcMetadata?: OpenId4VcCredentialMetadata | null
|
|
112
|
-
): CredentialIssuerDisplay {
|
|
113
|
-
const issuerDisplay: Partial<CredentialIssuerDisplay> = getIssuerDisplay(openId4VcMetadata)
|
|
114
|
-
|
|
115
|
-
// If openid metadata is not available, try to extract display metadata from the credential based on JFF metadata
|
|
116
|
-
const jffCredential = credential as JffW3cCredentialJson
|
|
117
|
-
const issuerJson = typeof jffCredential.issuer === 'string' ? undefined : jffCredential.issuer
|
|
118
|
-
|
|
119
|
-
// Issuer Display from JFF
|
|
120
|
-
if (!issuerDisplay.logo || !issuerDisplay.logo.url) {
|
|
121
|
-
issuerDisplay.logo = issuerJson?.logoUrl
|
|
122
|
-
? { url: issuerJson?.logoUrl }
|
|
123
|
-
: issuerJson?.image
|
|
124
|
-
? { url: typeof issuerJson.image === 'string' ? issuerJson.image : issuerJson.image.id }
|
|
125
|
-
: undefined
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Issuer name from JFF
|
|
129
|
-
if (!issuerDisplay.name) {
|
|
130
|
-
issuerDisplay.name = issuerJson?.name
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return processIssuerDisplay(openId4VcMetadata, issuerDisplay)
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
function getCredentialDisplay(
|
|
137
|
-
credentialPayload: Record<string, unknown>,
|
|
138
|
-
openId4VcMetadata?: OpenId4VcCredentialMetadata | null
|
|
139
|
-
): Partial<CredentialDisplay> {
|
|
140
|
-
const credentialDisplay: Partial<CredentialDisplay> = {}
|
|
141
|
-
|
|
142
|
-
if (openId4VcMetadata) {
|
|
143
|
-
const openidCredentialDisplay = findDisplay(openId4VcMetadata.credential.display)
|
|
144
|
-
credentialDisplay.name = openidCredentialDisplay?.name
|
|
145
|
-
credentialDisplay.description = openidCredentialDisplay?.description
|
|
146
|
-
credentialDisplay.textColor = openidCredentialDisplay?.text_color
|
|
147
|
-
credentialDisplay.backgroundColor = openidCredentialDisplay?.background_color
|
|
148
|
-
credentialDisplay.backgroundImage = openidCredentialDisplay?.background_image
|
|
149
|
-
? {
|
|
150
|
-
url: openidCredentialDisplay.background_image.url,
|
|
151
|
-
altText: openidCredentialDisplay.background_image.alt_text,
|
|
152
|
-
}
|
|
153
|
-
: undefined
|
|
154
|
-
credentialDisplay.logo = openidCredentialDisplay?.logo
|
|
155
|
-
credentialDisplay.primary_overlay_attribute = openidCredentialDisplay?.primary_overlay_attribute as
|
|
156
|
-
| string
|
|
157
|
-
| undefined
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return credentialDisplay
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
function getW3cCredentialDisplay(
|
|
164
|
-
credential: W3cCredentialJson,
|
|
165
|
-
openId4VcMetadata?: OpenId4VcCredentialMetadata | null
|
|
166
|
-
) {
|
|
167
|
-
const credentialDisplay: Partial<CredentialDisplay> = getCredentialDisplay(credential, openId4VcMetadata)
|
|
168
|
-
|
|
169
|
-
// If openid metadata is not available, try to extract display metadata from the credential based on JFF metadata
|
|
170
|
-
const jffCredential = credential as JffW3cCredentialJson
|
|
171
|
-
|
|
172
|
-
if (!credentialDisplay.name) {
|
|
173
|
-
credentialDisplay.name = jffCredential.name
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// If there's no name for the credential, we extract it from the last type
|
|
177
|
-
// and sanitize it. This is not optimal. But provides at least something.
|
|
178
|
-
if (!credentialDisplay.name && jffCredential.type.length > 1) {
|
|
179
|
-
const lastType = jffCredential.type[jffCredential.type.length - 1]
|
|
180
|
-
credentialDisplay.name = lastType && !lastType.startsWith('http') ? sanitizeString(lastType) : undefined
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// Use background color from the JFF credential if not provided by the OID4VCI metadata
|
|
184
|
-
if (!credentialDisplay.backgroundColor && jffCredential.credentialBranding?.backgroundColor) {
|
|
185
|
-
credentialDisplay.backgroundColor = jffCredential.credentialBranding.backgroundColor
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return {
|
|
189
|
-
...credentialDisplay,
|
|
190
|
-
// Last fallback, if there's really no name for the credential, we use a generic name
|
|
191
|
-
name: credentialDisplay.name ?? 'Credential',
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
function getSdJwtCredentialDisplay(
|
|
196
|
-
credentialPayload: Record<string, unknown>,
|
|
197
|
-
openId4VcMetadata?: OpenId4VcCredentialMetadata | null
|
|
198
|
-
) {
|
|
199
|
-
const credentialDisplay: Partial<CredentialDisplay> = getCredentialDisplay(credentialPayload, openId4VcMetadata)
|
|
200
|
-
|
|
201
|
-
if (!credentialDisplay.name && typeof credentialPayload.vct === 'string') {
|
|
202
|
-
credentialDisplay.name = sanitizeString(credentialPayload.vct)
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
return {
|
|
206
|
-
...credentialDisplay,
|
|
207
|
-
name: credentialDisplay.name ?? 'Credential',
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
function getMdocCredentialDisplay(
|
|
212
|
-
credentialPayload: Record<string, unknown>,
|
|
213
|
-
openId4VcMetadata?: OpenId4VcCredentialMetadata | null
|
|
214
|
-
) {
|
|
215
|
-
const credentialDisplay: Partial<CredentialDisplay> = {}
|
|
216
|
-
|
|
217
|
-
if (openId4VcMetadata) {
|
|
218
|
-
const openidCredentialDisplay = findDisplay(openId4VcMetadata.credential.display)
|
|
219
|
-
|
|
220
|
-
if (openidCredentialDisplay) {
|
|
221
|
-
credentialDisplay.name = openidCredentialDisplay.name
|
|
222
|
-
credentialDisplay.description = openidCredentialDisplay.description
|
|
223
|
-
credentialDisplay.textColor = openidCredentialDisplay.text_color
|
|
224
|
-
credentialDisplay.backgroundColor = openidCredentialDisplay.background_color
|
|
225
|
-
|
|
226
|
-
if (openidCredentialDisplay.background_image) {
|
|
227
|
-
credentialDisplay.backgroundImage = {
|
|
228
|
-
url: openidCredentialDisplay.background_image.url,
|
|
229
|
-
altText: openidCredentialDisplay.background_image.alt_text,
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
// NOTE: logo is used in issuer display (not sure if that's right though)
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// TODO: mdoc
|
|
238
|
-
// If there's no name for the credential, we extract it from the last type
|
|
239
|
-
// and sanitize it. This is not optimal. But provides at least something.
|
|
240
|
-
// if (!credentialDisplay.name && typeof credentialPayload.vct === 'string') {
|
|
241
|
-
// credentialDisplay.name = sanitizeString(credentialPayload.vct)
|
|
242
|
-
// }
|
|
243
|
-
|
|
244
|
-
return {
|
|
245
|
-
...credentialDisplay,
|
|
246
|
-
// Last fallback, if there's really no name for the credential, we use a generic name
|
|
247
|
-
// TODO: use on-device AI to determine a name for the credential based on the credential data
|
|
248
|
-
name: credentialDisplay.name ?? 'Credential',
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
export interface DisplayImage {
|
|
253
|
-
url?: string
|
|
254
|
-
altText?: string
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
export interface CredentialMetadata {
|
|
258
|
-
type: string
|
|
259
|
-
issuer: string
|
|
260
|
-
holder?: string
|
|
261
|
-
validUntil?: string
|
|
262
|
-
validFrom?: string
|
|
263
|
-
issuedAt?: string
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
function safeCalculateJwkThumbprint(jwk: JwkJson): string | undefined {
|
|
267
|
-
try {
|
|
268
|
-
const thumbprint = TypedArrayEncoder.toBase64URL(
|
|
269
|
-
Hasher.hash(
|
|
270
|
-
JSON.stringify({ k: jwk.k, e: jwk.e, crv: jwk.crv, kty: jwk.kty, n: jwk.n, x: jwk.x, y: jwk.y }),
|
|
271
|
-
'sha-256'
|
|
272
|
-
)
|
|
273
|
-
)
|
|
274
|
-
return `urn:ietf:params:oauth:jwk-thumbprint:sha-256:${thumbprint}`
|
|
275
|
-
} catch (e) {
|
|
276
|
-
return undefined
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
export function filterAndMapSdJwtKeys(sdJwtVcPayload: Record<string, unknown>) {
|
|
281
|
-
type SdJwtVcPayload = {
|
|
282
|
-
iss: string
|
|
283
|
-
cnf: Record<string, unknown>
|
|
284
|
-
vct: string
|
|
285
|
-
iat?: number
|
|
286
|
-
nbf?: number
|
|
287
|
-
exp?: number
|
|
288
|
-
[key: string]: unknown
|
|
289
|
-
}
|
|
290
|
-
// TODO: We should map these claims to nice format and names
|
|
291
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
292
|
-
const { _sd_alg, _sd_hash, iss, vct, cnf, iat, exp, nbf, ...visibleProperties } = sdJwtVcPayload as SdJwtVcPayload
|
|
293
|
-
|
|
294
|
-
const holder = cnf.kid ?? cnf.jwk ? safeCalculateJwkThumbprint(cnf.jwk as JwkJson) : undefined
|
|
295
|
-
const credentialMetadata: CredentialMetadata = {
|
|
296
|
-
type: vct,
|
|
297
|
-
issuer: iss,
|
|
298
|
-
holder,
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
if (iat) {
|
|
302
|
-
credentialMetadata.issuedAt = formatDate(new Date(iat * 1000))
|
|
303
|
-
}
|
|
304
|
-
if (exp) {
|
|
305
|
-
credentialMetadata.validUntil = formatDate(new Date(exp * 1000))
|
|
306
|
-
}
|
|
307
|
-
if (nbf) {
|
|
308
|
-
credentialMetadata.validFrom = formatDate(new Date(nbf * 1000))
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
return {
|
|
312
|
-
visibleProperties: Object.fromEntries(
|
|
313
|
-
Object.entries(visibleProperties).map(([key, value]) => [key, recursivelyMapAttribues(value)])
|
|
314
|
-
),
|
|
315
|
-
metadata: credentialMetadata,
|
|
316
|
-
raw: {
|
|
317
|
-
issuedAt: iat ? new Date(iat * 1000) : undefined,
|
|
318
|
-
validUntil: exp ? new Date(exp * 1000) : undefined,
|
|
319
|
-
validFrom: nbf ? new Date(nbf * 1000) : undefined,
|
|
320
|
-
},
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
export function getCredentialForDisplay(
|
|
325
|
-
credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord
|
|
326
|
-
): W3cCredentialDisplay {
|
|
327
|
-
if (credentialRecord instanceof SdJwtVcRecord) {
|
|
328
|
-
// FIXME: we should probably add a decode method on the SdJwtVcRecord
|
|
329
|
-
// as you now need the agent context to decode the sd-jwt vc, while that's
|
|
330
|
-
// not really needed
|
|
331
|
-
const { disclosures, jwt } = decodeSdJwtSync(credentialRecord.compactSdJwtVc, (data, alg) => Hasher.hash(data, alg))
|
|
332
|
-
const decodedPayload: Record<string, unknown> = getClaimsSync(jwt.payload, disclosures, (data, alg) =>
|
|
333
|
-
Hasher.hash(data, alg)
|
|
334
|
-
)
|
|
335
|
-
|
|
336
|
-
const openId4VcMetadata = getOpenId4VcCredentialMetadata(credentialRecord)
|
|
337
|
-
const issuerDisplay = getOpenId4VcIssuerDisplay(openId4VcMetadata)
|
|
338
|
-
const credentialDisplay = getSdJwtCredentialDisplay(decodedPayload, openId4VcMetadata)
|
|
339
|
-
|
|
340
|
-
const mapped = filterAndMapSdJwtKeys(decodedPayload)
|
|
341
|
-
|
|
342
|
-
return {
|
|
343
|
-
id: `sd-jwt-vc-${credentialRecord.id}` satisfies CredentialForDisplayId,
|
|
344
|
-
createdAt: credentialRecord.createdAt,
|
|
345
|
-
display: {
|
|
346
|
-
...credentialDisplay,
|
|
347
|
-
issuer: issuerDisplay,
|
|
348
|
-
},
|
|
349
|
-
attributes: mapped.visibleProperties,
|
|
350
|
-
metadata: mapped.metadata,
|
|
351
|
-
claimFormat: ClaimFormat.SdJwtVc,
|
|
352
|
-
validUntil: mapped.raw.validUntil,
|
|
353
|
-
validFrom: mapped.raw.validFrom,
|
|
354
|
-
credentialSubject: openId4VcMetadata?.credential.credential_subject,
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
if (credentialRecord instanceof MdocRecord) {
|
|
359
|
-
const openId4VcMetadata = getOpenId4VcCredentialMetadata(credentialRecord)
|
|
360
|
-
const issuerDisplay = getOpenId4VcIssuerDisplay(openId4VcMetadata)
|
|
361
|
-
const credentialDisplay = getMdocCredentialDisplay({}, openId4VcMetadata)
|
|
362
|
-
|
|
363
|
-
const mdocInstance = Mdoc.fromBase64Url(credentialRecord.base64Url)
|
|
364
|
-
const attributes = Object.fromEntries(
|
|
365
|
-
Object.values(mdocInstance.issuerSignedNamespaces).flatMap((v) =>
|
|
366
|
-
Object.entries(v).map(([key, value]) => [key, recursivelyMapAttribues(value)])
|
|
367
|
-
)
|
|
368
|
-
)
|
|
369
|
-
|
|
370
|
-
return {
|
|
371
|
-
id: `mdoc-${credentialRecord.id}` satisfies CredentialForDisplayId,
|
|
372
|
-
createdAt: credentialRecord.createdAt,
|
|
373
|
-
display: {
|
|
374
|
-
...credentialDisplay,
|
|
375
|
-
issuer: issuerDisplay,
|
|
376
|
-
},
|
|
377
|
-
attributes,
|
|
378
|
-
// TODO:
|
|
379
|
-
metadata: {
|
|
380
|
-
// holder: 'Unknown',
|
|
381
|
-
issuer: 'Unknown',
|
|
382
|
-
type: mdocInstance.docType,
|
|
383
|
-
} satisfies CredentialMetadata,
|
|
384
|
-
claimFormat: ClaimFormat.MsoMdoc,
|
|
385
|
-
validUntil: mdocInstance.validityInfo.validUntil,
|
|
386
|
-
validFrom: mdocInstance.validityInfo.validFrom,
|
|
387
|
-
credentialSubject: openId4VcMetadata?.credential.credential_subject,
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
const credential = JsonTransformer.toJSON(
|
|
392
|
-
credentialRecord.credential.claimFormat === ClaimFormat.JwtVc
|
|
393
|
-
? credentialRecord.credential.credential
|
|
394
|
-
: credentialRecord.credential
|
|
395
|
-
) as W3cCredentialJson
|
|
396
|
-
|
|
397
|
-
const openId4VcMetadata = getOpenId4VcCredentialMetadata(credentialRecord)
|
|
398
|
-
const issuerDisplay = getW3cIssuerDisplay(credential, openId4VcMetadata)
|
|
399
|
-
const credentialDisplay = getW3cCredentialDisplay(credential, openId4VcMetadata)
|
|
400
|
-
|
|
401
|
-
// to be implimented later support credential with multiple subjects
|
|
402
|
-
const credentialAttributes = Array.isArray(credential.credentialSubject)
|
|
403
|
-
? credential.credentialSubject[0] ?? {}
|
|
404
|
-
: credential.credentialSubject
|
|
405
|
-
|
|
406
|
-
return {
|
|
407
|
-
id: `w3c-credential-${credentialRecord.id}` satisfies CredentialForDisplayId,
|
|
408
|
-
createdAt: credentialRecord.createdAt,
|
|
409
|
-
display: {
|
|
410
|
-
...credentialDisplay,
|
|
411
|
-
issuer: issuerDisplay,
|
|
412
|
-
},
|
|
413
|
-
credential,
|
|
414
|
-
attributes: credentialAttributes,
|
|
415
|
-
metadata: {
|
|
416
|
-
holder: credentialRecord.credential.credentialSubjectIds[0],
|
|
417
|
-
issuer: credentialRecord.credential.issuerId,
|
|
418
|
-
type: credentialRecord.credential.type[credentialRecord.credential.type.length - 1],
|
|
419
|
-
issuedAt: formatDate(new Date(credentialRecord.credential.issuanceDate)),
|
|
420
|
-
validUntil: credentialRecord.credential.expirationDate
|
|
421
|
-
? formatDate(new Date(credentialRecord.credential.expirationDate))
|
|
422
|
-
: undefined,
|
|
423
|
-
validFrom: undefined,
|
|
424
|
-
} satisfies CredentialMetadata,
|
|
425
|
-
claimFormat: credentialRecord.credential.claimFormat,
|
|
426
|
-
validUntil: credentialRecord.credential.expirationDate
|
|
427
|
-
? new Date(credentialRecord.credential.expirationDate)
|
|
428
|
-
: undefined,
|
|
429
|
-
validFrom: credentialRecord.credential.issuanceDate
|
|
430
|
-
? new Date(credentialRecord.credential.issuanceDate)
|
|
431
|
-
: undefined,
|
|
432
|
-
credentialSubject: openId4VcMetadata?.credential.credential_subject,
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
type MappedAttributesReturnType =
|
|
437
|
-
| string
|
|
438
|
-
| number
|
|
439
|
-
| boolean
|
|
440
|
-
| { [key: string]: MappedAttributesReturnType }
|
|
441
|
-
| null
|
|
442
|
-
| undefined
|
|
443
|
-
| Array<MappedAttributesReturnType>
|
|
444
|
-
export function recursivelyMapAttribues(value: unknown): MappedAttributesReturnType {
|
|
445
|
-
if (value instanceof Uint8Array) {
|
|
446
|
-
const imageMimeType = detectImageMimeType(value)
|
|
447
|
-
if (imageMimeType) {
|
|
448
|
-
return `data:${imageMimeType};base64,${TypedArrayEncoder.toBase64(value)}`
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
// TODO: what to do with a buffer that is not an image?
|
|
452
|
-
return TypedArrayEncoder.toUtf8String(value)
|
|
453
|
-
}
|
|
454
|
-
if (value === null || value === undefined || typeof value === 'number' || typeof value === 'boolean') return value
|
|
455
|
-
|
|
456
|
-
if (value instanceof Date || (typeof value === 'string' && isDateString(value))) {
|
|
457
|
-
// TODO: handle DateOnly (should be handled as time is 0 then)
|
|
458
|
-
return formatDate(value)
|
|
459
|
-
}
|
|
460
|
-
if (typeof value === 'string') return value
|
|
461
|
-
if (value instanceof Map) {
|
|
462
|
-
return Object.fromEntries(Array.from(value.entries()).map(([key, value]) => [key, recursivelyMapAttribues(value)]))
|
|
463
|
-
}
|
|
464
|
-
if (Array.isArray(value)) return value.map(recursivelyMapAttribues)
|
|
465
|
-
|
|
466
|
-
return Object.fromEntries(Object.entries(value).map(([key, value]) => [key, recursivelyMapAttribues(value)]))
|
|
467
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { ClaimFormat, type DifPexCredentialsForRequest } from '@credo-ts/core'
|
|
2
|
-
|
|
3
|
-
import { type CredentialMetadata, type DisplayImage, filterAndMapSdJwtKeys, getCredentialForDisplay } from './display'
|
|
4
|
-
|
|
5
|
-
export interface FormattedSubmission {
|
|
6
|
-
name: string
|
|
7
|
-
purpose?: string
|
|
8
|
-
areAllSatisfied: boolean
|
|
9
|
-
entries: FormattedSubmissionEntry[]
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export type FormattedSelectedCredentialEntry = {
|
|
13
|
-
id: string
|
|
14
|
-
credentialName: string
|
|
15
|
-
issuerName?: string
|
|
16
|
-
requestedAttributes?: string[]
|
|
17
|
-
disclosedPayload?: Record<string, unknown>
|
|
18
|
-
metadata?: CredentialMetadata
|
|
19
|
-
backgroundColor?: string
|
|
20
|
-
backgroundImage?: DisplayImage
|
|
21
|
-
textColor?: string
|
|
22
|
-
claimFormat: ClaimFormat | 'AnonCreds'
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface FormattedSubmissionEntry {
|
|
26
|
-
/** can be either AnonCreds groupName or PEX inputDescriptorId */
|
|
27
|
-
inputDescriptorId: string
|
|
28
|
-
isSatisfied: boolean
|
|
29
|
-
|
|
30
|
-
name: string
|
|
31
|
-
purpose?: string
|
|
32
|
-
description?: string
|
|
33
|
-
|
|
34
|
-
credentials: Array<FormattedSelectedCredentialEntry>
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function formatDifPexCredentialsForRequest(
|
|
38
|
-
credentialsForRequest: DifPexCredentialsForRequest
|
|
39
|
-
): FormattedSubmission {
|
|
40
|
-
const entries = credentialsForRequest.requirements.flatMap((requirement) => {
|
|
41
|
-
return requirement.submissionEntry.map((submission): FormattedSubmissionEntry => {
|
|
42
|
-
return {
|
|
43
|
-
inputDescriptorId: submission.inputDescriptorId,
|
|
44
|
-
name: submission.name ?? 'Unknown',
|
|
45
|
-
purpose: submission.purpose,
|
|
46
|
-
description: submission.purpose,
|
|
47
|
-
isSatisfied: submission.verifiableCredentials.length >= 1,
|
|
48
|
-
|
|
49
|
-
credentials: submission.verifiableCredentials.map((verifiableCredential) => {
|
|
50
|
-
const { display, attributes, metadata, claimFormat } = getCredentialForDisplay(
|
|
51
|
-
verifiableCredential.credentialRecord
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
let disclosedPayload = attributes
|
|
55
|
-
if (verifiableCredential.type === ClaimFormat.SdJwtVc) {
|
|
56
|
-
disclosedPayload = filterAndMapSdJwtKeys(verifiableCredential.disclosedPayload).visibleProperties
|
|
57
|
-
} else if (verifiableCredential.type === ClaimFormat.MsoMdoc) {
|
|
58
|
-
disclosedPayload = Object.fromEntries(
|
|
59
|
-
Object.values(verifiableCredential.disclosedPayload).flatMap((entry) => Object.entries(entry))
|
|
60
|
-
)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return {
|
|
64
|
-
id: verifiableCredential.credentialRecord.id,
|
|
65
|
-
credentialName: display.name,
|
|
66
|
-
issuerName: display.issuer.name,
|
|
67
|
-
requestedAttributes: [...Object.keys(disclosedPayload)],
|
|
68
|
-
disclosedPayload,
|
|
69
|
-
metadata,
|
|
70
|
-
backgroundColor: display.backgroundColor,
|
|
71
|
-
textColor: display.textColor,
|
|
72
|
-
backgroundImage: display.backgroundImage,
|
|
73
|
-
claimFormat,
|
|
74
|
-
}
|
|
75
|
-
}),
|
|
76
|
-
}
|
|
77
|
-
})
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
return {
|
|
81
|
-
areAllSatisfied: entries.every((entry) => entry.isSatisfied),
|
|
82
|
-
name: credentialsForRequest.name ?? 'Unknown',
|
|
83
|
-
purpose: credentialsForRequest.purpose,
|
|
84
|
-
entries,
|
|
85
|
-
}
|
|
86
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { MdocRecord, SdJwtVcRecord, W3cCredentialRecord } from '@credo-ts/core'
|
|
2
|
-
import { useCallback, useEffect, useState } from 'react'
|
|
3
|
-
import { DeviceEventEmitter } from 'react-native'
|
|
4
|
-
import { EventTypes } from '../../../constants'
|
|
5
|
-
import { BifoldError } from '../../../types/error'
|
|
6
|
-
import { useAgent } from '@credo-ts/react-hooks'
|
|
7
|
-
import { useTranslation } from 'react-i18next'
|
|
8
|
-
import { getCredentialsForProofRequest } from '../resolverProof'
|
|
9
|
-
import { OpenId4VPRequestRecord } from '../types'
|
|
10
|
-
import {
|
|
11
|
-
acquirePreAuthorizedAccessToken,
|
|
12
|
-
receiveCredentialFromOpenId4VciOffer,
|
|
13
|
-
resolveOpenId4VciOffer,
|
|
14
|
-
} from '../offerResolve'
|
|
15
|
-
|
|
16
|
-
type OpenIDContextProps = {
|
|
17
|
-
openIDUri?: string
|
|
18
|
-
openIDPresentationUri?: string
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export const useOpenID = ({
|
|
22
|
-
openIDUri,
|
|
23
|
-
openIDPresentationUri,
|
|
24
|
-
}: OpenIDContextProps): SdJwtVcRecord | W3cCredentialRecord | MdocRecord | OpenId4VPRequestRecord | undefined => {
|
|
25
|
-
const [openIdRecord, setOpenIdRecord] = useState<
|
|
26
|
-
SdJwtVcRecord | W3cCredentialRecord | MdocRecord | OpenId4VPRequestRecord
|
|
27
|
-
>()
|
|
28
|
-
|
|
29
|
-
const { agent } = useAgent()
|
|
30
|
-
const { t } = useTranslation()
|
|
31
|
-
|
|
32
|
-
const resolveOpenIDCredential = useCallback(
|
|
33
|
-
async (uri: string) => {
|
|
34
|
-
if (!agent) {
|
|
35
|
-
return
|
|
36
|
-
}
|
|
37
|
-
try {
|
|
38
|
-
const resolvedCredentialOffer = await resolveOpenId4VciOffer({
|
|
39
|
-
agent: agent,
|
|
40
|
-
uri: uri,
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
const tokenResponse = await acquirePreAuthorizedAccessToken({ agent, resolvedCredentialOffer })
|
|
44
|
-
|
|
45
|
-
return await receiveCredentialFromOpenId4VciOffer({
|
|
46
|
-
agent,
|
|
47
|
-
resolvedCredentialOffer,
|
|
48
|
-
accessToken: tokenResponse,
|
|
49
|
-
})
|
|
50
|
-
} catch (err: unknown) {
|
|
51
|
-
//TODO: Sppecify different error
|
|
52
|
-
const error = new BifoldError(
|
|
53
|
-
t('Error.Title1024'),
|
|
54
|
-
t('Error.Message1024'),
|
|
55
|
-
(err as Error)?.message ?? err,
|
|
56
|
-
1043
|
|
57
|
-
)
|
|
58
|
-
DeviceEventEmitter.emit(EventTypes.ERROR_ADDED, error)
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
[agent, t]
|
|
62
|
-
)
|
|
63
|
-
|
|
64
|
-
const resolveOpenIDPresentationRequest = useCallback(
|
|
65
|
-
async (uri: string) => {
|
|
66
|
-
if (!agent) {
|
|
67
|
-
return
|
|
68
|
-
}
|
|
69
|
-
try {
|
|
70
|
-
const record = await getCredentialsForProofRequest({
|
|
71
|
-
agent: agent,
|
|
72
|
-
uri: uri,
|
|
73
|
-
})
|
|
74
|
-
return record
|
|
75
|
-
} catch (err: unknown) {
|
|
76
|
-
const error = new BifoldError(
|
|
77
|
-
t('Error.Title1043'),
|
|
78
|
-
t('Error.Message1043'),
|
|
79
|
-
(err as Error)?.message ?? err,
|
|
80
|
-
1043
|
|
81
|
-
)
|
|
82
|
-
DeviceEventEmitter.emit(EventTypes.ERROR_ADDED, error)
|
|
83
|
-
}
|
|
84
|
-
},
|
|
85
|
-
[agent, t]
|
|
86
|
-
)
|
|
87
|
-
|
|
88
|
-
useEffect(() => {
|
|
89
|
-
if (!openIDPresentationUri) {
|
|
90
|
-
return
|
|
91
|
-
}
|
|
92
|
-
resolveOpenIDPresentationRequest(openIDPresentationUri).then((value) => {
|
|
93
|
-
if (value) {
|
|
94
|
-
setOpenIdRecord(value)
|
|
95
|
-
}
|
|
96
|
-
})
|
|
97
|
-
}, [openIDPresentationUri, resolveOpenIDPresentationRequest])
|
|
98
|
-
|
|
99
|
-
useEffect(() => {
|
|
100
|
-
if (!openIDUri) {
|
|
101
|
-
return
|
|
102
|
-
}
|
|
103
|
-
resolveOpenIDCredential(openIDUri).then((value) => {
|
|
104
|
-
if (value) {
|
|
105
|
-
setOpenIdRecord(value)
|
|
106
|
-
}
|
|
107
|
-
})
|
|
108
|
-
}, [openIDUri, resolveOpenIDCredential])
|
|
109
|
-
|
|
110
|
-
return openIdRecord
|
|
111
|
-
}
|