Skip to content

Commit f8cfa0c

Browse files
authored
gh-155358: Use named attributes with pwd and grp modules (#155362)
* Replace pwd[0] with pwd.pw_name * Replace pwd[2] with pwd.pw_uid * Replace grp[0] with grp.gr_name * Replace grp[2] with grp.gr_gid * Replace pwd[3] with pwd.pw_gid
1 parent 38235c0 commit f8cfa0c

13 files changed

Lines changed: 27 additions & 24 deletions

File tree

Doc/library/os.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ process and user.
452452
process. For most purposes, it is more useful to use
453453
:func:`getpass.getuser` since the latter checks the environment variables
454454
:envvar:`LOGNAME` or :envvar:`USERNAME` to find out who the user is, and
455-
falls back to ``pwd.getpwuid(os.getuid())[0]`` to get the login name of the
455+
falls back to ``pwd.getpwuid(os.getuid()).pw_name`` to get the login name of the
456456
current real user id.
457457

458458
.. availability:: Unix, Windows, not WASI.

Lib/getpass.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ def getuser():
428428

429429
try:
430430
import pwd
431-
return pwd.getpwuid(os.getuid())[0]
431+
return pwd.getpwuid(os.getuid()).pw_name
432432
except (ImportError, KeyError) as e:
433433
raise OSError('No username set in the environment') from e
434434

Lib/http/server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,7 @@ def nobody_uid():
10131013
except ImportError:
10141014
return -1
10151015
try:
1016-
nobody = pwd.getpwnam('nobody')[2]
1016+
nobody = pwd.getpwnam('nobody').pw_uid
10171017
except KeyError:
10181018
nobody = 1 + max(x[2] for x in pwd.getpwall())
10191019
return nobody

Lib/netrc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def _can_security_check():
1515
def _getpwuid(uid):
1616
try:
1717
import pwd
18-
return pwd.getpwuid(uid)[0]
18+
return pwd.getpwuid(uid).pw_name
1919
except (ImportError, LookupError):
2020
return f'uid {uid}'
2121

Lib/shutil.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -983,7 +983,7 @@ def _get_gid(name):
983983
except KeyError:
984984
result = None
985985
if result is not None:
986-
return result[2]
986+
return result.gr_gid
987987
return None
988988

989989
def _get_uid(name):
@@ -1001,7 +1001,7 @@ def _get_uid(name):
10011001
except KeyError:
10021002
result = None
10031003
if result is not None:
1004-
return result[2]
1004+
return result.pw_uid
10051005
return None
10061006

10071007
def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0,

Lib/tarfile.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2282,14 +2282,14 @@ def gettarinfo(self, name=None, arcname=None, fileobj=None):
22822282
if pwd:
22832283
if tarinfo.uid not in self._unames:
22842284
try:
2285-
self._unames[tarinfo.uid] = pwd.getpwuid(tarinfo.uid)[0]
2285+
self._unames[tarinfo.uid] = pwd.getpwuid(tarinfo.uid).pw_name
22862286
except KeyError:
22872287
self._unames[tarinfo.uid] = ''
22882288
tarinfo.uname = self._unames[tarinfo.uid]
22892289
if grp:
22902290
if tarinfo.gid not in self._gnames:
22912291
try:
2292-
self._gnames[tarinfo.gid] = grp.getgrgid(tarinfo.gid)[0]
2292+
self._gnames[tarinfo.gid] = grp.getgrgid(tarinfo.gid).gr_name
22932293
except KeyError:
22942294
self._gnames[tarinfo.gid] = ''
22952295
tarinfo.gname = self._gnames[tarinfo.gid]
@@ -2837,12 +2837,12 @@ def chown(self, tarinfo, targetpath, numeric_owner):
28372837
if not numeric_owner:
28382838
try:
28392839
if grp and tarinfo.gname:
2840-
g = grp.getgrnam(tarinfo.gname)[2]
2840+
g = grp.getgrnam(tarinfo.gname).gr_gid
28412841
except KeyError:
28422842
pass
28432843
try:
28442844
if pwd and tarinfo.uname:
2845-
u = pwd.getpwnam(tarinfo.uname)[2]
2845+
u = pwd.getpwnam(tarinfo.uname).pw_uid
28462846
except KeyError:
28472847
pass
28482848
if g is None:

Lib/test/support/smtpd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -862,7 +862,7 @@ def parseargs():
862862
except ImportError:
863863
print('Cannot import module "pwd"; try running with -n option.', file=sys.stderr)
864864
sys.exit(1)
865-
nobody = pwd.getpwnam('nobody')[2]
865+
nobody = pwd.getpwnam('nobody').pw_uid
866866
try:
867867
os.setuid(nobody)
868868
except PermissionError:

Lib/test/test_getpass.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,13 @@ def test_username_falls_back_to_pwd(self, environ):
3939
expected_name = 'some_name'
4040
environ.get.return_value = None
4141
if pwd:
42+
class User:
43+
pass
4244
with mock.patch('os.getuid') as uid, \
4345
mock.patch('pwd.getpwuid') as getpw:
4446
uid.return_value = 42
45-
getpw.return_value = [expected_name]
47+
getpw.return_value = User()
48+
getpw.return_value.pw_name = expected_name
4649
self.assertEqual(expected_name,
4750
getpass.getuser())
4851
getpw.assert_called_once_with(42)

Lib/test/test_os/test_posix.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,8 +1322,8 @@ def _create_and_do_getcwd(dirname, current_path_length = 0):
13221322
@unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
13231323
@unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
13241324
def test_getgrouplist(self):
1325-
user = pwd.getpwuid(os.getuid())[0]
1326-
group = pwd.getpwuid(os.getuid())[3]
1325+
user = pwd.getpwuid(os.getuid()).pw_name
1326+
group = pwd.getpwuid(os.getuid()).pw_gid
13271327
self.assertIn(group, posix.getgrouplist(user, group))
13281328

13291329

Lib/test/test_pwd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def test_values_extended(self):
5050
# check whether the entry returned by getpwuid()
5151
# for each uid is among those from getpwall() for this uid
5252
for e in entries:
53-
if not e[0] or e[0] == '+':
53+
if not e.pw_name or e.pw_name == '+':
5454
continue # skip NIS entries etc.
5555
self.assertIn(pwd.getpwnam(e.pw_name), entriesbyname[e.pw_name])
5656
self.assertIn(pwd.getpwuid(e.pw_uid), entriesbyuid[e.pw_uid])

0 commit comments

Comments
 (0)