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.
@@ -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
@@ -0,0 +1,13 @@
1
+ # -*- coding: UTF-8 -*-
2
+ #
3
+ module Zorglub
4
+ #
5
+ class Node
6
+ #
7
+ def session
8
+ @request.session
9
+ end
10
+ #
11
+ end
12
+ #
13
+ end
@@ -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 ||= Session.new @request
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
- @data = {}
17
- class << self
18
- attr_reader :data
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 initialize sid
22
- @sid = sid
23
- # TODO if sid is nil, one should be created
24
- @session_data = SessionHash.data[sid]||={}
30
+ def [] key
31
+ load_data!
32
+ super key
25
33
  end
26
34
  #
27
- def exists?
28
- not @sid.nil?
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 [] idx
32
- @session_data[idx]
42
+ def []= key, value
43
+ load_data!
44
+ super key, value
33
45
  end
34
46
  #
35
- def []= idx, v
36
- @session_data[idx] = v
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
- @session_key = 'zorglub.sid'
43
- @session_kls = Zorglub::SessionHash
44
- class << self
45
- attr_accessor :session_key, :session_kls
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 initialize req
49
- @request = req
50
- @instance = nil
62
+ def update hash
63
+ load_data!
64
+ super stringify_keys(hash)
51
65
  end
52
66
  #
53
- def setup!
54
- if Config.session_on
55
- @instance = Session.session_kls.new @request.cookies[Session.session_key]
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
- @instance = {}
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
- setup! if @instance.nil?
64
- @instance.exists?
81
+ ( loaded? ? @sessions.has_key?(@sid) : false )
65
82
  end
66
83
  #
67
- def [] idx
68
- setup! if @instance.nil?
69
- @instance[idx]
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 []= idx, v
73
- setup! if @instance.nil?
74
- @instance[idx] = v
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
@@ -7,7 +7,7 @@ require './lib/zorglub/app'
7
7
  #
8
8
  module Zorglub
9
9
  #
10
- VERSION = '0.0.1'
10
+ VERSION = '0.0.2'
11
11
  #
12
12
  end
13
13
  #
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.1
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: &12631340 !ruby/object:Gem::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: *12631340
24
+ version_requirements: *15670960
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &12630520 !ruby/object:Gem::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: *12630520
35
+ version_requirements: *15670060
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &12629940 !ruby/object:Gem::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: *12629940
46
+ version_requirements: *15669580
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bones
49
- requirement: &12629360 !ruby/object:Gem::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: *12629360
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