OSDN Git Service

Improve files API. Relative path check added. Create dir for new file if missing
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Wed, 20 Nov 2013 08:21:45 +0000 (10:21 +0200)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Wed, 20 Nov 2013 08:21:45 +0000 (10:21 +0200)
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
lib/gitlab/satellite/files/delete_file_action.rb
lib/gitlab/satellite/files/edit_file_action.rb
lib/gitlab/satellite/files/file_action.rb
lib/gitlab/satellite/files/new_file_action.rb

index 10d23f7..3046299 100644 (file)
@@ -17,6 +17,13 @@ module Gitlab
 
           # update the file in the satellite's working dir
           file_path_in_satellite = File.join(repo.working_dir, file_path)
+
+          # Prevent relative links
+          unless safe_path?(file_path_in_satellite)
+            Gitlab::GitLogger.error("FileAction: Relative path not allowed")
+            return false
+          end
+
           File.delete(file_path_in_satellite)
 
           # add removed file
index ee9d31e..f410ecb 100644 (file)
@@ -19,6 +19,13 @@ module Gitlab
 
           # update the file in the satellite's working dir
           file_path_in_satellite = File.join(repo.working_dir, file_path)
+
+          # Prevent relative links
+          unless safe_path?(file_path_in_satellite)
+            Gitlab::GitLogger.error("FileAction: Relative path not allowed")
+            return false
+          end
+
           File.open(file_path_in_satellite, 'w') { |f| f.write(content) }
 
           # commit the changes
index 7c08e29..0f7afde 100644 (file)
@@ -8,6 +8,10 @@ module Gitlab
         @file_path = file_path
         @ref = ref
       end
+
+      def safe_path?(path)
+        File.absolute_path(path) == path
+      end
     end
   end
 end
index 91f7175..57d101f 100644 (file)
@@ -16,15 +16,19 @@ module Gitlab
           # create target branch in satellite at the corresponding commit from bare repo
           repo.git.checkout({raise: true, timeout: true, b: true}, ref, "origin/#{ref}")
 
-          # update the file in the satellite's working dir
           file_path_in_satellite = File.join(repo.working_dir, file_path)
+          dir_name_in_satellite = File.dirname(file_path_in_satellite)
 
           # Prevent relative links
-          unless File.absolute_path(file_path_in_satellite) == file_path_in_satellite
-            Gitlab::GitLogger.error("NewFileAction: Relative path not allowed")
+          unless safe_path?(file_path_in_satellite)
+            Gitlab::GitLogger.error("FileAction: Relative path not allowed")
             return false
           end
 
+          # Create dir if not exists
+          FileUtils.mkdir_p(dir_name_in_satellite)
+
+          # Write file
           File.open(file_path_in_satellite, 'w') { |f| f.write(content) }
 
           # add new file