sbsm 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/COPYING +515 -0
  2. data/History.txt +5 -0
  3. data/Manifest.txt +49 -0
  4. data/README.txt +41 -0
  5. data/Rakefile +28 -0
  6. data/data/_flavored_uri.grammar +24 -0
  7. data/data/_uri.grammar +22 -0
  8. data/data/_zone_uri.grammar +24 -0
  9. data/data/flavored_uri.grammar +24 -0
  10. data/data/uri.grammar +22 -0
  11. data/data/zone_uri.grammar +24 -0
  12. data/install.rb +1098 -0
  13. data/lib/cgi/drbsession.rb +37 -0
  14. data/lib/sbsm/cgi.rb +79 -0
  15. data/lib/sbsm/drb.rb +19 -0
  16. data/lib/sbsm/drbserver.rb +162 -0
  17. data/lib/sbsm/exception.rb +28 -0
  18. data/lib/sbsm/flavored_uri_parser.rb +47 -0
  19. data/lib/sbsm/index.rb +66 -0
  20. data/lib/sbsm/lookandfeel.rb +176 -0
  21. data/lib/sbsm/lookandfeelfactory.rb +50 -0
  22. data/lib/sbsm/lookandfeelwrapper.rb +109 -0
  23. data/lib/sbsm/redefine_19_cookie.rb +4 -0
  24. data/lib/sbsm/redirector.rb +37 -0
  25. data/lib/sbsm/request.rb +162 -0
  26. data/lib/sbsm/session.rb +542 -0
  27. data/lib/sbsm/state.rb +301 -0
  28. data/lib/sbsm/time.rb +29 -0
  29. data/lib/sbsm/trans_handler.rb +119 -0
  30. data/lib/sbsm/turing.rb +25 -0
  31. data/lib/sbsm/uri_parser.rb +45 -0
  32. data/lib/sbsm/user.rb +47 -0
  33. data/lib/sbsm/validator.rb +256 -0
  34. data/lib/sbsm/viralstate.rb +47 -0
  35. data/lib/sbsm/zone_uri_parser.rb +48 -0
  36. data/test/data/dos_file.txt +2 -0
  37. data/test/data/lnf_file.txt +2 -0
  38. data/test/data/mac_file.txt +1 -0
  39. data/test/stub/cgi.rb +35 -0
  40. data/test/suite.rb +29 -0
  41. data/test/test_drbserver.rb +83 -0
  42. data/test/test_index.rb +90 -0
  43. data/test/test_lookandfeel.rb +230 -0
  44. data/test/test_session.rb +372 -0
  45. data/test/test_state.rb +176 -0
  46. data/test/test_trans_handler.rb +447 -0
  47. data/test/test_user.rb +44 -0
  48. data/test/test_validator.rb +126 -0
  49. data/usage-en.txt +112 -0
  50. metadata +142 -0
@@ -0,0 +1,447 @@
1
+ #!/usr/bin/env ruby
2
+ # TestTransHandler -- sbsm -- 23.09.2004 -- hwyss@ywesee.com
3
+
4
+ $: << File.dirname(__FILE__)
5
+ $:.unshift File.expand_path('../lib', File.dirname(__FILE__))
6
+
7
+ require 'test/unit'
8
+ require 'sbsm/trans_handler'
9
+ require 'cgi'
10
+ require 'fileutils'
11
+
12
+ module Apache
13
+ DECLINED = 0
14
+ end
15
+ module SBSM
16
+ class TestTransHandler < Test::Unit::TestCase
17
+ class RequestStub
18
+ attr_accessor :uri, :notes, :server
19
+ end
20
+ class ServerStub
21
+ attr_accessor :document_root
22
+ def log_notice(fmt, *args)
23
+ end
24
+ def log_warn(*args)
25
+ warn(args.join(' - '))
26
+ end
27
+ end
28
+ class NotesStub < Hash
29
+ alias :add :store
30
+ end
31
+ def setup
32
+ @doc_root = File.expand_path('data/htdoc', File.dirname(__FILE__))
33
+ @etc_path = File.expand_path('../etc', @doc_root)
34
+ @doc_root.taint
35
+ end
36
+ def teardown
37
+ FileUtils.rm_r(@etc_path) if(File.exist?(@etc_path))
38
+ end
39
+ def test_parser_name
40
+ assert_equal('uri', TransHandler.instance.parser_name)
41
+ assert_equal('flavored_uri',
42
+ FlavoredTransHandler.instance.parser_name)
43
+ assert_not_equal(TransHandler.instance.uri_parser,
44
+ FlavoredTransHandler.instance.uri_parser)
45
+ end
46
+ def test_translate_uri
47
+ request = RequestStub.new
48
+ request.server = ServerStub.new
49
+
50
+ request.uri = '/'
51
+ request.notes = NotesStub.new
52
+ TransHandler.instance.translate_uri(request)
53
+ assert_equal({}, request.notes)
54
+ assert_equal('/index.rbx', request.uri)
55
+
56
+ request.uri = '/fr'
57
+ request.notes = NotesStub.new
58
+ TransHandler.instance.translate_uri(request)
59
+ assert_equal({'language' => 'fr'}, request.notes)
60
+ assert_equal('/index.rbx', request.uri)
61
+
62
+ request.uri = '/en/'
63
+ request.notes = NotesStub.new
64
+ TransHandler.instance.translate_uri(request)
65
+ assert_equal({'language' => 'en'}, request.notes)
66
+ assert_equal('/index.rbx', request.uri)
67
+
68
+ request.uri = '/de/search/state_id/407422388/search_query/ponstan'
69
+ request.notes = NotesStub.new
70
+ TransHandler.instance.translate_uri(request)
71
+ expected = {
72
+ 'language' => 'de',
73
+ 'event' => 'search',
74
+ 'state_id' => '407422388',
75
+ 'search_query'=> 'ponstan',
76
+ }
77
+ assert_equal(expected, request.notes)
78
+ assert_equal('/index.rbx', request.uri)
79
+
80
+ request.uri = '/de/search/state_id/407422388/search_query/ponstan/page/4'
81
+ request.notes = NotesStub.new
82
+ TransHandler.instance.translate_uri(request)
83
+ expected = {
84
+ 'language' => 'de',
85
+ 'event' => 'search',
86
+ 'state_id' => '407422388',
87
+ 'search_query'=> 'ponstan',
88
+ 'page' => '4',
89
+ }
90
+ assert_equal(expected, request.notes)
91
+ assert_equal('/index.rbx', request.uri)
92
+
93
+ request.uri = '/de/search/pretty//state_id/407422388/search_query/ponstan/page/4'
94
+ request.notes = NotesStub.new
95
+ expected = '/index.rbx?language=de&event=search&pretty=&state_id=407422388&search_query=ponstan&page=4'
96
+ TransHandler.instance.translate_uri(request)
97
+ expected = {
98
+ 'language' => 'de',
99
+ 'event' => 'search',
100
+ 'pretty' => '',
101
+ 'state_id' => '407422388',
102
+ 'search_query'=> 'ponstan',
103
+ 'page' => '4',
104
+ }
105
+ assert_equal(expected, request.notes)
106
+ assert_equal('/index.rbx', request.uri)
107
+
108
+ request.uri = '/de/search/search_query/'
109
+ request.notes = NotesStub.new
110
+ TransHandler.instance.translate_uri(request)
111
+ expected = {
112
+ 'language' => 'de',
113
+ 'event' => 'search',
114
+ 'search_query'=> '',
115
+ }
116
+ assert_equal(expected, request.notes)
117
+ assert_equal('/index.rbx', request.uri)
118
+ end
119
+ def test_translate_uri__shortcut
120
+ request = RequestStub.new
121
+ request.server = ServerStub.new
122
+ request.server.document_root = @doc_root
123
+
124
+ request.uri = '/shortcut'
125
+ request.notes = NotesStub.new
126
+ assert_nothing_raised {
127
+ TransHandler.instance.translate_uri(request)
128
+ }
129
+ assert_equal({}, request.notes)
130
+ assert_equal('/shortcut', request.uri)
131
+
132
+ FileUtils.mkdir_p(@etc_path)
133
+ shortcut = File.join(@etc_path, 'trans_handler.yml')
134
+ File.open(shortcut, 'w') { |fh|
135
+ fh.puts <<-EOS
136
+ ---
137
+ shortcut:
138
+ /somewhere:
139
+ over: the rainbow
140
+ goodbye: yellow brick road
141
+ /shortcut:
142
+ shortcut: variables
143
+ EOS
144
+ }
145
+
146
+ request.uri = '/shortcut'
147
+ request.notes = NotesStub.new
148
+ assert_nothing_raised {
149
+ # run in safe-mode
150
+ Thread.new {
151
+ $SAFE = 1
152
+ TransHandler.instance.translate_uri(request)
153
+ }.join
154
+ }
155
+ assert_equal({'shortcut' => 'variables'}, request.notes)
156
+ assert_equal('/index.rbx', request.uri)
157
+
158
+ request.uri = '/somewhere'
159
+ request.notes = NotesStub.new
160
+ TransHandler.instance.translate_uri(request)
161
+ expected = {
162
+ 'over' => 'the rainbow',
163
+ 'goodbye' => 'yellow brick road',
164
+ }
165
+ assert_equal(expected, request.notes)
166
+ assert_equal('/index.rbx', request.uri)
167
+ end
168
+ end
169
+ class TestFlavoredTransHandler < Test::Unit::TestCase
170
+ class RequestStub
171
+ attr_accessor :uri, :notes, :server
172
+ end
173
+ class ServerStub
174
+ attr_accessor :document_root
175
+ def log_notice(fmt, *args)
176
+ end
177
+ def log_warn(*args)
178
+ warn(args.join(' - '))
179
+ end
180
+ end
181
+ class NotesStub < Hash
182
+ alias :add :store
183
+ end
184
+ def setup
185
+ @doc_root = File.expand_path('data/htdoc', File.dirname(__FILE__))
186
+ @etc_path = File.expand_path('../etc', @doc_root)
187
+ @doc_root.taint
188
+ end
189
+ def teardown
190
+ FileUtils.rm_r(@etc_path) if(File.exist?(@etc_path))
191
+ end
192
+ def test_translate_uri
193
+ request = RequestStub.new
194
+ request.server = ServerStub.new
195
+
196
+ request.uri = '/'
197
+ request.notes = NotesStub.new
198
+ FlavoredTransHandler.instance.translate_uri(request)
199
+ assert_equal({}, request.notes)
200
+ assert_equal('/index.rbx', request.uri)
201
+
202
+ request.uri = '/fr'
203
+ request.notes = NotesStub.new
204
+ FlavoredTransHandler.instance.translate_uri(request)
205
+ assert_equal({'language' => 'fr'}, request.notes)
206
+ assert_equal('/index.rbx', request.uri)
207
+
208
+ request.uri = '/en/'
209
+ request.notes = NotesStub.new
210
+ FlavoredTransHandler.instance.translate_uri(request)
211
+ assert_equal({'language' => 'en'}, request.notes)
212
+ assert_equal('/index.rbx', request.uri)
213
+
214
+ request.uri = '/en/flavor'
215
+ request.notes = NotesStub.new
216
+ FlavoredTransHandler.instance.translate_uri(request)
217
+ expected = {
218
+ 'language'=> 'en',
219
+ 'flavor' => 'flavor',
220
+ }
221
+ assert_equal(expected, request.notes)
222
+ assert_equal('/index.rbx', request.uri)
223
+
224
+ request.uri = '/en/other'
225
+ request.notes = NotesStub.new
226
+ FlavoredTransHandler.instance.translate_uri(request)
227
+ expected = {
228
+ 'language'=> 'en',
229
+ 'flavor' => 'other',
230
+ }
231
+ assert_equal(expected, request.notes)
232
+ assert_equal('/index.rbx', request.uri)
233
+
234
+ request.uri = '/de/gcc/search/state_id/407422388/search_query/ponstan'
235
+ request.notes = NotesStub.new
236
+ FlavoredTransHandler.instance.translate_uri(request)
237
+ expected = {
238
+ 'language' => 'de',
239
+ 'flavor' => 'gcc',
240
+ 'event' => 'search',
241
+ 'state_id' => '407422388',
242
+ 'search_query'=> 'ponstan',
243
+ }
244
+ assert_equal(expected, request.notes)
245
+ assert_equal('/index.rbx', request.uri)
246
+
247
+ request.uri = '/de/gcc/search/state_id/407422388/search_query/ponstan/page/4'
248
+ request.notes = NotesStub.new
249
+ FlavoredTransHandler.instance.translate_uri(request)
250
+ expected = {
251
+ 'language' => 'de',
252
+ 'flavor' => 'gcc',
253
+ 'event' => 'search',
254
+ 'state_id' => '407422388',
255
+ 'search_query'=> 'ponstan',
256
+ 'page' => '4',
257
+ }
258
+ assert_equal(expected, request.notes)
259
+ assert_equal('/index.rbx', request.uri)
260
+
261
+ request.uri = '/de/gcc/search/pretty//state_id/407422388/search_query/ponstan/page/4'
262
+ request.notes = NotesStub.new
263
+ expected = '/index.rbx?language=de&flavor=gcc&event=search&pretty=&state_id=407422388&search_query=ponstan&page=4'
264
+ FlavoredTransHandler.instance.translate_uri(request)
265
+ expected = {
266
+ 'language' => 'de',
267
+ 'flavor' => 'gcc',
268
+ 'event' => 'search',
269
+ 'pretty' => '',
270
+ 'state_id' => '407422388',
271
+ 'search_query'=> 'ponstan',
272
+ 'page' => '4',
273
+ }
274
+ assert_equal(expected, request.notes)
275
+ assert_equal('/index.rbx', request.uri)
276
+
277
+ request.uri = '/de/gcc/search/search_query/'
278
+ request.notes = NotesStub.new
279
+ FlavoredTransHandler.instance.translate_uri(request)
280
+ expected = {
281
+ 'language' => 'de',
282
+ 'flavor' => 'gcc',
283
+ 'event' => 'search',
284
+ 'search_query'=> '',
285
+ }
286
+ assert_equal(expected, request.notes)
287
+ assert_equal('/index.rbx', request.uri)
288
+ end
289
+ def test_translate_uri__shortcut
290
+ request = RequestStub.new
291
+ request.server = ServerStub.new
292
+ request.server.document_root = @doc_root
293
+
294
+ request.uri = '/shortcut'
295
+ request.notes = NotesStub.new
296
+ assert_nothing_raised {
297
+ FlavoredTransHandler.instance.translate_uri(request)
298
+ }
299
+ assert_equal({}, request.notes)
300
+ assert_equal('/shortcut', request.uri)
301
+
302
+ FileUtils.mkdir_p(@etc_path)
303
+ shortcut = File.join(@etc_path, 'trans_handler.yml')
304
+ File.open(shortcut, 'w') { |fh|
305
+ fh.puts <<-EOS
306
+ ---
307
+ shortcut:
308
+ /somewhere:
309
+ over: the rainbow
310
+ goodbye: yellow brick road
311
+ /shortcut:
312
+ shortcut: variables
313
+ EOS
314
+ }
315
+
316
+ request.uri = '/shortcut'
317
+ request.notes = NotesStub.new
318
+ assert_nothing_raised {
319
+ # run in safe-mode
320
+ Thread.new {
321
+ $SAFE = 1
322
+ FlavoredTransHandler.instance.translate_uri(request)
323
+ }.join
324
+ }
325
+ assert_equal({'shortcut' => 'variables'}, request.notes)
326
+ assert_equal('/index.rbx', request.uri)
327
+
328
+ request.uri = '/somewhere'
329
+ request.notes = NotesStub.new
330
+ FlavoredTransHandler.instance.translate_uri(request)
331
+ expected = {
332
+ 'over' => 'the rainbow',
333
+ 'goodbye' => 'yellow brick road',
334
+ }
335
+ assert_equal(expected, request.notes)
336
+ assert_equal('/index.rbx', request.uri)
337
+ end
338
+ end
339
+ class TestZoneTransHandler < Test::Unit::TestCase
340
+ class RequestStub
341
+ attr_accessor :uri, :notes, :server
342
+ end
343
+ class ServerStub
344
+ attr_accessor :document_root
345
+ def log_notice(fmt, *args)
346
+ end
347
+ def log_warn(*args)
348
+ warn(args.join(' - '))
349
+ end
350
+ end
351
+ class NotesStub < Hash
352
+ alias :add :store
353
+ end
354
+ def setup
355
+ @doc_root = File.expand_path('data/htdoc', File.dirname(__FILE__))
356
+ @etc_path = File.expand_path('../etc', @doc_root)
357
+ @doc_root.taint
358
+ end
359
+ def teardown
360
+ FileUtils.rm_r(@etc_path) if(File.exist?(@etc_path))
361
+ end
362
+ def test_translate_uri
363
+ request = RequestStub.new
364
+ request.server = ServerStub.new
365
+
366
+ request.uri = '/'
367
+ request.notes = NotesStub.new
368
+ ZoneTransHandler.instance.translate_uri(request)
369
+ assert_equal({}, request.notes)
370
+ assert_equal('/index.rbx', request.uri)
371
+
372
+ request.uri = '/fr'
373
+ request.notes = NotesStub.new
374
+ ZoneTransHandler.instance.translate_uri(request)
375
+ assert_equal({'language' => 'fr'}, request.notes)
376
+ assert_equal('/index.rbx', request.uri)
377
+
378
+ request.uri = '/en/'
379
+ request.notes = NotesStub.new
380
+ ZoneTransHandler.instance.translate_uri(request)
381
+ assert_equal({'language' => 'en'}, request.notes)
382
+ assert_equal('/index.rbx', request.uri)
383
+
384
+ request.uri = '/en/zone'
385
+ request.notes = NotesStub.new
386
+ ZoneTransHandler.instance.translate_uri(request)
387
+ expected = {
388
+ 'language'=> 'en',
389
+ 'zone' => 'zone',
390
+ }
391
+ assert_equal(expected, request.notes)
392
+ assert_equal('/index.rbx', request.uri)
393
+
394
+ request.uri = '/en/other'
395
+ request.notes = NotesStub.new
396
+ ZoneTransHandler.instance.translate_uri(request)
397
+ expected = {
398
+ 'language'=> 'en',
399
+ 'zone' => 'other',
400
+ }
401
+ assert_equal(expected, request.notes)
402
+ assert_equal('/index.rbx', request.uri)
403
+
404
+ request.uri = '/de/gcc/search/state_id/407422388/search_query/ponstan/page/4'
405
+ request.notes = NotesStub.new
406
+ ZoneTransHandler.instance.translate_uri(request)
407
+ expected = {
408
+ 'language' => 'de',
409
+ 'zone' => 'gcc',
410
+ 'event' => 'search',
411
+ 'state_id' => '407422388',
412
+ 'search_query'=> 'ponstan',
413
+ 'page' => '4',
414
+ }
415
+ assert_equal(expected, request.notes)
416
+ assert_equal('/index.rbx', request.uri)
417
+
418
+ request.uri = '/de/gcc/search/pretty//state_id/407422388/search_query/ponstan/page/4'
419
+ request.notes = NotesStub.new
420
+ expected = '/index.rbx?language=de&zone=gcc&event=search&detail=objid&pretty=&state_id=407422388&search_query=ponstan&page=4'
421
+ ZoneTransHandler.instance.translate_uri(request)
422
+ expected = {
423
+ 'language' => 'de',
424
+ 'zone' => 'gcc',
425
+ 'event' => 'search',
426
+ 'pretty' => '',
427
+ 'state_id' => '407422388',
428
+ 'search_query'=> 'ponstan',
429
+ 'page' => '4',
430
+ }
431
+ assert_equal(expected, request.notes)
432
+ assert_equal('/index.rbx', request.uri)
433
+
434
+ request.uri = '/de/gcc/search/search_query/'
435
+ request.notes = NotesStub.new
436
+ ZoneTransHandler.instance.translate_uri(request)
437
+ expected = {
438
+ 'language' => 'de',
439
+ 'zone' => 'gcc',
440
+ 'event' => 'search',
441
+ 'search_query'=> '',
442
+ }
443
+ assert_equal(expected, request.notes)
444
+ assert_equal('/index.rbx', request.uri)
445
+ end
446
+ end
447
+ end
data/test/test_user.rb ADDED
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # State Based Session Management
4
+ # Copyright (C) 2004 Hannes Wyss
5
+ #
6
+ # This library is free software; you can redistribute it and/or
7
+ # modify it under the terms of the GNU Lesser General Public
8
+ # License as published by the Free Software Foundation; either
9
+ # version 2.1 of the License, or (at your option) any later version.
10
+ #
11
+ # This library is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ # Lesser General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Lesser General Public
17
+ # License along with this library; if not, write to the Free Software
18
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
+ #
20
+ # ywesee - intellectual capital connected, Winterthurerstrasse 52, CH-8006 Z�rich, Switzerland
21
+ # hwyss@ywesee.com
22
+ #
23
+ # TestUser -- sbsm -- 20.11.2002 -- hwyss@ywesee.com
24
+
25
+ $: << File.dirname(__FILE__)
26
+ $: << File.expand_path("../lib", File.dirname(__FILE__))
27
+
28
+ require 'test/unit'
29
+ require 'sbsm/user'
30
+ require 'sbsm/state'
31
+
32
+ class StubUserState < SBSM::State; end
33
+ class User < SBSM::User
34
+ NAVIGATION = [StubUserState]
35
+ end
36
+
37
+ class TestUser < Test::Unit::TestCase
38
+ def setup
39
+ @user = User.new
40
+ end
41
+ def test_navigation
42
+ assert_equal([StubUserState], @user.navigation)
43
+ end
44
+ end