Commit 3f3b202c6efa17a8e6731ba44c5f3bf672c28672
1 parent
a1d88f0f
Exists in
master
and in
4 other branches
Improve files API. Relative path check added. Create dir for new file if missing
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Showing
4 changed files
with
25 additions
and
3 deletions
Show diff stats
lib/gitlab/satellite/files/delete_file_action.rb
@@ -17,6 +17,13 @@ module Gitlab | @@ -17,6 +17,13 @@ module Gitlab | ||
17 | 17 | ||
18 | # update the file in the satellite's working dir | 18 | # update the file in the satellite's working dir |
19 | file_path_in_satellite = File.join(repo.working_dir, file_path) | 19 | file_path_in_satellite = File.join(repo.working_dir, file_path) |
20 | + | ||
21 | + # Prevent relative links | ||
22 | + unless safe_path?(file_path_in_satellite) | ||
23 | + Gitlab::GitLogger.error("FileAction: Relative path not allowed") | ||
24 | + return false | ||
25 | + end | ||
26 | + | ||
20 | File.delete(file_path_in_satellite) | 27 | File.delete(file_path_in_satellite) |
21 | 28 | ||
22 | # add removed file | 29 | # add removed file |
lib/gitlab/satellite/files/edit_file_action.rb
@@ -19,6 +19,13 @@ module Gitlab | @@ -19,6 +19,13 @@ module Gitlab | ||
19 | 19 | ||
20 | # update the file in the satellite's working dir | 20 | # update the file in the satellite's working dir |
21 | file_path_in_satellite = File.join(repo.working_dir, file_path) | 21 | file_path_in_satellite = File.join(repo.working_dir, file_path) |
22 | + | ||
23 | + # Prevent relative links | ||
24 | + unless safe_path?(file_path_in_satellite) | ||
25 | + Gitlab::GitLogger.error("FileAction: Relative path not allowed") | ||
26 | + return false | ||
27 | + end | ||
28 | + | ||
22 | File.open(file_path_in_satellite, 'w') { |f| f.write(content) } | 29 | File.open(file_path_in_satellite, 'w') { |f| f.write(content) } |
23 | 30 | ||
24 | # commit the changes | 31 | # commit the changes |
lib/gitlab/satellite/files/file_action.rb
lib/gitlab/satellite/files/new_file_action.rb
@@ -16,15 +16,19 @@ module Gitlab | @@ -16,15 +16,19 @@ module Gitlab | ||
16 | # create target branch in satellite at the corresponding commit from bare repo | 16 | # create target branch in satellite at the corresponding commit from bare repo |
17 | repo.git.checkout({raise: true, timeout: true, b: true}, ref, "origin/#{ref}") | 17 | repo.git.checkout({raise: true, timeout: true, b: true}, ref, "origin/#{ref}") |
18 | 18 | ||
19 | - # update the file in the satellite's working dir | ||
20 | file_path_in_satellite = File.join(repo.working_dir, file_path) | 19 | file_path_in_satellite = File.join(repo.working_dir, file_path) |
20 | + dir_name_in_satellite = File.dirname(file_path_in_satellite) | ||
21 | 21 | ||
22 | # Prevent relative links | 22 | # Prevent relative links |
23 | - unless File.absolute_path(file_path_in_satellite) == file_path_in_satellite | ||
24 | - Gitlab::GitLogger.error("NewFileAction: Relative path not allowed") | 23 | + unless safe_path?(file_path_in_satellite) |
24 | + Gitlab::GitLogger.error("FileAction: Relative path not allowed") | ||
25 | return false | 25 | return false |
26 | end | 26 | end |
27 | 27 | ||
28 | + # Create dir if not exists | ||
29 | + FileUtils.mkdir_p(dir_name_in_satellite) | ||
30 | + | ||
31 | + # Write file | ||
28 | File.open(file_path_in_satellite, 'w') { |f| f.write(content) } | 32 | File.open(file_path_in_satellite, 'w') { |f| f.write(content) } |
29 | 33 | ||
30 | # add new file | 34 | # add new file |