summaryrefslogtreecommitdiff
path: root/app/validators/import/gitlab_projects/remote_file_validator.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/validators/import/gitlab_projects/remote_file_validator.rb')
-rw-r--r--app/validators/import/gitlab_projects/remote_file_validator.rb45
1 files changed, 45 insertions, 0 deletions
diff --git a/app/validators/import/gitlab_projects/remote_file_validator.rb b/app/validators/import/gitlab_projects/remote_file_validator.rb
new file mode 100644
index 00000000000..67bf102e928
--- /dev/null
+++ b/app/validators/import/gitlab_projects/remote_file_validator.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module Import
+ module GitlabProjects
+ # Validates the given object's #content_type and #content_length accordingly
+ # with the Project Import requirements
+ class RemoteFileValidator < ActiveModel::Validator
+ FILE_SIZE_LIMIT = 10.gigabytes
+ ALLOWED_CONTENT_TYPES = [
+ 'application/gzip',
+ # S3 uses different file types
+ 'application/x-tar',
+ 'application/x-gzip'
+ ].freeze
+
+ def validate(record)
+ validate_content_length(record)
+ validate_content_type(record)
+ end
+
+ private
+
+ def validate_content_length(record)
+ if record.content_length.to_i <= 0
+ record.errors.add(:content_length, :size_too_small, file_size: humanize(1.byte))
+ elsif record.content_length > FILE_SIZE_LIMIT
+ record.errors.add(:content_length, :size_too_big, file_size: humanize(FILE_SIZE_LIMIT))
+ end
+ end
+
+ def humanize(number)
+ ActiveSupport::NumberHelper.number_to_human_size(number)
+ end
+
+ def validate_content_type(record)
+ return if ALLOWED_CONTENT_TYPES.include?(record.content_type)
+
+ record.errors.add(:content_type, "'%{content_type}' not allowed. (Allowed: %{allowed})" % {
+ content_type: record.content_type,
+ allowed: ALLOWED_CONTENT_TYPES.join(', ')
+ })
+ end
+ end
+ end
+end