class S3Relay::UploadPresigner

Attributes

expires[R]
uuid[R]

Public Class Methods

new(options={}) click to toggle source
# File lib/s3_relay/upload_presigner.rb, line 6
def initialize(options={})
  @expires = (options[:expires] || 1.minute.from_now).utc.xmlschema
  @uuid    = SecureRandom.uuid
end

Public Instance Methods

form_data() click to toggle source
# File lib/s3_relay/upload_presigner.rb, line 11
def form_data
  fields.keys.inject({}) { |h,k| h[k.downcase.underscore] = fields[k]; h }
    .merge(
      "endpoint"  => endpoint,
      "policy"    => encoded_policy,
      "signature" => signature,
      "uuid"      => uuid
    )
end

Private Instance Methods

encoded_policy() click to toggle source
# File lib/s3_relay/upload_presigner.rb, line 52
def encoded_policy
  Base64.strict_encode64(policy_document.to_json)
end
fields() click to toggle source
# File lib/s3_relay/upload_presigner.rb, line 23
def fields
  {
    "AWSAccessKeyID"               => access_key_id,
    "x-amz-server-side-encryption" => "AES256",
    "key"                          => "#{uuid}/${filename}",
    "success_action_status"        => "201",
    "acl"                          => acl
  }
end
hmac() click to toggle source
# File lib/s3_relay/upload_presigner.rb, line 33
def hmac
  lambda { |data| OpenSSL::HMAC.digest(digest, secret_access_key, data) }
end
policy_document() click to toggle source
# File lib/s3_relay/upload_presigner.rb, line 37
def policy_document
  {
    "expiration" => expires,
    "conditions" => [
      { "bucket" => bucket },
      { "acl" => acl },
      { "x-amz-server-side-encryption" => "AES256" },
      { "success_action_status" => "201" },
      ["starts-with", "$content-type", ""],
      ["starts-with", "$content-disposition", ""],
      ["starts-with", "$key", "#{uuid}/"]
    ]
  }
end
signature() click to toggle source
# File lib/s3_relay/upload_presigner.rb, line 56
def signature
  Base64.strict_encode64(hmac[encoded_policy])
end