Skip to content

Commit 6e55ee0

Browse files
committed
refactor module methods, fix tests
move module-based tickets generation api to Generations module transform validations/generations to instance methods fix tests let instead of instance vars minor changes
1 parent a4ec95f commit 6e55ee0

File tree

7 files changed

+239
-125
lines changed

7 files changed

+239
-125
lines changed

lib/rubycas-server-core.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
require "rubycas-server-core/settings"
77
require "rubycas-server-core/database"
88
require "rubycas-server-core/util"
9+
require "rubycas-server-core/tickets/generations"
910
require "rubycas-server-core/tickets/validations"
1011
require "rubycas-server-core/tickets"
1112

lib/rubycas-server-core/error.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,11 @@ def to_s
1414
message
1515
end
1616
end
17+
18+
class RubyCASServerCoreError < StandardError
19+
end
20+
21+
class RecordNotFound < RubyCASServerCoreError
22+
end
1723
end
1824
end

lib/rubycas-server-core/tickets.rb

Lines changed: 11 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,18 @@ module RubyCAS
44
module Server
55
module Core
66
module Tickets
7-
87
class LT
9-
include ::RubyCAS::Server::Core
10-
include ::RubyCAS::Server::Core::Tickets
8+
extend ::RubyCAS::Server::Core::Tickets::Generations
119
extend ::RubyCAS::Server::Core::Tickets::Validations
1210

1311
def self.create!(client = "localhost")
14-
lt = Tickets.generate_login_ticket(client)
12+
lt = generate_login_ticket(client)
1513
raise 'error that should be handled by rubycas-server-core gem' if !lt
1614
return lt
1715
end
1816

1917
def self.create(client = "localhost")
20-
Tickets.generate_login_ticket(client)
18+
generate_login_ticket(client)
2119
end
2220

2321
def self.validate(lt)
@@ -40,20 +38,19 @@ def self.find_by!(options)
4038
end
4139

4240
class TGT
43-
include ::RubyCAS::Server::Core
44-
include ::RubyCAS::Server::Core::Tickets
41+
extend ::RubyCAS::Server::Core::Tickets::Generations
4542
extend ::RubyCAS::Server::Core::Tickets::Validations
4643

47-
def self.create!(user, client = "localhost", remember_me = false, extra_attributes)
48-
tgt = Tickets.generate_ticket_granting_ticket(
44+
def self.create!(user, client = "localhost", remember_me = false, extra_attributes = {})
45+
tgt = generate_ticket_granting_ticket(
4946
user, client, remember_me, extra_attributes
5047
)
5148
raise 'error that should be handled by rubycas-server-core gem' if !tgt
5249
return tgt
5350
end
5451

55-
def self.create(user, client = "localhost", remember_me = false, extra_attributes)
56-
Tickets.generate_ticket_granting_ticket(
52+
def self.create(user, client = "localhost", remember_me = false, extra_attributes = {})
53+
generate_ticket_granting_ticket(
5754
user, client, remember_me, extra_attributes
5855
)
5956
end
@@ -79,18 +76,17 @@ def self.find_by!(options)
7976
end
8077

8178
class ST
82-
include ::RubyCAS::Server::Core
83-
include ::RubyCAS::Server::Core::Tickets
79+
extend ::RubyCAS::Server::Core::Tickets::Generations
8480
extend ::RubyCAS::Server::Core::Tickets::Validations
8581

8682
def self.create!(service, user, tgt, client="localhost")
87-
st = Tickets.generate_service_ticket(service, user, tgt, client)
83+
st = generate_service_ticket(service, user, tgt, client)
8884
raise 'error that should be handled by rubycas-server-core gem' if !st
8985
return st
9086
end
9187

9288
def self.create(service, user, tgt, client="localhost")
93-
Tickets.generate_service_ticket(service, user, tgt, client)
89+
generate_service_ticket(service, user, tgt, client)
9490
end
9591

9692
def self.validate(service, ticket)
@@ -126,72 +122,6 @@ def self.build_ticketed_url(service, ticket)
126122
Util.build_ticketed_url(service, ticket)
127123
end
128124
end
129-
130-
131-
# One time login ticket for given client
132-
def self.generate_login_ticket(client)
133-
lt = LoginTicket.new
134-
lt.ticket = "LT-" + Util.random_string
135-
lt.client_hostname = client
136-
if lt.save!
137-
$LOG.debug("Login ticket '#{lt.ticket} has been created for '#{lt.client_hostname}'")
138-
return lt
139-
else
140-
return nil
141-
end
142-
end
143-
144-
# Creates a TicketGrantingTicket for the given username. This is done when the user logs in
145-
# for the first time to establish their SSO session (after their credentials have been validated).
146-
#
147-
# The optional 'extra_attributes' parameter takes a hash of additional attributes
148-
# that will be sent along with the username in the CAS response to subsequent
149-
# validation requests from clients.
150-
def self.generate_ticket_granting_ticket(
151-
username,
152-
client,
153-
remember_me = false,
154-
extra_attributes = {}
155-
)
156-
tgt = TicketGrantingTicket.new
157-
tgt.ticket = "TGC-" + Util.random_string
158-
tgt.username = username
159-
tgt.remember_me = remember_me
160-
tgt.extra_attributes = extra_attributes.to_s
161-
tgt.client_hostname = client
162-
if tgt.save!
163-
$LOG.debug("Generated ticket granting ticket '#{tgt.ticket}' for user" +
164-
" '#{tgt.username}' at '#{tgt.client_hostname}'" +
165-
(extra_attributes.empty? ? "" : " with extra attributes #{extra_attributes.inspect}"))
166-
return tgt
167-
else
168-
return nil
169-
end
170-
end
171-
172-
def self.generate_service_ticket(service, username, tgt, client)
173-
st = tgt.service_tickets.new
174-
st.ticket = "ST-" + Util.random_string
175-
st.service = service
176-
st.username = username
177-
st.ticket_granting_ticket = tgt
178-
st.client_hostname = client
179-
if st.save
180-
$LOG.debug("Generated service ticket '#{st.ticket}' for service '#{st.service}'" +
181-
" for user '#{st.username}' at '#{st.client_hostname}'")
182-
return st
183-
else
184-
return nil
185-
end
186-
end
187-
188-
def self.generate_proxy_ticket(target_service, pgt, client)
189-
raise NotImplementedError
190-
end
191-
192-
def self.generate_proxy_granting_ticket(pgt_url, st, client)
193-
raise NotImplementedError
194-
end
195125
end
196126
end
197127
end
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
require 'rubycas-server-core/util'
2+
3+
module RubyCAS
4+
module Server
5+
module Core
6+
module Tickets
7+
module Generations
8+
# One time login ticket for given client
9+
def generate_login_ticket(client)
10+
lt = LoginTicket.new
11+
lt.ticket = "LT-" + Util.random_string
12+
lt.client_hostname = client
13+
if lt.save!
14+
$LOG.debug("Login ticket '#{lt.ticket} has been created for '#{lt.client_hostname}'")
15+
return lt
16+
else
17+
return nil
18+
end
19+
end
20+
21+
# Creates a TicketGrantingTicket for the given username. This is done when the user logs in
22+
# for the first time to establish their SSO session (after their credentials have been validated).
23+
#
24+
# The optional 'extra_attributes' parameter takes a hash of additional attributes
25+
# that will be sent along with the username in the CAS response to subsequent
26+
# validation requests from clients.
27+
def generate_ticket_granting_ticket(
28+
username,
29+
client,
30+
remember_me = false,
31+
extra_attributes = {}
32+
)
33+
tgt = TicketGrantingTicket.new
34+
tgt.ticket = "TGC-" + Util.random_string
35+
tgt.username = username
36+
tgt.remember_me = remember_me
37+
tgt.extra_attributes = extra_attributes.to_s
38+
tgt.client_hostname = client
39+
if tgt.save!
40+
$LOG.debug("Generated ticket granting ticket '#{tgt.ticket}' for user" +
41+
" '#{tgt.username}' at '#{tgt.client_hostname}'" +
42+
(extra_attributes.empty? ? "" : " with extra attributes #{extra_attributes.inspect}"))
43+
return tgt
44+
else
45+
return nil
46+
end
47+
end
48+
49+
def generate_service_ticket(service, username, tgt, client)
50+
st = tgt.service_tickets.new
51+
st.ticket = "ST-" + Util.random_string
52+
st.service = service
53+
st.username = username
54+
st.ticket_granting_ticket = tgt
55+
st.client_hostname = client
56+
if st.save
57+
$LOG.debug("Generated service ticket '#{st.ticket}' for service '#{st.service}'" +
58+
" for user '#{st.username}' at '#{st.client_hostname}'")
59+
return st
60+
else
61+
return nil
62+
end
63+
end
64+
65+
def generate_proxy_ticket(target_service, pgt, client)
66+
raise NotImplementedError
67+
end
68+
69+
def generate_proxy_granting_ticket(pgt_url, st, client)
70+
raise NotImplementedError
71+
end
72+
end
73+
end
74+
end
75+
end
76+
end
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
require "spec_helper"
2+
3+
module RubyCAS::Server::Core::Tickets
4+
describe RubyCAS::Server::Core::Tickets::Generations do
5+
let(:client_hostname) { 'myhost.test' }
6+
let(:username) { 'myuser' }
7+
let(:service) { 'https://myservice.test' }
8+
9+
before do
10+
RubyCAS::Server::Core.setup("spec/config/config.yml")
11+
@generations = Class.new
12+
@generations.extend(RubyCAS::Server::Core::Tickets::Generations)
13+
end
14+
15+
describe '.generate_login_ticket(client_hostname)' do
16+
before do
17+
@lt = @generations.generate_login_ticket(client_hostname)
18+
end
19+
20+
it "should return a login ticket" do
21+
@lt.class.should == LoginTicket
22+
end
23+
24+
it "should set the client_hostname" do
25+
@lt.client_hostname.should == client_hostname
26+
end
27+
28+
it "should set the ticket string" do
29+
@lt.ticket.should_not be_nil
30+
end
31+
32+
it "should set the ticket string starting with 'LT'" do
33+
@lt.ticket.should(match(/^LT/))
34+
end
35+
36+
it "should not mark the ticket as consumed" do
37+
@lt.consumed.should be_nil
38+
end
39+
end
40+
41+
describe ".generate_ticket_granting_ticket(username, extra_attributes = {})" do
42+
before do
43+
@tgt = @generations.generate_ticket_granting_ticket(username, client_hostname)
44+
end
45+
46+
it "should return a TicketGrantingTicket" do
47+
@tgt.class.should == TicketGrantingTicket
48+
end
49+
50+
it "should set the tgt's ticket string" do
51+
@tgt.ticket.should_not be_nil
52+
end
53+
54+
it "should generate a ticket string starting with 'TGC'" do
55+
@tgt.ticket.should(match(/^TGC/))
56+
end
57+
58+
it "should set the tgt's username string" do
59+
@tgt.username.should == username
60+
end
61+
62+
it "should set the tgt's client_hostname" do
63+
@tgt.client_hostname.should == client_hostname
64+
end
65+
end
66+
67+
describe ".generate_service_ticket(service, username, tgt)" do
68+
before do
69+
@tgt = @generations.generate_ticket_granting_ticket(username, client_hostname)
70+
@st = @generations.generate_service_ticket(service, username, @tgt, client_hostname)
71+
end
72+
73+
it "should return a ServiceTicket" do
74+
@st.class.should == ServiceTicket
75+
end
76+
77+
it "should not include the service identifer in the ticket string" do
78+
@st.ticket.should_not(match(/#{service}/))
79+
end
80+
81+
it "should not mark the ST as consumed" do
82+
@st.consumed.should be_nil
83+
end
84+
85+
it "must generate a ticket that starts with 'ST-'" do
86+
@st.ticket.should(match(/^ST-/))
87+
end
88+
89+
it "should assoicate the ST with the supplied TGT" do
90+
@st.ticket_granting_ticket.id.should == @tgt.id
91+
end
92+
end
93+
94+
describe ".generate_proxy_ticket(target_service, pgt)" do
95+
it "should return a ProxyGrantingTicket" do
96+
skip('Not supported')
97+
end
98+
99+
it "should not consume the generated ticket" do
100+
skip('Not supported')
101+
end
102+
103+
it "should start the ticket string with PT-" do
104+
skip('Not supported')
105+
end
106+
end
107+
end
108+
end
109+

0 commit comments

Comments
 (0)