cassette 1.1.5 → 1.2.0.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0e9da653330f2b19a49cd4710abfc4ab68f38dac
4
- data.tar.gz: 97863b30cdbfdc0455b1296bd893eef92d505f9a
3
+ metadata.gz: 36477f617205d04852d5cbfbfecfa50c804979a4
4
+ data.tar.gz: 25cd9472c3cd2f16896a89330fc7512b6e693afc
5
5
  SHA512:
6
- metadata.gz: e6ef4f0b1a396d3de5e01f404a156717fc0f1db0738874e1bcb5bbf74a6a67f6fd791706834730217d6c7118e13a1b63cb42b3331636d1260d386afb746d0b33
7
- data.tar.gz: fc589953459901c2539d126cf09944caf2a7898b4a402ac83aa5894a428384d59103948eee935277193837a3d297c6c37da537792108bf47ba5a32fdcc8d9800
6
+ metadata.gz: 97cc8d0ee09138579a8aa99ab4c98938206806c06cf72c685c5cfb9de534203ee77351ab0dca094bd7517dd19a27b45fbe241c74283fa39daf75cda206aa7e84
7
+ data.tar.gz: 9f7afb92efbb6d7b330a108a9b2cbf1dce9f6839e9e104e91e5f1700288c95dfdab4f59555db34773a4b4d1ea958ee97ec89bb87fea71898fb56ad50a23c3739
@@ -1,14 +1,12 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'active_support/concern'
4
3
  require 'cassette/authentication/user'
5
4
 
6
5
  module Cassette
7
6
  class Authentication
8
7
  module Filter
9
- extend ActiveSupport::Concern
10
-
11
- included do |controller|
8
+ def self.included(controller)
9
+ controller.extend(ClassMethods)
12
10
  controller.before_action(:validate_authentication_ticket)
13
11
  controller.send(:attr_accessor, :current_user)
14
12
  end
@@ -2,13 +2,15 @@
2
2
 
3
3
  require 'cassette/authentication'
4
4
  require 'cassette/authentication/authorities'
5
- require 'delegate'
5
+ require 'forwardable'
6
6
 
7
7
  module Cassette
8
8
  class Authentication
9
9
  class User
10
+ extend Forwardable
11
+
10
12
  attr_accessor :login, :name, :authorities, :email, :ticket, :type
11
- delegate :has_role?, :has_raw_role?, to: :@authorities
13
+ def_delegators :@authorities, :has_role?, :has_raw_role?
12
14
 
13
15
  def initialize(attrs = {})
14
16
  config = attrs[:config]
@@ -31,7 +31,7 @@ module Cassette
31
31
  begin
32
32
  logger.info("Validating #{ticket} on #{validate_path}")
33
33
 
34
- response = http.get(validate_path, ticket: ticket, service: service).body
34
+ response = http.post(validate_path, ticket: ticket, service: service).body
35
35
  ticket_response = Http::TicketResponse.new(response)
36
36
 
37
37
  logger.info("Validation resut: #{response.inspect}")
@@ -54,29 +54,6 @@ module Cassette
54
54
 
55
55
  attr_accessor :cache, :logger, :http, :config
56
56
 
57
- def try_content(node, *keys)
58
- keys.inject(node) do |a, e|
59
- a.try(:[], e)
60
- end.try(:[], '__content__')
61
- end
62
-
63
- def extract_user(xml, ticket)
64
- ActiveSupport::XmlMini.with_backend('LibXML') do
65
- result = ActiveSupport::XmlMini.parse(xml)
66
-
67
- login = try_content(result, 'serviceResponse', 'authenticationSuccess', 'user')
68
-
69
- if login
70
- attributes = result['serviceResponse']['authenticationSuccess']['attributes']
71
- name = try_content(attributes, 'cn')
72
- authorities = try_content(attributes, 'authorities')
73
-
74
- Cassette::Authentication::User.new(login: login, name: name, authorities: authorities,
75
- ticket: ticket, config: config)
76
- end
77
- end
78
- end
79
-
80
57
  def validate_path
81
58
  "/serviceValidate"
82
59
  end
@@ -0,0 +1,34 @@
1
+ # encoding: UTF-8
2
+
3
+ module Cassette
4
+ module Cache
5
+ # You cache nothing, null store
6
+ #
7
+ # This is a fallback class when Rails or ActiveSupport cache cannot
8
+ # be loaded
9
+ class NullStore
10
+ def clear
11
+ end
12
+
13
+ def read(_key, _options)
14
+ nil
15
+ end
16
+
17
+ def delete_matched(_key)
18
+ true
19
+ end
20
+
21
+ def write(_key, _value, _options)
22
+ true
23
+ end
24
+
25
+ def increment(_key)
26
+ 0
27
+ end
28
+
29
+ def fetch(_key, _options, &block)
30
+ block.call
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,6 +1,10 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'active_support/cache'
3
+ begin
4
+ require 'active_support/cache'
5
+ rescue LoadError
6
+ require 'cassette/cache/null_store'
7
+ end
4
8
 
5
9
  module Cassette
6
10
  module Cache
@@ -8,8 +12,10 @@ module Cassette
8
12
  @backend ||= begin
9
13
  if defined?(::Rails) && ::Rails.cache
10
14
  ::Rails.cache
11
- else
15
+ elsif defined?(::ActiveSupport::Cache::MemoryStore)
12
16
  ActiveSupport::Cache::MemoryStore.new
17
+ else
18
+ NullStore.new
13
19
  end
14
20
  end
15
21
  end
@@ -1,16 +1,14 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'active_support/inflector'
4
-
5
3
  module Cassette
6
4
  module Errors
7
5
  TYPES = {
8
- 401 => :authorization_required,
9
- 400 => :bad_request,
10
- 403 => :forbidden,
11
- 500 => :internal_server_error,
12
- 404 => :not_found,
13
- 412 => :precondition_failed
6
+ 401 => :AuthorizationRequired,
7
+ 400 => :BadRequest,
8
+ 403 => :Forbidden,
9
+ 500 => :InternalServerError,
10
+ 404 => :NotFound,
11
+ 412 => :PreconditionFailed
14
12
  }
15
13
 
16
14
  def self.raise_by_code(code)
@@ -19,12 +17,12 @@ module Cassette
19
17
  if name
20
18
  fail error_class(name)
21
19
  else
22
- fail error_class(:internal_server_error)
20
+ fail error_class(:InternalServerError)
23
21
  end
24
22
  end
25
23
 
26
24
  def self.error_class(name)
27
- "Cassette::Errors::#{name.to_s.camelize}".constantize
25
+ Cassette::Errors.const_get(name)
28
26
  end
29
27
 
30
28
  class Base < StandardError
@@ -34,7 +32,7 @@ module Cassette
34
32
  end
35
33
 
36
34
  TYPES.each do |status, name|
37
- const_set(name.to_s.camelize, Class.new(Errors::Base))
35
+ const_set(name, Class.new(Errors::Base))
38
36
  error_class(name).const_set('CODE', status)
39
37
  end
40
38
  end
@@ -17,13 +17,6 @@ module Cassette
17
17
  end
18
18
  end
19
19
 
20
- def get(path, payload, timeout = DEFAULT_TIMEOUT)
21
- perform(:get, path) do |req|
22
- req.params = payload
23
- req.options.timeout = timeout
24
- end
25
- end
26
-
27
20
  private
28
21
 
29
22
  attr_accessor :config
@@ -1,47 +1,30 @@
1
+ require 'rexml/document'
2
+ require 'rexml/xpath'
3
+
1
4
  module Cassette
2
5
  module Http
3
6
  class TicketResponse
4
- def initialize(response)
5
- @content = ParsedResponse.new(response)
6
- end
7
-
8
- def login
9
- fetch_val(
10
- content,
11
- 'serviceResponse',
12
- 'authenticationSuccess',
13
- 'user',
14
- '__content__'
15
- )
16
- end
17
-
18
- def name
19
- fetch_val(attributes, 'cn', '__content__')
20
- end
21
-
22
- def authorities
23
- fetch_val(attributes, 'authorities', '__content__')
24
- end
25
-
26
- private
27
-
28
- attr_reader :content
29
-
30
- def fetch_val(hash, *keys)
31
- keys.reduce(hash, &access_key)
32
- end
33
-
34
- def access_key
35
- lambda { |hash, key| hash.try(:[], key) }
36
- end
7
+ attr_reader :login, :name, :authorities
37
8
 
38
- def attributes
39
- fetch_val(
40
- content,
41
- 'serviceResponse',
42
- 'authenticationSuccess',
43
- 'attributes'
44
- )
9
+ def initialize(response)
10
+ namespaces = { "cas" => "http://www.yale.edu/tp/cas" }
11
+ query = "//cas:serviceResponse/cas:authenticationSuccess/cas:user"
12
+
13
+ document = REXML::Document.new(response)
14
+ element = REXML::XPath.first(document, query, namespaces)
15
+ @login = element.try(:text)
16
+
17
+ if @login
18
+ attributes_query =
19
+ "//cas:serviceResponse/cas:authenticationSuccess/cas:attributes"
20
+ attributes = Hash[REXML::XPath.
21
+ first(document, attributes_query, namespaces).
22
+ elements.
23
+ map { |e| [e.name, e.text] }]
24
+
25
+ @name = attributes['cn']
26
+ @authorities = attributes['authorities']
27
+ end
45
28
  end
46
29
  end
47
30
  end
data/lib/cassette/http.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require_relative 'http/request'
2
- require_relative 'http/parsed_response'
3
2
  require_relative 'http/ticket_response'
4
3
 
5
4
  module Cassette
@@ -1,8 +1,6 @@
1
1
  module Cassette
2
2
  module Rubycas
3
3
  module UserFactory
4
- extend ActiveSupport::Concern
5
-
6
4
  def from_session(session)
7
5
  attributes = session[:cas_extra_attributes]
8
6
  Cassette::Authentication::User.new(login: session[:cas_user],
@@ -1,8 +1,8 @@
1
1
  module Cassette
2
2
  class Version
3
3
  MAJOR = '1'
4
- MINOR = '1'
5
- PATCH = '5'
4
+ MINOR = '2'
5
+ PATCH = '0.pre'
6
6
 
7
7
  def self.version
8
8
  [MAJOR, MINOR, PATCH].join('.')
data/lib/cassette.rb CHANGED
@@ -12,9 +12,11 @@ require 'cassette/authentication/cache'
12
12
  require 'cassette/authentication/filter'
13
13
 
14
14
  require 'faraday'
15
+ require 'forwardable'
15
16
  require 'logger'
16
17
 
17
18
  module Cassette
19
+ extend Forwardable
18
20
  extend self
19
21
 
20
22
  attr_writer :config, :logger
@@ -35,5 +37,5 @@ module Cassette
35
37
  @config if defined?(@config)
36
38
  end
37
39
 
38
- delegate :post, to: :'Http::Request'
40
+ def_delegators Http::Request, :post
39
41
  end
@@ -45,13 +45,13 @@ describe Cassette::Authentication do
45
45
  end
46
46
 
47
47
  it 'raises a Forbidden exception on any exceptions' do
48
- allow(http).to receive(:get).with(anything, anything).and_raise(Cassette::Errors::BadRequest)
48
+ allow(http).to receive(:post).with(anything, anything).and_raise(Cassette::Errors::BadRequest)
49
49
  expect { subject.ticket_user('ticket') }.to raise_error(Cassette::Errors::Forbidden)
50
50
  end
51
51
 
52
52
  context 'with a failed CAS response' do
53
53
  before do
54
- allow(http).to receive(:get).with(anything, anything)
54
+ allow(http).to receive(:post).with(anything, anything)
55
55
  .and_return(OpenStruct.new(body: fixture('cas/fail.xml')))
56
56
  end
57
57
 
@@ -62,7 +62,7 @@ describe Cassette::Authentication do
62
62
 
63
63
  context 'with a successful CAS response' do
64
64
  before do
65
- allow(http).to receive(:get).with(anything, anything)
65
+ allow(http).to receive(:post).with(anything, anything)
66
66
  .and_return(OpenStruct.new(body: fixture('cas/success.xml')))
67
67
  end
68
68
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cassette
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5
4
+ version: 1.2.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ricardo Hermida Ruiz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-20 00:00:00.000000000 Z
11
+ date: 2017-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - ">"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.9'
27
- - !ruby/object:Gem::Dependency
28
- name: libxml-ruby
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: activesupport
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -45,7 +31,7 @@ dependencies:
45
31
  - - ">"
46
32
  - !ruby/object:Gem::Version
47
33
  version: 3.1.0
48
- type: :runtime
34
+ type: :development
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
@@ -235,13 +221,13 @@ files:
235
221
  - lib/cassette/authentication/filter.rb
236
222
  - lib/cassette/authentication/user.rb
237
223
  - lib/cassette/cache.rb
224
+ - lib/cassette/cache/null_store.rb
238
225
  - lib/cassette/client.rb
239
226
  - lib/cassette/client/cache.rb
240
227
  - lib/cassette/errors.rb
241
228
  - lib/cassette/errors/not_a_customer.rb
242
229
  - lib/cassette/errors/not_an_employee.rb
243
230
  - lib/cassette/http.rb
244
- - lib/cassette/http/parsed_response.rb
245
231
  - lib/cassette/http/request.rb
246
232
  - lib/cassette/http/ticket_response.rb
247
233
  - lib/cassette/rubycas.rb
@@ -261,7 +247,6 @@ files:
261
247
  - spec/cassette/client/cache_spec.rb
262
248
  - spec/cassette/client_spec.rb
263
249
  - spec/cassette/errors_spec.rb
264
- - spec/cassette/http/parsed_response_spec.rb
265
250
  - spec/cassette/http/request_spec.rb
266
251
  - spec/cassette/http/ticket_response_spec.rb
267
252
  - spec/cassette/rubycas/routing_constraint_spec.rb
@@ -286,12 +271,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
286
271
  version: '0'
287
272
  required_rubygems_version: !ruby/object:Gem::Requirement
288
273
  requirements:
289
- - - ">="
274
+ - - ">"
290
275
  - !ruby/object:Gem::Version
291
- version: '0'
276
+ version: 1.3.1
292
277
  requirements: []
293
278
  rubyforge_project:
294
- rubygems_version: 2.5.2
279
+ rubygems_version: 2.4.5.1
295
280
  signing_key:
296
281
  specification_version: 4
297
282
  summary: Generates, validates and caches TGTs and STs
@@ -306,7 +291,6 @@ test_files:
306
291
  - spec/cassette/client/cache_spec.rb
307
292
  - spec/cassette/client_spec.rb
308
293
  - spec/cassette/errors_spec.rb
309
- - spec/cassette/http/parsed_response_spec.rb
310
294
  - spec/cassette/http/request_spec.rb
311
295
  - spec/cassette/http/ticket_response_spec.rb
312
296
  - spec/cassette/rubycas/routing_constraint_spec.rb
@@ -1,20 +0,0 @@
1
- require 'delegate'
2
- require 'active_support/xml_mini'
3
-
4
- module Cassette
5
- module Http
6
- class ParsedResponse < SimpleDelegator
7
- def initialize(raw_content, parser = XMLParser)
8
- super(parser.call(raw_content))
9
- end
10
-
11
- XMLParser = lambda do |raw_content|
12
- ActiveSupport::XmlMini.with_backend('LibXML') do
13
- ActiveSupport::XmlMini.parse(raw_content)
14
- end
15
- end
16
-
17
- private_constant :XMLParser
18
- end
19
- end
20
- end
@@ -1,27 +0,0 @@
1
- describe Cassette::Http::ParsedResponse do
2
- subject(:parsed_response) { described_class.new(xml_response) }
3
-
4
- let(:xml_response) { fixture('cas/success.xml') }
5
-
6
- let(:hash_response) do
7
- {
8
- "serviceResponse" => {
9
- "authenticationSuccess" => {
10
- "user"=> {
11
- "__content__" => "test-user"
12
- },
13
- "attributes" => {
14
- "authorities" => {
15
- "__content__" => "[CUPOM, AUDITING,]"
16
- },
17
- "cn" => {
18
- "__content__" => "Test System"
19
- }
20
- }
21
- }
22
- }
23
- }
24
- end
25
-
26
- it { is_expected.to eq(hash_response) }
27
- end