summaryrefslogtreecommitdiff
path: root/app/models/snippet_repository.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/snippet_repository.rb')
-rw-r--r--app/models/snippet_repository.rb30
1 files changed, 28 insertions, 2 deletions
diff --git a/app/models/snippet_repository.rb b/app/models/snippet_repository.rb
index e60dbb4d141..2276851b7a1 100644
--- a/app/models/snippet_repository.rb
+++ b/app/models/snippet_repository.rb
@@ -7,6 +7,8 @@ class SnippetRepository < ApplicationRecord
EMPTY_FILE_PATTERN = /^#{DEFAULT_EMPTY_FILE_NAME}(\d+)\.txt$/.freeze
CommitError = Class.new(StandardError)
+ InvalidPathError = Class.new(CommitError)
+ InvalidSignatureError = Class.new(CommitError)
belongs_to :snippet, inverse_of: :snippet_repository
@@ -40,8 +42,12 @@ class SnippetRepository < ApplicationRecord
rescue Gitlab::Git::Index::IndexError,
Gitlab::Git::CommitError,
Gitlab::Git::PreReceiveError,
- Gitlab::Git::CommandError => e
- raise CommitError, e.message
+ Gitlab::Git::CommandError,
+ ArgumentError => error
+
+ logger.error(message: "Snippet git error. Reason: #{error.message}", snippet: snippet.id)
+
+ raise commit_error_exception(error)
end
def transform_file_entries(files)
@@ -85,4 +91,24 @@ class SnippetRepository < ApplicationRecord
def build_empty_file_name(index)
"#{DEFAULT_EMPTY_FILE_NAME}#{index}.txt"
end
+
+ def commit_error_exception(err)
+ if invalid_path_error?(err)
+ InvalidPathError.new('Invalid file name') # To avoid returning the message with the path included
+ elsif invalid_signature_error?(err)
+ InvalidSignatureError.new(err.message)
+ else
+ CommitError.new(err.message)
+ end
+ end
+
+ def invalid_path_error?(err)
+ err.is_a?(Gitlab::Git::Index::IndexError) &&
+ err.message.downcase.start_with?('invalid path', 'path cannot include directory traversal')
+ end
+
+ def invalid_signature_error?(err)
+ err.is_a?(ArgumentError) &&
+ err.message.downcase.match?(/failed to parse signature/)
+ end
end