rsence-pre 2.3.0.9 → 2.3.0.10

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.0.9.pre
1
+ 2.3.0.10.pre
@@ -12,7 +12,7 @@
12
12
  }
13
13
 
14
14
  .default .disabled .textarea_input {
15
- #{(BROWSER_TYPE.safari||BROWSER_TYPE.chrome)?'color:#ccc;':'color:#999'}
15
+ color: #333;
16
16
  }
17
17
  .default .textarea_input:focus {
18
18
  outline-color: transparent;
@@ -4,6 +4,7 @@ BROWSER_TYPE contains browser types.
4
4
  Used for quick checks mostly in layout code
5
5
  ###
6
6
  BROWSER_TYPE =
7
+ version: 0.0
7
8
  mac: false
8
9
  win: false
9
10
  ie: false
@@ -85,7 +85,7 @@
85
85
  .calendar_weeks_week_col_no {
86
86
  color: #666;
87
87
  }
88
- .calendar_weeks_week_col_no:hover {
88
+ .enabled > .calendar_control > .calendar_weeks > .calendar_weeks_week_row > .calendar_weeks_week_col_no:hover {
89
89
  color: #000;
90
90
  }
91
91
  .calendar_weeks_week_col_yes,
@@ -98,7 +98,7 @@
98
98
  .calendar_weeks_week_col_sel {
99
99
  background-color: #fff;
100
100
  }
101
- .calendar_weeks_week_col_yes:hover {
101
+ .enabled > .calendar_control > .calendar_weeks > .calendar_weeks_week_row > .calendar_weeks_week_col_yes:hover {
102
102
  border: 2px solid black; margin: -1px; z-index: 100; border-radius: 3px;
103
103
  }
104
104
  .calendar_bg {
@@ -110,8 +110,9 @@
110
110
  position: absolute;
111
111
  font-size: 0; line-height: 0; /* ie bug work-arounds */
112
112
  }
113
- .disabled > .calendar_bg {
114
- opacity: 0.9;
113
+ .disabled > .calendar_bg *,
114
+ .disabled > .calendar_control * {
115
+ opacity: 0.8;
115
116
  }
116
117
  .calendar_bg .calendar_nw,
117
118
  .calendar_bg .calendar_n,
@@ -423,7 +423,7 @@ module RSence
423
423
  break
424
424
  end
425
425
  else
426
- warn "Invalid module_const.class: #{module_const.class.inspect}"
426
+ warn "Invalid module_const.class: #{module_const.class.inspect} in bundle path: #{path.inspect}"
427
427
  end
428
428
  end
429
429
  end
@@ -0,0 +1,240 @@
1
+
2
+ require 'mongo'
3
+
4
+ # MongoSessionStorage is the SessionStorage backend for MongoDB
5
+ # Authentication string format is strictly like this for now:
6
+ # mongodb://username:password@host:port/database
7
+ class MongoSessionStorage
8
+
9
+ # Poor-man's connection string parser:
10
+ def parse_db_uri( db_pool_size=48, db_pool_timeout=2 )
11
+ db_str = @db_uri.split('mongodb://')[1]
12
+ ( db_auth_str, db_conn_str ) = db_str.split('@')
13
+ ( db_username, db_password ) = db_auth_str.split(':')
14
+ ( db_host, db_port_name_str ) = db_conn_str.split(':')
15
+ ( db_port, db_name ) = db_port_name_str.split('/')
16
+ return {
17
+ :pool_size => db_pool_size,
18
+ :pool_timeout => db_pool_timeout,
19
+ :host => db_host,
20
+ :port => db_port,
21
+ :username => db_username,
22
+ :password => db_password,
23
+ :db => db_name
24
+ }
25
+ end
26
+
27
+ # Opens database connection
28
+ def db_open
29
+ # mongodb://rsence:2N74krTMURIpSr6Y91Hy@localhost:37035/rsence_sessions
30
+ conn = parse_db_uri
31
+ @conn = Mongo::Connection.new( conn[:host], conn[:port], {
32
+ :pool_size => conn[:pool_size],
33
+ :pool_timeout => conn[:timeout],
34
+ :auths => [{
35
+ 'username' => conn[:username],
36
+ 'password' => conn[:password],
37
+ 'db_name' => conn[:db]
38
+ }]
39
+ } )
40
+ @conn.apply_saved_authentication
41
+ @db = @conn.db( conn[:db] )
42
+ @db_auth = @db.authenticate( conn[:username], conn[:password], true )
43
+ end
44
+
45
+ # Checks, whether the string can be converted to BSON::ObjectId
46
+ def legal_bson_str?( _id )
47
+ ( _id.class == String and BSON::ObjectId.legal?( _id ) )
48
+ end
49
+
50
+ # Converts string-id's to BSON id's
51
+ def bson_id( _id )
52
+ if legal_bson_str?( _id )
53
+ return BSON::ObjectId.from_string( _id )
54
+ elsif _id.class == BSON::ObjectId
55
+ return _id
56
+ else
57
+ return nil
58
+ end
59
+ end
60
+
61
+ # Closes database connection
62
+ def db_close
63
+ @conn.close
64
+ @db = nil
65
+ @db_auth = false
66
+ end
67
+
68
+ # Tests database authentication
69
+ def db_test
70
+ begin
71
+ db_open
72
+ rescue => e
73
+ warn "MongoDB connection exception: #{e.inspect}"
74
+ return false
75
+ end
76
+ return true if @db_auth
77
+ db_close
78
+ warn "MongoDB authentication failed"
79
+ return false
80
+ end
81
+
82
+ # Just binds the collections to their own instance members
83
+ def db_init
84
+ @ses_coll = @db['rsence_ses']
85
+ @up_coll = @db['rsence_uploads']
86
+ end
87
+
88
+ # Finds every document is the rsence_ses
89
+ # collection and calls #restore_session
90
+ def load_session_data
91
+ @ses_coll.find.each do |ses_row|
92
+ ses_id = ses_row['_id'].to_s
93
+ ses_data_bin = ses_row['ses_data']
94
+ if ses_data_bin.nil?
95
+ remove_session_data( ses_id )
96
+ else
97
+ begin
98
+ ses_data = Marshal.load( ses_data_bin.to_s )
99
+ rescue => e
100
+ warn "Unable to restore session #{ses_id}"
101
+ remove_session_data( ses_id )
102
+ end
103
+ restore_session( ses_id, ses_data )
104
+ end
105
+ end
106
+ end
107
+
108
+ # Inserts new session and returns its id
109
+ def insert_session_data( ses_data )
110
+ if legal_bson_str?( ses_data[:user_id] )
111
+ user_id = bson_id( ses_data[:user_id] )
112
+ else
113
+ user_id = ses_data[:user_id]
114
+ end
115
+ ses_id = @ses_coll.insert({
116
+ 'cookie_key' => ses_data[:cookie_key],
117
+ 'ses_key' => ses_data[:ses_key],
118
+ 'ses_timeout' => ses_data[:ses_timeout],
119
+ 'user_id' => user_id
120
+ })
121
+ return ses_id.to_s
122
+ end
123
+
124
+ # Stores the session data, requires inserted session
125
+ def store_session_data( ses_data )
126
+ ses_id = bson_id( ses_data[:ses_id] )
127
+ if legal_bson_str?( ses_data[:user_id] )
128
+ user_id = bson_id( ses_data[:user_id] )
129
+ else
130
+ user_id = ses_data[:user_id]
131
+ end
132
+ ses_data_bin = BSON::Binary.new( Marshal.dump( ses_data ) )
133
+ @ses_coll.update({'_id' => ses_id}, {'$set' => {
134
+ 'cookie_key' => ses_data[:cookie_key],
135
+ 'ses_key' => ses_data[:ses_key],
136
+ 'user_id' => user_id,
137
+ 'ses_data' => ses_data_bin,
138
+ 'ses_timeout' => ses_data[:timeout],
139
+ 'ses_stored' => Time.now.to_i
140
+ }})
141
+ end
142
+
143
+ # Removes session data of a session
144
+ def remove_session_data( ses_id )
145
+ ses_id = bson_id( ses_id )
146
+ @ses_coll.remove({'_id' => ses_id})
147
+ @up_coll.remove({'ses_id' => ses_id})
148
+ end
149
+
150
+ # Removes all session data
151
+ def remove_all_session_data
152
+ @ses_coll.remove
153
+ @up_coll.remove
154
+ end
155
+
156
+ # Creates upload, returns its id as string
157
+ def new_upload_data( data )
158
+ ses_id = bson_id( data[:ses_id] )
159
+ if legal_bson_str?( data[:ticket_id] )
160
+ ticket_id = bson_id( data[:ticket_id] )
161
+ else
162
+ ticket_id = data[:ticket_id]
163
+ end
164
+ return @up_coll.insert({
165
+ 'ses_id' => ses_id,
166
+ 'ticket_id' => ticket_id,
167
+ 'upload_date' => data[:upload_date],
168
+ 'upload_done' => data[:upload_done],
169
+ 'file_name' => data[:file_name],
170
+ 'file_size' => data[:file_size],
171
+ 'file_mime' => data[:file_mime],
172
+ 'file_data' => BSON::Binary.new( data[:file_data] )
173
+ }).to_s
174
+ end
175
+
176
+ # Sets upload data
177
+ def set_upload_data( upload_id, file_data )
178
+ upload_id = bson_id( upload_id )
179
+ @up_coll.update({'_id' => upload_id}, { '$set' => {
180
+ 'file_data' => BSON::Binary.new( file_data ),
181
+ 'upload_done' => true
182
+ }})
183
+ end
184
+
185
+ # Gets upload data
186
+ def get_upload_data( upload_id )
187
+ upload_id = bson_id( upload_id )
188
+ up_data = @up_coll.find_one({ '_id' => upload_id }, {
189
+ :fields => [ 'upload_date', 'upload_done', 'file_name',
190
+ 'file_size', 'file_mime', 'file_data' ]
191
+ })
192
+ return {
193
+ :upload_date => up_data['upload_date'],
194
+ :upload_done => up_data['upload_done'],
195
+ :file_name => up_data['file_name'],
196
+ :file_size => up_data['file_size'],
197
+ :file_mime => up_data['file_mime'],
198
+ :file_data => up_data['file_data'].to_s
199
+ }
200
+ end
201
+
202
+ # Gets upload metadata only
203
+ def get_upload_meta( upload_id )
204
+ upload_id = bson_id( upload_id )
205
+ up_data = @up_coll.find_one({ '_id' => upload_id }, {
206
+ :fields => [ 'upload_date', 'upload_done', 'file_name',
207
+ 'file_size', 'file_mime' ]
208
+ })
209
+ return {
210
+ :upload_date => up_data['upload_date'],
211
+ :upload_done => up_data['upload_done'],
212
+ :file_name => up_data['file_name'],
213
+ :file_size => up_data['file_size'],
214
+ :file_mime => up_data['file_mime'],
215
+ :file_data => nil
216
+ }
217
+ end
218
+
219
+ # Deletes upload by id
220
+ def del_upload( upload_id )
221
+ upload_id = bson_id( upload_id )
222
+ @up_coll.remove( { '_id' => upload_id } )
223
+ end
224
+
225
+ # Deletes upload by ticket_id and ses_id
226
+ def del_uploads( ticket_id, ses_id )
227
+ if legal_bson_str?( ses_id )
228
+ ses_id = bson_id( ses_id )
229
+ else
230
+ ses_id = false
231
+ end
232
+ if legal_bson_str?( ticket_id )
233
+ ticket_id = bson_id( ticket_id )
234
+ else
235
+ ticket_id = ticket_id
236
+ end
237
+ @up_coll.remove( { 'ses_id' => ses_id } ) if ses_id
238
+ @up_coll.remove( { 'ticket_id' => ticket_id } ) if ticket_id
239
+ end
240
+ end
@@ -0,0 +1,241 @@
1
+
2
+ require 'sequel'
3
+
4
+ # SequelSessionStorage is the SessionStorage backend for
5
+ # Sequel (SQL) database storage
6
+ class SequelSessionStorage
7
+
8
+ # Opens database connection
9
+ def db_open
10
+ # work-around for windows (drive letters causing confusion)
11
+ if @db_uri.start_with?('sqlite://')
12
+ @db = Sequel.sqlite( @db_uri.split('sqlite://')[1] )
13
+ else
14
+ @db = Sequel.connect(@db_uri)
15
+ end
16
+ end
17
+
18
+ # Tests database connection
19
+ def db_test
20
+ begin
21
+ db_open
22
+ if @db.table_exists?(:rsence_test)
23
+ @db.drop_table(:rsence_test)
24
+ end
25
+ @db.create_table(:rsence_test) { primary_key :id; String :test }
26
+ test_id = @db[:rsence_test].insert( :test => 'TestFoo' )
27
+ @db[:rsence_test].filter( :id => test_id ).update( :test => 'TestFoo2' )
28
+ @db[:rsence_test].filter( :id => test_id ).delete
29
+ @db[:rsence_test].delete
30
+ @db.drop_table(:rsence_test)
31
+ db_close
32
+ return true
33
+ rescue => e
34
+ if RSence.args[:debug]
35
+ err_msg = [
36
+ "ERROR: SessionStorage couldn't open database",
37
+ "#{e.class.to_s}, #{e.message}",
38
+ "Backtrace:",
39
+ "\t"+e.backtrace.join("\n\t")
40
+ ].join("\n")+"\n"
41
+ $stderr.write( err_msg )
42
+ elsif RSence.args[:verbose]
43
+ puts "Failed to open database '#{@db_uri}'."
44
+ puts "Run RSence in debug mode for full error output."
45
+ end
46
+ return false
47
+ end
48
+ end
49
+
50
+ # Closes database connection
51
+ def db_close
52
+ @db.disconnect
53
+ end
54
+
55
+ ## Creates the 'rsence_session' table, if necessary
56
+ ## This table is used to store sessions
57
+ def create_session_table
58
+ db_open
59
+ unless @db.table_exists?(:rsence_session)
60
+ puts "Creating session table..." if RSence.args[:verbose]
61
+ @db.create_table :rsence_session do
62
+ primary_key( :id )
63
+ column( :cookie_key, String )
64
+ column( :ses_key, String )
65
+ column( :ses_timeout, Integer )
66
+ column( :user_id, Integer )
67
+ column( :ses_active, TrueClass )
68
+ column( :ses_stored, Integer )
69
+ column( :ses_data, File )
70
+ end
71
+ end
72
+ db_close
73
+ end
74
+
75
+ ## Creates the 'rsence_version' table, if necessary
76
+ ## This table is used to check for the need of future database upgrades
77
+ def create_version_table
78
+ db_open
79
+ unless @db.table_exists?(:rsence_version)
80
+ puts "Creating version info table..." if RSence.args[:verbose]
81
+ @db.create_table :rsence_version do
82
+ Integer :version
83
+ end
84
+ @db[:rsence_version].insert(:version => 586)
85
+ end
86
+ db_close
87
+ end
88
+
89
+ ## Creates the 'rsence_uploads' table, if necessary
90
+ ## This table is used for storing temporary uploads before processing
91
+ def create_uploads_table
92
+ db_open
93
+ unless @db.table_exists?(:rsence_uploads)
94
+ puts "Creating uploads table..." if RSence.args[:verbose]
95
+ @db.create_table :rsence_uploads do
96
+ primary_key( :id )
97
+ foreign_key( :ses_id, :rsence_session )
98
+ column( :upload_date, Integer )
99
+ column( :upload_done, Integer )
100
+ column( :ticket_id, String )
101
+ column( :file_size, Integer )
102
+ column( :file_name, String )
103
+ column( :file_mime, String )
104
+ column( :file_data, File )
105
+ end
106
+ end
107
+ db_close
108
+ end
109
+
110
+ # returns the version in the rsence_version table
111
+ def table_version
112
+ db_open
113
+ rsence_version = @db[:rsence_version].select(:version).all[0][:version]
114
+ db_close
115
+ return rsence_version
116
+ end
117
+
118
+ ## Checks database connectivity and loads stored sessions from the database
119
+ def db_init
120
+
121
+ create_session_table
122
+ create_version_table
123
+ create_uploads_table
124
+
125
+ ## Used for future upgrades:
126
+ # version = table_version
127
+
128
+ return true
129
+ end
130
+
131
+ def load_session_data
132
+ @db[:rsence_session].all do |ses_row|
133
+ ses_id = ses_row[:id]
134
+ ses_data_dump = ses_row[:ses_data]
135
+ if ses_data_dump.nil?
136
+ remove_session_data( ses_id )
137
+ else
138
+ begin
139
+ ses_data = Marshal.load( ses_data_dump )
140
+ restore_session( ses_id, ses_data )
141
+ rescue => e
142
+ warn "Unable to load session: #{ses_id}, because: #{e.message}"
143
+ remove_session_data( ses_id )
144
+ end
145
+ end
146
+ end
147
+ end
148
+
149
+ def insert_session_data( ses_data )
150
+ db_open
151
+ new_id = @db[:rsence_session].insert( ses_data )
152
+ db_close
153
+ return new_id
154
+ end
155
+
156
+ def store_session_data( ses_data )
157
+ ses_data_dump = Marshal.dump( ses_data )
158
+ ses_id = ses_data[:ses_id]
159
+ db_open
160
+ @db[:rsence_session].filter(
161
+ :id => ses_id
162
+ ).update(
163
+ :cookie_key => ses_data[:cookie_key],
164
+ :ses_key => ses_data[:ses_key],
165
+ :user_id => ses_data[:user_id],
166
+ :ses_data => ses_data_dump.to_sequel_blob,
167
+ :ses_timeout => ses_data[:timeout],
168
+ :ses_stored => Time.now.to_i
169
+ )
170
+ db_close
171
+ end
172
+
173
+ def remove_session_data( ses_id )
174
+ db_open
175
+ # Deletes the session's row from the database
176
+ @db[:rsence_uploads].filter(:ses_id => ses_id).delete
177
+ @db[:rsence_session].filter(:id => ses_id).delete
178
+ db_close
179
+ end
180
+
181
+ def remove_all_session_data
182
+ db_open
183
+ @db[:rsence_session].delete if @db.table_exists?(:rsence_session)
184
+ @db[:rsence_uploads].delete if @db.table_exists?(:rsence_uploads)
185
+ db_close
186
+ end
187
+
188
+ def new_upload_data( data )
189
+ db_open
190
+ new_id = @db[:rsence_uploads].insert( data )
191
+ db_close
192
+ return new_id
193
+ end
194
+
195
+ def set_upload_data( upload_id, file_data )
196
+ db_open
197
+ @db[:rsence_uploads].filter(:id => upload_id).update( {
198
+ :file_data => file_data.to_sequel_blob,
199
+ :upload_done => true
200
+ } )
201
+ db_close
202
+ end
203
+
204
+ def get_upload_data( row_id )
205
+ db_open
206
+ row_datas = @db[:rsence_uploads].select(
207
+ :upload_date, :upload_done, :file_name,
208
+ :file_size, :file_mime, :file_data
209
+ ).filter(
210
+ :id => row_id
211
+ )
212
+ db_close
213
+ return row_datas.first
214
+ end
215
+
216
+ def get_upload_meta( row_id )
217
+ db_open
218
+ row_datas = @db[:rsence_uploads].select(
219
+ :upload_date, :upload_done, :file_name,
220
+ :file_size, :file_mime
221
+ ).filter(
222
+ :id => row_id
223
+ )
224
+ db_close
225
+ return row_datas.first
226
+ end
227
+
228
+ def del_upload( row_id )
229
+ db_open
230
+ @db[:rsence_uploads].filter( :id => row_id ).delete
231
+ db_close
232
+ end
233
+
234
+ def del_uploads( ticket_id, ses_id )
235
+ db_open
236
+ @db[:rsence_uploads].filter( :ticket_id => ticket_id ).delete
237
+ @db[:rsence_uploads].filter( :ses_id => ses_id ).delete
238
+ db_close
239
+ end
240
+
241
+ end
@@ -10,19 +10,21 @@
10
10
 
11
11
  module RSence
12
12
 
13
- require 'rubygems'
14
- require 'sequel'
15
-
16
13
  ## HValue class for session restoration
17
14
  require 'rsence/value'
18
-
15
+
16
+ if RSence.config[:database][:ses_db].start_with? 'mongodb://'
17
+ require 'rsence/session/mongo_sessionstorage'
18
+ SessionBackend = MongoSessionStorage
19
+ else
20
+ require 'rsence/session/sequel_sessionstorage'
21
+ SessionBackend = SequelSessionStorage
22
+ end
23
+
19
24
  # SessionStorage doesn't do anything by itself, it's simply
20
- # the superclass for SessionManager that does all the boring
21
- # housekeeping duties.
22
- #
23
- # Spliced of as a separate file to reduce the complexity
24
- # of SessionManager.
25
- class SessionStorage
25
+ # the superclass for SessionManager that handles the persistent
26
+ # storage.
27
+ class SessionStorage < SessionBackend
26
28
  attr_accessor :db
27
29
  def initialize
28
30
  ## Session data storage (by ses_id)
@@ -57,181 +59,26 @@ module RSence
57
59
  puts "Warning: Session database is not available. Can't use persistent sessions."
58
60
  @id_counter = 0
59
61
  end
60
-
61
62
  @accept_requests = true
62
-
63
63
  end
64
-
64
+ attr_reader :db_avail
65
65
  attr_reader :accept_requests
66
-
67
- def db_test
68
- begin
69
- db_open
70
- if @db.table_exists?(:rsence_test)
71
- @db.drop_table(:rsence_test)
72
- end
73
- @db.create_table(:rsence_test) { primary_key :id; String :test }
74
- test_id = @db[:rsence_test].insert( :test => 'TestFoo' )
75
- @db[:rsence_test].filter( :id => test_id ).update( :test => 'TestFoo2' )
76
- @db[:rsence_test].filter( :id => test_id ).delete
77
- @db[:rsence_test].delete
78
- @db.drop_table(:rsence_test)
79
- db_close
80
- return true
81
- rescue => e
82
- if RSence.args[:debug]
83
- err_msg = [
84
- "ERROR: SessionStorage couldn't open database",
85
- "#{e.class.to_s}, #{e.message}",
86
- "Backtrace:",
87
- "\t"+e.backtrace.join("\n\t")
88
- ].join("\n")+"\n"
89
- $stderr.write( err_msg )
90
- elsif RSence.args[:verbose]
91
- puts "Failed to open database '#{@db_uri}'."
92
- puts "Run RSence in debug mode for full error output."
93
- end
94
- return false
95
- end
96
- end
97
-
98
- def db_close
99
- @db.disconnect
100
- end
101
-
102
- def db_open
103
- # work-around for windows (drive letters causing confusion)
104
- if @db_uri.start_with?('sqlite://')
105
- @db = Sequel.sqlite( @db_uri.split('sqlite://')[1] )
66
+
67
+ ## Returns a new, unique session identifier by storing the params to the database
68
+ def new_ses_id( cookie_key, ses_key, timeout_secs, user_id=0 )
69
+ if @db_avail
70
+ return insert_session_data( {
71
+ :cookie_key => cookie_key,
72
+ :ses_key => ses_key,
73
+ :ses_timeout => timeout_secs,
74
+ :user_id => user_id
75
+ } )
106
76
  else
107
- @db = Sequel.connect(@db_uri)
108
- end
109
- end
110
-
111
- ## Creates the 'rsence_session' table, if necessary
112
- ## This table is used to store sessions
113
- def create_session_table
114
- db_open
115
- unless @db.table_exists?(:rsence_session)
116
- puts "Creating session table..." if RSence.args[:verbose]
117
- @db.create_table :rsence_session do
118
- primary_key( :id )
119
- column( :cookie_key, String )
120
- column( :ses_key, String )
121
- column( :ses_timeout, Integer )
122
- column( :user_id, Integer )
123
- column( :ses_active, TrueClass )
124
- column( :ses_stored, Integer )
125
- column( :ses_data, File )
126
- end
127
- end
128
- db_close
129
- end
130
-
131
- ## Creates the 'rsence_version' table, if necessary
132
- ## This table is used to check for the need of future database upgrades
133
- def create_version_table
134
- db_open
135
- unless @db.table_exists?(:rsence_version)
136
- puts "Creating version info table..." if RSence.args[:verbose]
137
- @db.create_table :rsence_version do
138
- Integer :version
139
- end
140
- @db[:rsence_version].insert(:version => 586)
141
- end
142
- db_close
143
- end
144
-
145
- ## Creates the 'rsence_uploads' table, if necessary
146
- ## This table is used for storing temporary uploads before processing
147
- def create_uploads_table
148
- db_open
149
- unless @db.table_exists?(:rsence_uploads)
150
- puts "Creating uploads table..." if RSence.args[:verbose]
151
- @db.create_table :rsence_uploads do
152
- primary_key( :id )
153
- foreign_key( :ses_id, :rsence_session )
154
- column( :upload_date, Integer )
155
- column( :upload_done, Integer )
156
- column( :ticket_id, String )
157
- column( :file_size, Integer )
158
- column( :file_name, String )
159
- column( :file_mime, String )
160
- column( :file_data, File )
161
- end
162
- end
163
- db_close
164
- end
165
-
166
- # returns the version in the rsence_version table
167
- def table_version
168
- db_open
169
- rsence_version = @db[:rsence_version].select(:version).all[0][:version]
170
- db_close
171
- return rsence_version
172
- end
173
-
174
- ## Checks database connectivity and loads stored sessions from the database
175
- def db_init
176
-
177
- create_session_table
178
- create_version_table
179
- create_uploads_table
180
-
181
- ## Used for future upgrades:
182
- # version = table_version
183
-
184
- return true
185
- end
186
-
187
- ## Deletes all rows from rsence_session as well as rsence_uploads
188
- def reset_sessions
189
- unless @db_avail
190
- puts "Warning: Can't reset sessions: No database!" if RSence.args[:verbose]
191
- return
192
- end
193
- db_open
194
- @db[:rsence_session].delete if @db.table_exists?(:rsence_session)
195
- @db[:rsence_uploads].delete if @db.table_exists?(:rsence_uploads)
196
- db_close
197
- end
198
-
199
- ## Restores all saved sessions from db to ram
200
- def restore_sessions
201
- unless @db_avail
202
- puts "Warning: Can't restore sessions: No database!" if RSence.args[:verbose]
203
- return
204
- end
205
- puts "Restoring sessions..." if RSence.args[:verbose]
206
- db_open
207
- @db[:rsence_session].all do |ses_row|
208
- ses_id = ses_row[:id]
209
- ses_data_dump = ses_row[:ses_data]
210
-
211
- if ses_data_dump == nil
212
- @db[:rsence_session].filter(:id => ses_id).delete
213
- @db[:rsence_uploads].filter(:ses_id => ses_id).delete
214
- else
215
- begin
216
- ses_data = Marshal.load( ses_data_dump )
217
- ses_key = ses_data[:ses_key]
218
- @sessions[ses_id] = ses_data
219
- @session_keys[ ses_key ] = ses_id
220
- @session_cookie_keys[ ses_data[:cookie_key] ] = ses_id
221
- if @plugins
222
- @plugins.delegate( :load_ses_id, ses_id )
223
- @plugins.delegate( :load_ses, ses_data )
224
- end
225
- rescue => e
226
- warn "Unable to load session: #{ses_id}, because: #{e.message}"
227
- @db[:rsence_session].filter(:id => ses_id).delete
228
- @db[:rsence_uploads].filter(:ses_id => ses_id).delete
229
- end
230
- end
77
+ @id_counter += 1
78
+ return @id_counter
231
79
  end
232
- db_close
233
80
  end
234
-
81
+
235
82
  ## Stores all sessions to db from ram
236
83
  def store_sessions
237
84
  unless @db_avail
@@ -239,59 +86,52 @@ module RSence
239
86
  return
240
87
  end
241
88
  puts "Storing sessions..." if RSence.args[:verbose]
242
- db_open
243
89
  ses_ids = @sessions.keys
244
90
  ses_ids.each do |ses_id|
245
- ses_data = @sessions[ses_id]
91
+ ses_data = @sessions[ses_id].clone
246
92
  if @plugins
247
93
  @plugins.delegate( :dump_ses, ses_data )
248
94
  @plugins.delegate( :dump_ses_id, ses_id )
249
95
  end
250
96
  begin
251
- ses_data_dump = Marshal.dump( ses_data )
252
- @db[:rsence_session].filter(
253
- :id => ses_id
254
- ).update(
255
- :cookie_key => ses_data[:cookie_key],
256
- :ses_key => ses_data[:ses_key],
257
- :user_id => ses_data[:user_id],
258
- :ses_data => ses_data_dump.to_sequel_blob,
259
- :ses_timeout => ses_data[:timeout],
260
- :ses_stored => Time.now.to_i
261
- )
97
+ store_session_data( ses_data )
262
98
  rescue => e
263
99
  warn "Unable to dump session: #{ses_id}, because: #{e.message}"
264
100
  end
265
101
  end
266
- db_close
267
102
  end
268
-
269
- ## Shut-down signal, triggers store_sessions for now
270
- def shutdown
271
- @accept_requests = false
272
- puts "Session shutdown in progress..." if RSence.args[:verbose]
273
- store_sessions
274
- puts "Session shutdown complete." if RSence.args[:verbose]
103
+
104
+ ## Restores a single session, called from the database backend
105
+ def restore_session( ses_id, ses_data )
106
+ ses_key = ses_data[:ses_key]
107
+ @sessions[ses_id] = ses_data
108
+ @session_keys[ ses_key ] = ses_id
109
+ @session_cookie_keys[ ses_data[:cookie_key] ] = ses_id
110
+ if @plugins
111
+ @plugins.delegate( :load_ses_id, ses_id )
112
+ @plugins.delegate( :load_ses, ses_data )
113
+ end
275
114
  end
276
-
277
-
278
- ## Returns a new, unique session identifier by storing the params to the database
279
- def new_ses_id( cookie_key, ses_key, timeout_secs, user_id=0 )
115
+
116
+ ## Deletes all rows from rsence_session as well as rsence_uploads
117
+ def reset_sessions
280
118
  unless @db_avail
281
- @id_counter += 1
282
- return @id_counter
119
+ puts "Warning: Can't reset sessions: No database!" if RSence.args[:verbose]
120
+ return
283
121
  end
284
- db_open
285
- new_id = @db[:rsence_session].insert(
286
- :cookie_key => cookie_key,
287
- :ses_key => ses_key,
288
- :ses_timeout => timeout_secs,
289
- :user_id => user_id
290
- )
291
- db_close
292
- return new_id
122
+ remove_all_session_data
123
+ end
124
+
125
+ ## Restores all saved sessions from db to ram
126
+ def restore_sessions
127
+ unless @db_avail
128
+ puts "Warning: Can't restore sessions: No database!" if RSence.args[:verbose]
129
+ return
130
+ end
131
+ puts "Restoring sessions..." if RSence.args[:verbose]
132
+ load_session_data
293
133
  end
294
-
134
+
295
135
  ## Expires a session by its identifier
296
136
  def expire_session( ses_id )
297
137
 
@@ -330,15 +170,11 @@ module RSence
330
170
  end
331
171
 
332
172
  if @db_avail
333
- db_open
334
- # Deletes the session's row from the database
335
- @db[:rsence_uploads].filter(:ses_id => ses_id).delete
336
- @db[:rsence_session].filter(:id => ses_id).delete
337
- db_close
173
+ remove_session_data( ses_id )
338
174
  end
339
175
 
340
176
  end
341
-
177
+
342
178
  ## Expires all sessions that meet the timeout criteria
343
179
  def expire_sessions
344
180
 
@@ -352,5 +188,13 @@ module RSence
352
188
 
353
189
  end
354
190
  end
191
+
192
+ ## Shut-down signal, triggers store_sessions for now
193
+ def shutdown
194
+ @accept_requests = false
195
+ puts "Session shutdown in progress..." if RSence.args[:verbose]
196
+ store_sessions
197
+ puts "Session shutdown complete." if RSence.args[:verbose]
198
+ end
355
199
  end
356
200
  end
@@ -54,6 +54,7 @@ module RSence
54
54
  RSence.value_manager = @valuemanager
55
55
  @sessions = SessionManager.new( self )
56
56
  @plugins.sessions = @sessions
57
+ @plugins.ticket.set_db_state( @sessions.db_avail )
57
58
  RSence.session_manager = @sessions
58
59
  if RSence.config[:session_conf][:reset_sessions]
59
60
  puts "Resetting all sessions..."
data/lib/rsence.rb CHANGED
@@ -98,6 +98,7 @@ module RSence
98
98
  end
99
99
 
100
100
  def self.transporter
101
+ return nil unless class_variable_defined?(:'@@transporter')
101
102
  @@transporter
102
103
  end
103
104
  def self.transporter=(transporter)
@@ -110,6 +111,7 @@ module RSence
110
111
  end
111
112
 
112
113
  def self.plugin_manager
114
+ return nil unless class_variable_defined?(:'@@plugin_manager')
113
115
  @@plugin_manager
114
116
  end
115
117
  def self.plugin_manager=(plugin_manager)
@@ -122,6 +124,7 @@ module RSence
122
124
  end
123
125
 
124
126
  def self.value_manager
127
+ return nil unless class_variable_defined?(:'@@value_manager')
125
128
  @@value_manager
126
129
  end
127
130
  def self.value_manager=(value_manager)
@@ -134,6 +137,7 @@ module RSence
134
137
  end
135
138
 
136
139
  def self.session_manager
140
+ return nil unless class_variable_defined?(:'@@session_manager')
137
141
  @@session_manager
138
142
  end
139
143
  def self.session_manager=(session_manager)
@@ -78,30 +78,13 @@ module Common
78
78
  :by_id => {},
79
79
  :ses_ids => {}
80
80
  }
81
+
82
+ @db = false
81
83
 
82
- begin
83
- db_uri = ::RSence.config[:database][:ses_db]
84
- if db_uri.start_with?('sqlite://')
85
- @db = Sequel.sqlite( db_uri.split('sqlite://')[1] )
86
- else
87
- @db = Sequel.connect( db_uri )
88
- end
89
- rescue => e
90
- if RSence.args[:debug]
91
- err_msg = [
92
- "ERROR: TicketServices couldn't open database",
93
- "#{e.class.to_s}, #{e.message}",
94
- "Backtrace:",
95
- "\t"+e.backtrace.join("\n\t")
96
- ].join("\n")+"\n"
97
- $stderr.write( err_msg )
98
- elsif RSence.args[:verbose]
99
- puts "Failed to open database '#{@db_uri}'."
100
- puts "Run RSence in debug mode for full error output."
101
- end
102
- @upload_id = 0
103
- @db = false
104
- end
84
+ end
85
+
86
+ def set_db_state( state )
87
+ @db = state
105
88
  end
106
89
 
107
90
  attr_accessor :raw_uris # :nodoc:
@@ -113,9 +96,8 @@ module Common
113
96
  return time.gmtime.strftime('%a, %d %b %Y %H:%M:%S %Z')
114
97
  end
115
98
 
116
- # Disconnects connection to the database.
99
+ # Cleans up structures (not used at the moment)
117
100
  def shutdown # :nodoc:
118
- @db.disconnect if @db
119
101
  end
120
102
 
121
103
  # Serves files and images by returning an URI. Content is given as second
@@ -138,7 +138,7 @@ create table rsence_uploads (
138
138
  :file_data => ''
139
139
  }
140
140
  if @db
141
- upload_id = @db[:rsence_uploads].insert( insert_hash )
141
+ upload_id = RSence.session_manager.new_upload_data( insert_hash )
142
142
  else
143
143
  @upload_id += 1
144
144
  upload_id = @upload_id
@@ -151,29 +151,18 @@ create table rsence_uploads (
151
151
  @upload_slots[:uploaded][ticket_id].push( upload_id )
152
152
 
153
153
  update_hash = {
154
- :file_data => file_data[:tempfile].read.to_sequel_blob,
154
+ :file_data => file_data[:tempfile].read,
155
155
  :upload_done => true
156
156
  }
157
157
  if @db
158
- @db[:rsence_uploads].filter(:id => upload_id).update( update_hash )
158
+ RSence.session_manager.set_upload_data( upload_id, update_hash[:file_data] )
159
159
  else
160
160
  @upload_slots[:rsence_uploads][upload_id].merge!( update_hash )
161
161
  end
162
162
  end
163
163
  end
164
164
 
165
- response_body = %{
166
- <html>
167
- <head>
168
- <script type="text/javascript">
169
- with(parent){
170
- HVM.values[#{value_id.to_json}].set(#{done_value.to_json});
171
- }
172
- </script>
173
- </head>
174
- <body></body>
175
- </html>
176
- }
165
+ response_body = %{<html><head><script>parent.HVM.values[#{value_id.to_json}].set(#{done_value.to_json});</script></head></html>}
177
166
 
178
167
  response.status = 200
179
168
  response['Content-Type'] = 'text/html; charset=UTF-8'
@@ -187,40 +176,28 @@ create table rsence_uploads (
187
176
  @upload_slots[:uploaded][ticket_id].each do |row_id|
188
177
  if with_data
189
178
  if @db
190
- row_datas = @db[:rsence_uploads].select(
191
- :upload_date, :upload_done, :file_name,
192
- :file_size, :file_mime, :file_data
193
- ).filter(
194
- :id => row_id
195
- )
179
+ row_data = RSence.session_manager.get_upload_data( row_id )
196
180
  else
197
- row_datas = @upload_slots[:rsence_uploads][row_id]
181
+ row_data = @upload_slots[:rsence_uploads][row_id].first
198
182
  end
199
- if row_datas.count == 1
200
- row_data = row_datas.first
183
+ unless row_data.nil?
201
184
  row_hash = {
202
185
  :date => Time.at(row_data[:upload_date]),
203
186
  :done => row_data[:upload_done],
204
187
  :size => row_data[:file_size],
205
188
  :mime => row_data[:file_mime],
206
189
  :name => row_data[:file_name],
207
- :data => row_data[:file_data]
190
+ :data => row_data[:file_data].to_s
208
191
  }
209
192
  uploads.push(row_hash)
210
193
  end
211
194
  else
212
195
  if @db
213
- row_datas = @db[:rsence_uploads].select(
214
- :upload_date, :upload_done, :file_name,
215
- :file_size, :file_mime
216
- ).filter(
217
- :id => row_id
218
- )
196
+ row_data = RSence.session_manager.get_upload_meta( row_id )
219
197
  else
220
- row_datas = @upload_slots[:rsence_uploads][row_id]
198
+ row_data = @upload_slots[:rsence_uploads][row_id].first
221
199
  end
222
- if row_datas.count == 1
223
- row_data = row_datas.first
200
+ unless row_data.nil?
224
201
  row_hash = {
225
202
  :date => Time.at(row_data[:upload_date]),
226
203
  :done => row_data[:upload_done],
@@ -240,7 +217,7 @@ create table rsence_uploads (
240
217
  def del_upload( ticket_id, row_id )
241
218
  @upload_slots[:uploaded][ticket_id].delete(row_id)
242
219
  if @db
243
- @db[:rsence_uploads].filter( :id => row_id ).delete
220
+ RSence.session_manager.del_upload( row_id )
244
221
  else
245
222
  @upload_slots[:rsence_uploads].delete(row_id)
246
223
  end
@@ -257,7 +234,7 @@ create table rsence_uploads (
257
234
  @upload_slots[:uploaded][ticket_id].each do |row_id|
258
235
  @upload_slots[:uploaded][ticket_id].delete( row_id )
259
236
  if @db
260
- @db[:rsence_uploads].filter( :id => row_id ).delete
237
+ RSence.session_manager.del_upload( row_id )
261
238
  else
262
239
  @upload_slots[:rsence_uploads].delete(row_id)
263
240
  end
@@ -268,8 +245,7 @@ create table rsence_uploads (
268
245
  @upload_slots[:by_id].delete( ticket_id )
269
246
  end
270
247
  if @db
271
- @db[:rsence_uploads].filter( :ticket_id => ticket_id ).delete
272
- @db[:rsence_uploads].filter( :ses_id => ses_id ).delete
248
+ RSence.session_manager.del_uploads( ticket_id, ses_id )
273
249
  end
274
250
  end
275
251
 
@@ -130,6 +130,17 @@ class TicketPlugin < Plugin
130
130
  super
131
131
  @ticketserve = TicketServe.new
132
132
  end
133
+
134
+ def open
135
+ super
136
+ unless RSence.session_manager.nil?
137
+ set_db_state( RSence.session_manager.db_avail )
138
+ end
139
+ end
140
+
141
+ def set_db_state( state )
142
+ @ticketserve.set_db_state( state )
143
+ end
133
144
 
134
145
  # @private Shuts down TicketServe
135
146
  def shutdown
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rsence-pre
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0.9
4
+ version: 2.3.0.10
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-11-02 00:00:00.000000000 Z
13
+ date: 2012-11-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rsence-deps
@@ -103,6 +103,8 @@ files:
103
103
  - lib/rsence/plugins/plugin_sqlite_db.rb
104
104
  - lib/rsence/plugins/servlet.rb
105
105
  - lib/rsence/plugins.rb
106
+ - lib/rsence/session/mongo_sessionstorage.rb
107
+ - lib/rsence/session/sequel_sessionstorage.rb
106
108
  - lib/rsence/sessionmanager.rb
107
109
  - lib/rsence/sessionstorage.rb
108
110
  - lib/rsence/sigcomm.rb