Class: S3BucketNameValidator

Inherits:
ActiveModel::EachValidator
  • Object
show all
Defined in:
lib/activerecord/s3/bucket/name/validator.rb

Overview

Usage in a model:

validates :bucket_name, s3_bucket_name: { type: :general_purpose }

Options:

:type => :general_purpose (default), :directory, or :table
:transfer_acceleration => true to forbid periods for TA buckets

Constant Summary collapse

RESERVED_PREFIXES_GENERAL =
%w[xn-- sthree- amzn-s3-demo-].freeze
RESERVED_SUFFIXES_GENERAL =
%w[-s3alias --ol-s3 .mrap --x-s3 --table-s3].freeze
RESERVED_PREFIXES_TABLE =
%w[xn-- sthree- amzn-s3-demo- aws].freeze
RESERVED_SUFFIXES_TABLE =
%w[-s3alias --ol-s3 --x-s3 --table-s3].freeze

Instance Method Summary collapse

Instance Method Details

#validate_each(record, attribute, value) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/activerecord/s3/bucket/name/validator.rb', line 42

def validate_each(record, attribute, value)
  type = (options[:type] || :general_purpose).to_sym
  return if blank_ok?(value)

  valid = case type
          when :general_purpose then validate_general_purpose(value, transfer_acceleration: !!options[:transfer_acceleration])
          when :directory then validate_directory_bucket(value)
          when :table then validate_table_bucket(value)
          else
            record.errors.add(attribute, :invalid, message: "unknown bucket type: #{type}")
            false
          end

  unless valid
    error_key = if type == :general_purpose && options[:transfer_acceleration] && value.include?(".")
                  :s3_bucket_name_invalid_transfer_acceleration
                else
                  case type
                  when :general_purpose then :s3_bucket_name_invalid_general
                  when :directory then :s3_bucket_name_invalid_directory
                  when :table then :s3_bucket_name_invalid_table
                  else :s3_bucket_name_invalid
                  end
                end
    record.errors.add(attribute, error_key)
  end
end