KeepassX format implementation in pure dart.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

88 lines
2.5 KiB

//typedef HashStuff = Pointer<Utf8> Function(Pointer<Utf8> str);
import 'dart:io';
import 'dart:typed_data';
import 'package:argon2_ffi_base/argon2_ffi_base.dart';
import 'package:kdbx/kdbx.dart';
import 'package:logging/logging.dart';
import 'package:logging_appenders/logging_appenders.dart';
final _logger = Logger('test_utils');
class TestUtil {
factory TestUtil() => instance;
TestUtil._() {
setupLogging();
}
static final instance = TestUtil._();
static final keyTitle = KdbxKey('Title');
static void setupLogging() =>
PrintAppender.setupLogging(stderrLevel: Level.WARNING);
late final kdbxFormat = _kdbxFormat();
static KdbxFormat _kdbxFormat() {
Argon2.resolveLibraryForceDynamic = true;
return KdbxFormat(Argon2FfiFlutter(resolveLibrary: (path) {
final cwd = Directory('.').absolute.uri;
final p = cwd.resolve(path);
final filePath = p.toFilePath();
_logger.fine('Resolving $path to: $filePath (${Platform.script})');
return filePath;
}));
}
Future<KdbxFile> readKdbxFile(
String filePath, {
String password = 'asdf',
}) async {
final data = await File(filePath).readAsBytes();
final file = await kdbxFormat.read(
data, Credentials(ProtectedValue.fromString(password)));
return file;
}
Future<KdbxFile> readKdbxFileBytes(Uint8List data,
{String password = 'asdf', Credentials? credentials}) async {
final file = await kdbxFormat.read(
data, credentials ?? Credentials(ProtectedValue.fromString(password)));
return file;
}
Future<KdbxFile> saveAndRead(KdbxFile file) async {
return await readKdbxFileBytes(await file.save(),
credentials: file.credentials);
}
Future<void> saveTestOutput(String name, KdbxFile file) async {
final bytes = await file.save();
final outFile = File('test_output_$name.kdbx');
await outFile.writeAsBytes(bytes);
_logger.info('Written to $outFile');
}
KdbxFile createEmptyFile() {
final file = kdbxFormat.create(
Credentials.composite(ProtectedValue.fromString('asdf'), null),
'example');
return file;
}
KdbxEntry createEntry(
KdbxFile file,
KdbxGroup group,
String username,
String password,
) {
final entry = KdbxEntry.create(file, group);
group.addEntry(entry);
entry.setString(KdbxKeyCommon.USER_NAME, PlainValue(username));
entry.setString(
KdbxKeyCommon.PASSWORD, ProtectedValue.fromString(password));
return entry;
}
}