summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/getpass.rst7
-rw-r--r--Doc/whatsnew/3.13.rst4
-rw-r--r--Lib/getpass.py13
-rw-r--r--Lib/test/test_getpass.py4
-rw-r--r--Misc/NEWS.d/next/Library/2021-11-23-22-22-49.bpo-32731.kNOASr.rst3
5 files changed, 24 insertions, 7 deletions
diff --git a/Doc/library/getpass.rst b/Doc/library/getpass.rst
index 5c79daf..54c84d4 100644
--- a/Doc/library/getpass.rst
+++ b/Doc/library/getpass.rst
@@ -46,7 +46,10 @@ The :mod:`getpass` module provides two functions:
:envvar:`USER`, :envvar:`!LNAME` and :envvar:`USERNAME`, in order, and
returns the value of the first one which is set to a non-empty string. If
none are set, the login name from the password database is returned on
- systems which support the :mod:`pwd` module, otherwise, an exception is
- raised.
+ systems which support the :mod:`pwd` module, otherwise, an :exc:`OSError`
+ is raised.
In general, this function should be preferred over :func:`os.getlogin()`.
+
+ .. versionchanged:: 3.13
+ Previously, various exceptions beyond just :exc:`OSError` were raised.
diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst
index 3fd0f5e..ec09dfe 100644
--- a/Doc/whatsnew/3.13.rst
+++ b/Doc/whatsnew/3.13.rst
@@ -1032,6 +1032,10 @@ Changes in the Python API
recomended in the documentation.
(Contributed by Serhiy Storchaka in :gh:`106672`.)
+* An :exc:`OSError` is now raised by :func:`getpass.getuser` for any failure to
+ retrieve a username, instead of :exc:`ImportError` on non-Unix platforms or
+ :exc:`KeyError` on Unix platforms where the password database is empty.
+
Build Changes
=============
diff --git a/Lib/getpass.py b/Lib/getpass.py
index 8b42c0a..bd0097c 100644
--- a/Lib/getpass.py
+++ b/Lib/getpass.py
@@ -156,7 +156,11 @@ def getuser():
First try various environment variables, then the password
database. This works on Windows as long as USERNAME is set.
+ Any failure to find a username raises OSError.
+ .. versionchanged:: 3.13
+ Previously, various exceptions beyond just :exc:`OSError`
+ were raised.
"""
for name in ('LOGNAME', 'USER', 'LNAME', 'USERNAME'):
@@ -164,9 +168,12 @@ def getuser():
if user:
return user
- # If this fails, the exception will "explain" why
- import pwd
- return pwd.getpwuid(os.getuid())[0]
+ try:
+ import pwd
+ return pwd.getpwuid(os.getuid())[0]
+ except (ImportError, KeyError) as e:
+ raise OSError('No username set in the environment') from e
+
# Bind the name getpass to the appropriate function
try:
diff --git a/Lib/test/test_getpass.py b/Lib/test/test_getpass.py
index 98ecec9..80dda2c 100644
--- a/Lib/test/test_getpass.py
+++ b/Lib/test/test_getpass.py
@@ -26,7 +26,7 @@ class GetpassGetuserTest(unittest.TestCase):
environ.get.return_value = None
try:
getpass.getuser()
- except ImportError: # in case there's no pwd module
+ except OSError: # in case there's no pwd module
pass
except KeyError:
# current user has no pwd entry
@@ -47,7 +47,7 @@ class GetpassGetuserTest(unittest.TestCase):
getpass.getuser())
getpw.assert_called_once_with(42)
else:
- self.assertRaises(ImportError, getpass.getuser)
+ self.assertRaises(OSError, getpass.getuser)
class GetpassRawinputTest(unittest.TestCase):
diff --git a/Misc/NEWS.d/next/Library/2021-11-23-22-22-49.bpo-32731.kNOASr.rst b/Misc/NEWS.d/next/Library/2021-11-23-22-22-49.bpo-32731.kNOASr.rst
new file mode 100644
index 0000000..92f3b87
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-11-23-22-22-49.bpo-32731.kNOASr.rst
@@ -0,0 +1,3 @@
+:func:`getpass.getuser` now raises :exc:`OSError` for all failures rather
+than :exc:`ImportError` on systems lacking the :mod:`pwd` module or
+:exc:`KeyError` if the password database is empty.