rsence 2.0.0.11 → 2.0.1.12
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/js/core/elem/elem.js +3 -0
- data/js/core/event/event.js +1 -1
- data/js/foundation/eventmanager/eventmanager.js +80 -16
- data/lib/http/broker.rb +3 -10
- data/lib/session/msg.rb +1 -1
- data/lib/session/sessionmanager.rb +53 -14
- data/lib/transporter/transporter.rb +4 -7
- data/plugins/main/main.rb +4 -6
- metadata +5 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.
|
1
|
+
2.0.1.12
|
data/js/core/elem/elem.js
CHANGED
data/js/core/event/event.js
CHANGED
@@ -37,12 +37,12 @@ EVENT = {
|
|
37
37
|
*
|
38
38
|
* = Indexes
|
39
39
|
* +EVENT.status[ EVENT.button1 ]+:: The state of the left mouse button.
|
40
|
-
*
|
41
|
-
*
|
40
|
+
* false when not pressed
|
41
|
+
* true when pressed.
|
42
42
|
*
|
43
43
|
* +EVENT.status[ EVENT.button2 ]+:: The state of the right mouse button.
|
44
|
-
*
|
45
|
-
*
|
44
|
+
* false when not pressed
|
45
|
+
* true when pressed.
|
46
46
|
*
|
47
47
|
* +EVENT.status[ EVENT.crsrX ]+:: The x-coordinate of the mouse cursor.
|
48
48
|
*
|
@@ -62,8 +62,14 @@ EVENT = {
|
|
62
62
|
* +EVENT.status[ EVENT.shiftKeyDown ]+:: The boolean status of the Shift
|
63
63
|
* modifier key being held down.
|
64
64
|
*
|
65
|
+
* +EVENT.status[ EVENT.metaKeyDown ]+:: The boolean status of the Meta
|
66
|
+
* modifier key being held down.
|
67
|
+
*
|
68
|
+
* +EVENT.status[ EVENT.cmdKeyDown ]+:: The boolean status of any of the system-specific
|
69
|
+
* Command, Menu or Start modifier keys being held down.
|
70
|
+
*
|
65
71
|
**/
|
66
|
-
status: [false, false, 0, 0, [], false, false, false],
|
72
|
+
status: [false, false, 0, 0, [], false, false, false, false, false],
|
67
73
|
|
68
74
|
/** The index in the status array for the left mouse button.
|
69
75
|
**/
|
@@ -88,18 +94,26 @@ EVENT = {
|
|
88
94
|
**/
|
89
95
|
keysDown: 4,
|
90
96
|
|
91
|
-
/** The index in the status
|
97
|
+
/** The index in the status array for the state of the Alt modifier key.
|
92
98
|
**/
|
93
99
|
altKeyDown: 5,
|
94
100
|
|
95
|
-
/** The index in the status
|
101
|
+
/** The index in the status array for the state of the Ctrl modifier key.
|
96
102
|
**/
|
97
103
|
ctrlKeyDown: 6,
|
98
104
|
|
99
|
-
/** The index in the status
|
105
|
+
/** The index in the status array for the state of the Shift modifier key.
|
100
106
|
**/
|
101
107
|
shiftKeyDown: 7,
|
102
108
|
|
109
|
+
/** The index in the status array for the state of the Meta modifier key.
|
110
|
+
**/
|
111
|
+
metaKeyDown: 8,
|
112
|
+
|
113
|
+
/** The index in the status array for the state of the Command modifier key.
|
114
|
+
**/
|
115
|
+
cmdKeyDown: 9,
|
116
|
+
|
103
117
|
/** A flag to disable, if your applications don't need drop events.
|
104
118
|
* Setting this to false when not needed improves overall performance,
|
105
119
|
* because the drop events need constant calculation of the mouse cursor
|
@@ -231,11 +245,23 @@ EVENT = {
|
|
231
245
|
_this.textEnterCtrls.push(_ctrl.viewId);
|
232
246
|
}
|
233
247
|
}
|
248
|
+
else {
|
249
|
+
var _textEnterIndex = _this.textEnterCtrls.indexOf(_ctrl.viewId);
|
250
|
+
if (_textEnterIndex !== -1) {
|
251
|
+
_this.textEnterCtrls.splice(_textEnterIndex,1);
|
252
|
+
}
|
253
|
+
}
|
234
254
|
if (_focusOptions.resize) {
|
235
255
|
if (_this.resizeListeners.indexOf(_ctrl.viewId) === -1) {
|
236
256
|
_this.resizeListeners.push(_ctrl.viewId);
|
237
257
|
}
|
238
258
|
}
|
259
|
+
else {
|
260
|
+
var _resizeIndex = _this.resizeListeners.indexOf(_ctrl.viewId);
|
261
|
+
if (_resizeIndex !== -1) {
|
262
|
+
_this.resizeListeners.splice(_resizeIndex,1);
|
263
|
+
}
|
264
|
+
}
|
239
265
|
Event.observe(_elem, 'mouseover', _this._mouseOver);
|
240
266
|
},
|
241
267
|
|
@@ -524,12 +550,12 @@ EVENT = {
|
|
524
550
|
* +_ctrl+:: An object that uses the HControl API, becomes new drag target.
|
525
551
|
*
|
526
552
|
**/
|
527
|
-
startDragging: function(_ctrl) {
|
553
|
+
startDragging: function(_ctrl, _isLeftButton) {
|
528
554
|
var _this = EVENT;
|
529
555
|
_this.dragItems = [_ctrl.elemId];
|
530
556
|
_this.focus(_ctrl);
|
531
557
|
_this.changeActiveControl(_ctrl);
|
532
|
-
_ctrl.startDrag(_this.status[_this.crsrX], _this.status[_this.crsrY]);
|
558
|
+
_ctrl.startDrag( _this.status[_this.crsrX], _this.status[_this.crsrY], _isLeftButton );
|
533
559
|
},
|
534
560
|
|
535
561
|
/** Mid-level mouse button press manager.
|
@@ -588,7 +614,7 @@ EVENT = {
|
|
588
614
|
// Call the mouseDown and startDrag events after the active control change has been handled.
|
589
615
|
for (i = 0; i !== _startDragElementIds.length; i++) {
|
590
616
|
_this.dragItems.push(_startDragElementIds[i]);
|
591
|
-
_this.focusOptions[_startDragElementIds[i]].ctrl.startDrag(x, y);
|
617
|
+
_this.focusOptions[_startDragElementIds[i]].ctrl.startDrag(x, y, _isLeftButton);
|
592
618
|
_didStartDrag = true;
|
593
619
|
}
|
594
620
|
|
@@ -672,6 +698,12 @@ EVENT = {
|
|
672
698
|
}
|
673
699
|
}
|
674
700
|
//if(_this.hovered.length!==0){Event.stop(e);}
|
701
|
+
if(_isLeftButton){
|
702
|
+
_this.status[_this.button1] = false;
|
703
|
+
}
|
704
|
+
else {
|
705
|
+
_this.status[_this.button2] = false;
|
706
|
+
}
|
675
707
|
return true;
|
676
708
|
},
|
677
709
|
|
@@ -722,13 +754,11 @@ EVENT = {
|
|
722
754
|
_ctrl,
|
723
755
|
i = 0;
|
724
756
|
_this._modifiers(e);
|
725
|
-
_this.status[_this.button1] = false;
|
726
|
-
_this.status[_this.button2] = false;
|
727
757
|
// Send endDrag for the currently dragged items even when they don't have focus, and clear the drag item array.
|
728
758
|
for (; i !== _this.dragItems.length; i++) {
|
729
759
|
_elemId = _this.dragItems[i];
|
730
760
|
_ctrl = _this.focusOptions[_elemId].ctrl;
|
731
|
-
_ctrl.endDrag(x, y);
|
761
|
+
_ctrl.endDrag(x, y,_isLeftButton);
|
732
762
|
_didEndDrag = true;
|
733
763
|
// If the mouse slipped off the dragged item before the mouse button was released, blur the item manually
|
734
764
|
if (_this.enableDroppableChecks) {
|
@@ -758,6 +788,12 @@ EVENT = {
|
|
758
788
|
}
|
759
789
|
}
|
760
790
|
}
|
791
|
+
if(_isLeftButton){
|
792
|
+
_this.status[_this.button1] = false;
|
793
|
+
}
|
794
|
+
else {
|
795
|
+
_this.status[_this.button2] = false;
|
796
|
+
}
|
761
797
|
return true;
|
762
798
|
},
|
763
799
|
|
@@ -771,6 +807,9 @@ EVENT = {
|
|
771
807
|
var _this = EVENT,
|
772
808
|
_theKeyCode = e.keyCode;
|
773
809
|
_this._modifiers(e);
|
810
|
+
if(!_this.status[_this.cmdKeyDown] && _this._detectCmdKey(e.keyCode)){
|
811
|
+
_this.status[_this.cmdKeyDown] = true;
|
812
|
+
}
|
774
813
|
if (_this.activeControl && _this.focusOptions[_this.activeControl.elemId].keyDown === true) {
|
775
814
|
Event.stop(e);
|
776
815
|
// Workaround for msie rapid fire keydown
|
@@ -812,6 +851,9 @@ EVENT = {
|
|
812
851
|
_ctrl.textEnter();
|
813
852
|
}
|
814
853
|
}
|
854
|
+
if(_this.status[_this.cmdKeyDown] && _this._detectCmdKey(e.keyCode)){
|
855
|
+
_this.status[_this.cmdKeyDown] = false;
|
856
|
+
}
|
815
857
|
// Remove the key from the realtime array, inserted in keyDown
|
816
858
|
_keyCodeIndex = _this.status[_this.keysDown].indexOf(_theKeyCode);
|
817
859
|
if (_keyCodeIndex !== -1) {
|
@@ -857,23 +899,45 @@ EVENT = {
|
|
857
899
|
}
|
858
900
|
}
|
859
901
|
},
|
860
|
-
|
902
|
+
|
861
903
|
/* Alternative right button detection, wrapper for the mouseDown method */
|
862
904
|
contextMenu: function(e) {
|
863
905
|
EVENT.mouseDown(e, false);
|
864
906
|
Event.stop(e);
|
907
|
+
if(Event.isLeftClick(e)){
|
908
|
+
EVENT.status[EVENT.button2] = false;
|
909
|
+
}
|
865
910
|
},
|
866
|
-
|
911
|
+
|
912
|
+
_cmdKeys: [
|
913
|
+
224, // Mozilla Left or Right Command Key
|
914
|
+
219, // Opera Left Windows Key
|
915
|
+
220, // Opera Right Windows Key
|
916
|
+
0, // Opera Menu Key or Linux Gecko: any Windows Key
|
917
|
+
17, // Opera
|
918
|
+
91, // Others (Left Start Key or Left Command Key)
|
919
|
+
92, // Others (Right Start Key)
|
920
|
+
93 // Others (Menu Key or Right Command Key)
|
921
|
+
],
|
922
|
+
_detectCmdKey: function( _keyCode ) {
|
923
|
+
return (EVENT._cmdKeys.indexOf(_keyCode) !== -1);
|
924
|
+
},
|
925
|
+
|
867
926
|
/* Handle the event modifiers. */
|
868
927
|
_modifiers: function(e) {
|
869
928
|
var _this = EVENT;
|
870
929
|
_this.status[_this.altKeyDown] = e.altKey;
|
871
930
|
_this.status[_this.ctrlKeyDown] = e.ctrlKey;
|
872
931
|
_this.status[_this.shiftKeyDown] = e.shiftKey;
|
932
|
+
_this.status[_this.metaKeyDown] = e.metaKey;
|
873
933
|
}
|
874
934
|
|
875
935
|
};
|
876
936
|
|
937
|
+
var//RSence.Foundation
|
938
|
+
EventManager = EVENT;
|
939
|
+
|
940
|
+
|
877
941
|
/** Starts the only instance
|
878
942
|
*/
|
879
943
|
LOAD(
|
data/lib/http/broker.rb
CHANGED
@@ -89,6 +89,7 @@ class Broker
|
|
89
89
|
sleep 0.2
|
90
90
|
end
|
91
91
|
puts "..#{host}:#{port} responds!" if ::RSence.args[:debug]
|
92
|
+
puts "RSence is online on the address http://#{host}:#{port}#{::RSence.config[:base_url]}"
|
92
93
|
@@transporter.online = true
|
93
94
|
end
|
94
95
|
|
@@ -96,8 +97,8 @@ class Broker
|
|
96
97
|
|
97
98
|
# Loads the selected web-server (default is 'mongrel')
|
98
99
|
rack_require = conf[:rack_require]
|
99
|
-
puts conf.inspect
|
100
|
-
|
100
|
+
puts conf.inspect if RSence.args[:debug]
|
101
|
+
|
101
102
|
require rack_require
|
102
103
|
|
103
104
|
# Selects the handler for Rack
|
@@ -114,14 +115,6 @@ class Broker
|
|
114
115
|
|
115
116
|
end
|
116
117
|
|
117
|
-
=begin
|
118
|
-
# Extends the receiver with SingletonMethods
|
119
|
-
def self.included( receiver )
|
120
|
-
receiver.extend( SingletonMethods )
|
121
|
-
end
|
122
|
-
=end
|
123
|
-
|
124
|
-
|
125
118
|
# Generic 404 error handler. Just sets up response status, headers, body as a small "Page Not Found" html page
|
126
119
|
def not_found
|
127
120
|
puts "/404: #{@request.fullpath.inspect}" if RSence.args[:verbose]
|
data/lib/session/msg.rb
CHANGED
@@ -405,21 +405,60 @@ module RSence
|
|
405
405
|
### Sets the set-cookie header
|
406
406
|
msg.response['Set-Cookie'] = ses_cookie_arr.join('; ')
|
407
407
|
end
|
408
|
-
|
408
|
+
|
409
|
+
def expire_ses_by_req( req, res )
|
410
|
+
|
411
|
+
cookie_raw = req.cookies
|
412
|
+
|
413
|
+
# checks, if a cookie named 'ses_key' is found
|
414
|
+
if cookie_raw.has_key?('ses_key')
|
415
|
+
|
416
|
+
# gets just the data itself (discards comment, domain, expiration etc)
|
417
|
+
cookie_key = cookie_raw['ses_key'].split(';')[0]
|
418
|
+
|
419
|
+
end
|
420
|
+
|
421
|
+
# if a cookie key is found (non-false), checks if it's valid
|
422
|
+
if cookie_key
|
423
|
+
|
424
|
+
# checks for validity by looking the key up in @session_cookie_keys
|
425
|
+
cookie_key_exist = @session_cookie_keys.has_key?( cookie_key )
|
426
|
+
|
427
|
+
# sets the cookie key to false, if it doesn't exist
|
428
|
+
cookie_key = false unless cookie_key_exist
|
429
|
+
|
430
|
+
end
|
431
|
+
|
432
|
+
# at this point, the cookie key seems valid:
|
433
|
+
if cookie_key and cookie_key_exist
|
434
|
+
|
435
|
+
# get the session identifier
|
436
|
+
ses_id = @session_cookie_keys[ cookie_key ]
|
437
|
+
|
438
|
+
# Expire the session
|
439
|
+
expire_session( ses_id )
|
440
|
+
|
441
|
+
return true
|
442
|
+
|
443
|
+
end
|
444
|
+
|
445
|
+
return false
|
446
|
+
end
|
447
|
+
|
409
448
|
### Creates a message and checks the session
|
410
449
|
def init_msg( request, response, options = { :cookies => false, :servlet => false } )
|
411
|
-
|
450
|
+
|
412
451
|
cookies = options[:cookies]
|
413
|
-
|
452
|
+
|
414
453
|
if options.has_key?(:query)
|
415
454
|
query = options[:query]
|
416
455
|
else
|
417
456
|
query = request.query
|
418
457
|
end
|
419
|
-
|
458
|
+
|
420
459
|
## Perform old-session cleanup on all xhr:s
|
421
460
|
expire_sessions
|
422
|
-
|
461
|
+
|
423
462
|
## The 'ses_id' request query key is required.
|
424
463
|
## The client defaults to '0', which means the
|
425
464
|
## client needs to be initialized.
|
@@ -427,7 +466,7 @@ module RSence
|
|
427
466
|
if not query.has_key?( 'ses_key' )
|
428
467
|
return Message.new( @transporter, request, response, options )
|
429
468
|
else
|
430
|
-
|
469
|
+
|
431
470
|
## get the ses_key from the request query:
|
432
471
|
ses_key = query[ 'ses_key' ]
|
433
472
|
# puts "ses key: #{ses_key}"
|
@@ -437,13 +476,13 @@ module RSence
|
|
437
476
|
## request/response/user/session -related
|
438
477
|
## data is needed.
|
439
478
|
msg = Message.new( @transporter, request, response, options )
|
440
|
-
|
479
|
+
|
441
480
|
## The client tells that its ses_key is '0',
|
442
481
|
## until the server tells it otherwise.
|
443
482
|
(req_num, ses_seed) = ses_key.split(':.o.:')
|
444
|
-
|
445
|
-
if req_num == '0'
|
446
483
|
|
484
|
+
if req_num == '0'
|
485
|
+
|
447
486
|
# If Broker encounters a '/hello' request, it
|
448
487
|
# sets cookies to true.
|
449
488
|
#
|
@@ -457,24 +496,24 @@ module RSence
|
|
457
496
|
init_ses( msg, ses_seed )
|
458
497
|
ses_status = true
|
459
498
|
end
|
460
|
-
|
499
|
+
|
461
500
|
# for non-'0' ses_keys:
|
462
501
|
else
|
463
|
-
|
502
|
+
|
464
503
|
## Validate the session key
|
465
504
|
ses_status = check_ses( msg, ses_seed )[0]
|
466
|
-
|
505
|
+
|
467
506
|
## Renew the cookie even when the request is a "x" (not "hello")
|
468
507
|
if @config[:session_cookies] and ses_status
|
469
508
|
renew_cookie( msg, msg.session[:cookie_key] )
|
470
509
|
end
|
471
510
|
|
472
511
|
end # /ses_key
|
473
|
-
|
512
|
+
|
474
513
|
## msg.ses_valid is false by default, meaning
|
475
514
|
## it's not valid or hasn't been initialized.
|
476
515
|
msg.ses_valid = ses_status
|
477
|
-
|
516
|
+
|
478
517
|
return msg
|
479
518
|
end # /ses_key
|
480
519
|
end # /init_msg
|
@@ -82,7 +82,9 @@ module RSence
|
|
82
82
|
broker_urls = RSence.config[:broker_urls]
|
83
83
|
uri = request.fullpath
|
84
84
|
|
85
|
-
if request_type
|
85
|
+
if @plugins.match_servlet( request_type, request, response, {} )
|
86
|
+
return true
|
87
|
+
elsif request_type == :post
|
86
88
|
## /x handles xhr without cookies
|
87
89
|
if uri == broker_urls[:x] and @sessions.accept_requests
|
88
90
|
xhr( request, response, { :cookies => true, :servlet => false } )
|
@@ -91,14 +93,9 @@ module RSence
|
|
91
93
|
elsif uri == broker_urls[:hello] and @sessions.accept_requests
|
92
94
|
xhr( request, response, { :cookies => true, :servlet => false } )
|
93
95
|
return true
|
94
|
-
else
|
95
|
-
session = {}
|
96
|
-
return @plugins.match_servlet( request_type, request, response, session )
|
97
96
|
end
|
98
|
-
else
|
99
|
-
session = {}
|
100
|
-
return @plugins.match_servlet( request_type, request, response, session )
|
101
97
|
end
|
98
|
+
return false
|
102
99
|
end
|
103
100
|
|
104
101
|
# wrapper for the session manager stop client functionality
|
data/plugins/main/main.rb
CHANGED
@@ -23,12 +23,12 @@ class MainPlugin < Plugin
|
|
23
23
|
super
|
24
24
|
@conf = ::RSence.config[:index_html]
|
25
25
|
@bconf = ::RSence.config[:broker_urls]
|
26
|
+
@goodbye_uri = File.join(@bconf[:hello],'goodbye')
|
26
27
|
end
|
27
28
|
|
28
29
|
# @private Internal structures, matches the "hello/goodbye" session termination request
|
29
30
|
def match( uri, request_type )
|
30
|
-
if request_type == :post and
|
31
|
-
uri == File.join(@bconf[:hello],'goodbye')
|
31
|
+
if request_type == :post and uri == @goodbye_uri
|
32
32
|
return true
|
33
33
|
end
|
34
34
|
return false
|
@@ -39,9 +39,7 @@ class MainPlugin < Plugin
|
|
39
39
|
|
40
40
|
# @private Internal structures, handler for the "hello/goodbye" session termination request
|
41
41
|
def post( req, res, ses )
|
42
|
-
|
43
|
-
msg.expire_session()
|
44
|
-
msg.response_done
|
42
|
+
@plugins.sessions.expire_ses_by_req( req, res )
|
45
43
|
end
|
46
44
|
|
47
45
|
# @private url_responder gets called whenever the
|
@@ -69,11 +67,11 @@ class MainPlugin < Plugin
|
|
69
67
|
# server-side session and reloads the page
|
70
68
|
if virtual_uri == '/sign_out'
|
71
69
|
resp_addr = @conf[:respond_address]
|
70
|
+
msg.expire_session()
|
72
71
|
msg.reply( [
|
73
72
|
'COMM.Transporter.stop=true;',
|
74
73
|
"location.href=#{resp_addr.to_json};"
|
75
74
|
].join('') )
|
76
|
-
msg.expire_session()
|
77
75
|
end
|
78
76
|
|
79
77
|
else
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rsence
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 115
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
-
|
11
|
-
version: 2.0.
|
9
|
+
- 1
|
10
|
+
- 12
|
11
|
+
version: 2.0.1.12
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Riassence Inc.
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-07-
|
19
|
+
date: 2010-07-07 00:00:00 +03:00
|
20
20
|
default_executable: rsence
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|