[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:
KiruthikaJeyashankar
2025-10-06 14:32:41 +05:30
committed by GitHub
parent 6c1e23a3d2
commit 8f17535a25
13 changed files with 84 additions and 79 deletions

View File

@@ -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;

View File

@@ -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
);

View File

@@ -14,7 +14,6 @@ buildscript {
google()
jcenter()
mavenCentral()
mavenLocal()
}
dependencies {
classpath("com.android.tools.build:gradle:8.4.0")

View File

@@ -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"
}
},
{

View File

@@ -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

View File

@@ -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)
}
}
}

View File

@@ -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)
}
}

View File

@@ -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,

View File

@@ -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,

View File

@@ -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),
}),

View File

@@ -154,7 +154,7 @@ class OpenID4VP {
disclosureSet.size > 0
? [jwt, ...disclosureSet].join('~') + '~'
: jwt + '~';
return finalSdJwt;
}
}

View File

@@ -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}`,
);

View File

@@ -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);
}
}