module Cloudinary::AuthToken

def self.generate(options = {})

def self.generate(options = {})
  key = options[:key]
  raise "Missing auth token key configuration" unless key
  name = options[:token_name] || "__cld_token__"
  start = options[:start_time]
  expiration = options[:expiration]
  ip = options[:ip]
  acl = options[:acl]
  if acl.present?
    acl = acl.is_a?(String) ? [acl] : acl
  end
  duration = options[:duration]
  url = options[:url]
  start = Time.new.getgm.to_i if start == 'now'
  if expiration.nil? || expiration == 0
    if !(duration.nil? || duration == 0)
      expiration = (start || Time.new.getgm.to_i) + duration
    else
      raise 'Must provide either expiration or duration'
    end
  end
  if url.blank? && acl.blank?
    raise 'AuthToken must contain either an acl or a url property'
  end
  token = []
  token << "ip=#{ip}" if ip
  token << "st=#{start}" if start
  token << "exp=#{expiration}"
  token << "acl=#{escape_to_lower(acl.join('!'))}" if acl && acl.size > 0
  to_sign = token.clone
  to_sign << "url=#{escape_to_lower(url)}" if url && (acl.blank? || acl.size == 0)
  auth = digest(to_sign.join(SEPARATOR), key)
  token << "hmac=#{auth}"
  "#{name}=#{token.join(SEPARATOR)}"
end