| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- # -----------------------------------------------------------------------------
- # Copyright (c) 2023, PyInstaller Development Team.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- #
- # The full license is in the file COPYING.txt, distributed with this software.
- #
- # SPDX-License-Identifier: Apache-2.0
- # -----------------------------------------------------------------------------
- import os
- import sys
- import errno
- import tempfile
- # Helper for creating temporary directories with access restricted to the user running the process.
- # On POSIX systems, this is already achieved by `tempfile.mkdtemp`, which uses 0o700 permissions mask.
- # On Windows, however, the POSIX permissions semantics have no effect, and we need to provide our own implementation
- # that restricts the access by passing appropriate security attributes to the `CreateDirectory` function.
- if os.name == 'nt':
- from . import _win32
- def secure_mkdtemp(suffix=None, prefix=None, dir=None):
- """
- Windows-specific replacement for `tempfile.mkdtemp` that restricts access to the user running the process.
- Based on `mkdtemp` implementation from python 3.11 stdlib.
- """
- prefix, suffix, dir, output_type = tempfile._sanitize_params(prefix, suffix, dir)
- names = tempfile._get_candidate_names()
- if output_type is bytes:
- names = map(os.fsencode, names)
- for seq in range(tempfile.TMP_MAX):
- name = next(names)
- file = os.path.join(dir, prefix + name + suffix)
- sys.audit("tempfile.mkdtemp", file)
- try:
- _win32.secure_mkdir(file)
- except FileExistsError:
- continue # try again
- except PermissionError:
- # This exception is thrown when a directory with the chosen name already exists on windows.
- if (os.name == 'nt' and os.path.isdir(dir) and os.access(dir, os.W_OK)):
- continue
- else:
- raise
- return file
- raise FileExistsError(errno.EEXIST, "No usable temporary directory name found")
- else:
- secure_mkdtemp = tempfile.mkdtemp
|