Files
inji-wallet/machines/VerifiableCredential/VCItemMachine/VCItemServices.ts
PuBHARGAVI fe59309e88 [Injimob 812] openID4VP sharing flow UI implementation (#1628)
* [INJIMOB-1629] add an api to fetch the trusted verifiers list for vp sharing flow

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] add screens for showing vcs matching openId4vp authorization request and selecting VCs

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] add states in scan machine to show loader screen when vp sharing is started

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] send events to parent machine from openId4vp machine to update UI when performing vp sharing

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] change the position of check box in vc container in vp sharing flow

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] add styles to send vp screen elements to match wireframe and add context variable to store vp sharing purpose

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] show error screen if no credential in wallet matches with authorization request

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] show confirmation pop up when user decline the consent for sharing vp

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] show error screen if the verifier authentication is failed after scanning vp sharing qr code

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] move error and overlay details assigning logic to send vp screen controller

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] add translations for vp sharing flow texts in all languages

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] make changes in card skeleton component to show vc card loader in vp sharing flow

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] fix issues with reject button in sharing vp screen

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] add support for sharing vp with out selfie from kebab menu

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] add support for sharing vp with selfie from kebab menu

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] add missing translations for error and overlay screen texts of vp sharing flow

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] add logic in scan screen to show error screens in vp sharing from kebab menu flow

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] add logic to filter the VCs based on the type of the VC in vp sharing flow

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812]: generate proof for vp token and send vp

Signed-off-by: adityankannan-tw <adityan410pm@gmail.com>

* [INJIMOB-1629] show generic error message if any error occured while validating vp qr code

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] add logic to allow user retry vp sharing 3 times if any technical error occurred

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] add react method in native module to send the generated vp response metadata and make changes to show any errors occured after sharing vp

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-1629] show success screen if vp is shared successfully to the verifier

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812]: refactor proof generation and integrate remote openid4vp package

Signed-off-by: adityankannan-tw <adityan410pm@gmail.com>

* [INJIMOB-812]: refactor proof generation and integrate remote openid4vp package

Signed-off-by: adityankannan-tw <adityan410pm@gmail.com>

* [INJIMOB-812] make changes in the code to fetch the VCs properly if scope is present in the authorization code

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] fix the logic of checking if order field value in issuer wellknown is null and empty or not

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] move qr login and openid4vp red id's to scan actions

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] remove unnecessary logs

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] rename openid4vp actions to make them more meaningful and remove unnecessary events in send vp screen controller

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] show error screen if none of the selected VC has image but user chosen share with selfie option

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] add guard logic for checking if any of the selected VC has image or not

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812]: update package resolved with openid4vp library

Signed-off-by: adityankannan-tw <adityan410pm@gmail.com>

* [INJIMOB-812] fix the logic of retry button in technical error screen and perform the vp sharing again when user click on retry button

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] show specific error screen if required info is missing in qr code

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812]: refactor native module and wrapper with updated library name

Signed-off-by: adityankannan-tw <adityan410pm@gmail.com>

* [INJIMOB-1709]: Integrate VC verifier aar for Vc verification of Mosip VC (#1624)

* [INJIMOB-1709]: integrate VC verifier aar for Vc verification of Mosip VC

Signed-off-by: Alka Prasad <prasadalka1998@gmail.com>

* [INJIMOB-1709]: Handling Response from Vc Verifier Library

Signed-off-by: BalachandarG <balachandar.g@thoughtworks.com>

* [INJIMOB-1709]: Removed mavenLocal from build.gradle

Signed-off-by: BalachandarG <balachandar.g@thoughtworks.com>

* [INJIMOB-1709]: Updated build.gradle

Signed-off-by: BalachandarG <balachandar.g@thoughtworks.com>

* [INJIMOB-1709]: Removed Certify from isMosipVC Condition.

Signed-off-by: BalachandarG <balachandar.g@thoughtworks.com>

* [INJIMOB-1709]: Adding isAndroid check and verifying using digital bazaar for iOs.

Signed-off-by: BalachandarG <balachandar.g@thoughtworks.com>

---------

Signed-off-by: Alka Prasad <prasadalka1998@gmail.com>
Signed-off-by: BalachandarG <balachandar.g@thoughtworks.com>
Co-authored-by: Alka Prasad <prasadalka1998@gmail.com>

* [INJIMOB-1629] rename openId4VP to openID4VP in all files and address pr comments

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] fetch trusted verifiers list from mimoto end point

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] rename openId4VP to openID4VP in all files

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] make trusted verifier api call cache preferred

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] rename openId4VP to openID4VP in all places

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812]: refactor and update openid4vp swift library

Signed-off-by: adityankannan-tw <adityan410pm@gmail.com>

* [INJIMOB-812] remove code related to scope in openid4vp flow

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] remove code related to type in openid4vp actions

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] rename response_uri to response_uris in openid4vp native wrappers

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] rename typegen file in openid4vp machine

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] change target state of checkFaceAuthConsent to getTrustedVerifiersList

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812]: update openid4vp swift package

Signed-off-by: adityankannan-tw <adityan410pm@gmail.com>

* [INJIMOB-2097]: bump up app version to 0.15.0 (#1631)

Signed-off-by: adityankannan-tw <adityan410pm@gmail.com>
Co-authored-by: adityankannan-tw <adityan410pm@gmail.com>

* [INJIMOB-1884] remove SetupKeySelectionScreen (#1632)

Signed-off-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>

* [INJIMOB-812] change the conditional logic for checking if downloading error is generic or not in issuer guards and selectors

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] fetch the trusted verifiers list properly from api response

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] send the list of selected vcs images to face scanner machine only if face is available

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] fix home button navigation issue in error screen of vp sharing flow

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] move openid4vp machine to showError state if there is any occurred in vp sharing flow and reset error when user navigates to home screen

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] fix some flows in vp sharing flow

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

* [INJIMOB-812] fix the logic for showing the error screen as part of scan screen in vp sharing flow

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>

---------

Signed-off-by: PuBHARGAVI <46226958+PuBHARGAVI@users.noreply.github.com>
Signed-off-by: adityankannan-tw <adityan410pm@gmail.com>
Signed-off-by: Alka Prasad <prasadalka1998@gmail.com>
Signed-off-by: BalachandarG <balachandar.g@thoughtworks.com>
Signed-off-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>
Co-authored-by: adityankannan-tw <adityan410pm@gmail.com>
Co-authored-by: balachandarg-tw <115633327+balachandarg-tw@users.noreply.github.com>
Co-authored-by: Alka Prasad <prasadalka1998@gmail.com>
Co-authored-by: adityankannan-tw <109274996+adityankannan-tw@users.noreply.github.com>
Co-authored-by: abhip2565 <74866247+abhip2565@users.noreply.github.com>
2024-10-04 11:21:16 +05:30

206 lines
6.5 KiB
TypeScript

import {NativeModules} from 'react-native';
import Cloud from '../../../shared/CloudBackupAndRestoreUtils';
import getAllConfigurations, {
API_URLS,
CACHED_API,
DownloadProps,
} from '../../../shared/api';
import {
fetchKeyPair,
generateKeyPair,
} from '../../../shared/cryptoutil/cryptoUtil';
import {CredentialDownloadResponse, request} from '../../../shared/request';
import {WalletBindingResponse} from '../VCMetaMachine/vc';
import {verifyCredential} from '../../../shared/vcjs/verifyCredential';
import {getVerifiableCredential} from './VCItemSelectors';
import {getMatchingCredentialIssuerMetadata} from '../../../shared/openId4VCI/Utils';
import {isIOS} from '../../../shared/constants';
const {RNSecureKeystoreModule} = NativeModules;
export const VCItemServices = model => {
return {
isUserSignedAlready: () => async () => {
return await Cloud.isSignedInAlready();
},
loadDownloadLimitConfig: async context => {
var resp = await getAllConfigurations();
const maxLimit: number = resp.vcDownloadMaxRetry;
const vcDownloadPoolInterval: number = resp.vcDownloadPoolInterval;
const downloadProps: DownloadProps = {
maxDownloadLimit: maxLimit,
downloadInterval: vcDownloadPoolInterval,
};
return downloadProps;
},
checkDownloadExpiryLimit: async context => {
if (context.downloadCounter > context.maxDownloadCount) {
throw new Error(
'Download limit expired for request id: ' +
context.vcMetadata.requestId,
);
}
},
addWalletBindingId: async context => {
const response = await request(
API_URLS.walletBinding.method,
API_URLS.walletBinding.buildURL(),
{
requestTime: String(new Date().toISOString()),
request: {
authFactorType: 'WLA',
format: 'jwt',
individualId: context.vcMetadata.displayId,
transactionId: context.bindingTransactionId,
publicKey: context.publicKey,
challengeList: [
{
authFactorType: 'OTP',
challenge: context.OTP,
format: 'alpha-numeric',
},
],
},
},
);
const walletResponse: WalletBindingResponse = {
walletBindingId: response.response.encryptedWalletBindingId,
keyId: response.response.keyId,
thumbprint: response.response.thumbprint,
expireDateTime: response.response.expireDateTime,
};
return walletResponse;
},
fetchKeyPair: async context => {
const keyType = context.vcMetadata?.downloadKeyType;
return await fetchKeyPair(keyType);
},
generateKeypairAndStore: async context => {
const keyType = context.vcMetadata?.downloadKeyType;
const keypair = await generateKeyPair(keyType);
if ((keyType != 'ES256' && keyType != 'RS256') || isIOS())
await RNSecureKeystoreModule.storeGenericKey(
keypair.publicKey as string,
keypair.privateKey as string,
keyType,
);
return keypair;
},
requestBindingOTP: async context => {
const response = await request(
API_URLS.bindingOtp.method,
API_URLS.bindingOtp.buildURL(),
{
requestTime: String(new Date().toISOString()),
request: {
individualId: context.vcMetadata.displayId,
otpChannels: ['EMAIL', 'PHONE'],
},
},
);
if (response.response == null) {
throw new Error('Could not process request');
}
return response;
},
fetchIssuerWellknown: async context => {
const wellknownResponse = await CACHED_API.fetchIssuerWellknownConfig(
context.vcMetadata.issuer,
true,
);
try {
return getMatchingCredentialIssuerMetadata(
wellknownResponse,
context.verifiableCredential.credentialConfigurationId,
);
} catch (error) {
return {};
}
},
checkStatus: context => (callback, onReceive) => {
const pollInterval = setInterval(
() => callback(model.events.POLL()),
context.downloadInterval,
);
onReceive(async event => {
if (event.type === 'POLL_STATUS') {
try {
const response = await request(
API_URLS.credentialStatus.method,
API_URLS.credentialStatus.buildURL(context.vcMetadata.requestId),
);
switch (response.response?.statusCode) {
case 'NEW':
break;
case 'ISSUED':
case 'printing':
callback(model.events.DOWNLOAD_READY());
break;
case 'FAILED':
default:
callback(model.events.FAILED());
clearInterval(pollInterval);
break;
}
} catch (error) {
callback(model.events.FAILED());
clearInterval(pollInterval);
}
}
});
return () => clearInterval(pollInterval);
},
downloadCredential: context => (callback, onReceive) => {
const pollInterval = setInterval(
() => callback(model.events.POLL()),
context.downloadInterval,
);
onReceive(async event => {
if (event.type === 'POLL_DOWNLOAD') {
const response: CredentialDownloadResponse = await request(
API_URLS.credentialDownload.method,
API_URLS.credentialDownload.buildURL(),
{
individualId: context.vcMetadata.displayId,
requestId: context.vcMetadata.requestId,
},
);
callback(
model.events.CREDENTIAL_DOWNLOADED({
credential: response.credential,
verifiableCredential: response.verifiableCredential,
generatedOn: new Date(),
idType: context.vcMetadata.idType,
requestId: context.vcMetadata.requestId,
lastVerifiedOn: null,
walletBindingResponse: null,
credentialRegistry: '',
}),
);
}
});
return () => clearInterval(pollInterval);
},
verifyCredential: async context => {
if (context.verifiableCredential) {
const verificationResult = await verifyCredential(
getVerifiableCredential(context.verifiableCredential),
);
if (!verificationResult.isVerified) {
throw new Error(verificationResult.errorMessage);
}
}
},
};
};