Issue #26937: The chown() method of the tarfile.TarFile class does not fail now

when the grp module cannot be imported, as for example on Android platforms.
This commit is contained in:
Xavier de Gaye 2016-12-09 09:33:09 +01:00
parent 20367420c8
commit f44abdab1e
2 changed files with 23 additions and 12 deletions

View File

@ -50,9 +50,13 @@ import copy
import re
try:
import grp, pwd
import pwd
except ImportError:
grp = pwd = None
pwd = None
try:
import grp
except ImportError:
grp = None
# os.symlink on Windows prior to 6.0 raises NotImplementedError
symlink_exception = (AttributeError, NotImplementedError)
@ -2219,22 +2223,25 @@ class TarFile(object):
def chown(self, tarinfo, targetpath, numeric_owner):
"""Set owner of targetpath according to tarinfo. If numeric_owner
is True, use .gid/.uid instead of .gname/.uname.
is True, use .gid/.uid instead of .gname/.uname. If numeric_owner
is False, fall back to .gid/.uid when the search based on name
fails.
"""
if pwd and hasattr(os, "geteuid") and os.geteuid() == 0:
if hasattr(os, "geteuid") and os.geteuid() == 0:
# We have to be root to do so.
if numeric_owner:
g = tarinfo.gid
u = tarinfo.uid
else:
g = tarinfo.gid
u = tarinfo.uid
if not numeric_owner:
try:
g = grp.getgrnam(tarinfo.gname)[2]
if grp:
g = grp.getgrnam(tarinfo.gname)[2]
except KeyError:
g = tarinfo.gid
pass
try:
u = pwd.getpwnam(tarinfo.uname)[2]
if pwd:
u = pwd.getpwnam(tarinfo.uname)[2]
except KeyError:
u = tarinfo.uid
pass
try:
if tarinfo.issym() and hasattr(os, "lchown"):
os.lchown(targetpath, u, g)

View File

@ -22,6 +22,10 @@ Library
- Issue #28847: dbm.dumb now supports reading read-only files and no longer
writes the index file when it is not changed.
- Issue #26937: The chown() method of the tarfile.TarFile class does not fail
now when the grp module cannot be imported, as for example on Android
platforms.
Windows
-------