class S3SigGen::Generator

Attributes

acl[RW]
aws_access_key_id[RW]
aws_secret_access_key[RW]
bucket[RW]
key[RW]
region[RW]
server_side_encryption[RW]

Public Class Methods

new(options = {}) { |self| ... } click to toggle source
# File lib/s3_sig_gen/generator.rb, line 11
def initialize options = {}
  @aws_access_key_id = options[:aws_access_key_id]
  @aws_secret_access_key = options[:aws_secret_access_key]
  @region = options[:region] || 'us-east-1'
  @bucket = options[:bucket]
  @key = options[:key]
  @acl = options[:acl] || 'public-read'
  @server_side_encryption = options[:server_side_encryption] || false

  yield self if block_given?
end

Public Instance Methods

signature() click to toggle source
# File lib/s3_sig_gen/generator.rb, line 23
def signature
  build_signature
end

Private Instance Methods

base64_encode(string) click to toggle source
# File lib/s3_sig_gen/generator.rb, line 70
def base64_encode string
  Base64.strict_encode64 string
end
build_signature() click to toggle source
# File lib/s3_sig_gen/generator.rb, line 29
def build_signature
  unencoded_policy = {}
  unencoded_policy['expiration'] = expiration
  unencoded_policy['conditions'] = []
  unencoded_policy['conditions'] << { 'acl': @acl }
  unencoded_policy['conditions'] << { 'bucket': @bucket }
  unencoded_policy['conditions'] << { 'key': @key }
  unencoded_policy['conditions'] << { 'success_action_status': '200' }
  unencoded_policy['conditions'] << { 'x-amz-algorithm': 'AWS4-HMAC-SHA256' }
  unencoded_policy['conditions'] << { 'x-amz-credential':  x_amz_credential }
  unencoded_policy['conditions'] << { 'x-amz-date':  x_amz_date }
  unencoded_policy['conditions'] << { 'x-amz-server-side-encryption': 'AES256' } if @server_side_encryption

  base64_encoded_policy = base64_encode unencoded_policy.to_json
  signed_policy = sign_policy base64_encoded_policy

  signature = {}
  signature['acl'] = unencoded_policy['conditions'][0][:acl]
  signature['key'] = unencoded_policy['conditions'][2][:key]
  signature['success_action_status'] = unencoded_policy['conditions'][3][:success_action_status]
  signature['policy'] = base64_encoded_policy.to_s
  signature['x-amz-algorithm'] = unencoded_policy['conditions'][4]['x-amz-algorithm'.to_sym]
  signature['x-amz-credential'] = unencoded_policy['conditions'][5]['x-amz-credential'.to_sym]
  signature['x-amz-date'] = unencoded_policy['conditions'][6]['x-amz-date'.to_sym]
  signature['x-amz-server-side-encryption'] = unencoded_policy['conditions'][7]['x-amz-server-side-encryption'.to_sym] if @server_side_encryption
  signature['x-amz-signature'] = signed_policy
  signature
end
expiration() click to toggle source
# File lib/s3_sig_gen/generator.rb, line 58
def expiration
  (Time.now + (5 * 60 * 1000)).utc.iso8601.to_s
end
sign_policy(policy) click to toggle source
# File lib/s3_sig_gen/generator.rb, line 74
def sign_policy policy
  signing_key = OpenSSL::HMAC.digest('sha256', "AWS4#{@aws_secret_access_key}", Date.today.to_s.delete('-'))
  signing_key = OpenSSL::HMAC.digest('sha256', signing_key, @region)
  signing_key = OpenSSL::HMAC.digest('sha256', signing_key, 's3')
  signing_key = OpenSSL::HMAC.digest('sha256', signing_key, 'aws4_request')
  OpenSSL::HMAC.hexdigest('sha256', signing_key, policy)
end
x_amz_credential() click to toggle source
# File lib/s3_sig_gen/generator.rb, line 62
def x_amz_credential
  "#{@aws_access_key_id}/#{Date.today.to_s.delete('-')}/#{@region}/s3/aws4_request"
end
x_amz_date() click to toggle source
# File lib/s3_sig_gen/generator.rb, line 66
def x_amz_date
  "#{Date.today.to_s.delete('-')}T000000Z"
end