lib/flyyer.rb in flyyer-2.0.0 vs lib/flyyer.rb in flyyer-2.1.0

- old
+ new

@@ -70,11 +70,11 @@ else raise Error.new('Invalid `strategy`. Valid options are `HMAC` or `JWT`.') end end - # Create a https://FLAYYER.com string. + # Create a https://FLYYER.io string. # If you are on Ruby on Rails please use .html_safe when rendering this string into the HTML def href raise Error.new('Missing "project" property') if @project.nil? signature = self.sign @@ -86,24 +86,26 @@ end end end class FlyyerRender - attr_accessor :version, :tenant, :deck, :template, :extension, :variables, :meta + attr_accessor :version, :tenant, :deck, :template, :extension, :variables, :meta, :secret, :strategy def self.create(&block) self.new(&block) end - def initialize(tenant = nil, deck = nil, template = nil, version = nil, extension = 'jpeg', variables = {}, meta = {}) + def initialize(tenant = nil, deck = nil, template = nil, version = nil, extension = nil, variables = {}, meta = {}, secret = nil, strategy = nil) @tenant = tenant @deck = deck @template = template @version = version @extension = extension - @variables = variables + @variables = variables || {} @meta = meta + @secret = secret + @strategy = strategy yield(self) if block_given? end def querystring # Allow accesing the keys of @meta with symbols and strings @@ -113,33 +115,63 @@ when String then sym = k.to_sym; h[sym] if h.key?(sym) when Symbol then str = k.to_s; h[str] if h.key?(str) end end + default_v = {__v: @meta[:v].nil? ? Time.now.to_i : @meta[:v]} # This forces crawlers to refresh the image defaults = { - __v: @meta[:v].nil? ? Time.now.to_i : @meta[:v], # This forces crawlers to refresh the image __id: @meta[:id] || nil, _w: @meta[:width] || nil, _h: @meta[:height] || nil, _res: @meta[:resolution] || nil, - _ua: @meta[:agent] || nil + _ua: @meta[:agent] || nil, } - result = FlyyerHash.new(@variables.nil? ? defaults : defaults.merge(@variables)) - result.to_query + jwt_defaults = { + i: @meta[:id] || nil, + w: @meta[:width] || nil, + h: @meta[:height] || nil, + r: @meta[:resolution] || nil, + u: @meta[:agent] || nil, + var: @variables, + } + if @strategy && @secret + key = @secret + if @strategy.downcase == "hmac" + default_query = FlyyerHash.new(defaults).to_query + data = [@deck, @template, @version || "", @extension || "", default_query].join("#") + __hmac = OpenSSL::HMAC.hexdigest('SHA256', key, data)[0..15] + return FlyyerHash.new([defaults, default_v, @variables, {__hmac: __hmac}].inject(&:merge)).to_query + end + if @strategy.downcase == "jwt" + payload = [{ d: @deck, t: @template, v: @version, e: @extension }, jwt_defaults].inject(&:merge) + __jwt = JWT.encode(payload, key, 'HS256') + return FlyyerHash.new({ __jwt: __jwt }.merge(default_v)).to_query + end + else + return FlyyerHash.new([default_v, defaults, @variables].inject(&:merge)).to_query + end end # Create a https://flyyer.io string. # If you are on Ruby on Rails please use .html_safe when rendering this string into the HTML def href raise Error.new('Missing "tenant" property') if @tenant.nil? raise Error.new('Missing "deck" property') if @deck.nil? raise Error.new('Missing "template" property') if @template.nil? + raise Error.new('Got `secret` but missing `strategy`. Valid options are `HMAC` or `JWT`.') if @secret && @strategy.nil? + raise Error.new('Got `strategy` but missing `secret`. You can find it in your project in Advanced settings.') if @strategy && @secret.nil? + raise Error.new('Invalid signing `strategy`. Valid options are `HMAC` or `JWT`.') if @strategy && @strategy.downcase != "jwt" && @strategy.downcase != "hmac" - if @version.nil? - "https://cdn.flyyer.io/render/v2/#{@tenant}/#{@deck}/#{@template}.#{@extension}?#{self.querystring}" - else - "https://cdn.flyyer.io/render/v2/#{@tenant}/#{@deck}/#{@template}.#{@version}.#{@extension}?#{self.querystring}" + base_href = "https://cdn.flyyer.io/render/v2/#{@tenant}" + + if @strategy and @strategy.downcase == "jwt" + return "#{base_href}?#{self.querystring}" end + + final_href = "#{base_href}/#{@deck}/#{@template}" + final_href << ".#{@version}" if @version + final_href << ".#{@extension}" if @extension + final_href << "?#{self.querystring}" end end # A compatible qs stringify/parse (https://github.com/ljharb/qs) class FlyyerHash