rampart 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/lib/rampart/auth.rb +28 -0
- data/lib/rampart/events/fail_event.rb +24 -0
- data/lib/rampart/events/pass_event.rb +11 -0
- data/lib/rampart/events/redirect_event.rb +25 -0
- data/lib/rampart/events/success_event.rb +17 -0
- data/lib/rampart/proxy.rb +32 -0
- data/lib/rampart/request.rb +10 -0
- data/lib/rampart/response.rb +6 -0
- data/lib/rampart/session.rb +29 -0
- data/lib/rampart/strategy.rb +34 -0
- data/lib/rampart/strategy_manager.rb +38 -0
- data/lib/rampart/user_store.rb +12 -0
- data/lib/rampart/version.rb +3 -0
- data/lib/rampart.rb +4 -0
- data/rampart.gemspec +24 -0
- data/spec/rampart/events/fail_event_spec.rb +37 -0
- data/spec/rampart/events/pass_event_spec.rb +14 -0
- data/spec/rampart/events/redirect_event_spec.rb +43 -0
- data/spec/rampart/events/success_event_spec.rb +25 -0
- data/spec/rampart/proxy_spec.rb +61 -0
- data/spec/rampart/session_spec.rb +34 -0
- data/spec/rampart/strategy_manager_spec.rb +93 -0
- data/spec/spec_helper.rb +81 -0
- metadata +122 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f7f671c521eb37138ab8ae7d6e8bca7cdbfbae36
|
4
|
+
data.tar.gz: 745af300f91eedec10fa175c2e8ac4e4b73e2290
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 153d9ceb7ff8f6ff8365e0b70b716f4fa269b2481f4495ee1f3cdb0c17acc783d4f18753697a98780ec1adac864fe1c4021e82debab63e2a8fa64788d7db9884
|
7
|
+
data.tar.gz: 6817403ff5c859720a291b728b7260780be92534442acb1571897a89ce16605ef69d0f414fc8544c4168a9ef5e92611570c9925a043d624a8cc5f8b8e4e2f9eb
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Erik Lott
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Rampart
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'rampart'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install rampart
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it ( http://github.com/<my-github-username>/rampart/fork )
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/rampart/auth.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require "rampart/strategy_manager"
|
2
|
+
require "rampart/proxy"
|
3
|
+
require "rampart/user_store"
|
4
|
+
require "rampart/session"
|
5
|
+
|
6
|
+
module Rampart
|
7
|
+
class Auth
|
8
|
+
def initialize(app, strategies: {}, serializer: Proc.new{|u| u.id}, session_key: "rampart_session_id")
|
9
|
+
@app = app
|
10
|
+
@strategies = strategies
|
11
|
+
@serializer = serializer
|
12
|
+
@session_key = session_key
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
strategy_manager = StrategyManager.new(env)
|
17
|
+
@strategies.each { |k,v| strategy_manager.register(k,v) }
|
18
|
+
proxy = Proxy.new(strategy_manager, UserStore.new(Session.new(env), @serializer))
|
19
|
+
|
20
|
+
env["rampart.session.key"] = @session_key
|
21
|
+
env["rampart"] = proxy
|
22
|
+
|
23
|
+
catch(:rampart) do
|
24
|
+
app.call(env)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "rampart/response"
|
2
|
+
|
3
|
+
module Rampart
|
4
|
+
class FailEvent
|
5
|
+
def initialize(message="Not Authorized")
|
6
|
+
@message = message
|
7
|
+
end
|
8
|
+
|
9
|
+
def halt?
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
def success?
|
14
|
+
false
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_truple
|
18
|
+
response = Response.new
|
19
|
+
response.write(@message)
|
20
|
+
response.status = 401
|
21
|
+
response.finish
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "rampart/response"
|
2
|
+
|
3
|
+
module Rampart
|
4
|
+
class RedirectEvent
|
5
|
+
def initialize(url, status=302)
|
6
|
+
@url = url
|
7
|
+
@status = status
|
8
|
+
end
|
9
|
+
|
10
|
+
def halt?
|
11
|
+
true
|
12
|
+
end
|
13
|
+
|
14
|
+
def success?
|
15
|
+
false
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_truple
|
19
|
+
response = Response.new
|
20
|
+
response.write("Redirecting to: #{@url}")
|
21
|
+
response.redirect(@url, @status)
|
22
|
+
response.finish
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Rampart
|
2
|
+
class Proxy
|
3
|
+
def initialize(strategy_manager, user_store)
|
4
|
+
@strategy_manager = strategy_manager
|
5
|
+
@user_store = user_store
|
6
|
+
end
|
7
|
+
|
8
|
+
def authenticate!(names)
|
9
|
+
event = @strategy_manager.authenticate!(names)
|
10
|
+
if event.success?
|
11
|
+
set_user(event.user)
|
12
|
+
event.user
|
13
|
+
else
|
14
|
+
throw(:rampart, event.to_truple)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def authenticate(names)
|
19
|
+
event = @strategy_manager.authenticate!(names)
|
20
|
+
if event.success?
|
21
|
+
set_user(event.user)
|
22
|
+
event.user
|
23
|
+
else
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def set_user(user)
|
29
|
+
@user_store.store(user)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Rampart
|
2
|
+
class Session
|
3
|
+
def initialize(env)
|
4
|
+
@env = env
|
5
|
+
end
|
6
|
+
|
7
|
+
def store(user_id)
|
8
|
+
session[session_key] = user_id
|
9
|
+
end
|
10
|
+
|
11
|
+
def fetch
|
12
|
+
session[session_key]
|
13
|
+
end
|
14
|
+
|
15
|
+
def delete
|
16
|
+
session[session_key] = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def session
|
22
|
+
@env["rack.session"]
|
23
|
+
end
|
24
|
+
|
25
|
+
def session_key
|
26
|
+
@env["rampart.session.key"]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "rampart/events/success_event"
|
2
|
+
require "rampart/events/fail_event"
|
3
|
+
require "rampart/events/redirect_event"
|
4
|
+
require "rampart/events/pass_event"
|
5
|
+
|
6
|
+
module Rampart
|
7
|
+
module Strategy
|
8
|
+
def authenticate!(req)
|
9
|
+
fail!
|
10
|
+
end
|
11
|
+
|
12
|
+
def valid?(req)
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def success!(*args)
|
19
|
+
SuccessEvent.new(*args)
|
20
|
+
end
|
21
|
+
|
22
|
+
def fail!(*args)
|
23
|
+
FailEvent.new(*args)
|
24
|
+
end
|
25
|
+
|
26
|
+
def redirect!(*args)
|
27
|
+
RedirectEvent.new(*args)
|
28
|
+
end
|
29
|
+
|
30
|
+
def pass(*args)
|
31
|
+
PassEvent.new(*args)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "rampart/request"
|
2
|
+
require "rampart/events/fail_event"
|
3
|
+
|
4
|
+
module Rampart
|
5
|
+
class StrategyManager
|
6
|
+
def initialize(env)
|
7
|
+
@env = env
|
8
|
+
@strategies = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def register(name, strategy)
|
12
|
+
raise(ArgumentError, "strategy name already registered: '#{name}'") if @strategies.key?(name)
|
13
|
+
@strategies[name] = strategy
|
14
|
+
end
|
15
|
+
|
16
|
+
def authenticate!(*names)
|
17
|
+
winning_event = FailEvent.new
|
18
|
+
request = Request.new(@env)
|
19
|
+
names.each do |name|
|
20
|
+
strategy = fetch(name)
|
21
|
+
next unless strategy.valid?(request)
|
22
|
+
event = strategy.authenticate!(request)
|
23
|
+
if event.halt?
|
24
|
+
winning_event = event
|
25
|
+
break
|
26
|
+
end
|
27
|
+
end
|
28
|
+
winning_event
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def fetch(name)
|
34
|
+
raise(ArgumentError, "Strategy not registered: '#{name}'") unless @strategies.key?(name)
|
35
|
+
@strategies[name]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/rampart.rb
ADDED
data/rampart.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rampart/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "rampart"
|
8
|
+
spec.version = Rampart::VERSION
|
9
|
+
spec.authors = ["Erik Lott"]
|
10
|
+
spec.email = ["erik.lott@kodio.io"]
|
11
|
+
spec.summary = %q{Rack authentication middleware}
|
12
|
+
spec.homepage = ""
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_dependency "rack", "~> 1.5.2"
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
23
|
+
spec.add_development_dependency "rake"
|
24
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "rampart/events/fail_event"
|
3
|
+
|
4
|
+
describe Rampart::FailEvent do
|
5
|
+
describe "::new" do
|
6
|
+
it "has default message" do
|
7
|
+
event = Rampart::FailEvent.new()
|
8
|
+
status, headers, body = event.to_truple
|
9
|
+
body.body.must_equal(["Not Authorized"])
|
10
|
+
end
|
11
|
+
|
12
|
+
it "receives message param" do
|
13
|
+
event = Rampart::FailEvent.new("Hello World")
|
14
|
+
status, headers, body = event.to_truple
|
15
|
+
body.body.must_equal(["Hello World"])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "halts" do
|
20
|
+
event = Rampart::FailEvent.new
|
21
|
+
event.halt?.must_equal(true)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "isn't successful" do
|
25
|
+
event = Rampart::FailEvent.new
|
26
|
+
event.success?.must_equal(false)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "can return rack truple" do
|
30
|
+
event = Rampart::FailEvent.new
|
31
|
+
status, headers, body = event.to_truple
|
32
|
+
|
33
|
+
status.must_equal(401)
|
34
|
+
headers.must_equal({"Content-Length"=>"14"})
|
35
|
+
body.body.must_equal(["Not Authorized"])
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "rampart/events/pass_event"
|
3
|
+
|
4
|
+
describe Rampart::PassEvent do
|
5
|
+
it "doesn't halt" do
|
6
|
+
event = Rampart::PassEvent.new
|
7
|
+
event.halt?.must_equal(false)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "isn't successful" do
|
11
|
+
event = Rampart::PassEvent.new
|
12
|
+
event.success?.must_equal(false)
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "rampart/events/redirect_event"
|
3
|
+
|
4
|
+
describe Rampart::RedirectEvent do
|
5
|
+
describe "::new" do
|
6
|
+
it "receives url parameter" do
|
7
|
+
event = Rampart::RedirectEvent.new("http://www.kodio.io")
|
8
|
+
status, headers, body = event.to_truple
|
9
|
+
headers["Location"].must_equal("http://www.kodio.io")
|
10
|
+
end
|
11
|
+
|
12
|
+
it "receives optional status parameter" do
|
13
|
+
event = Rampart::RedirectEvent.new("http://www.kodio.io", 302)
|
14
|
+
status, headers, body = event.to_truple
|
15
|
+
status.must_equal(302)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "defaults status to 302" do
|
19
|
+
event = Rampart::RedirectEvent.new("http://www.kodio.io")
|
20
|
+
status, headers, body = event.to_truple
|
21
|
+
status.must_equal(302)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it "halts" do
|
26
|
+
event = Rampart::RedirectEvent.new("http://www.kodio.io")
|
27
|
+
event.halt?.must_equal(true)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "isn't successful" do
|
31
|
+
event = Rampart::RedirectEvent.new("http://www.kodio.io")
|
32
|
+
event.success?.must_equal(false)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "can return rack truple" do
|
36
|
+
event = Rampart::RedirectEvent.new("http://www.kodio.io", 301)
|
37
|
+
status, headers, body = event.to_truple
|
38
|
+
|
39
|
+
status.must_equal(301)
|
40
|
+
headers.must_equal({"Content-Length"=>"35", "Location"=>"http://www.kodio.io"})
|
41
|
+
body.body.must_equal(["Redirecting to: http://www.kodio.io"])
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "rampart/events/success_event"
|
3
|
+
|
4
|
+
describe Rampart::SuccessEvent do
|
5
|
+
it "receives user" do
|
6
|
+
user = Object.new
|
7
|
+
event = Rampart::SuccessEvent.new(user)
|
8
|
+
event.user.must_equal(user)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "halts" do
|
12
|
+
event = define_success_event
|
13
|
+
event.halt?.must_equal(true)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "is successful" do
|
17
|
+
event = define_success_event
|
18
|
+
event.success?.must_equal(true)
|
19
|
+
end
|
20
|
+
|
21
|
+
def define_success_event(user=nil)
|
22
|
+
user ||= Object.new
|
23
|
+
Rampart::SuccessEvent.new(user)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "rampart/proxy"
|
3
|
+
|
4
|
+
describe Rampart::Proxy do
|
5
|
+
describe "#authenticate!" do
|
6
|
+
it "returns user when successful" do
|
7
|
+
user = Object.new
|
8
|
+
|
9
|
+
strategy_manager = define_strategy_manager
|
10
|
+
strategy_manager.register(:basic, define_succeeding_strategy(user))
|
11
|
+
|
12
|
+
user_store = MiniTest::Mock.new
|
13
|
+
user_store.expect(:store, true, [Object])
|
14
|
+
|
15
|
+
proxy = Rampart::Proxy.new(strategy_manager, user_store)
|
16
|
+
proxy.authenticate!(:basic).must_equal(user)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "throws rack truple when not successful" do
|
20
|
+
user = Object.new
|
21
|
+
|
22
|
+
strategy_manager = define_strategy_manager
|
23
|
+
strategy_manager.register(:basic, define_failing_strategy)
|
24
|
+
|
25
|
+
user_store = MiniTest::Mock.new
|
26
|
+
user_store.expect(:store, true, [Object])
|
27
|
+
|
28
|
+
proxy = Rampart::Proxy.new(strategy_manager, user_store)
|
29
|
+
response = catch(:rampart){ proxy.authenticate!(:basic) }
|
30
|
+
response.must_be_instance_of(Array)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#authenticate" do
|
35
|
+
it "returns user when successful" do
|
36
|
+
user = Object.new
|
37
|
+
|
38
|
+
strategy_manager = define_strategy_manager
|
39
|
+
strategy_manager.register(:basic, define_succeeding_strategy(user))
|
40
|
+
|
41
|
+
user_store = MiniTest::Mock.new
|
42
|
+
user_store.expect(:store, true, [Object])
|
43
|
+
|
44
|
+
proxy = Rampart::Proxy.new(strategy_manager, user_store)
|
45
|
+
proxy.authenticate(:basic).must_equal(user)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "returns nil when not successful" do
|
49
|
+
user = Object.new
|
50
|
+
|
51
|
+
strategy_manager = define_strategy_manager
|
52
|
+
strategy_manager.register(:basic, define_failing_strategy)
|
53
|
+
|
54
|
+
user_store = MiniTest::Mock.new
|
55
|
+
user_store.expect(:store, true, [Object])
|
56
|
+
|
57
|
+
proxy = Rampart::Proxy.new(strategy_manager, user_store)
|
58
|
+
proxy.authenticate(:basic).must_be_nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "rampart/session"
|
3
|
+
|
4
|
+
describe Rampart::Session do
|
5
|
+
it "can store session" do
|
6
|
+
env = {
|
7
|
+
"rampart.session.key" => :user_id,
|
8
|
+
"rack.session" => {}
|
9
|
+
}
|
10
|
+
session = Rampart::Session.new(env)
|
11
|
+
user_id = 123
|
12
|
+
session.store(user_id)
|
13
|
+
env["rack.session"].must_equal(:user_id => 123)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "can fetch session" do
|
17
|
+
env = {
|
18
|
+
"rampart.session.key" => :user_id,
|
19
|
+
"rack.session" => {:user_id => 123}
|
20
|
+
}
|
21
|
+
session = Rampart::Session.new(env)
|
22
|
+
session.fetch.must_equal(123)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "can delete session" do
|
26
|
+
env = {
|
27
|
+
"rampart.session.key" => :user_id,
|
28
|
+
"rack.session" => {:user_id => 123}
|
29
|
+
}
|
30
|
+
session = Rampart::Session.new(env)
|
31
|
+
session.delete
|
32
|
+
session.fetch.must_be_nil
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "rampart/strategy_manager"
|
3
|
+
|
4
|
+
describe Rampart::StrategyManager do
|
5
|
+
describe "register" do
|
6
|
+
it "can register a strategy" do
|
7
|
+
strategy = Object.new
|
8
|
+
manager = define_strategy_manager
|
9
|
+
manager.register(:basic, strategy)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "complains if strategy name registered more than once" do
|
13
|
+
strategy = Object.new
|
14
|
+
manager = define_strategy_manager
|
15
|
+
manager.register(:basic, strategy)
|
16
|
+
proc {
|
17
|
+
manager.register(:basic, strategy)
|
18
|
+
}.must_raise(ArgumentError)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "authenticate!" do
|
23
|
+
|
24
|
+
it "complains when strategy name has not been registered" do
|
25
|
+
manager = define_strategy_manager
|
26
|
+
proc {
|
27
|
+
manager.authenticate!(:my_strategy_name)
|
28
|
+
}.must_raise(ArgumentError)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "returns fail event when no strategy names given" do
|
32
|
+
manager = define_strategy_manager
|
33
|
+
manager.authenticate!.must_be_instance_of(Rampart::FailEvent)
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "single strategy" do
|
37
|
+
|
38
|
+
it "returns fail event when strategy passes" do
|
39
|
+
strategy = define_passing_strategy
|
40
|
+
manager = define_strategy_manager
|
41
|
+
manager.register(:strategy1, strategy)
|
42
|
+
manager.authenticate!(:strategy1).must_be_instance_of(Rampart::FailEvent)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "returns fail event when strategy fails" do
|
46
|
+
strategy = define_failing_strategy
|
47
|
+
manager = define_strategy_manager
|
48
|
+
manager.register(:strategy1, strategy)
|
49
|
+
manager.authenticate!(:strategy1).must_be_instance_of(Rampart::FailEvent)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "returns redirect event when strategy redirects" do
|
53
|
+
strategy = define_redirecting_strategy
|
54
|
+
manager = define_strategy_manager
|
55
|
+
manager.register(:strategy1, strategy)
|
56
|
+
manager.authenticate!(:strategy1).must_be_instance_of(Rampart::RedirectEvent)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "returns success event when strategy succeeds" do
|
60
|
+
strategy = define_succeeding_strategy
|
61
|
+
manager = define_strategy_manager
|
62
|
+
manager.register(:strategy1, strategy)
|
63
|
+
manager.authenticate!(:strategy1).must_be_instance_of(Rampart::SuccessEvent)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "returns fail event when strategy not valid" do
|
67
|
+
strategy = define_invalid_strategy
|
68
|
+
manager = define_strategy_manager
|
69
|
+
manager.register(:strategy1, strategy)
|
70
|
+
manager.authenticate!(:strategy1).must_be_instance_of(Rampart::FailEvent)
|
71
|
+
end
|
72
|
+
|
73
|
+
end # single strategy
|
74
|
+
|
75
|
+
describe "multple strategies" do
|
76
|
+
it "returns first halting strategy" do
|
77
|
+
manager = define_strategy_manager
|
78
|
+
manager.register(:strategy1, define_passing_strategy)
|
79
|
+
manager.register(:strategy2, define_invalid_strategy)
|
80
|
+
manager.register(:strategy3, define_redirecting_strategy)
|
81
|
+
manager.register(:strategy4, define_succeeding_strategy)
|
82
|
+
manager.authenticate!(:strategy1, :strategy2, :strategy3, :strategy4).must_be_instance_of(Rampart::RedirectEvent)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "returns fail when no valid halting strategies found" do
|
86
|
+
manager = define_strategy_manager
|
87
|
+
manager.register(:strategy1, define_passing_strategy)
|
88
|
+
manager.register(:strategy2, define_invalid_strategy)
|
89
|
+
manager.authenticate!(:strategy1, :strategy2).must_be_instance_of(Rampart::FailEvent)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require "rampart/strategy"
|
3
|
+
require "rampart/strategy_manager"
|
4
|
+
|
5
|
+
def define_strategy_manager(env={})
|
6
|
+
Rampart::StrategyManager.new(env)
|
7
|
+
end
|
8
|
+
|
9
|
+
def define_passing_strategy
|
10
|
+
klass = Class.new do
|
11
|
+
include Rampart::Strategy
|
12
|
+
def valid?(req)
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
def authenticate!(req)
|
17
|
+
pass
|
18
|
+
end
|
19
|
+
end
|
20
|
+
klass.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def define_failing_strategy
|
24
|
+
klass = Class.new do
|
25
|
+
include Rampart::Strategy
|
26
|
+
def valid?(req)
|
27
|
+
true
|
28
|
+
end
|
29
|
+
|
30
|
+
def authenticate!(req)
|
31
|
+
fail!
|
32
|
+
end
|
33
|
+
end
|
34
|
+
klass.new
|
35
|
+
end
|
36
|
+
|
37
|
+
def define_redirecting_strategy
|
38
|
+
klass = Class.new do
|
39
|
+
include Rampart::Strategy
|
40
|
+
def valid?(req)
|
41
|
+
true
|
42
|
+
end
|
43
|
+
|
44
|
+
def authenticate!(req)
|
45
|
+
redirect!("http://www.kodio.io")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
klass.new
|
49
|
+
end
|
50
|
+
|
51
|
+
def define_succeeding_strategy(user=Object.new)
|
52
|
+
klass = Class.new do
|
53
|
+
include Rampart::Strategy
|
54
|
+
|
55
|
+
def initialize(user)
|
56
|
+
@user = user
|
57
|
+
end
|
58
|
+
|
59
|
+
def valid?(req)
|
60
|
+
true
|
61
|
+
end
|
62
|
+
|
63
|
+
def authenticate!(req)
|
64
|
+
success!(@user)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
klass.new(user)
|
68
|
+
end
|
69
|
+
|
70
|
+
def define_invalid_strategy
|
71
|
+
klass = Class.new do
|
72
|
+
include Rampart::Strategy
|
73
|
+
def valid?(req)
|
74
|
+
false
|
75
|
+
end
|
76
|
+
|
77
|
+
def authenticate!(req)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
klass.new
|
81
|
+
end
|
metadata
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rampart
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Erik Lott
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-12-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.5.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.5.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.5'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description:
|
56
|
+
email:
|
57
|
+
- erik.lott@kodio.io
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- Gemfile
|
64
|
+
- LICENSE.txt
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- lib/rampart.rb
|
68
|
+
- lib/rampart/auth.rb
|
69
|
+
- lib/rampart/events/fail_event.rb
|
70
|
+
- lib/rampart/events/pass_event.rb
|
71
|
+
- lib/rampart/events/redirect_event.rb
|
72
|
+
- lib/rampart/events/success_event.rb
|
73
|
+
- lib/rampart/proxy.rb
|
74
|
+
- lib/rampart/request.rb
|
75
|
+
- lib/rampart/response.rb
|
76
|
+
- lib/rampart/session.rb
|
77
|
+
- lib/rampart/strategy.rb
|
78
|
+
- lib/rampart/strategy_manager.rb
|
79
|
+
- lib/rampart/user_store.rb
|
80
|
+
- lib/rampart/version.rb
|
81
|
+
- rampart.gemspec
|
82
|
+
- spec/rampart/events/fail_event_spec.rb
|
83
|
+
- spec/rampart/events/pass_event_spec.rb
|
84
|
+
- spec/rampart/events/redirect_event_spec.rb
|
85
|
+
- spec/rampart/events/success_event_spec.rb
|
86
|
+
- spec/rampart/proxy_spec.rb
|
87
|
+
- spec/rampart/session_spec.rb
|
88
|
+
- spec/rampart/strategy_manager_spec.rb
|
89
|
+
- spec/spec_helper.rb
|
90
|
+
homepage: ''
|
91
|
+
licenses:
|
92
|
+
- MIT
|
93
|
+
metadata: {}
|
94
|
+
post_install_message:
|
95
|
+
rdoc_options: []
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
requirements: []
|
109
|
+
rubyforge_project:
|
110
|
+
rubygems_version: 2.2.2
|
111
|
+
signing_key:
|
112
|
+
specification_version: 4
|
113
|
+
summary: Rack authentication middleware
|
114
|
+
test_files:
|
115
|
+
- spec/rampart/events/fail_event_spec.rb
|
116
|
+
- spec/rampart/events/pass_event_spec.rb
|
117
|
+
- spec/rampart/events/redirect_event_spec.rb
|
118
|
+
- spec/rampart/events/success_event_spec.rb
|
119
|
+
- spec/rampart/proxy_spec.rb
|
120
|
+
- spec/rampart/session_spec.rb
|
121
|
+
- spec/rampart/strategy_manager_spec.rb
|
122
|
+
- spec/spec_helper.rb
|