Skip to content

Commit

Permalink
Merge branch 'main' into TALAO
Browse files Browse the repository at this point in the history
  • Loading branch information
hawkbee1 committed Oct 10, 2024
2 parents d8414e8 + 75d757d commit a2f1ad1
Show file tree
Hide file tree
Showing 48 changed files with 812 additions and 120 deletions.
3 changes: 3 additions & 0 deletions lib/activity_log/activity_log.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export 'activity_log_manager.dart';
export 'log_class.dart';
export 'log_enum.dart';
119 changes: 119 additions & 0 deletions lib/activity_log/activity_log_manager.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
import 'dart:convert';

import 'package:altme/activity_log/activity_log.dart';
import 'package:secure_storage/secure_storage.dart';

class ActivityLogManager {
ActivityLogManager(SecureStorageProvider secureStorageProvider)
: _secureStorageProvider = secureStorageProvider;

final SecureStorageProvider _secureStorageProvider;

static const int maxLogsPerBatch = 100;

/// Get logs from single batch
Future<List<LogData>> _getLogsForCurrentBatch(int index) async {
final logDataJson = await _secureStorageProvider.get('log_batch_$index');

if (logDataJson != null) {
final logStrings = logDataJson.split('\n');
return logStrings
.map(
(logString) => LogData.fromJson(
jsonDecode(logString) as Map<String, dynamic>,
),
)
.toList();
}
return [];
}

/// Set log entry
Future<void> saveLog(LogData log) async {
final currentBatchIndex = await _getCurrentBatchIndex();

List<LogData> logs = await _getLogsForCurrentBatch(currentBatchIndex);

// If the batch is full, increment the batch index and start a new batch
if (logs.length >= maxLogsPerBatch) {
await _incrementBatchIndex();
logs = [];
}

logs.add(log);

final logJsonList = logs.map((log) => jsonEncode(log.toJson())).toList();

await _secureStorageProvider.set(
'log_batch_$currentBatchIndex',
logJsonList.join('\n'),
);
}

/// Get logs from all batches
Future<List<LogData>> readAllLogs() async {
final currentBatchIndex = await _getCurrentBatchIndex();
final allLogs = <LogData>[];

for (int i = currentBatchIndex; i == 0; i--) {
final logData = await _getLogsForCurrentBatch(i);
allLogs.addAll(logData.reversed.toList());
}
return allLogs;
}

// /// Get paginated logs
// Future<List<LogData>> readLogs(int limit, int offset) async {
// final allLogs = <LogData>[];

// final currentBatchIndex = await _getCurrentBatchIndex();
// // Retrieve logs from all batches
// for (int i = 0; i <= currentBatchIndex; i++) {
// final logData = await _secureStorageProvider.get('log_batch_$i');
// if (logData != null) {
// final logStrings = logData.split('\n');
// final logs = logStrings
// .map(
// (logString) => LogData.fromJson(
// jsonDecode(logString) as Map<String, dynamic>,
// ),
// )
// .toList();
// allLogs.addAll(logs);
// }
// }

// // Apply pagination logic (limit and offset)
// // but this logic needs to be improved.. it is paginating later..
// // we need to consider while fetching
// return allLogs.skip(offset).take(limit).toList();
// }

/// Clear all logs
Future<void> clearLogs() async {
final currentBatchIndex = await _getCurrentBatchIndex();
for (int i = 0; i <= currentBatchIndex; i++) {
await _secureStorageProvider.delete('log_batch_$i');
}
await _secureStorageProvider.delete('currentBatchIndex');
}

/// get Current Batch
Future<int> _getCurrentBatchIndex() async {
final index = await _secureStorageProvider.get('currentBatchIndex');
if (index != null) {
return int.parse(index);
}

return 0;
}

Future<void> _incrementBatchIndex() async {
final currentBatchIndex = await _getCurrentBatchIndex();
final newBatchIndex = currentBatchIndex + 1;
await _secureStorageProvider.set(
'currentBatchIndex',
newBatchIndex.toString(),
);
}
}
55 changes: 55 additions & 0 deletions lib/activity_log/log_class.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import 'package:altme/activity_log/activity_log.dart';
import 'package:altme/app/app.dart';
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';

part 'log_class.g.dart';

@JsonSerializable()
class LogData extends Equatable {
LogData({
required this.type,
DateTime? timestamp,
this.vcInfo,
}) : timestamp = timestamp ?? DateTime.now();

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

final LogType type;
final DateTime timestamp;
final VCInfo? vcInfo;

Map<String, dynamic> toJson() => _$LogDataToJson(this);

@override
List<Object?> get props => [
type,
timestamp,
vcInfo,
];
}

@JsonSerializable()
class VCInfo extends Equatable {
const VCInfo({
required this.id,
required this.name,
this.domain,
});

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

final String id;
final String name;
final String? domain;

Map<String, dynamic> toJson() => _$VCInfoToJson(this);

@override
List<Object?> get props => [
id,
name,
domain,
];
}
9 changes: 9 additions & 0 deletions lib/activity_log/log_enum.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
enum LogType {
walletInit,
backupData,
restoreWallet,
addVC,
deleteVC,
presentVC,
importKey,
}
21 changes: 9 additions & 12 deletions lib/app/shared/constants/constants_json.dart
Original file line number Diff line number Diff line change
Expand Up @@ -305,26 +305,26 @@ abstract class ConstantsJson {
static const walletMetadataForIssuers = <String, dynamic>{
'vp_formats_supported': {
'jwt_vp': {
'alg_values_supported': ['ES256', 'ES256K', 'EdDSA'],
'alg': ['ES256', 'ES256K', 'EdDSA'],
},
'jwt_vc': {
'alg_values_supported': ['ES256', 'ES256K', 'EdDSA'],
'alg': ['ES256', 'ES256K', 'EdDSA'],
},
'jwt_vp_json': {
'alg_values_supported': ['ES256', 'ES256K', 'EdDSA'],
'alg': ['ES256', 'ES256K', 'EdDSA'],
},
'jwt_vc_json': {
'alg_values_supported': ['ES256', 'ES256K', 'EdDSA'],
'alg': ['ES256', 'ES256K', 'EdDSA'],
},
'vc+sd-jwt': {
'alg_values_supported': ['ES256', 'ES256K', 'EdDSA'],
'alg': ['ES256', 'ES256K', 'EdDSA'],
},
'ldp_vp': {
'proof_type': [
'JsonWebSignature2020',
'Ed25519Signature2018',
'EcdsaSecp256k1Signature2019',
'RsaSignature2018',
'RsaSignature2018'
],
},
'ldp_vc': {
Expand All @@ -337,24 +337,21 @@ abstract class ConstantsJson {
},
},
'grant_types': ['authorization code', 'pre-authorized_code'],
'redirect_uris': [Parameters.redirectUri],
'redirect_uris': [Parameters.authorizationEndPoint],
'subject_syntax_types_supported': ['did:key', 'did:jwk'],
'subject_syntax_types_discriminations': [
'did:key:jwk_jcs-pub',
'did:ebsi:v1',
],
'response_types_supported': ['vp_token', 'id_token'],
'token_endpoint_auth_method_supported': [
'none',
'client_id',
'client_secret_post',
'client_secret_basic',
'client_secret_jwt',
],
'credential_offer_endpoint_supported': [
'openid-credential-offer://',
'haip://',
],
'credential_offer_endpoint': ['openid-credential-offer://', 'haip://'],
'client_name': '${Parameters.appName} wallet',
'contacts': ['[email protected]'],
};

Expand Down
7 changes: 7 additions & 0 deletions lib/app/shared/date/date.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,13 @@ class UiDate {
return outputFormat.format(dateTime);
}

static String formatDatetime(DateTime dateTime) {
final date = '${dateTime.year}.${dateTime.month}.${dateTime.day}';
final time = '${dateTime.hour}:${dateTime.minute}:${dateTime.second}';

return '$date $time';
}

static String? formatTime(String formattedString) {
try {
final DateTime dt =
Expand Down
3 changes: 2 additions & 1 deletion lib/app/shared/helper_functions/helper_functions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -650,7 +650,8 @@ bool isSIOPV2OROIDC4VPUrl(Uri uri) {
final isOpenIdUrl = uri.toString().startsWith('openid://?') ||
uri.toString().startsWith('openid-vc://?') ||
uri.toString().startsWith('openid-hedera://?') ||
uri.toString().startsWith('haip://?');
uri.toString().startsWith('haip://?') ||
uri.toString().startsWith('haip://authorize?');

final isSiopv2Url = uri.toString().startsWith('siopv2://?');
final isAuthorizeEndPoint =
Expand Down
3 changes: 3 additions & 0 deletions lib/app/view/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT.

import 'package:altme/activity_log/activity_log.dart';
import 'package:altme/app/app.dart';
import 'package:altme/chat_room/chat_room.dart';
import 'package:altme/connection_bridge/connection_bridge.dart';
Expand Down Expand Up @@ -149,6 +150,7 @@ class App extends StatelessWidget {
jwtDecode: JWTDecode(),
profileCubit: context.read<ProfileCubit>(),
walletCubit: context.read<WalletCubit>(),
activityLogManager: ActivityLogManager(secureStorageProvider),
),
),
BlocProvider<ManageNetworkCubit>(
Expand Down Expand Up @@ -184,6 +186,7 @@ class App extends StatelessWidget {
walletCubit: context.read<WalletCubit>(),
oidc4vc: OIDC4VC(),
jwtDecode: JWTDecode(),
activityLogManager: ActivityLogManager(secureStorageProvider),
),
),
BlocProvider<AltmeChatSupportCubit>(
Expand Down
21 changes: 21 additions & 0 deletions lib/credentials/cubit/credentials_cubit.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:convert';

import 'package:altme/activity_log/activity_log.dart';
import 'package:altme/app/app.dart';
import 'package:altme/dashboard/dashboard.dart';
import 'package:altme/dashboard/home/tab_bar/credentials/models/activity/activity.dart';
Expand Down Expand Up @@ -36,6 +37,7 @@ class CredentialsCubit extends Cubit<CredentialsState> {
required this.profileCubit,
required this.oidc4vc,
required this.walletCubit,
required this.activityLogManager,
}) : super(const CredentialsState());

final CredentialsRepository credentialsRepository;
Expand All @@ -48,6 +50,7 @@ class CredentialsCubit extends Cubit<CredentialsState> {
final ProfileCubit profileCubit;
final OIDC4VC oidc4vc;
final WalletCubit walletCubit;
final ActivityLogManager activityLogManager;

final log = getLogger('CredentialsCubit');

Expand Down Expand Up @@ -196,13 +199,24 @@ class CredentialsCubit extends Cubit<CredentialsState> {
bool showMessage = true,
}) async {
emit(state.loading());

final credential =
state.credentials.where((element) => element.id == id).first;

await credentialsRepository.deleteById(id);
final credentials = List.of(state.credentials)
..removeWhere((element) => element.id == id);
final dummies = _getAvalaibleDummyCredentials(
credentials: credentials,
blockchainType: blockchainType,
);

await activityLogManager.saveLog(
LogData(
type: LogType.deleteVC,
vcInfo: VCInfo(id: credential.id, name: credential.getName),
),
);
emit(
state.copyWith(
status: CredentialsStatus.delete,
Expand Down Expand Up @@ -325,6 +339,13 @@ class CredentialsCubit extends Cubit<CredentialsState> {
blockchainType: blockchainType,
);

await activityLogManager.saveLog(
LogData(
type: LogType.addVC,
vcInfo: VCInfo(id: credential.id, name: credential.getName),
),
);

emit(
state.copyWith(
status: showStatus ? CredentialsStatus.insert : CredentialsStatus.idle,
Expand Down
18 changes: 10 additions & 8 deletions lib/dashboard/discover/view/discover_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,16 @@ class _DiscoverPageState extends State<DiscoverPage> {
Widget build(BuildContext context) {
return BasePage(
scrollView: false,
padding: Parameters.walletHandlesCrypto
? EdgeInsets.zero
: const EdgeInsets.fromLTRB(
Sizes.spaceSmall,
Sizes.spaceSmall,
Sizes.spaceSmall,
0,
),
padding:
// Parameters.walletHandlesCrypto
// ? EdgeInsets.zero
// :
const EdgeInsets.fromLTRB(
Sizes.spaceSmall,
Sizes.spaceSmall,
Sizes.spaceSmall,
0,
),
backgroundColor: Colors.transparent,
body: BlocListener<ProfileCubit, ProfileState>(
listenWhen: (previous, current) {
Expand Down
Loading

0 comments on commit a2f1ad1

Please sign in to comment.