Skip to content

Commit dc91f4d

Browse files
author
Devendra
committed
adding PAM to js
1 parent 01cc5b1 commit dc91f4d

32 files changed

Lines changed: 5378 additions & 3664 deletions

File tree

core/pubnub-common.js

Lines changed: 130 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ function build_url( url_components, url_params ) {
4848
if (!url_params) return url;
4949

5050
each( url_params, function( key, value ) {
51-
params.push(key + "=" + encode(value));
51+
params.push(key + "=" + encode_param(value));
5252
} );
5353

5454
url += "?" + params.join(PARAMSBIT);
@@ -158,13 +158,21 @@ function map( list, fun ) {
158158
* ======
159159
* var encoded_path = encode('path');
160160
*/
161-
function encode(path) {
161+
function encode_base(path, chars) {
162162
return map( (encodeURIComponent(path)).split(''), function(chr) {
163-
return "-_.!~*'()".indexOf(chr) < 0 ? chr :
163+
return chars.indexOf(chr) < 0 ? chr :
164164
"%"+chr.charCodeAt(0).toString(16).toUpperCase()
165165
} ).join('');
166166
}
167167

168+
function encode(path) {
169+
return encode_base(path,"-_.!~*'()");
170+
}
171+
172+
function encode_param(value) {
173+
return encode_base(value,".!~*'()");
174+
}
175+
168176
/**
169177
* Generate Subscription Channel List
170178
* ==================================
@@ -192,6 +200,9 @@ function PN_API(setup) {
192200
, PUBLISH_KEY = setup['publish_key'] || ''
193201
, SUBSCRIBE_KEY = setup['subscribe_key'] || ''
194202
, AUTH_KEY = setup['auth_key'] || ''
203+
, SECRET_KEY = setup['secret_key'] || ''
204+
, PNSDK = setup['PNSDK'] || ''
205+
, hmac_SHA256 = setup['hmac_SHA256']
195206
, SSL = setup['ssl'] ? 's' : ''
196207
, ORIGIN = 'http'+SSL+'://'+(setup['origin']||'pubsub.pubnub.com')
197208
, STD_ORIGIN = nextorigin(ORIGIN)
@@ -571,7 +582,7 @@ function PN_API(setup) {
571582
SUB_RECEIVER = xdr({
572583
timeout : sub_timeout,
573584
callback : jsonp,
574-
fail : function() {
585+
fail : function() {
575586
SUB_RECEIVER = null;
576587
SELF['time'](_test_connection);
577588
},
@@ -684,6 +695,121 @@ function PN_API(setup) {
684695
]
685696
});
686697
},
698+
'grant' : function( args, callback ) {
699+
var callback = args['callback'] || callback
700+
, err = args['error'] || function(){}
701+
, channel = args['channel']
702+
, jsonp = jsonp_cb()
703+
, ttl = args['ttl'] || -1
704+
, r = (args['read'] )?"1":"0"
705+
, w = (args['write'])?"1":"0"
706+
, auth_key = args['auth_key'];
707+
708+
function replaceAll(find, replace, str) {
709+
return str.replace(new RegExp(find, 'g'), replace);
710+
}
711+
712+
// Make sure we have a Channel
713+
if (!channel) return error('Missing Channel');
714+
if (!callback) return error('Missing Callback');
715+
if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');
716+
if (!PUBLISH_KEY) return error('Missing Publish Key');
717+
if (!SECRET_KEY) return error('Missing Secret Key');
718+
if (!auth_key) return error('Missing Auth Key');
719+
720+
if (jsonp != '0') { data['callback'] = jsonp; }
721+
722+
var timestamp = Math.floor(new Date().getTime() / 1000);
723+
724+
var sign_input = SUBSCRIBE_KEY + "\n" + PUBLISH_KEY + "\n"
725+
+ "grant" + "\n" + "auth=" + auth_key + "&" + "channel="
726+
+ channel + "&" + "pnsdk=" + PNSDK + "&" + "r=" + r + "&" + "timestamp=" + timestamp
727+
+ ((ttl > -1)?"&" + "ttl=" + ttl:"")
728+
+ "&" + "w=" + w;
729+
var signature = hmac_SHA256( sign_input, SECRET_KEY );
730+
731+
signature = replaceAll("\\+","-",signature);
732+
signature = replaceAll("\\/","_",signature);
733+
734+
var data = {
735+
'w' : w,
736+
'r' : r,
737+
'signature' : signature,
738+
'channel' : channel,
739+
'auth' : auth_key,
740+
'timestamp' : timestamp
741+
};
742+
if (ttl > -1) data['ttl'] = ttl
743+
744+
xdr({
745+
callback : jsonp,
746+
data : data,
747+
success : function(response) { callback(response) },
748+
fail : err,
749+
url : [
750+
STD_ORIGIN, 'v1', 'auth', 'grant' ,
751+
'sub-key', SUBSCRIBE_KEY
752+
]
753+
});
754+
},
755+
'audit' : function( args, callback ) {
756+
var callback = args['callback'] || callback
757+
, err = args['error'] || function(){}
758+
, channel = args['channel']
759+
, jsonp = jsonp_cb()
760+
, ttl = args['ttl'] || -1
761+
, auth_key = args['auth_key'];
762+
763+
function replaceAll(find, replace, str) {
764+
return str.replace(new RegExp(find, 'g'), replace);
765+
}
766+
767+
// Make sure we have a Channel
768+
if (!callback) return error('Missing Callback');
769+
if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');
770+
if (!PUBLISH_KEY) return error('Missing Publish Key');
771+
if (!SECRET_KEY) return error('Missing Secret Key');
772+
773+
if (jsonp != '0') { data['callback'] = jsonp; }
774+
775+
var timestamp = Math.floor(new Date().getTime() / 1000);
776+
777+
var sign_input = SUBSCRIBE_KEY + "\n" + PUBLISH_KEY + "\n" + "audit" + "\n";
778+
779+
if (auth_key) sign_input += ("auth=" + auth_key + "&");
780+
if (channel) sign_input += ("channel=" + channel + "&") ;
781+
782+
sign_input += "pnsdk=" + PNSDK + "&" + "timestamp=" + timestamp;
783+
784+
var signature = hmac_SHA256( sign_input, SECRET_KEY );
785+
786+
signature = replaceAll("\\+","-",signature);
787+
signature = replaceAll("\\/","_",signature);
788+
789+
var data = {
790+
'signature' : signature,
791+
'timestamp' : timestamp
792+
};
793+
if (channel) data['channel'] = channel
794+
if (auth_key) data['auth'] = auth_key
795+
796+
xdr({
797+
callback : jsonp,
798+
data : data,
799+
success : function(response) { callback(response) },
800+
fail : err,
801+
url : [
802+
STD_ORIGIN, 'v1', 'auth', 'audit' ,
803+
'sub-key', SUBSCRIBE_KEY
804+
]
805+
});
806+
},
807+
'revoke' : function( args, callback ) {
808+
args['read'] = false;
809+
args['write'] = false;
810+
SELF['grant'](args,callback);
811+
},
812+
687813

688814
// Expose PUBNUB Functions
689815
'xdr' : xdr,

modern/pubnub.js

Lines changed: 130 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ function build_url( url_components, url_params ) {
4949
if (!url_params) return url;
5050

5151
each( url_params, function( key, value ) {
52-
params.push(key + "=" + encode(value));
52+
params.push(key + "=" + encode_param(value));
5353
} );
5454

5555
url += "?" + params.join(PARAMSBIT);
@@ -159,13 +159,21 @@ function map( list, fun ) {
159159
* ======
160160
* var encoded_path = encode('path');
161161
*/
162-
function encode(path) {
162+
function encode_base(path, chars) {
163163
return map( (encodeURIComponent(path)).split(''), function(chr) {
164-
return "-_.!~*'()".indexOf(chr) < 0 ? chr :
164+
return chars.indexOf(chr) < 0 ? chr :
165165
"%"+chr.charCodeAt(0).toString(16).toUpperCase()
166166
} ).join('');
167167
}
168168

169+
function encode(path) {
170+
return encode_base(path,"-_.!~*'()");
171+
}
172+
173+
function encode_param(value) {
174+
return encode_base(value,".!~*'()");
175+
}
176+
169177
/**
170178
* Generate Subscription Channel List
171179
* ==================================
@@ -193,6 +201,9 @@ function PN_API(setup) {
193201
, PUBLISH_KEY = setup['publish_key'] || ''
194202
, SUBSCRIBE_KEY = setup['subscribe_key'] || ''
195203
, AUTH_KEY = setup['auth_key'] || ''
204+
, SECRET_KEY = setup['secret_key'] || ''
205+
, PNSDK = setup['PNSDK'] || ''
206+
, hmac_SHA256 = setup['hmac_SHA256']
196207
, SSL = setup['ssl'] ? 's' : ''
197208
, ORIGIN = 'http'+SSL+'://'+(setup['origin']||'pubsub.pubnub.com')
198209
, STD_ORIGIN = nextorigin(ORIGIN)
@@ -572,7 +583,7 @@ function PN_API(setup) {
572583
SUB_RECEIVER = xdr({
573584
timeout : sub_timeout,
574585
callback : jsonp,
575-
fail : function() {
586+
fail : function() {
576587
SUB_RECEIVER = null;
577588
SELF['time'](_test_connection);
578589
},
@@ -685,6 +696,121 @@ function PN_API(setup) {
685696
]
686697
});
687698
},
699+
'grant' : function( args, callback ) {
700+
var callback = args['callback'] || callback
701+
, err = args['error'] || function(){}
702+
, channel = args['channel']
703+
, jsonp = jsonp_cb()
704+
, ttl = args['ttl'] || -1
705+
, r = (args['read'] )?"1":"0"
706+
, w = (args['write'])?"1":"0"
707+
, auth_key = args['auth_key'];
708+
709+
function replaceAll(find, replace, str) {
710+
return str.replace(new RegExp(find, 'g'), replace);
711+
}
712+
713+
// Make sure we have a Channel
714+
if (!channel) return error('Missing Channel');
715+
if (!callback) return error('Missing Callback');
716+
if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');
717+
if (!PUBLISH_KEY) return error('Missing Publish Key');
718+
if (!SECRET_KEY) return error('Missing Secret Key');
719+
if (!auth_key) return error('Missing Auth Key');
720+
721+
if (jsonp != '0') { data['callback'] = jsonp; }
722+
723+
var timestamp = Math.floor(new Date().getTime() / 1000);
724+
725+
var sign_input = SUBSCRIBE_KEY + "\n" + PUBLISH_KEY + "\n"
726+
+ "grant" + "\n" + "auth=" + auth_key + "&" + "channel="
727+
+ channel + "&" + "pnsdk=" + PNSDK + "&" + "r=" + r + "&" + "timestamp=" + timestamp
728+
+ ((ttl > -1)?"&" + "ttl=" + ttl:"")
729+
+ "&" + "w=" + w;
730+
var signature = hmac_SHA256( sign_input, SECRET_KEY );
731+
732+
signature = replaceAll("\\+","-",signature);
733+
signature = replaceAll("\\/","_",signature);
734+
735+
var data = {
736+
'w' : w,
737+
'r' : r,
738+
'signature' : signature,
739+
'channel' : channel,
740+
'auth' : auth_key,
741+
'timestamp' : timestamp
742+
};
743+
if (ttl > -1) data['ttl'] = ttl
744+
745+
xdr({
746+
callback : jsonp,
747+
data : data,
748+
success : function(response) { callback(response) },
749+
fail : err,
750+
url : [
751+
STD_ORIGIN, 'v1', 'auth', 'grant' ,
752+
'sub-key', SUBSCRIBE_KEY
753+
]
754+
});
755+
},
756+
'audit' : function( args, callback ) {
757+
var callback = args['callback'] || callback
758+
, err = args['error'] || function(){}
759+
, channel = args['channel']
760+
, jsonp = jsonp_cb()
761+
, ttl = args['ttl'] || -1
762+
, auth_key = args['auth_key'];
763+
764+
function replaceAll(find, replace, str) {
765+
return str.replace(new RegExp(find, 'g'), replace);
766+
}
767+
768+
// Make sure we have a Channel
769+
if (!callback) return error('Missing Callback');
770+
if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');
771+
if (!PUBLISH_KEY) return error('Missing Publish Key');
772+
if (!SECRET_KEY) return error('Missing Secret Key');
773+
774+
if (jsonp != '0') { data['callback'] = jsonp; }
775+
776+
var timestamp = Math.floor(new Date().getTime() / 1000);
777+
778+
var sign_input = SUBSCRIBE_KEY + "\n" + PUBLISH_KEY + "\n" + "audit" + "\n";
779+
780+
if (auth_key) sign_input += ("auth=" + auth_key + "&");
781+
if (channel) sign_input += ("channel=" + channel + "&") ;
782+
783+
sign_input += "pnsdk=" + PNSDK + "&" + "timestamp=" + timestamp;
784+
785+
var signature = hmac_SHA256( sign_input, SECRET_KEY );
786+
787+
signature = replaceAll("\\+","-",signature);
788+
signature = replaceAll("\\/","_",signature);
789+
790+
var data = {
791+
'signature' : signature,
792+
'timestamp' : timestamp
793+
};
794+
if (channel) data['channel'] = channel
795+
if (auth_key) data['auth'] = auth_key
796+
797+
xdr({
798+
callback : jsonp,
799+
data : data,
800+
success : function(response) { callback(response) },
801+
fail : err,
802+
url : [
803+
STD_ORIGIN, 'v1', 'auth', 'audit' ,
804+
'sub-key', SUBSCRIBE_KEY
805+
]
806+
});
807+
},
808+
'revoke' : function( args, callback ) {
809+
args['read'] = false;
810+
args['write'] = false;
811+
SELF['grant'](args,callback);
812+
},
813+
688814

689815
// Expose PUBNUB Functions
690816
'xdr' : xdr,

0 commit comments

Comments
 (0)