mirror of
https://github.com/authpass/authpass.git
synced 2025-05-17 22:36:19 +08:00
WIP: local conflict detection - not working, because most platforms have no direct access to local file system.
This commit is contained in:
@ -8,11 +8,14 @@ import 'package:authpass/utils/path_utils.dart';
|
||||
import 'package:authpass/utils/platform.dart';
|
||||
import 'package:authpass/utils/uuid_util.dart';
|
||||
import 'package:file_picker_writable/file_picker_writable.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:macos_secure_bookmarks/macos_secure_bookmarks.dart';
|
||||
import 'package:path/path.dart' as path;
|
||||
import 'package:pedantic/pedantic.dart';
|
||||
|
||||
part 'file_source_local.g.dart';
|
||||
|
||||
final _logger = Logger('file_source_local');
|
||||
|
||||
class FileSourceLocal extends FileSource {
|
||||
@ -67,7 +70,27 @@ class FileSourceLocal extends FileSource {
|
||||
|
||||
@override
|
||||
Stream<FileContent> load() async* {
|
||||
yield await _accessFile((f) async => FileContent(await f.readAsBytes()));
|
||||
yield await _accessFile((f) async {
|
||||
final lastModified = f.lastModifiedSync();
|
||||
final fileSize = f.lengthSync();
|
||||
final bytes = await f.readAsBytes();
|
||||
if (bytes.lengthInBytes != fileSize) {
|
||||
throw StateError('length in filesystem different from read bytes. '
|
||||
'filesystem Size: $fileSize, read: ${bytes.lengthInBytes}');
|
||||
}
|
||||
final newLastModified = f.lastModifiedSync();
|
||||
if (lastModified != newLastModified) {
|
||||
throw StateError('File changed while reading file. '
|
||||
'old: $lastModified / new: $newLastModified');
|
||||
}
|
||||
return FileContent(
|
||||
bytes,
|
||||
FileSourceLocalMetadata(
|
||||
lastModifiedAt: lastModified,
|
||||
length: fileSize,
|
||||
).toJson(),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
Future<T> _accessFile<T>(Future<T> Function(File file) cb) async {
|
||||
@ -205,3 +228,17 @@ class FileSourceLocal extends FileSource {
|
||||
macOsSecureBookmark != null ? 'macOsSecureBookmark' : 'internal',
|
||||
};
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class FileSourceLocalMetadata {
|
||||
FileSourceLocalMetadata({
|
||||
required this.lastModifiedAt,
|
||||
required this.length,
|
||||
});
|
||||
factory FileSourceLocalMetadata.fromJson(Map<String, dynamic> json) =>
|
||||
_$FileSourceLocalMetadataFromJson(json);
|
||||
Map<String, dynamic> toJson() => _$FileSourceLocalMetadataToJson(this);
|
||||
|
||||
final DateTime lastModifiedAt;
|
||||
final int length;
|
||||
}
|
||||
|
22
authpass/lib/bloc/kdbx/file_source_local.g.dart
Normal file
22
authpass/lib/bloc/kdbx/file_source_local.g.dart
Normal file
@ -0,0 +1,22 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'file_source_local.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
FileSourceLocalMetadata _$FileSourceLocalMetadataFromJson(
|
||||
Map<String, dynamic> json) {
|
||||
return FileSourceLocalMetadata(
|
||||
lastModifiedAt: DateTime.parse(json['lastModifiedAt'] as String),
|
||||
length: json['length'] as int,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> _$FileSourceLocalMetadataToJson(
|
||||
FileSourceLocalMetadata instance) =>
|
||||
<String, dynamic>{
|
||||
'lastModifiedAt': instance.lastModifiedAt.toIso8601String(),
|
||||
'length': instance.length,
|
||||
};
|
Reference in New Issue
Block a user