rubycas-server 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/CHANGELOG.txt +1 -186
  2. data/History.txt +247 -0
  3. data/Manifest.txt +27 -2
  4. data/PostInstall.txt +3 -0
  5. data/Rakefile +4 -60
  6. data/bin/rubycas-server +2 -2
  7. data/bin/rubycas-server-ctl +0 -0
  8. data/casserver.db +0 -0
  9. data/casserver.log +792 -0
  10. data/casserver_db.log +88 -0
  11. data/config/hoe.rb +76 -0
  12. data/config/requirements.rb +15 -0
  13. data/config.example.yml +130 -6
  14. data/lib/casserver/authenticators/base.rb +20 -0
  15. data/lib/casserver/authenticators/client_certificate.rb +46 -0
  16. data/lib/casserver/authenticators/google.rb +54 -0
  17. data/lib/casserver/authenticators/ldap.rb +70 -40
  18. data/lib/casserver/authenticators/ntlm.rb +88 -0
  19. data/lib/casserver/authenticators/open_id.rb +22 -0
  20. data/lib/casserver/authenticators/sql.rb +66 -1
  21. data/lib/casserver/authenticators/sql_md5.rb +19 -0
  22. data/lib/casserver/authenticators/test.rb +5 -1
  23. data/lib/casserver/cas.rb +97 -22
  24. data/lib/casserver/controllers.rb +95 -34
  25. data/lib/casserver/environment.rb +16 -9
  26. data/lib/casserver/models.rb +38 -10
  27. data/lib/casserver/version.rb +1 -1
  28. data/lib/casserver/views.rb +38 -22
  29. data/lib/casserver.rb +13 -9
  30. data/lib/rubycas-server/version.rb +1 -0
  31. data/lib/rubycas-server.rb +1 -1
  32. data/lib/themes/notice.png +0 -0
  33. data/lib/themes/simple/logo.png +0 -0
  34. data/misc/basic_cas_single_signon_mechanism_diagram.png +0 -0
  35. data/misc/basic_cas_single_signon_mechanism_diagram.svg +652 -0
  36. data/script/console +10 -0
  37. data/script/destroy +14 -0
  38. data/script/generate +14 -0
  39. data/script/txt2html +82 -0
  40. data/tasks/deployment.rake +34 -0
  41. data/tasks/environment.rake +7 -0
  42. data/tasks/website.rake +17 -0
  43. data/website/index.html +40 -0
  44. data/website/index.txt +3 -0
  45. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  46. data/website/stylesheets/screen.css +138 -0
  47. data/website/template.html.erb +40 -0
  48. metadata +45 -33
  49. data/test/test_cas.rb +0 -33
  50. data/test/test_casserver.rb +0 -125
@@ -17,7 +17,7 @@ module CASServer::Controllers
17
17
  headers['Expires'] = (Time.now - 1.year).rfc2822
18
18
 
19
19
  # optional params
20
- @service = @input['service']
20
+ @service = clean_service_url(@input['service'])
21
21
  @renew = @input['renew']
22
22
  @gateway = @input['gateway'] == 'true' || @input['gateway'] == '1'
23
23
 
@@ -26,13 +26,19 @@ module CASServer::Controllers
26
26
  end
27
27
 
28
28
  if tgt and !tgt_error
29
- @message = {:type => 'notice', :message => %{You are currently logged in as "#{tgt.username}". If this is not you, please log in below.}}
29
+ @message = {:type => 'notice',
30
+ :message => %{You are currently logged in as "#{tgt.username}". If this is not you, please log in below.}}
31
+ end
32
+
33
+ if @input['redirection_loop_intercepted']
34
+ @message = {:type => 'mistake',
35
+ :message => %{The client and server are unable to negotiate authentication. Please try logging in again later.}}
30
36
  end
31
37
 
32
38
  begin
33
39
  if @service
34
40
  if !@renew && tgt && !tgt_error
35
- st = generate_service_ticket(@service, tgt.username)
41
+ st = generate_service_ticket(@service, tgt.username, tgt)
36
42
  service_with_ticket = service_uri_with_ticket(@service, st)
37
43
  $LOG.info("User '#{tgt.username}' authenticated based on ticket granting cookie. Redirecting to service '#{@service}'.")
38
44
  return redirect(service_with_ticket, :status => 303) # response code 303 means "See Other" (see Appendix B in CAS Protocol spec)
@@ -42,11 +48,13 @@ module CASServer::Controllers
42
48
  end
43
49
  elsif @gateway
44
50
  $LOG.error("This is a gateway request but no service parameter was given!")
45
- @message = {:type => 'mistake', :message => "The server cannot fulfill this gateway request because no service parameter was given."}
51
+ @message = {:type => 'mistake',
52
+ :message => "The server cannot fulfill this gateway request because no service parameter was given."}
46
53
  end
47
- rescue # FIXME: shouldn't this only rescue URI::InvalidURIError?
54
+ rescue URI::InvalidURIError
48
55
  $LOG.error("The service '#{@service}' is not a valid URI!")
49
- @message = {:type => 'mistake', :message => "The target service your browser supplied appears to be invalid. Please contact your system administrator for help."}
56
+ @message = {:type => 'mistake',
57
+ :message => "The target service your browser supplied appears to be invalid. Please contact your system administrator for help."}
50
58
  end
51
59
 
52
60
  lt = generate_login_ticket
@@ -75,7 +83,7 @@ module CASServer::Controllers
75
83
  render :login_form
76
84
  else
77
85
  @status = 500
78
- "Could not guess the CAS login URI. Please supply a submitURI parameter with your request."
86
+ "Could not guess the CAS login URI. Please supply a submitToURI parameter with your request."
79
87
  end
80
88
  else
81
89
  render :login
@@ -87,8 +95,7 @@ module CASServer::Controllers
87
95
  CASServer::Utils::log_controller_action(self.class, @input)
88
96
 
89
97
  # 2.2.1 (optional)
90
- @service = @input['service']
91
- @warn = @input['warn']
98
+ @service = clean_service_url(@input['service'])
92
99
 
93
100
  # 2.2.2 (required)
94
101
  @username = @input['username']
@@ -123,10 +130,21 @@ module CASServer::Controllers
123
130
  $LOG.debug("Logging in with username: #{@username}, lt: #{@lt}, service: #{@service}, auth: #{$AUTH}")
124
131
 
125
132
  credentials_are_valid = false
133
+ extra_attributes = {}
134
+ successful_authenticator = nil
126
135
  begin
127
136
  $AUTH.each do |auth|
128
- credentials_are_valid = auth.validate(:username => @username, :password => @password, :service => @service)
129
- break if credentials_are_valid
137
+ credentials_are_valid = auth.validate(
138
+ :username => @username,
139
+ :password => @password,
140
+ :service => @service,
141
+ :request => env
142
+ )
143
+ if credentials_are_valid
144
+ extra_attributes.merge!(auth.extra_attributes) unless auth.extra_attributes.blank?
145
+ successful_authenticator = auth
146
+ break
147
+ end
130
148
  end
131
149
  rescue CASServer::AuthenticatorError => e
132
150
  $LOG.error(e)
@@ -135,10 +153,11 @@ module CASServer::Controllers
135
153
  end
136
154
 
137
155
  if credentials_are_valid
138
- $LOG.info("Credentials for username '#{@username}' successfully validated")
156
+ $LOG.info("Credentials for username '#{@username}' successfully validated using #{successful_authenticator.class.name}.")
157
+ $LOG.debug("Authenticator provided additional user attributes: #{extra_attributes.inspect}") unless extra_attributes.blank?
139
158
 
140
159
  # 3.6 (ticket-granting cookie)
141
- tgt = generate_ticket_granting_ticket(@username)
160
+ tgt = generate_ticket_granting_ticket(@username, extra_attributes)
142
161
 
143
162
  if CASServer::Conf.expire_sessions
144
163
  expires = CASServer::Conf.ticket_granting_ticket_expiry.to_i.from_now
@@ -147,17 +166,22 @@ module CASServer::Controllers
147
166
  expiry_info = " It will not expire."
148
167
  end
149
168
 
150
- # TODO: Set expiry time for the cookie when expire_sessions is true. Unfortunately there doesn't
151
- # seem to be an easy way to set cookie expire times in Camping :(
152
- @cookies[:tgt] = tgt.to_s
169
+ if CASServer::Conf.expire_sessions
170
+ @cookies[:tgt] = {
171
+ :value => tgt.to_s,
172
+ :expires => Time.now + CASServer::Conf.ticket_granting_ticket_expiry
173
+ }
174
+ else
175
+ @cookies[:tgt] = tgt.to_s
176
+ end
153
177
 
154
- $LOG.debug("Ticket granting cookie '#{@cookies[:tgt]}' granted to '#{@username}'. #{expiry_info}")
178
+ $LOG.debug("Ticket granting cookie '#{@cookies[:tgt].inspect}' granted to '#{@username.inspect}'. #{expiry_info}")
155
179
 
156
180
  if @service.blank?
157
181
  $LOG.info("Successfully authenticated user '#{@username}' at '#{tgt.client_hostname}'. No service param was given, so we will not redirect.")
158
182
  @message = {:type => 'confirmation', :message => "You have successfully logged in."}
159
183
  else
160
- @st = generate_service_ticket(@service, @username)
184
+ @st = generate_service_ticket(@service, @username, tgt)
161
185
  begin
162
186
  service_with_ticket = service_uri_with_ticket(@service, @st)
163
187
 
@@ -190,7 +214,7 @@ module CASServer::Controllers
190
214
  # "logout" page, we take the user back to the login page with a "you have been logged out"
191
215
  # message, allowing for an opportunity to immediately log back in. This makes it
192
216
  # easier for the user to log out and log in as someone else.
193
- @service = @input['service'] || @input['destination']
217
+ @service = clean_service_url(@input['service'] || @input['destination'])
194
218
  @continue_url = @input['url']
195
219
 
196
220
  @gateway = @input['gateway'] == 'true' || @input['gateway'] == '1'
@@ -200,16 +224,29 @@ module CASServer::Controllers
200
224
  @cookies.delete :tgt
201
225
 
202
226
  if tgt
203
- pgts = CASServer::Models::ProxyGrantingTicket.find(:all,
204
- :conditions => ["username = ?", tgt.username],
205
- :include => :service_ticket)
206
- pgts.each do |pgt|
207
- $LOG.debug("Deleting Proxy-Granting Ticket '#{pgt}' for user '#{pgt.service_ticket.username}'")
208
- pgt.destroy
209
- end
210
-
211
- $LOG.debug("Deleting Ticket-Granting Ticket '#{tgt}' for user '#{tgt.username}'")
212
- tgt.destroy
227
+ CASServer::Models::TicketGrantingTicket.transaction do
228
+ pgts = CASServer::Models::ProxyGrantingTicket.find(:all,
229
+ :conditions => [CASServer::Models::Base.connection.quote_table_name(CASServer::Models::ServiceTicket.table_name)+".username = ?", tgt.username],
230
+ :include => :service_ticket)
231
+ pgts.each do |pgt|
232
+ $LOG.debug("Deleting Proxy-Granting Ticket '#{pgt}' for user '#{pgt.service_ticket.username}'")
233
+ pgt.destroy
234
+ end
235
+
236
+ if CASServer::Conf.enable_single_sign_out
237
+ $LOG.debug("Deleting Service/Proxy Tickets for '#{tgt}' for user '#{tgt.username}'")
238
+ tgt.service_tickets.each do |st|
239
+ send_logout_notification_for_service_ticket(st)
240
+ # TODO: Maybe we should do some special handling if send_logout_notification_for_service_ticket fails?
241
+ # (the above method returns false if the POST results in a non-200 HTTP response).
242
+ $LOG.debug "Deleting #{st.class.name.demodulize} #{st.ticket.inspect}."
243
+ st.destroy
244
+ end
245
+ end
246
+
247
+ $LOG.debug("Deleting #{tgt.class.name.demodulize} '#{tgt}' for user '#{tgt.username}'")
248
+ tgt.destroy
249
+ end
213
250
 
214
251
  $LOG.info("User '#{tgt.username}' logged out.")
215
252
  else
@@ -242,7 +279,7 @@ module CASServer::Controllers
242
279
  CASServer::Utils::log_controller_action(self.class, @input)
243
280
 
244
281
  # required
245
- @service = @input['service']
282
+ @service = clean_service_url(@input['service'])
246
283
  @ticket = @input['ticket']
247
284
  # optional
248
285
  @renew = @input['renew']
@@ -252,6 +289,8 @@ module CASServer::Controllers
252
289
 
253
290
  @username = st.username if @success
254
291
 
292
+ @status = response_status_from_error(@error) if @error
293
+
255
294
  render :validate
256
295
  end
257
296
  end
@@ -265,7 +304,7 @@ module CASServer::Controllers
265
304
  CASServer::Utils::log_controller_action(self.class, @input)
266
305
 
267
306
  # required
268
- @service = @input['service']
307
+ @service = clean_service_url(@input['service'])
269
308
  @ticket = @input['ticket']
270
309
  # optional
271
310
  @pgt_url = @input['pgtUrl']
@@ -280,8 +319,11 @@ module CASServer::Controllers
280
319
  pgt = generate_proxy_granting_ticket(@pgt_url, st)
281
320
  @pgtiou = pgt.iou if pgt
282
321
  end
322
+ @extra_attributes = st.ticket_granting_ticket.extra_attributes || {}
283
323
  end
284
324
 
325
+ @status = response_status_from_error(@error) if @error
326
+
285
327
  render :service_validate
286
328
  end
287
329
  end
@@ -295,7 +337,7 @@ module CASServer::Controllers
295
337
  CASServer::Utils::log_controller_action(self.class, @input)
296
338
 
297
339
  # required
298
- @service = @input['service']
340
+ @service = clean_service_url(@input['service'])
299
341
  @ticket = @input['ticket']
300
342
  # optional
301
343
  @pgt_url = @input['pgtUrl']
@@ -306,6 +348,7 @@ module CASServer::Controllers
306
348
  t, @error = validate_proxy_ticket(@service, @ticket)
307
349
  @success = t && !@error
308
350
 
351
+ @extra_attributes = {}
309
352
  if @success
310
353
  @username = t.username
311
354
 
@@ -317,7 +360,11 @@ module CASServer::Controllers
317
360
  pgt = generate_proxy_granting_ticket(@pgt_url, t)
318
361
  @pgtiou = pgt.iou if pgt
319
362
  end
363
+
364
+ @extra_attributes = t.ticket_granting_ticket.extra_attributes || {}
320
365
  end
366
+
367
+ @status = response_status_from_error(@error) if @error
321
368
 
322
369
  render :proxy_validate
323
370
  end
@@ -341,6 +388,8 @@ module CASServer::Controllers
341
388
  @pt = generate_proxy_ticket(@target_service, pgt)
342
389
  end
343
390
 
391
+ @status = response_status_from_error(@error) if @error
392
+
344
393
  render :proxy
345
394
  end
346
395
  end
@@ -356,7 +405,7 @@ module CASServer::Controllers
356
405
  def get
357
406
  CASServer::Utils::log_controller_action(self.class, @input)
358
407
  $LOG.error("Tried to use login ticket dispenser with get method!")
359
- @status = 500
408
+ @status = 422
360
409
  "To generate a login ticket, you must make a POST request."
361
410
  end
362
411
 
@@ -366,7 +415,7 @@ module CASServer::Controllers
366
415
  CASServer::Utils::log_controller_action(self.class, @input)
367
416
  lt = generate_login_ticket
368
417
 
369
- $LOG.debug("Dispensing login ticket #{lt} to host #{(env['REMOTE_HOST'] || env['REMOTE_ADDR']).inspect}")
418
+ $LOG.debug("Dispensing login ticket #{lt} to host #{(env['HTTP_X_FORWARDED_FOR'] || env['REMOTE_HOST'] || env['REMOTE_ADDR']).inspect}")
370
419
 
371
420
  @lt = lt.ticket
372
421
 
@@ -388,4 +437,16 @@ module CASServer::Controllers
388
437
  end
389
438
  end
390
439
  end
440
+
441
+ def response_status_from_error(error)
442
+ case error.code.to_s
443
+ when /^INVALID_/, 'BAD_PGT'
444
+ 422
445
+ when 'INTERNAL_ERROR'
446
+ 500
447
+ else
448
+ 500
449
+ end
450
+ end
451
+ module_function :response_status_from_error
391
452
  end
@@ -1,15 +1,21 @@
1
1
  $: << File.dirname(File.expand_path(__FILE__))
2
2
 
3
3
  # Try to load local version of Picnic if possible (for development purposes)
4
- $: << File.dirname(File.expand_path(__FILE__))+"/../../../picnic/lib"
5
- $: << File.dirname(File.expand_path(__FILE__))+"/../../vendor/picnic/lib"
4
+ alt_picic_paths = []
5
+ alt_picic_paths << File.dirname(File.expand_path(__FILE__))+"/../../../picnic/lib"
6
+ alt_picic_paths << File.dirname(File.expand_path(__FILE__))+"/../../vendor/picnic/lib"
6
7
 
7
8
  begin
9
+ require 'active_record'
10
+ rescue LoadError
11
+ require 'rubygems'
12
+ require 'active_record'
13
+ end
14
+
15
+ if alt_picic_paths.any?{|path| File.exists? "#{path}/picnic.rb" }
16
+ alt_picic_paths.each{|path| $: << path}
8
17
  require 'picnic'
9
- rescue LoadError => e
10
- # make sure that the LoadError was about picnic and not something else
11
- raise e unless e.to_s =~ /picnic/
12
-
18
+ else
13
19
  require 'rubygems'
14
20
 
15
21
  # make things backwards-compatible for rubygems < 0.9.0
@@ -17,7 +23,8 @@ rescue LoadError => e
17
23
  alias gem require_gem
18
24
  end
19
25
 
20
- gem 'picnic'
21
-
22
26
  require 'picnic'
23
- end
27
+ end
28
+
29
+ # used for serializing user extra_attributes (see #service_validate in views.rb)
30
+ require 'yaml'
@@ -36,17 +36,11 @@ module CASServer::Models
36
36
  set_table_name 'casserver_st'
37
37
  include Consumable
38
38
 
39
+ belongs_to :ticket_granting_ticket, :foreign_key => :tgt_id
40
+
39
41
  def matches_service?(service)
40
- # Remove CAS-related parameters from the service URL, since they really shoudln't
41
- # be there (some misbehaving clients include them in the service URL).
42
- ['service', 'ticket', 'gateway', 'renew'].each do |p|
43
- service.gsub!(Regexp.new("#{p}=[^&]*"), '')
44
- end
45
-
46
- # We ignore the trailing slash and ? in URLs, since
47
- # "http://www.google.com/" and "http://www.google.com" are almost
48
- # certainly the same service.
49
- self.service.gsub(/[\/\?]$/, '') == service.gsub(/[\/\?]$/, '')
42
+ CASServer::CAS.clean_service_url(self.service) ==
43
+ CASServer::CAS.clean_service_url(service)
50
44
  end
51
45
  end
52
46
 
@@ -56,6 +50,10 @@ module CASServer::Models
56
50
 
57
51
  class TicketGrantingTicket < Ticket
58
52
  set_table_name 'casserver_tgt'
53
+
54
+ serialize :extra_attributes
55
+
56
+ has_many :service_tickets, :foreign_key => :tgt_id
59
57
  end
60
58
 
61
59
  class ProxyGrantingTicket < Ticket
@@ -187,4 +185,34 @@ module CASServer::Models
187
185
  end
188
186
  end
189
187
  end
188
+
189
+ class AddTgtToSt < V 0.7
190
+ def self.up
191
+ add_column :casserver_st, :tgt_id, :integer, :null => true
192
+ end
193
+
194
+ def self.down
195
+ remove_column :casserver_st, :tgt_id, :integer
196
+ end
197
+ end
198
+
199
+ class ChangeServiceToText < V 0.71
200
+ def self.up
201
+ change_column :casserver_st, :service, :text
202
+ end
203
+
204
+ def self.down
205
+ change_column :casserver_st, :service, :string
206
+ end
207
+ end
208
+
209
+ class AddExtraAttributes < V 0.72
210
+ def self.up
211
+ add_column :casserver_tgt, :extra_attributes, :text
212
+ end
213
+
214
+ def self.down
215
+ remove_column :casserver_tgt, :extra_attributes
216
+ end
217
+ end
190
218
  end
@@ -1,7 +1,7 @@
1
1
  module CASServer
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 6
4
+ MINOR = 7
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
@@ -3,7 +3,9 @@
3
3
 
4
4
  # need auto_validation off to render CAS responses and to use the autocomplete='off' property on password field
5
5
  Markaby::Builder.set(:auto_validation, false)
6
- Markaby::Builder.set(:indent, 2)
6
+
7
+ # disabled XML indentation because it was causing problems with mod_auth_cas
8
+ #Markaby::Builder.set(:indent, 2)
7
9
 
8
10
  module CASServer::Views
9
11
 
@@ -62,7 +64,7 @@ module CASServer::Views
62
64
  # Just the login form.
63
65
  def login_form
64
66
  form(:method => "post", :action => @form_action || '/login', :id => "login-form",
65
- :onsubmit => "submit = document.getElementById('login-submit'); submit.value='Please wait...'; submit.disabled=true; return true;") do
67
+ :onsubmit => "submitbutton = document.getElementById('login-submit'); submitbutton.value='Please wait...'; submitbutton.disabled=true; return true;") do
66
68
  table(:id => "form-layout") do
67
69
  tr do
68
70
  td(:id => "username-label-container") do
@@ -87,7 +89,6 @@ module CASServer::Views
87
89
  td(:id => "submit-container") do
88
90
  input(:type => "hidden", :id => "lt", :name => "lt", :value => @lt)
89
91
  input(:type => "hidden", :id => "service", :name => "service", :value => @service)
90
- input(:type => "hidden", :id => "warn", :name => "warn", :value => @warn)
91
92
  input(:type => "submit", :class => "button", :accesskey => "l", :value => "LOGIN", :tabindex => "4", :id => "login-submit")
92
93
  end
93
94
  end
@@ -143,6 +144,9 @@ module CASServer::Views
143
144
  tag!("cas:serviceResponse", 'xmlns:cas' => "http://www.yale.edu/tp/cas") do
144
145
  tag!("cas:authenticationSuccess") do
145
146
  tag!("cas:user") {@username.to_s.to_xs}
147
+ @extra_attributes.each do |key, value|
148
+ tag!(key) {serialize_extra_attribute(value)}
149
+ end
146
150
  if @pgtiou
147
151
  tag!("cas:proxyGrantingTicket") {@pgtiou.to_s.to_xs}
148
152
  end
@@ -162,6 +166,9 @@ module CASServer::Views
162
166
  tag!("cas:serviceResponse", 'xmlns:cas' => "http://www.yale.edu/tp/cas") do
163
167
  tag!("cas:authenticationSuccess") do
164
168
  tag!("cas:user") {@username.to_s.to_xs}
169
+ @extra_attributes.each do |key, value|
170
+ tag!(key) {serialize_extra_attribute(value)}
171
+ end
165
172
  if @pgtiou
166
173
  tag!("cas:proxyGrantingTicket") {@pgtiou.to_s.to_xs}
167
174
  end
@@ -201,25 +208,34 @@ module CASServer::Views
201
208
  end
202
209
 
203
210
  protected
204
- def themes_dir
205
- File.dirname(File.expand_path(__FILE__))+'../themes'
206
- end
207
- module_function :themes_dir
208
-
209
- def current_theme
210
- CASServer::Conf.theme || "simple"
211
- end
212
- module_function :current_theme
213
-
214
- def organization
215
- CASServer::Conf.organization || ""
216
- end
217
- module_function :organization
218
-
219
- def infoline
220
- CASServer::Conf.infoline || ""
221
- end
222
- module_function :infoline
211
+ def themes_dir
212
+ File.dirname(File.expand_path(__FILE__))+'../themes'
213
+ end
214
+ module_function :themes_dir
215
+
216
+ def current_theme
217
+ CASServer::Conf.theme || "simple"
218
+ end
219
+ module_function :current_theme
220
+
221
+ def organization
222
+ CASServer::Conf.organization || ""
223
+ end
224
+ module_function :organization
225
+
226
+ def infoline
227
+ CASServer::Conf.infoline || ""
228
+ end
229
+ module_function :infoline
230
+
231
+ def serialize_extra_attribute(value)
232
+ if value.kind_of?(String) || value.kind_of?(Numeric)
233
+ value
234
+ else
235
+ "<![CDATA[#{value.to_yaml}]]>"
236
+ end
237
+ end
238
+ module_function :serialize_extra_attribute
223
239
  end
224
240
 
225
241
  if CASServer::Conf.custom_views_file
data/lib/casserver.rb CHANGED
@@ -1,14 +1,17 @@
1
- $: << File.dirname(File.expand_path(__FILE__))
2
- require 'casserver/environment'
1
+ unless $APP_PATH
2
+ $APP_PATH = File.dirname(File.expand_path(__FILE__))
3
+ $: << $APP_PATH
4
+ end
3
5
 
4
- $APP_PATH ||= File.dirname(File.expand_path(__FILE__))
6
+ load "#{$APP_PATH}/lib/casserver/environment.rb"
5
7
 
6
8
  # change to current directory when invoked on its own
7
9
  Dir.chdir($APP_PATH) if __FILE__ == $0
8
10
 
9
- $: << $APP_PATH + "/../vendor/isaac_0.9.1"
11
+ $: << $APP_PATH + "/vendor/isaac_0.9.1"
10
12
  require 'crypt/ISAAC'
11
13
 
14
+
12
15
  require 'active_support'
13
16
  require 'yaml'
14
17
 
@@ -43,11 +46,11 @@ unless $CONF[:authenticator]
43
46
  exit 1
44
47
  end
45
48
 
46
- require 'casserver/utils'
47
- require 'casserver/models'
48
- require 'casserver/cas'
49
- require 'casserver/views'
50
- require 'casserver/controllers'
49
+ require "casserver/utils.rb"
50
+ require "casserver/models.rb"
51
+ require "casserver/cas.rb"
52
+ require "casserver/views.rb"
53
+ require "casserver/controllers.rb"
51
54
 
52
55
  if $CONF[:authenticator].instance_of? Array
53
56
  $CONF[:authenticator].each_index do |auth_index|
@@ -72,6 +75,7 @@ rescue NameError
72
75
  else
73
76
  # the authenticator class hasn't yet been loaded, so lets try to load it from the casserver/authenticators directory
74
77
  auth_rb = authenticator[:class].underscore.gsub('cas_server/', '')
78
+
75
79
  require 'casserver/'+auth_rb
76
80
  end
77
81
  $AUTH << authenticator[:class].constantize.new
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__)+'/../casserver/version.rb'
@@ -1 +1 @@
1
- require 'lib/casserver'
1
+ require 'casserver'
File without changes
File without changes