mirror of
https://github.com/samsonjs/vdirsyncer.git
synced 2026-04-27 14:57:41 +00:00
Refactor get_password
This commit is contained in:
parent
7f01b22642
commit
8f6b3003cc
2 changed files with 62 additions and 57 deletions
|
|
@ -78,8 +78,7 @@ def test_get_password_from_system_keyring(monkeypatch, resources_to_test):
|
||||||
if not self.resources:
|
if not self.resources:
|
||||||
return password
|
return password
|
||||||
|
|
||||||
import sys
|
monkeypatch.setattr(utils, 'keyring', KeyringMock())
|
||||||
monkeypatch.setitem(sys.modules, 'keyring', KeyringMock())
|
|
||||||
|
|
||||||
netrc_calls = []
|
netrc_calls = []
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,19 @@
|
||||||
import os
|
import os
|
||||||
import vdirsyncer.log
|
import vdirsyncer.log
|
||||||
|
|
||||||
|
|
||||||
|
try: # pragma: no cover
|
||||||
|
import urllib.parse as urlparse
|
||||||
|
except ImportError: # pragma: no cover
|
||||||
|
import urlparse
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
import keyring
|
||||||
|
except ImportError:
|
||||||
|
keyring = None
|
||||||
|
|
||||||
|
|
||||||
password_key_prefix = 'vdirsyncer:'
|
password_key_prefix = 'vdirsyncer:'
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -44,6 +57,52 @@ def parse_options(items):
|
||||||
yield key, value
|
yield key, value
|
||||||
|
|
||||||
|
|
||||||
|
def _password_from_netrc(username, resource):
|
||||||
|
'''.netrc'''
|
||||||
|
from netrc import netrc
|
||||||
|
|
||||||
|
hostname = urlparse.urlsplit(resource).hostname
|
||||||
|
try:
|
||||||
|
netrc_user, account, password = \
|
||||||
|
netrc().authenticators(hostname) or (None, None, None)
|
||||||
|
if netrc_user == username:
|
||||||
|
return password
|
||||||
|
except IOError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def _password_from_keyring(username, resource):
|
||||||
|
'''system keyring'''
|
||||||
|
if keyring is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
key = resource
|
||||||
|
password = None
|
||||||
|
|
||||||
|
while True:
|
||||||
|
password = keyring.get_password(password_key_prefix + key, username)
|
||||||
|
if password is not None:
|
||||||
|
return password
|
||||||
|
|
||||||
|
parsed = urlparse.urlsplit(key)
|
||||||
|
path = parsed.path
|
||||||
|
if path.endswith('/'):
|
||||||
|
path = path.rstrip('/')
|
||||||
|
else:
|
||||||
|
path = path.rsplit('/', 1)[0] + '/'
|
||||||
|
|
||||||
|
new_key = urlparse.urlunsplit((
|
||||||
|
parsed.scheme,
|
||||||
|
parsed.netloc,
|
||||||
|
path,
|
||||||
|
parsed.query,
|
||||||
|
parsed.fragment
|
||||||
|
))
|
||||||
|
if new_key == key:
|
||||||
|
return None
|
||||||
|
key = new_key
|
||||||
|
|
||||||
|
|
||||||
def get_password(username, resource):
|
def get_password(username, resource):
|
||||||
"""tries to access saved password or asks user for it
|
"""tries to access saved password or asks user for it
|
||||||
|
|
||||||
|
|
@ -67,64 +126,11 @@ def get_password(username, resource):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
import getpass
|
import getpass
|
||||||
try: # pragma: no cover
|
|
||||||
from urllib.parse import urlsplit, urlunsplit
|
|
||||||
except ImportError: # pragma: no cover
|
|
||||||
from urlparse import urlsplit, urlunsplit
|
|
||||||
|
|
||||||
try:
|
|
||||||
import keyring
|
|
||||||
except ImportError:
|
|
||||||
keyring = None
|
|
||||||
|
|
||||||
logger = vdirsyncer.log.get('sync')
|
logger = vdirsyncer.log.get('sync')
|
||||||
hostname = urlsplit(resource).hostname
|
|
||||||
|
|
||||||
def _netrc():
|
for func in (_password_from_netrc, _password_from_keyring):
|
||||||
'''.netrc'''
|
password = func(username, resource)
|
||||||
from netrc import netrc
|
|
||||||
try:
|
|
||||||
netrc_user, account, password = \
|
|
||||||
netrc().authenticators(hostname) or (None, None, None)
|
|
||||||
if netrc_user == username:
|
|
||||||
return password
|
|
||||||
except IOError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def _keyring():
|
|
||||||
'''system keyring'''
|
|
||||||
if keyring is None:
|
|
||||||
return None
|
|
||||||
|
|
||||||
key = resource
|
|
||||||
password = None
|
|
||||||
|
|
||||||
while True:
|
|
||||||
password = keyring.get_password(password_key_prefix + key,
|
|
||||||
username)
|
|
||||||
if password is not None:
|
|
||||||
return password
|
|
||||||
|
|
||||||
parsed = urlsplit(key)
|
|
||||||
path = parsed.path
|
|
||||||
if path.endswith('/'):
|
|
||||||
path = path.rstrip('/')
|
|
||||||
else:
|
|
||||||
path = path.rsplit('/', 1)[0] + '/'
|
|
||||||
|
|
||||||
new_key = urlunsplit((
|
|
||||||
parsed.scheme,
|
|
||||||
parsed.netloc,
|
|
||||||
path,
|
|
||||||
parsed.query,
|
|
||||||
parsed.fragment
|
|
||||||
))
|
|
||||||
if new_key == key:
|
|
||||||
return None
|
|
||||||
key = new_key
|
|
||||||
|
|
||||||
for func in (_netrc, _keyring):
|
|
||||||
password = func()
|
|
||||||
if password is not None:
|
if password is not None:
|
||||||
logger.debug('Got password for {} from {}'
|
logger.debug('Got password for {} from {}'
|
||||||
.format(username, func.__doc__))
|
.format(username, func.__doc__))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue