implement pluggable authentication using classes instead of modules
authorLunar <lunar@anargeek.net>
Mon, 13 Feb 2012 23:17:22 +0000 (00:17 +0100)
committerLunar <lunar@anargeek.net>
Tue, 14 Feb 2012 17:38:49 +0000 (18:38 +0100)
It will be less hacky pocky and work better for testing. Otherwise, switching
from one authentication mechanism to another during the same test suite does
not really work well.

README
coquelicot_app.rb
lib/coquelicot/auth.rb [new file with mode: 0644]
lib/coquelicot/auth/imap.rb
lib/coquelicot/auth/simplepass.rb
lib/coquelicot/configure.rb

diff --git a/README b/README
index ec6e65c..d2876ae 100644 (file)
--- a/README
+++ b/README
@@ -254,7 +254,7 @@ with the following responsabilities:
 
  * `lib/coquelicot/auth/<METHOD>.rb`:
 
-   A module implementing the actual authentication. This module must
+   A class implementing the actual authentication. This class must
    implement one method called `authenticate` which will get all the
    parameters as an argument. To simplify your interaction with the
    field `upload_token`, that might be serialized as json, we
index 02ba675..feff911 100644 (file)
@@ -6,6 +6,7 @@ require 'sass'
 require 'digest/sha1'
 require 'gettext'
 require 'coquelicot'
+require 'coquelicot/auth'
 require 'coquelicot/configure'
 require 'haml_gettext'
 
@@ -218,8 +219,12 @@ module Coquelicot
         settings.respond_to?(:clone_url) ? settings.clone_url : "#{base_href}coquelicot.git"
       end
 
+      def authenticate(params)
+        Coquelicot.settings.authenticator.authenticate(params)
+      end
+
       def auth_method
-        Coquelicot.settings.auth_method
+        Coquelicot.settings.authenticator.class.name.gsub(/Coquelicot::Auth::([A-z0-9]+)Authenticator$/, '\1').downcase
       end
     end
   end
diff --git a/lib/coquelicot/auth.rb b/lib/coquelicot/auth.rb
new file mode 100644 (file)
index 0000000..7bedb36
--- /dev/null
@@ -0,0 +1,17 @@
+module Coquelicot
+  module Auth
+    class AbstractAuthenticator
+      def initialize(app)
+        @app = app
+      end
+
+      def settings
+        @app
+      end
+
+      def authenticate(params)
+        raise NotImplementedError.new('Authenticator needs to override the `authenticate` method!')
+      end
+    end
+  end
+end
index 99c638e..fbbd96a 100644 (file)
@@ -1,7 +1,7 @@
 require 'net/imap'
 module Coquelicot
   module Auth
-    module Imap
+    class ImapAuthenticator < AbstractAuthenticator
       def authenticate(params)
         p = params['upload_token'].is_a?(Hash) ? params['upload_token'] : params
         imap = Net::IMAP.new(settings.imap_server, settings.imap_port, true)
@@ -13,4 +13,4 @@ module Coquelicot
       end
     end
   end
-end
\ No newline at end of file
+end
index 1a31284..3ccd14f 100644 (file)
@@ -1,7 +1,6 @@
 module Coquelicot
   module Auth
-    module Simplepass
-
+    class SimplepassAuthenticator < AbstractAuthenticator
       def authenticate(params)
         return TRUE if settings.upload_password.nil?
         upload_password = params['upload_token'].is_a?(Hash) ? params['upload_token']['upload_password'] : params['upload_password']
@@ -9,4 +8,4 @@ module Coquelicot
       end
     end
   end
-end
\ No newline at end of file
+end
index 7453e64..ca5ed5d 100644 (file)
@@ -18,8 +18,8 @@ module Coquelicot::Configure
     private
     def authentication_method(method,options={})
       require "coquelicot/auth/#{method}"
-      set :auth_method, method
-      include (eval "Coquelicot::Auth::#{method.to_s.capitalize}")
+      set :authenticator, Coquelicot::Auth.
+         const_get("#{method.to_s.capitalize}Authenticator").new(self)
       options.each{|k,v| set k,v }
     end
     def default_settings
@@ -47,4 +47,4 @@ module Coquelicot::Configure
       YAML.load(File.read(settings_path))
     end
   end
-end
\ No newline at end of file
+end