Make extracted files user readable.

This commit is contained in:
Bastian Kleineidam 2010-03-06 15:23:16 +01:00
parent 9ee4f65b90
commit 670d5df652
6 changed files with 49 additions and 3 deletions

View File

@ -4,6 +4,8 @@
* Added option alias -v for --verbose. * Added option alias -v for --verbose.
* Added --verbose option to create command. * Added --verbose option to create command.
* Added support for Extract, list and test multiple archives. * Added support for Extract, list and test multiple archives.
* Fix permissions of extracted files: make them readable by the
current user.
0.5 "Vanishing Point" (released 4.3.2010) 0.5 "Vanishing Point" (released 4.3.2010)

View File

@ -50,6 +50,9 @@ directories. The patool program overcomes this problem by
first extracting files to a unique (temporary) directory, and first extracting files to a unique (temporary) directory, and
then moving its contents back if possible. This also prevents then moving its contents back if possible. This also prevents
local files from being overwritten by mistake. local files from being overwritten by mistake.
.br
All extracted files are checked that they are readable by the
current user.
.TP .TP
\fB\-v\fP, \fB\-\-verbose\fP \fB\-v\fP, \fB\-\-verbose\fP
Be verbose when extracting (if the helper application supports it). Be verbose when extracting (if the helper application supports it).

View File

@ -42,6 +42,8 @@ COMMANDS
extracting files to a unique (temporary) directory, and then moving its extracting files to a unique (temporary) directory, and then moving its
contents back if possible. This also prevents local files from being contents back if possible. This also prevents local files from being
overwritten by mistake. overwritten by mistake.
All extracted files are checked that they are readable by the current
user.
-v, --verbose -v, --verbose
Be verbose when extracting (if the helper application supports Be verbose when extracting (if the helper application supports

View File

@ -1 +1,3 @@
- fix permissions (unreadable files) in extracted files (honor umask) - Support ace (unace) archives.
- Support ar archives.
- Support lha archives.

View File

@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import os import os
import shutil import shutil
import stat
from patoolib import util from patoolib import util
# Supported archive commands # Supported archive commands
@ -309,8 +310,30 @@ def run_archive_cmdlist (archive_cmdlist):
util.run(cmdlist, **runkwargs) util.run(cmdlist, **runkwargs)
def make_file_readable (filename):
"""Make file user readable if it is not a link."""
if not os.path.islink(filename):
util.set_mode(filename, stat.S_IRUSR)
def make_dir_readable (filename):
"""Make directory user readable and executable."""
util.set_mode(filename, stat.S_IRUSR|stat.S_IXUSR)
def make_user_readable (directory):
"""Make all files in given directory user readable. Also recurse into
subdirectories."""
for root, dirs, files in os.walk(directory, onerror=util.log_error):
for filename in files:
make_file_readable(os.path.join(root, filename))
for dirname in dirs:
make_dir_readable(os.path.join(root, dirname))
def cleanup_outdir (archive, outdir): def cleanup_outdir (archive, outdir):
"""Cleanup outdir after extraction and return target file name.""" """Cleanup outdir after extraction and return target file name."""
make_user_readable(outdir)
if outdir: if outdir:
# move single directory or file in outdir # move single directory or file in outdir
(res, msg) = move_outdir_orphan(outdir) (res, msg) = move_outdir_orphan(outdir)

View File

@ -215,6 +215,20 @@ def check_filename (filename):
raise PatoolError("File `%s' not readable." % filename) raise PatoolError("File `%s' not readable." % filename)
def set_mode (filename, flags):
"""Set mode flags for given filename if not already set."""
try:
mode = os.lstat(filename).st_mode
except OSError:
# ignore
return
if not (mode & flags):
try:
os.chmod(filename, flags | mode)
except OSError, msg:
log_error("could not set mode flags for `%s': %s" % (filename, msg))
def tmpdir (dir=None): def tmpdir (dir=None):
"""Return a temporary directory for extraction.""" """Return a temporary directory for extraction."""
return tempfile.mkdtemp(suffix='', prefix='Unpack_', dir=dir) return tempfile.mkdtemp(suffix='', prefix='Unpack_', dir=dir)