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