zorglub 0.0.1 → 0.0.2
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.
- data/lib/zorglub/config.rb +5 -1
- data/lib/zorglub/rack_session.rb +13 -0
- data/lib/zorglub/session.rb +112 -38
- data/lib/zorglub.rb +1 -1
- metadata +10 -9
data/lib/zorglub/config.rb
CHANGED
@@ -9,7 +9,11 @@ module Zorglub
|
|
9
9
|
:layout => 'default',
|
10
10
|
:view_dir => 'view',
|
11
11
|
:layout_dir => 'layout',
|
12
|
-
:session_on => false
|
12
|
+
:session_on => false,
|
13
|
+
:session_key => 'zorglub.sid',
|
14
|
+
:session_secret => 'session-secret-secret',
|
15
|
+
:session_sid_len => 64
|
16
|
+
#
|
13
17
|
}
|
14
18
|
@engines = { }
|
15
19
|
class << self
|
data/lib/zorglub/session.rb
CHANGED
@@ -5,73 +5,147 @@ require 'securerandom'
|
|
5
5
|
module Zorglub
|
6
6
|
#
|
7
7
|
class Node
|
8
|
+
#
|
9
|
+
@sessions = {}
|
10
|
+
#
|
11
|
+
class << self
|
12
|
+
attr_reader :sessions
|
13
|
+
end
|
8
14
|
#
|
9
15
|
def session
|
10
|
-
@session ||=
|
16
|
+
@session ||= SessionHash.new @request, @response, Node.sessions
|
11
17
|
end
|
12
18
|
end
|
13
19
|
#
|
14
|
-
class SessionHash
|
20
|
+
class SessionHash < Hash
|
15
21
|
#
|
16
|
-
|
17
|
-
|
18
|
-
|
22
|
+
def initialize req, resp, sessions
|
23
|
+
@request = req
|
24
|
+
@response = resp
|
25
|
+
@sessions = sessions
|
26
|
+
@sid = nil
|
27
|
+
super()
|
19
28
|
end
|
20
29
|
#
|
21
|
-
def
|
22
|
-
|
23
|
-
|
24
|
-
@session_data = SessionHash.data[sid]||={}
|
30
|
+
def [] key
|
31
|
+
load_data!
|
32
|
+
super key
|
25
33
|
end
|
26
34
|
#
|
27
|
-
def
|
28
|
-
|
35
|
+
def has_key? key
|
36
|
+
load_data!
|
37
|
+
super key
|
29
38
|
end
|
39
|
+
alias :key? :has_key?
|
40
|
+
alias :include? :has_key?
|
30
41
|
#
|
31
|
-
def []
|
32
|
-
|
42
|
+
def []= key, value
|
43
|
+
load_data!
|
44
|
+
super key, value
|
33
45
|
end
|
34
46
|
#
|
35
|
-
def
|
36
|
-
|
47
|
+
def clear
|
48
|
+
load_data!
|
49
|
+
# @response.delete_cookie Zorglub::Config.session_key
|
50
|
+
# @sessions.delete @sid
|
51
|
+
# @sid = nil
|
52
|
+
super
|
37
53
|
end
|
38
|
-
end
|
39
|
-
#
|
40
|
-
class Session
|
41
54
|
#
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
55
|
+
def to_hash
|
56
|
+
load_data!
|
57
|
+
h = {}.replace(self)
|
58
|
+
h.delete_if { |k,v| v.nil? }
|
59
|
+
h
|
46
60
|
end
|
47
61
|
#
|
48
|
-
def
|
49
|
-
|
50
|
-
|
62
|
+
def update hash
|
63
|
+
load_data!
|
64
|
+
super stringify_keys(hash)
|
51
65
|
end
|
52
66
|
#
|
53
|
-
def
|
54
|
-
|
55
|
-
|
67
|
+
def delete key
|
68
|
+
load_data!
|
69
|
+
super key
|
70
|
+
end
|
71
|
+
#
|
72
|
+
def inspect
|
73
|
+
if loaded?
|
74
|
+
super
|
56
75
|
else
|
57
|
-
|
76
|
+
"#<#{self.class}:0x#{self.object_id.to_s(16)} not yet loaded>"
|
58
77
|
end
|
59
78
|
end
|
60
|
-
private :setup!
|
61
79
|
#
|
62
80
|
def exists?
|
63
|
-
|
64
|
-
@instance.exists?
|
81
|
+
( loaded? ? @sessions.has_key?(@sid) : false )
|
65
82
|
end
|
66
83
|
#
|
67
|
-
def
|
68
|
-
|
69
|
-
|
84
|
+
def loaded?
|
85
|
+
not @sid.nil?
|
86
|
+
end
|
87
|
+
#
|
88
|
+
def empty?
|
89
|
+
load_data!
|
90
|
+
super
|
91
|
+
end
|
92
|
+
#
|
93
|
+
private
|
94
|
+
#
|
95
|
+
def load_data!
|
96
|
+
return if loaded?
|
97
|
+
if Config.session_on
|
98
|
+
sid = @request.cookies[Zorglub::Config.session_key]
|
99
|
+
if sid.nil?
|
100
|
+
sid = generate_sid!
|
101
|
+
@response.set_cookie Zorglub::Config.session_key, sid
|
102
|
+
end
|
103
|
+
replace @sessions[sid] ||={}
|
104
|
+
@sessions[sid] = self
|
105
|
+
@sid = sid
|
106
|
+
end
|
70
107
|
end
|
71
108
|
#
|
72
|
-
def
|
73
|
-
|
74
|
-
|
109
|
+
def stringify_keys other
|
110
|
+
hash = {}
|
111
|
+
other.each do |key, value|
|
112
|
+
hash[key] = value
|
113
|
+
end
|
114
|
+
hash
|
115
|
+
end
|
116
|
+
#
|
117
|
+
def generate_sid!
|
118
|
+
begin sid = sid_algorithm end while @sessions.has_key? sid
|
119
|
+
sid
|
120
|
+
end
|
121
|
+
#
|
122
|
+
begin
|
123
|
+
require 'securerandom'
|
124
|
+
# Using SecureRandom, optional length.
|
125
|
+
# SecureRandom is available since Ruby 1.8.7.
|
126
|
+
# For Ruby versions earlier than that, you can require the uuidtools gem,
|
127
|
+
# which has a drop-in replacement for SecureRandom.
|
128
|
+
def sid_algorithm; SecureRandom.hex(Zorglub::Config.session_sid_len); end
|
129
|
+
rescue LoadError
|
130
|
+
require 'openssl'
|
131
|
+
# Using OpenSSL::Random for generation, this is comparable in performance
|
132
|
+
# with stdlib SecureRandom and also allows for optional length, it should
|
133
|
+
# have the same behaviour as the SecureRandom::hex method of the
|
134
|
+
# uuidtools gem.
|
135
|
+
def sid_algorithm
|
136
|
+
OpenSSL::Random.random_bytes(Zorglub::Config.session_sid_len / 2).unpack('H*')[0]
|
137
|
+
end
|
138
|
+
rescue LoadError
|
139
|
+
# Digest::SHA2::hexdigest produces a string of length 64, although
|
140
|
+
# collisions are not very likely, the entropy is still very low and
|
141
|
+
# length is not optional.
|
142
|
+
#
|
143
|
+
# Replacing it with OS-provided random data would take a lot of code and
|
144
|
+
# won't be as cross-platform as Ruby.
|
145
|
+
def sid_algorithm
|
146
|
+
entropy = [ srand, rand, Time.now.to_f, rand, $$, rand, object_id ]
|
147
|
+
Digest::SHA2.hexdigest(entropy.join)
|
148
|
+
end
|
75
149
|
end
|
76
150
|
#
|
77
151
|
end
|
data/lib/zorglub.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zorglub
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-01-04 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
16
|
-
requirement: &
|
16
|
+
requirement: &15670960 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.4.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *15670960
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &15670060 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.8.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *15670060
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &15669580 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.8.7
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *15669580
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: bones
|
49
|
-
requirement: &
|
49
|
+
requirement: &15668980 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: 3.7.3
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *15668980
|
58
58
|
description: a nano web application framework based on rack[http://rack.rubyforge.org/]
|
59
59
|
email: jeremy@asynk.ch
|
60
60
|
executables: []
|
@@ -69,6 +69,7 @@ files:
|
|
69
69
|
- lib/zorglub.rb
|
70
70
|
- lib/zorglub/session.rb
|
71
71
|
- lib/zorglub/app.rb
|
72
|
+
- lib/zorglub/rack_session.rb
|
72
73
|
- lib/zorglub/node.rb
|
73
74
|
- lib/zorglub/config.rb
|
74
75
|
- spec/data/view/node0/do_partial
|