Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate to python3 #5

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Open

Migrate to python3 #5

wants to merge 10 commits into from

Conversation

tpo
Copy link
Contributor

@tpo tpo commented Feb 16, 2021

This pull request should migrate vault_from_gpg_agent.py to Python3. To me it is not clear how to do the de/encoding to/from binary/paths etc. correctly. I hope the way I've done it is correct, however it does merit a second thought by anybody who has a look at this.

tpo added 5 commits February 16, 2021 16:44
This fixes:

    $ vault_from_gpg_agent.py --clear
    Traceback (most recent call last):
      File "/usr/local/bin/vault_from_gpg_agent.py", line 88, in <module>
        main()
      File "/usr/local/bin/vault_from_gpg_agent.py", line 79, in main
        hashed_path = base64.b64encode(hashlib.sha1(my_path).hexdigest())
    TypeError: Unicode-objects must be encoded before hashing

I do `my_path.encode('utf-8')` assuming (hoping) that
`vault_from_gpg_agent.py`'s path on a system will not be changing over
time with respect to encoding. That means `stat $my_path` will always
return the same string with the same encoding. If that remains true then
I think we can encode `my_path` as we wish, provided that utf-8 can hold
all the characters that can occur in a filename...
This fixes:
  $ vault_from_gpg_agent.py --clear
  Traceback (most recent call last):
    File "/usr/local/bin/vault_from_gpg_agent.py", line 91, in <module>
      main()
    File "/usr/local/bin/vault_from_gpg_agent.py", line 85, in main
      clear_passphrase(gpg_agent, cache_id)
    File "/usr/local/bin/vault_from_gpg_agent.py", line 61, in clear_passphrase
      stdout = gpg_agent.communicate("CLEAR_PASSPHRASE %s\n" % (cache_id,))[0]
    File "/usr/lib/python3.7/subprocess.py", line 939, in communicate
      stdout, stderr = self._communicate(input, endtime, timeout)
    File "/usr/lib/python3.7/subprocess.py", line 1666, in _communicate
      input_view = memoryview(self._input)
  TypeError: memoryview: a bytes-like object is required, not 'str'

I set the encoding='utf8' when doing the `Popen`. As long as only ascii
characters get passed back and forth we should be safe.
Fixes:

    $ vault_from_gpg_agent.py
    Traceback (most recent call last):
      File "/usr/local/bin/vault_from_gpg_agent.py", line 96, in <module>
        main()
      File "/usr/local/bin/vault_from_gpg_agent.py", line 92, in main
        get_passphrase(gpg_agent, my_path, cache_id)
      File "/usr/local/bin/vault_from_gpg_agent.py", line 53, in get_passphrase
        description = urllib.quote(
    AttributeError: module 'urllib' has no attribute 'quote'
@tpo tpo force-pushed the migrate_to_python3 branch from fc41f21 to cc647e0 Compare February 16, 2021 16:20
tpo added 5 commits February 16, 2021 18:24
The full path of vault_from_gpg_agent.py can contain the full range
of characters. Encode it to UTF-8 as that should encompass the most
broad character range. Assume and hope that pinentry will be able
to handle UTF-8. I was not able to find documentation that is
explicit about what pinentry accepts.

The idea here is to preserve as much as possible what the user is
seeing of the path and display that to him/her.
both the command and the cache_id are ascii only
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant