Class: Castronaut::Models::ServiceTicket

Inherits:
ActiveRecord::Base
  • Object
show all
Includes:
Consumeable, Dispenser
Defined in:
lib/castronaut/models/service_ticket.rb

Direct Known Subclasses

ProxyTicket

Constant Summary collapse

MissingMessage =
"Ticket or service parameter was missing in the request."

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Consumeable

#consume!, #consumed?

Class Method Details

.generate_ticket_for(service, client_host, ticket_granting_ticket) ⇒ Object



19
20
21
22
23
24
# File 'lib/castronaut/models/service_ticket.rb', line 19

def self.generate_ticket_for(service, client_host, ticket_granting_ticket)
  create! :service => service,
          :username => ticket_granting_ticket.username,
          :client_hostname => client_host,
          :ticket_granting_ticket => ticket_granting_ticket
end

.validate_ticket(service, ticket, allow_proxy_tickets = false) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/castronaut/models/service_ticket.rb', line 26

def self.validate_ticket(service, ticket, allow_proxy_tickets = false)

  return Castronaut::TicketResult.new(nil, MissingMessage, "INVALID_REQUEST") unless service && ticket

  service_ticket = find_by_ticket(ticket)

  return Castronaut::TicketResult.new(nil, "Ticket #{ticket} not recognized.", "INVALID_TICKET") unless service_ticket

  return Castronaut::TicketResult.new(service_ticket, "Ticket '#{ticket}' has already been used up.", "INVALID_TICKET") if service_ticket.consumed?

  service_ticket.consume!

  if service_ticket === Castronaut::Models::ProxyTicket && !allow_proxy_tickets
    return Castronaut::TicketResult.new(service_ticket, "Ticket '#{ticket}' is a proxy ticket, but only service tickets are allowed here.", "INVALID_TICKET")
  end

  return Castronaut::TicketResult.new(service_ticket, "Ticket '#{ticket}' has expired.", "INVALID_TICKET") if service_ticket.expired?

  mismatched_service_message = "The ticket '#{ticket}' belonging to user '#{service_ticket.username}' is valid, but the requested service '#{service}' does not match the service '#{service_ticket.service}' associated with this ticket."

  return Castronaut::TicketResult.new(service_ticket, mismatched_service_message, "INVALID_SERVICE") unless service_ticket.matches_service?(service)

  Castronaut::TicketResult.new(service_ticket, nil, "success")
end

Instance Method Details

#expired?Boolean

Returns:

  • (Boolean)


81
82
83
# File 'lib/castronaut/models/service_ticket.rb', line 81

def expired?
  # Time.now - service_ticket.created_on > CASServer::Conf.service_ticket_expiry
end

#matches_service?(other_service) ⇒ Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/castronaut/models/service_ticket.rb', line 51

def matches_service?(other_service)
  service == other_service
end

#proxiesObject



85
86
# File 'lib/castronaut/models/service_ticket.rb', line 85

def proxies
end

#service_uriObject



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/castronaut/models/service_ticket.rb', line 55

def service_uri
  return nil if service.blank?

  begin
    raw_uri = URI.parse(service)

    if service.include? "?"
      if raw_uri.query.empty?
        query_separator = ""
      else
        query_separator = "&"
      end
    else
      query_separator = "?"
    end

    "#{service}#{query_separator}ticket=#{ticket}"
  rescue URI::InvalidURIError
    nil
  end
end

#ticket_prefixObject



77
78
79
# File 'lib/castronaut/models/service_ticket.rb', line 77

def ticket_prefix
  "ST"
end