Skip to content

Commit

Permalink
Disclosure indexing issue fixed #2514
Browse files Browse the repository at this point in the history
  • Loading branch information
bibash28 committed Mar 19, 2024
1 parent 624d355 commit 687073b
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 21 deletions.
6 changes: 3 additions & 3 deletions lib/app/shared/helper_functions/helper_functions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1595,7 +1595,7 @@ Future<(String?, String?, String?, String?)> getClientDetails({
}

String? getClaimsData({
required Map<String, dynamic> uncryptedDatas,
required Map<String, dynamic> encryptedDatas,
required CredentialModel credentialModel,
required String key,
required bool selectFromSelectiveDisclosure,
Expand All @@ -1608,7 +1608,7 @@ String? getClaimsData({
);

try {
final uncryptedDataPath = dataPath.read(uncryptedDatas).first;
final uncryptedDataPath = dataPath.read(encryptedDatas).first;
data = uncryptedDataPath.value.toString();
} catch (e) {
if (!selectFromSelectiveDisclosure) {
Expand Down Expand Up @@ -1653,7 +1653,7 @@ String? getPicture({
final selectiveDisclosure = SelectiveDisclosure(credentialModel);

final data = getClaimsData(
uncryptedDatas: selectiveDisclosure.values,
encryptedDatas: selectiveDisclosure.extractedValuesFromJwt,
credentialModel: credentialModel,
key: 'picture',
selectFromSelectiveDisclosure: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,23 @@ class SelectiveDisclosureCubit extends Cubit<SelectiveDisclosureState> {
}
emit(state.copyWith(selected: selected));
}

void saveIndexOfSDJWT(int index) {
final bool isSelected = state.selectedSDIndexInJWT.contains(index);

late List<int> selected;

if (isSelected) {
/// deSelecting the credential
selected = List<int>.from(state.selectedSDIndexInJWT)
..removeWhere((element) => element == index);
} else {
/// selecting the credential
selected = [
...state.selectedSDIndexInJWT,
...[index],
];
}
emit(state.copyWith(selectedSDIndexInJWT: selected));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,24 @@ class SelectiveDisclosureState extends Equatable {
const SelectiveDisclosureState({
this.message,
this.selected = const [],
this.selectedSDIndexInJWT = const [],
});

factory SelectiveDisclosureState.fromJson(Map<String, dynamic> json) =>
_$SelectiveDisclosureStateFromJson(json);

final StateMessage? message;
final List<int> selected;
final List<int> selectedSDIndexInJWT;

SelectiveDisclosureState copyWith({
List<int>? selected,
List<int>? selectedSDIndexInJWT,
StateMessage? message,
}) {
return SelectiveDisclosureState(
selected: selected ?? this.selected,
selectedSDIndexInJWT: selectedSDIndexInJWT ?? this.selectedSDIndexInJWT,
message: message,
);
}
Expand All @@ -28,6 +32,7 @@ class SelectiveDisclosureState extends Equatable {
@override
List<Object?> get props => [
selected,
selectedSDIndexInJWT,
message,
];
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,11 @@ class SelectiveDisclosurePickView extends StatelessWidget {
credentialModel: credentialToBePresented,
claims: null,
selectedIndex: state.selected,
onPressed: (index) {
context.read<SelectiveDisclosureCubit>().toggle(index);
onPressed: (claimIndex, sdIndexInJWT) {
context.read<SelectiveDisclosureCubit>().toggle(claimIndex);
context
.read<SelectiveDisclosureCubit>()
.saveIndexOfSDJWT(sdIndexInJWT);
},
),
navigation: SafeArea(
Expand All @@ -114,7 +117,7 @@ class SelectiveDisclosurePickView extends StatelessWidget {
? null
: () => present(
context: context,
selectedIndex: state.selected,
selectedSDIndexInJWT: state.selectedSDIndexInJWT,
uri: uri,
),
text: l10n.credentialPickPresent,
Expand All @@ -130,7 +133,7 @@ class SelectiveDisclosurePickView extends StatelessWidget {

Future<void> present({
required BuildContext context,
required List<int> selectedIndex,
required List<int> selectedSDIndexInJWT,
required Uri uri,
}) async {
final bool userPINCodeForAuthentication = context
Expand All @@ -157,14 +160,17 @@ class SelectiveDisclosurePickView extends StatelessWidget {
}
}

final encryptedValues = credentialToBePresented.jwt?.split('~');
final encryptedValues = credentialToBePresented.jwt
?.split('~')
.where((element) => element.isNotEmpty)
.toList();

if (encryptedValues != null) {
var newJwt = '${encryptedValues[0]}~';

encryptedValues.removeAt(0);

for (final index in selectedIndex) {
for (final index in selectedSDIndexInJWT) {
newJwt = '$newJwt${encryptedValues[index]}~';
}

Expand Down
8 changes: 5 additions & 3 deletions lib/selective_disclosure/selective_disclosure.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,11 @@ class SelectiveDisclosure {
return claims;
}

Map<String, dynamic> get values {
final encryptedValues = credentialModel.jwt?.split('~');
Map<String, dynamic> get extractedValuesFromJwt {
final encryptedValues = credentialModel.jwt
?.split('~')
.where((element) => element.isNotEmpty)
.toList();
final extractedValues = <String, dynamic>{};
if (encryptedValues != null) {
encryptedValues.removeAt(0);
Expand All @@ -46,6 +49,5 @@ class SelectiveDisclosure {
}
}
return extractedValues;

}
}
26 changes: 17 additions & 9 deletions lib/selective_disclosure/widget/display_selective_disclosure.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'dart:convert';

import 'package:altme/app/app.dart';
import 'package:altme/dashboard/home/tab_bar/credentials/models/credential_model/credential_model.dart';
import 'package:altme/lang/cubit/lang_cubit.dart';
Expand All @@ -14,9 +16,11 @@ class DisplaySelectiveDisclosure extends StatelessWidget {
this.onPressed,
this.selectedIndex,
});

final CredentialModel credentialModel;

final Map<String, dynamic>? claims;
final void Function(int)? onPressed;
final void Function(int, int)? onPressed;
final List<int>? selectedIndex;

@override
Expand All @@ -33,15 +37,19 @@ class DisplaySelectiveDisclosure extends StatelessWidget {
final key = map.key;
final value = map.value;

final index = currentClaims.entries
final claimIndex = currentClaims.entries
.toList()
.indexWhere((entry) => entry.key == key);

final sdIndexInJWT = selectiveDisclosure.extractedValuesFromJwt.entries
.toList()
.indexWhere((entry) => entry.key == map.key);
.indexWhere((entry) => entry.key == key);

final bool hasChildren =
!(value as Map<String, dynamic>).containsKey('display');
if (hasChildren && value.isNotEmpty) {
return TransparentInkWell(
onTap: () => onPressed?.call(index),
onTap: () => onPressed?.call(claimIndex, sdIndexInJWT),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Expand All @@ -57,7 +65,7 @@ class DisplaySelectiveDisclosure extends StatelessWidget {
Padding(
padding: const EdgeInsets.only(top: 15, right: 10),
child: Icon(
selectedIndex!.contains(index)
selectedIndex!.contains(claimIndex)
? Icons.check_box
: Icons.check_box_outline_blank,
size: 25,
Expand All @@ -75,16 +83,16 @@ class DisplaySelectiveDisclosure extends StatelessWidget {
title = display['name'].toString();

data = getClaimsData(
uncryptedDatas: selectiveDisclosure.values,
encryptedDatas: selectiveDisclosure.extractedValuesFromJwt,
credentialModel: credentialModel,
key: key,
selectFromSelectiveDisclosure: selectedIndex != null,
selectFromSelectiveDisclosure: true,
);

if (data == null) return Container();

return TransparentInkWell(
onTap: () => onPressed?.call(index),
onTap: () => onPressed?.call(claimIndex, sdIndexInJWT),
child: Row(
children: [
Padding(
Expand All @@ -102,7 +110,7 @@ class DisplaySelectiveDisclosure extends StatelessWidget {
Padding(
padding: const EdgeInsets.only(top: 15, right: 10),
child: Icon(
selectedIndex!.contains(index)
selectedIndex!.contains(claimIndex)
? Icons.check_box
: Icons.check_box_outline_blank,
size: 25,
Expand Down

0 comments on commit 687073b

Please sign in to comment.