/usr/lib/python3/dist-packages/keyrings/alt/multi.py is in python3-keyrings.alt 3.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | import itertools
from keyring.util import properties
from keyring.backend import KeyringBackend
from keyring import errors
class MultipartKeyringWrapper(KeyringBackend):
"""A wrapper around an existing keyring that breaks the password into
smaller parts to handle implementations that have limits on the maximum
length of passwords i.e. Windows Vault
"""
def __init__(self, keyring, max_password_size=512):
self._keyring = keyring
self._max_password_size = max_password_size
@properties.ClassProperty
@classmethod
def priority(cls):
return 0
def get_password(self, service, username):
"""Get password of the username for the service
"""
init_part = self._keyring.get_password(service, username)
if init_part:
parts = [init_part]
i = 1
while True:
next_part = self._keyring.get_password(
service,
'%s{{part_%d}}' % (username, i))
if next_part:
parts.append(next_part)
i += 1
else:
break
return ''.join(parts)
return None
def set_password(self, service, username, password):
"""Set password for the username of the service
"""
segments = range(0, len(password), self._max_password_size)
password_parts = [
password[i:i + self._max_password_size] for i in segments]
for i, password_part in enumerate(password_parts):
curr_username = username
if i > 0:
curr_username += '{{part_%d}}' % i
self._keyring.set_password(service, curr_username, password_part)
def delete_password(self, service, username):
self._keyring.delete_password(service, username)
count = itertools.count(1)
while True:
part_name = '%(username)s{{part_%(index)d}}' % dict(
index=next(count), **vars())
try:
self._keyring.delete_password(service, part_name)
except errors.PasswordDeleteError:
break
|