Skip to content

Commit 87905d5

Browse files
authored
Merge pull request #316 from jaraco/bugfix/keyring-fail-backend
Suppress Exceptions in keyring.get_password
2 parents 2bac420 + 3c939af commit 87905d5

2 files changed

Lines changed: 33 additions & 5 deletions

File tree

tests/test_utils.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,8 +222,33 @@ def my_import(name, *args, **kwargs):
222222
monkeypatch.setattr(builtins, '__import__', my_import)
223223

224224

225-
def test_get_password_keyring_missing_prompts(monkeypatch, keyring_missing):
225+
@pytest.fixture
226+
def entered_password(monkeypatch):
226227
monkeypatch.setattr(utils, 'password_prompt', lambda prompt: 'entered pw')
227228

228-
pw = utils.get_password('system', 'user', None, {})
229-
assert pw == 'entered pw'
229+
230+
def test_get_password_keyring_missing_prompts(
231+
entered_password, keyring_missing):
232+
assert utils.get_password('system', 'user', None, {}) == 'entered pw'
233+
234+
235+
@pytest.fixture
236+
def keyring_no_backends(monkeypatch):
237+
"""
238+
Simulate that keyring has no available backends. When keyring
239+
has no backends for the system, the backend will be a
240+
fail.Keyring, which raises RuntimeError on get_password.
241+
"""
242+
class FailKeyring(object):
243+
@staticmethod
244+
def get_password(system, username):
245+
raise RuntimeError("fail!")
246+
monkeypatch.setitem(sys.modules, 'keyring', FailKeyring())
247+
248+
249+
def test_get_password_runtime_error_suppressed(
250+
entered_password, keyring_no_backends, recwarn):
251+
assert utils.get_password('system', 'user', None, {}) == 'entered pw'
252+
assert len(recwarn) == 1
253+
warning = recwarn.pop(UserWarning)
254+
assert 'fail!' in str(warning)

twine/utils.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import getpass
2121
import sys
2222
import argparse
23-
23+
import warnings
2424

2525
try:
2626
import configparser
@@ -196,7 +196,10 @@ def get_password_from_keyring(system, username):
196196
except ImportError:
197197
return
198198

199-
return keyring.get_password(system, username)
199+
try:
200+
return keyring.get_password(system, username)
201+
except Exception as exc:
202+
warnings.warn(str(exc))
200203

201204

202205
def password_from_keyring_or_prompt(system, username):

0 commit comments

Comments
 (0)