kraut 0.5.6

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.
Files changed (50) hide show
  1. data/.gitignore +11 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +3 -0
  4. data/README.md +175 -0
  5. data/Rakefile +10 -0
  6. data/app/controllers/kraut/sessions_controller.rb +30 -0
  7. data/app/models/kraut/session.rb +67 -0
  8. data/app/views/kraut/sessions/new.html.haml +15 -0
  9. data/autotest/discover.rb +1 -0
  10. data/config/initializers/savon.rb +12 -0
  11. data/config/locales/kraut.yml +14 -0
  12. data/config/routes.rb +5 -0
  13. data/kraut.gemspec +43 -0
  14. data/lib/kraut.rb +3 -0
  15. data/lib/kraut/application.rb +31 -0
  16. data/lib/kraut/client.rb +63 -0
  17. data/lib/kraut/kraut.rb +21 -0
  18. data/lib/kraut/mapper.rb +20 -0
  19. data/lib/kraut/principal.rb +85 -0
  20. data/lib/kraut/rails/authentication.rb +80 -0
  21. data/lib/kraut/rails/engine.rb +29 -0
  22. data/lib/kraut/rails/spec/login_helper.rb +28 -0
  23. data/lib/kraut/rails/spec/protected_action.rb +68 -0
  24. data/lib/kraut/rails/spec/user_helper.rb +27 -0
  25. data/lib/kraut/rails/spec_helper.rb +15 -0
  26. data/lib/kraut/version.rb +6 -0
  27. data/spec/controllers/application_controller_spec.rb +219 -0
  28. data/spec/controllers/sessions_controller_spec.rb +106 -0
  29. data/spec/fixtures/authenticate_application/invalid_app.xml +11 -0
  30. data/spec/fixtures/authenticate_application/invalid_password.xml +11 -0
  31. data/spec/fixtures/authenticate_application/success.xml +10 -0
  32. data/spec/fixtures/authenticate_principal/application_access_denied.xml +11 -0
  33. data/spec/fixtures/authenticate_principal/invalid_password.xml +11 -0
  34. data/spec/fixtures/authenticate_principal/invalid_user.xml +11 -0
  35. data/spec/fixtures/authenticate_principal/success.xml +7 -0
  36. data/spec/fixtures/find_principal_by_token/invalid_token.xml +11 -0
  37. data/spec/fixtures/find_principal_by_token/success.xml +39 -0
  38. data/spec/fixtures/find_principal_with_attributes_by_name/invalid_user.xml +11 -0
  39. data/spec/fixtures/find_principal_with_attributes_by_name/success.xml +69 -0
  40. data/spec/fixtures/is_group_member/not_in_group.xml +8 -0
  41. data/spec/fixtures/is_group_member/success.xml +8 -0
  42. data/spec/kraut/application_spec.rb +99 -0
  43. data/spec/kraut/client_spec.rb +101 -0
  44. data/spec/kraut/mapper_spec.rb +48 -0
  45. data/spec/kraut/principal_spec.rb +142 -0
  46. data/spec/models/session_spec.rb +148 -0
  47. data/spec/rails/engine_spec.rb +24 -0
  48. data/spec/spec_helper.rb +33 -0
  49. data/spec/views/sessions/new.html.haml_spec.rb +11 -0
  50. metadata +237 -0
@@ -0,0 +1,48 @@
1
+ require "spec_helper"
2
+ require "kraut/mapper"
3
+
4
+ describe Kraut::Mapper do
5
+
6
+ subject do
7
+ Class.new do
8
+ include Kraut::Mapper
9
+ attr_accessor :name, :email
10
+ end
11
+ end
12
+
13
+ describe "#initialize" do
14
+
15
+ it "should call mass_assign! when with the given opts" do
16
+ subject.any_instance.expects(:mass_assign!).with(opts = {})
17
+ principal = subject.new(opts)
18
+ end
19
+
20
+ it "should call mass_assign! when with nil when given nothing" do
21
+ subject.any_instance.expects(:mass_assign!).with(nil)
22
+ principal = subject.new
23
+ end
24
+
25
+ end
26
+
27
+ describe "#mass_assign!" do
28
+
29
+ let(:principal) { subject.new }
30
+
31
+ it "should assign the given attributes" do
32
+ principal.mass_assign! :name => "Chuck Norris", :email => "chuck.norris@gmail.com"
33
+
34
+ principal.name.should == "Chuck Norris"
35
+ principal.email.should == "chuck.norris@gmail.com"
36
+ end
37
+
38
+ it "should not fail when given nil" do
39
+ principal.mass_assign! nil
40
+ end
41
+
42
+ it "should fail when given a non-existant attribute" do
43
+ lambda { principal.mass_assign! :failing => 'non-existant' }.should raise_error(NoMethodError)
44
+ end
45
+
46
+ end
47
+
48
+ end
@@ -0,0 +1,142 @@
1
+ require "spec_helper"
2
+ require "kraut/principal"
3
+
4
+ describe Kraut::Principal do
5
+
6
+ before(:all) do
7
+ savon.expects(:authenticate_application).returns(:success)
8
+ Kraut::Application.authenticate "app", "password"
9
+ end
10
+
11
+ describe "attributes" do
12
+ let(:principal) { Kraut::Principal.authenticate "test", "password" }
13
+
14
+ before do
15
+ savon.expects(:authenticate_principal).returns(:success)
16
+ savon.stubs(:find_principal_with_attributes_by_name).returns(:success)
17
+ end
18
+
19
+ it "should have a name" do
20
+ principal.name.should == "test"
21
+ principal.name.class.should == String
22
+ end
23
+
24
+ it "should have a password" do
25
+ principal.password.should == "password"
26
+ principal.password.class.should == String
27
+ end
28
+
29
+ it "should have a token" do
30
+ principal.token.should == "COvlhb092poBHXi4rh4PQg00"
31
+ principal.token.class.should == String
32
+ end
33
+
34
+ it "should have a display_name" do
35
+ principal.display_name.should == "Test User"
36
+ principal.display_name.class.should == String
37
+ end
38
+
39
+ it "should have an email" do
40
+ principal.email.should == "test@blau.de"
41
+ principal.email.class.should == String
42
+ end
43
+
44
+ it "should return whether the principal's password is expired" do
45
+ principal.requires_password_change?.should == false
46
+ end
47
+ end
48
+
49
+ describe "#member_of?" do
50
+ let(:principal) { Kraut::Principal.authenticate "test", "password" }
51
+
52
+ before do
53
+ savon.expects(:authenticate_principal).returns(:success)
54
+ savon.stubs(:find_principal_with_attributes_by_name).returns(:success)
55
+ end
56
+
57
+ it "should return true if member of group" do
58
+ savon.expects(:is_group_member).returns(:success)
59
+ principal.should be_member_of("a_group")
60
+ end
61
+
62
+ it "should return false if not member of group" do
63
+ savon.expects(:is_group_member).returns(:not_in_group)
64
+ principal.should_not be_member_of("another_group")
65
+ end
66
+
67
+ it "should not ask crowd if positive group membership is already saved" do
68
+ principal.groups["a_group"] = true
69
+ principal.member_of?("a_group").should == true
70
+ end
71
+
72
+ it "should not ask crowd if negative group membership is already saved" do
73
+ principal.groups["another_group"] = false
74
+ principal.member_of?("another_group").should == false
75
+ end
76
+ end
77
+
78
+ describe ".authenticate" do
79
+ context "when successful" do
80
+ before { savon.expects(:authenticate_principal).returns(:success) }
81
+
82
+ it "should return a principal" do
83
+ principal = Kraut::Principal.authenticate "test", "password"
84
+ principal.should be_a(Kraut::Principal)
85
+ end
86
+ end
87
+
88
+ context "with an invalid password" do
89
+ before { savon.expects(:authenticate_principal).returns(:invalid_password) }
90
+
91
+ it "should raise an InvalidAuthentication" do
92
+ lambda { Kraut::Principal.authenticate "test", "invalid_password" }.
93
+ should raise_error(Kraut::InvalidAuthentication, /password was invalid/)
94
+ end
95
+ end
96
+
97
+ context "with an invalid username" do
98
+ before { savon.expects(:authenticate_principal).returns(:invalid_user) }
99
+
100
+ it "should raise an InvalidAuthentication" do
101
+ lambda { Kraut::Principal.authenticate "invalid_user", "password" }.
102
+ should raise_error(Kraut::InvalidAuthentication, /Failed to find entity of type/)
103
+ end
104
+ end
105
+
106
+ context "when the user is not allowed to access the application" do
107
+ before { savon.expects(:authenticate_principal).returns(:application_access_denied) }
108
+
109
+ it "should raise an InvalidAuthentication" do
110
+ lambda { Kraut::Principal.authenticate "test", "password" }.
111
+ should raise_error(Kraut::ApplicationAccessDenied, /User does not have access to application/)
112
+ end
113
+ end
114
+ end
115
+
116
+ describe ".find_by_token" do
117
+ context "when successful" do
118
+ before { savon.expects(:find_principal_by_token).returns(:success) }
119
+
120
+ it "should return a principal" do
121
+ principal = Kraut::Principal.find_by_token "abcdefghijklmnopqrstuvwxyz0123456789"
122
+ principal.should be_a(Kraut::Principal)
123
+ end
124
+
125
+ it "should set the name of the principal to the name from the response" do
126
+ principal = Kraut::Principal.find_by_token "abcdefghijklmnopqrstuvwxyz0123456789"
127
+ principal.name.should == 'test-supervisor'
128
+ principal.name.class.should == String
129
+ end
130
+ end
131
+
132
+ context "with an invalid token" do
133
+ before { savon.expects(:find_principal_by_token).returns(:invalid_token) }
134
+
135
+ it "should raise an InvalidToken" do
136
+ lambda { Kraut::Principal.find_by_token "9876543210zyxwvutsrqponmlkjihgfedcba" }.
137
+ should raise_error(Kraut::InvalidPrincipalToken, /Failed to find entity of type/)
138
+ end
139
+ end
140
+ end
141
+
142
+ end
@@ -0,0 +1,148 @@
1
+ require "spec_helper"
2
+
3
+ describe Kraut::Session do
4
+
5
+ describe "validations" do
6
+ # TODO should_validate_presence_of :username, :password
7
+ end
8
+
9
+ describe "attributes" do
10
+ let(:session) { Kraut::Session.new(:username => "user", :password => "secret", :principal => Kraut::Principal.new(:name => "name", :token => "token")) }
11
+
12
+ describe "#name" do
13
+ it "should return the principal's name" do
14
+ session.name.should == "name"
15
+ end
16
+ end
17
+
18
+ describe "#token" do
19
+ it "should return the principal's token" do
20
+ session.token.should == "token"
21
+ end
22
+ end
23
+
24
+ describe "#allowed_to?" do
25
+ context "when the principal is allowed for the given action" do
26
+ it "should return true" do
27
+ session.expects(:in_group?).returns(true)
28
+ session.should be_allowed_to(:verify)
29
+ end
30
+ end
31
+
32
+ context "when the principal is not allowed for the given action" do
33
+ it "should return true" do
34
+ session.expects(:in_group?).returns(false)
35
+ session.should_not be_allowed_to(:invoice)
36
+ end
37
+ end
38
+ end
39
+
40
+ describe "#in_group?" do
41
+ it "should return whether the principal belongs to any of the given groups" do
42
+ Kraut::Principal.any_instance.expects(:member_of?).returns(true).then.returns(false)
43
+ session.in_group?(["staff", "supervisor"]).should be_true
44
+ end
45
+
46
+ it "should return whether the principal belongs to single group" do
47
+ Kraut::Principal.any_instance.expects(:member_of?).returns(false)
48
+ session.in_group?("staff").should be_false
49
+ end
50
+ end
51
+ end
52
+
53
+ describe "#valid?" do
54
+ it "should check the validations" do
55
+ Kraut::Session.new.should_not be_valid
56
+ end
57
+
58
+ context "for a valid Crowd user" do
59
+ before do
60
+ principal = Kraut::Principal.new
61
+ principal.expects(:requires_password_change?).returns(false)
62
+ Kraut::Principal.expects(:authenticate).with("user", "secret").returns(principal)
63
+ end
64
+
65
+ it "should return true" do
66
+ new_session.should be_valid
67
+ end
68
+ end
69
+
70
+ context "for an invalid Crowd user" do
71
+ before do
72
+ Kraut::Principal.expects(:authenticate).with("user", "secret").raises(Kraut::InvalidAuthentication)
73
+ end
74
+
75
+ it "should return false" do
76
+ new_session.should_not be_valid
77
+ end
78
+
79
+ it "should record an error" do
80
+ session = new_session
81
+ session.valid?
82
+ session.errors[:base].first.should == I18n.t("errors.kraut.invalid_credentials")
83
+ end
84
+ end
85
+
86
+ context "for a Crowd user with no access to the application" do
87
+ before do
88
+ Kraut::Principal.expects(:authenticate).with("user", "secret").raises(Kraut::ApplicationAccessDenied)
89
+ end
90
+
91
+ it "should return false" do
92
+ new_session.should_not be_valid
93
+ end
94
+
95
+ it "should record an error" do
96
+ session = new_session
97
+ session.valid?
98
+ session.errors[:base].first.should == I18n.t("errors.kraut.application_access_denied")
99
+ end
100
+ end
101
+
102
+ context "for a Crowd user with an expired password" do
103
+ before do
104
+ principal = Kraut::Principal.new
105
+ principal.expects(:requires_password_change?).returns(true)
106
+ Kraut::Principal.expects(:authenticate).with("user", "secret").returns(principal)
107
+ end
108
+
109
+ it "should return false" do
110
+ new_session.should_not be_valid
111
+ end
112
+
113
+ it "should record an error" do
114
+ session = new_session
115
+ session.valid?
116
+ session.errors[:base].first.should == I18n.t("errors.kraut.password_expired")
117
+ end
118
+ end
119
+
120
+ it "doesn't log in the user if he already is logged in" do
121
+ session = new_session
122
+ session.principal = Kraut::Principal.new
123
+ session.valid?.should == true
124
+ end
125
+
126
+ def new_session
127
+ Kraut::Session.new :username => "user", :password => "secret"
128
+ end
129
+ end
130
+
131
+ context ".find_by_token" do
132
+ it "returns a new session with the principal assigned to it on success" do
133
+ principal = Kraut::Principal.new
134
+
135
+ Kraut::Principal.expects(:find_by_token).with('abcd').returns(principal)
136
+ session = Kraut::Session.find_by_token('abcd')
137
+ session.should be_a(Kraut::Session)
138
+ session.principal.should == principal
139
+ end
140
+
141
+ it "passes through Kraut::InvalidPrincipalToken error thrown by the crowd server" do
142
+ Kraut::Principal.stubs(:find_by_token).raises(Kraut::InvalidPrincipalToken)
143
+ lambda { Kraut::Session.find_by_token('abcd') }.should raise_error(Kraut::InvalidPrincipalToken)
144
+ end
145
+
146
+ end
147
+
148
+ end
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+
3
+ describe Kraut::Rails::Engine do
4
+
5
+ describe "#resolve_authorization_aliases" do
6
+
7
+ it "returns a hash for authorizations use (replaces group aliases)" do
8
+ Kraut::Rails::Engine.resolve_authorization_aliases(
9
+ {
10
+ "action1" => ["group1", "group2"],
11
+ "action2" => ["group2"]
12
+ }, {
13
+ "group1" => "external_group1",
14
+ "group2" => "external_group2"
15
+ }
16
+ ).should == {
17
+ "action1" => ["external_group1", "external_group2"],
18
+ "action2" => ["external_group2"]
19
+ }
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,33 @@
1
+ require "bundler"
2
+ Bundler.require :default, :development
3
+
4
+ require "kraut/rails/engine"
5
+ Kraut.endpoint = "http://example.com"
6
+ Kraut::Rails::Engine.config.layout = false
7
+ Kraut::Rails::Engine.config.entry_url = "/"
8
+ Kraut::Rails::Engine.config.authorizations = {}
9
+
10
+ # stupid stuff to let the engine act as if it's included in an app
11
+ require "action_controller"
12
+ module Kraut
13
+ module Rails
14
+ class Application < ::Rails::Application; end
15
+ end
16
+ end
17
+ Kraut::Rails::Application.configure do
18
+ config.active_support.deprecation = :log
19
+ end
20
+ Kraut::Rails::Application.initialize!
21
+ ActionController::Base.send :include, Rails.application.routes.url_helpers
22
+ class ApplicationController < ActionController::Base; end
23
+ # end stupid stuff
24
+
25
+ require "rspec/rails"
26
+
27
+ RSpec.configure do |config|
28
+ config.mock_with :mocha
29
+ config.include Savon::Spec::Macros
30
+ end
31
+
32
+ Savon.log = false
33
+ Savon::Spec::Fixture.path = File.expand_path("../fixtures", __FILE__)
@@ -0,0 +1,11 @@
1
+ require "spec_helper"
2
+
3
+ describe "/kraut/sessions/new" do
4
+
5
+ before { assign :session, Kraut::Session.new }
6
+
7
+ it "should render properly" do
8
+ render
9
+ end
10
+
11
+ end
metadata ADDED
@@ -0,0 +1,237 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kraut
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.6
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Daniel Harrington
9
+ - Thilko Richter
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-06-04 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: savon
17
+ requirement: &2181323920 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - =
21
+ - !ruby/object:Gem::Version
22
+ version: 0.9.7
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *2181323920
26
+ - !ruby/object:Gem::Dependency
27
+ name: gyoku
28
+ requirement: &2181322660 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - =
32
+ - !ruby/object:Gem::Version
33
+ version: 0.4.4
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *2181322660
37
+ - !ruby/object:Gem::Dependency
38
+ name: ci_reporter
39
+ requirement: &2181321420 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ version: 1.6.5
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *2181321420
48
+ - !ruby/object:Gem::Dependency
49
+ name: rspec
50
+ requirement: &2181320160 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: 2.5.0
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *2181320160
59
+ - !ruby/object:Gem::Dependency
60
+ name: autotest
61
+ requirement: &2181318660 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ~>
65
+ - !ruby/object:Gem::Version
66
+ version: 4.4.2
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: *2181318660
70
+ - !ruby/object:Gem::Dependency
71
+ name: mocha
72
+ requirement: &2181360280 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.9.9
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *2181360280
81
+ - !ruby/object:Gem::Dependency
82
+ name: webmock
83
+ requirement: &2181363920 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ version: 1.3.5
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: *2181363920
92
+ - !ruby/object:Gem::Dependency
93
+ name: savon_spec
94
+ requirement: &2181363140 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ~>
98
+ - !ruby/object:Gem::Version
99
+ version: 0.1.6
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: *2181363140
103
+ - !ruby/object:Gem::Dependency
104
+ name: rake
105
+ requirement: &2181362360 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - =
109
+ - !ruby/object:Gem::Version
110
+ version: 0.8.7
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *2181362360
114
+ - !ruby/object:Gem::Dependency
115
+ name: rails
116
+ requirement: &2181361260 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - =
120
+ - !ruby/object:Gem::Version
121
+ version: 3.0.7
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: *2181361260
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec-rails
127
+ requirement: &2181360580 !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ~>
131
+ - !ruby/object:Gem::Version
132
+ version: 2.5.0
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: *2181360580
136
+ - !ruby/object:Gem::Dependency
137
+ name: haml
138
+ requirement: &2181359840 !ruby/object:Gem::Requirement
139
+ none: false
140
+ requirements:
141
+ - - ~>
142
+ - !ruby/object:Gem::Version
143
+ version: '3.0'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: *2181359840
147
+ - !ruby/object:Gem::Dependency
148
+ name: ZenTest
149
+ requirement: &2181359000 !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - =
153
+ - !ruby/object:Gem::Version
154
+ version: 4.5.0
155
+ type: :development
156
+ prerelease: false
157
+ version_requirements: *2181359000
158
+ description: Interface for the Atlassian Crowd SOAP API
159
+ email: blaulabs@blau.de
160
+ executables: []
161
+ extensions: []
162
+ extra_rdoc_files: []
163
+ files:
164
+ - .gitignore
165
+ - .rspec
166
+ - Gemfile
167
+ - README.md
168
+ - Rakefile
169
+ - app/controllers/kraut/sessions_controller.rb
170
+ - app/models/kraut/session.rb
171
+ - app/views/kraut/sessions/new.html.haml
172
+ - autotest/discover.rb
173
+ - config/initializers/savon.rb
174
+ - config/locales/kraut.yml
175
+ - config/routes.rb
176
+ - kraut.gemspec
177
+ - lib/kraut.rb
178
+ - lib/kraut/application.rb
179
+ - lib/kraut/client.rb
180
+ - lib/kraut/kraut.rb
181
+ - lib/kraut/mapper.rb
182
+ - lib/kraut/principal.rb
183
+ - lib/kraut/rails/authentication.rb
184
+ - lib/kraut/rails/engine.rb
185
+ - lib/kraut/rails/spec/login_helper.rb
186
+ - lib/kraut/rails/spec/protected_action.rb
187
+ - lib/kraut/rails/spec/user_helper.rb
188
+ - lib/kraut/rails/spec_helper.rb
189
+ - lib/kraut/version.rb
190
+ - spec/controllers/application_controller_spec.rb
191
+ - spec/controllers/sessions_controller_spec.rb
192
+ - spec/fixtures/authenticate_application/invalid_app.xml
193
+ - spec/fixtures/authenticate_application/invalid_password.xml
194
+ - spec/fixtures/authenticate_application/success.xml
195
+ - spec/fixtures/authenticate_principal/application_access_denied.xml
196
+ - spec/fixtures/authenticate_principal/invalid_password.xml
197
+ - spec/fixtures/authenticate_principal/invalid_user.xml
198
+ - spec/fixtures/authenticate_principal/success.xml
199
+ - spec/fixtures/find_principal_by_token/invalid_token.xml
200
+ - spec/fixtures/find_principal_by_token/success.xml
201
+ - spec/fixtures/find_principal_with_attributes_by_name/invalid_user.xml
202
+ - spec/fixtures/find_principal_with_attributes_by_name/success.xml
203
+ - spec/fixtures/is_group_member/not_in_group.xml
204
+ - spec/fixtures/is_group_member/success.xml
205
+ - spec/kraut/application_spec.rb
206
+ - spec/kraut/client_spec.rb
207
+ - spec/kraut/mapper_spec.rb
208
+ - spec/kraut/principal_spec.rb
209
+ - spec/models/session_spec.rb
210
+ - spec/rails/engine_spec.rb
211
+ - spec/spec_helper.rb
212
+ - spec/views/sessions/new.html.haml_spec.rb
213
+ homepage: http://github.com/blaulabs/kraut
214
+ licenses: []
215
+ post_install_message:
216
+ rdoc_options: []
217
+ require_paths:
218
+ - lib
219
+ required_ruby_version: !ruby/object:Gem::Requirement
220
+ none: false
221
+ requirements:
222
+ - - ! '>='
223
+ - !ruby/object:Gem::Version
224
+ version: '0'
225
+ required_rubygems_version: !ruby/object:Gem::Requirement
226
+ none: false
227
+ requirements:
228
+ - - ! '>='
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ requirements: []
232
+ rubyforge_project: kraut
233
+ rubygems_version: 1.8.11
234
+ signing_key:
235
+ specification_version: 3
236
+ summary: Crowd Interface
237
+ test_files: []