rubius 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
data/lib/rubius.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'rubius/string'
2
2
 
3
+ require 'rubius/exceptions'
3
4
  require 'rubius/rails'
4
5
  require 'rubius/dictionary'
5
6
  require 'rubius/packet'
@@ -19,15 +19,17 @@ module Rubius
19
19
 
20
20
  @sock = nil
21
21
 
22
- @nas_ip = UDPSocket.open {|s| s.connect(@host, 1); s.addr.last }
23
-
24
- @identifier = Process.pid && 0xff
22
+ @identifier = Process.pid & 0xff
25
23
  end
26
24
 
27
- def init_from_config(config_file)
28
- env = defined?(Rails) ? ::Rails.env : 'development'
25
+ def init_from_config(config_file, env=nil)
26
+ if env.nil?
27
+ env = defined?(::Rails) ? ::Rails.env : 'development'
28
+ end
29
29
 
30
30
  config = YAML.load_file(config_file)
31
+ raise Rubius::MissingEnvironmentConfiguration unless config.has_key?(env)
32
+
31
33
  @host = config[env]["host"]
32
34
  @port = config[env]["port"] if config[env]["port"]
33
35
  @secret = config[env]["secret"]
@@ -38,8 +40,11 @@ module Rubius
38
40
  end
39
41
 
40
42
  @nas_ip = config[env]["nas_ip"] if config[env]["nas_ip"]
43
+ @nas_ip ||= UDPSocket.open {|s| s.connect(@host, 1); s.addr.last }
41
44
 
42
45
  setup_connection
46
+ rescue Errno::ENOENT
47
+ raise Rubius::MissingConfiguration
43
48
  end
44
49
 
45
50
  def authenticate(username, password)
@@ -14,6 +14,8 @@ module Rubius
14
14
  dict_lines = IO.readlines(dictionary_file)
15
15
 
16
16
  vendor_id = DEFAULT_VENDOR
17
+ skip_until_next_vendor = false
18
+
17
19
  dict_lines.each do |line|
18
20
  next if line =~ /^\#/
19
21
  next if (tokens = line.split(/\s+/)).empty?
@@ -21,15 +23,41 @@ module Rubius
21
23
  entry_type = tokens[0].upcase
22
24
  case entry_type
23
25
  when VENDOR
24
- vendor_id = tokens[2].to_i
26
+ skip_until_next_vendor = false
27
+
28
+ # If the vendor_id string is nil or empty, we should skip this entire block
29
+ # until we find another VENDOR definition, also ignore all VALUEs and ATTRIBUTEs
30
+ # until the next VENDOR because otherwise, they will be included in the wrong VENDOR
31
+ vendor_id_str = tokens[2]
32
+ if vendor_id_str.nil? || vendor_id_str.empty?
33
+ skip_until_next_vendor = true
34
+ next
35
+ end
36
+
37
+ # VENDOR id should be higher than 0, skip everything if it isn't
38
+ vendor_id = vendor_id_str.to_i
39
+ if vendor_id <= 0
40
+ skip_until_next_vendor = true
41
+ next
42
+ end
43
+
25
44
  vendor_name = tokens[1].strip
26
45
  @dictionary[vendor_id] ||= {:name => vendor_name}
27
46
  when ATTRIBUTE
47
+ next if skip_until_next_vendor
48
+ next if tokens[1].nil? || tokens[2].to_i <= 0 || tokens[3].nil?
28
49
  @dictionary[vendor_id][tokens[2].to_i] = {:name => tokens[1].strip, :type => tokens[3].strip}
29
50
  when VALUE
51
+ next if skip_until_next_vendor
30
52
  @dictionary[vendor_id][tokens[1]] = {tokens[2].strip => tokens[3].to_i}
31
53
  end
32
54
  end
55
+ rescue Errno::ENOENT
56
+ raise Rubius::InvalidDictionaryError
57
+ end
58
+
59
+ def vendors
60
+ @dictionary.collect{|k,v| v[:name]}.reject{|n| n.empty?}
33
61
  end
34
62
 
35
63
  def vendor_name(vendor_id = DEFAULT_VENDOR)
@@ -45,7 +73,9 @@ module Rubius
45
73
  end
46
74
 
47
75
  def attribute_id(attr_name, vendor_id = DEFAULT_VENDOR)
48
- @dictionary[vendor_id].reject{|k,v| !v.is_a?(Hash) || v[:name]!=attr_name}.flatten.first
76
+ vendor_object = @dictionary[vendor_id].reject{|k,v| !v.is_a?(Hash) || v[:name]!=attr_name}
77
+ vendor_object = vendor_object.to_a if RUBY_VERSION < "1.9.2"
78
+ vendor_object.flatten.first
49
79
  end
50
80
 
51
81
  private
@@ -0,0 +1,6 @@
1
+ module Rubius
2
+ class Error < RuntimeError; end
3
+ class InvalidDictionaryError < Error; end
4
+ class MissingConfiguration < Error; end
5
+ class MissingEnvironmentConfiguration < Error; end
6
+ end
data/lib/rubius/rails.rb CHANGED
@@ -3,16 +3,16 @@ module Rubius
3
3
  def self.init(root = nil, env = nil)
4
4
  base_dir = root
5
5
  if root.nil?
6
- root = defined?(Rails) ? ::Rails.root : FileUtils.pwd
6
+ root = defined?(::Rails) ? ::Rails.root : FileUtils.pwd
7
7
  base_dir = File.expand_path(File.join(root, 'config'))
8
8
  end
9
9
 
10
10
  if env.nil?
11
- env = defined?(Rails) ? ::Rails.env : 'development'
11
+ env = defined?(::Rails) ? ::Rails.env : 'development'
12
12
  end
13
13
 
14
14
  config_file = File.join(base_dir, 'rubius.yml')
15
- Rubius::Authenticator.instance.init_from_config(config_file)
15
+ Rubius::Authenticator.instance.init_from_config(config_file, env)
16
16
  end
17
17
  end
18
18
  end
data/rubius.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rubius}
8
- s.version = "0.0.2"
8
+ s.version = "0.0.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ralph Rooding"]
12
- s.date = %q{2011-04-20}
12
+ s.date = %q{2011-04-28}
13
13
  s.description = %q{Rubius provides a simple interface to RADIUS authentication}
14
14
  s.email = %q{ralph@izerion.com}
15
15
  s.extra_rdoc_files = [
@@ -30,12 +30,15 @@ Gem::Specification.new do |s|
30
30
  "lib/rubius.rb",
31
31
  "lib/rubius/authenticator.rb",
32
32
  "lib/rubius/dictionary.rb",
33
+ "lib/rubius/exceptions.rb",
33
34
  "lib/rubius/packet.rb",
34
35
  "lib/rubius/rails.rb",
35
36
  "lib/rubius/string.rb",
36
37
  "rubius.gemspec",
37
38
  "test/helper.rb",
39
+ "test/test_authenticator.rb",
38
40
  "test/test_dictionary.rb",
41
+ "test/test_rails.rb",
39
42
  "test/test_string.rb"
40
43
  ]
41
44
  s.homepage = %q{http://github.com/rahvin/rubius}
@@ -45,7 +48,9 @@ Gem::Specification.new do |s|
45
48
  s.summary = %q{A simple ruby RADIUS authentication gem}
46
49
  s.test_files = [
47
50
  "test/helper.rb",
51
+ "test/test_authenticator.rb",
48
52
  "test/test_dictionary.rb",
53
+ "test/test_rails.rb",
49
54
  "test/test_string.rb"
50
55
  ]
51
56
 
@@ -75,6 +80,12 @@ Gem::Specification.new do |s|
75
80
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
76
81
  s.add_development_dependency(%q<simplecov>, [">= 0.4.0"])
77
82
  s.add_development_dependency(%q<autotest-standalone>, ["~> 4.5.5"])
83
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
84
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
85
+ s.add_development_dependency(%q<mocha>, ["~> 0.9.12"])
86
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
87
+ s.add_development_dependency(%q<simplecov>, [">= 0.4.0"])
88
+ s.add_development_dependency(%q<autotest-standalone>, ["~> 4.5.5"])
78
89
  else
79
90
  s.add_dependency(%q<rubius>, [">= 0"])
80
91
  s.add_dependency(%q<shoulda>, [">= 0"])
@@ -98,6 +109,12 @@ Gem::Specification.new do |s|
98
109
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
99
110
  s.add_dependency(%q<simplecov>, [">= 0.4.0"])
100
111
  s.add_dependency(%q<autotest-standalone>, ["~> 4.5.5"])
112
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
113
+ s.add_dependency(%q<shoulda>, [">= 0"])
114
+ s.add_dependency(%q<mocha>, ["~> 0.9.12"])
115
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
116
+ s.add_dependency(%q<simplecov>, [">= 0.4.0"])
117
+ s.add_dependency(%q<autotest-standalone>, ["~> 4.5.5"])
101
118
  end
102
119
  else
103
120
  s.add_dependency(%q<rubius>, [">= 0"])
@@ -122,6 +139,12 @@ Gem::Specification.new do |s|
122
139
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
123
140
  s.add_dependency(%q<simplecov>, [">= 0.4.0"])
124
141
  s.add_dependency(%q<autotest-standalone>, ["~> 4.5.5"])
142
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
143
+ s.add_dependency(%q<shoulda>, [">= 0"])
144
+ s.add_dependency(%q<mocha>, ["~> 0.9.12"])
145
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
146
+ s.add_dependency(%q<simplecov>, [">= 0.4.0"])
147
+ s.add_dependency(%q<autotest-standalone>, ["~> 4.5.5"])
125
148
  end
126
149
  end
127
150
 
data/test/helper.rb CHANGED
@@ -54,3 +54,45 @@ RADIUS_DICTIONARY = [
54
54
  "",
55
55
  "ATTRIBUTE Juniper-Local-User-Name 1 string"
56
56
  ]
57
+
58
+ DICT_BROKEN_VENDOR = [
59
+ "# broken vendor line follows (missing id):",
60
+ "VENDOR Microsoft",
61
+ "",
62
+ "ATTRIBUTE Not-Included 8344 string",
63
+ "",
64
+ "# non-broken vendor:",
65
+ "VENDOR Apple 25",
66
+ "ATTRIBUTE Is-Cool 1337 integer",
67
+ "",
68
+ "VENDOR NoId id"
69
+ ]
70
+
71
+ DICT_BROKEN_ATTR = [
72
+ "# broken attribute line:",
73
+ "VENDOR IBM 123",
74
+ "",
75
+ "ATTRIBUTE IBM-Attr-Included 5137 string",
76
+ "ATTRIBUTE IBM-Attr-NotIncluded 5138",
77
+ "ATTRIBUTE IBM-Attr-NotIncluded2 asdf integer",
78
+ "ATTRIBUTE IBM-Attr-Included2 5139 string",
79
+ ""
80
+ ]
81
+
82
+ CONFIG_FILE = {
83
+ 'development' => {
84
+ 'host' => '127.0.0.1',
85
+ 'port' => 1812,
86
+ 'timeout' => 10,
87
+ 'secret' => 'development-secret',
88
+ 'dictionary' => 'radius-dictionary'
89
+ },
90
+ 'production' => {
91
+ 'host' => '10.1.0.254',
92
+ 'port' => 1812,
93
+ 'timeout' => 10,
94
+ 'secret' => 'production-secret',
95
+ 'dictionary' => 'radius-dictionary',
96
+ 'nas_ip' => '10.1.0.1'
97
+ }
98
+ }
@@ -0,0 +1,84 @@
1
+ require 'helper'
2
+
3
+ class TestAuthenticator < Test::Unit::TestCase
4
+ context "A Rubius::Authenticator instance" do
5
+ setup do
6
+ Process.stubs(:pid).returns(93354)
7
+
8
+ UDPSocket.any_instance
9
+ UDPSocket.any_instance.stubs(:addr).returns(["AF_INET", 65194, "10.1.0.45", "10.1.0.45"])
10
+
11
+ @authenticator = Rubius::Authenticator.instance
12
+ end
13
+
14
+ should "generate an identifier" do
15
+ assert_equal 170, @authenticator.instance_eval { @identifier }
16
+ end
17
+
18
+ should "increment the identifier" do
19
+ identifier = @authenticator.instance_eval { @identifier }
20
+ identifier += 1
21
+
22
+ assert @authenticator.instance_eval { increment_identifier! }
23
+
24
+ assert_equal identifier, @authenticator.instance_eval { @identifier }
25
+ end
26
+
27
+ should "overflow the identifier beyond 255" do
28
+ @authenticator.instance_eval { @identifier = 254 }
29
+ assert_equal 254, @authenticator.instance_eval { @identifier }
30
+
31
+ assert @authenticator.instance_eval { increment_identifier! }
32
+ assert_equal 255, @authenticator.instance_eval { @identifier }
33
+
34
+ assert @authenticator.instance_eval { increment_identifier! }
35
+ assert_equal 0, @authenticator.instance_eval { @identifier }
36
+
37
+ assert @authenticator.instance_eval { increment_identifier! }
38
+ assert_equal 1, @authenticator.instance_eval { @identifier }
39
+ end
40
+
41
+ context "supplied with a configuration file" do
42
+ should "read and parse the configuration file" do
43
+ YAML.stubs(:load_file).returns(CONFIG_FILE)
44
+
45
+ @authenticator.init_from_config("rubius.yml", 'development')
46
+ assert_equal 'development-secret', @authenticator.instance_eval { @secret }
47
+ end
48
+
49
+ should "use Rails.env if env is not passed and running in a Rails application" do
50
+ YAML.stubs(:load_file).returns(CONFIG_FILE)
51
+ ::Rails.stubs(:env).returns('production')
52
+
53
+ @authenticator.init_from_config("rubius.yml")
54
+ assert_equal 'production-secret', @authenticator.instance_eval { @secret }
55
+ end
56
+
57
+ should "handle a non-existent config file" do
58
+ YAML.stubs(:load_file).raises(Errno::ENOENT)
59
+ ::Rails.stubs(:env).returns('production')
60
+
61
+ assert_raises Rubius::MissingConfiguration do
62
+ @authenticator.init_from_config("/does/not/exist/rubius.yml")
63
+ end
64
+ end
65
+
66
+ should "handle an empty config section" do
67
+ YAML.stubs(:load_file).returns(CONFIG_FILE)
68
+ ::Rails.stubs(:env).returns('staging')
69
+
70
+ assert_raises Rubius::MissingEnvironmentConfiguration do
71
+ @authenticator.init_from_config("rubius.yml")
72
+ end
73
+ end
74
+
75
+ should "setup a connection to the specified server" do
76
+ YAML.stubs(:load_file).returns(CONFIG_FILE)
77
+ ::Rails.stubs(:env).returns('production')
78
+ UDPSocket.any_instance.stubs(:connect).with('10.1.0.254', 1812).returns(true)
79
+
80
+ assert @authenticator.init_from_config("rubius.yml")
81
+ end
82
+ end
83
+ end
84
+ end
@@ -1,22 +1,68 @@
1
1
  require 'helper'
2
2
 
3
3
  class TestDictionary < Test::Unit::TestCase
4
- def setup
5
- @dictionary = Rubius::Dictionary.new
6
- end
7
-
8
4
  context "A Rubius::Dictionary" do
9
- should "load and parse a RADIUS dictionary file" do
10
- IO.stubs(:readlines).returns(RADIUS_DICTIONARY)
5
+ setup do
6
+ @dictionary = Rubius::Dictionary.new
7
+ end
11
8
 
12
- assert @dictionary.load("file")
9
+ context "provided with a valid RADIUS dictionary file" do
10
+ setup do
11
+ IO.stubs(:readlines).returns(RADIUS_DICTIONARY)
12
+ end
13
+
14
+ should "load and parse it" do
15
+ assert @dictionary.load("filename")
16
+
17
+ assert_equal "Cisco", @dictionary.vendor_name(9)
18
+ assert_equal "Juniper", @dictionary.vendor_name(2636)
19
+
20
+ assert_equal "Service-Type", @dictionary.attribute_name(6)
21
+ assert_equal "string", @dictionary.attribute_type(2, 9)
22
+ assert_equal 1, @dictionary.attribute_id("Juniper-Local-User-Name", 2636)
23
+ end
24
+ end
13
25
 
14
- assert_equal "Cisco", @dictionary.vendor_name(9)
15
- assert_equal "Juniper", @dictionary.vendor_name(2636)
26
+ context "provided with a non-existant RADIUS dictionary file" do
27
+ setup do
28
+ IO.stubs(:readlines).raises(Errno::ENOENT)
29
+ end
30
+
31
+ should "raise an exception" do
32
+ assert_raise Rubius::InvalidDictionaryError do
33
+ @dictionary.load("/no/existing/file")
34
+ end
35
+ end
36
+ end
37
+
38
+ context "provided with a malformed RADIUS dictionary file" do
39
+ should "handle broken VENDOR lines" do
40
+ IO.stubs(:readlines).returns(RADIUS_DICTIONARY+DICT_BROKEN_VENDOR)
41
+
42
+ assert @dictionary.load("filename")
43
+
44
+ assert !@dictionary.vendors.include?("Microsoft")
45
+ assert_nil @dictionary.attribute_name(8344)
46
+
47
+ assert @dictionary.vendors.include?("Apple")
48
+ assert_equal "Is-Cool", @dictionary.attribute_name(1337, 25)
49
+
50
+ assert !@dictionary.vendors.include?("NoId")
51
+ end
52
+
53
+ should "handle broken ATTRIBUTE lines" do
54
+ IO.stubs(:readlines).returns(RADIUS_DICTIONARY+DICT_BROKEN_ATTR)
55
+
56
+ assert @dictionary.load("filename")
57
+
58
+ assert_equal 'IBM-Attr-Included', @dictionary.attribute_name(5137, 123)
59
+ assert_nil @dictionary.attribute_name(5138, 123)
60
+ assert_equal 'IBM-Attr-Included2', @dictionary.attribute_name(5139, 123)
61
+ end
16
62
 
17
- assert_equal "Service-Type", @dictionary.attribute_name(6)
18
- assert_equal "string", @dictionary.attribute_type(2, 9)
19
- assert_equal 1, @dictionary.attribute_id("Juniper-Local-User-Name", 2636)
63
+ should "handle broken VALUE lines" do
64
+
65
+ end
20
66
  end
21
67
  end
22
68
  end
@@ -0,0 +1,62 @@
1
+ require 'helper'
2
+
3
+ module Rails; end
4
+
5
+ class TestRails < Test::Unit::TestCase
6
+ context "a Rubius::Rails.init call" do
7
+ context "in a standalone application" do
8
+ setup do
9
+ Object.instance_eval{ remove_const("Rails") } if defined?(::Rails)
10
+ end
11
+
12
+ context "without any parameters" do
13
+ should "try to load the config file at current_dir/config/rubius.yml with the 'development' environment" do
14
+ Rubius::Authenticator.any_instance.stubs(:init_from_config).with(File.join(FileUtils.pwd, 'config', 'rubius.yml'), 'development').returns(true)
15
+ assert Rubius::Rails.init
16
+ end
17
+ end
18
+
19
+ context "with path specified" do
20
+ should "try to load the config at the specified path with the 'development' environment" do
21
+ config_file = File.join('path', 'to', 'config')
22
+
23
+ Rubius::Authenticator.any_instance.stubs(:init_from_config).with(File.join(config_file, 'rubius.yml'), 'development').returns(true)
24
+
25
+ assert Rubius::Rails.init(config_file)
26
+ end
27
+ end
28
+ end
29
+
30
+ context "in a Rails application" do
31
+ setup do
32
+ ::Rails.stubs(:env).returns('stubbed')
33
+ ::Rails.stubs(:root).returns('/home/rails')
34
+ end
35
+
36
+ should "use Rails path and environment" do
37
+ Rubius::Authenticator.any_instance.stubs(:init_from_config).with(File.join('/', 'home', 'rails', 'config', 'rubius.yml'), 'stubbed').returns(true)
38
+ assert Rubius::Rails.init
39
+ end
40
+ end
41
+
42
+ context "with a non-existant configuration file" do
43
+ should "raise an exception" do
44
+ Rubius::Authenticator.any_instance.stubs(:init_from_config).raises(Rubius::MissingConfiguration)
45
+
46
+ assert_raises Rubius::MissingConfiguration do
47
+ Rubius::Rails.init('/bla')
48
+ end
49
+ end
50
+ end
51
+
52
+ context "with a configuration file thats missing the current environment" do
53
+ should "raise an exception" do
54
+ Rubius::Authenticator.any_instance.stubs(:init_from_config).raises(Rubius::MissingEnvironmentConfiguration)
55
+
56
+ assert_raises Rubius::MissingEnvironmentConfiguration do
57
+ Rubius::Rails.init('/bla')
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rubius
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.0.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Ralph Rooding
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-20 00:00:00 +02:00
13
+ date: 2011-04-28 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -255,6 +255,72 @@ dependencies:
255
255
  type: :development
256
256
  prerelease: false
257
257
  version_requirements: *id022
258
+ - !ruby/object:Gem::Dependency
259
+ name: bundler
260
+ requirement: &id023 !ruby/object:Gem::Requirement
261
+ none: false
262
+ requirements:
263
+ - - ~>
264
+ - !ruby/object:Gem::Version
265
+ version: 1.0.0
266
+ type: :development
267
+ prerelease: false
268
+ version_requirements: *id023
269
+ - !ruby/object:Gem::Dependency
270
+ name: shoulda
271
+ requirement: &id024 !ruby/object:Gem::Requirement
272
+ none: false
273
+ requirements:
274
+ - - ">="
275
+ - !ruby/object:Gem::Version
276
+ version: "0"
277
+ type: :development
278
+ prerelease: false
279
+ version_requirements: *id024
280
+ - !ruby/object:Gem::Dependency
281
+ name: mocha
282
+ requirement: &id025 !ruby/object:Gem::Requirement
283
+ none: false
284
+ requirements:
285
+ - - ~>
286
+ - !ruby/object:Gem::Version
287
+ version: 0.9.12
288
+ type: :development
289
+ prerelease: false
290
+ version_requirements: *id025
291
+ - !ruby/object:Gem::Dependency
292
+ name: jeweler
293
+ requirement: &id026 !ruby/object:Gem::Requirement
294
+ none: false
295
+ requirements:
296
+ - - ~>
297
+ - !ruby/object:Gem::Version
298
+ version: 1.5.2
299
+ type: :development
300
+ prerelease: false
301
+ version_requirements: *id026
302
+ - !ruby/object:Gem::Dependency
303
+ name: simplecov
304
+ requirement: &id027 !ruby/object:Gem::Requirement
305
+ none: false
306
+ requirements:
307
+ - - ">="
308
+ - !ruby/object:Gem::Version
309
+ version: 0.4.0
310
+ type: :development
311
+ prerelease: false
312
+ version_requirements: *id027
313
+ - !ruby/object:Gem::Dependency
314
+ name: autotest-standalone
315
+ requirement: &id028 !ruby/object:Gem::Requirement
316
+ none: false
317
+ requirements:
318
+ - - ~>
319
+ - !ruby/object:Gem::Version
320
+ version: 4.5.5
321
+ type: :development
322
+ prerelease: false
323
+ version_requirements: *id028
258
324
  description: Rubius provides a simple interface to RADIUS authentication
259
325
  email: ralph@izerion.com
260
326
  executables: []
@@ -278,12 +344,15 @@ files:
278
344
  - lib/rubius.rb
279
345
  - lib/rubius/authenticator.rb
280
346
  - lib/rubius/dictionary.rb
347
+ - lib/rubius/exceptions.rb
281
348
  - lib/rubius/packet.rb
282
349
  - lib/rubius/rails.rb
283
350
  - lib/rubius/string.rb
284
351
  - rubius.gemspec
285
352
  - test/helper.rb
353
+ - test/test_authenticator.rb
286
354
  - test/test_dictionary.rb
355
+ - test/test_rails.rb
287
356
  - test/test_string.rb
288
357
  has_rdoc: true
289
358
  homepage: http://github.com/rahvin/rubius
@@ -299,7 +368,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
299
368
  requirements:
300
369
  - - ">="
301
370
  - !ruby/object:Gem::Version
302
- hash: -3471732790188196430
371
+ hash: -3168222850208807811
303
372
  segments:
304
373
  - 0
305
374
  version: "0"
@@ -318,5 +387,7 @@ specification_version: 3
318
387
  summary: A simple ruby RADIUS authentication gem
319
388
  test_files:
320
389
  - test/helper.rb
390
+ - test/test_authenticator.rb
321
391
  - test/test_dictionary.rb
392
+ - test/test_rails.rb
322
393
  - test/test_string.rb