8
8
import attr
9
9
import py
10
10
11
- from .pathlib import ensure_reset_dir
12
11
from .pathlib import LOCK_TIMEOUT
13
12
from .pathlib import make_numbered_dir
14
13
from .pathlib import make_numbered_dir_with_cleanup
14
+ from .pathlib import rm_rf
15
15
from _pytest .compat import final
16
16
from _pytest .config import Config
17
17
from _pytest .deprecated import check_ispytest
@@ -90,20 +90,22 @@ def mktemp(self, basename: str, numbered: bool = True) -> Path:
90
90
basename = self ._ensure_relative_to_basetemp (basename )
91
91
if not numbered :
92
92
p = self .getbasetemp ().joinpath (basename )
93
- p .mkdir ()
93
+ p .mkdir (mode = 0o700 )
94
94
else :
95
- p = make_numbered_dir (root = self .getbasetemp (), prefix = basename )
95
+ p = make_numbered_dir (root = self .getbasetemp (), prefix = basename , mode = 0o700 )
96
96
self ._trace ("mktemp" , p )
97
97
return p
98
98
99
99
def getbasetemp (self ) -> Path :
100
- """Return base temporary directory."""
100
+ """Return the base temporary directory, creating it if needed ."""
101
101
if self ._basetemp is not None :
102
102
return self ._basetemp
103
103
104
104
if self ._given_basetemp is not None :
105
105
basetemp = self ._given_basetemp
106
- ensure_reset_dir (basetemp )
106
+ if basetemp .exists ():
107
+ rm_rf (basetemp )
108
+ basetemp .mkdir (mode = 0o700 )
107
109
basetemp = basetemp .resolve ()
108
110
else :
109
111
from_env = os .environ .get ("PYTEST_DEBUG_TEMPROOT" )
@@ -112,14 +114,37 @@ def getbasetemp(self) -> Path:
112
114
# use a sub-directory in the temproot to speed-up
113
115
# make_numbered_dir() call
114
116
rootdir = temproot .joinpath (f"pytest-of-{ user } " )
115
- rootdir .mkdir (exist_ok = True )
117
+ rootdir .mkdir (mode = 0o700 , exist_ok = True )
118
+ # Because we use exist_ok=True with a predictable name, make sure
119
+ # we are the owners, to prevent any funny business (on unix, where
120
+ # temproot is usually shared).
121
+ # Also, to keep things private, fixup any world-readable temp
122
+ # rootdir's permissions. Historically 0o755 was used, so we can't
123
+ # just error out on this, at least for a while.
124
+ if hasattr (os , "getuid" ):
125
+ rootdir_stat = rootdir .stat ()
126
+ uid = os .getuid ()
127
+ # getuid shouldn't fail, but cpython defines such a case.
128
+ # Let's hope for the best.
129
+ if uid != - 1 :
130
+ if rootdir_stat .st_uid != uid :
131
+ raise OSError (
132
+ f"The temporary directory { rootdir } is not owned by the current user. "
133
+ "Fix this and try again."
134
+ )
135
+ if (rootdir_stat .st_mode & 0o077 ) != 0 :
136
+ os .chmod (rootdir , rootdir_stat .st_mode & ~ 0o077 )
116
137
basetemp = make_numbered_dir_with_cleanup (
117
- prefix = "pytest-" , root = rootdir , keep = 3 , lock_timeout = LOCK_TIMEOUT
138
+ prefix = "pytest-" ,
139
+ root = rootdir ,
140
+ keep = 3 ,
141
+ lock_timeout = LOCK_TIMEOUT ,
142
+ mode = 0o700 ,
118
143
)
119
144
assert basetemp is not None , basetemp
120
- self ._basetemp = t = basetemp
121
- self ._trace ("new basetemp" , t )
122
- return t
145
+ self ._basetemp = basetemp
146
+ self ._trace ("new basetemp" , basetemp )
147
+ return basetemp
123
148
124
149
125
150
@final
0 commit comments