From 1254787d03413a3b76022541af11020b362ff754 Mon Sep 17 00:00:00 2001 From: paul Date: Wed, 28 Sep 2005 14:51:32 +0000 Subject: [PATCH] Added multiple backend/plugin support: * Transformed Server::Handler::Backend to Server::Handler::Backend::Basic. * Inheritance from this class will result in registering of the class for that type. * Written Server::Handler::Backend module for loading and getting backends. * Provided empty LDAP backend class. * Changed auth stub to not use rand() but to check whether the password is "foo". git-svn-id: svn+ssh://svn.luon.net/svn/ildus/trunk@5 65a33f86-aa00-0410-91be-cd1bf5efb309 --- lib/ildus/server.rb | 6 +++ lib/ildus/server/account.rb | 2 +- lib/ildus/server/backend.rb | 73 ++++++++++++++++++++++--------- lib/ildus/server/backends/ldap.rb | 15 +++++++ lib/ildus/server/handler.rb | 5 ++- 5 files changed, 78 insertions(+), 23 deletions(-) create mode 100644 lib/ildus/server/backends/ldap.rb diff --git a/lib/ildus/server.rb b/lib/ildus/server.rb index bd17523..a116d03 100644 --- a/lib/ildus/server.rb +++ b/lib/ildus/server.rb @@ -29,6 +29,8 @@ module Ildus @config = nil parse_config(config_file) + Backend.load + super(config['port'], DEFAULT_HOST, 20, $stderr, true, false) end @@ -63,8 +65,12 @@ module Ildus raise ArgumentError unless FileTest.exists? filename File.open(filename, "r") do |io| + # FIXME: merge the YAML with a default config @config = YAML.load(io) end + + # FIXME: test config for existance of certain fields: + # port, passwd, backend, backend/type end end # class Server diff --git a/lib/ildus/server/account.rb b/lib/ildus/server/account.rb index 179b6de..9d6a84c 100644 --- a/lib/ildus/server/account.rb +++ b/lib/ildus/server/account.rb @@ -38,7 +38,7 @@ module Ildus raise Handler::AlreadyAuthError if @auth @pass = password ## STUB - @auth = rand(2).zero? + @auth = (password == "foo") ## end diff --git a/lib/ildus/server/backend.rb b/lib/ildus/server/backend.rb index 5dcdc0b..0e97b6d 100644 --- a/lib/ildus/server/backend.rb +++ b/lib/ildus/server/backend.rb @@ -12,35 +12,66 @@ require 'singleton' module Ildus class Server + + module Backend + + BackendClasses = Hash.new + + class << self + + def load + path = File.dirname(__FILE__) + Dir["#{path}/backends/**/*.rb"].each { |file| require file } + end + + def get(type) + BackendClasses[type.to_sym] + end + alias_method :[], :get + + def register(type, backend_class) + if BackendClasses.include? type + raise "type #{type} already registered" + end + BackendClasses[type] = backend_class + end + + end - class Backend - include Singleton + class Basic - def hostnames_of(user) - raise Handler::NotImplementedError - end + def self.inherited(subclass) + type = subclass.to_s.split('::').last.downcase.to_sym + Backend.register(type, subclass) + end - def add_hostname(user) - raise Handler::NotImplementedError - end + def hostnames_of(user) + raise Handler::NotImplementedError + end - def remove_hostname(user) - raise Handler::NotImplementedError - end + def add_hostname(user) + raise Handler::NotImplementedError + end - def update_hostname(user, host, addr) - raise Handler::NotImplementedError - end + def remove_hostname(user) + raise Handler::NotImplementedError + end - def add_alias(user, new_alias, host) - raise Handler::NotImplementedError - end + def update_hostname(user, host, addr) + raise Handler::NotImplementedError + end - def remove_alias(user, old_alias, host) - raise Handler::NotImplementedError - end + def add_alias(user, new_alias, host) + raise Handler::NotImplementedError + end - end # class Backend + def remove_alias(user, old_alias, host) + raise Handler::NotImplementedError + end + + end # class Basic + + end # module Backend end # class Server diff --git a/lib/ildus/server/backends/ldap.rb b/lib/ildus/server/backends/ldap.rb new file mode 100644 index 0000000..940a2e0 --- /dev/null +++ b/lib/ildus/server/backends/ldap.rb @@ -0,0 +1,15 @@ +# = ildus/server/backend - generic server backend library +# +# Copyright (C) 2005 Paul van Tilburg +# +# Ildus is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2 of the License, or (at your option) +# any later version. + +module Ildus::Server::Backend + + class LDAP < Basic + end + +end diff --git a/lib/ildus/server/handler.rb b/lib/ildus/server/handler.rb index 1f42053..9a11b46 100644 --- a/lib/ildus/server/handler.rb +++ b/lib/ildus/server/handler.rb @@ -61,7 +61,10 @@ module Ildus @server = server @io = io @account = Account.new - @backend = Backend.instance + type = server.config["backend"]["type"] + klass = Backend[server.config["backend"]["type"]] + raise "backend type `#{type}' not found" if klass.nil? + @backend = klass.new end def handle_client