Skip to content

Commit 8ae828f

Browse files
committed
1) Add validation tests (+ error class in order to pass)
2) Fixed login ticket lifetime bug (maximum_unused_login_ticket_lifetime was not used in login ticket validation) 3) Add remember_me functionality in the core 4) Change how service tickets are generated. Now each service tickets inherits from TicketGrantingTicket in a way to imitate activerecord's belongs_to/has_many. 5) Other minor improvements 6) Tested with rubycas-server-rails engine
1 parent 1111652 commit 8ae828f

File tree

13 files changed

+148
-70
lines changed

13 files changed

+148
-70
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
*.gem
22
*.rbc
3+
log
34
.bundle
45
.config
56
.yardoc
@@ -16,3 +17,4 @@ test/tmp
1617
test/version_tmp
1718
tmp
1819
*.DS_Store
20+
*.db

Gemfile

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,2 @@
11
source 'https://rubygems.org'
22
gemspec
3-
4-
group :development do
5-
# for gems that are nice in development
6-
# but don't break the build when missing
7-
# Example: debugger
8-
gem 'debugger'
9-
gem "guard"
10-
gem "guard-rspec"
11-
12-
gem 'rb-inotify', :require => false
13-
gem 'rb-fsevent', :require => false
14-
gem 'rb-fchange', :require => false
15-
end
16-
17-
group :test do
18-
gem 'rake'
19-
gem 'rspec'
20-
end

lib/rubycas-server-core.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require "logger"
22
require "r18n-core"
33
require "rubycas-server-core/version"
4+
require "rubycas-server-core/error"
45
require "rubycas-server-core/authenticator"
56
require "rubycas-server-core/settings"
67
require "rubycas-server-core/database"

lib/rubycas-server-core/adapters/in_memory/service_ticket.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module RubyCAS
22
module Server
33
module Core
44
module Tickets
5-
class ServiceTicket < Storage
5+
class ServiceTicket < RubyCAS::Server::Core::Tickets::TicketGrantingTicket
66

77
attr_accessor :id, :ticket, :consumed, :client_hostname,
88
:username, :created_at, :updated_at, :proxy_granting_ticket,

lib/rubycas-server-core/adapters/in_memory/storage.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ def save
1616
return true
1717
end
1818

19+
def save!
20+
self.class.storage[@id] = self
21+
return true
22+
end
23+
1924
end
2025
end
2126
end

lib/rubycas-server-core/adapters/in_memory/ticket_granting_ticket.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module Tickets
55
class TicketGrantingTicket < Storage
66
attr_accessor :id, :ticket, :client_hostname, :username,
77
:extra_attributes, :service_tickets, :proxy_tickets,
8-
:created_at, :updated_at
8+
:remember_me, :created_at, :updated_at
99

1010
def initialize(tgt = {})
1111
@id = SecureRandom.uuid
@@ -15,6 +15,7 @@ def initialize(tgt = {})
1515
@extra_attributes = tgt[:extra_attributes]
1616
@service_tickets = tgt[:service_tickets]
1717
@proxy_tickets = tgt[:proxy_tickets]
18+
@remember_me = tgt[:remember_me]
1819
@created_at = DateTime.now
1920
@updated_at = DateTime.now
2021
super()
@@ -31,6 +32,10 @@ def expired?(max_lifetime)
3132
lifetime = Time.now.to_i - created_at.to_time.to_i
3233
lifetime > max_lifetime
3334
end
35+
36+
def service_tickets
37+
ServiceTicket
38+
end
3439
end
3540
end
3641
end

lib/rubycas-server-core/error.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module RubyCAS::Server::Core
2+
# TODO: Add better dependency injection
3+
# TODO: add predefined messages/errors
4+
module Error
5+
class Error
6+
attr_reader :code, :message
7+
8+
def initialize(code, message)
9+
@code = code
10+
@message = message
11+
end
12+
13+
def to_s
14+
message
15+
end
16+
end
17+
end
18+
end

lib/rubycas-server-core/tickets.rb

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def self.generate_login_ticket(client)
1010
lt = LoginTicket.new
1111
lt.ticket = "LT-" + Util.random_string
1212
lt.client_hostname = client
13-
if lt.save
13+
if lt.save!
1414
$LOG.debug("Login ticket '#{lt.ticket} has been created for '#{lt.client_hostname}'")
1515
return lt
1616
else
@@ -24,13 +24,19 @@ def self.generate_login_ticket(client)
2424
# The optional 'extra_attributes' parameter takes a hash of additional attributes
2525
# that will be sent along with the username in the CAS response to subsequent
2626
# validation requests from clients.
27-
def self.generate_ticket_granting_ticket(username, client, extra_attributes = {})
27+
def self.generate_ticket_granting_ticket(
28+
username,
29+
client,
30+
remember_me = false,
31+
extra_attributes = {}
32+
)
2833
tgt = TicketGrantingTicket.new
2934
tgt.ticket = "TGC-" + Util.random_string
3035
tgt.username = username
31-
tgt.extra_attributes = extra_attributes
36+
tgt.remember_me = remember_me
37+
tgt.extra_attributes = extra_attributes.to_s
3238
tgt.client_hostname = client
33-
if tgt.save
39+
if tgt.save!
3440
$LOG.debug("Generated ticket granting ticket '#{tgt.ticket}' for user" +
3541
" '#{tgt.username}' at '#{tgt.client_hostname}'" +
3642
(extra_attributes.empty? ? "" : " with extra attributes #{extra_attributes.inspect}"))
@@ -41,7 +47,7 @@ def self.generate_ticket_granting_ticket(username, client, extra_attributes = {}
4147
end
4248

4349
def self.generate_service_ticket(service, username, tgt, client)
44-
st = ServiceTicket.new
50+
st = tgt.service_tickets.new
4551
st.ticket = "ST-" + Util.random_string
4652
st.service = service
4753
st.username = username

lib/rubycas-server-core/tickets/validations.rb

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
require "rubycas-server-core/error"
2+
13
module RubyCAS::Server::Core::Tickets
24
module Validations
35
include R18n::Helpers
6+
include RubyCAS::Server::Core::Error
47

58
# Validate login ticket
69
#
@@ -17,11 +20,11 @@ def validate_login_ticket(ticket)
1720
if lt.consumed?
1821
error = t.error.login_ticket_already_used
1922
$LOG.warn "Login ticket '#{ticket}' already consumed!"
20-
elsif not lt.expired?(RubyCAS::Server::Core::Settings.maximum_unused_service_ticket_lifetime)
23+
elsif not lt.expired?(RubyCAS::Server::Core::Settings.maximum_unused_login_ticket_lifetime)
2124
$LOG.info "Login ticket '#{ticket}' successfully validated"
2225
lt.consume!
2326
success = true
24-
elsif lt.expired?(RubyCAS::Server::Core::Settings.maximum_unused_service_ticket_lifetime)
27+
elsif lt.expired?(RubyCAS::Server::Core::Settings.maximum_unused_login_ticket_lifetime)
2528
error = t.error.login_timeout
2629
$LOG.warn "Expired login ticket '#{ticket}'"
2730
end
@@ -38,7 +41,13 @@ def validate_ticket_granting_ticket(ticket)
3841
$LOG.debug "No ticket granting ticket given." if ticket.nil?
3942

4043
if tgt = TicketGrantingTicket.find_by_ticket(ticket)
41-
if tgt.expired?(RubyCAS::Server::Core::Settings.maximum_session_lifetime)
44+
if tgt.remember_me
45+
max_lifetime = RubyCAS::Server::Core::Settings.maximum_session_lifetime
46+
else
47+
max_lifetime = RubyCAS::Server::Core::Settings.maximum_remember_me_lifetime
48+
end
49+
50+
if tgt.expired?(max_lifetime)
4251
tgt.destroy
4352
error = "Your session has expired. Please log in again."
4453
$LOG.info "Ticket granting ticket '#{ticket}' for user '#{tgt.username}' expired."

rubycas-server-core.gemspec

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,8 @@ Gem::Specification.new do |gem|
1919

2020
gem.add_dependency "r18n-core"
2121
gem.add_dependency "activesupport", ">= 3.0"
22+
23+
gem.add_development_dependency "rake"
24+
gem.add_development_dependency "rspec"
25+
gem.add_development_dependency "bundler"
2226
end

0 commit comments

Comments
 (0)