[PATCH] keepassx2pass: Extract binary attachments

Michael Kesper mkesper at schokokeks.org
Thu May 16 09:52:56 CEST 2019


Hi all,

It would be nice to get any feedback on this.
I'm fullquoting below so everyone gets the context.

Best wishes
Michael


On 08.04.19 13:55, Michael Kesper wrote:
> Hi all,
> 
> this was my first patch by email so I hope I didn't mess it up too much. :)
> I could create a test keepass DB with attachments for testing purposes, if that would make sense.
> 
> Best wishes
> Michael
> 
> On 08.04.19 11:31, Michael Kesper wrote:
>>
>> In keepassx, it's possible to store one binary attachment per entry.
>> In XML export, these are included as base64-encoded text.
>> This patch will export these binaries as binary content into pass.
>> Files will be saved as <path_to/entry>_<name of attachment>.gpg, e.g.
>> for an attachment "order_2019-04-08.pdf" in entry "Orders/order001" it will be
>> "Orders/order001_order_2019-04-08.pdf.gpg".
>> The files can be decrypted directly with gpg --decrypt-files.
>> ---
>>  contrib/importers/keepassx2pass.py | 35 ++++++++++++++++++++++++---->>  1 file changed, 28 insertions(+), 7 deletions(-)
>>
>> diff --git a/contrib/importers/keepassx2pass.py b/contrib/importers/keepassx2pass.py
>> index 197375f..9daac91 100755
>> --- a/contrib/importers/keepassx2pass.py
>> +++ b/contrib/importers/keepassx2pass.py
>> @@ -1,10 +1,12 @@
>>  #!/usr/bin/env python3
>>  #
>>  # Copyright (C) 2012 Juhamatti Niemelä <iiska at iki.fi>. All Rights Reserved.
>> +# Copyright © 2019 Michael Kesper <mkesper at sysfive.com>.
>>  # This file is licensed under the GPLv2+. Please see COPYING for more information.
>>  #
>>  # Usage ./keepassx2pass.py export.xml
>>  
>> +import base64
>>  import sys
>>  import re
>>  
>> @@ -43,9 +45,11 @@ def path_for(element, path=''):
>>  
>>  def password_data(element):
>>      """ Return password data and additional info if available from
>> -    password entry element. """
>> +    password entry element.
>> +    Extract any base64-encoded attachment.
>> +    """
>>      passwd = element.find('password').text
>> -    ret = (passwd + "\n") if passwd else "\n"
>> +    ret = (passwd + "\n") if passwd is not None else "\n"
>>      for field in ['username', 'url', 'comment']:
>>          fel = element.find(field)
>>          children = [(e.text or '') + (e.tail or '') for e in list(fel)]
>> @@ -54,17 +58,34 @@ def password_data(element):
>>          text = (fel.text or '') + "\n".join(children)
>>          if len(text) > 0:
>>              ret = "%s%s: %s\n" % (ret, fel.tag, text)
>> -    return ret
>> +    attachment = element.find('bin')
>> +    attachment_name = element.find('bindesc')
>> +    if attachment is not None:
>> +        attachment = base64.b64decode(attachment.text)
>> +        attachment_name = attachment_name.text
>> +    return ret, attachment_name, attachment
>> +
>>  
>>  def import_entry(element, path=''):
>>      """ Import new password entry to password-store using pass insert
>> -    command """
>> -    print("Importing " + path_for(element, path))
>> +    command, exctract attachment if any.
>> +    """
>> +    path_name = path_for(element, path)
>> +    print("Importing {}".format(path_name))
>> +    pass_text, attachment_name, attachment = password_data(element)
>>      proc = Popen(['pass', 'insert', '--multiline', '--force',
>> -                  path_for(element, path)],
>> +                  path_name],
>>                    stdin=PIPE, stdout=PIPE)
>> -    proc.communicate(password_data(element).encode())
>> +    proc.communicate(pass_text.encode())
>>      proc.wait()
>> +    if attachment is not None:
>> +        print("Extracting binary data: {}".format(attachment_name))
>> +        proc = Popen(['pass', 'insert', '--multiline', '--force',
>> +                      '{}_{}'.format(path_name, attachment_name)],
>> +                      stdin=PIPE, stdout=PIPE)
>> +        proc.communicate(attachment)
>> +        proc.wait()
>> +
>>  
>>  def import_group(element, path=''):
>>      """ Import all entries and sub-groups from given group """

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: OpenPGP digital signature
URL: <http://lists.zx2c4.com/pipermail/password-store/attachments/20190516/b1cd0044/attachment.asc>


More information about the Password-Store mailing list