kraut 0.5.6

Sign up to get free protection for your applications and to get access to all the features.
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: []