casino_core 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/.rvmrc +48 -0
  4. data/.travis.yml +3 -0
  5. data/Gemfile +24 -0
  6. data/Gemfile.lock +64 -0
  7. data/LICENSE.txt +20 -0
  8. data/README.md +19 -0
  9. data/Rakefile +44 -0
  10. data/VERSION +1 -0
  11. data/casino_core.gemspec +126 -0
  12. data/config/cas.yml +26 -0
  13. data/config/database.yml +18 -0
  14. data/db/migrate/20121112154930_create_ticket_granting_tickets.rb +11 -0
  15. data/db/migrate/20121112160009_create_login_tickets.rb +9 -0
  16. data/db/migrate/20121112165804_ticket_should_not_be_null.rb +5 -0
  17. data/db/migrate/20121122180310_add_user_agent_to_ticket_granting_tickets.rb +5 -0
  18. data/db/migrate/20121124170004_add_index_for_username_to_ticket_granting_tickets.rb +5 -0
  19. data/db/migrate/20121124183542_create_service_tickets.rb +13 -0
  20. data/db/migrate/20121124183732_add_ticket_indexes.rb +6 -0
  21. data/db/migrate/20121124195013_add_consumed_to_service_tickets.rb +5 -0
  22. data/db/migrate/20121125091934_add_issued_from_credentials_to_service_tickets.rb +5 -0
  23. data/db/migrate/20121125185415_create_proxy_granting_tickets.rb +14 -0
  24. data/db/migrate/20121125190013_tickets_should_be_unique.rb +8 -0
  25. data/db/schema.rb +61 -0
  26. data/lib/casino_core.rb +33 -0
  27. data/lib/casino_core/authenticator.rb +9 -0
  28. data/lib/casino_core/authenticator/static.rb +23 -0
  29. data/lib/casino_core/helper.rb +21 -0
  30. data/lib/casino_core/helper/browser.rb +16 -0
  31. data/lib/casino_core/helper/service_tickets.rb +30 -0
  32. data/lib/casino_core/model.rb +10 -0
  33. data/lib/casino_core/model/login_ticket.rb +11 -0
  34. data/lib/casino_core/model/proxy_granting_ticket.rb +8 -0
  35. data/lib/casino_core/model/service_ticket.rb +32 -0
  36. data/lib/casino_core/model/service_ticket/single_sign_out_notifier.rb +53 -0
  37. data/lib/casino_core/model/ticket_granting_ticket.rb +9 -0
  38. data/lib/casino_core/processor.rb +15 -0
  39. data/lib/casino_core/processor/legacy_validator.rb +49 -0
  40. data/lib/casino_core/processor/login_credential_acceptor.rb +67 -0
  41. data/lib/casino_core/processor/login_credential_requestor.rb +45 -0
  42. data/lib/casino_core/processor/logout.rb +23 -0
  43. data/lib/casino_core/processor/session_destroyer.rb +17 -0
  44. data/lib/casino_core/railtie.rb +10 -0
  45. data/lib/casino_core/rake_tasks.rb +14 -0
  46. data/lib/casino_core/settings.rb +26 -0
  47. data/lib/casino_core/tasks/cleanup.rake +26 -0
  48. data/lib/casino_core/tasks/database.rake +60 -0
  49. data/spec/authenticator/static_spec.rb +42 -0
  50. data/spec/model/login_ticket_spec.rb +16 -0
  51. data/spec/model/service_ticket_spec.rb +45 -0
  52. data/spec/processor/legacy_validator_spec.rb +87 -0
  53. data/spec/processor/login_credential_acceptor_spec.rb +70 -0
  54. data/spec/processor/login_credential_requestor_spec.rb +75 -0
  55. data/spec/processor/logout_spec.rb +55 -0
  56. data/spec/processor/session_destroyer_spec.rb +68 -0
  57. data/spec/spec_helper.rb +33 -0
  58. metadata +234 -0
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe CASinoCore::Processor::LoginCredentialAcceptor do
4
+ describe '#process' do
5
+ let(:listener) { Object.new }
6
+ let(:processor) { described_class.new(listener) }
7
+
8
+ context 'without a valid login ticket' do
9
+ it 'calls the #invalid_login_ticket method on the listener' do
10
+ listener.should_receive(:invalid_login_ticket).with(no_args)
11
+ processor.process
12
+ end
13
+ end
14
+
15
+ context 'with a valid login ticket' do
16
+ let(:login_ticket) { CASinoCore::Model::LoginTicket.create! ticket: "LT-#{Random.rand(10000000)}" }
17
+
18
+ context 'with invalid credentials' do
19
+ it 'calls the #invalid_login_credentials method on the listener' do
20
+ listener.should_receive(:invalid_login_credentials).with(no_args)
21
+ processor.process(lt: login_ticket.ticket)
22
+ end
23
+ end
24
+
25
+ context 'with valid credentials' do
26
+ let(:login_data) { { lt: login_ticket.ticket, username: 'testuser', password: 'foobar123', service: service } }
27
+
28
+ before(:each) do
29
+ listener.stub(:user_logged_in)
30
+ end
31
+
32
+ context 'without a service' do
33
+ let(:service) { nil }
34
+
35
+ it 'calls the #user_logged_in method on the listener' do
36
+ listener.should_receive(:user_logged_in).with(nil, /^TGC\-/)
37
+ processor.process(lt: login_ticket.ticket, username: 'testuser', password: 'foobar123')
38
+ end
39
+
40
+ it 'generates a ticket-granting ticket' do
41
+ lambda do
42
+ processor.process(login_data)
43
+ end.should change(CASinoCore::Model::TicketGrantingTicket, :count).by(1)
44
+ end
45
+ end
46
+
47
+ context 'with a service' do
48
+ let(:service) { 'https://www.example.com' }
49
+
50
+ it 'calls the #user_logged_in method on the listener' do
51
+ listener.should_receive(:user_logged_in).with(/^#{service}\?ticket=ST\-/, /^TGC\-/)
52
+ processor.process(login_data)
53
+ end
54
+
55
+ it 'generates a service ticket' do
56
+ lambda do
57
+ processor.process(login_data)
58
+ end.should change(CASinoCore::Model::ServiceTicket, :count).by(1)
59
+ end
60
+
61
+ it 'generates a ticket-granting ticket' do
62
+ lambda do
63
+ processor.process(login_data)
64
+ end.should change(CASinoCore::Model::TicketGrantingTicket, :count).by(1)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe CASinoCore::Processor::LoginCredentialRequestor do
4
+ describe '#process' do
5
+ let(:listener) { Object.new }
6
+ let(:processor) { described_class.new(listener) }
7
+
8
+ context 'when logged out' do
9
+ it 'calls the #user_not_logged_in method on the listener' do
10
+ listener.should_receive(:user_not_logged_in).with(kind_of(CASinoCore::Model::LoginTicket))
11
+ processor.process
12
+ end
13
+ end
14
+
15
+ context 'when logged in' do
16
+ let(:user_agent) { 'TestBrowser 1.0' }
17
+ let(:ticket_granting_ticket) {
18
+ CASinoCore::Model::TicketGrantingTicket.create!({
19
+ ticket: 'TGC-9H6Vx4850i2Ksp3R8hTCwO',
20
+ username: 'test',
21
+ extra_attributes: nil,
22
+ user_agent: user_agent
23
+ })
24
+ }
25
+ let(:cookies) { { tgt: ticket_granting_ticket.ticket } }
26
+
27
+ before(:each) do
28
+ listener.stub(:user_logged_in)
29
+ end
30
+
31
+ context 'with a service' do
32
+ let(:service) { 'http://example.com/' }
33
+ let(:params) { { service: service } }
34
+
35
+ it 'calls the #user_logged_in method on the listener' do
36
+ listener.should_receive(:user_logged_in).with(/^#{service}\?ticket=ST\-/)
37
+ processor.process(params, cookies, user_agent)
38
+ end
39
+
40
+ it 'generates a service ticket' do
41
+ lambda do
42
+ processor.process(params, cookies, user_agent)
43
+ end.should change(CASinoCore::Model::ServiceTicket, :count).by(1)
44
+ end
45
+
46
+ context 'with renew parameter' do
47
+ it 'calls the #user_not_logged_in method on the listener' do
48
+ listener.should_receive(:user_not_logged_in).with(kind_of(CASinoCore::Model::LoginTicket))
49
+ processor.process(params.merge({ renew: 'true' }), cookies)
50
+ end
51
+ end
52
+ end
53
+
54
+ context 'without a service' do
55
+ it 'calls the #user_logged_in method on the listener' do
56
+ listener.should_receive(:user_logged_in).with(nil)
57
+ processor.process(nil, cookies, user_agent)
58
+ end
59
+
60
+ it 'does not generate a service ticket' do
61
+ lambda do
62
+ processor.process(nil, cookies, user_agent)
63
+ end.should change(CASinoCore::Model::ServiceTicket, :count).by(0)
64
+ end
65
+
66
+ context 'with a changed browser' do
67
+ it 'calls the #user_not_logged_in method on the listener' do
68
+ listener.should_receive(:user_not_logged_in).with(kind_of(CASinoCore::Model::LoginTicket))
69
+ processor.process(nil, cookies)
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe CASinoCore::Processor::Logout do
4
+ describe '#process' do
5
+ let(:listener) { Object.new }
6
+ let(:processor) { described_class.new(listener) }
7
+ let(:cookies) { { tgt: tgt } }
8
+ let(:url) { nil }
9
+ let(:params) { { :url => url } unless url.nil? }
10
+
11
+ before(:each) do
12
+ listener.stub(:user_logged_out)
13
+ end
14
+
15
+ context 'with an existing ticket-granting ticket' do
16
+ let(:ticket_granting_ticket) {
17
+ CASinoCore::Model::TicketGrantingTicket.create!({
18
+ ticket: 'TGC-HXdkW233TsRtiqYGq4b8U7',
19
+ username: 'test',
20
+ extra_attributes: nil,
21
+ user_agent: 'TestBrowser 1.0'
22
+ })
23
+ }
24
+ let(:tgt) { ticket_granting_ticket.ticket }
25
+
26
+ it 'calls the #process method of SessionDestroyer' do
27
+ CASinoCore::Processor::SessionDestroyer.any_instance.should_receive(:process).with(tgt)
28
+ processor.process(params, cookies)
29
+ end
30
+
31
+ it 'calls the #user_logged_out method on the listener' do
32
+ listener.should_receive(:user_logged_out).with(nil)
33
+ processor.process(params, cookies)
34
+ end
35
+
36
+ context 'with an URL' do
37
+ let(:url) { 'http://www.example.com' }
38
+
39
+ it 'calls the #user_logged_out method on the listener and passes the URL' do
40
+ listener.should_receive(:user_logged_out).with(url)
41
+ processor.process(params, cookies)
42
+ end
43
+ end
44
+ end
45
+
46
+ context 'with an invlaid ticket-granting ticket' do
47
+ let(:tgt) { 'TGT-lalala' }
48
+
49
+ it 'calls the #user_logged_out method on the listener' do
50
+ listener.should_receive(:user_logged_out).with(nil)
51
+ processor.process(params, cookies)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe CASinoCore::Processor::SessionDestroyer do
4
+ describe '#process' do
5
+ let(:listener) { Object.new }
6
+ let(:processor) { described_class.new(listener) }
7
+ let(:user_agent) { 'TestBrowser 1.0' }
8
+ let(:other_ticket_granting_ticket) {
9
+ CASinoCore::Model::TicketGrantingTicket.create!({
10
+ ticket: 'TGC-ocCudGzZjJtrvOXJ485mt3',
11
+ username: 'test',
12
+ extra_attributes: nil,
13
+ user_agent: user_agent
14
+ })
15
+ }
16
+
17
+ before(:each) do
18
+ listener.stub(:ticket_deleted)
19
+ listener.stub(:ticket_not_found)
20
+ end
21
+
22
+ context 'with an existing ticket-granting ticket' do
23
+ let(:ticket_granting_ticket) {
24
+ CASinoCore::Model::TicketGrantingTicket.create!({
25
+ ticket: 'TGC-HXdkW233TsRtiqYGq4b8U7',
26
+ username: 'test',
27
+ extra_attributes: nil,
28
+ user_agent: user_agent
29
+ })
30
+ }
31
+ let(:tgt) { ticket_granting_ticket.ticket }
32
+
33
+ it 'deletes only one ticket-granting ticket' do
34
+ ticket_granting_ticket
35
+ other_ticket_granting_ticket
36
+ lambda do
37
+ processor.process(tgt)
38
+ end.should change(CASinoCore::Model::TicketGrantingTicket, :count).by(-1)
39
+ end
40
+
41
+ it 'deletes the ticket-granting ticket' do
42
+ processor.process(tgt)
43
+ CASinoCore::Model::TicketGrantingTicket.where(ticket: tgt).length.should == 0
44
+ end
45
+
46
+ it 'calls the #ticket_deleted method on the listener' do
47
+ listener.should_receive(:ticket_deleted).with(no_args)
48
+ processor.process(tgt)
49
+ end
50
+ end
51
+
52
+ context 'with an invlaid ticket-granting ticket' do
53
+ let(:tgt) { 'TGT-lalala' }
54
+
55
+ it 'does not delete a ticket-granting ticket' do
56
+ other_ticket_granting_ticket
57
+ lambda do
58
+ processor.process(tgt)
59
+ end.should change(CASinoCore::Model::TicketGrantingTicket, :count).by(0)
60
+ end
61
+
62
+ it 'calls the #ticket_not_found method on the listener' do
63
+ listener.should_receive(:ticket_not_found).with(no_args)
64
+ processor.process(tgt)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,33 @@
1
+ require 'casino_core'
2
+ require 'database_cleaner'
3
+
4
+ # This file was generated by the `rspec --init` command. Conventionally, all
5
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
6
+ # Require this file using `require "spec_helper"` to ensure that it is only
7
+ # loaded once.
8
+ #
9
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
10
+ RSpec.configure do |config|
11
+ config.treat_symbols_as_metadata_keys_with_true_values = true
12
+
13
+ # Run specs in random order to surface order dependencies. If you find an
14
+ # order dependency and want to debug it, you can fix the order by providing
15
+ # the seed, which is printed after each run.
16
+ # --seed 1234
17
+ config.order = 'random'
18
+
19
+ CASinoCore.setup 'test'
20
+
21
+ config.before(:suite) do
22
+ DatabaseCleaner.strategy = :transaction
23
+ DatabaseCleaner.clean_with(:truncation)
24
+ end
25
+
26
+ config.before(:each) do
27
+ DatabaseCleaner.start
28
+ end
29
+
30
+ config.after(:each) do
31
+ DatabaseCleaner.clean
32
+ end
33
+ end
metadata ADDED
@@ -0,0 +1,234 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: casino_core
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Nils Caspar
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2012-12-16 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activerecord
17
+ requirement: &id001 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ~>
21
+ - !ruby/object:Gem::Version
22
+ version: 3.2.9
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: addressable
28
+ requirement: &id002 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 2.3.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: useragent
39
+ requirement: &id003 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ version: 0.4.13
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
49
+ name: bundler
50
+ requirement: &id004 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: 1.2.0
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
60
+ name: jeweler
61
+ requirement: &id005 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ~>
65
+ - !ruby/object:Gem::Version
66
+ version: 1.8.4
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
+ name: redcarpet
72
+ requirement: &id006 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: "0"
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *id006
81
+ - !ruby/object:Gem::Dependency
82
+ name: yard
83
+ requirement: &id007 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ version: 0.8.3
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: *id007
92
+ - !ruby/object:Gem::Dependency
93
+ name: rspec
94
+ requirement: &id008 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ~>
98
+ - !ruby/object:Gem::Version
99
+ version: 2.12.0
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: *id008
103
+ - !ruby/object:Gem::Dependency
104
+ name: simplecov
105
+ requirement: &id009 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 0.7.1
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *id009
114
+ - !ruby/object:Gem::Dependency
115
+ name: sqlite3
116
+ requirement: &id010 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: "0"
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: *id010
125
+ - !ruby/object:Gem::Dependency
126
+ name: database_cleaner
127
+ requirement: &id011 !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: "0"
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: *id011
136
+ description: A CAS server core library.
137
+ email: ncaspar@me.com
138
+ executables: []
139
+
140
+ extensions: []
141
+
142
+ extra_rdoc_files:
143
+ - LICENSE.txt
144
+ - README.md
145
+ files:
146
+ - .document
147
+ - .rspec
148
+ - .rvmrc
149
+ - .travis.yml
150
+ - Gemfile
151
+ - Gemfile.lock
152
+ - LICENSE.txt
153
+ - README.md
154
+ - Rakefile
155
+ - VERSION
156
+ - casino_core.gemspec
157
+ - config/cas.yml
158
+ - config/database.yml
159
+ - db/migrate/20121112154930_create_ticket_granting_tickets.rb
160
+ - db/migrate/20121112160009_create_login_tickets.rb
161
+ - db/migrate/20121112165804_ticket_should_not_be_null.rb
162
+ - db/migrate/20121122180310_add_user_agent_to_ticket_granting_tickets.rb
163
+ - db/migrate/20121124170004_add_index_for_username_to_ticket_granting_tickets.rb
164
+ - db/migrate/20121124183542_create_service_tickets.rb
165
+ - db/migrate/20121124183732_add_ticket_indexes.rb
166
+ - db/migrate/20121124195013_add_consumed_to_service_tickets.rb
167
+ - db/migrate/20121125091934_add_issued_from_credentials_to_service_tickets.rb
168
+ - db/migrate/20121125185415_create_proxy_granting_tickets.rb
169
+ - db/migrate/20121125190013_tickets_should_be_unique.rb
170
+ - db/schema.rb
171
+ - lib/casino_core.rb
172
+ - lib/casino_core/authenticator.rb
173
+ - lib/casino_core/authenticator/static.rb
174
+ - lib/casino_core/helper.rb
175
+ - lib/casino_core/helper/browser.rb
176
+ - lib/casino_core/helper/service_tickets.rb
177
+ - lib/casino_core/model.rb
178
+ - lib/casino_core/model/login_ticket.rb
179
+ - lib/casino_core/model/proxy_granting_ticket.rb
180
+ - lib/casino_core/model/service_ticket.rb
181
+ - lib/casino_core/model/service_ticket/single_sign_out_notifier.rb
182
+ - lib/casino_core/model/ticket_granting_ticket.rb
183
+ - lib/casino_core/processor.rb
184
+ - lib/casino_core/processor/legacy_validator.rb
185
+ - lib/casino_core/processor/login_credential_acceptor.rb
186
+ - lib/casino_core/processor/login_credential_requestor.rb
187
+ - lib/casino_core/processor/logout.rb
188
+ - lib/casino_core/processor/session_destroyer.rb
189
+ - lib/casino_core/railtie.rb
190
+ - lib/casino_core/rake_tasks.rb
191
+ - lib/casino_core/settings.rb
192
+ - lib/casino_core/tasks/cleanup.rake
193
+ - lib/casino_core/tasks/database.rake
194
+ - spec/authenticator/static_spec.rb
195
+ - spec/model/login_ticket_spec.rb
196
+ - spec/model/service_ticket_spec.rb
197
+ - spec/processor/legacy_validator_spec.rb
198
+ - spec/processor/login_credential_acceptor_spec.rb
199
+ - spec/processor/login_credential_requestor_spec.rb
200
+ - spec/processor/logout_spec.rb
201
+ - spec/processor/session_destroyer_spec.rb
202
+ - spec/spec_helper.rb
203
+ homepage: http://github.com/pencil/CASinoCore
204
+ licenses:
205
+ - MIT
206
+ post_install_message:
207
+ rdoc_options: []
208
+
209
+ require_paths:
210
+ - lib
211
+ required_ruby_version: !ruby/object:Gem::Requirement
212
+ none: false
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ hash: -3576737040247734839
217
+ segments:
218
+ - 0
219
+ version: "0"
220
+ required_rubygems_version: !ruby/object:Gem::Requirement
221
+ none: false
222
+ requirements:
223
+ - - ">="
224
+ - !ruby/object:Gem::Version
225
+ version: "0"
226
+ requirements: []
227
+
228
+ rubyforge_project:
229
+ rubygems_version: 1.8.24
230
+ signing_key:
231
+ specification_version: 3
232
+ summary: A CAS server core library.
233
+ test_files: []
234
+