From d72171069ba3bba6d672861f031c852ff6253d53 Mon Sep 17 00:00:00 2001 From: Christina Date: Fri, 24 Jan 2025 12:27:44 +0100 Subject: [PATCH] simplify chain, wip --- src/lavinmq/auth/authenticator.cr | 15 ------------- src/lavinmq/auth/authenticators/basic.cr | 5 ++--- src/lavinmq/auth/chain.cr | 27 +++++++++--------------- 3 files changed, 12 insertions(+), 35 deletions(-) diff --git a/src/lavinmq/auth/authenticator.cr b/src/lavinmq/auth/authenticator.cr index ab5c930d27..1b0e6831cf 100644 --- a/src/lavinmq/auth/authenticator.cr +++ b/src/lavinmq/auth/authenticator.cr @@ -2,23 +2,8 @@ module LavinMQ module Auth abstract class Authenticator Log = LavinMQ::Log.for "auth.handler" - @log = Logger.new(Log) - property successor : Authenticator? abstract def authenticate(username : String, password : String) - - def set_successor(service : Authenticator) : Authenticator - @successor = service - service - end - - def try_next(username : String, password : String) - if successor = @successor - successor.authenticate(username, password) - else - nil - end - end end end end diff --git a/src/lavinmq/auth/authenticators/basic.cr b/src/lavinmq/auth/authenticators/basic.cr index 8ada815338..c605025ee3 100644 --- a/src/lavinmq/auth/authenticators/basic.cr +++ b/src/lavinmq/auth/authenticators/basic.cr @@ -3,15 +3,14 @@ require "../../server" module LavinMQ module Auth - class BasicAuthenticator < LavinMQ::Auth::Authenticator + class BasicAuthenticator < Authenticator def initialize(@users : UserStore) end def authenticate(username : String, password : String) user = @users[username] return user if user && user.password && user.password.not_nil!.verify(password) - @log.info { "Basic authentication failed" } - try_next(username, password) + Log.info { "Basic authentication failed" } end end end diff --git a/src/lavinmq/auth/chain.cr b/src/lavinmq/auth/chain.cr index ad82317d23..b3438225d8 100644 --- a/src/lavinmq/auth/chain.cr +++ b/src/lavinmq/auth/chain.cr @@ -3,18 +3,19 @@ require "./authenticators/basic" module LavinMQ module Auth - class Chain - @first : Authenticator? + class Chain < Authenticator + @backends : Array(Authenticator) def initialize(users : UserStore) + @backends = [] of Authenticator backends = Config.instance.auth_backends if backends.nil? || backends.size == 0 - add_handler(BasicAuthenticator.new(users)) + @backends << BasicAuthenticator.new(users) else backends.each do |backend| case backend when "basic" - add_handler(BasicAuthenticator.new(users)) + @backends << BasicAuthenticator.new(users) else raise "Unsupported authentication backend: #{backend}" end @@ -22,21 +23,13 @@ module LavinMQ end end - def add_handler(auth : Authenticator) - if first = @first - current = first - while successor = current.@successor - current = successor + def authenticate(username : String, password : String) + @backends.each do |backend| + if user = backend.authenticate(username, password) + return user end - current.set_successor(auth) - else - @first = auth end - self - end - - def authenticate(username : String, password : String) - @first.try &.authenticate(username, password) + nil end end end