sbsm 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -0
- data/.travis.yml +2 -3
- data/Gemfile +1 -10
- data/History.txt +14 -0
- data/README.md +7 -2
- data/Rakefile +29 -2
- data/lib/cgi/drbsession.rb +4 -2
- data/lib/sbsm.rb +31 -0
- data/lib/sbsm/app.rb +112 -0
- data/lib/sbsm/cgi.rb +2 -52
- data/lib/sbsm/drb.rb +2 -1
- data/lib/sbsm/drbserver.rb +20 -16
- data/lib/sbsm/exception.rb +2 -2
- data/lib/sbsm/index.rb +2 -1
- data/lib/sbsm/logger.rb +46 -0
- data/lib/sbsm/lookandfeel.rb +2 -2
- data/lib/sbsm/lookandfeelfactory.rb +2 -2
- data/lib/sbsm/lookandfeelwrapper.rb +2 -1
- data/lib/sbsm/redirector.rb +4 -3
- data/lib/sbsm/session.rb +61 -67
- data/lib/sbsm/state.rb +16 -21
- data/lib/sbsm/time.rb +2 -0
- data/lib/sbsm/trans_handler.rb +82 -49
- data/lib/sbsm/turing.rb +2 -1
- data/lib/sbsm/user.rb +2 -0
- data/lib/sbsm/validator.rb +2 -0
- data/lib/sbsm/version.rb +1 -1
- data/lib/sbsm/viralstate.rb +2 -0
- data/sbsm.gemspec +4 -2
- data/test/simple_sbsm.rb +207 -0
- data/test/suite.rb +5 -2
- data/test/test_application.rb +122 -0
- data/test/test_logger.rb +121 -0
- data/test/test_session.rb +26 -17
- data/test/test_trans_handler.rb +167 -386
- metadata +67 -3
- data/lib/sbsm/request.rb +0 -234
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.3.
|
4
|
+
version: 1.3.1
|
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: 2016-
|
11
|
+
date: 2016-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: chrono_logger
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: bundler
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,6 +192,48 @@ dependencies:
|
|
178
192
|
- - ">="
|
179
193
|
- !ruby/object:Gem::Version
|
180
194
|
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: pry-byebug
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: nokogiri
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - ">="
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '0'
|
216
|
+
type: :development
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: rack-test
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - ">="
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
type: :development
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - ">="
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: '0'
|
181
237
|
description: Application framework for state based session management
|
182
238
|
email: mhatakeyama@ywesee.com, zdavatz@ywesee.com
|
183
239
|
executables: []
|
@@ -200,16 +256,18 @@ files:
|
|
200
256
|
- data/zone_uri.grammar
|
201
257
|
- install.rb
|
202
258
|
- lib/cgi/drbsession.rb
|
259
|
+
- lib/sbsm.rb
|
260
|
+
- lib/sbsm/app.rb
|
203
261
|
- lib/sbsm/cgi.rb
|
204
262
|
- lib/sbsm/drb.rb
|
205
263
|
- lib/sbsm/drbserver.rb
|
206
264
|
- lib/sbsm/exception.rb
|
207
265
|
- lib/sbsm/index.rb
|
266
|
+
- lib/sbsm/logger.rb
|
208
267
|
- lib/sbsm/lookandfeel.rb
|
209
268
|
- lib/sbsm/lookandfeelfactory.rb
|
210
269
|
- lib/sbsm/lookandfeelwrapper.rb
|
211
270
|
- lib/sbsm/redirector.rb
|
212
|
-
- lib/sbsm/request.rb
|
213
271
|
- lib/sbsm/session.rb
|
214
272
|
- lib/sbsm/state.rb
|
215
273
|
- lib/sbsm/time.rb
|
@@ -223,10 +281,13 @@ files:
|
|
223
281
|
- test/data/dos_file.txt
|
224
282
|
- test/data/lnf_file.txt
|
225
283
|
- test/data/mac_file.txt
|
284
|
+
- test/simple_sbsm.rb
|
226
285
|
- test/stub/cgi.rb
|
227
286
|
- test/suite.rb
|
287
|
+
- test/test_application.rb
|
228
288
|
- test/test_drbserver.rb
|
229
289
|
- test/test_index.rb
|
290
|
+
- test/test_logger.rb
|
230
291
|
- test/test_lookandfeel.rb
|
231
292
|
- test/test_session.rb
|
232
293
|
- test/test_state.rb
|
@@ -262,10 +323,13 @@ test_files:
|
|
262
323
|
- test/data/dos_file.txt
|
263
324
|
- test/data/lnf_file.txt
|
264
325
|
- test/data/mac_file.txt
|
326
|
+
- test/simple_sbsm.rb
|
265
327
|
- test/stub/cgi.rb
|
266
328
|
- test/suite.rb
|
329
|
+
- test/test_application.rb
|
267
330
|
- test/test_drbserver.rb
|
268
331
|
- test/test_index.rb
|
332
|
+
- test/test_logger.rb
|
269
333
|
- test/test_lookandfeel.rb
|
270
334
|
- test/test_session.rb
|
271
335
|
- test/test_state.rb
|
data/lib/sbsm/request.rb
DELETED
@@ -1,234 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: utf-8
|
3
|
-
#
|
4
|
-
# State Based Session Management
|
5
|
-
# Copyright (C) 2004 Hannes Wyss
|
6
|
-
#
|
7
|
-
# This library is free software; you can redistribute it and/or
|
8
|
-
# modify it under the terms of the GNU Lesser General Public
|
9
|
-
# License as published by the Free Software Foundation; either
|
10
|
-
# version 2.1 of the License, or (at your option) any later version.
|
11
|
-
#
|
12
|
-
# This library is distributed in the hope that it will be useful,
|
13
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15
|
-
# Lesser General Public License for more details.
|
16
|
-
#
|
17
|
-
# You should have received a copy of the GNU Lesser General Public
|
18
|
-
# License along with this library; if not, write to the Free Software
|
19
|
-
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
20
|
-
#
|
21
|
-
# ywesee - intellectual capital connected, Winterthurerstrasse 52, CH-8006 Zürich, Switzerland
|
22
|
-
# hwyss@ywesee.com
|
23
|
-
#
|
24
|
-
# SBSM::Request -- sbsm -- 24.10.2012 -- yasaka@ywesee.com
|
25
|
-
# SBSM::Request -- sbsm -- 24.01.2012 -- mhatakeyama@ywesee.com
|
26
|
-
# SBSM::Request -- sbsm -- hwyss@ywesee.com
|
27
|
-
|
28
|
-
require 'cgi'
|
29
|
-
|
30
|
-
require 'sbsm/cgi'
|
31
|
-
require 'sbsm/drb'
|
32
|
-
require 'cgi/session'
|
33
|
-
require 'cgi/drbsession'
|
34
|
-
require 'delegate'
|
35
|
-
|
36
|
-
module SBSM
|
37
|
-
class Request < SimpleDelegator
|
38
|
-
include DRbUndumped
|
39
|
-
attr_reader :cgi
|
40
|
-
def initialize(drb_uri, html_version = "html4", cgiclass = CGI)
|
41
|
-
@cgi = CGI.initialize_without_offline_prompt('html4')
|
42
|
-
@drb_uri = drb_uri
|
43
|
-
@thread = nil
|
44
|
-
@request = Apache.request
|
45
|
-
super(@cgi)
|
46
|
-
end
|
47
|
-
def cookies
|
48
|
-
@cgi.cookies
|
49
|
-
end
|
50
|
-
def is_crawler?
|
51
|
-
crawler_pattern = /archiver|slurp|bot|crawler|jeeves|spider|\.{6}/i
|
52
|
-
!!crawler_pattern.match(@cgi.user_agent)
|
53
|
-
end
|
54
|
-
def passthru(path, disposition='attachment')
|
55
|
-
# the variable @passthru is set by a trusted source
|
56
|
-
@passthru = path.untaint
|
57
|
-
@disposition = disposition
|
58
|
-
''
|
59
|
-
end
|
60
|
-
def process
|
61
|
-
begin
|
62
|
-
@cgi.params.store('default_flavor', ENV['DEFAULT_FLAVOR'])
|
63
|
-
@request.notes.each { |key, val|
|
64
|
-
@cgi.params.store(key, val)
|
65
|
-
}
|
66
|
-
drb_process()
|
67
|
-
#drb_request()
|
68
|
-
#drb_response()
|
69
|
-
rescue StandardError => e
|
70
|
-
handle_exception(e)
|
71
|
-
ensure
|
72
|
-
@session.close if @session.respond_to?(:close)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
def remote_host(lookup_type=Apache::REMOTE_NOLOOKUP)
|
76
|
-
@request.remote_host(lookup_type)
|
77
|
-
end
|
78
|
-
def unparsed_uri
|
79
|
-
@request.unparsed_uri
|
80
|
-
end
|
81
|
-
private
|
82
|
-
def lock
|
83
|
-
lock_file = '/tmp/sbsm_lock'
|
84
|
-
open(lock_file, 'a') do |st|
|
85
|
-
st.flock(File::LOCK_EX)
|
86
|
-
yield
|
87
|
-
st.flock(File::LOCK_UN)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
def drb_server_threads
|
91
|
-
threads = 0
|
92
|
-
status = '/var/www/oddb.org/doc/resources/downloads/status'
|
93
|
-
if File.exist?(status)
|
94
|
-
open(status) do |file|
|
95
|
-
if file.gets =~ /threads:\s+(\d+)/
|
96
|
-
threads = $1.to_i
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
threads
|
101
|
-
end
|
102
|
-
def drop_flag(flag = nil)
|
103
|
-
file = '/tmp/sbsm_drop_flag'
|
104
|
-
if flag != nil # write
|
105
|
-
lock do
|
106
|
-
open(file, 'w') do |f|
|
107
|
-
f.print flag.to_s
|
108
|
-
end
|
109
|
-
end
|
110
|
-
else # read
|
111
|
-
unless File.exist?(file)
|
112
|
-
lock do
|
113
|
-
open(file, 'w') do |f|
|
114
|
-
f.print false
|
115
|
-
flag = false
|
116
|
-
end
|
117
|
-
end
|
118
|
-
else
|
119
|
-
open(file, 'r') do |f|
|
120
|
-
flag = if f.gets.chomp =~ /true/
|
121
|
-
true
|
122
|
-
else
|
123
|
-
false
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
flag
|
129
|
-
end
|
130
|
-
def check_threads
|
131
|
-
time = Time.now.sec.to_i % 5
|
132
|
-
if time == 0
|
133
|
-
#if drb_server_threads > 50
|
134
|
-
if drb_server_threads > 30
|
135
|
-
drop_flag true
|
136
|
-
else
|
137
|
-
drop_flag false
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
def is_drop?
|
142
|
-
if unparsed_uri =~ /pointer/ or (is_crawler? && drop_flag)
|
143
|
-
true
|
144
|
-
end
|
145
|
-
end
|
146
|
-
def drb_process
|
147
|
-
args = {
|
148
|
-
'database_manager' => CGI::Session::DRbSession,
|
149
|
-
'drbsession_uri' => @drb_uri,
|
150
|
-
'session_path' => '/',
|
151
|
-
}
|
152
|
-
check_threads
|
153
|
-
if is_drop?
|
154
|
-
return
|
155
|
-
end
|
156
|
-
if(is_crawler?)
|
157
|
-
sleep 2.0
|
158
|
-
sid = [ENV['DEFAULT_FLAVOR'], @cgi.params['language'], @cgi.user_agent].join('-')
|
159
|
-
args.store('session_id', sid)
|
160
|
-
end
|
161
|
-
@session = CGI::Session.new(@cgi, args)
|
162
|
-
@proxy = @session[:proxy]
|
163
|
-
res = @proxy.drb_process(self)
|
164
|
-
cookie_input = @proxy.cookie_input
|
165
|
-
# view.to_html can call passthru instead of sending data
|
166
|
-
if(@passthru)
|
167
|
-
unless(cookie_input.empty?)
|
168
|
-
cookie = generate_cookie(cookie_input)
|
169
|
-
@request.headers_out.add('Set-Cookie', cookie.to_s)
|
170
|
-
end
|
171
|
-
basename = File.basename(@passthru)
|
172
|
-
fullpath = File.expand_path(
|
173
|
-
@passthru,
|
174
|
-
@request.server.document_root.untaint)
|
175
|
-
subreq = @request.lookup_file(fullpath)
|
176
|
-
@request.content_type = subreq.content_type
|
177
|
-
@request.headers_out.add('Content-Disposition',
|
178
|
-
"#@disposition; filename=#{basename}")
|
179
|
-
@request.headers_out.add('Content-Length',
|
180
|
-
File.size(fullpath).to_s)
|
181
|
-
begin
|
182
|
-
File.open(fullpath) { |fd| @request.send_fd(fd) }
|
183
|
-
rescue Errno::ENOENT, IOError => err
|
184
|
-
@request.log_reason(err.message, @passthru)
|
185
|
-
return Apache::NOT_FOUND
|
186
|
-
end
|
187
|
-
else
|
188
|
-
begin
|
189
|
-
headers = @proxy.http_headers
|
190
|
-
unless(cookie_input.empty?)
|
191
|
-
cookie = generate_cookie(cookie_input)
|
192
|
-
headers.store('Set-Cookie', cookie.to_s)
|
193
|
-
end
|
194
|
-
@cgi.out(headers) {
|
195
|
-
(@cgi.params.has_key?("pretty")) ? CGI.pretty( res ) : res
|
196
|
-
}
|
197
|
-
rescue StandardError => e
|
198
|
-
handle_exception(e)
|
199
|
-
end
|
200
|
-
end
|
201
|
-
end
|
202
|
-
def generate_cookie(cookie_input)
|
203
|
-
cookie_pairs = cookie_input.collect { |pair|
|
204
|
-
pair.join('=')
|
205
|
-
}.join(';')
|
206
|
-
cookie_hash = {
|
207
|
-
"name" => @proxy.cookie_name || 'sbsm-persistent-cookie',
|
208
|
-
"value" => cookie_pairs,
|
209
|
-
"path" => "/",
|
210
|
-
"expires" => (Time.now + (60 * 60 * 24 * 365 * 10)),
|
211
|
-
}
|
212
|
-
CGI::Cookie.new(cookie_hash).to_s
|
213
|
-
end
|
214
|
-
def handle_exception(e)
|
215
|
-
if defined?(Apache)
|
216
|
-
msg = [
|
217
|
-
[Time.now, self.object_id].join(' - '),
|
218
|
-
e.class,
|
219
|
-
e.message,
|
220
|
-
].join(" - ")
|
221
|
-
uri = unparsed_uri
|
222
|
-
@request.log_reason(msg, uri)
|
223
|
-
e.backtrace.each { |line|
|
224
|
-
@request.log_reason(line, uri)
|
225
|
-
}
|
226
|
-
end
|
227
|
-
hdrs = {
|
228
|
-
'Status' => '302 Moved',
|
229
|
-
'Location' => '/resources/errors/appdown.html',
|
230
|
-
}
|
231
|
-
@cgi.header(hdrs)
|
232
|
-
end
|
233
|
-
end
|
234
|
-
end
|