module SignedURL

Constants

ExpiredURL
HMAC_PROC
InvalidSignature
InvalidURL
VERSION

Public Class Methods

call( url, key:, params: {}, expires: 0, signature_param: "signature", expires_param: "expires", hmac_proc: HMAC_PROC ) click to toggle source

Create a new signed url.

# File lib/url_signature.rb, line 24
def self.call(
  url,
  key:,
  params: {},
  expires: 0,
  signature_param: "signature",
  expires_param: "expires",
  hmac_proc: HMAC_PROC
)
  expires = expires.to_i
  params[expires_param] = expires if expires.positive?
  url = build_url(url, params)
  signature = hmac_proc.call(key, url)
  url.add_query(signature_param, signature)
  url.to_s
end
verified?( url, key:, expires_param: "expires", signature_param: "signature", hmac_proc: HMAC_PROC ) click to toggle source
# File lib/url_signature.rb, line 41
def self.verified?(
  url,
  key:,
  expires_param: "expires",
  signature_param: "signature",
  hmac_proc: HMAC_PROC
)
  verify!(
    url,
    key: key,
    hmac_proc: hmac_proc,
    expires_param: expires_param,
    signature_param: signature_param
  )
rescue InvalidSignature, InvalidURL, ExpiredURL
  false
end
verify!( url, key:, hmac_proc: HMAC_PROC, expires_param: "expires", signature_param: "signature" ) click to toggle source
# File lib/url_signature.rb, line 59
def self.verify!( # rubocop:disable Metrics/MethodLength
  url,
  key:,
  hmac_proc: HMAC_PROC,
  expires_param: "expires",
  signature_param: "signature"
)
  url = build_url(url)
  actual_url = url.to_s

  url.remove_query(signature_param)

  expected_url = call(
    url.to_s,
    key: key,
    expires_param: expires_param,
    hmac_proc: hmac_proc,
    signature_param: signature_param
  )

  expires = url.params[expires_param]&.first.to_i

  raise ExpiredURL if expires.positive? && expires < Time.now.to_i
  raise InvalidSignature unless actual_url == expected_url

  true
end

Private Class Methods

build_url(url, params = {}) click to toggle source
# File lib/url_signature.rb, line 88
        def build_url(url, params = {})
  url = URL.new(url)
  params.each {|name, value| url.add_query(name, value) }
  url
end