Skip to content

Commit 012813d

Browse files
committed
Vital changes for Rails integration
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 Fix exception for activerecord adapter Add rake to gemfile Remove duplicate gem Add rspec to gemfile method overloading in setup hash or file
1 parent 1111652 commit 012813d

File tree

15 files changed

+156
-73
lines changed

15 files changed

+156
-73
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: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,5 @@
11
source 'https://rubygems.org'
22
gemspec
33

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
4+
gem 'rake'
5+
gem 'rspec'

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/database.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module Core
44
module Database
55
extend self
66
def setup(config_file)
7-
raise NotImplementedError, "Database adapter is missing, add it to your Gemfile, please refer to https://github.com/rubycas/rubycas-server-core/wiki for more details"
7+
#raise NotImplementedError, "Database adapter is missing, add it to your Gemfile, please refer to https://github.com/rubycas/rubycas-server-core/wiki for more details"
88
end
99
end
1010
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/settings.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ module Settings
1111
@_settings = HashWithIndifferentAccess.new
1212
attr_reader :_settings
1313

14-
def load!(file_name)
15-
config = YAML::load_file(file_name).with_indifferent_access
16-
@_settings.merge!(config)
14+
def load!(config)
15+
if config.is_a? String
16+
config = YAML::load_file(config).with_indifferent_access
17+
elsif config.is_a? Hash
18+
@_settings.merge!(config)
19+
end
1720
end
1821

1922
def method_missing(name, *args, &block)

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

0 commit comments

Comments
 (0)