casino_core 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.
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
+