Add configuration mechanism
authormh <mh@immerda.ch>
Mon, 2 May 2011 14:06:15 +0000 (16:06 +0200)
committermh <mh@immerda.ch>
Mon, 2 May 2011 14:21:49 +0000 (16:21 +0200)
It is now possible to configure Coquelicot according to your needs
without touching any application code at all.

Examples and default configuration settings can be found in conf/

.gitignore
README
conf/settings-default.yml [new file with mode: 0644]
conf/settings-imap.yml [new file with mode: 0644]
conf/settings-simplepass.yml [new file with mode: 0644]
coquelicot_app.rb
lib/coquelicot/configure.rb [new file with mode: 0644]
test_coquelicot.rb

index 63b0272..fffc22a 100644 (file)
@@ -2,3 +2,4 @@ files/
 locale/
 tmp/restart.txt
 tmp/always_restart.txt
+conf/settings.yml
diff --git a/README b/README
index de23023..1372904 100644 (file)
--- a/README
+++ b/README
@@ -27,6 +27,12 @@ Features
    space, uploading a file for sharing is protected by a common
    password.
 
+ * IMAP mechanism: Uploading is protected by an imap login
+
+   As a protection mechanism we can enable login via imap credentials. The user
+   will be asked to provide her imap credentials and we will perform an imap
+   login in order to authenticate the user.
+
  * Mandatory expiration
 
    When uploading, a time limit has to be specified. The file will be
@@ -111,6 +117,29 @@ depending on your setup. *evil grin*
 Coquelicot is intended to be run on a fully encrypted system and accessible
 only through HTTPS.
 
+Configuration
+-------------
+
+By default Coquelicot is configured to authenticate with the simplepass mechanism
+and some other reasonable defaults. 
+It is possible to overwrite these settings from a configuration file named
+settings.yml that will be used if it is present in the conf directory of the
+application.
+
+All available settings with their default values are documented in
+conf/settings-default.yml
+
+Further settings example:
+
+* conf/settings-simplepass.yml: Shows how to change the default password for the 
+                                simplepass mechanism.
+
+* conf/settings-imap.yml: Necessary configuration for the imap authentication
+                          mechanism. 
+
+You can copy one of these examples to conf/settings.yml and adjust them according
+to your environment.
+
 Test suite
 ----------
 
@@ -138,12 +167,6 @@ Coquelicot provides a migration script to import Jyraphe 0.5 repositories in
 Future
 ------
 
- * Read settings from a configuration file.
-
-   Currently settings, such as the authentication mechanism and its options
-   need to be specified within the application. Coquelicot should load its
-   settings from a configuration file.
-
  * More flexible expiration
 
    It might be interesting to also offer a calendar for specifying
@@ -249,6 +272,7 @@ Authors
 -------
 
 Coquelicot © 2010 potager.org <jardiniers@potager.org>
+mh © 2011 immerda.ch <mh+coquelicot@immerda.ch>
 
 Coquelicot is distributed under the GNU Affero General Public License
 version 3. See LICENSE for details.
diff --git a/conf/settings-default.yml b/conf/settings-default.yml
new file mode 100644 (file)
index 0000000..f713b53
--- /dev/null
@@ -0,0 +1,10 @@
+default_expire: 60
+# 43200 == 60 * 24 * 30 == 1 month
+maximum_expire: 43200
+gone_period: 10080
+filename_length: 20
+random_pass_length: 16
+depot_path: './files'
+authentication_method:
+  name: 'simplepass'
+  upload_password: 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3'          
diff --git a/conf/settings-imap.yml b/conf/settings-imap.yml
new file mode 100644 (file)
index 0000000..411d0f0
--- /dev/null
@@ -0,0 +1,4 @@
+authentication_method:
+  name: imap
+  imap_server: 'imap.example.com'
+  imap_port: 993
diff --git a/conf/settings-simplepass.yml b/conf/settings-simplepass.yml
new file mode 100644 (file)
index 0000000..43e5c2d
--- /dev/null
@@ -0,0 +1,3 @@
+authentication_method:
+  name: simplepass
+  upload_password: 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3'
index 24e6e44..cee4509 100644 (file)
@@ -6,6 +6,7 @@ require 'sass'
 require 'digest/sha1'
 require 'gettext'
 require 'coquelicot'
+require 'coquelicot/configure'
 require 'haml_gettext'
 
 module Coquelicot
@@ -49,22 +50,8 @@ module Coquelicot
   end
 
   class Application < Sinatra::Base
-    def self.authentication_method(method,options={})
-      require "coquelicot/auth/#{method}"
-      set :auth_method, method
-      include (eval "Coquelicot::Auth::#{method.to_s.capitalize}")
-      options.each{|k,v| set k,v }
-    end
-
     set :app_file, __FILE__
-    set :default_expire, 60
-    set :maximum_expire, 60 * 24 * 30 # 1 month
-    set :gone_period, 10080
-    set :filename_length, 20
-    set :random_pass_length, 16
-    set :depot_path, Proc.new { File.join(root, 'files') }
-
-    authentication_method :simplepass, :upload_password => 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3'
+    include Coquelicot::Configure
 
     GetText::bindtextdomain('coquelicot')
     before do
diff --git a/lib/coquelicot/configure.rb b/lib/coquelicot/configure.rb
new file mode 100644 (file)
index 0000000..275184b
--- /dev/null
@@ -0,0 +1,48 @@
+module Coquelicot::Configure
+  
+  def self.included(c)
+    c.extend ClassMethods
+    c.configure
+  end
+  
+  module ClassMethods
+    def configure
+      user_settings = File.exists?(settings_path) ? load_user_settings : {}
+      default_settings.delete('authentication_method') if user_settings['authentication_method']
+      merged_settings = default_settings.merge(user_settings)
+      if (authm=merged_settings.delete('authentication_method'))
+        authentication_method authm.delete('name'), authm
+      end
+      merged_settings.each{|k,v| set k,v }
+    end
+    private
+    def authentication_method(method,options={})
+      require "coquelicot/auth/#{method}"
+      set :auth_method, method
+      include (eval "Coquelicot::Auth::#{method.to_s.capitalize}")
+      options.each{|k,v| set k,v }
+    end
+    def default_settings
+      {
+        'default_expire' => 60,
+        'maximum_expire' => 60 * 24 * 30, # 1 month
+        'gone_period' => 10080,
+        'filename_length' => 20,
+        'random_pass_length' => 16,
+        'depot_path' => Proc.new { File.join(root, 'files') },
+        'authentication_method' => {
+          'name' => 'simplepass',
+          'upload_password' => 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3'          
+        },
+      }
+    end
+    
+    def settings_path
+      @settings_path ||= File.join(File.dirname(__FILE__),'..','..','conf','settings.yml')
+    end
+    
+    def load_user_settings
+      YAML.load(File.read(settings_path))
+    end
+  end
+end
\ No newline at end of file
index c08ad3e..759dc37 100644 (file)
@@ -28,8 +28,11 @@ describe 'Coquelicot' do
   end
 
   before do
+    # set a special test password
+    app.set :upload_password, Digest::SHA1.hexdigest(UPLOAD_PASSWORD)
+
     app.set :environment, :test
-    app.authentication_method :simplepass, :upload_password => Digest::SHA1.hexdigest(UPLOAD_PASSWORD)
+
     app.set :depot_path, Dir.mktmpdir('coquelicot')
   end