lib/ey-hmac/adapter.rb in ey-hmac-2.0.2 vs lib/ey-hmac/adapter.rb in ey-hmac-2.1.0
- old
+ new
@@ -8,17 +8,19 @@
attr_reader :request, :options, :authorization_header, :service, :sign_with, :accept_digests
# @param [Object] request signer-specific request implementation
# @option options [Integer] :version signature version
+ # @option options [Integer] :ttl (nil) duration during which HMAC is valid after signed date
# @option options [String] :authorization_header ('Authorization') Authorization header key.
# @option options [String] :server ('EyHmac') service name prefixed to {#authorization}. set to {#service}
# @option options [Symbol] :sign_with (:sha_256) outgoing signature digest algorithm. See {OpenSSL::Digest#new}
# @option options [Array] :accepted_digests ([:sha_256]) accepted incoming signature digest algorithm. See {OpenSSL::Digest#new}
def initialize(request, options={})
@request, @options = request, options
+ @ttl = options[:ttl]
@authorization_header = options[:authorization_header] || 'Authorization'
@service = options[:service] || 'EyHmac'
@sign_with = options[:sign_with] || :sha256
@accept_digests = Array(options[:accept_digests] || :sha256)
end
@@ -117,9 +119,17 @@
key_id = authorization_match[1]
signature_value = authorization_match[2]
unless key_secret = block.call(key_id)
raise(Ey::Hmac::MissingSecret, "Failed to find secret matching #{key_id.inspect}")
+ end
+
+ unless @ttl.nil?
+ expiry = Time.parse(date).to_i + @ttl
+ current_time = Time.now.to_i
+ unless expiry > current_time
+ raise(Ey::Hmac::ExpiredHmac, "Signature has expired passed #{expiry}. Current time is #{current_time}")
+ end
end
calculated_signatures = self.accept_digests.map { |ad| signature(key_secret, ad) }
unless calculated_signatures.any? { |cs| secure_compare(signature_value, cs) }