rack-cas 0.15.0 → 0.16.0

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: 331bdbb7c24a322d0dfe7c303a559a3e8ca1e90d
4
- data.tar.gz: c297ba3e573f426ef8a7f4b115164e69ebc15424
3
+ metadata.gz: 0d93b9b6cfd9a88b23291eb5c3babac6313c7bcd
4
+ data.tar.gz: 397e001a435e2944c8c49e3390237d485abd8897
5
5
  SHA512:
6
- metadata.gz: 693e08e44143824390e2c1f432db5f93677fbf89f2c0b8f14ad0cb958ef20d96b94255726a34d67e906685caa21a9717c25de0b493d4745570eabd42cf6e03e4
7
- data.tar.gz: 05006fc0e6cbf026c7249fdac340144e0857c6d7b4a6945be635ff708237ed366ca8f5e8681eb77f7345a5d5265826447024ec8f7dee6f67907f3dd2c652add3
6
+ metadata.gz: be21fd7776d5e5b81ba56e776db5585381d301904c80737d85faeeb23adf0f7689665e9fdcb2e9acbaf6bdac928c02a7ac2e41d67c785dfde5884d62c00615df
7
+ data.tar.gz: a5362ad32fd9e7ac13c701f4d6865b5f74ad5726b2f7cd7008776703cee29e8da2614af3cceed1913b1445cee3b9787edaaca539b4b1d1aa30995c6a9d859172
data/README.md CHANGED
@@ -77,6 +77,24 @@ Edit your `config/initializers/session_store.rb` file with the following:
77
77
  require 'rack-cas/session_store/rails/mongoid'
78
78
  YourApp::Application.config.session_store ActionDispatch::Session::RackCasMongoidStore
79
79
  ```
80
+ #### Redis ####
81
+
82
+ Set the `session_store` in your `config/application.rb`:
83
+ ```ruby
84
+ require 'rack-cas/session_store/redis'
85
+ config.rack_cas.session_store = RackCAS::RedisStore
86
+ ```
87
+ Edit your `config/initializers/session_store.rb` file with the following:
88
+ ```ruby
89
+ require 'rack-cas/session_store/rails/redis'
90
+ YourApp::Application.config.session_store ActionDispatch::Session::RackCasRedisStore
91
+ ```
92
+ Optionally, Set the `redis_options` in your `config/application.rb`.
93
+ You can specify anything `Redis.new` allows.
94
+ For example:
95
+ ```ruby
96
+ config.rack_cas.redis_options = {path: '/tmp/redis.sock',driver: :hiredis}
97
+ ```
80
98
  Sinatra and Other Rack-Compatible Frameworks
81
99
  --------------------------------------------
82
100
 
@@ -1,7 +1,7 @@
1
1
  module RackCAS
2
2
  class Configuration
3
- SETTINGS = [:fake, :server_url, :session_store, :exclude_path, :exclude_paths, :extra_attributes_filter,
4
- :verify_ssl_cert, :renew, :use_saml_validation, :ignore_intercept_validator, :exclude_request_validator, :protocol]
3
+ SETTINGS = [:fake, :fake_attributes, :server_url, :session_store, :exclude_path, :exclude_paths, :extra_attributes_filter,
4
+ :verify_ssl_cert, :renew, :use_saml_validation, :ignore_intercept_validator, :exclude_request_validator, :protocol,:redis_options]
5
5
 
6
6
 
7
7
  SETTINGS.each do |setting|
@@ -44,7 +44,7 @@ module RackCAS
44
44
  protected
45
45
 
46
46
  def success?
47
- @success ||= xml.at('//Response/Status/StatusCode/@Value').text == 'saml1p:Success'
47
+ @success ||= xml.at('//Response/Status/StatusCode/@Value').text =~ /saml1?p:Success/
48
48
  end
49
49
 
50
50
  def authentication_failure
@@ -4,7 +4,7 @@ module RackCAS
4
4
  end
5
5
 
6
6
  def self.destroy_session_by_cas_ticket(cas_ticket)
7
- affected = Session.delete_all(cas_ticket: cas_ticket)
7
+ affected = Session.where(cas_ticket: cas_ticket).delete_all
8
8
  affected == 1
9
9
  end
10
10
 
@@ -0,0 +1,10 @@
1
+ require 'rack-cas/session_store/redis'
2
+ require 'rack/session/abstract/id'
3
+
4
+ module Rack
5
+ module Session
6
+ class RackCASRedisStore < Rack::Session::Abstract::ID
7
+ include RackCAS::RedisStore
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require 'rack-cas/session_store/redis'
2
+ require 'action_dispatch/middleware/session/abstract_store'
3
+
4
+ module ActionDispatch
5
+ module Session
6
+ class RackCasRedisStore < AbstractStore
7
+ include RackCAS::RedisStore
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,109 @@
1
+ module RackCAS
2
+ module RedisStore
3
+ class Session
4
+ @client = nil
5
+
6
+ def self.client
7
+ @client ||= (RackCAS.config.redis_options? ? Redis.new(RackCAS.config.redis_options) : Redis.new)
8
+ return @client
9
+ end
10
+
11
+ def self.find_by_id(session_id)
12
+ session = self.client.get("rack_cas_session:#{session_id}")
13
+ session ? {'sid' => session_id, 'data' => session} : session
14
+ end
15
+
16
+ def self.write(session_id:, data:, cas_ticket: )
17
+ #create a row with the session_id and the data
18
+ #create a row with the cas_ticket acting as a reverse index
19
+ results = self.client.pipelined do
20
+ self.client.set("rack_cas_session:#{session_id}",data)
21
+ self.client.expireat("rack_cas_session:#{session_id}",30.days.from_now.to_i)
22
+ self.client.set("rack_cas_ticket:#{cas_ticket}","rack_cas_session:#{session_id}")
23
+ self.client.expireat("rack_cas_ticket:#{cas_ticket}",30.days.from_now.to_i)
24
+ end
25
+
26
+ results == ["OK",true,"OK",true] ? session_id : false
27
+ end
28
+
29
+ def self.destroy_by_cas_ticket(cas_ticket)
30
+ session_id = self.client.get("rack_cas_ticket:#{cas_ticket}")
31
+ results = self.client.pipelined do
32
+ self.client.del("rack_cas_ticket:#{cas_ticket}")
33
+ self.client.del(session_id)
34
+ end
35
+ return results[1]
36
+ end
37
+
38
+ def self.delete(session_id)
39
+ self.client.del("rack_cas_session:#{session_id}")
40
+ end
41
+ end
42
+
43
+ def self.destroy_session_by_cas_ticket(cas_ticket)
44
+ affected = Session.destroy_by_cas_ticket(cas_ticket)
45
+ affected == 1
46
+ end
47
+
48
+ #we don't need to prune because the keys expire automatically
49
+ def self.prune(after = nil)
50
+ end
51
+
52
+ private
53
+
54
+
55
+ # Rack 2.0 method
56
+ def find_session(env, sid)
57
+ if sid.nil?
58
+ sid = generate_sid
59
+ data = nil
60
+ else
61
+ unless session = Session.find_by_id(sid)
62
+ session = {}
63
+ # force generation of new sid since there is no associated session
64
+ sid = generate_sid
65
+ end
66
+ data = unpack(session['data'])
67
+ end
68
+
69
+ [sid, data]
70
+ end
71
+
72
+ # Rack 2.0 method
73
+ def write_session(env, sid, session_data, options)
74
+ cas_ticket = (session_data['cas']['ticket'] unless session_data['cas'].nil?)
75
+
76
+ success = Session.write(session_id: sid, data: pack(session_data), cas_ticket: cas_ticket)
77
+
78
+ success ? sid : false
79
+ end
80
+
81
+ # Rack 2.0 method
82
+ def delete_session(env, sid, options)
83
+ Session.delete(sid)
84
+
85
+ options[:drop] ? nil : generate_sid
86
+ end
87
+
88
+ # Rack 1.* method
89
+ alias get_session find_session
90
+
91
+ # Rack 1.* method
92
+ def set_session(env, sid, session_data, options) # rack 1.x compatibilty
93
+ write_session(Rack::Request.new(env), sid, session_data, options)
94
+ end
95
+
96
+ # Rack 1.* method
97
+ def destroy_session(env, sid, options) # rack 1.x compatibilty
98
+ delete_session(Rack::Request.new(env), sid, options)
99
+ end
100
+
101
+ def pack(data)
102
+ ::Base64.encode64(Marshal.dump(data)) if data
103
+ end
104
+
105
+ def unpack(data)
106
+ Marshal.load(::Base64.decode64(data)) if data
107
+ end
108
+ end
109
+ end
@@ -1,3 +1,3 @@
1
1
  module RackCAS
2
- VERSION = '0.15.0'
2
+ VERSION = '0.16.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-cas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Crownoble
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-07 00:00:00.000000000 Z
11
+ date: 2017-09-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '1.6'
103
+ version: '2.3'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '1.6'
110
+ version: '2.3'
111
111
  description: Simple CAS authentication for Rails, Sinatra or any Rack-based site
112
112
  email: adam@codenoble.com
113
113
  executables: []
@@ -129,8 +129,11 @@ files:
129
129
  - lib/rack-cas/session_store/mongoid.rb
130
130
  - lib/rack-cas/session_store/rack/active_record.rb
131
131
  - lib/rack-cas/session_store/rack/mongoid.rb
132
+ - lib/rack-cas/session_store/rack/redis.rb
132
133
  - lib/rack-cas/session_store/rails/active_record.rb
133
134
  - lib/rack-cas/session_store/rails/mongoid.rb
135
+ - lib/rack-cas/session_store/rails/redis.rb
136
+ - lib/rack-cas/session_store/redis.rb
134
137
  - lib/rack-cas/url.rb
135
138
  - lib/rack-cas/version.rb
136
139
  - lib/rack/cas.rb
@@ -156,9 +159,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
159
  version: '0'
157
160
  requirements: []
158
161
  rubyforge_project:
159
- rubygems_version: 2.5.1
162
+ rubygems_version: 2.6.11
160
163
  signing_key:
161
164
  specification_version: 4
162
165
  summary: Rack-based CAS client
163
166
  test_files: []
164
- has_rdoc: