File tree Expand file tree Collapse file tree 1 file changed +28
-0
lines changed Expand file tree Collapse file tree 1 file changed +28
-0
lines changed Original file line number Diff line number Diff line change
1
+ """
2
+ A back-ported version of the same module from the 1.0.x branch, without the
3
+ unicode support.
4
+ """
5
+
6
+ from os .path import join , normcase , abspath , sep
7
+
8
+ def safe_join (base , * paths ):
9
+ """
10
+ Joins one or more path components to the base path component intelligently.
11
+ Returns a normalized, absolute version of the final path.
12
+
13
+ The final path must be located inside of the base path component (otherwise
14
+ a ValueError is raised).
15
+ """
16
+ # We need to use normcase to ensure we don't false-negative on case
17
+ # insensitive operating systems (like Windows).
18
+ final_path = normcase (abspath (join (base , * paths )))
19
+ base_path = normcase (abspath (base ))
20
+ base_path_len = len (base_path )
21
+ # Ensure final_path starts with base_path and that the next character after
22
+ # the final path is os.sep (or nothing, in which case final_path must be
23
+ # equal to base_path).
24
+ if not final_path .startswith (base_path ) \
25
+ or final_path [base_path_len :base_path_len + 1 ] not in ('' , sep ):
26
+ raise ValueError ('the joined path is located outside of the base path'
27
+ ' component' )
28
+ return final_path
You can’t perform that action at this time.
0 commit comments