devise-radius-authenticatable 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,5 +2,6 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.2
4
4
  - 1.9.3
5
+ - 2.0.0
5
6
  bundler_args: --binstubs
6
7
  script: bundle exec rspec spec
data/README.md CHANGED
@@ -1,7 +1,9 @@
1
1
  Devise Radius Authenticatable
2
2
  =============================
3
3
 
4
+ [![Gem Version](https://badge.fury.io/rb/devise-radius-authenticatable.png)](http://badge.fury.io/rb/devise-radius-authenticatable)
4
5
  [![Build Status](https://travis-ci.org/cbascom/devise-radius-authenticatable.png)](https://travis-ci.org/cbascom/devise-radius-authenticatable)
6
+ [![Code Climate](https://codeclimate.com/github/cbascom/devise-radius-authenticatable.png)](https://codeclimate.com/github/cbascom/devise-radius-authenticatable)
5
7
 
6
8
  Devise Radius Authenticatable is a Radius authentication strategy for [Devise](http://github.com/plataformatec/devise).
7
9
 
@@ -10,7 +12,7 @@ Dependencies
10
12
 
11
13
  - Rails ~> 3.2
12
14
  - Devise ~> 2.0
13
- - radiustar ~> 0.0.6
15
+ - radiustar ~> 0.0.8
14
16
 
15
17
  Installation
16
18
  ------------
@@ -36,15 +38,17 @@ This will update the devise.rb initializer. The IP and SECRET parameters specify
36
38
 
37
39
  Options:
38
40
 
39
- [--uid-field=UID_FIELD] # What database column to use for the UID
40
- # Default: uid
41
- [--port=PORT] # The port to connect to the radius server on
42
- # Default: 1812
43
- [--timeout=TIMEOUT] # How long to wait for a response from the radius server
44
- # Default: 60
45
- [--retries=RETRIES] # How many times to retry a radius request
46
- # Default: 0
47
- [--dictionary-path=DICTIONARY_PATH] # The path to load radius dictionary files from
41
+ [--uid-field=UID_FIELD] # What database column to use for the UID
42
+ # Default: uid
43
+ [--port=PORT] # The port to connect to the radius server on
44
+ # Default: 1812
45
+ [--timeout=TIMEOUT] # How long to wait for a response from the radius server
46
+ # Default: 60
47
+ [--retries=RETRIES] # How many times to retry a radius request
48
+ # Default: 0
49
+ [--dictionary-path=DICTIONARY_PATH] # The path to load radius dictionary files from
50
+ [--handle-timeout-as-failure=HANDLE_TIMEOUT_AS_FAILURE] # Option to handle radius timeout as authentication failure
51
+ # Default: false
48
52
 
49
53
  Documentation
50
54
  -------------
@@ -70,7 +74,7 @@ The field that is used for logins is the first key that's configured in the Devi
70
74
  Configuration
71
75
  -------------
72
76
 
73
- The radius_authenticatable module is configured through the normal devise initializer `config/initializers/devise.rb`. The initial values are added to the file when you run the devise_radius_authenticatable:install generator as describe previously.
77
+ The radius_authenticatable module is configured through the normal devise initializer `config/initializers/devise.rb`. The initial values are added to the file when you run the devise_radius_authenticatable:install generator as described previously.
74
78
 
75
79
  References
76
80
  ----------
@@ -79,4 +83,4 @@ References
79
83
  * [Devise](http://github.com/plataformatec/devise)
80
84
  * [Warden](http://github.com/hassox/warden)
81
85
 
82
- Copyright (c) 2012 Calvin Bascom Released under the MIT license
86
+ Copyright (c) 2012-2013 Calvin Bascom Released under the MIT license
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.require_paths = ["lib"]
18
18
 
19
19
  s.add_dependency('devise', '~> 2.0')
20
- s.add_dependency('radiustar', '~> 0.0.6')
20
+ s.add_dependency('radiustar', '~> 0.0.8')
21
21
 
22
22
  s.add_development_dependency('rake', '~> 0.9')
23
23
  s.add_development_dependency('rails', '~> 3.2')
@@ -36,6 +36,7 @@ module Devise
36
36
  # * +radius_uid_generator+: A proc that takes the username and server as parameters
37
37
  # and returns a string representing the UID
38
38
  # * +radius_dictionary_path+: The path containing the radius dictionary files to load
39
+ # * +handle_radius_timeout_as_failure+: Option to handle radius timeout as authentication failure
39
40
  #
40
41
  # == Callbacks
41
42
  #
@@ -74,7 +75,15 @@ module Devise
74
75
  end
75
76
 
76
77
  req = Radiustar::Request.new("#{server}:#{port}", options)
77
- reply = req.authenticate(username, password, secret)
78
+
79
+ # The authenticate method will raise a RuntimeError if we time
80
+ # out waiting for a response from the server.
81
+ begin
82
+ reply = req.authenticate(username, password, secret)
83
+ rescue
84
+ return false if self.class.handle_radius_timeout_as_failure
85
+ raise
86
+ end
78
87
 
79
88
  if reply[:code] == 'Access-Accept'
80
89
  reply.extract!(:code)
@@ -98,7 +107,8 @@ module Devise
98
107
  Devise::Models.config(self, :radius_server, :radius_server_port,
99
108
  :radius_server_secret, :radius_server_timeout,
100
109
  :radius_server_retries, :radius_uid_field,
101
- :radius_uid_generator, :radius_dictionary_path)
110
+ :radius_uid_generator, :radius_dictionary_path,
111
+ :handle_radius_timeout_as_failure)
102
112
 
103
113
  # Invoked by the RadiusAuthenticatable stratgey to perform the authentication
104
114
  # against the radius server. The username is extracted from the authentication
@@ -29,6 +29,11 @@ module Devise
29
29
 
30
30
  # The path to load radius dictionary files from
31
31
  mattr_accessor :radius_dictionary_path
32
+
33
+ # Option to handle radius timeout as authentication failure
34
+ mattr_accessor :handle_radius_timeout_as_failure
35
+ @@handle_radius_timeout_as_failure = false
36
+
32
37
  end
33
38
 
34
39
  Devise.add_module(:radius_authenticatable, :route => :session, :strategy => true,
@@ -1,5 +1,5 @@
1
1
  module Devise
2
2
  module RadiusAuthenticatable
3
- VERSION = "0.0.4".freeze
3
+ VERSION = "0.0.5".freeze
4
4
  end
5
5
  end
@@ -24,6 +24,8 @@ module DeviseRadiusAuthenticatable
24
24
  :desc => 'How many times to retry a radius request')
25
25
  class_option(:dictionary_path, :default => nil,
26
26
  :desc => 'The path to load radius dictionary files from')
27
+ class_option(:handle_timeout_as_failure, :default => false,
28
+ :desc => 'Option to handle radius timeout as authentication failure')
27
29
 
28
30
  def install
29
31
  inject_into_file("config/initializers/devise.rb", default_devise_settings,
@@ -81,6 +83,10 @@ module DeviseRadiusAuthenticatable
81
83
  # be loaded.
82
84
  #
83
85
  # config.radius_dictionary_path = '#{options[:dictionary_path]}'
86
+
87
+ # Option to handle radius timeout as authentication failure
88
+ #
89
+ config.handle_radius_timeout_as_failure = #{options[:handle_timeout_as_failure]}
84
90
  CONFIG
85
91
  end
86
92
  end
@@ -8,7 +8,8 @@ class Configurable < Admin
8
8
  :radius_uid_generator => Proc.new { |username, server|
9
9
  "#{username}_#{server}"
10
10
  },
11
- :radius_dictionary_path => Rails.root.join('config/dictionaries'))
11
+ :radius_dictionary_path => Rails.root.join('config/dictionaries'),
12
+ :handle_radius_timeout_as_failure => true)
12
13
  end
13
14
 
14
15
  describe Devise::Models::RadiusAuthenticatable do
@@ -46,6 +47,10 @@ describe Devise::Models::RadiusAuthenticatable do
46
47
  Configurable.radius_dictionary_path.should == Rails.root.join('config/dictionaries')
47
48
  end
48
49
 
50
+ it "allows configuration of the radius exception handling" do
51
+ Configurable.handle_radius_timeout_as_failure.should == true
52
+ end
53
+
49
54
  it "extracts radius credentials based on the configured authentication keys" do
50
55
  swap(Devise, :authentication_keys => [:username, :domain]) do
51
56
  auth_hash = { :username => 'cbascom', :password => 'testing' }
@@ -142,5 +147,24 @@ describe Devise::Models::RadiusAuthenticatable do
142
147
  @admin.valid_radius_password?('testuser', 'password')
143
148
  @admin.radius_attributes.should == radius_server.attributes('testuser')
144
149
  end
150
+
151
+ context "when handle_radius_timeout_as_failure is false" do
152
+ it "does not catch the RuntimeError exception" do
153
+ Radiustar::Request.any_instance.stub(:authenticate).
154
+ and_raise(RuntimeError)
155
+ expect { @admin.valid_radius_password?('testuser', 'password') }.
156
+ to raise_error(RuntimeError)
157
+ end
158
+ end
159
+
160
+ context "when handle_radius_timeout_as_failure is true" do
161
+ it "returns false when the authentication times out" do
162
+ swap(Devise, :handle_radius_timeout_as_failure => true) do
163
+ Radiustar::Request.any_instance.stub(:authenticate).
164
+ and_raise(RuntimeError)
165
+ @admin.valid_radius_password?('testuser', 'password').should be_false
166
+ end
167
+ end
168
+ end
145
169
  end
146
170
  end
@@ -2,14 +2,22 @@ require 'spec_helper'
2
2
  require 'generators/devise_radius_authenticatable/install_generator'
3
3
 
4
4
  describe DeviseRadiusAuthenticatable::InstallGenerator do
5
+ destination File.expand_path("../../../tmp", __FILE__)
6
+
7
+ before do
8
+ prepare_devise
9
+ end
10
+
5
11
  it "requires the radius server IP to be specified" do
6
12
  expect { run_generator }.
7
- to raise_error(Thor::RequiredArgumentMissingError, /required arguments 'server'/)
13
+ to raise_error(Thor::RequiredArgumentMissingError,
14
+ /required arguments 'server'/)
8
15
  end
9
16
 
10
17
  it "requires the radius server shared secret to be specified" do
11
18
  expect { run_generator ['1.1.1.1'] }.
12
- to raise_error(Thor::RequiredArgumentMissingError, /required arguments 'secret'/)
19
+ to raise_error(Thor::RequiredArgumentMissingError,
20
+ /required arguments 'secret'/)
13
21
  end
14
22
 
15
23
  context "with required arguments" do
@@ -17,8 +25,11 @@ describe DeviseRadiusAuthenticatable::InstallGenerator do
17
25
  subject { file('config/initializers/devise.rb') }
18
26
 
19
27
  context "with default options" do
20
- before { run_generator ['1.1.1.1', 'secret'] }
28
+ before do
29
+ run_generator ['1.1.1.1', 'secret']
30
+ end
21
31
 
32
+ it { should exist }
22
33
  it { should contain('==> Configuration for radius_authenticatable') }
23
34
  it { should contain("config.radius_server = '1.1.1.1'") }
24
35
  it { should contain("config.radius_server_port = 1812") }
@@ -28,13 +39,18 @@ describe DeviseRadiusAuthenticatable::InstallGenerator do
28
39
  it { should contain("config.radius_uid_field = :uid") }
29
40
  it { should contain("config.radius_uid_generator =") }
30
41
  it { should contain("config.radius_dictionary_path =") }
42
+ it { should contain("config.handle_radius_timeout_as_failure = false") }
31
43
  end
32
44
 
33
45
  context "with custom options" do
34
- before { run_generator ['1.1.1.2', 'password', '--port=1813', '--timeout=120',
35
- '--retries=3', '--uid_field=email',
36
- '--dictionary_path=/tmp/dictionaries'] }
46
+ before do
47
+ run_generator ['1.1.1.2', 'password', '--port=1813',
48
+ '--timeout=120', '--retries=3', '--uid_field=email',
49
+ '--dictionary_path=/tmp/dictionaries',
50
+ '--handle_timeout_as_failure=true']
51
+ end
37
52
 
53
+ it { should exist }
38
54
  it { should contain('==> Configuration for radius_authenticatable') }
39
55
  it { should contain("config.radius_server = '1.1.1.2'") }
40
56
  it { should contain("config.radius_server_port = 1813") }
@@ -44,6 +60,7 @@ describe DeviseRadiusAuthenticatable::InstallGenerator do
44
60
  it { should contain("config.radius_uid_field = :email") }
45
61
  it { should contain("config.radius_uid_generator =") }
46
62
  it { should contain("config.radius_dictionary_path = '/tmp/dictionaries'") }
63
+ it { should contain("config.handle_radius_timeout_as_failure = true") }
47
64
  end
48
65
  end
49
66
  end
@@ -13,7 +13,4 @@ RSpec::configure do |c|
13
13
  c.include GeneratorHelpers, :type => :generator, :example_group => {
14
14
  :file_path => /spec[\\\/]generators/
15
15
  }
16
-
17
- c.before(:all, :type => :generator) { destination GeneratorHelpers::DESTINATION_PATH }
18
- c.before(:each, :type => :generator) { prepare_devise }
19
16
  end
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: devise-radius-authenticatable
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.4
5
+ version: 0.0.5
6
6
  platform: ruby
7
7
  authors:
8
8
  - Calvin Bascom
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-27 00:00:00.000000000 Z
12
+ date: 2013-09-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  type: :runtime
@@ -35,13 +35,13 @@ dependencies:
35
35
  requirements:
36
36
  - - ~>
37
37
  - !ruby/object:Gem::Version
38
- version: 0.0.6
38
+ version: 0.0.8
39
39
  none: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  requirements:
42
42
  - - ~>
43
43
  - !ruby/object:Gem::Version
44
- version: 0.0.6
44
+ version: 0.0.8
45
45
  none: false
46
46
  - !ruby/object:Gem::Dependency
47
47
  type: :development