Sha256: 9f5a0719afbe5c4aaa57b462ab28a553998bc739fd6405ddad94ab764e59a9db

Contents?: true

Size: 1.55 KB

Versions: 12

Compression:

Stored size: 1.55 KB

Contents

# frozen_string_literal: true

require_relative 'base_generator'

module Uploadcare
  module SignedUrlGenerators
    class AmakaiGenerator < Uploadcare::SignedUrlGenerators::BaseGenerator
      UUID_REGEX = '[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}'
      TEMPLATE = 'https://{cdn_host}/{uuid}/?token=exp={expiration}{delimiter}acl={acl}{delimiter}hmac={token}'

      def generate_url(uuid, acl = uuid)
        raise ArgumentError, 'Must contain valid UUID' unless valid?(uuid)

        expire = build_expire
        signature = build_signature(expire, acl)

        TEMPLATE.gsub('{delimiter}', delimiter)
                .sub('{cdn_host}', sanitized_string(cdn_host))
                .sub('{uuid}', sanitized_string(uuid))
                .sub('{acl}', "/#{sanitized_string(acl)}/")
                .sub('{expiration}', expire)
                .sub('{token}', signature)
      end

      private

      def valid?(uuid)
        uuid.match(UUID_REGEX)
      end

      def delimiter
        '~'
      end

      def build_expire
        (Time.now.to_i + ttl).to_s
      end

      def build_signature(expire, acl)
        signature = ["exp=#{expire}", "acl=/#{sanitized_string(acl)}/"].join(delimiter)
        OpenSSL::HMAC.hexdigest(algorithm, secret_key, signature)
      end

      # rubocop:disable Style/SlicingWithRange
      def sanitized_string(string)
        string = string[1..-1] if string[0] == '/'
        string = string[0...-1] if string[-1] == '/'
        string.strip
      end
      # rubocop:enable Style/SlicingWithRange
    end
  end
end

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
uploadcare-ruby-4.4.0 lib/uploadcare/signed_url_generators/amakai_generator.rb
uploadcare-ruby-4.3.6 lib/uploadcare/signed_url_generators/amakai_generator.rb
uploadcare-ruby-4.3.5 lib/uploadcare/signed_url_generators/amakai_generator.rb
uploadcare-ruby-4.3.4 lib/uploadcare/signed_url_generators/amakai_generator.rb
uploadcare-ruby-4.3.3 lib/uploadcare/signed_url_generators/amakai_generator.rb
uploadcare-ruby-4.3.2 lib/uploadcare/signed_url_generators/amakai_generator.rb
uploadcare-ruby-4.3.1 lib/uploadcare/signed_url_generators/amakai_generator.rb
uploadcare-ruby-4.3.0 lib/uploadcare/signed_url_generators/amakai_generator.rb
uploadcare-ruby-4.2.0 lib/uploadcare/signed_url_generators/amakai_generator.rb
uploadcare-ruby-3.3.2 lib/uploadcare/signed_url_generators/amakai_generator.rb
uploadcare-ruby-3.3.1 lib/uploadcare/signed_url_generators/amakai_generator.rb
uploadcare-ruby-3.3.0 lib/uploadcare/signed_url_generators/amakai_generator.rb