rsence-pre 2.3.0.9 → 2.3.0.10

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/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