From a45f6074d2ea16dc0cd7a59f6031a5c6b14b2e88 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Tue, 7 May 2019 21:26:29 -0400 Subject: [PATCH] caa-fetcher: Create downloaded files with correct permissions. python's NamedTemporaryFile hardcodes a mode of 0600, which is wrong for what we are trying to accomplish. Downloaded files should be created with default permissions (respecting umask, acls, etc.) It's a real pain to fix up permissions after the fact so we'll have to cook up our own version instead... --- caa-fetcher.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/caa-fetcher.py b/caa-fetcher.py index 5c23107..7f90f2c 100755 --- a/caa-fetcher.py +++ b/caa-fetcher.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright © 2018 Nick Bowler +# Copyright © 2018-2019 Nick Bowler # # Tool to fetch album art for a release from the Cover Art Archive. # @@ -15,20 +15,35 @@ import tempfile import sys import os +umask = os.umask(0) +os.umask(umask) + progname = "caa-fetcher" -version = "0" +version = "1" musicbrainzngs.set_useragent(progname, version) parser = argparse.ArgumentParser( description='Download album artwork from the Cover Art Archive' ) +# NamedTemporaryFile workalike which allows control of the file mode... +def open_tmp(prefix="tmp", suffix="", dir=".", mode=0o600): + names = tempfile._get_candidate_names() + for seq in range(100): + name = os.path.join(dir, "%s%s%s" % (prefix, next(names), suffix)) + try: + f = open(name, "x+", mode) + except FileExistsError: + continue + return tempfile._TemporaryFileWrapper(f, name) + return None + class VersionAction(argparse.Action): def __init__(self, **kw): super().__init__(nargs=0, help="show a version message and exit", **kw) def __call__(self, parser, namespace, values, option_string=None): print("%s %s" % (progname, version)) - print('''Copyright © 2018 Nick Bowler + print('''Copyright © 2019 Nick Bowler License WTFPL2: Do What The Fuck You Want To Public License, version 2. This is free software: you are free to do what the fuck you want to. There is NO WARRANTY, to the extent permitted by law.''') @@ -64,10 +79,11 @@ for c in covers["images"]: print("%s already exists, skipping..." % outname) continue - outfile = tempfile.NamedTemporaryFile(suffix=ext, dir=".") + outfile = open_tmp(suffix=ext, dir=".", mode=0o666) rc = os.spawnlp(os.P_WAIT, 'wget', 'wget', '-O', outfile.name, c["image"]) if rc: failed = True + os.link(outfile.name, outname) outfile.close() -- 2.43.0