Source code for keepassdb.export.xml

"""
Support for exporting database to KeePassX XML format.
"""
from __future__ import absolute_import
from datetime import datetime
from xml.etree import ElementTree as ET
from xml.dom import minidom

from keepassdb import const

[docs]class XmlExporter(object): """ Class for exporting database to KeePassX XML format. :ivar include_comment: Whether to include a 'generated-by' comment in the header. :ivar prettyprint: Whether to generate pretty-printed XML (indent, etc.). """ include_comment = False prettyprint = True def __init__(self, include_comment=False, prettyprint=True): self.include_comment = include_comment self.prettyprint = prettyprint
[docs] def export(self, db): """ Export the dbnode to KeePassX XML format. :param db: The dbnode to export. :type db: :class:`keepassdb.db.Database` """ dbnode = ET.Element('database') if self.include_comment: now = datetime.now() filepath = db.filepath if filepath: comment = ET.Comment('Generated by keepassdb from {0} on {1}'.format(filepath, now.strftime("%c"))) else: comment = ET.Comment('Generated by keepassdb on {0}'.format(now.strftime("%c"))) dbnode.append(comment) def _date(dt): if dt == const.NEVER: return 'Never' else: # 2012-12-20T20:56:56 return dt.strftime('%Y-%m-%dT%H:%M:%S') def group_to_xml(group, node): gnode = ET.SubElement(node, 'group') title = ET.SubElement(gnode, 'title') title.text = group.title icon = ET.SubElement(gnode, 'icon') icon.text = str(group.icon) for subgroup in group.children: group_to_xml(subgroup, gnode) for entry in group.entries: if entry.title == 'Meta-Info' and entry.username == 'SYSTEM': continue enode = ET.SubElement(gnode, 'entry') ET.SubElement(enode, 'title').text = entry.title ET.SubElement(enode, 'username').text = entry.username ET.SubElement(enode, 'password').text = entry.password ET.SubElement(enode, 'url').text = entry.url ET.SubElement(enode, 'comment').text = entry.notes ET.SubElement(enode, 'icon').text = str(entry.icon) ET.SubElement(enode, 'creation').text = _date(entry.created) ET.SubElement(enode, 'lastaccess').text = _date(entry.accessed) ET.SubElement(enode, 'lastmod').text = _date(entry.modified) ET.SubElement(enode, 'expire').text = _date(entry.expires) return gnode for group in db.root.children: dbnode.append(group_to_xml(group, dbnode)) xmlstr = ET.tostring(dbnode) if self.prettyprint: reparsed = minidom.parseString(xmlstr) xmlstr = reparsed.toprettyxml(indent=" ") return xmlstr