sbsm 1.4.9 → 1.5.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 +4 -4
- data/History.txt +6 -0
- data/lib/sbsm/app.rb +6 -6
- data/lib/sbsm/session.rb +25 -17
- data/lib/sbsm/version.rb +1 -1
- data/test/test_application.rb +2 -1
- data/test/test_rack_app.rb +186 -0
- data/test/test_session.rb +2 -16
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60e49c0bbf1c19f72b68e0ae0109d970f9e3849f
|
4
|
+
data.tar.gz: dee70d2c1510d16abf7a473a2bc7489a9bcce48d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8efe2e0d58360ce0823e8e9af80a370ddfe7586c709c4456c81022d89ae4bfc81337a2240e2813fc09db22fafa04dbaeb2a3f0b6f10950d3dc4305b70f609efa
|
7
|
+
data.tar.gz: 52eefccd90f9a08e6e73035489f911e554b02637e07c8f220e35a785294b9567858db6f3cb8ceabfd64ffd4046e101a62888319f226a685b55ecf767f25637ae
|
data/History.txt
CHANGED
data/lib/sbsm/app.rb
CHANGED
@@ -148,14 +148,14 @@ module SBSM
|
|
148
148
|
response.status = result.last.to_i
|
149
149
|
response.headers.delete(result.first)
|
150
150
|
end
|
151
|
-
session.
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
151
|
+
response.set_cookie(session.persistent_cookie_name,
|
152
|
+
{ :value => session.cookie_pairs,
|
153
|
+
:path => "/",
|
154
|
+
:expires => (Time.now + (60 * 60 * 24 * 365 * 10))})
|
155
|
+
response.set_cookie(SESSION_ID, { :value => session_id, :path => '/' , :expires => (Time.now + (60 * 60 * 24 * 365 * 10)) })
|
156
156
|
@@last_session = session
|
157
157
|
if response.headers['Set-Cookie'].to_s.index(session_id)
|
158
|
-
SBSM.debug "finish session_id.1 #{session_id}: matches response.headers['Set-Cookie']"
|
158
|
+
SBSM.debug "finish session_id.1 #{session_id}: matches response.headers['Set-Cookie'] #{response.headers['Set-Cookie']}"
|
159
159
|
else
|
160
160
|
SBSM.debug "finish session_id.2 #{session_id}: headers #{response.headers}"
|
161
161
|
end
|
data/lib/sbsm/session.rb
CHANGED
@@ -37,7 +37,7 @@ require 'delegate'
|
|
37
37
|
module SBSM
|
38
38
|
class Session
|
39
39
|
|
40
|
-
attr_reader :user, :active_thread, :key, :cookie_input, :
|
40
|
+
attr_reader :user, :active_thread, :key, :cookie_input, :persistent_cookie_name, :post_content,
|
41
41
|
:server_name, :server_port, :request_params, :request_method, :request_origin,
|
42
42
|
:unsafe_input, :valid_input, :request_path, :request_post, :cgi, :attended_states
|
43
43
|
attr_accessor :validator, :trans_handler, :app
|
@@ -120,8 +120,8 @@ module SBSM
|
|
120
120
|
fail "invalid validator #{@validator}" unless @validator.is_a?(SBSM::Validator)
|
121
121
|
@trans_handler = trans_handler || TransHandler.instance
|
122
122
|
fail "invalid trans_handler #{@trans_handler}" unless @trans_handler.is_a?(SBSM::TransHandler)
|
123
|
-
@
|
124
|
-
@
|
123
|
+
@persistent_cookie_name = cookie_name
|
124
|
+
@persistent_cookie_name ||= self.class::PERSISTENT_COOKIE_NAME
|
125
125
|
@attended_states = {}
|
126
126
|
@persistent_user_input = {}
|
127
127
|
touch()
|
@@ -135,9 +135,6 @@ module SBSM
|
|
135
135
|
@active_thread = nil
|
136
136
|
SBSM.debug "session initialized #{self} with @cgi #{@cgi} multi_threaded #{multi_threaded} app #{app.object_id} and user #{@user.class} @unknown_user #{@unknown_user.class}"
|
137
137
|
end
|
138
|
-
def self.get_cookie_name
|
139
|
-
@cookie_name
|
140
|
-
end
|
141
138
|
def method_missing(symbol, *args, &block) # Replaces old dispatch to DRb
|
142
139
|
@app.send(symbol, *args, &block)
|
143
140
|
rescue => error
|
@@ -211,6 +208,7 @@ module SBSM
|
|
211
208
|
@request_path ||= rack_request.path
|
212
209
|
@rack_request = rack_request
|
213
210
|
@post_content = nil
|
211
|
+
|
214
212
|
if rack_request.request_method.eql?('POST')
|
215
213
|
rack_request.params.each do |k, v|
|
216
214
|
# needed to test POST requests generated by curl (first parameter) or ARC (second parameter)
|
@@ -251,8 +249,8 @@ module SBSM
|
|
251
249
|
@request_params = rack_request.params
|
252
250
|
logout unless @active_state
|
253
251
|
validator.reset_errors() if validator && validator.respond_to?(:reset_errors)
|
254
|
-
import_user_input(rack_request)
|
255
252
|
import_cookies(rack_request)
|
253
|
+
import_user_input(rack_request)
|
256
254
|
@state = active_state.trigger(event())
|
257
255
|
SBSM.debug "active_state.trigger state #{@state.object_id} #{@state.class} remember #{persistent_user_input(:remember).inspect}"
|
258
256
|
#FIXME: is there a better way to distinguish returning states?
|
@@ -313,15 +311,22 @@ module SBSM
|
|
313
311
|
end
|
314
312
|
def import_cookies(request)
|
315
313
|
reset_cookie()
|
316
|
-
if(
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
314
|
+
if(cuki = request.cookies[@persistent_cookie_name])
|
315
|
+
cuki.split(';').each { |cuki_str|
|
316
|
+
CGI.parse(CGI.unescape(cuki_str)).each { |key, val|
|
317
|
+
key = key.intern
|
318
|
+
valid = @validator.validate(key, val.compact.last)
|
319
|
+
@cookie_input.store(key, valid)
|
320
|
+
}
|
321
|
+
}
|
324
322
|
end
|
323
|
+
request.cookies.each do |key, value|
|
324
|
+
next if key.to_s.eql?(@persistent_cookie_name.to_s)
|
325
|
+
key = key.intern
|
326
|
+
valid = @validator.validate(key, value)
|
327
|
+
@cookie_input.store(key, valid)
|
328
|
+
end if false
|
329
|
+
SBSM.debug "@cookie_input now #{@cookie_input}"
|
325
330
|
end
|
326
331
|
# should matches stuff like "hash[1]"
|
327
332
|
@@hash_ptrn = /([^\[]+)((\[[^\]]+\])+)/
|
@@ -437,8 +442,11 @@ module SBSM
|
|
437
442
|
end
|
438
443
|
end
|
439
444
|
end
|
445
|
+
def cookie_pairs
|
446
|
+
cookie_input.collect { |key, value| "#{key}=#{value ?CGI.escape(value) : ''}" }.join(';')
|
447
|
+
end
|
440
448
|
def http_headers
|
441
|
-
|
449
|
+
@state.http_headers
|
442
450
|
rescue NameError, StandardError => err
|
443
451
|
SBSM.info "NameError, StandardError: #@request_path"
|
444
452
|
{'Content-Type' => 'text/plain'}
|
@@ -501,7 +509,7 @@ module SBSM
|
|
501
509
|
end
|
502
510
|
end
|
503
511
|
def set_cookie_input(key, val)
|
504
|
-
SBSM.debug
|
512
|
+
SBSM.debug"set_cookie_input #{key} #{val}"
|
505
513
|
@cookie_input.store(key, val)
|
506
514
|
end
|
507
515
|
def server_name
|
data/lib/sbsm/version.rb
CHANGED
data/test/test_application.rb
CHANGED
@@ -60,7 +60,8 @@ class AppTestSimple < Minitest::Test
|
|
60
60
|
end
|
61
61
|
def test_post_feedback
|
62
62
|
set_cookie "_session_id=#{TEST_COOKIE_NAME}"
|
63
|
-
|
63
|
+
params = { 'dummy' => 'value'}
|
64
|
+
set_cookie "#{SBSM::Session::PERSISTENT_COOKIE_NAME}"
|
64
65
|
get '/de/page/feedback' do
|
65
66
|
end
|
66
67
|
# assert_match /anrede.*=.*value2/, CGI.unescape(last_response.headers['Set-Cookie'])
|
@@ -0,0 +1,186 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
#--
|
4
|
+
#
|
5
|
+
# State Based Session Management
|
6
|
+
# Copyright (C) 2004 Hannes Wyss
|
7
|
+
#
|
8
|
+
# This library is free software; you can redistribute it and/or
|
9
|
+
# modify it under the terms of the GNU Lesser General Public
|
10
|
+
# License as published by the Free Software Foundation; either
|
11
|
+
# version 2.1 of the License, or (at your option) any later version.
|
12
|
+
#
|
13
|
+
# This library is distributed in the hope that it will be useful,
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
16
|
+
# Lesser General Public License for more details.
|
17
|
+
#
|
18
|
+
# You should have received a copy of the GNU Lesser General Public
|
19
|
+
# License along with this library; if not, write to the Free Software
|
20
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
21
|
+
#
|
22
|
+
# ywesee - intellectual capital connected, Winterthurerstrasse 52, CH-8006 Zürich, Switzerland
|
23
|
+
# hwyss@ywesee.com
|
24
|
+
#
|
25
|
+
# TestSession -- sbsm -- 22.10.2002 -- hwyss@ywesee.com
|
26
|
+
#++
|
27
|
+
|
28
|
+
require 'minitest/autorun'
|
29
|
+
require 'sbsm/session'
|
30
|
+
require 'sbsm/validator'
|
31
|
+
require 'sbsm/trans_handler'
|
32
|
+
require 'sbsm/app'
|
33
|
+
require 'rack'
|
34
|
+
require 'rack/test'
|
35
|
+
|
36
|
+
begin
|
37
|
+
require 'pry'
|
38
|
+
rescue LoadError
|
39
|
+
end
|
40
|
+
|
41
|
+
class StubSessionSession < SBSM::Session
|
42
|
+
end
|
43
|
+
class StubSessionApp < SBSM::App
|
44
|
+
attr_accessor :trans_handler, :validator
|
45
|
+
SESSION = StubSessionSession
|
46
|
+
def initialize(args = {})
|
47
|
+
super()
|
48
|
+
end
|
49
|
+
def login(session)
|
50
|
+
false
|
51
|
+
end
|
52
|
+
def async(&block)
|
53
|
+
block.call
|
54
|
+
end
|
55
|
+
end
|
56
|
+
class StubSessionValidator < SBSM::Validator
|
57
|
+
def reset_errors; end
|
58
|
+
def validate(key, value, mandatory=false)
|
59
|
+
value
|
60
|
+
end
|
61
|
+
def valid_values(key)
|
62
|
+
if(key=='foo')
|
63
|
+
['foo', 'bar']
|
64
|
+
end
|
65
|
+
end
|
66
|
+
def error?
|
67
|
+
false
|
68
|
+
end
|
69
|
+
end
|
70
|
+
class StubSessionRequest < Rack::Request
|
71
|
+
def initialize(path='', params = {})
|
72
|
+
super(Rack::MockRequest.env_for("http://example.com:8080/#{path}", params))
|
73
|
+
end
|
74
|
+
end
|
75
|
+
class StubSessionView
|
76
|
+
def initialize(foo, bar)
|
77
|
+
end
|
78
|
+
def http_headers
|
79
|
+
{ "foo" => "bar" }
|
80
|
+
end
|
81
|
+
def to_html(context)
|
82
|
+
'0123456789' * 3
|
83
|
+
end
|
84
|
+
end
|
85
|
+
class StubSessionBarState < SBSM::State
|
86
|
+
EVENT_MAP = {
|
87
|
+
:foobar => StubSessionBarState,
|
88
|
+
}
|
89
|
+
end
|
90
|
+
class StubSessionBarfoosState < SBSM::State
|
91
|
+
DIRECT_EVENT = :barfoos
|
92
|
+
end
|
93
|
+
class StubSessionFooState < SBSM::State
|
94
|
+
EVENT_MAP = {
|
95
|
+
:bar => StubSessionBarState
|
96
|
+
}
|
97
|
+
end
|
98
|
+
class StubSessionState < SBSM::State
|
99
|
+
VIEW = StubSessionView
|
100
|
+
attr_accessor :volatile
|
101
|
+
def foo
|
102
|
+
@foo ||= StubSessionFooState.new(@session,@model)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
class StubVolatileState < SBSM::State
|
106
|
+
VOLATILE = true
|
107
|
+
end
|
108
|
+
class StubSessionWithView < SBSM::Session
|
109
|
+
DEFAULT_STATE = StubSessionState
|
110
|
+
CAP_MAX_THRESHOLD = 3
|
111
|
+
MAX_STATES = 3
|
112
|
+
DEFAULT_FLAVOR = 'gcc'
|
113
|
+
attr_accessor :user, :state
|
114
|
+
attr_accessor :attended_states, :cached_states, :cookie_input
|
115
|
+
attr_writer :lookandfeel, :persistent_user_input
|
116
|
+
attr_writer :active_state
|
117
|
+
public :active_state
|
118
|
+
def initialize(args)
|
119
|
+
args[:app] ||= StubSessionApp.new
|
120
|
+
args[:validator] ||= StubSessionValidator.new
|
121
|
+
super(args)
|
122
|
+
persistent_user_input = {}
|
123
|
+
end
|
124
|
+
end
|
125
|
+
class StubSessionSession < SBSM::Session
|
126
|
+
attr_accessor :lookandfeel
|
127
|
+
attr_accessor :persistent_user_input
|
128
|
+
DEFAULT_FLAVOR = 'gcc'
|
129
|
+
LF_FACTORY = {
|
130
|
+
'gcc' => 'ccg',
|
131
|
+
'sbb' => 'bbs',
|
132
|
+
}
|
133
|
+
def initialize(app:)
|
134
|
+
super(app: app, validator: StubSessionValidator.new)
|
135
|
+
persistent_user_input = {}
|
136
|
+
end
|
137
|
+
def persistent_user_input(key)
|
138
|
+
super
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
class TestSession < Minitest::Test
|
143
|
+
include Rack::Test::Methods
|
144
|
+
def setup
|
145
|
+
@app = StubSessionApp.new(validator: StubSessionValidator.new)
|
146
|
+
@session = StubSessionWithView.new(app: @app, validator: StubSessionValidator.new)
|
147
|
+
@request = StubSessionRequest.new
|
148
|
+
@state = StubSessionState.new(@session, nil)
|
149
|
+
end
|
150
|
+
|
151
|
+
def app
|
152
|
+
@app
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_cookies
|
156
|
+
by_persistent_name = '63488f94c90813200f29e1a60de9a479ad52e71758f48e612e9f6390f80c7b7c'
|
157
|
+
@session.cookie_input = { 'remember' => '63488f94c90813200f29e1a60de9a479ad52e71758f48e612e9f6390f80c7b7c',
|
158
|
+
'name' => 'juerg@davaz.com',
|
159
|
+
'language' => 'en'}
|
160
|
+
@request.cookies[:remember] = 'my_remember_value'
|
161
|
+
@request.cookies[:language] = 'en'
|
162
|
+
@request.cookies['_session_id'] = '10e524151d7f0da819f4222ecc1'
|
163
|
+
@request.cookies[@session.persistent_cookie_name] = @session.cookie_pairs
|
164
|
+
@session.cookie_input = {}
|
165
|
+
assert_equal({}, @session.cookie_input)
|
166
|
+
assert_nil(@session.persistent_user_input(:language))
|
167
|
+
@session.process_rack(rack_request: @request)
|
168
|
+
assert_equal([:remember, :name, :language], @session.cookie_input.keys)
|
169
|
+
assert_equal('en', @session.cookie_input[:language])
|
170
|
+
assert_equal(by_persistent_name, @session.cookie_input[:remember])
|
171
|
+
end
|
172
|
+
def test_cookie_pairs
|
173
|
+
@session.cookie_input = { 'name_last' => 'Müller', 'name_first' => 'Cécile',
|
174
|
+
'nil_value' => nil, 'empty_string' => ''}
|
175
|
+
assert_equal('name_last=M%C3%BCller;name_first=C%C3%A9cile;nil_value=;empty_string=', @session.cookie_pairs)
|
176
|
+
@request.cookies[@session.persistent_cookie_name] = @session.cookie_pairs
|
177
|
+
@session.cookie_input = {}
|
178
|
+
assert_equal({}, @session.cookie_input)
|
179
|
+
@session.process_rack(rack_request: @request)
|
180
|
+
assert_equal([:name_last, :name_first, :nil_value, :empty_string], @session.cookie_input.keys)
|
181
|
+
assert_equal('Müller', @session.cookie_input[:name_last])
|
182
|
+
assert_equal('Cécile', @session.cookie_input[:name_first])
|
183
|
+
assert_equal('', @session.cookie_input[:nil_value])
|
184
|
+
assert_equal('', @session.cookie_input[:empty_string])
|
185
|
+
end
|
186
|
+
end
|
data/test/test_session.rb
CHANGED
@@ -43,7 +43,7 @@ end
|
|
43
43
|
class StubSessionSession < SBSM::Session
|
44
44
|
end
|
45
45
|
class StubSessionApp < SBSM::App
|
46
|
-
attr_accessor :trans_handler, :validator
|
46
|
+
attr_accessor :trans_handler, :validator, :cookie_input
|
47
47
|
SESSION = StubSessionSession
|
48
48
|
def initialize(args = {})
|
49
49
|
super()
|
@@ -133,7 +133,7 @@ class StubSessionSession < SBSM::Session
|
|
133
133
|
'gcc' => 'ccg',
|
134
134
|
'sbb' => 'bbs',
|
135
135
|
}
|
136
|
-
def initialize(app:
|
136
|
+
def initialize(app: )
|
137
137
|
super(app: app, validator: StubSessionValidator.new)
|
138
138
|
persistent_user_input = {}
|
139
139
|
end
|
@@ -152,20 +152,6 @@ class TestSession < Minitest::Test
|
|
152
152
|
@state = StubSessionState.new(@session, nil)
|
153
153
|
end
|
154
154
|
|
155
|
-
def test_cookies
|
156
|
-
c_name = SBSM::Session::PERSISTENT_COOKIE_NAME
|
157
|
-
c_value = "remember=63488f94c90813200f29e1a60de9a479ad52e71758f48e612e9f6390f80c7b7c\nname=juerg%40davaz.com\nlanguage=en"
|
158
|
-
@request.cookies[:remember] = 'my_remember_value'
|
159
|
-
@request.cookies[:language] = 'en'
|
160
|
-
@request.cookies['_session_id'] = '10e524151d7f0da819f4222ecc1'
|
161
|
-
@request.cookies[c_name] = 'my_cookie_id'
|
162
|
-
@request.set_header('Set-Cookie', c_value)
|
163
|
-
@session.process_rack(rack_request: @request)
|
164
|
-
assert_equal([:remember, :language, :_session_id, c_name.to_sym], @session.cookie_input.keys)
|
165
|
-
skip "Don't know how to test persistent_user_input"
|
166
|
-
assert_equal('@session.valid_input', @session.persistent_user_input(:language))
|
167
|
-
assert_equal('@session.valid_input', @session.valid_input)
|
168
|
-
end
|
169
155
|
def test_server_name
|
170
156
|
@session.process_rack(rack_request: @request)
|
171
157
|
assert_equal('example.com', @session.server_name)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sbsm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masaomi Hatakeyama, Zeno R.R. Davatz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -302,6 +302,7 @@ files:
|
|
302
302
|
- test/test_index.rb
|
303
303
|
- test/test_logger.rb
|
304
304
|
- test/test_lookandfeel.rb
|
305
|
+
- test/test_rack_app.rb
|
305
306
|
- test/test_redirect.rb
|
306
307
|
- test/test_session.rb
|
307
308
|
- test/test_state.rb
|
@@ -346,6 +347,7 @@ test_files:
|
|
346
347
|
- test/test_index.rb
|
347
348
|
- test/test_logger.rb
|
348
349
|
- test/test_lookandfeel.rb
|
350
|
+
- test/test_rack_app.rb
|
349
351
|
- test/test_redirect.rb
|
350
352
|
- test/test_session.rb
|
351
353
|
- test/test_state.rb
|