mirror of
https://github.com/mosip/inji-wallet.git
synced 2026-01-07 20:53:54 -05:00
[INJIMOB-3571] | [INJIMOB-3572] refactor: Modify trusted verifiers construction (#2094)
* [INJIMOB-3571] add: modify trusted verifiers Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-3571] add: modify trusted verifiers in swift Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-3571] refactor: remove unused logs and code Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-3572] add: support for unsigned request in pre-registered verifiers Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-3572] chore: update openid4vp swift package version Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-3571] refactor: revert changes trustedVerifiers cachePreference Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-3558] refactor: update vc renderer renderVc to generateCredentualDisplayCOntent Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-3559] fix: bridging issue of generateCredentialContent method Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-3559] refactor: modify vc renderer native module Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-3559] refactor: modify vc renderer native module Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-3559] chore: update vc renderer swift package Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> --------- Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>
This commit is contained in:
committed by
GitHub
parent
6c1e23a3d2
commit
8f17535a25
@@ -26,6 +26,7 @@ import com.google.gson.GsonBuilder;
|
||||
|
||||
import io.mosip.openID4VP.authorizationRequest.clientMetadata.ClientMetadata;
|
||||
import io.mosip.openID4VP.authorizationRequest.clientMetadata.ClientMetadataSerializer;
|
||||
import io.mosip.openID4VP.authorizationRequest.clientMetadata.Jwks;
|
||||
import io.mosip.openID4VP.constants.ClientIdScheme;
|
||||
import io.mosip.openID4VP.constants.ContentEncryptionAlgorithm;
|
||||
import io.mosip.openID4VP.constants.KeyManagementAlgorithm;
|
||||
@@ -235,19 +236,21 @@ public class InjiOpenID4VPModule extends ReactContextBaseJavaModule {
|
||||
String clientId = verifierMap.getString("client_id");
|
||||
ReadableArray responseUris = verifierMap.getArray("response_uris");
|
||||
List<String> responseUriList = convertReadableArrayToList(responseUris);
|
||||
ClientMetadata clientMetadata = null;
|
||||
if (verifierMap.hasKey("client_metadata") && !verifierMap.isNull("client_metadata")) {
|
||||
String jwksUri = null;
|
||||
if (verifierMap.hasKey("jwks_uri") && !verifierMap.isNull("jwks_uri")) {
|
||||
try {
|
||||
ReadableMap metadataMap = verifierMap.getMap("client_metadata");
|
||||
String metadataJsonString = readableMapToJson(metadataMap).toString();
|
||||
clientMetadata = Json.Default.decodeFromString(ClientMetadataSerializer.INSTANCE,
|
||||
metadataJsonString);
|
||||
jwksUri = verifierMap.getString("jwks_uri");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if(verifierMap.hasKey("allow_unsigned_request")){
|
||||
boolean allowUnsignedRequest = verifierMap.getBoolean("allow_unsigned_request");
|
||||
verifiers.add(new Verifier(clientId, responseUriList, jwksUri, allowUnsignedRequest));
|
||||
continue;
|
||||
}
|
||||
|
||||
verifiers.add(new Verifier(clientId, responseUriList, clientMetadata));
|
||||
verifiers.add(new Verifier(clientId, responseUriList, jwksUri));
|
||||
}
|
||||
|
||||
return verifiers;
|
||||
|
||||
@@ -2,7 +2,6 @@ package io.mosip.residentapp;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.Promise;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
@@ -35,10 +34,14 @@ public class RNInjiVcRendererModule extends ReactContextBaseJavaModule {
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void renderVC(String credentialFormat, String wellKnown, String vcJsonString, Promise promise) {
|
||||
public void generateCredentialDisplayContent(String credentialFormat, String wellKnown, String vcJsonString, Promise promise) {
|
||||
try {
|
||||
List<Object> results = injiVcRenderer.renderVC(
|
||||
CredentialFormat.Companion.fromValue(credentialFormat),
|
||||
CredentialFormat format = CredentialFormat.Companion.fromValue(credentialFormat);
|
||||
if (format == null) {
|
||||
throw new UnsupportedOperationException("Invalid credential format: " + credentialFormat);
|
||||
}
|
||||
List<Object> results = injiVcRenderer.generateCredentialDisplayContent(
|
||||
format,
|
||||
wellKnown,
|
||||
vcJsonString
|
||||
);
|
||||
|
||||
@@ -14,7 +14,6 @@ buildscript {
|
||||
google()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
mavenLocal()
|
||||
}
|
||||
dependencies {
|
||||
classpath("com.android.tools.build:gradle:8.4.0")
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
"location" : "https://github.com/mosip/inji-openid4vp-ios-swift.git",
|
||||
"state" : {
|
||||
"branch" : "release-0.5.x",
|
||||
"revision" : "e939d4acf4e9f54d902b65913b93432fcd068b46"
|
||||
"revision" : "b3ce7ef9f70229d76e01af89dcf92e7d9d677254"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -88,7 +88,7 @@
|
||||
"location" : "https://github.com/mosip/inji-vc-renderer-ios-swift.git",
|
||||
"state" : {
|
||||
"branch" : "release-0.1.x",
|
||||
"revision" : "97842f70c7bc510afb0bb415b9806b4e722808f0"
|
||||
"revision" : "68b6c14aaf1e572f84307e0f932d93a66134055d"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -6,11 +6,10 @@
|
||||
RCT_EXTERN_METHOD(init:(NSString *)traceabilityId)
|
||||
|
||||
|
||||
RCT_EXTERN_METHOD(renderVC:(NSString *)credentialFormat
|
||||
wellKnown:(NSString *)wellKnown
|
||||
RCT_EXTERN_METHOD(generateCredentialDisplayContent: (NSString *)credentialFormat
|
||||
wellKnown:(NSString * _Nullable)wellKnown
|
||||
vcJsonString:(NSString *)vcJsonString
|
||||
resolver:(RCTPromiseResolveBlock)resolve
|
||||
rejecter:(RCTPromiseRejectBlock)reject)
|
||||
|
||||
|
||||
@end
|
||||
|
||||
@@ -3,55 +3,57 @@ import React
|
||||
import InjiVcRenderer
|
||||
@objc(InjiVcRenderer)
|
||||
class RNInjiVcRenderer: NSObject, RCTBridgeModule {
|
||||
|
||||
private var vcRenderer: InjiVcRenderer?
|
||||
|
||||
@objc static func requiresMainQueueSetup() -> Bool {
|
||||
return false
|
||||
}
|
||||
|
||||
static func moduleName() -> String {
|
||||
return "InjiVcRenderer"
|
||||
}
|
||||
|
||||
|
||||
private var vcRenderer: InjiVcRenderer?
|
||||
|
||||
@objc static func requiresMainQueueSetup() -> Bool {
|
||||
return false
|
||||
}
|
||||
|
||||
static func moduleName() -> String {
|
||||
return "InjiVcRenderer"
|
||||
}
|
||||
|
||||
@objc
|
||||
func `init`(_ traceabilityId: String) {
|
||||
vcRenderer = InjiVcRenderer(traceabilityId: traceabilityId)
|
||||
}
|
||||
|
||||
|
||||
@objc(renderVC:wellKnown:vcJsonString:resolver:rejecter:)
|
||||
func renderVC(
|
||||
credentialFormat: String,
|
||||
wellKnown: String?,
|
||||
vcJsonString: String,
|
||||
resolve: @escaping RCTPromiseResolveBlock,
|
||||
reject: @escaping RCTPromiseRejectBlock
|
||||
) {
|
||||
guard let renderer = self.vcRenderer else {
|
||||
reject(nil, "InjiVcRenderer not initialized", nil)
|
||||
return
|
||||
}
|
||||
|
||||
do {
|
||||
let format = CredentialFormat.fromValue(credentialFormat)
|
||||
let result = try renderer.renderVC(
|
||||
credentialFormat: format,
|
||||
wellKnownJson: wellKnown,
|
||||
vcJsonString: vcJsonString
|
||||
)
|
||||
resolve(result)
|
||||
} catch {
|
||||
rejectWithVcRendererError(error, reject: reject)
|
||||
}
|
||||
|
||||
|
||||
@objc(generateCredentialDisplayContent:wellKnown:vcJsonString:resolver:rejecter:)
|
||||
func generateCredentialDisplayContent(
|
||||
credentialFormat: String,
|
||||
wellKnown: String?,
|
||||
vcJsonString: String,
|
||||
resolve: @escaping RCTPromiseResolveBlock,
|
||||
reject: @escaping RCTPromiseRejectBlock
|
||||
) {
|
||||
guard let renderer = self.vcRenderer else {
|
||||
reject(nil, "InjiVcRenderer not initialized", nil)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
do {
|
||||
guard let format = CredentialFormat.fromValue(credentialFormat) else {
|
||||
throw NSError(domain: "Invalid credential format", code: 0)
|
||||
}
|
||||
let result = try renderer.generateCredentialDisplayContent(
|
||||
credentialFormat: format,
|
||||
wellKnownJson: wellKnown,
|
||||
vcJsonString: vcJsonString
|
||||
)
|
||||
resolve(result)
|
||||
} catch {
|
||||
rejectWithVcRendererError(error, reject: reject)
|
||||
}
|
||||
}
|
||||
|
||||
func rejectWithVcRendererError(_ error: Error, reject: RCTPromiseRejectBlock) {
|
||||
if let vcRendererError = error as? VcRendererException {
|
||||
reject(vcRendererError.errorCode, vcRendererError.message, vcRendererError)
|
||||
} else {
|
||||
let nsError = NSError(domain: error.localizedDescription, code: 0)
|
||||
reject("ERR_UNKNOWN", nsError.localizedDescription, nsError)
|
||||
}
|
||||
reject(vcRendererError.errorCode, vcRendererError.message, vcRendererError)
|
||||
} else {
|
||||
let nsError = NSError(domain: error.localizedDescription, code: 0)
|
||||
reject("ERR_UNKNOWN", nsError.localizedDescription, nsError)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,13 +197,13 @@ func sendErrorToVerifier(_ error: String, _ errorCode: String,
|
||||
throw NSError(domain: "OpenID4VP", code: -1, userInfo: [NSLocalizedDescriptionKey: "Invalid Verifier data"])
|
||||
}
|
||||
|
||||
var clientMetadata: ClientMetadata? = nil
|
||||
if let metadata = verifierDict["client_metadata"] as? [String: Any] {
|
||||
let encoded = try JSONSerialization.data(withJSONObject: metadata)
|
||||
clientMetadata = try ClientMetadata.deserializeAndValidate(clientMetadata: encoded)
|
||||
let jwksUri: String? = verifierDict["jwks_uri"] as? String
|
||||
|
||||
if let allowUnsignedRequest = verifierDict["allow_unsigned_request"] as? Bool {
|
||||
return Verifier(clientId: clientId, responseUris: responseUris, jwksUri: jwksUri, allowUnsignedRequest: allowUnsignedRequest)
|
||||
}
|
||||
|
||||
return Verifier(clientId: clientId, responseUris: responseUris,clientMetadata: clientMetadata)
|
||||
return Verifier(clientId: clientId, responseUris: responseUris,jwksUri: jwksUri)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ export const ViewVcModal: React.FC<ViewVcModalProps> = props => {
|
||||
setLoadingSvg(true);
|
||||
|
||||
const vcJsonString = JSON.stringify(controller.credential.credential);
|
||||
const result = await VcRenderer.getInstance().renderVC(
|
||||
const result = await VcRenderer.getInstance().generateCredentialDisplayContent(
|
||||
controller.verifiableCredentialData.format,
|
||||
wellknown ?? null,
|
||||
vcJsonString,
|
||||
|
||||
@@ -53,7 +53,7 @@ export const ReceiveVcScreen: React.FC = () => {
|
||||
setLoadingSvg(true);
|
||||
|
||||
const vcJsonString = JSON.stringify(controller.credential.credential);
|
||||
const result = await VcRenderer.getInstance().renderVC(
|
||||
const result = await VcRenderer.getInstance().generateCredentialDisplayContent(
|
||||
verifiableCredentialData.vcMetadata.format,
|
||||
wellknown ?? null,
|
||||
vcJsonString,
|
||||
|
||||
@@ -181,7 +181,8 @@ export const CACHED_API = {
|
||||
) =>
|
||||
generateCacheAPIFunction({
|
||||
isCachePreferred,
|
||||
cacheKey: API_CACHED_STORAGE_KEYS.fetchIssuerWellknownConfig(issuerCacheKey),
|
||||
cacheKey:
|
||||
API_CACHED_STORAGE_KEYS.fetchIssuerWellknownConfig(issuerCacheKey),
|
||||
fetchCall: API.fetchIssuerWellknownConfig.bind(null, credentialIssuer),
|
||||
}),
|
||||
|
||||
|
||||
@@ -154,7 +154,7 @@ class OpenID4VP {
|
||||
disclosureSet.size > 0
|
||||
? [jwt, ...disclosureSet].join('~') + '~'
|
||||
: jwt + '~';
|
||||
|
||||
|
||||
return finalSdJwt;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import {
|
||||
import {__AppId} from './GlobalVariables';
|
||||
import {MIMOTO_BASE_URL, REQUEST_TIMEOUT} from './constants';
|
||||
import NetInfo from '@react-native-community/netinfo';
|
||||
import { ErrorMessage } from './openId4VCI/Utils';
|
||||
import {ErrorMessage} from './openId4VCI/Utils';
|
||||
|
||||
export type HTTP_METHOD = 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';
|
||||
|
||||
@@ -78,16 +78,16 @@ export async function request(
|
||||
throw error;
|
||||
}
|
||||
|
||||
|
||||
let jsonResponse;
|
||||
try {
|
||||
jsonResponse = await response.json();
|
||||
} catch (jsonError) {
|
||||
console.warn(`Failed to parse JSON from ${requestUrl}`, jsonError);
|
||||
throw new Error(ErrorMessage.NETWORK_REQUEST_FAILED+' Invalid JSON response');
|
||||
throw new Error(
|
||||
ErrorMessage.NETWORK_REQUEST_FAILED + ' Invalid JSON response',
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
if (response.status >= 400) {
|
||||
const backendUrl = host + path;
|
||||
const errorMessage =
|
||||
@@ -102,9 +102,8 @@ export async function request(
|
||||
throw new Error(errorMessage);
|
||||
}
|
||||
|
||||
|
||||
if (jsonResponse.errors && jsonResponse.errors.length) {
|
||||
const { errorCode, errorMessage } = jsonResponse.errors.shift();
|
||||
const {errorCode, errorMessage} = jsonResponse.errors.shift();
|
||||
console.error(
|
||||
`The backend API ${requestUrl} returned structured error --> error code: ${errorCode}, message: ${errorMessage}`,
|
||||
);
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import {NativeModules} from 'react-native';
|
||||
import {MMKVLoader} from 'react-native-mmkv-storage';
|
||||
import {CACHE_TTL} from '../constants';
|
||||
import {__AppId} from '../GlobalVariables';
|
||||
import {isCacheExpired} from '../Utils';
|
||||
|
||||
@@ -31,7 +30,7 @@ class VcRenderer {
|
||||
return `${CACHE_KEY_PREFIX}${vcId}`;
|
||||
}
|
||||
|
||||
async renderVC(
|
||||
async generateCredentialDisplayContent(
|
||||
credentialFormat: string,
|
||||
wellKnown: string,
|
||||
vcJson: string,
|
||||
@@ -56,7 +55,7 @@ class VcRenderer {
|
||||
}
|
||||
|
||||
try {
|
||||
const result: string[] = await this.InjiVcRenderer.renderVC(
|
||||
const result: string[] = await this.InjiVcRenderer.generateCredentialDisplayContent(
|
||||
credentialFormat,
|
||||
wellKnown ? JSON.stringify(wellKnown) : null,
|
||||
vcJson,
|
||||
@@ -79,7 +78,7 @@ class VcRenderer {
|
||||
|
||||
async clearCache(vcId: string) {
|
||||
const cacheKey = this.createCacheKey(vcId);
|
||||
await MMKV.removeItem(cacheKey);
|
||||
MMKV.removeItem(cacheKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user