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, :table, or :vector
:namespace => :account_regional for general-purpose account regional bucket names
: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



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
69
70
71
72
73
74
75
76
# File 'lib/activerecord/s3/bucket/name/validator.rb', line 43

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

  valid = case type
  when :general_purpose
    validate_general_purpose(
      value,
      transfer_acceleration: !!options[:transfer_acceleration],
      namespace: options[:namespace]
    )
  when :directory then validate_directory_bucket(value)
  when :table then validate_table_bucket(value)
  when :vector then validate_vector_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
      when :vector then :s3_bucket_name_invalid_vector
      else :s3_bucket_name_invalid
      end
    end
    record.errors.add(attribute, error_key)
  end
end