Skip to content

Commit

Permalink
Merge pull request #316 from jaraco/bugfix/keyring-fail-backend
Browse files Browse the repository at this point in the history
Suppress Exceptions in keyring.get_password
  • Loading branch information
brainwane authored Mar 7, 2018
2 parents 2bac420 + 3c939af commit 87905d5
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
31 changes: 28 additions & 3 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,33 @@ def my_import(name, *args, **kwargs):
monkeypatch.setattr(builtins, '__import__', my_import)


def test_get_password_keyring_missing_prompts(monkeypatch, keyring_missing):
@pytest.fixture
def entered_password(monkeypatch):
monkeypatch.setattr(utils, 'password_prompt', lambda prompt: 'entered pw')

pw = utils.get_password('system', 'user', None, {})
assert pw == 'entered pw'

def test_get_password_keyring_missing_prompts(
entered_password, keyring_missing):
assert utils.get_password('system', 'user', None, {}) == 'entered pw'


@pytest.fixture
def keyring_no_backends(monkeypatch):
"""
Simulate that keyring has no available backends. When keyring
has no backends for the system, the backend will be a
fail.Keyring, which raises RuntimeError on get_password.
"""
class FailKeyring(object):
@staticmethod
def get_password(system, username):
raise RuntimeError("fail!")
monkeypatch.setitem(sys.modules, 'keyring', FailKeyring())


def test_get_password_runtime_error_suppressed(
entered_password, keyring_no_backends, recwarn):
assert utils.get_password('system', 'user', None, {}) == 'entered pw'
assert len(recwarn) == 1
warning = recwarn.pop(UserWarning)
assert 'fail!' in str(warning)
7 changes: 5 additions & 2 deletions twine/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import getpass
import sys
import argparse

import warnings

try:
import configparser
Expand Down Expand Up @@ -196,7 +196,10 @@ def get_password_from_keyring(system, username):
except ImportError:
return

return keyring.get_password(system, username)
try:
return keyring.get_password(system, username)
except Exception as exc:
warnings.warn(str(exc))


def password_from_keyring_or_prompt(system, username):
Expand Down

0 comments on commit 87905d5

Please sign in to comment.