maestrano 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +38 -3
- data/lib/maestrano/sso/session.rb +26 -9
- data/lib/maestrano/sso.rb +10 -2
- data/lib/maestrano/version.rb +1 -1
- data/lib/maestrano.rb +2 -0
- data/test/maestrano/maestrano_test.rb +8 -0
- data/test/maestrano/sso/session_test.rb +27 -1
- data/test/maestrano/sso_test.rb +12 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6dbfef2e9899e2250a41860c7bc035b608558ac2
|
4
|
+
data.tar.gz: cb1dc4e027c8e63f3b1197374e3478c200825b20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d44d0296bd34766d5660d6cfed0286bc3d71c7bdf516d3479d4df891a9bc2c47465091e164761d9075e2e6ace88364c04e650d0a3bdd30b457a9d66c2c856e68
|
7
|
+
data.tar.gz: 0098514aed554c30081b53233fd321a8740d6b01bf212441065cabc092d711e7c74c8f2c6e7c666c468e114920c5a921e435e772815404bc36c3178a35134aff
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -122,6 +122,14 @@ Maestrano.configure do |config|
|
|
122
122
|
#
|
123
123
|
# config.sso.consume_path = '/maestrano/auth/saml/consume'
|
124
124
|
|
125
|
+
# ==> Single Logout activation
|
126
|
+
# Enable/Disable single logout. When troubleshooting authentication issues
|
127
|
+
# you might want to disable SLO temporarily.
|
128
|
+
# If set to false then Maestrano::SSO::Session#valid? - which should be
|
129
|
+
# used in a controller before filter to check user session - always return true
|
130
|
+
#
|
131
|
+
# config.sso.slo_enabled = true
|
132
|
+
|
125
133
|
# ==> SSO User creation mode
|
126
134
|
# !IMPORTANT
|
127
135
|
# On Maestrano users can take several "instances" of your service. You can consider
|
@@ -335,7 +343,7 @@ If you want your users to benefit from single logout then you should define the
|
|
335
343
|
```ruby
|
336
344
|
def verify_maestrano_session
|
337
345
|
if Maestrano.param(:sso_enabled)
|
338
|
-
if session && session[:
|
346
|
+
if session && session[:maestrano] && !Maestrano::SSO::Session.new(session).valid?
|
339
347
|
redirect_to Maestrano::SSO.init_url
|
340
348
|
end
|
341
349
|
end
|
@@ -524,7 +532,16 @@ Maestrano::Account::Bill
|
|
524
532
|
<td>Time</td>
|
525
533
|
<td>-</td>
|
526
534
|
<td>-</td>
|
527
|
-
<td>When the
|
535
|
+
<td>When the bill was created</td>
|
536
|
+
<tr>
|
537
|
+
|
538
|
+
<tr>
|
539
|
+
<td><b>updated_at</b></td>
|
540
|
+
<td>readonly</td>
|
541
|
+
<td>Time</td>
|
542
|
+
<td>-</td>
|
543
|
+
<td>-</td>
|
544
|
+
<td>When the bill was last updated</td>
|
528
545
|
<tr>
|
529
546
|
|
530
547
|
<tr>
|
@@ -697,7 +714,16 @@ Maestrano::Account::RecurringBill
|
|
697
714
|
<td>Time</td>
|
698
715
|
<td>-</td>
|
699
716
|
<td>-</td>
|
700
|
-
<td>When the
|
717
|
+
<td>When the recurring bill was created</td>
|
718
|
+
<tr>
|
719
|
+
|
720
|
+
<tr>
|
721
|
+
<td><b>updated_at</b></td>
|
722
|
+
<td>readonly</td>
|
723
|
+
<td>Time</td>
|
724
|
+
<td>-</td>
|
725
|
+
<td>-</td>
|
726
|
+
<td>When the recurring bill was last updated</td>
|
701
727
|
<tr>
|
702
728
|
|
703
729
|
<tr>
|
@@ -717,6 +743,15 @@ Maestrano::Account::RecurringBill
|
|
717
743
|
<td>-</td>
|
718
744
|
<td>Status of the recurring bill. Either 'submitted', 'active', 'expired' or 'cancelled'.</td>
|
719
745
|
<tr>
|
746
|
+
|
747
|
+
<tr>
|
748
|
+
<td><b>initial_cents</b></td>
|
749
|
+
<td>read/write</td>
|
750
|
+
<td>Integer</td>
|
751
|
+
<td><b>-</b></td>
|
752
|
+
<td>0</td>
|
753
|
+
<td>Initial non-recurring payment amount - in cents - due immediately upon creating the recurring bill</td>
|
754
|
+
<tr>
|
720
755
|
|
721
756
|
</table>
|
722
757
|
|
@@ -22,15 +22,17 @@ module Maestrano
|
|
22
22
|
|
23
23
|
def initialize(session)
|
24
24
|
self.session = session
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
25
|
+
if (self.session = session)
|
26
|
+
begin
|
27
|
+
if mno_session = (self.session[:maestrano] || self.session['maestrano'])
|
28
|
+
decrypted_session = JSON.parse(Base64.decode64(mno_session))
|
29
|
+
self.uid = decrypted_session['uid']
|
30
|
+
self.session_token = decrypted_session['session']
|
31
|
+
self.recheck = Time.iso8601(decrypted_session['session_recheck'])
|
32
|
+
self.group_uid = decrypted_session['group_uid']
|
33
|
+
end
|
34
|
+
rescue
|
32
35
|
end
|
33
|
-
rescue
|
34
36
|
end
|
35
37
|
end
|
36
38
|
|
@@ -64,7 +66,22 @@ module Maestrano
|
|
64
66
|
return false
|
65
67
|
end
|
66
68
|
|
67
|
-
|
69
|
+
# Check whether this mno session is valid or not
|
70
|
+
# Return true if SLO is disabled (via sso.slo_enabled config
|
71
|
+
# param)
|
72
|
+
# Return false if no session defined
|
73
|
+
# ---
|
74
|
+
# opts:
|
75
|
+
# if_session: if true then the session will be
|
76
|
+
# considered valid if the http session is nil or does
|
77
|
+
# not have a maestrano key. Useful when the validity of
|
78
|
+
# a session should be restricted to maestrano users only
|
79
|
+
# within an application
|
80
|
+
def valid?(opts = {})
|
81
|
+
return true unless Maestrano.param('sso.slo_enabled')
|
82
|
+
return true if opts[:if_session] && (!self.session || (!self.session[:maestrano] && !self.session['maestrano']))
|
83
|
+
return false unless self.session
|
84
|
+
|
68
85
|
if self.remote_check_required?
|
69
86
|
if perform_remote_check
|
70
87
|
self.save
|
data/lib/maestrano/sso.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Maestrano
|
2
2
|
module SSO
|
3
|
+
|
3
4
|
# Return the saml_settings based on
|
4
5
|
# Maestrano configuration
|
5
6
|
def self.saml_settings
|
@@ -71,8 +72,15 @@ module Maestrano
|
|
71
72
|
Maestrano::SSO::Session.from_user_auth_hash(session,auth).save
|
72
73
|
end
|
73
74
|
|
74
|
-
|
75
|
-
|
75
|
+
# Destroy the maestrano session in http session
|
76
|
+
def self.clear_session(session)
|
77
|
+
session.delete(:maestrano)
|
78
|
+
session.delete('maestrano')
|
79
|
+
end
|
80
|
+
|
81
|
+
# Metaclass definitions
|
82
|
+
class << self
|
83
|
+
alias_method :unset_session, :clear_session
|
76
84
|
end
|
77
85
|
end
|
78
86
|
end
|
data/lib/maestrano/version.rb
CHANGED
data/lib/maestrano.rb
CHANGED
@@ -168,6 +168,7 @@ module Maestrano
|
|
168
168
|
# SSO Config
|
169
169
|
@sso = OpenStruct.new({
|
170
170
|
enabled: true,
|
171
|
+
slo_enabled: true,
|
171
172
|
creation_mode: 'virtual',
|
172
173
|
init_path: '/maestrano/auth/saml/init',
|
173
174
|
consume_path: '/maestrano/auth/saml/consume',
|
@@ -191,6 +192,7 @@ module Maestrano
|
|
191
192
|
self.api.lang = 'ruby'
|
192
193
|
self.api.lang_version = "#{RUBY_VERSION} p#{RUBY_PATCHLEVEL} (#{RUBY_RELEASE_DATE})"
|
193
194
|
self.sso.idm ||= self.app.host
|
195
|
+
self.sso.slo_enabled &&= self.sso.enabled
|
194
196
|
end
|
195
197
|
|
196
198
|
# Transform legacy parameters into new parameter
|
@@ -10,6 +10,7 @@ class MaestranoTest < Test::Unit::TestCase
|
|
10
10
|
'api.key' => 'someapikey',
|
11
11
|
|
12
12
|
'sso.enabled' => false,
|
13
|
+
'sso.slo_enabled' => false,
|
13
14
|
'sso.init_path' => '/mno/sso/init',
|
14
15
|
'sso.consume_path' => '/mno/sso/consume',
|
15
16
|
'sso.creation_mode' => 'real',
|
@@ -27,6 +28,7 @@ class MaestranoTest < Test::Unit::TestCase
|
|
27
28
|
config.api.key = @config['api.key']
|
28
29
|
|
29
30
|
config.sso.enabled = @config['sso.enabled']
|
31
|
+
config.sso.slo_enabled = @config['sso.slo_enabled']
|
30
32
|
config.sso.idm = @config['sso.idm']
|
31
33
|
config.sso.init_path = @config['sso.init_path']
|
32
34
|
config.sso.consume_path = @config['sso.consume_path']
|
@@ -69,6 +71,11 @@ class MaestranoTest < Test::Unit::TestCase
|
|
69
71
|
assert_equal Maestrano::VERSION, Maestrano.param('api.version')
|
70
72
|
end
|
71
73
|
|
74
|
+
should "force slo_enabled to false if sso is disabled" do
|
75
|
+
Maestrano.configure { |config| config.sso.slo_enabled = true; config.sso.enabled = false }
|
76
|
+
assert_false Maestrano.param('sso.slo_enabled')
|
77
|
+
end
|
78
|
+
|
72
79
|
context "with environment params" do
|
73
80
|
should "return the right test parameters" do
|
74
81
|
Maestrano.configure { |config| config.environment = 'test' }
|
@@ -221,6 +228,7 @@ class MaestranoTest < Test::Unit::TestCase
|
|
221
228
|
},
|
222
229
|
'sso' => {
|
223
230
|
'enabled' => @config['sso.enabled'],
|
231
|
+
'slo_enabled' => @config['sso.slo_enabled'],
|
224
232
|
'init_path' => @config['sso.init_path'],
|
225
233
|
'consume_path' => @config['sso.consume_path'],
|
226
234
|
'creation_mode' => @config['sso.creation_mode'],
|
@@ -101,17 +101,37 @@ module Maestrano
|
|
101
101
|
context "valid?" do
|
102
102
|
setup do
|
103
103
|
@sso_session = Maestrano::SSO::Session.new(@session)
|
104
|
+
Maestrano.configure { |c| c.sso.slo_enabled = true }
|
105
|
+
end
|
106
|
+
|
107
|
+
should "return true if Single Logout is disabled" do
|
108
|
+
Maestrano.configure { |c| c.sso.slo_enabled = false }
|
109
|
+
@sso_session.stubs(:remote_check_required?).returns(true)
|
110
|
+
@sso_session.stubs(:perform_remote_check).returns(false)
|
111
|
+
assert @sso_session.valid?
|
112
|
+
end
|
113
|
+
|
114
|
+
should "return true if_session is enabled and session is nil" do
|
115
|
+
sso_session = Maestrano::SSO::Session.new(nil)
|
116
|
+
assert sso_session.valid?(if_session: true)
|
117
|
+
end
|
118
|
+
|
119
|
+
should "return true if_session is enabled and session is empty" do
|
120
|
+
sso_session = Maestrano::SSO::Session.new({})
|
121
|
+
assert sso_session.valid?(if_session: true)
|
104
122
|
end
|
105
123
|
|
106
124
|
should "return true if no remote_check_required?" do
|
107
125
|
@sso_session.stubs(:remote_check_required?).returns(false)
|
108
126
|
assert @sso_session.valid?
|
127
|
+
assert @sso_session.valid?(if_session: true)
|
109
128
|
end
|
110
129
|
|
111
130
|
should "return true if remote_check_required? and valid" do
|
112
131
|
@sso_session.stubs(:remote_check_required?).returns(true)
|
113
132
|
@sso_session.stubs(:perform_remote_check).returns(true)
|
114
133
|
assert @sso_session.valid?
|
134
|
+
assert @sso_session.valid?(if_session: true)
|
115
135
|
end
|
116
136
|
|
117
137
|
should "update maestrano session with recheck timestamp if remote_check_required? and valid" do
|
@@ -126,7 +146,13 @@ module Maestrano
|
|
126
146
|
should "return false if remote_check_required? and invalid" do
|
127
147
|
@sso_session.stubs(:remote_check_required?).returns(true)
|
128
148
|
@sso_session.stubs(:perform_remote_check).returns(false)
|
129
|
-
|
149
|
+
assert_false @sso_session.valid?
|
150
|
+
assert_false @sso_session.valid?(if_session: true)
|
151
|
+
end
|
152
|
+
|
153
|
+
should "return false if internal session is nil" do
|
154
|
+
sso_session = Maestrano::SSO::Session.new(nil)
|
155
|
+
assert_false @sso_session.valid?
|
130
156
|
end
|
131
157
|
end
|
132
158
|
|
data/test/maestrano/sso_test.rb
CHANGED
@@ -84,6 +84,18 @@ module Maestrano
|
|
84
84
|
end
|
85
85
|
|
86
86
|
should "unset the session correctly" do
|
87
|
+
Maestrano::SSO.set_session(@session,@auth)
|
88
|
+
Maestrano::SSO.clear_session(@session)
|
89
|
+
assert @session[:maestrano].nil?
|
90
|
+
end
|
91
|
+
|
92
|
+
should "unset the session if key is a string" do
|
93
|
+
@session['maestrano'] = "bla"
|
94
|
+
Maestrano::SSO.clear_session(@session)
|
95
|
+
assert @session["maestrano"].nil?
|
96
|
+
end
|
97
|
+
|
98
|
+
should "alias clear_session as unset_session" do
|
87
99
|
Maestrano::SSO.set_session(@session,@auth)
|
88
100
|
Maestrano::SSO.unset_session(@session)
|
89
101
|
assert @session[:maestrano].nil?
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: maestrano
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arnaud Lachaume
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|