@@ -205,7 +205,6 @@ function PN_API(setup) {
205
205
, SUBSCRIBE_KEY = setup [ 'subscribe_key' ] || 'demo'
206
206
, AUTH_KEY = setup [ 'auth_key' ] || ''
207
207
, SECRET_KEY = setup [ 'secret_key' ] || ''
208
- , PNSDK = setup [ 'PNSDK' ] || ''
209
208
, hmac_SHA256 = setup [ 'hmac_SHA256' ]
210
209
, SSL = setup [ 'ssl' ] ? 's' : ''
211
210
, ORIGIN = 'http' + SSL + '://' + ( setup [ 'origin' ] || 'pubsub.pubnub.com' )
@@ -230,6 +229,7 @@ function PN_API(setup) {
230
229
, NO_WAIT_FOR_PENDING = setup [ 'no_wait_for_pending' ]
231
230
, COMPATIBLE_35 = setup [ 'compatible_3.5' ] || false
232
231
, xdr = setup [ 'xdr' ]
232
+ , params = setup [ 'params' ] || { }
233
233
, error = setup [ 'error' ] || function ( ) { }
234
234
, _is_online = setup [ '_is_online' ] || function ( ) { return 1 }
235
235
, jsonp_cb = setup [ 'jsonp_cb' ] || function ( ) { return 0 }
@@ -243,6 +243,37 @@ function PN_API(setup) {
243
243
'decrypt' : function ( b , key ) { return b }
244
244
} ;
245
245
246
+ function _get_url_params ( data ) {
247
+ if ( ! data ) data = { } ;
248
+ each ( params , function ( key , value ) {
249
+ data [ key ] = value ;
250
+ } ) ;
251
+ return data ;
252
+ }
253
+
254
+ function _object_to_key_list ( o ) {
255
+ var l = [ ]
256
+ each ( o , function ( key , value ) {
257
+ l . push ( key ) ;
258
+ } ) ;
259
+ return l ;
260
+ }
261
+ function _object_to_key_list_sorted ( o ) {
262
+ return _object_to_key_list ( o ) . sort ( ) ;
263
+ }
264
+
265
+ function _get_pam_sign_input_from_params ( params ) {
266
+ var si = "" ;
267
+ var l = _object_to_key_list_sorted ( params ) ;
268
+
269
+ for ( var i in l ) {
270
+ var k = l [ i ]
271
+ si += k + "=" + encode ( params [ k ] ) ;
272
+ if ( i != l . length - 1 ) si += "&"
273
+ }
274
+ return si ;
275
+ }
276
+
246
277
function validate_presence_heartbeat ( heartbeat , cur_heartbeat , error ) {
247
278
var err = false ;
248
279
@@ -379,7 +410,7 @@ function PN_API(setup) {
379
410
blocking : blocking || SSL ,
380
411
timeout : 2000 ,
381
412
callback : jsonp ,
382
- data : data ,
413
+ data : _get_url_params ( data ) ,
383
414
success : function ( response ) {
384
415
_invoke_callback ( response , callback , err ) ;
385
416
} ,
@@ -427,6 +458,9 @@ function PN_API(setup) {
427
458
'get_version' : function ( ) {
428
459
return SDK_VER ;
429
460
} ,
461
+ '_add_param' : function ( key , val ) {
462
+ params [ key ] = val ;
463
+ } ,
430
464
431
465
/*
432
466
PUBNUB.history({
@@ -467,7 +501,7 @@ function PN_API(setup) {
467
501
// Send Message
468
502
xdr ( {
469
503
callback : jsonp ,
470
- data : params ,
504
+ data : _get_url_params ( params ) ,
471
505
success : function ( response ) {
472
506
if ( typeof response == 'object' && response [ 'error' ] ) {
473
507
err ( { 'message' : response [ 'message' ] , 'payload' : response [ 'payload' ] } ) ;
@@ -546,7 +580,7 @@ function PN_API(setup) {
546
580
} ,
547
581
fail : function ( ) { callback ( [ 0 , 'Disconnected' ] ) } ,
548
582
url : url ,
549
- data : data
583
+ data : _get_url_params ( data )
550
584
} ) ;
551
585
} ,
552
586
@@ -565,7 +599,7 @@ function PN_API(setup) {
565
599
var jsonp = jsonp_cb ( ) ;
566
600
xdr ( {
567
601
callback : jsonp ,
568
- data : { 'uuid' : UUID , 'auth' : AUTH_KEY } ,
602
+ data : _get_url_params ( { 'uuid' : UUID , 'auth' : AUTH_KEY } ) ,
569
603
timeout : SECOND * 5 ,
570
604
url : [ STD_ORIGIN , 'time' , jsonp ] ,
571
605
success : function ( response ) { callback ( response [ 0 ] ) } ,
@@ -613,7 +647,7 @@ function PN_API(setup) {
613
647
callback : jsonp ,
614
648
timeout : SECOND * 5 ,
615
649
url : url ,
616
- data : { 'uuid' : UUID , 'auth' : auth_key } ,
650
+ data : _get_url_params ( { 'uuid' : UUID , 'auth' : auth_key } ) ,
617
651
fail : function ( response ) {
618
652
_invoke_error ( response , err ) ;
619
653
publish ( 1 ) ;
@@ -802,7 +836,7 @@ function PN_API(setup) {
802
836
// Connect to PubNub Subscribe Servers
803
837
_reset_offline ( ) ;
804
838
805
- var data = { 'uuid' : UUID , 'auth' : auth_key } ;
839
+ var data = _get_url_params ( { 'uuid' : UUID , 'auth' : auth_key } ) ;
806
840
807
841
var st = JSON . stringify ( STATE ) ;
808
842
if ( st . length > 2 ) data [ 'state' ] = JSON . stringify ( STATE ) ;
@@ -818,7 +852,7 @@ function PN_API(setup) {
818
852
//SUB_RECEIVER = null;
819
853
SELF [ 'time' ] ( _test_connection ) ;
820
854
} ,
821
- data : data ,
855
+ data : _get_url_params ( data ) ,
822
856
url : [
823
857
SUB_ORIGIN , 'subscribe' ,
824
858
SUBSCRIBE_KEY , encode ( channels ) ,
@@ -946,7 +980,7 @@ function PN_API(setup) {
946
980
947
981
xdr ( {
948
982
callback : jsonp ,
949
- data : data ,
983
+ data : _get_url_params ( data ) ,
950
984
success : function ( response ) {
951
985
_invoke_callback ( response , callback , err ) ;
952
986
} ,
@@ -976,7 +1010,7 @@ function PN_API(setup) {
976
1010
977
1011
xdr ( {
978
1012
callback : jsonp ,
979
- data : data ,
1013
+ data : _get_url_params ( data ) ,
980
1014
success : function ( response ) {
981
1015
_invoke_callback ( response , callback , err ) ;
982
1016
} ,
@@ -1000,7 +1034,7 @@ function PN_API(setup) {
1000
1034
, uuid = args [ 'uuid' ] || UUID
1001
1035
, channel = args [ 'channel' ]
1002
1036
, url
1003
- , data = { 'auth' : auth_key } ;
1037
+ , data = _get_url_params ( { 'auth' : auth_key } ) ;
1004
1038
1005
1039
// Make sure we have a Channel
1006
1040
if ( ! SUBSCRIBE_KEY ) return error ( 'Missing Subscribe Key' ) ;
@@ -1031,7 +1065,7 @@ function PN_API(setup) {
1031
1065
1032
1066
xdr ( {
1033
1067
callback : jsonp ,
1034
- data : data ,
1068
+ data : _get_url_params ( data ) ,
1035
1069
success : function ( response ) {
1036
1070
_invoke_callback ( response , callback , err ) ;
1037
1071
} ,
@@ -1076,27 +1110,9 @@ function PN_API(setup) {
1076
1110
, sign_input = SUBSCRIBE_KEY + "\n" + PUBLISH_KEY + "\n"
1077
1111
+ "grant" + "\n" ;
1078
1112
1079
-
1080
- if ( auth_key ) sign_input += ( "auth=" + encode ( auth_key ) + "&" ) ;
1081
- if ( jsonp != '0' ) sign_input += ( "callback=" + encode ( jsonp ) + "&" ) ;
1082
- if ( channel ) sign_input += ( "channel=" + encode ( channel ) + "&" ) ;
1083
-
1084
- sign_input += "pnsdk=" + encode ( PNSDK ) + "&"
1085
- + "r=" + r + "&"
1086
- + "timestamp=" + encode ( timestamp ) ;
1087
-
1088
- if ( ttl || ttl === 0 ) sign_input += "&" + "ttl=" + ttl ;
1089
-
1090
- sign_input += "&" + "w=" + w ;
1091
- var signature = hmac_SHA256 ( sign_input , SECRET_KEY ) ;
1092
-
1093
- signature = signature . replace ( / \+ / g, "-" ) ;
1094
- signature = signature . replace ( / \/ / g, "_" ) ;
1095
-
1096
1113
var data = {
1097
1114
'w' : w ,
1098
1115
'r' : r ,
1099
- 'signature' : signature ,
1100
1116
'channel' : channel ,
1101
1117
'timestamp' : timestamp
1102
1118
} ;
@@ -1105,6 +1121,17 @@ function PN_API(setup) {
1105
1121
if ( ttl || ttl === 0 ) data [ 'ttl' ] = ttl ;
1106
1122
if ( auth_key ) data [ 'auth' ] = auth_key ;
1107
1123
1124
+ data = _get_url_params ( data )
1125
+
1126
+ sign_input += _get_pam_sign_input_from_params ( data ) ;
1127
+
1128
+ var signature = hmac_SHA256 ( sign_input , SECRET_KEY ) ;
1129
+
1130
+ signature = signature . replace ( / \+ / g, "-" ) ;
1131
+ signature = signature . replace ( / \/ / g, "_" ) ;
1132
+
1133
+ data [ 'signature' ] = signature ;
1134
+
1108
1135
xdr ( {
1109
1136
callback : jsonp ,
1110
1137
data : data ,
@@ -1149,23 +1176,21 @@ function PN_API(setup) {
1149
1176
+ PUBLISH_KEY + "\n"
1150
1177
+ "audit" + "\n" ;
1151
1178
1152
- if ( auth_key ) sign_input += ( "auth=" + encode ( auth_key ) + "&" ) ;
1153
- if ( jsonp != '0' ) sign_input += ( "callback=" + encode ( jsonp ) + "&" ) ;
1154
- if ( channel ) sign_input += ( "channel=" + encode ( channel ) + "&" ) ;
1179
+ var data = { 'timestamp' : timestamp } ;
1180
+ if ( jsonp != '0' ) { data [ 'callback' ] = jsonp ; }
1181
+ if ( channel ) data [ 'channel' ] = channel ;
1182
+ if ( auth_key ) data [ 'auth' ] = auth_key ;
1183
+
1184
+ data = _get_url_params ( data )
1155
1185
1156
- sign_input += "pnsdk=" + encode ( PNSDK ) + "&" + "timestamp=" + timestamp ;
1186
+ sign_input += _get_pam_sign_input_from_params ( data ) ;
1157
1187
1158
1188
var signature = hmac_SHA256 ( sign_input , SECRET_KEY ) ;
1159
1189
1160
1190
signature = signature . replace ( / \+ / g, "-" ) ;
1161
1191
signature = signature . replace ( / \/ / g, "_" ) ;
1162
1192
1163
- var data = { 'signature' : signature , 'timestamp' : timestamp } ;
1164
-
1165
- if ( jsonp != '0' ) { data [ 'callback' ] = jsonp ; }
1166
- if ( channel ) data [ 'channel' ] = channel ;
1167
- if ( auth_key ) data [ 'auth' ] = auth_key ;
1168
-
1193
+ data [ 'signature' ] = signature ;
1169
1194
xdr ( {
1170
1195
callback : jsonp ,
1171
1196
data : data ,
@@ -1215,7 +1240,7 @@ function PN_API(setup) {
1215
1240
1216
1241
xdr ( {
1217
1242
callback : jsonp ,
1218
- data : data ,
1243
+ data : _get_url_params ( data ) ,
1219
1244
timeout : SECOND * 5 ,
1220
1245
url : [
1221
1246
STD_ORIGIN , 'v2' , 'presence' ,
0 commit comments