lib/faye/authentication.rb in faye-authentication-0.4.0 vs lib/faye/authentication.rb in faye-authentication-1.6.0
- old
+ new
@@ -1,14 +1,18 @@
require 'jwt'
+require 'faye/mixins/logging'
require 'faye/authentication/version'
require 'faye/authentication/server_extension'
require 'faye/authentication/client_extension'
require 'faye/authentication/http_client'
require 'faye/authentication/engine'
module Faye
module Authentication
+
+ extend Faye::Logging
+
class AuthError < StandardError; end
class ExpiredError < AuthError; end
class PayloadError < AuthError; end
# Return jwt signature, pass hash of payload including channel and client_id
@@ -17,29 +21,37 @@
JWT.encode(payload.merge(exp: options[:expires_at].to_i), secret, options[:algorithm])
end
# Return signed payload or raise
def self.decode(signature, secret)
- payload, _ = JWT.decode(signature, secret) rescue raise(AuthError)
- raise ExpiredError if Time.at(payload['exp'].to_i) < Time.now
+ payload, _ = JWT.decode(signature, secret)
payload
+ rescue JWT::ExpiredSignature
+ raise ExpiredError
+ rescue
+ raise AuthError
end
# Return true if signature is valid and correspond to channel and clientId or raise
def self.validate(signature, channel, clientId, secret)
payload = self.decode(signature, secret)
raise PayloadError if channel.to_s.empty? || clientId.to_s.empty?
raise PayloadError unless channel == payload['channel'] && clientId == payload['clientId']
true
end
- def self.authentication_required?(message)
+ def self.authentication_required?(message, options = {})
subscription_or_channel = message['subscription'] || message['channel']
- !public_channel?(subscription_or_channel) && (message['channel'] == '/meta/subscribe' || (!(message['channel'].start_with?('/meta/'))))
- end
-
- def self.public_channel?(channel)
- channel.start_with?('/public/') and not channel.include?('*')
+ return false unless (message['channel'] == '/meta/subscribe' || (!(message['channel'].start_with?('/meta/'))))
+ whitelist_proc = options[:whitelist]
+ if whitelist_proc
+ begin
+ return !whitelist_proc.call(subscription_or_channel)
+ rescue => e
+ error("Error caught when evaluating whitelist lambda : #{e.message}")
+ end
+ end
+ true
end
end
end