KdbxEntry.read constructor

KdbxEntry.read(
  1. KdbxReadWriteContext ctx,
  2. KdbxGroup? parent,
  3. XmlElement node, {
  4. bool isHistoryEntry = false,
})

Implementation

KdbxEntry.read(KdbxReadWriteContext ctx, KdbxGroup? parent, XmlElement node,
    {this.isHistoryEntry = false})
    : history = [],
      customData = node
              .singleElement(KdbxXml.NODE_CUSTOM_DATA)
              ?.let((e) => KdbxCustomData.read(e)) ??
          KdbxCustomData.create(),
      super.read(ctx, parent, node) {
  _strings.addEntries(node.findElements(KdbxXml.NODE_STRING).map((el) {
    final key = KdbxKey(el.findElements(KdbxXml.NODE_KEY).single.text);
    final valueNode = el.findElements(KdbxXml.NODE_VALUE).single;
    if (valueNode.getAttribute(KdbxXml.ATTR_PROTECTED)?.toLowerCase() ==
        'true') {
      return MapEntry(key, KdbxFile.protectedValueForNode(valueNode));
    } else {
      return MapEntry(key, PlainValue(valueNode.text));
    }
  }));
  _binaries.addEntries(node.findElements(KdbxXml.NODE_BINARY).map((el) {
    final key = KdbxKey(el.findElements(KdbxXml.NODE_KEY).single.text);
    final valueNode = el.findElements(KdbxXml.NODE_VALUE).single;
    final ref = valueNode.getAttribute(KdbxXml.ATTR_REF);
    if (ref != null) {
      final refId = int.parse(ref);
      final binary = ctx.binaryById(refId);
      if (binary == null) {
        throw KdbxCorruptedFileException(
            'Unable to find binary with id $refId');
      }
      return MapEntry(key, binary);
    }

    return MapEntry(key, KdbxBinary.readBinaryXml(valueNode, isInline: true));
  }));
  history.addAll(node
          .findElements(KdbxXml.NODE_HISTORY)
          .singleOrNull
          ?.findElements('Entry')
          .map((entry) =>
              KdbxEntry.read(ctx, parent, entry, isHistoryEntry: true))
          .toList() ??
      []);
}