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 +1 -1
- data/js/controls/textarea/themes/default/textarea.css +1 -1
- data/js/core/elem/elem.coffee +1 -0
- data/js/datetime/calendar/themes/default/calendar.css +5 -4
- data/lib/rsence/pluginmanager.rb +1 -1
- data/lib/rsence/session/mongo_sessionstorage.rb +240 -0
- data/lib/rsence/session/sequel_sessionstorage.rb +241 -0
- data/lib/rsence/sessionstorage.rb +66 -222
- data/lib/rsence/transporter.rb +1 -0
- data/lib/rsence.rb +4 -0
- data/plugins/ticket/lib/common.rb +7 -25
- data/plugins/ticket/lib/upload.rb +14 -38
- data/plugins/ticket/ticket.rb +11 -0
- metadata +4 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.3.0.
|
1
|
+
2.3.0.10.pre
|
data/js/core/elem/elem.coffee
CHANGED
@@ -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
|
-
|
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,
|
data/lib/rsence/pluginmanager.rb
CHANGED
@@ -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
|
21
|
-
#
|
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
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
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
|
-
@
|
108
|
-
|
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
|
-
|
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
|
-
##
|
270
|
-
def
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
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
|
-
|
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
|
-
|
282
|
-
return
|
119
|
+
puts "Warning: Can't reset sessions: No database!" if RSence.args[:verbose]
|
120
|
+
return
|
283
121
|
end
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
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
|
-
|
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
|
data/lib/rsence/transporter.rb
CHANGED
@@ -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
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
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
|
-
#
|
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 =
|
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
|
154
|
+
:file_data => file_data[:tempfile].read,
|
155
155
|
:upload_done => true
|
156
156
|
}
|
157
157
|
if @db
|
158
|
-
|
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
|
-
|
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
|
-
|
181
|
+
row_data = @upload_slots[:rsence_uploads][row_id].first
|
198
182
|
end
|
199
|
-
|
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
|
-
|
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
|
-
|
198
|
+
row_data = @upload_slots[:rsence_uploads][row_id].first
|
221
199
|
end
|
222
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
|
data/plugins/ticket/ticket.rb
CHANGED
@@ -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.
|
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-
|
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
|