mirror of
https://github.com/mosip/inji-wallet.git
synced 2026-01-09 13:38:01 -05:00
* [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>
206 lines
6.5 KiB
TypeScript
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);
|
|
}
|
|
}
|
|
},
|
|
};
|
|
};
|