diff --git a/lib/app/shared/helper_functions/helper_functions.dart b/lib/app/shared/helper_functions/helper_functions.dart index 2056dde21..56e67edcc 100644 --- a/lib/app/shared/helper_functions/helper_functions.dart +++ b/lib/app/shared/helper_functions/helper_functions.dart @@ -457,3 +457,31 @@ OIDC4VCType? getOIDC4VCTypeForIssuance(String url) { } return null; } + +(String, List?, String?) getCredentialData({ + required List credentials, + OIDC4VCType? oidc4vcType, +}) { + late String credential; + late List credentialSupported; + late String format; + + for (final cred in credentials) { + if (cred is String) { + credential = cred; + if (oidc4vcType != null) { + credentialSupported = oidc4vcType.credentialSupported; + format = oidc4vcType.issuerVcType; + } + } else if (cred is Map) { + credentialSupported = + (cred['types'] as List).map((e) => e.toString()).toList(); + credential = credentialSupported.last; + format = cred['format'].toString(); + } else { + throw Exception(); + } + } + + return (credential, credentialSupported, format); +} diff --git a/lib/dashboard/home/tab_bar/credentials/oid4c4vc_pick/oid4c4vc_credential_pick/view/oid4c4vc_credential_pick_page.dart b/lib/dashboard/home/tab_bar/credentials/oid4c4vc_pick/oid4c4vc_credential_pick/view/oid4c4vc_credential_pick_page.dart index cbd7541d9..ff9947543 100644 --- a/lib/dashboard/home/tab_bar/credentials/oid4c4vc_pick/oid4c4vc_credential_pick/view/oid4c4vc_credential_pick_page.dart +++ b/lib/dashboard/home/tab_bar/credentials/oid4c4vc_pick/oid4c4vc_credential_pick/view/oid4c4vc_credential_pick_page.dart @@ -76,14 +76,8 @@ class Oidc4vcCredentialPickView extends StatelessWidget { : () { if (state.isEmpty) return; - final creds = []; - - for (final i in state) { - creds.add(credentials[i]); - } - context.read().addCredentialsInLoop( - credentials: creds, + credentials: credentials, userPin: userPin, ); }, @@ -96,8 +90,12 @@ class Oidc4vcCredentialPickView extends StatelessWidget { ...List.generate( credentials.length, (index) { + final (credential, _, _) = getCredentialData( + credentials: credentials, + ); + final CredentialSubjectType credentialSubjectType = - getCredTypeFromName(credentials[index].toString()) ?? + getCredTypeFromName(credential) ?? CredentialSubjectType.defaultCredential; final DiscoverDummyCredential discoverDummyCredential = @@ -122,7 +120,7 @@ class Oidc4vcCredentialPickView extends StatelessWidget { credentialPreview: Credential( 'dummy1', ['dummy2'], - [credentials[index].toString()], + [credential], 'dummy4', 'dummy5', '', diff --git a/lib/dashboard/qr_code/qr_code_scan/cubit/qr_code_scan_cubit.dart b/lib/dashboard/qr_code/qr_code_scan/cubit/qr_code_scan_cubit.dart index 2e8dd84e7..cd489bae8 100644 --- a/lib/dashboard/qr_code/qr_code_scan/cubit/qr_code_scan_cubit.dart +++ b/lib/dashboard/qr_code/qr_code_scan/cubit/qr_code_scan_cubit.dart @@ -539,9 +539,9 @@ class QRCodeScanCubit extends Cubit { case OIDC4VCType.GAIAX: case OIDC4VCType.EBSIV2: + case OIDC4VCType.EBSIV3: break; - case OIDC4VCType.EBSIV3: case OIDC4VCType.JWTVC: throw Exception(); } @@ -805,7 +805,12 @@ class QRCodeScanCubit extends Cubit { for (int i = 0; i < credentials.length; i++) { emit(state.loading()); - final credentialType = credentials[i]; + + final (credential, credentialSupported, format) = getCredentialData( + credentials: credentials, + oidc4vcType: currentOIIDC4VCTypeForIssuance, + ); + await getAndAddCredential( scannedResponse: state.uri.toString(), credentialsCubit: credentialsCubit, @@ -813,10 +818,12 @@ class QRCodeScanCubit extends Cubit { oidc4vcType: currentOIIDC4VCTypeForIssuance, didKitProvider: didKitProvider, secureStorageProvider: getSecureStorage, - credentialType: credentialType.toString(), + credentialType: credential, isLastCall: i + 1 == credentials.length, dioClient: DioClient('', Dio()), userPin: userPin, + credentialSupported: credentialSupported!, + format: format!, ); } oidc4vc.resetNonceAndAccessToken(); diff --git a/lib/oidc4vc/initiate_oidv4vc_credential_issuance.dart b/lib/oidc4vc/initiate_oidv4vc_credential_issuance.dart index 449d6b33a..77c194c0f 100644 --- a/lib/oidc4vc/initiate_oidv4vc_credential_issuance.dart +++ b/lib/oidc4vc/initiate_oidv4vc_credential_issuance.dart @@ -21,32 +21,31 @@ Future initiateOIDC4VCCredentialIssuance({ }) async { final Uri uriFromScannedResponse = Uri.parse(scannedResponse); - late dynamic credentialType; + late dynamic credentials; switch (oidc4vcType) { case OIDC4VCType.DEFAULT: case OIDC4VCType.HEDERA: + case OIDC4VCType.EBSIV3: final dynamic credentialOfferJson = await getCredentialOfferJson( scannedResponse: scannedResponse, dioClient: dioClient, ); if (credentialOfferJson == null) throw Exception(); - credentialType = credentialOfferJson['credentials']; + credentials = credentialOfferJson['credentials']; case OIDC4VCType.GAIAX: case OIDC4VCType.EBSIV2: - credentialType = - uriFromScannedResponse.queryParameters['credential_type']; + credentials = uriFromScannedResponse.queryParameters['credential_type']; - case OIDC4VCType.EBSIV3: case OIDC4VCType.JWTVC: break; } - if (credentialType is List) { + if (credentials is List) { qrCodeScanCubit.navigateToOidc4vcCredentialPickPage( - credentials: credentialType, + credentials: credentials, userPin: userPin, ); } else { @@ -57,11 +56,13 @@ Future initiateOIDC4VCCredentialIssuance({ oidc4vc: oidc4vc, didKitProvider: didKitProvider, credentialsCubit: credentialsCubit, - credentialType: credentialType.toString(), + credentialType: credentials.toString(), secureStorageProvider: secureStorageProvider, isLastCall: true, dioClient: dioClient, userPin: userPin, + credentialSupported: oidc4vcType.credentialSupported, + format: oidc4vcType.issuerVcType, ); oidc4vc.resetNonceAndAccessToken(); qrCodeScanCubit.goBack(); @@ -79,6 +80,8 @@ Future getAndAddCredential({ required bool isLastCall, required DioClient dioClient, required String? userPin, + required List credentialSupported, + required String format, }) async { final Uri uriFromScannedResponse = Uri.parse(scannedResponse); @@ -88,6 +91,7 @@ Future getAndAddCredential({ switch (oidc4vcType) { case OIDC4VCType.DEFAULT: case OIDC4VCType.HEDERA: + case OIDC4VCType.EBSIV3: final dynamic credentialOfferJson = await getCredentialOfferJson( scannedResponse: scannedResponse, dioClient: dioClient, @@ -106,7 +110,6 @@ Future getAndAddCredential({ preAuthorizedCode = uriFromScannedResponse.queryParameters['pre-authorized_code']; - case OIDC4VCType.EBSIV3: case OIDC4VCType.JWTVC: throw Exception(); } @@ -134,9 +137,10 @@ Future getAndAddCredential({ kid: kid, credentialRequestUri: uriFromScannedResponse, privateKey: privateKey, - credentialSupportedTypes: oidc4vcType.credentialSupported, + credentialSupportedTypes: credentialSupported, indexValue: oidc4vcType.indexValue, userPin: userPin, + format: format, ); await addOIDC4VCCredential( diff --git a/lib/splash/bloclisteners/blocklisteners.dart b/lib/splash/bloclisteners/blocklisteners.dart index d5ab2a97b..d4655773e 100644 --- a/lib/splash/bloclisteners/blocklisteners.dart +++ b/lib/splash/bloclisteners/blocklisteners.dart @@ -268,6 +268,7 @@ final qrCodeBlocListener = BlocListener( switch (currentOIIDC4VCTypeForIssuance) { case OIDC4VCType.DEFAULT: case OIDC4VCType.HEDERA: + case OIDC4VCType.EBSIV3: final dynamic credentialOfferJson = await getCredentialOfferJson( scannedResponse: state.uri!.toString(), @@ -282,7 +283,6 @@ final qrCodeBlocListener = BlocListener( case OIDC4VCType.EBSIV2: subtitle = state.uri!.queryParameters['issuer'].toString(); - case OIDC4VCType.EBSIV3: case OIDC4VCType.JWTVC: throw Exception(); } diff --git a/packages/oidc4vc/lib/src/oidc4vc.dart b/packages/oidc4vc/lib/src/oidc4vc.dart index db8c67831..744b5ac8c 100644 --- a/packages/oidc4vc/lib/src/oidc4vc.dart +++ b/packages/oidc4vc/lib/src/oidc4vc.dart @@ -193,6 +193,7 @@ class OIDC4VC { required String kid, required Uri credentialRequestUri, required List credentialSupportedTypes, + required String format, required int indexValue, String? preAuthorizedCode, String? mnemonic, @@ -246,6 +247,7 @@ class OIDC4VC { openidConfigurationResponse: openidConfigurationResponse, credentialType: credentialType, credentialSupportedTypes: credentialSupportedTypes, + format: format, ); /// sign proof @@ -420,6 +422,7 @@ class OIDC4VC { required Response> openidConfigurationResponse, required String credentialType, required List credentialSupportedTypes, + required String format, }) async { final vcJwt = await getIssuerJwt(issuerTokenParameters, nonce); @@ -438,7 +441,7 @@ class OIDC4VC { final credentialData = { 'type': credentialType, 'types': credentialSupportedTypes, - 'format': oidc4vcModel.issuerVcType, + 'format': format, 'proof': { 'proof_type': 'jwt', 'jwt': vcJwt, diff --git a/pubspec.yaml b/pubspec.yaml index 73faaa88f..ad68d2ec0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: altme description: AltMe Flutter App -version: 1.20.2+249 +version: 1.20.3+250 publish_to: none environment: