Sha256: d542e461b110af4aab400057b71d96b3fe09458d27b3c1dee9d35697c12b6ab5

Contents?: true

Size: 1.18 KB

Versions: 2

Compression:

Stored size: 1.18 KB

Contents

module AdminIt
  # Sign urls for s3
  class SignedUrlController < AdminIt.config.controller
    before_filter :authenticate_user!

    def index
      render json: {
        policy: s3_upload_policy_document,
        signature: s3_upload_signature,
        key: "uploads/#{SecureRandom.uuid}/#{params[:doc][:title]}",
        success_action_redirect: '/'
      }
    end

    private

    # generate the policy document that amazon is expecting.
    def s3_upload_policy_document
      Base64.encode64(
        {
          expiration: 12.hours.from_now.utc.strftime('%Y-%m-%dT%H:%M:%S.000Z'),
          conditions: [
            { bucket: AdminIt.config.s3[:bucket] },
            { acl: 'public-read' },
            ['starts-with', '$key', 'uploads/'],
            { success_action_status: '201' }
          ]
        }.to_json
      ).gsub(/\n|\r/, '')
    end

    # sign our request by Base64 encoding the policy document.
    def s3_upload_signature
      puts AdminIt.config.s3
      Base64.encode64(
        OpenSSL::HMAC.digest(
          OpenSSL::Digest.new('sha1'),
          AdminIt.config.s3[:secret_access_key],
          s3_upload_policy_document
        )
      ).gsub(/\n/, '')
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
admin_it-1.2.8 app/controllers/admin_it/signed_url_controller.rb
admin_it-1.2.7 app/controllers/admin_it/signed_url_controller.rb