zorglub 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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