module AWS::S3::Client::Validators

def dns_compatible_bucket_name?(bucket_name)

Returns:
  • (Boolean) - Returns true if the given bucket name may be
def dns_compatible_bucket_name?(bucket_name)
  return false if
    !valid_bucket_name?(bucket_name) or
    # Bucket names should be between 3 and 63 characters long
    bucket_name.size > 63 or
    # Bucket names must only contain lowercase letters, numbers, dots, and dashes
    # and must start and end with a lowercase letter or a number
    bucket_name !~ /^[a-z0-9][a-z0-9.-]+[a-z0-9]$/ or
    # Bucket names should not be formatted like an IP address (e.g., 192.168.5.4)
    bucket_name =~ /(\d+\.){3}\d+/ or
    # Bucket names cannot contain two, adjacent periods
    bucket_name['..'] or
    # Bucket names cannot contain dashes next to periods
    # (e.g., "my-.bucket.com" and "my.-bucket" are invalid)
    (bucket_name['-.'] || bucket_name['.-'])
  true
end

def json_validation_message(obj)

def json_validation_message(obj)
  if obj.respond_to?(:to_str)
    obj = obj.to_str
  elsif obj.respond_to?(:to_json)
    obj = obj.to_json
  end
  error = nil
  begin
    JSON.parse(obj)
  rescue => e
    error = e
  end
  "contains invalid JSON: #{error}" if error
end

def path_style_bucket_name? bucket_name

Returns:
  • (Boolean) - Returns true if the bucket name should be used
def path_style_bucket_name? bucket_name
  if dns_compatible_bucket_name?(bucket_name)
    bucket_name =~ /\./ ? true : false
  else
    true
  end
end

def require_acl! options

def require_acl! options
  acl_options = [
    :acl,
    :grant_read,
    :grant_write,
    :grant_read_acp,
    :grant_write_acp,
    :grant_full_control,
    :access_control_policy,
  ]
  unless options.keys.any?{|opt| acl_options.include?(opt) }
    msg = "missing a required ACL option, must provide an ACL " +
          "via :acl, :grant_* or :access_control_policy"
    raise ArgumentError, msg
  end
end

def require_allowed_methods!(allowed_methods)

def require_allowed_methods!(allowed_methods)
  validate!("allowed_methods", allowed_methods) do
    if !allowed_methods.kind_of?(Array)
      "must be an array"
    elsif !allowed_methods.all? { |x| x.kind_of?(String) }
      "must be an array of strings"
    end
  end
end

def require_allowed_origins!(allowed_origins)

def require_allowed_origins!(allowed_origins)
  validate!("allowed_origins", allowed_origins) do
    if !allowed_origins.kind_of?(Array)
      "must be an array"
    elsif !allowed_origins.all? { |x| x.kind_of?(String) }
      "must be an array of strings"
    end
  end
end

def require_bucket_name! bucket_name

def require_bucket_name! bucket_name
  if [nil, ''].include?(bucket_name)
    raise ArgumentError, "bucket_name may not be blank"
  end
end

def require_part_number! part_number

def require_part_number! part_number
  validate!("part_number", part_number) do
    "must not be blank" if part_number.to_s.empty?
  end
end

def require_policy!(policy)

def require_policy!(policy)
  validate!('policy', policy) do
    case
    when policy.nil? || policy == ''
      'may not be blank'
    else
      json_validation_message(policy)
    end
  end
end

def require_upload_id!(upload_id)

def require_upload_id!(upload_id)
  validate!("upload_id", upload_id) do
    "must not be blank" if upload_id.to_s.empty?
  end
end

def set_body_stream_and_content_length request, options

def set_body_stream_and_content_length request, options
  unless options[:content_length]
    msg = "S3 requires a content-length header, unable to determine "
    msg << "the content length of the data provided, please set "
    msg << ":content_length"
    raise ArgumentError, msg
  end
  request.headers['content-length'] = options[:content_length]
  request.body_stream = options[:data]
end

def valid_bucket_name?(bucket_name)

Returns:
  • (Boolean) - Returns true if the given bucket name is valid.
def valid_bucket_name?(bucket_name)
  validate_bucket_name!(bucket_name) rescue false
end

def validate! name, value, &block

def validate! name, value, &block
  if error_msg = yield
    raise ArgumentError, "#{name} #{error_msg}"
  end
  value
end

def validate_bucket_name!(bucket_name)

is invalid, an ArgumentError is raised.
Returns true if the given bucket name is valid. If the name
def validate_bucket_name!(bucket_name)
  validate!('bucket_name', bucket_name) do
    case
    when bucket_name.nil? || bucket_name == ''
      'may not be blank'
    when bucket_name !~ /^[A-Za-z0-9._\-]+$/
      'may only contain uppercase letters, lowercase letters, numbers, periods (.), ' +
      'underscores (_), and dashes (-)'
    when !(3..255).include?(bucket_name.size)
      'must be between 3 and 255 characters long'
    when bucket_name =~ /\n/
      'must not contain a newline character'
    end
  end
end

def validate_key!(key)

def validate_key!(key)
  validate!('key', key) do
    case
    when key.nil? || key == ''
      'may not be blank'
    end
  end
end

def validate_parts!(parts)

def validate_parts!(parts)
  validate!("parts", parts) do
    if !parts.kind_of?(Array)
      "must not be blank"
    elsif parts.empty?
      "must contain at least one entry"
    elsif !parts.all? { |p| p.kind_of?(Hash) }
      "must be an array of hashes"
    elsif !parts.all? { |p| p[:part_number] }
      "must contain part_number for each part"
    elsif !parts.all? { |p| p[:etag] }
      "must contain etag for each part"
    elsif parts.any? { |p| p[:part_number].to_i < 1 }
      "must not have part numbers less than 1"
    end
  end
end