Skip to content

Commit 8b31c4d

Browse files
committed
gh-155358: Use named attributes with pwd and grp modules
* 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
1 parent 115400b commit 8b31c4d

7 files changed

Lines changed: 20 additions & 17 deletions

File tree

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/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/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_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])

Lib/test/test_shutil.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1999,8 +1999,8 @@ def test_make_archive_owner_group(self):
19991999
# testing make_archive with owner and group, with various combinations
20002000
# this works even if there's not gid/uid support
20012001
if UID_GID_SUPPORT:
2002-
group = grp.getgrgid(0)[0]
2003-
owner = pwd.getpwuid(0)[0]
2002+
group = grp.getgrgid(0).gr_name
2003+
owner = pwd.getpwuid(0).pw_name
20042004
else:
20052005
group = owner = 'root'
20062006

@@ -2027,8 +2027,8 @@ def test_make_archive_owner_group(self):
20272027
def test_tarfile_root_owner(self):
20282028
root_dir, base_dir = self._create_files()
20292029
base_name = os.path.join(self.mkdtemp(), 'archive')
2030-
group = grp.getgrgid(0)[0]
2031-
owner = pwd.getpwuid(0)[0]
2030+
group = grp.getgrgid(0).gr_name
2031+
owner = pwd.getpwuid(0).pw_name
20322032
with os_helper.change_cwd(root_dir), no_chdir:
20332033
archive_name = make_archive(base_name, 'gztar', root_dir, 'dist',
20342034
owner=owner, group=group)
@@ -2433,8 +2433,8 @@ def check_chown(path, uid=None, gid=None):
24332433
check_chown(dirname, gid=gid)
24342434

24352435
try:
2436-
user = pwd.getpwuid(uid)[0]
2437-
group = grp.getgrgid(gid)[0]
2436+
user = pwd.getpwuid(uid).pw_name
2437+
group = grp.getgrgid(gid).gr_name
24382438
except KeyError:
24392439
# On some systems uid/gid cannot be resolved.
24402440
pass

Lib/test/test_tarfile.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3351,12 +3351,12 @@ def root_is_uid_gid_0():
33513351
except ImportError:
33523352
return False
33533353
try:
3354-
if pwd.getpwuid(0)[0] != 'root':
3354+
if pwd.getpwuid(0).pw_name != 'root':
33553355
return False
33563356
except KeyError:
33573357
# On Cygwin, there is no root user (uid 0)
33583358
return False
3359-
if grp.getgrgid(0)[0] != 'root':
3359+
if grp.getgrgid(0).gr_name != 'root':
33603360
return False
33613361
return True
33623362

0 commit comments

Comments
 (0)