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.
81 lines
2.5 KiB
81 lines
2.5 KiB
import 'package:clock/clock.dart'; |
|
import 'package:kdbx/src/kdbx_format.dart'; |
|
import 'package:kdbx/src/kdbx_object.dart'; |
|
import 'package:kdbx/src/kdbx_xml.dart'; |
|
import 'package:logging/logging.dart'; |
|
import 'package:quiver/iterables.dart'; |
|
import 'package:xml/xml.dart'; |
|
|
|
final _logger = Logger('kdbx_times'); |
|
|
|
class KdbxTimes extends KdbxNode implements KdbxNodeContext { |
|
KdbxTimes.create(this.ctx) : super.create('Times') { |
|
final now = clock.now().toUtc(); |
|
creationTime.set(now); |
|
lastModificationTime.set(now); |
|
lastAccessTime.set(now); |
|
expiryTime.set(now); |
|
expires.set(false); |
|
usageCount.set(0); |
|
locationChanged.set(now); |
|
} |
|
KdbxTimes.read(XmlElement node, this.ctx) : super.read(node) { |
|
// backward compatibility - there was a bug setting/reading |
|
// modification, lastAccess and expiryTime. Make sure they are defined. |
|
final checkDates = { |
|
lastModificationTime: () => creationTime.get() ?? clock.now().toUtc(), |
|
lastAccessTime: () => lastModificationTime.get() ?? clock.now().toUtc(), |
|
expiryTime: () { |
|
expires.set(false); |
|
return clock.now().toUtc(); |
|
}, |
|
}; |
|
for (final check in checkDates.entries) { |
|
if (check.key.get() == null) { |
|
final val = check.value(); |
|
_logger.warning('${check.key.name} was not defined. setting to $val'); |
|
check.key.set(val); |
|
} |
|
} |
|
} |
|
|
|
@override |
|
final KdbxReadWriteContext ctx; |
|
|
|
DateTimeUtcNode get creationTime => DateTimeUtcNode(this, 'CreationTime'); |
|
DateTimeUtcNode get lastModificationTime => |
|
DateTimeUtcNode(this, 'LastModificationTime'); |
|
DateTimeUtcNode get lastAccessTime => DateTimeUtcNode(this, 'LastAccessTime'); |
|
DateTimeUtcNode get expiryTime => DateTimeUtcNode(this, 'ExpiryTime'); |
|
BooleanNode get expires => BooleanNode(this, 'Expires'); |
|
IntNode get usageCount => IntNode(this, 'UsageCount'); |
|
DateTimeUtcNode get locationChanged => |
|
DateTimeUtcNode(this, 'LocationChanged'); |
|
|
|
void accessedNow() { |
|
lastAccessTime.set(clock.now().toUtc()); |
|
} |
|
|
|
void modifiedNow() { |
|
accessedNow(); |
|
lastModificationTime.set(clock.now().toUtc()); |
|
} |
|
|
|
List<KdbxSubNode> get _nodes => [ |
|
creationTime, |
|
lastModificationTime, |
|
lastAccessTime, |
|
expiryTime, |
|
expires, |
|
usageCount, |
|
locationChanged, |
|
]; |
|
|
|
void overwriteFrom(KdbxTimes other) { |
|
for (final pair in zip([_nodes, other._nodes])) { |
|
final me = pair[0]; |
|
final other = pair[1]; |
|
me.set(other.get()); |
|
} |
|
} |
|
}
|
|
|